mirror of
https://github.com/A2osX/A2osX.git
synced 2024-10-31 23:09:33 +00:00
520 lines
9.8 KiB
Plaintext
520 lines
9.8 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.SRC
|
||
LOMEM $A00
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
*/--------------------------------------
|
||
* #SScanF
|
||
* Scan a PStr (in progress)
|
||
* ##In:
|
||
* PUSHW PTR to target buffer
|
||
* PUSHW PSTR pattern (ex: "%d.%d.%d.%d")
|
||
* %d : byte
|
||
* PUSHW PSTR to scan (ex: "192.168.1.5")
|
||
* ##Out:
|
||
*\--------------------------------------
|
||
K.SScanF jsr PullPtr1Ptr2Ptr3
|
||
|
||
ldy #0 Y = PTR in pattern
|
||
|
||
lda (ZPPtr1)
|
||
beq .9
|
||
tax X = COUNT to scan
|
||
inc ZPPtr1
|
||
bne .1
|
||
inc ZPPtr1+1
|
||
|
||
.1 txa End Of String?
|
||
beq .8
|
||
tya
|
||
cmp (ZPPtr2) End of pattern?
|
||
beq .8
|
||
iny
|
||
lda (ZPPtr2),y
|
||
cmp #'%' Escape?
|
||
beq .2
|
||
cmp (ZPPtr1) Same char?
|
||
bne .9
|
||
jsr K.SScanF.IncPtr1
|
||
bne .1
|
||
clc
|
||
rts
|
||
|
||
.2 tya
|
||
cmp (ZPPtr2) unexpected End of pattern after "%" ?
|
||
beq .9
|
||
|
||
iny
|
||
lda (ZPPtr2),y
|
||
cmp #'d' BYTE ?
|
||
bne .3
|
||
|
||
stz ASCBUF
|
||
.20 lda (ZPPtr1)
|
||
jsr K.SScanF.IsDigit
|
||
bcs .21
|
||
phx
|
||
inc ASCBUF
|
||
ldx ASCBUF
|
||
sta ASCBUF,x
|
||
plx
|
||
jsr K.SScanF.IncPtr1
|
||
bne .20 end of string ?
|
||
|
||
.21 jsr DEC2HEX
|
||
lda HEXBUF
|
||
sta (ZPPtr3)
|
||
inc ZPPtr3
|
||
bne .1
|
||
inc ZPPtr3+1
|
||
bra .1
|
||
|
||
.3 cmp #'D' WORD ?
|
||
bne .4
|
||
|
||
bra .1
|
||
|
||
.4 cmp #'s' STRING ?
|
||
bne .9
|
||
|
||
bra .1
|
||
|
||
.8 clc
|
||
rts
|
||
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
K.SScanF.IncPtr1
|
||
dex
|
||
beq .1
|
||
inc ZPPtr1
|
||
bne .1
|
||
inc ZPPtr1+1 never Zero
|
||
.1 rts
|
||
*--------------------------------------
|
||
K.SScanF.IsDigit
|
||
cmp #'0'
|
||
bcc .1
|
||
cmp #'9'+1
|
||
bcs .1
|
||
rts
|
||
.1 sec
|
||
rts
|
||
*/--------------------------------------
|
||
* #PPrintFYA/CPrintFYA
|
||
* Prints Pascal/C-Style String
|
||
* ##In:
|
||
* Y,A = PTR to PStr/CStr
|
||
* %a : pull 2 bytes to Print Access right String 'drwxrwxrwx'
|
||
* %b : pull 1 byte to Print BIN
|
||
* %B : pull 2 bytes to Print BIN
|
||
* %d : pull 1 byte unsigned DEC 0..255
|
||
* %D : pull 2 bytes unsigned DEC 0..65535
|
||
* %u : pull 2 bytes PTR to 4 bytes long unsigned DEC 0..4294967295
|
||
* %e : pull 2 bytes PTR to 6 Bytes Real +1.23456789e+12
|
||
* %f : pull 2 bytes PTR to 6 Bytes Real 3.1415
|
||
* %h : pull 1 byte to Print HEX
|
||
* %H : pull 2 bytes to Print HEX
|
||
* %i : pull 1 byte to Print signed DEC -128..127
|
||
* %I : pull 2 bytes to Print signed DEC -32768..32767
|
||
* %L : pull 2 bytes PTR to 4 bytes signed DEC -2147483648..2147483647
|
||
* %n : pull 1 byte to Print low Nibble HEX
|
||
* %N : pull 1 byte to Print high Nibble HEX
|
||
* %s : pull 2 bytes ptr to C-Style String
|
||
* %S : pull 2 bytes ptr to P-Style String
|
||
* \b : Print 'BS' (08)
|
||
* \e : Print 'ESC' ($1B,27)
|
||
* \f : Print 'FF' ($0C,12)
|
||
* \n : Print 'CR' ($0D,13)
|
||
* \\\\ : Print \
|
||
* \% : Print %
|
||
* Modifiers for len and padding :
|
||
* %d : '9' '12'
|
||
* %2d : ' 9' '12'
|
||
* %02d : '09' '12'
|
||
* %11s : 'ABCDEFGH '
|
||
* %011s : 'ABCDEFGH000'
|
||
* %2f : '3.14'
|
||
* ##Out:
|
||
* CC : success
|
||
* CS : I/O error from COut
|
||
*\--------------------------------------
|
||
K.PPrintFYA ldx #$01 PSTR
|
||
.HS 2C bit abs
|
||
K.CPrintFYA ldx #$00 CSTR
|
||
>STYA ZPPtr1
|
||
stx CIO.GetCharAtPtr1Y+1
|
||
|
||
ldy #0
|
||
|
||
.1 jsr CIO.GetCharAtPtr1Y
|
||
beq .99
|
||
cmp #'%'
|
||
bne .10
|
||
|
||
stz PADLEN
|
||
lda #' '
|
||
sta PADCHAR
|
||
|
||
.2 ldx #PrintFTBL1.END-PrintFTBL1-1
|
||
jsr CIO.GetCharAtPtr1Y
|
||
beq .99
|
||
|
||
.3 cmp PrintFTBL1,x do we have a %x command?
|
||
beq .8 yes, jmp to it!
|
||
dex
|
||
bpl .3 no valid letter...
|
||
|
||
cmp #'0' ...a 0...mmm... padding char?
|
||
bne .4
|
||
|
||
ldx PADLEN PADLEN is not nul, so this 0 is second digit
|
||
bne .5
|
||
|
||
lda #'0'
|
||
sta PADCHAR no, this is the first 0, so make it PADCHAR
|
||
bra .2
|
||
|
||
.4 bcc .99 less than '0'....error
|
||
cmp #'9'+1
|
||
bcs .99 more than '9' ....error
|
||
|
||
.5 and #$0F we have a digit
|
||
pha save it...
|
||
lda PADLEN starts PADLEN * 10
|
||
asl
|
||
asl A=times 4
|
||
adc PADLEN CC by ASL, A=times 5
|
||
asl times 10
|
||
sta PADLEN
|
||
|
||
pla get back digit
|
||
adc PADLEN
|
||
sta PADLEN
|
||
bra .2 go get next char...
|
||
|
||
.8 phy
|
||
txa
|
||
asl
|
||
tax
|
||
jsr PrintFESC
|
||
ply
|
||
bcc .1
|
||
rts
|
||
|
||
.10 cmp #'\'
|
||
bne .20
|
||
|
||
ldx #PrintFTBL2.END-PrintFTBL2-1
|
||
jsr CIO.GetCharAtPtr1Y
|
||
beq .99
|
||
.12 cmp PrintFTBL2,x
|
||
beq .13
|
||
dex
|
||
bpl .12
|
||
bra .1
|
||
|
||
.13 lda PrintFTBL2.OUT,x
|
||
|
||
.20 jsr K.PutCA
|
||
bcc .1
|
||
.99 rts
|
||
*--------------------------------------
|
||
PrintFESC jmp (PrintFJMP,x)
|
||
*--------------------------------------
|
||
PrintFTBL1 .AS "abBdDuefhHiILnNsS"
|
||
PrintFTBL1.END
|
||
PrintFTBL2 .AS "befn\%"
|
||
PrintFTBL2.END
|
||
PrintFTBL2.OUT .HS 08.1B.0C.0D \b\e\f\n
|
||
.DA #'\' \\
|
||
.DA #'%' \%
|
||
PrintFJMP .DA PrintF.A
|
||
.DA PrintF.B,PrintF.BB
|
||
.DA PrintF.D,PrintF.DD,PrintF.U
|
||
.DA PrintF.E,PrintF.F
|
||
.DA PrintF.H,PrintF.HH
|
||
.DA PrintF.I,PrintF.II,PrintF.L
|
||
.DA PrintF.N,PrintF.NN
|
||
.DA PrintF.S,PrintF.SS
|
||
*--------------------------------------
|
||
PrintF.A >PULLW HEXBUF
|
||
|
||
lda HEXBUF+1
|
||
lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
tax
|
||
lda TYPES,x
|
||
jsr K.PutCA
|
||
bcs .9
|
||
|
||
ldx #0
|
||
|
||
.1 lda #'-'
|
||
lsr HEXBUF
|
||
bcc .2
|
||
lda ACCESS,x
|
||
|
||
.2 jsr K.PutCA
|
||
bcs .9
|
||
|
||
inx
|
||
cpx #8
|
||
bne .1
|
||
|
||
.3 lda #'-'
|
||
lsr HEXBUF+1
|
||
bcc .4
|
||
lda ACCESS,x
|
||
|
||
.4 jmp K.PutCA
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
PrintF.BB >PULLA
|
||
pha
|
||
jsr PrintF.B
|
||
pla
|
||
bcc PrintF.B.1
|
||
PrintF.BB.RTS rts
|
||
*--------------------------------------
|
||
PrintF.B >PULLA
|
||
|
||
PrintF.B.1 ldx #8
|
||
|
||
.1 asl
|
||
pha
|
||
lda #'0'
|
||
adc #0 add Carry
|
||
jsr K.PutCA
|
||
pla
|
||
bcs PrintF.BB.RTS
|
||
dex
|
||
bne .1
|
||
rts
|
||
*--------------------------------------
|
||
PrintF.D >PULLB HEXBUF
|
||
stz HEXBUF+1
|
||
bra PrintF.DD.1
|
||
|
||
PrintF.DD >PULLW HEXBUF
|
||
PrintF.DD.1 stz HEXBUF+2
|
||
stz HEXBUF+3
|
||
bra PrintF.U.1
|
||
|
||
PrintF.U >PULLW ZPPtr2
|
||
ldy #3
|
||
|
||
.1 lda (ZPPtr2),y
|
||
sta HEXBUF,y
|
||
dey
|
||
bpl .1
|
||
|
||
PrintF.U.1 stz SIGN
|
||
jsr HEX2DEC
|
||
jmp PrintDEC
|
||
*--------------------------------------
|
||
PrintF.E >PULLW ZPPtr2
|
||
rts
|
||
*--------------------------------------
|
||
PrintF.F >PULLW ZPPtr2
|
||
rts
|
||
*--------------------------------------
|
||
PrintF.HH >PULLA
|
||
pha
|
||
jsr PrintF.H
|
||
pla
|
||
bra PrintF.H.1
|
||
*--------------------------------------
|
||
PrintF.H >PULLA
|
||
PrintF.H.1 pha
|
||
jsr PrintF.NN.1
|
||
pla
|
||
jmp PrintF.N.1
|
||
*--------------------------------------
|
||
PrintF.I >PULLB HEXBUF
|
||
eor #$ff if positive, it becomes neg so branch if....minus!
|
||
clc
|
||
bmi .1
|
||
sec
|
||
inc 2s complement...
|
||
sta HEXBUF
|
||
|
||
|
||
.1 stz HEXBUF+1
|
||
bra PrintF.II.1
|
||
|
||
PrintF.II >PULLW HEXBUF A=HI
|
||
eor #$ff
|
||
clc
|
||
bmi PrintF.II.1
|
||
sec
|
||
tax
|
||
lda HEXBUF
|
||
eor #$ff
|
||
inc 2s complement...
|
||
sta HEXBUF
|
||
bne .1
|
||
inx
|
||
.1 sta HEXBUF
|
||
stx HEXBUF+1
|
||
|
||
PrintF.II.1 stz HEXBUF+2
|
||
stz HEXBUF+3
|
||
bra PrintF.L.1
|
||
|
||
PrintF.L >PULLW ZPPtr2
|
||
ldy #3
|
||
|
||
.1 lda (ZPPtr2),y
|
||
sta HEXBUF,y
|
||
dey
|
||
bpl .1
|
||
|
||
|
||
PrintF.L.1 ror SIGN
|
||
jsr HEX2DEC
|
||
*--------------------------------------
|
||
PRINTDEC lda PADLEN any Len format ?
|
||
beq .1 no
|
||
|
||
lda #10
|
||
sec yes, Print only digits starting at pos 10-padlen
|
||
sbc PADLEN
|
||
|
||
.1 tax x=0 if no padlen, or x=10-padlen
|
||
|
||
.2 lda ASCBUF,x
|
||
cmp #'0' a zero?
|
||
beq .3
|
||
|
||
inc PADLEN found a non zero, Print all digits, even if 0, next time
|
||
ldy #'0'
|
||
sty PADCHAR
|
||
bra .4
|
||
|
||
.3 cpx #9 last digit ?
|
||
beq .4 Print always
|
||
|
||
ldy PADLEN no pad to fill, do not Print 0
|
||
beq .6
|
||
|
||
lda PADCHAR fill with PADCHAR
|
||
|
||
.4 bit SIGN a sign to print before digits ?
|
||
bpl .5
|
||
pha yes, save whatever we have to print....
|
||
lda #'-'
|
||
jsr K.PutCA
|
||
stz SIGN reset flag for next char...
|
||
pla
|
||
|
||
.5 jsr K.PutCA
|
||
bcs .9
|
||
|
||
.6 inx
|
||
cpx #10
|
||
bne .2
|
||
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
PrintF.N >PULLA
|
||
PrintF.N.1 and #$0F
|
||
bra PrintF.NN.2
|
||
|
||
PrintF.NN >PULLA
|
||
PrintF.NN.1 lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
|
||
PrintF.NN.2 ora #$30
|
||
cmp #$3A
|
||
bcc .1
|
||
adc #6
|
||
.1 jmp K.PutCA
|
||
*--------------------------------------
|
||
PrintF.S ldy #$ff CSTR
|
||
.HS 2C bit abs
|
||
PrintF.SS ldy #$00 PSTR
|
||
|
||
>PULLW ZPPtr2
|
||
|
||
lda (ZPPtr2) if CSTR:last char=0, if PSTR:len=0
|
||
beq .8
|
||
|
||
sty .1+1
|
||
|
||
.1 lda #$ff Self Modified
|
||
bne .11 CSTR
|
||
|
||
tya PSTR
|
||
cmp (ZPPtr2) len check
|
||
beq .2
|
||
|
||
.11 iny
|
||
|
||
lda (ZPPtr2),y
|
||
beq .2
|
||
|
||
jsr K.PutCA
|
||
bcs .9
|
||
|
||
lda PADLEN
|
||
beq .1
|
||
|
||
cpy PADLEN
|
||
bne .1
|
||
clc
|
||
rts
|
||
|
||
.2 lda PADLEN
|
||
beq .8
|
||
|
||
.3 lda PADCHAR
|
||
jsr K.PutCA
|
||
bcs .9
|
||
iny
|
||
cpy PADLEN
|
||
bne .3
|
||
|
||
.8 clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
CIO.GetCharAtPtr1Y
|
||
lda #$ff Self Modified PSTR/CSTR
|
||
bne .1
|
||
|
||
lda (ZPPtr1),y CSTR
|
||
beq .9
|
||
iny advance to next char...
|
||
bne .9
|
||
inc ZPPtr1+1 Allow >256 CStrings
|
||
rts
|
||
|
||
|
||
.1 tya PSTR
|
||
cmp (ZPPtr1)
|
||
beq .9
|
||
iny
|
||
lda (ZPPtr1),y NZ
|
||
|
||
.9 clc no error, but end of string
|
||
rts
|
||
*--------------------------------------
|
||
TYPES .AS "-dbclssp"
|
||
ACCESS .AS "rwxrwxrwx"
|
||
SIGN .BS 1
|
||
PADLEN .BS 1
|
||
PADCHAR .BS 1
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE SYS/KERNEL.S.CIO
|
||
LOAD SYS/KERNEL.S
|
||
ASM
|