A2osX/BIN/MORE.S.txt
2023-10-18 07:41:12 +02:00

320 lines
5.5 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 <File>\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