NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/more */------------------------------------- * # MORE * Displays content of specified file * Input pipe allowed * ## Arguments * **-H** * Displays help screen * **-N** * Number all output lines * **-P** * Page mode, no scroll * ## Return Value *\------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/kernel.i .INB inc/mli.i .INB inc/mli.e.i *-------------------------------------- PG.SIZE .EQ 23 *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPPtr1 .BS 2 ZPBufPtr .BS 2 ArgCount .BS 1 hFile .BS 1 LineCount .BS 1 LineNum .BS 2 bHelp .BS 1 bLineNum .BS 1 bPage .BS 1 ArgIndex .BS 1 hBuf .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 #0 S.PS.F.EVENT .DA #0 .DA CS.END-CS.START Code Size (without Constants) .DA DS.END-DS.START Data SegmentSize .DA #64 Stack Size .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.Init .DA MSG.Init L.MSG.NUMLINE .DA MSG.NUMLINE L.MSG.Pause .DA MSG.Pause L.MSG.PauseErase .DA MSG.PauseErase .DA 0 *-------------------------------------- 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 lda hFile bne .99 >LDYA ZPPtr1 jsr CS.RUN.OPEN bcs .9 bra CS.RUN scan for any other args .7 lda bHelp beq .8 .71 jsr .99 lda #0 rts .8 lda hFile bne .80 ldy #S.PS.hStdIn lda (pPS),y tay ldx FILEs.hFD-1,y lda FDs.pLO-1,x sta ZPPtr1 lda FDs.pHI-1,x sta ZPPtr1+1 lda (ZPPtr1) cmp #S.FD.T.PIPE bne .71 sty hFile .80 >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPBufPtr stx hBuf >PUSHW L.MSG.Init >PUSHBI 0 >SYSCALL PrintF *-------------------------------------- CS.RUN.LOOP jsr CS.RUN.GETLINE bcs .9 .1 inc LineNum bne .11 inc LineNum+1 .11 lda LineCount bne .2 lda bPage beq .2 lda #C.FF >SYSCALL PutChar .2 jsr CS.RUN.PRINT inc LineCount lda LineCount cmp #PG.SIZE bne CS.RUN.LOOP stz LineCount jsr CS.RUN.PAUSE bcc CS.RUN.LOOP .9 cmp #MLI.E.EOF bne .99 lda #0 Exit with no Error .99 sec rts *-------------------------------------- CS.RUN.OPEN >PUSHYA >PUSHBI O.RDONLY+O.TEXT >PUSHBI S.FI.T.TXT >PUSHWZ Aux type >SYSCALL FOpen bcs .9 sta hFile .9 rts *-------------------------------------- CS.RUN.PAUSE ldy #S.PS.hStdErr lda (pPS),y >PUSHA >PUSHW L.MSG.Pause >SYSCALL FPutS .10 ldy #S.PS.hStdErr lda (pPS),y >SYSCALL GetC bcs .99 cmp #'Q' beq .9 cmp #'q' beq .9 .3 cmp #C.SPACE bne .4 jmp CS.RUN.ERASE .4 cmp #C.CR bne .10 jsr CS.RUN.ERASE .40 jsr CS.RUN.GETLINE bcc .5 cmp #MLI.E.EOF beq .90 rts .5 inc LineNum bne .6 inc LineNum+1 .6 jsr CS.RUN.PRINT bra CS.RUN.PAUSE .9 jsr CS.RUN.ERASE .90 lda #0 .99 sec rts *-------------------------------------- CS.RUN.ERASE ldy #S.PS.hStdErr lda (pPS),y >PUSHA >PUSHW L.MSG.PauseErase >SYSCALL FPutS rts *-------------------------------------- CS.RUN.GETLINE >PUSHB hFile >PUSHW ZPBufPtr >PUSHWI 256 >SYSCALL FGetS rts *-------------------------------------- CS.RUN.PRINT lda bLineNum bpl .1 >PUSHW L.MSG.NUMLINE >PUSHW LineNum >PUSHBI 2 >SYSCALL PrintF bcs .9 .1 >LDYA ZPBufPtr >SYSCALL PutS .9 rts *-------------------------------------- CS.QUIT lda hBuf beq .1 >SYSCALL FreeMem .1 lda hFile beq .2 >SYSCALL FClose .2 .8 CS.INIT clc rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.END *-------------------------------------- OptionList .AS "NnHhPp" OptionVars .DA #bLineNum,#bLineNum,#bHelp,#bHelp,#bPage,#bPage *-------------------------------------- MSG.USAGE .CS "Usage : MORE \r\n" .CS " -H : This help screen\r\n" .CS " -N : Number all output lines\r\n" .CZ " -P : Page mode, no scroll\r\n" MSG.Init .CZ "\e[?7l" MSG.NUMLINE .CZ "%5D:" MSG.Pause .CZ "\r\e[7m --- 'SPACE' for more, 'CR' one line, 'Q/q' to quit --- \e[0m" MSG.PauseErase .CZ "\r\e[2K" *-------------------------------------- .DUMMY .OR 0 DS.START DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/more.s ASM