A2osX/BIN/MORE.S.txt
2019-06-07 17:02:51 +02:00

329 lines
5.8 KiB
Plaintext
Raw 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
PREFIX
AUTO 4,1
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/MORE
*--------------------------------------
.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
bEscCodes .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.CRLF .DA MSG.CRLF
L.MSG.Pause .DA MSG.Pause
L.MSG.PauseErase .DA MSG.PauseErase
.DA 0
*--------------------------------------
CS.INIT clc
rts
*--------------------------------------
CS.RUN
.1 inc ArgCount
lda ArgCount
>SYSCALL ArgV
bcs .7
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
ldy #1
lda (ZPPtr1),y
ldx OptionList
.2 cmp OptionList,x
beq .3
dex
bne .2
.99 >PUSHBI 0
>LDYA L.MSG.USAGE
>SYSCALL printf
lda #E.SYN
sec
.9 rts
.3 ldy OptionVars-1,x
lda #$80
sta (pData),y
bra .1
.4 lda hFile
bne .99
>LDYA ZPPtr1
jsr CS.RUN.OPEN
bcs .9
bra .1 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
tax
lda OF.Table.hFD-1,x
>SYSCALL GetMemPtr
>STYA ZPPtr1
lda (ZPPtr1)
cmp #S.FD.T.PIPE
bne .71
.80 >LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPBufPtr
stx hBuf
>PUSHBI 0
>LDYA L.MSG.Init
>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 pha
>PUSHWZ Aux type
>PUSHBI S.FI.T.TXT
>PUSHBI O.RDONLY+O.TEXT
pla
>SYSCALL FOpen
bcs .9
sta hFile
.9 rts
*--------------------------------------
CS.RUN.PAUSE >PUSHBI 0
>PUSHW L.MSG.Pause
ldy #S.PS.hStdErr
lda (pPS),y
>SYSCALL fprintf
.10 jsr CS.RUN.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 >PUSHBI 0
>PUSHW L.MSG.PauseErase
ldy #S.PS.hStdErr
lda (pPS),y
>SYSCALL fprintf
rts
*--------------------------------------
CS.RUN.GETC lda hFILE
bne .1
ldy #S.PS.hStdErr
lda (pPS),y
>SYSCALL GetC
rts
.1 >SYSCALL GetChar
rts
*--------------------------------------
CS.RUN.GETLINE >PUSHWI 256
>PUSHW ZPBufPtr
lda hFile
bne .1
ldy #S.PS.hStdIn
lda (pPS),y
.1 >SYSCALL fgets
rts
*--------------------------------------
CS.RUN.PRINT lda bLineNum
bpl .1
>PUSHW LineNum
>PUSHBI 2
>LDYA L.MSG.NUMLINE
>SYSCALL printf
bcs .9
.1 lda bEscCodes
bmi .2
>LDYA ZPBufPtr
>SYSCALL puts
rts
.2 >PUSHBI 0
>LDYA ZPBufPtr
>SYSCALL printf
bcs .9
>PUSHBI 0
>LDYA L.MSG.CRLF
>SYSCALL printf
.9 rts
*--------------------------------------
CS.QUIT lda hBuf
beq .1
>SYSCALL FreeMem
.1 lda hFILE
beq .2
>SYSCALL FClose
.2
.8 clc
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList >PSTR "NnHhPpSs"
OptionVars .DA #bLineNum,#bLineNum,#bHelp,#bHelp,#bPage,#bPage,#bEscCodes,#bEscCodes
*--------------------------------------
MSG.USAGE .AS "Usage : MORE <File>\r\n"
.AS " -H : This help screen\r\n"
.AS " -N : Number all output lines\r\n"
.AS " -P : Page mode, no scroll\r\n"
.AS " -S : Process ESC codes"
MSG.CRLF .AZ "\r\n"
MSG.Init .AZ "\e[?7l"
MSG.NUMLINE .AZ "%5D:"
MSG.Pause .AZ "\r\e[7m --- 'SPACE' for more, 'CR' one line, 'Q/q' to quit --- \e[0m"
MSG.PauseErase .AZ "\r\e[2K"
*--------------------------------------
.DUMMY
.OR 0
DS.START
DS.END
.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/MORE.S
ASM