Kernel 0.9.1 : KERNEL, Extending and generalize the use of SScanF

This commit is contained in:
Rémy GIBERT 2018-05-25 17:09:14 +02:00
parent b9ac24c39e
commit 8ec7b2e443
7 changed files with 137 additions and 48 deletions

View File

@ -637,6 +637,8 @@ Scan a C-String (in progress)
+ %D : word
* %L : long int
* %U : dword
+ %h : HEX byte
+ %H : HEX word
+ Y,A = PTR to String to scan (ex: "192.168.1.5")
## Out:
@ -662,14 +664,14 @@ Specifiers :
+ %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 5 Bytes float (-)1.23456789e+12
+ %f : pull 2 bytes PTR to 5 Bytes float (-)3.1415
+ %u : pull 4 bytes long unsigned DEC 0..4294967295
+ %e : pull 5 Bytes float (-)1.23456789e+12
+ %f : pull 5 Bytes float (-)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
+ %L : pull 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

Binary file not shown.

Binary file not shown.

View File

@ -35,6 +35,7 @@ CS.START cld
.DA CS.QUIT
L.LIBTCPIP .DA LIBTCPIP
L.SSCANF.IP .DA SSCANF.IP
L.SSCANF.MAC .DA SSCANF.MAC
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
@ -65,9 +66,17 @@ CS.RUN ldy #S.PS.ARGC
>SYSCALL GetArg.A
>SYSCALL SScanF.YA
bcc CS.RUN.QUERY
bcs .9
ldy #S.PS.ARGC
lda (pPs),y
cmp #1
beq CS.RUN.QUERY
cmp #2
beq CS.RUN.ADD
lda #K.E.SYN
.9 lda #K.E.SYN
sec
rts
*--------------------------------------
@ -107,6 +116,9 @@ CS.RUN.QUERY jsr Init.Timeout
.9 sec
rts
*--------------------------------------
CS.RUN.ADD
*--------------------------------------
CS.RUN.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE
>STYA ZPPTR1
@ -187,6 +199,7 @@ Wait.TimeOut sec
CS.END
LIBTCPIP .AZ "libtcpip.o"
SSCANF.IP .AZ "%d.%d.%d.%d"
SSCANF.MAC .AZ "%h:%h:%h:%h:%h:%h"
MSG0 .AZ "STS TTL MAC Address IP Address\r\n"
MSG1 .AZ "$%h %5D %h:%h:%h:%h:%h:%h %d.%d.%d.%d\r\n"
MSG2 .AZ "%d.%d.%d.%d is at %h:%h:%h:%h:%h:%h\r\n"

View File

@ -661,6 +661,28 @@ MEM.IsDigit.RTS rts
MEM.IsDigit.8 clc
rts
*--------------------------------------
MEM.IsHexDigit jsr MEM.IsDigit
bcc .8
cmp #'A'
bcc MEM.IsDigit.9
cmp #'F'+1
bcc .1
cmp #'a'
bcc MEM.IsDigit.9
cmp #'f'+1
bcs MEM.IsDigit.RTS
eor #$20
.1
* clc
sbc #'A'-11 cc so A->10 (11-CC)
clc
.8 and #$0F
rts
*--------------------------------------
MEM.SetKeyCharY sta CLRWRITEAUX
sta (ZPSListKeyPtr),y
sta SETWRITEAUX

View File

