From 7c787a2c6c8670098d4ad8b69bf89f53ded8e699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sun, 13 Sep 2015 22:35:07 +0200 Subject: [PATCH] Fixed MemMgr Bugs preventing TCPIP stack working properly --- A2OSX.BOOT.DSK | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.STARTUP.txt | 8 +- BIN/ARP.S.txt | 1 - BIN/DNS.S.txt | 63 ++++++++------- BIN/MEM.S.txt | 176 +++++++++++++++++++++++------------------ BIN/MOUNT.S.txt | 3 +- BIN/PING.S.txt | 3 +- INC/LIBTCPIP.I.txt | 17 +++- LIB/LIBTCPIP.S.ARP.txt | 2 - LIB/LIBTCPIP.S.DNS.txt | 12 +-- LIB/LIBTCPIP.S.txt | 3 +- SBIN/GETTY.S.txt | 13 ++- SBIN/TCPIP.S.txt | 63 ++++++++++++++- SYS/KERNEL.S.BIN.txt | 29 +++++-- SYS/KERNEL.S.MEM.txt | 41 +++++----- SYS/KERNEL.S.TSK.txt | 2 +- 17 files changed, 282 insertions(+), 154 deletions(-) diff --git a/A2OSX.BOOT.DSK b/A2OSX.BOOT.DSK index 878b22f779d316f290fc6fbf00766ed8a913a137..c144998bed81b5e7414bb1fb11ef6724fec4f3ba 100644 GIT binary patch delta 7519 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 P40A+%8n&7k{_6h#%1I>1 diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 79339d149dad28496aee862c6a24d7cbfbe79b5a..9d2fe704023cdc96ca47b324e25a5df06f1dc6e2 100644 GIT binary patch delta 37310 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 COSN|Z delta 28952 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 Cd(k)m diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index 427e2b2a..f96ea743 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -10,7 +10,7 @@ SET LIB=%A2OSX%LIB/ LOAD CONSOLE.DRV EXEC GETTY KBD CON LOGIN LOAD SSC.DRV 9600 N 8 1 X -*EXEC GETTY COM2 COM2 LOGIN +EXEC GETTY COM2 COM2 LOGIN *LOAD PPIC.DRV LOAD UTHERNET.DRV 000E3A123456 EXEC TCPIP ETH3 @@ -18,8 +18,8 @@ EXEC DHCPCLNT *EXEC TELNETD *MOUNT TFTP 192.168.1.5:/A2OSX /MNT/A2OSX *MOUNT CIFS 192.168.1.5:/MSSHARE /MNT/MSSHARE -LOAD DHGR.DRV -LOAD MOUSE.DRV -EXEC GUI +*LOAD DHGR.DRV +*LOAD MOUSE.DRV +*EXEC GUI MAN TEXT A2OSX.STARTUP diff --git a/BIN/ARP.S.txt b/BIN/ARP.S.txt index 842d627f..c04cdee0 100644 --- a/BIN/ARP.S.txt +++ b/BIN/ARP.S.txt @@ -134,7 +134,6 @@ CS.RUN lda #ARP.TIMEOUT >PUSHW L.DST.MAC >PUSHW L.DST.IP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.QUERY - bra * bcc .2 success, print & exit diff --git a/BIN/DNS.S.txt b/BIN/DNS.S.txt index ef9d6749..8a90b8d2 100644 --- a/BIN/DNS.S.txt +++ b/BIN/DNS.S.txt @@ -6,27 +6,31 @@ AUTO 6 .LIST ON .OP 65C02 .OR $2000 - .TF BIN/DNS + .TF /A2OSX.BOOT/BIN/DNS *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBSTR.I .INB INC/LIBTCPIP.I *-------------------------------------- ZPPTR1 .EQ ZPBIN *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 No Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.EVENT @@ -38,20 +42,20 @@ L.IP .DA IP L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- CS.INIT stz hHostName stz hIP - >LIBLOADP L.LIBSTR + >LDYA L.LIBSTR + >LOADLIBYA sta hLIBSTR - >LIBLOADP L.LIBTCPIP + >LDYA L.LIBTCPIP + >LOADLIBYA sta hLIBTCPIP - + ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y bne CS.INIT.ADD jmp CS.INIT.DUMP @@ -63,7 +67,7 @@ CS.INIT.ADD >PUSHA sta hHostName ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA >PUSHBI $20 Push SEP=' ' >PUSHBI 2 Push 2 for getting IP @@ -81,7 +85,9 @@ CS.INIT.ADD >PUSHA >PUSHWI 1800 default TTL >PUSHW L.IP - >PUSHB hHostName + lda hHostName + >SYSCALL SYS.GetMemPtrA + >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.ADD bcs .99 @@ -98,12 +104,13 @@ CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE >PUSHW L.MSG0 >LIBCALL hLIBSTR,LIBSTR.PRINTF - ldx #K.DNSCACHE.SIZE + ldx #K.DNSCACHE.SIZE + .1 phx lda (ZPPTR1) beq .2 - ldy #S.DNSCACHE.IP+3 + ldy #S.DNSCACHE.RDATA+3 lda (ZPPTR1),y >PUSHA dey @@ -116,13 +123,17 @@ CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE lda (ZPPTR1),y >PUSHA - ldy #S.DNSCACHE.TTL + ldy #S.DNSCACHE.TTL+3 + >PUSHA + dey lda (ZPPTR1),y - pha - iny + >PUSHA + dey lda (ZPPTR1),y - ply - >PUSHYA + >PUSHA + dey + lda (ZPPTR1),y + >PUSHA ldy #S.DNSCACHE.hNAME lda (ZPPTR1),y @@ -170,14 +181,12 @@ LIBSTR >PSTRING "libstr.o" LIBTCPIP >PSTRING "libtcpip.o" SSCANF.IP >PSTRING "%d.%d.%d.%d" MSG0 >CSTRING "STS Hostname TTL IP Address\n" -MSG1 >CSTRING "$%h %32S %05D %d.%d.%d.%d\n" -DS.START +MSG1 >CSTRING "$%h %32S %09L %d.%d.%d.%d\n" hLIBSTR .BS 1 hLIBTCPIP .BS 1 hHostName .BS 1 hIP .BS 1 IP .BS 4 -DS.END MAN SAVE BIN/DNS.S ASM diff --git a/BIN/MEM.S.txt b/BIN/MEM.S.txt index 51e121f0..6f4d3af2 100644 --- a/BIN/MEM.S.txt +++ b/BIN/MEM.S.txt @@ -15,6 +15,7 @@ AUTO 6 .INB INC/LIBSTR.I *-------------------------------------- PAGELEN .EQ 22 +FOOTERLEN .EQ 8 *-------------------------------------- ZPPTR1 .EQ ZPBIN ZPPTR2 .EQ ZPBIN+2 @@ -78,6 +79,11 @@ CS.RUN ldy #bCANCEL lda (pData),y bne .8 + ldy #MEM.COUNT + lda (pData),y + cmp MemMgr.LastSlot + beq .10 + ldy #LINE.COUNT lda (pData),y bne .1 @@ -103,62 +109,61 @@ CS.RUN ldy #bCANCEL lda (pData),y inc sta (pData),y - cmp MemMgr.LastSlot - beq .9 - -.8 clc - rts - -.9 jsr CS.RUN.PRINTEND - sec - rts -*-------------------------------------- -CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? - lda (pEvent),y - ldy #S.PS.hINDEV - cmp (pPs),y - bne .9 - - lda (pEvent) - and #S.EVT.F.KEY is it a KEY event? - beq .9 - - ldy #S.EVT.DATAHI is it an O or SAPPLE key ? - lda (pEvent),y - bne .9 - - ldy #S.EVT.DATALO - lda (pEvent),y - cmp #$03 Ctrl-C - bne .1 - - lda #$FF - ldy #bCANCEL - sta (pData),y - bra .8 - -.1 cmp #$13 Ctrl-S - bne .2 - - ldy #bSTOP - lda (pData),y - eor #$FF - sta (pData),y - bra .8 - -.2 ldy #bSTOP - lda #0 - sta (pData),y .8 clc - rts + rts .9 sec rts -*-------------------------------------- -CS.QUIT lda hLIBSTR - >SYSCALL SYS.UnloadLibA + +.10 ldy #LINE.COUNT + lda (pData),y clc + adc #FOOTERLEN + cmp #PAGELEN + bcc .11 + + lda #$FF + ldy #bSTOP + sta (pData),y + + lda #0 + ldy #LINE.COUNT + sta (pData),y + + clc + rts + +.11 ldy #MEM.COUNT + >PUSHB (pData),y + ldy #USED.COUNT + >PUSHB (pData),y + >PUSHW L.MSG2 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + >PUSHW MemMgr.HiMem + >PUSHW L.MSG3 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + >PUSHW MemMgr.Free + >PUSHW L.MSG4 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + >PUSHW MemMgr.LoMem + >PUSHW L.MSG5 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + lda MemMgr.Free + sec + sbc MemMgr.LoMem + tay + lda MemMgr.Free+1 + sbc MemMgr.LoMem+1 + + >PUSHYA + >PUSHW L.MSG6 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + sec rts *-------------------------------------- CS.RUN.PRINTMEM ldy #S.MEM.LEN @@ -250,35 +255,52 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN .5 rts *-------------------------------------- -CS.RUN.PRINTEND ldy #MEM.COUNT - >PUSHB (pData),y - ldy #USED.COUNT - >PUSHB (pData),y - >PUSHW L.MSG2 - >LIBCALL hLIBSTR,LIBSTR.PRINTF - - >PUSHW MemMgr.HiMem - >PUSHW L.MSG3 - >LIBCALL hLIBSTR,LIBSTR.PRINTF - - >PUSHW MemMgr.Free - >PUSHW L.MSG4 - >LIBCALL hLIBSTR,LIBSTR.PRINTF - - >PUSHW MemMgr.LoMem - >PUSHW L.MSG5 - >LIBCALL hLIBSTR,LIBSTR.PRINTF +CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPs),y + bne .9 - lda MemMgr.Free - sec - sbc MemMgr.LoMem - tay - lda MemMgr.Free+1 - sbc MemMgr.LoMem+1 + lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .9 - >PUSHYA - >PUSHW L.MSG6 - >LIBCALL hLIBSTR,LIBSTR.PRINTF + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (pEvent),y + bne .9 + + ldy #S.EVT.DATALO + lda (pEvent),y + cmp #$03 Ctrl-C + bne .1 + + lda #$FF + ldy #bCANCEL + sta (pData),y + bra .8 + +.1 cmp #$13 Ctrl-S + bne .2 + + ldy #bSTOP + lda (pData),y + eor #$FF + sta (pData),y + bra .8 + +.2 ldy #bSTOP + lda #0 + sta (pData),y + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc rts *-------------------------------------- PRBYTE pha diff --git a/BIN/MOUNT.S.txt b/BIN/MOUNT.S.txt index f5d1657f..92503cd3 100644 --- a/BIN/MOUNT.S.txt +++ b/BIN/MOUNT.S.txt @@ -106,7 +106,8 @@ CS.RUN >PUSHW pData DST.IP CS.RUN.DNSQUERY >PUSHW pData DST.IP ldy #S.PS.hARGS lda (pPs),y - >PUSHA + >SYSCALL SYS.GetMemPtrA + >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY bcc CS.RUN.IPOK diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt index b37a6aee..709321f8 100644 --- a/BIN/PING.S.txt +++ b/BIN/PING.S.txt @@ -108,7 +108,8 @@ CS.RUN >PUSHW pData DST.IP CS.RUN.DNSQUERY >PUSHW pData DST.IP ldy #S.PS.hARGS lda (pPs),y - >PUSHA + >SYSCALL SYS.GetMemPtrA + >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY bcc CS.RUN.IPOK diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index a16787d1..90a91076 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -76,10 +76,21 @@ S.DNSCACHE.STATUS .EQ 0 S.DNSCACHE.STATUS.PENDING .EQ 64 S.DNSCACHE.STATUS.RESOLVED .EQ 128 S.DNSCACHE.hNAME .EQ 1 -S.DNSCACHE.TTL .EQ 2 -S.DNSCACHE.IP .EQ 4 +S.DNSCACHE.TYPE .EQ 2 +S.DNSCACHE.TYPE.A .EQ 1 +S.DNSCACHE.TYPE.NS .EQ 2 +S.DNSCACHE.TYPE.CNAME .EQ 5 +S.DNSCACHE.TYPE.SOA .EQ 6 +S.DNSCACHE.TYPE.WKS .EQ 11 +S.DNSCACHE.TYPE.PTR .EQ 12 +S.DNSCACHE.TYPE.MX .EQ 15 +S.DNSCACHE.TYPE.SRV .EQ 33 +S.DNSCACHE.CLASS .EQ 4 +S.DNSCACHE.TTL .EQ 6 +S.DNSCACHE.RDLENGTH .EQ 10 +S.DNSCACHE.RDATA .EQ 12 * -S.DNSCACHE .EQ 8 +S.DNSCACHE .EQ 16 *-------------------------------------- S.LISTENER.PORT .EQ 0 S.LISTENER.hPS .EQ 2 diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt index 96db196a..171f323c 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -186,8 +186,6 @@ ARP.QUERY.I ldx #0 cpy #S.ETH.DSTMAC+6 bne .75 - >DEBUG - jsr SEND.ARP.FRAME.I bcs .76 diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 13d589da..8019d0cc 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -21,9 +21,7 @@ DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE * CC: hit: IP filled with address * CS: missed *-------------------------------------- -DNS.QUERY >PULLB hHOST Get host string hMem - >SYSCALL SYS.GetMemPtrA - >STYA ZPDNSHostname +DNS.QUERY >PULLW ZPDNSHostname Get host string >PULLW ZPDNSIP Get IP address to fill ldx #0 @@ -49,7 +47,7 @@ DNS.QUERY >PULLB hHOST Get host string hMem bpl .4 Pending... ldy #0 -.3 lda DNS.CACHE+S.DNSCACHE.IP,x +.3 lda DNS.CACHE+S.DNSCACHE.RDATA,x sta (ZPDNSIP),y inx iny @@ -200,9 +198,7 @@ DNS.REQUEST jsr NEW.UDP.FRAME * PULLW = PTR to IP * PULLW = TTL *-------------------------------------- -DNS.ADD >PULLB hHOST Get host string hMem - >SYSCALL SYS.GetMemPtrA - >STYA ZPDNSHostname +DNS.ADD >PULLW ZPDNSHostname Get host string >PULLW ZPDNSIP Get host IP address >PULLW HOST.TTL lda #S.DNSCACHE.STATUS.RESOLVED @@ -291,7 +287,7 @@ DNS.UPD.ENTRY lda Status ldy #0 .2 lda (ZPDNSIP),y - sta DNS.CACHE+S.DNSCACHE.IP,x + sta DNS.CACHE+S.DNSCACHE.RDATA,x inx iny cpy #4 diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 4f41f3d6..aba9ac69 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -77,7 +77,7 @@ L.DNS.CACHE .DA DNS.CACHE .DA 0 *-------------------------------------- LIB.LOAD lda bFirstLoad - bne * + bne .8 jsr ARP.CLEAR jsr DNS.CLEAR inc bFirstLoad @@ -466,7 +466,6 @@ CS.END *-------------------------------------- bFirstLoad .DA #0 Status .BS 1 -hHOST .BS 1 for DNS Cache functions HOST.TTL .BS 2 for DNS Cache functions IP.CHECKSUM .BS 4 IPCFG .BS S.IPCFG diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index 5fa30cca..4efa0309 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -33,12 +33,20 @@ CS.START cld .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT -L.MSG.GREETINGS .DA MSG.GREETINGS +L.MSG.USAGE .DA MSG.USAGE +L.MSG.GREETINGS .DA MSG.GREETINGS .DA 0 End Of Reloc Table *-------------------------------------- CS.INIT ldy #S.PS.hARGS lda (pPs),y - >PUSHA + bne .1 + + >LDYA L.MSG.USAGE + jsr PRINT.MSG + sec + rts + +.1 >PUSHA >PUSHBI $20 Push SEP=' ' >PUSHBI 1 Push 1 for getting INDEV >SYSCALL SYS.PStrGetTkn @@ -195,6 +203,7 @@ COUT phx pDevJmp jmp (pDev) *-------------------------------------- CS.END +MSG.USAGE >CSTRING "GETTY " MSG.GREETINGS >CSTRING "A2osX-GeTTY on Dev=" hDEVNAME .BS 1 *-------------------------------------- diff --git a/SBIN/TCPIP.S.txt b/SBIN/TCPIP.S.txt index 9a584760..5b7a9bd7 100644 --- a/SBIN/TCPIP.S.txt +++ b/SBIN/TCPIP.S.txt @@ -213,8 +213,22 @@ CS.DOEVENT.NET ldy #S.EVT.DATALO Get Frame hMem rts .2 cmp #S.IP.PROTOCOL.UDP + bne .21 + + ldy #S.UDP.DSTPORT + lda /UDP.PORT.DNS + cmp (ZPFrameBase1),y bne .3 - >PUSHW ZPFrameLen1 + iny + lda #UDP.PORT.DNS + cmp (ZPFrameBase1),y + bne .3 + + jsr DNSListener + bcc .89 + rts + +.21 >PUSHW ZPFrameLen1 >PUSHW ZPFrameBase1 >LIBCALL hLIBTCPIP,LIBTCPIP.UDP.LISTENER bcc .89 @@ -380,6 +394,53 @@ ICMPListener ldy #S.ICMP.TYPE .9 sec rts *-------------------------------------- +DNSListener ldy #S.DNS.F+1 + lda (ZPFrameBase1),y + and /S.DNS.F.QR + beq .9 + + ldy #S.DNS.QDCOUNT + lda (ZPFrameBase1),y + tax + beq .3 no QUERY to skip + + ldy #S.DNS Read query + +.1 lda (ZPFrameBase1),y + beq .2 + iny + bne .1 +.2 tya + clc + adc #4 Skip QTYPE & QCLASS + tay + dex skip another QUERY ? + bne .1 + +.3 lda (ZPFrameBase1),y get offset of NAME + phy save current offset in frame + tay + + ldx #0 +.4 lda (ZPFrameBase1),y compute len of NAME + beq .5 + inx + iny + bne .4 + +.5 inx X=length of NAME + txa + f + sdf + sdf + + >STYA ZPQuickPtr1 + clc + rts + +.9 sec + rts +*-------------------------------------- GetIPCFG >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG >STYA ZPQuickPtr1 diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index 178aa4f3..673e5cfa 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -14,9 +14,27 @@ AUTO 6 * X = hMem of Code Segment *-------------------------------------- S.LoadBinA sta S.LoadBinA.hFilename save file path - jsr S.GetMemByNameA - bcs .1 not already loaded + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + tay + +.1 lda (ZPQuickPtr1),y convert to UPPERCASE + cmp #$61 "a" + bmi .2 + cmp #$7B "z"+1 + bpl .2 + sec + sbc #$20 + sta (ZPQuickPtr1),y +.2 dey + bne .1 + + lda S.LoadBinA.hFilename + jsr S.GetMemByNameA + bcs .3 not already loaded + >STYA ZPQuickPtr1 Save base address ldy #S.MEM.REFCNT lda (ZPQuickPtr1),y @@ -32,12 +50,12 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path clc rts -.1 lda S.LoadBinA.hFilename +.3 lda S.LoadBinA.hFilename jsr S.LoadFileA - bcc .2 + bcc .4 rts Error Loading file -.2 >STYA S.LoadBinA.FileLen +.4 >STYA S.LoadBinA.FileLen stx S.LoadBinA.hMem save hMem txa jsr S.GetMemPtrA @@ -87,6 +105,7 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path bcs .98 pha save copy of bin path + lda S.LoadBinA.hMem jsr S.GetMemByIDA >STYA ZPQuickPtr1 diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index cc1dcb7f..cefa4095 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -383,47 +383,50 @@ S.GetMemByNameA jsr S.GetMemPtrA bcs * S.GetMemByNameYA >STYA ZPMemMgrTmp1 save BINPATH - >LDYAI MemMgr.Table+S.MEM.SIZE - >STYA ZPMemMgrSPtr + >LDYAI MemMgr.Table + >STYA ZPMemMgrTmp2 ldx #0 .1 cpx MemMgr.LastSlot beq .9 - inx - lda (ZPMemMgrSPtr) + + lda (ZPMemMgrTmp2) bpl .6 In Use? ldy #S.MEM.BIN any BIN PATH in this slot? - lda (ZPMemMgrSPtr),y + lda (ZPMemMgrTmp2),y beq .6 jsr S.GetMemPtrA get pathname - >STYA ZPMemMgrTmp2 + bcs * + >STYA ZPMemMgrTmp3 - ldy #0 + lda (ZPMemMgrTmp1) + cmp (ZPMemMgrTmp3) + bne .6 + + tay .2 lda (ZPMemMgrTmp1),y - cmp (ZPMemMgrTmp2),y + cmp (ZPMemMgrTmp3),y bne .6 - - tya - iny - cmp (ZPMemMgrTmp1) + dey bne .2 - >LDYA ZPMemMgrSPtr - - bra * + >LDYA ZPMemMgrTmp2 clc rts -.6 lda ZPMemMgrSPtr +.6 lda ZPMemMgrTmp2 clc adc #S.MEM.SIZE - sta ZPMemMgrSPtr - bcc .1 - inc ZPMemMgrSPtr+1 + sta ZPMemMgrTmp2 + bcc .7 + inc ZPMemMgrTmp2+1 + +.7 inx + bra .1 .9 sec diff --git a/SYS/KERNEL.S.TSK.txt b/SYS/KERNEL.S.TSK.txt index c74f5349..e6ef2350 100644 --- a/SYS/KERNEL.S.TSK.txt +++ b/SYS/KERNEL.S.TSK.txt @@ -466,7 +466,7 @@ S.InitProcessA >PUSHA Push Cmd Line lda (pCode),y >PUSHAX Push DS.SIZE - >PUSHBI 0 no option + >PUSHBI S.MEM.F.INIT0 Clear DS jsr S.GetMem bcs .97