A2osX/BIN/MORE.S.txt
2018-12-20 21:59:48 +01:00

320 lines
5.6 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/MLI.I
.INB INC/MLI.E.I
*--------------------------------------
PG.SIZE .EQ 22
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPPTR1 .BS 2
ZPBufPtr .BS 2
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 #16 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.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.G 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.G hFile
bne .99
>LDYA ZPPtr1
jsr CS.RUN.OPEN
bcs .9
bra .1 scan for any other args
.7 >LDA.G bHelp
beq .8
jsr .99
lda #0
rts
.8 >LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPBufPtr
txa
>STA.G hBuf
CS.RUN.LOOP >SLEEP
jsr CS.RUN.GETLINE
bcs .13
>INCW.G LineNum
>LDA.G LineCount
bne .22
>LDA.G bPage
beq .22
lda #C.FF
>SYSCALL putchar
.22 jsr CS.RUN.PRINT
>INC.G LineCount
cmp #PG.SIZE
bne .8
lda #0
sta (pData),y
jsr CS.RUN.PAUSE
bcs .9
.8 jmp CS.RUN.LOOP
.13 cmp #MLI.E.EOF
bne .9
lda #0 Exit with no Error
.9 sec
rts
*--------------------------------------
CS.RUN.OPEN pha
>PUSHWI 0 Aux type
>PUSHBI S.FI.T.TXT
>PUSHBI O.RDONLY+O.TEXT
pla
>SYSCALL FOpen
bcs .9
>STA.G hFile
.9 rts
*--------------------------------------
CS.RUN.PAUSE >PUSHBI 0
>PUSHW L.MSG.Pause
ldy #S.PS.hStdErr
lda (pPS),y
>SYSCALL fprintf
.10 >SLEEP
jsr CS.RUN.GETC
bcs .10 no char
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
jsr CS.RUN.GETLINE
jsr CS.RUN.PRINT
bra CS.RUN.PAUSE
.9 jsr CS.RUN.ERASE
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.G hFILE
bne .1
ldy #S.PS.hStdErr
lda (pPS),y
>SYSCALL GetC
bra .2
.1 >SYSCALL GetChar
.2 rts
*--------------------------------------
CS.RUN.GETLINE >PUSHWI 256
>PUSHW ZPBufPtr
>LDA.G hFile
bne .1
ldy #S.PS.hStdIn
lda (pPS),y
.1 >SYSCALL fgets
bcs .9
lda (ZPBufPtr)
cmp #C.LF
bne .11
lda #C.CR
sta (ZPBufPtr)
.11 ldy #$ff
.2 iny
lda (ZPBufPtr),y
bne .2
.3 tya
beq .8
dey
lda (ZPBufPtr),y
cmp #C.LF
beq .3
cmp #C.CR
beq .3
lda #0
iny
.8 sta (ZPBufPtr),y
clc
.9 rts
*--------------------------------------
CS.RUN.PRINT >LDA.G bLineNum
bpl .1
>PUSHW.G LineNum
>PUSHBI 2
>LDYA L.MSG.NUMLINE
>SYSCALL printf
bcs .9
.1 >PUSHBI 0
>LDYA ZPBufPtr
>SYSCALL printf
bcs .9
>PUSHBI 0
>LDYA L.MSG.CRLF
>SYSCALL printf
.9 rts
*--------------------------------------
CS.QUIT >LDA.G hBuf
beq .1
>SYSCALL FreeMem
.1 >LDA.G hFILE
beq .2
>SYSCALL FClose
.2
.8 clc
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList >PSTR "NnHhPp"
OptionVars .DA #bLineNum,#bLineNum,#bHelp,#bHelp,#bPage,#bPage
*--------------------------------------
MSG.USAGE .AS "Usage : MORE <File>\r\n"
.AS " -H : This help screen\r\n"
.AS " -N : Number all output lines\r\n"
.AZ " -P : Page mode, no scroll\r\n"
MSG.NUMLINE .AZ "%5D:"
MSG.CRLF .AZ "\r\n"
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
ArgCount .BS 1
hFile .BS 1
LineCount .BS 1
LineNum .BS 2
bLineNum .BS 1
bPage .BS 1
bHelp .BS 1
ArgIndex .BS 1
hBuf .BS 1
DS.END
.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/MORE.S
ASM