NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/cat *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/kernel.i .INB inc/mli.i .INB inc/mli.e.i *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPPtr1 .BS 2 ZPBufPtr .BS 2 ByteIndex .BS 1 ArgCount .BS 1 FileCount .BS 1 bPause .BS 1 bPrintAll .BS 1 bLineNum .BS 1 bSuppressBlankLine .BS 1 ArgIndex .BS 1 hBuf .BS 1 hFile .BS 1 LineNum .BS 2 bPrintedBlankLine .BS 1 ZS.END .ED *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA #S.PS.F.EVENT S.PS.F .DA #0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #ZS.END-ZS.START Zero Page Size .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.MSG.USAGE .DA MSG.USAGE L.MSG.CRLF .DA MSG.CRLF L.MSG.INIT .DA MSG.INIT L.MSG.LINENUM .DA MSG.LINENUM L.MSG.CTRLCHAR .DA MSG.CTRLCHAR L.ASCII .DA ASCII .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN inc ArgCount lda ArgCount >SYSCALL ArgV bcs .7 >STYA ZPPtr1 lda (ZPPtr1) cmp #'-' bne .4 ldy #1 lda (ZPPtr1),y beq .99 .1 ldx #OptionVars-OptionList-1 .2 cmp OptionList,x beq .3 dex bpl .2 .99 >LDYA L.MSG.USAGE >SYSCALL PutS lda #E.SYN sec .9 rts .3 lda OptionVars,x tax * sec ror 0,x iny lda (ZPPtr1),y bne .1 bra CS.RUN .4 inc FileCount bra CS.RUN scan for any other args .7 lda FileCount beq .99 >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPBufPtr stx hBuf ldy #S.PS.hStdOut lda (pPS),y tay ldx FILEs.hFD-1,y ldy FDs.pLO-1,x lda FDs.pHI-1,x >STYA ZPPtr1 lda (ZPPtr1) beq CS.RUN.LOOP cmp #S.FD.T.PIPE beq CS.RUN.LOOP >PUSHW L.MSG.INIT >PUSHBI 0 >SYSCALL PrintF *-------------------------------------- CS.RUN.LOOP ldy #S.PS.hStdIn lda (pPS),y >SYSCALL FEOF bcs .90 IO error tay bne .10 no char >SYSCALL GetChar bcs .9 IO error cmp #$03 Ctrl-C beq .9 Abort.... cmp #$13 Ctrl-S bne .10 lda bPause eor #$ff sta bPause bne CS.RUN.LOOP .10 lda bPause bne CS.RUN.LOOP Pause... .11 lda hFile bne .2 .1 inc ArgIndex lda ArgIndex >SYSCALL ArgV bcs .99 No more arg...the end! >STYA ZPPtr1 lda (ZPPtr1) cmp #'-' beq .1 An option, skip... >LDYA ZPPtr1 jsr CS.RUN.OPEN .90 bcs .9 sta hFile .2 >PUSHA >PUSHW ZPBufPtr >PUSHWI 254 Leave room for CRLF >SYSCALL FGetS bcs .7 jsr CS.RUN.PRINT bcc CS.RUN.LOOP rts .7 cmp #MLI.E.EOF bne .9 jsr CS.RUN.CLOSE jmp CS.RUN.LOOP .99 lda #0 Exit with no Error .9 sec rts *-------------------------------------- CS.RUN.OPEN stz bPrintedBlankLine Reset this flag for the new file >PUSHYA >PUSHBI O.RDONLY+O.TEXT >PUSHBI S.FI.T.TXT >PUSHWZ Aux type >SYSCALL FOpen rts *-------------------------------------- CS.RUN.PRINT inc LineNum bne .10 inc LineNum+1 .10 lda bSuppressBlankLine bpl .2 lda (ZPBufPtr) bne .1 Empty line ? lda bPrintedBlankLine bmi .8 lda #$ff sta bPrintedBlankLine bra .2 .1 stz bPrintedBlankLine .2 jsr CS.RUN.PRINTNUM bcs .99 lda bPrintAll bmi .3 ldy #$ff .20 iny lda (ZPBufPtr),y beq .21 cmp #C.SPACE bcs .20 lda #C.SPACE sta (ZPBufPtr),y bra .20 .21 >LDYA ZPBufPtr >SYSCALL PutS rts *-------------------------------------- .3 stz ByteIndex .4 ldy ByteIndex lda (ZPBufPtr),y beq .7 cmp #C.SPACE bcc .5 >SYSCALL PutChar .99 bcs .9 bra .62 .8 clc rts .5 tax >LDYA L.ASCII >STYA ZPPtr1 .6 dex bmi .61 lda ZPPtr1 sec adc (ZPPtr1) sta ZPPtr1 bcc .6 inc ZPPtr1+1 bra .6 .61 >PUSHW L.MSG.CTRLCHAR >PUSHW ZPPtr1 >PUSHBI 2 >SYSCALL PrintF bcs .9 .62 inc ByteIndex bne .4 .7 >PUSHW L.MSG.CRLF >PUSHBI 0 >SYSCALL PrintF .9 rts *-------------------------------------- CS.RUN.PRINTNUM clc lda bLineNum bpl .8 >PUSHW L.MSG.LINENUM >PUSHW LineNum >PUSHBI 2 >SYSCALL PrintF .8 rts *-------------------------------------- CS.QUIT lda hBuf beq CS.RUN.CLOSE >SYSCALL FreeMem CS.RUN.CLOSE lda hFile beq .8 stz hFile >SYSCALL FClose .8 clc rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.END *-------------------------------------- OptionList .AS "ANSans" OptionVars .DA #bPrintAll,#bLineNum,#bSuppressBlankLine,#bPrintAll,#bLineNum,#bSuppressBlankLine *-------------------------------------- MSG.USAGE .CS "Usage : CAT File1 [File2...]\r\n" .CS " -A : Show All non printable characters\r\n" .CS " -N : Number all output lines\r\n" .CS " -S : Suppress repeated empty output lines" MSG.CRLF .CZ "\r\n" MSG.INIT .CZ "\e[?7h" Enable Line Wrap MSG.LINENUM .CZ "%5D:" MSG.CTRLCHAR .CZ "[%S]" *-------------------------------------- ASCII .PS "NUL" .PS "SOH" .PS "STX" .PS "ETX" .PS "EOT" .PS "ENQ" .PS "ACK" .PS "BEL" .PS "BS" .PS "TAB" .PS "LF" .PS "VT" .PS "FF" .PS "CR" .PS "SO" .PS "SI" .PS "DLE" .PS "DC1" .PS "DC2" .PS "DC3" .PS "DC4" .PS "NAK" .PS "SYN" .PS "ETB" .PS "CAN" .PS "EM" .PS "SUB" .PS "ESC" .PS "FS" .PS "GS" .PS "RS" .PS "US" *-------------------------------------- .DUMMY .OR 0 DS.START DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/cat.s ASM