From 17746d588ca177ca87e54a4b2bea9d8753cfe4be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 23 May 2018 17:27:37 +0200 Subject: [PATCH] Kernel 0.9.1 : KERNEL, SScanF rewritten to fix bugs in DNSINFO and ARP --- .Docs/KERNEL.md | 14 ++- .Docs/LIBTCPIP.md | 2 +- .Floppies/A2OSX.BOOT.po | Bin 143360 -> 143360 bytes .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes .screen-shots/ScreenShot.GFX.png | Bin 0 -> 26356 bytes BIN/ARP.S.txt | 30 +++--- BIN/DNSINFO.S.txt | 33 ++++--- INC/A2osX.I.txt | 2 +- LIB/LIBTCPIP.S.DNS.txt | 2 +- README.md | 6 +- SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.STDIO.txt | 154 ++++++++++++++++--------------- SYS/KERNEL.S.STDLIB.txt | 35 +++---- 14 files changed, 155 insertions(+), 125 deletions(-) create mode 100644 .screen-shots/ScreenShot.GFX.png diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index 235df151..92a0cfa0 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -624,14 +624,20 @@ Rename a file ## Out : -# SScanF +# SScanF.YA Scan a C-String (in progress) ## In: -+ PUSHW PTR to target buffer -+ PUSHW PSTR pattern (ex: "%d.%d.%d.%d") ++ PUSHW PTR to target var ++ ... ++ PUSHW PTR pattern (ex: "%d.%d.%d.%d") + + %i : short int + %d : byte -+ PUSHW PSTR to scan (ex: "192.168.1.5") + + %I : int + + %D : word +* %L : long int +* %U : dword ++ Y,A = PTR to String to scan (ex: "192.168.1.5") ## Out: diff --git a/.Docs/LIBTCPIP.md b/.Docs/LIBTCPIP.md index 414baac2..3f74e2ce 100644 --- a/.Docs/LIBTCPIP.md +++ b/.Docs/LIBTCPIP.md @@ -56,7 +56,7 @@ ## In: + PUSHW = PTR to IP -+ PUSHW = hostname PSTR to Add ++ PUSHW = hostname CSTR to Add # DNS.GetCAche + Return a Ptr to DNS Cache Table diff --git a/.Floppies/A2OSX.BOOT.po b/.Floppies/A2OSX.BOOT.po index 22ef0e6c299fef080090b2f6c25788aec7a40063..58e381774af358bec73a8e4ea21bc8302f7df933 100644 GIT binary patch delta 4621 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 delta 4556 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 U=+A%EK_p~Lb>{?xvOe|y0Uh8SfB*mh diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 3085fcf9c4707ca3e9e5af4e796dc7950a0a44d8..a3e8978960dc64a280006d7e56517662353bb822 100644 GIT binary patch delta 3156 zcmZ`*4OA0X7M^)Cfe-=&Yb8aYFF~NCimh90if(_!MNKQGw54@9r?XnSp%rUwwY#=m zq7tCWctDO0?t+~&D_KVwcLFv*D{htQ30UoDA;~6TVrxaa-P4`zTBZJF-wdqS^>pT( zdtdH-_wRf6zKPR0+v%Jw9wy1I>4wy%qvYSvVoGXLo$d{^$V=?Ju6uHq>3M*?XT8Ui zg`LG<*YpHaQ_1c$(+&Jqp&_;N?cMzeri=whnwLDjbxLYy$^Iwe@XDs91HZ(xnob?a zz+dS6*Ma9|-2=dYSf?tHX=wz_|5kruFIbZ1iPUGHF}FP7$)mM;Izss;HkK3?B- zS%=3>_vYb86AVd##Zpp0eY-yY1>Tg81n0&D%*ti>9P+FTKW5y^@JjqVGkH0_8ZTsA z%kjdge~yYeK4vfbnu3K-Mv;8SEIAW4IC>KzXQslb?@Cy5`eBnd0*RB^7q> z$N?G1ok;p5#Z1|gB{h*fDxpvM>rXHb<$#4%>N#l{((3}6>g@pcDQ`gME-u(F5PbZZ zK1I*#&fp5*F&2Ys1Dx*Q?*cu0iG%M2(60gM-|Qq_mHUJa!l3a^B2VQ!rZO|NGZv#r zU7SAQ!GbyYv!K=|d>@URr_f9+2TV1-78M_-j|J+F2DV0-oLn$7<7l9f^a;lh-E5}# zTpPt=sIiL9in&|Ug3Rh%kYPy+!m_U&s5!os)fPj|$LdicPn;EtTzECM^-X4fF33zh z?-wU?KAuo3N)-M|udSkGG_-<3M*<4}T)9@8M#ZWd>){(Gp zK)SdY9tp$WGqpA_pDYcZtYtp8fi%;R5WSB;MFF)a`_>K2B^#LYxGPwPS|0h8(!Q$; zIwwJ22$des5gx2{OefR^7smDqb%^e{AQ3(#BGd%w>L8D!Bw98xl@Ei=s)>x$EzZ<7 zV6Jop(fEK7;$(GDIs#9HL~6{igH)cpSLs(I9sD}vwDzBo^k@Okhn!R3MwEECgG6cx zsYgRj0+L~rf$bZdt_`9jzQO3aU{Y;RF(bFi9c`o*r;2RYJEC*Cwd{qPU~&W--|GrC zVrq>@$Hg|=Q_d9&8?=L@+BXJ;O+oei;S zXq<4~$zzCd`h$+Jhdj7Cyb~h^r0>~G=KVsDJ?VIuCyqt7MfgmOTHtZ!lS1&w{X4>J zisSuQu@dJY6JR5mydx};`8&dnI_ZJ~6`Qh`#XTg7i4N~F3d-cq1zGqt=9#%*5njZ! z&IM^zj)-Vn$`U=T7^=oJ>Y&sPL6NR`G`0TZjXp&wQE+i zx>_5~kL;4pj(i|RM_4ILnJJF=u(f!=bOm-t#Jg3JzLdjQ(y_L6d+UWd>GFCpDXukV zSI!4HEagB?00Hos;XN%+1PFSTa1&iy8Z8Nu#iY>6-^$suE>r zIwk&r_QAPehQ?Bfi>2$dz7Gq0ee2mjZ4a(}k77Hj5 zZRA=yJ_5`fhp5^{r++c8gPc=V|`4iIKq(JOwzt`*|?U=)wBmRrLLKh2&3o*MN(JcOB3tS9$S7%mgrOI-Cb-ON+&8 zIczy$8MRog7}jov!d;MShFGs?pch#?{0U&2-%PQ|9=}A`trl}zsN(58ZQ%;5T6(ie zRMAtni|n_H7OSGF2}@xr>S)vx=^Ep4t^>v8oT2lw9Y>td3pc38|s#Oh3$I33l<#U+oZCK<)*!o5yUF>Sz*j zR$A6sHdttjWcdm7^r+?k zfIkQOfkN27geutAR6Hy{!T;**qARzHe%xdGiRI7ZFFv3K`fDE-O&S44Ey^Rs=_g-zUm6Y{xrO9_#=5(d#{DdB9BJC3TH(y z>?G6wIx({gtR`;YMhyET{Lk=c7{jt6-Zg6Uw}@%RhPacv4xyQSterdLZBV7#2-3LT zOtq6{L1(53vv&uQ)-)5|W)in1;_58Aw0~0Gk4UurAQ|@;>Y{;kpCmzzkF4?OYJ72S gUwjF%WPXv?tiO)er0Z+a6Kc{8HR*}&bmJ@k1%a>Kng9R* delta 3049 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 E0kjMeE&u=k literal 0 HcmV?d00001 diff --git a/BIN/ARP.S.txt b/BIN/ARP.S.txt index 0658cce5..229a22b5 100644 --- a/BIN/ARP.S.txt +++ b/BIN/ARP.S.txt @@ -35,8 +35,6 @@ CS.START cld .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SSCANF.IP .DA SSCANF.IP -L.DST.IP .DA DST.IP -L.DST.MAC .DA DST.MAC L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 L.MSG2 .DA MSG2 @@ -58,13 +56,15 @@ CS.RUN ldy #S.PS.ARGC bne .1 jmp CS.RUN.DUMP -.1 >PUSHW L.DST.IP +.1 >PUSHEA.G DST.IP+3 + >PUSHEA.G DST.IP+2 + >PUSHEA.G DST.IP+1 + >PUSHEA.G DST.IP >PUSHW L.SSCANF.IP lda #1 >SYSCALL GetArg.A - >PUSHYA - >SYSCALL SSCANF + >SYSCALL SScanF.YA bcc CS.RUN.QUERY lda #K.E.SYN @@ -73,8 +73,8 @@ CS.RUN ldy #S.PS.ARGC *-------------------------------------- CS.RUN.QUERY jsr Init.Timeout -.1 >PUSHW L.DST.MAC - >PUSHW L.DST.IP +.1 >PUSHEA.G DST.MAC + >PUSHEA.G DST.IP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.QUERY bcc .2 success, print & exit @@ -88,14 +88,16 @@ CS.RUN.QUERY jsr Init.Timeout beq .8 bra .1 -.2 ldx #5 -.3 >PUSHB DST.MAC,x - dex +.2 ldy #5 + +.3 >PUSHB.G DST.MAC,y + dey bpl .3 - ldx #3 -.4 >PUSHB DST.IP,x - dex + ldy #3 + +.4 >PUSHB.G DST.IP,y + dey bpl .4 >LDYA L.MSG2 @@ -188,9 +190,9 @@ SSCANF.IP .AZ "%d.%d.%d.%d" 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" +hLIBTCPIP .BS 1 *-------------------------------------- DS.START -hLIBTCPIP .BS 1 DST.IP .BS 4 DST.MAC .BS 6 TimeOut .BS 1 diff --git a/BIN/DNSINFO.S.txt b/BIN/DNSINFO.S.txt index 641e9604..916d3346 100644 --- a/BIN/DNSINFO.S.txt +++ b/BIN/DNSINFO.S.txt @@ -34,7 +34,6 @@ CS.START cld .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SSCANF.IP .DA SSCANF.IP -L.IP .DA IP L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 .DA 0 @@ -51,20 +50,25 @@ CS.INIT >LDYA L.LIBTCPIP *-------------------------------------- CS.RUN ldy #S.PS.ARGC lda (pPs),y - beq CS.RUN.DUMP + bne CS.RUN.ADD + jmp CS.RUN.DUMP -CS.RUN.ADD cmp #3 - bne .9 +CS.RUN.ADD cmp #2 + beq .1 + jmp .9 - >PUSHW L.IP +.1 >PUSHEA.G DST.IP+3 + >PUSHEA.G DST.IP+2 + >PUSHEA.G DST.IP+1 + >PUSHEA.G DST.IP >PUSHW L.SSCANF.IP - lda #3 + lda #1 >SYSCALL GetArg.A - >PUSHYA - >SYSCALL SSCANF + + >SYSCALL SScanF.YA bcs .9 - >PUSHW L.IP + >PUSHEA.G DST.IP lda #2 >SYSCALL GetArg.A >PUSHYA @@ -85,7 +89,7 @@ CS.RUN.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GetCache >SYSCALL PrintF.YA lda #K.DNSCACHE.SIZE - sta EntryCount + >STA.G EntryCount .1 lda (ZPPTR1) beq .2 @@ -126,7 +130,7 @@ CS.RUN.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GetCache bcc .3 inc ZPPTR1+1 -.3 dec EntryCount +.3 >DEC.G EntryCount bne .1 .8 lda #0 tell TSKMGR that all done ok, but @@ -147,9 +151,12 @@ SSCANF.IP .AZ "%d.%d.%d.%d" MSG0 .AZ "STS TR.ID Hostname IP Address TTL\r\n" MSG1 .AZ "$%h $%H %32s %03d.%03d.%03d.%03d %u\r\n" hLIBTCPIP .BS 1 - -IP .BS 4 +*-------------------------------------- +DS.START +DST.IP .BS 4 EntryCount .BS 1 +DS.END +*-------------------------------------- MAN SAVE /A2OSX.SRC/BIN/DNSINFO.S ASM diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 088cfb62..f50060b1 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -120,7 +120,7 @@ SYS.GetDevStatus.A .EQ $4C SYS.IOCTL .EQ $4E * .EQ $50 -SYS.SScanF .EQ $52 +SYS.SScanF.YA .EQ $52 * .EQ $54 * .EQ $56 SYS.PrintF.YA .EQ $58 diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index ef1c3da7..85191188 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -127,7 +127,7 @@ DNS.REQUEST lda hDNSSocket1 * Add a static DNS record * ## In: * PUSHW = PTR to IP -* PUSHW = hostname PSTR to Add +* PUSHW = hostname CSTR to Add *\-------------------------------------- DNS.Add >PULLW ZPPtrDNS Get host string >PULLW ZPPtrIP Get host IP address diff --git a/README.md b/README.md index 06c29347..8abbaf31 100644 --- a/README.md +++ b/README.md @@ -125,10 +125,14 @@ Kernel Configuration Utility... ![](./.screen-shots/ScreenShot.KCONFIG.png) -Color ANSI/VT100 Support !!! +Color ANSI/VT100 Support... ![](./.screen-shots/PuTTY.png) +DHGR Mixed-Mode Graphic primitives.... + +![](./.screen-shots/ScreenShot.GFX.png) + ## General Information: Kernel API is confined in Aux LC Bank 1 & 2 to leave enough room at $EOOO for Drivers. diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index e725e4c4..aeca97f9 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -52,7 +52,7 @@ K.SYSCALL.JMP .DA 0 $00 .DA K.IOCTL .DA 0 $50 - .DA K.SScanF + .DA K.SScanF.YA .DA 0 .DA 0 .DA K.PrintF.YA diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index a0bc446c..b9a3ad1e 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -626,101 +626,109 @@ K.PrintF.PadC .BS 1 HEXBUF .EQ FAC BCDBUF .EQ ARG */-------------------------------------- -* # SScanF +* # SScanF.YA * Scan a C-String (in progress) * ## In: -* PUSHW PTR to target buffer +* PUSHW PTR to target var +* ... * PUSHW PTR pattern (ex: "%d.%d.%d.%d") +* %i : short int * %d : byte -* PUSHW PTR to String to scan (ex: "192.168.1.5") +* %I : int +* %D : word +* %L : long int +* %U : dword +* Y,A = PTR to String to scan (ex: "192.168.1.5") * ## Out: *\-------------------------------------- -K.SScanF jsr MEM.PullP1P2P3 +K.SScanF.YA >STYA ZPPtr2 String to Scan + >PULLW ZPPtr1 Pattern - ldy #0 Y = PTR in pattern - - lda (ZPPtr1) - beq .9 - tax X = COUNT to scan +.1 lda (ZPPtr1) End Of Pattern? + beq .8 + inc ZPPtr1 - bne .1 + bne .11 inc ZPPtr1+1 -.1 txa End Of String? - beq .8 - tya - cmp (ZPPtr2) End of pattern? - beq .8 - iny - lda (ZPPtr2),y - cmp #'%' Escape? +.11 cmp #'%' Escape? beq .2 - cmp (ZPPtr1) Same char? + + cmp (ZPPtr2) Same char in string? bne .9 - jsr K.SScanF.IncPtr1 + + inc ZPPtr2 bne .1 - clc + inc ZPPtr2+1 + bra .1 + +.2 lda (ZPPtr1) Get specifier after % + beq .9 unexpected End of pattern after "%" ? + + inc ZPPtr1 + bne .21 + inc ZPPtr1+1 + +.21 ldx #K.SScanFJMP-K.SScanFTBL-2 + +.3 cmp K.SScanFTBL,x + beq .4 + dex + dex + bpl .3 + +.9 lda #MLI.E.EOF + sec rts -.2 tya - cmp (ZPPtr2) unexpected End of pattern after "%" ? - beq .9 - - iny - lda (ZPPtr2),y - cmp #'d' BYTE ? - bne .3 +.4 jsr .5 -* stz ASCBUF -.20 lda (ZPPtr1) - jsr MEM.IsDigit - bcs .21 - phx -* inc ASCBUF -* ldx ASCBUF -* sta ASCBUF,x - plx - jsr K.SScanF.IncPtr1 - bne .20 end of string ? - -.21 + tya + clc + adc ZPPtr2 + sta ZPPtr2 + bcc .1 + inc ZPPtr2+1 - -* jsr DEC2HEX AToF MIGRATION - - bra * - - - 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 +.5 >PULLW ZPPtr3 get VAR Ptr + + lda K.SScanFTBL+1,x Get VAR Byte count + jmp (K.SScanFJMP,x) +*-------------------------------------- +K.SScanFTBL .DA #'i,#1,#'d,#1,#'I,#2,#'D,#2,#'l,#4,#'u,#4 +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 +*-------------------------------------- +K.SScanF.I +K.SScanF.D +K.SScanF.II +K.SScanF.DD +K.SScanF.L +K.SScanF.U pha Save Byte count + + jsr STDLIB.Dec2Hex + + pla + phy + tay + +.1 lda STDLIB.32-1,y + dey + sta (ZPPtr3),y + bpl .1 + + ply + +.9 rts */-------------------------------------- * # PrintF.YA/SPrintF.YA/FPrintF.YA * Prints C-Style String diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index 6abb69e8..427b7f6e 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -81,6 +81,9 @@ K.StrToUL.rts rts * PUSHW PTR to target buffer DWORD * ## Out: *\-------------------------------------- +*STDLIB.32 .BS 4 32 bits max +STDLIB.32 .EQ FAC 32 bits max +*-------------------------------------- K.AToL jsr MEM.PullP1P2 C-String in Ptr2, Dst buffer in Ptr1 lda #10 base 10 @@ -119,7 +122,7 @@ K.AToI.YA >STYA ZPPtr2 >LDYA STDLIB.32 .9 rts *-------------------------------------- -* Convert ZPPtr1 to STDLIB.32 +* Convert ZPPtr2 to STDLIB.32 *-------------------------------------- STDLIB.Dec2Hex jsr STDLIB.32.Clear @@ -132,16 +135,13 @@ STDLIB.Dec2Hex jsr STDLIB.32.Clear jsr MEM.IsDigit bcs .8 - phy Save Y, pointing to next char - jsr STDLIB.32.T10 - - ply - bcs .9 lda (ZPPtr2),y and #$0F + +* clc adc STDLIB.32 sta STDLIB.32 @@ -165,12 +165,14 @@ STDLIB.32.T10 ldx #3 dex bpl .1 - jsr STDLIB.32.ROL STDLIB.32 * 2 -> STDLIB.32 + jsr .7 STDLIB.32 * 2 -> STDLIB.32 bcs .9 overflow!!! - jsr STDLIB.32.ROL STDLIB.32 * 4 -> STDLIB.32 + jsr .7 STDLIB.32 * 4 -> STDLIB.32 bcs .9 overflow!!! + phy Save Y, pointing to next char + ldx #0 ldy #4 @@ -183,9 +185,16 @@ STDLIB.32.T10 ldx #3 dey bne .2 + ply + bcs .99 overflow!!! - jsr STDLIB.32.ROL STDLIB.32 * 10 -> STDLIB.32 +* STDLIB.32 * 10 -> STDLIB.32 + +.7 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 @@ -195,11 +204,7 @@ STDLIB.32.T10 ldx #3 .99 rts *-------------------------------------- -STDLIB.32.ROL asl STDLIB.32 - rol STDLIB.32+1 - rol STDLIB.32+2 - rol STDLIB.32+3 - rts + *-------------------------------------- STDLIB.32.Clear ldx #3 @@ -207,8 +212,6 @@ STDLIB.32.Clear ldx #3 dex bpl .1 rts -*-------------------------------------- -STDLIB.32 .BS 4 32 bits max */-------------------------------------- * # RealPath.YA * Return the canonicalized absolute pathname