@ -618,12 +618,14 @@ K.Rename jsr PFT.CheckPathSTK
>MLICALL MLIRENAME
rts
*--------------------------------------
K.PrintF.PadL .BS 1
K.PrintF.PadC .BS 1
*--------------------------------------
*K.PrintF.PadL .BS 1
*K.PrintF.PadC .BS 1
*HEXBUF .BS 4
*BCDBUF .BS 5 5, enough to handle 10 digits (32bits)
*--------------------------------------
HEXBUF .EQ FAC
K.PrintF.PadL .EQ FAC+4
K.PrintF.PadC .EQ FAC+5
BCDBUF .EQ ARG
*/--------------------------------------
* # SScanF.YA
@ -638,6 +640,8 @@ BCDBUF .EQ ARG
* %D : word
* %L : long int
* %U : dword
* %h : HEX byte
* %H : HEX word
* Y,A = PTR to String to scan (ex: "192.168.1.5")
* ## Out:
*\--------------------------------------
@ -693,13 +697,15 @@ K.SScanF.YA >STYA ZPPtr2 String to Scan
lda K.SScanFTBL+1,x Get VAR size
jmp (K.SScanFJMP,x)
*--------------------------------------
K.SScanFTBL .DA #'i,#1,#'d,#1,#'I,#2,#'D,#2,#'l,#4,#'u,#4
K.SScanFTBL .DA #'i,#1,#'d,#1,#'I,#2,#'D,#2,#'l,#4,#'u,#4,#'h,#1,#'H,#2
K.SScanFJMP .DA K.SScanF.I
.DA K.SScanF.D
.DA K.SScanF.II
.DA K.SScanF.DD
.DA K.SScanF.L
.DA K.SScanF.U
.DA K.SScanF.H
.DA K.SScanF.HH
*--------------------------------------
K.SScanF.I
K.SScanF.D
@ -708,9 +714,15 @@ K.SScanF.DD
K.SScanF.L
K.SScanF.U pha Save VAL size
jsr STDLIB.Dec2Hex
jsr STDLIB.GetDec
bra K.SScanF.GetVAL
*--------------------------------------
K.SScanF.HH
K.SScanF.H pha
tya Y=char count parsed
jsr STDLIB.GetHex
K.SScanF.GetVAL tya Y=char count parsed
clc
adc ZPPtr2
sta ZPPtr2
@ -722,7 +734,7 @@ K.SScanF.U pha Save VAL size
.2 lda STDLIB.32-1,y
dey
sta (ZPPtr3),y
bpl .2
bne .2
.9 rts
*/--------------------------------------
@ -745,14 +757,14 @@ K.SScanF.U pha Save VAL size
* %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 5 Bytes float (-)1.23456789e+12
* %f : pull 2 bytes PTR to 5 Bytes float (-)3.1415
* %u : pull 4 bytes long unsigned DEC 0..4294967295
* %e : pull 5 Bytes float (-)1.23456789e+12
* %f : pull 5 Bytes float (-)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
* %L : pull 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
@ -921,14 +933,8 @@ PrintF.L sec signed long
PrintF.U clc unsigned long (DWORD)
ldx #3 4 bytes
>PULLW ZPPtr2
ldy #3
.1 lda (ZPPtr2),y
sta HEXBUF,y
dey
bpl .1
>PULLW HEXBUF
>PULLW HEXBUF+2
PrintF.U.1 bcc PrintF.Hex2Dec unsigned, nothing to check
@ -986,7 +992,7 @@ PrintF.Hex2Dec ror .31+1
lda #'-'
jsr STDIO.COut
.9 lda K.PrintF.PadL any Len format ?
.9 lda K.PrintF.PadL any Len format ?
beq .4 no
lda #10
@ -1043,21 +1049,28 @@ PrintF.Hex2Dec ror .31+1
PrintF.E sec Force "E+12"
.HS 90 BCC
PrintF.F clc
>PULLW INDEX
>ROMCALL SETFAC
lda pStack+1
sta INDEX+1
lda pStack
sta INDEX
clc
adc #5
sta pStack
>ROMCALL SETFAC
ldy #3 In order not to trash A2osX.SaveSM,A2osX.SaveSX
>ROMCALL FOUT
ldx #0
ldy #0
.2 lda $102,x
.2 lda $102,y
beq .8
phx
jsr STDIO.COut
plx
inx
iny
bne .2
.8 clc

View File

@ -89,7 +89,7 @@ K.AToL jsr MEM.PullP1P2 C-String in Ptr2, Dst buffer in Ptr1
lda #10 base 10
sec signed
K.AToL.I jsr STDLIB.Dec2Hex
K.AToL.I jsr STDLIB.GetDec
bcs .9
phy Save Count processed
@ -116,15 +116,56 @@ K.AToI.YA >STYA ZPPtr2
lda #10 base 10
sec signed
jsr STDLIB.Dec2Hex
jsr STDLIB.GetDec
bcs .9
>LDYA STDLIB.32
.9 rts
*--------------------------------------
* Convert ZPPtr2 to STDLIB.32
* Convert Hex int at ZPPtr2 to STDLIB.32
*--------------------------------------
STDLIB.Dec2Hex jsr STDLIB.32.Clear
STDLIB.GetHex lda (ZPPtr2)
beq .9
jsr MEM.IsHexDigit
bcs .9
jsr STDLIB.32.Clear
sta STDLIB.32
ldy #$ff
.1 iny
lda (ZPPtr2),y
beq .8
jsr MEM.IsHexDigit
bcs .8
pha
ldx #4
.2 jsr STDLIB.32.T2
bcs .99 overflow!!!
dex
bne .2
pla
ora STDLIB.32
sta STDLIB.32
bra .1
.8 clc
rts
.99 pla
.9 sec
rts
*--------------------------------------
* Convert Decimal int at ZPPtr2 to STDLIB.32
*--------------------------------------
STDLIB.GetDec jsr STDLIB.32.Clear
ldy #$ff
@ -165,11 +206,11 @@ STDLIB.32.T10 ldx #3
dex
bpl .1
jsr .7 STDLIB.32 * 2 -> STDLIB.32
bcs .9 overflow!!!
jsr STDLIB.32.T2 STDLIB.32 * 2 -> STDLIB.32
bcs STDLIB.32.9 overflow!!!
jsr .7 STDLIB.32 * 4 -> STDLIB.32
bcs .9 overflow!!!
jsr STDLIB.32.T2 STDLIB.32 * 4 -> STDLIB.32
bcs STDLIB.32.9 overflow!!!
phy Save Y, pointing to next char
@ -187,24 +228,22 @@ STDLIB.32.T10 ldx #3
ply
bcs .99 overflow!!!
bcs STDLIB.32.RTS overflow!!!
* STDLIB.32 * 10 -> STDLIB.32
* STDLIB.32 * 2 -> STDLIB.32
.7 asl STDLIB.32
STDLIB.32.T2 asl STDLIB.32
rol STDLIB.32+1
rol STDLIB.32+2
rol STDLIB.32+3
rts if CS, overflow!!!
.9 pla discard saved STDLIB.32
STDLIB.32.9 pla discard saved STDLIB.32
pla
pla
pla
.99 rts
*--------------------------------------
STDLIB.32.RTS rts
*--------------------------------------
STDLIB.32.Clear ldx #3