From 7f06969e7db1bc6a25fd3df8bc4c6dc6f35d8536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Mon, 19 Oct 2015 22:35:00 +0200 Subject: [PATCH] Kernel & shell rewrite --- A2OSX.BOOT.DSK | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.STARTUP.txt | 18 +- BIN/DNS.S.txt | 65 +++--- BIN/PS.S.txt | 4 +- BIN/RPCINFO.S.txt | 402 ++++++++++++++++++++++++++++++++++++ DRV/CONSOLE.DRV.S.txt | 10 +- INC/A2osX.API.I.txt | 10 +- INC/KERNEL.I.txt | 4 + INC/LIBTCPIP.I.txt | 2 + INC/MACROS.I.txt | 6 +- LIB/LIBTCPIP.S.DNS.txt | 205 ++++++++++++------- LIB/LIBTCPIP.S.txt | 21 +- SBIN/GETTY.S.txt | 28 +-- SBIN/LOGIN.S.txt | 2 +- SBIN/SHELL.S.CMD.txt | 390 +++++++++++++++++++++++++++++++++++ SBIN/SHELL.S.HIS.txt | 186 +++++++++++++++++ SBIN/SHELL.S.txt | 452 +++++------------------------------------ SBIN/TCPIP.S.txt | 27 +-- SBIN/TELNETD.S.txt | 79 +++++-- SYS/KERNEL.S.DEV.txt | 86 ++++---- SYS/KERNEL.S.DRV.txt | 37 +--- SYS/KERNEL.S.ENV.txt | 40 ---- SYS/KERNEL.S.EXE.txt | 199 ++++++++++++++++++ SYS/KERNEL.S.STR.txt | 36 ---- SYS/KERNEL.S.TSK.txt | 107 +++++++--- SYS/KERNEL.S.txt | 155 ++------------ _Make_DIR.txt | 4 +- _Make_SYS.txt | 1 - 29 files changed, 1680 insertions(+), 896 deletions(-) create mode 100644 BIN/RPCINFO.S.txt create mode 100644 SBIN/SHELL.S.CMD.txt create mode 100644 SBIN/SHELL.S.HIS.txt create mode 100644 SYS/KERNEL.S.EXE.txt diff --git a/A2OSX.BOOT.DSK b/A2OSX.BOOT.DSK index 2b38af69cf5be315f7ceda0b9c9b099ed5f26efd..dd9ec13b4288f9f0a7db0f17897d396c3c3977a3 100644 GIT binary patch delta 11205 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 LQ1mCOsrLT^DTD1? diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 97ee7a2f363d5e3a8a8000fa1f370dbc0399125c..3c53c218eca8dd842459e36ea51f57ae326e3ebd 100644 GIT binary patch delta 66288 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 >LIBCALL hLIBSTR,LIBSTR.SSCANF bcs .9 - >PUSHWI 1800 default TTL >PUSHW L.IP lda hHostName >SYSCALL SYS.GetMemPtrA @@ -110,37 +111,46 @@ CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE lda (ZPPTR1) beq .2 - ldy #S.DNSCACHE.RDATA+3 + ldy #S.DNSCACHE.RDATA+4 +.5 dey lda (ZPPTR1),y >PUSHA - dey - lda (ZPPTR1),y - >PUSHA - dey - lda (ZPPTR1),y - >PUSHA - dey - lda (ZPPTR1),y - >PUSHA - - ldy #S.DNSCACHE.TTL+3 - >PUSHA - dey - lda (ZPPTR1),y - >PUSHA - dey - lda (ZPPTR1),y - >PUSHA - dey + cpy #S.DNSCACHE.RDATA + bne .5 + + ldy #S.DNSCACHE.TTL+4 +.6 dey lda (ZPPTR1),y >PUSHA + cpy #S.DNSCACHE.TTL + bne .6 ldy #S.DNSCACHE.hNAME lda (ZPPTR1),y >SYSCALL SYS.GetMemPtrA - >PUSHYA + >STYA ZPPTR2 - >PUSHB (ZPPTR1) + ldy #0 convert DNS-style string to PSTR +.10 lda (ZPPTR2),y + tax + beq .12 + + lda #'.' + sta DNSNAME,y + +.11 iny + lda (ZPPTR2),y + sta DNSNAME,y + dex + bne .11 + iny + bne .10 + +.12 dey + sty DNSNAME + + >PUSHW L.DNSNAME + >PUSHB (ZPPTR1) Entry Status >PUSHW L.MSG1 >LIBCALL hLIBSTR,LIBSTR.PRINTF @@ -151,11 +161,13 @@ CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE sta ZPPTR1 bcc .3 inc ZPPTR1+1 + .3 plx dex - bne .1 + beq .8 + jmp .1 - lda #0 tell TSKMGR that all done ok, but +.8 lda #0 tell TSKMGR that all done ok, but sec we do not want to stay in memory rts *-------------------------------------- @@ -181,12 +193,13 @@ 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 %09L %d.%d.%d.%d\n" +MSG1 >CSTRING "$%h %32S %h%h%h%h %d.%d.%d.%d\n" hLIBSTR .BS 1 hLIBTCPIP .BS 1 hHostName .BS 1 hIP .BS 1 IP .BS 4 +DNSNAME .BS K.DNS.MAXLEN+1 MAN SAVE BIN/DNS.S ASM diff --git a/BIN/PS.S.txt b/BIN/PS.S.txt index 26d1bf63..75bc0314 100644 --- a/BIN/PS.S.txt +++ b/BIN/PS.S.txt @@ -114,8 +114,8 @@ CS.END hLibStr .BS 1 PS.COUNT .BS 1 LIBSTR >PSTRING "libstr.o" -MSG0 >CSTRING "ID Flags PID CMD ARGS\n" -MSG1 >CSTRING "%03d %b %03d %16S %32S\n" +MSG0 >CSTRING "ID Flags PID CMD ARGS\n" +MSG1 >CSTRING "%03d %b %03d %30S %28S\n" MSG2 >PSTRING "(none)" MAN SAVE BIN/PS.S diff --git a/BIN/RPCINFO.S.txt b/BIN/RPCINFO.S.txt new file mode 100644 index 00000000..f6babcd6 --- /dev/null +++ b/BIN/RPCINFO.S.txt @@ -0,0 +1,402 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/BIN/RPCINFO +*-------------------------------------- + .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 +*-------------------------------------- +RPCINFO.TIMEOUT .EQ 40 40*100ms = 4 sec. +*-------------------------------------- +ZPFrameBase1 .EQ ZPBIN +ZPFrameLen1 .EQ ZPBIN+2 +ZPFramePtr1 .EQ ZPBIN+4 +*-------------------------------------- +* 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 DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIBSTR .DA LIBSTR +L.LIBTCPIP .DA LIBTCPIP +L.SSCANF.IP .DA SSCANF.IP +L.MSG0 .DA MSG0 +L.MSG1 .DA MSG1 +L.MSG2 .DA MSG2 +L.MSG3 .DA MSG3 + .DA 0 +*-------------------------------------- +CS.INIT ldy #S.PS.hARGS + lda (pPs),y + bne .1 + lda #SYSMGR.ERRSYN + sec + rts + +.1 >LDYA L.LIBSTR + >LOADLIBYA + sta hLIBSTR + + >LDYA L.LIBTCPIP + >LOADLIBYA + sta hLIBTCPIP + + >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? + bcs .9 + >STYA ZPQuickPtr1 + + lda (ZPQuickPtr1) Configured ? + bpl .9 + + ldy #S.IPCFG.HDEV + lda (ZPQuickPtr1),y + sta hDev + + lda A2OSX.RANDOM16 + ldy #XID + sta (pData),y + lda A2OSX.RANDOM16+1 + iny + sta (pData),y + + lda (pPs) + ora #S.PS.F.EVENT Now accept events + sta (pPs) + clc + +.9 rts +*-------------------------------------- +CS.RUN >PUSHW pData DST.IP + >PUSHW L.SSCANF.IP + ldy #S.PS.hARGS + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.SSCANF + bcc CS.RUN.IPOK + + lda #RPCINFO.TIMEOUT + ldy #TimeOut + sta (pData),y + +CS.RUN.DNSQUERY >PUSHW pData DST.IP + ldy #S.PS.hARGS + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY + bcc CS.RUN.IPOK + + jsr A2osX.SLEEP + ldy #TimeOut + lda (pData),y + bne CS.RUN.DNSQUERY + + ldy #S.PS.hARGS + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + sec +CS.RUN.RTS rts + +CS.RUN.IPOK ldy #S.PS.hARGS + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + ldy #3 + >PUSHB (pData),y DST.IP+3 + dey + >PUSHB (pData),y DST.IP+2 + dey + >PUSHB (pData),y DST.IP+1 + >PUSHB (pData) DST.IP + >PUSHW L.MSG1 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +CS.RUN.RPCCALL >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.UDP.FRAME + bcs CS.RUN.RTS + >STYA ZPFrameBase1 + txa + ldy #hFrame + sta (pData),y + + ldx #3 + ldy #DST.IP +.10 lda (pData),y + pha + iny + dex + bpl .10 + + ldx #3 + ldy #S.IP.DST+3 +.1 pla + sta (ZPFrameBase1),y + dey + dex + bpl .1 + + ldy #S.UDP.SRCPORT + lda #UDP.PORT.PMAP + sta (ZPFrameBase1),y + ldy #S.UDP.DSTPORT + sta (ZPFrameBase1),y + + ldy #XID + lda (pData),y + tax + iny + lda (pData),y + + ldy #S.RPC.XID+1 + sta (ZPFrameBase1),y + dey + txa + sta (ZPFrameBase1),y + +.3 >PUSHWI S.RPC+32 + ldy #hFrame + lda (pData),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME + bcc .4 + + jsr A2osX.SLEEP + ldy #TimeOut + lda (pData),y + bne .3 + +.4 ldy #hFrame + lda (pData),y + >SYSCALL SYS.FreeMemA + + ldy #bReply + lda #0 + sta (pData),y + lda #RPCINFO.TIMEOUT + ldy #TimeOut + sta (pData),y + +CS.RUN.WAIT jsr A2osX.SLEEP + ldy #bReply + lda (pData),y + bne .1 + + ldy #bCTRLC + lda (pData),y + bne CS.RUN.ERROR + ldy #TimeOut + lda (pData),y + bne CS.RUN.WAIT + + ldy #3 + >PUSHB (pData),y DST.IP+3 + dey + >PUSHB (pData),y DST.IP+2 + dey + >PUSHB (pData),y DST.IP+1 + >PUSHB (pData) DST.IP + >PUSHW L.MSG2 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.1 ldy #bCTRLC + lda (pData),y + bne CS.RUN.ERROR + ldy #TimeOut + lda (pData),y + beq .2 + + jsr A2osX.SLEEP + bra .1 + +.2 +CS.RUN.ERROR sec + rts +*-------------------------------------- +CS.DOEVENT lda (pEvent) + and #S.EVT.F.TIMER is it a TIMER event? + beq .1 no.... + + ldy #TimeOut + lda (pData),y + beq .10 + + dec + sta (pData),y +.10 sec do not discard TIMER event + rts + +.1 lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .2 + + ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPs),y + bne .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 .8 + + lda #$FF + ldy #bCTRLC + sta (pData),y + bra .8 + +.2 lda (pEvent) + and #S.EVT.F.NET + beq .9 + + ldy #S.EVT.hDEV + lda (pEvent),y + cmp hDev + bne .9 + + ldy #S.EVT.DATALO Get Frame hMem + lda (pEvent),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPFrameBase1 + + ldy #S.IP.PROTOCOL + lda (ZPFrameBase1),y + cmp #S.IP.PROTOCOL.UDP + + bne .9 + + ldy #S.UDP.DSTPORT + lda (ZPFrameBase1),y + cmp #S.ICMP.TYPE.ECHOREP + bne .9 + + ldy #S.RPC.XID + lda (ZPFrameBase1),y + tax + iny + lda (ZPFrameBase1),y + ldy #XID+1 + cmp (pData),y + bne .9 + dey + txa + cmp (pData),y + bne .9 + + jsr CS.EVENT.REPLY +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CS.EVENT.REPLY lda #RPCINFO.TIMEOUT + sec + sbc TimeOut + + stz TimeOut.ms + stz TimeOut.ms+1 + + tay + beq .3 + +.1 lda TimeOut.ms + clc + adc #K.TIMER16RESOLUTION*20 + sta TimeOut.ms + bcc .2 + inc TimeOut +.2 dey + bne .1 + +.3 >PUSHW TimeOut.ms + ldy #S.IP.TTL + >PUSHB (ZPFrameBase1),y + + ldy #S.ICMP.SEQUENCE+1 + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + + ldy #S.IP.SRC+3 + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + + >PUSHW L.MSG3 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #bReply + lda (pData),y + inc + sta (pData),y + rts +*-------------------------------------- +CS.QUIT lda hLIBTCPIP + >SYSCALL SYS.UnloadLibA + lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +CS.END +LIBSTR >PSTRING "libstr.o" +LIBTCPIP >PSTRING "libtcpip.o" +SSCANF.IP >PSTRING "%d.%d.%d.%d" +MSG0 >CSTRING "%S: Unknown host\n" +MSG1 >CSTRING "PING %d.%d.%d.%d (%S)\n" +MSG2 >CSTRING "%d.%d.%d.%d: TimeOut/Host unreachable\n" +MSG3 >CSTRING "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\n" +hLIBSTR .BS 1 +hLIBTCPIP .BS 1 +hDev .BS 1 +TimeOut.ms .BS 2 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +DST.IP .BS 4 +hFrame .BS 1 +TimeOut .BS 1 +XID .BS 4 +bCTRLC .BS 1 +bReply .BS 1 +DS.END + .ED +*-------------------------------------- +MAN +SAVE BIN/RPCINFO.S +ASM diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index 7902268b..4ccd0798 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -81,8 +81,16 @@ OPEN stz CURON GETEVENT lda A2osX.TIMER16 and #CURSOR.BLINK.SPEED eor CURON - beq .9 + beq .1 jsr CURBLNK + +.1 lda A2osX.SCREENS + and #A2osX.SCREENS.C is screen active? + beq .9 + + >SYSCALL SYS.GetKeyboardEvent + bcs .9 + rts .9 lda #0 Error = no event sec diff --git a/INC/A2osX.API.I.txt b/INC/A2osX.API.I.txt index d51dab6d..514501f5 100644 --- a/INC/A2osX.API.I.txt +++ b/INC/A2osX.API.I.txt @@ -23,7 +23,6 @@ SYS.PStrCat .EQ $14 SYS.PStrCmp .EQ $16 SYS.PStrGetTkn .EQ $18 -SYS.GetPStrIndex .EQ $1A *-------------------------------------- SYS.LoadBinA .EQ $20 SYS.LoadLibYA .EQ $22 @@ -81,9 +80,13 @@ SYS.MLIWriteBlock .EQ $7E SYS.GetDevByIDA .EQ $80 SYS.GetDevByNameA .EQ $82 SYS.GetDevByNameYA .EQ $84 + +SYS.GetKeyboardEvent .EQ $88 *-------------------------------------- -SYS.ExecProcessA .EQ $90 -SYS.CreateProcessA .EQ $92 +SYS.ExecProcessNewEnvA .EQ $90 +SYS.ExecProcessA .EQ $92 +SYS.CreateProcessNewEnvA .EQ $94 +SYS.CreateProcessA .EQ $96 SYS.GetPSByIDA .EQ $98 *-------------------------------------- @@ -200,6 +203,7 @@ S.PS.F .EQ 0 S.PS.F.INUSE .EQ %10000000 S.PS.F.HOLD .EQ %01000000 S.PS.F.EVENT .EQ %00100000 +S.PS.F.ENV .EQ %00010000 S.PS.ID .EQ 1 S.PS.PID .EQ 2 S.PS.hCS .EQ 3 diff --git a/INC/KERNEL.I.txt b/INC/KERNEL.I.txt index ad4a2bfd..6d7f873c 100644 --- a/INC/KERNEL.I.txt +++ b/INC/KERNEL.I.txt @@ -25,6 +25,10 @@ K.UDPTABLE.SIZE .EQ 16 K.TCPTABLE.SIZE .EQ 16 K.ETH.FRAME.LEN .EQ 1514 K.IP.TTL .EQ 64 +K.DNS.MAXLEN .EQ 64 +K.DYNPORT.START .EQ 49152 +K.DYNPORT.END .EQ 65535 +K.DYNPORT.MAX .EQ 64 *-------------------------------------- H.BIN.HEADER .EQ 0 H.BIN.HEADER.DRV65 .EQ $4C8D 6502:cld,jmp abs diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 90a91076..28562532 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -89,6 +89,8 @@ S.DNSCACHE.CLASS .EQ 4 S.DNSCACHE.TTL .EQ 6 S.DNSCACHE.RDLENGTH .EQ 10 S.DNSCACHE.RDATA .EQ 12 +S.DNSCACHE.ID .EQ 12 Store Message.Id in cache (pending req.) +S.DNSCACHE.DYNPORT .EQ 14 Store Dyn.Port in cache (pending req.) * S.DNSCACHE .EQ 16 *-------------------------------------- diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt index 07997d9c..476154e0 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -287,9 +287,9 @@ AUTO 6 .EM *-------------------------------------- .MA PSTRING - .DA #.74-.73 -.73 .AS "]1" -.74 .AS "" + .DA #:2-:1 +:1 .AS "]1" +:2 .EQ * .EM MAN SAVE INC/MACROS.I diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 6cbf6ff3..7d3b6495 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -15,13 +15,15 @@ DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE *-------------------------------------- * DNS.QUERY * In: -* PULLA = hostname PSTR +* PULLW = hostname PTR to PSTR * PULLW = PTR to IP to fill with cached data * Out: * CC: hit: IP filled with address * CS: missed *-------------------------------------- -DNS.QUERY >PULLW ZPDNSHostname Get host string +DNS.QUERY >PULLYA Get host string + jsr PSTR2DNSHostName + >PULLW ZPDNSIP Get IP address to fill ldx #0 @@ -29,21 +31,25 @@ DNS.QUERY >PULLW ZPDNSHostname Get host string .1 lda DNS.CACHE,x beq .6 empty DNS cache entry? + phx lda DNS.CACHE+S.DNSCACHE.hNAME,x >SYSCALL SYS.GetMemPtrA >STYA ZPQuickPtr3 - lda (ZPDNSHostname) - cmp (ZPQuickPtr3) Same Length? + plx + + ldy #0 + +.2 lda DNSHostname,y + bne .21 + lda (ZPQuickPtr3),y + beq .22 + +.21 cmp (ZPQuickPtr3),y bne .6 - tay -.2 lda (ZPDNSHostname),y - jsr ToLowerCaseA - cmp (ZPQuickPtr3),y - bne .6 - dey + iny bne .2 - lda DNS.CACHE,x get back status... +.22 lda DNS.CACHE,x get back status... bpl .4 Pending... ldy #0 @@ -92,18 +98,18 @@ DNS.REQUEST jsr NEW.UDP.FRAME ldy #S.DNS.ID lda A2osX.RANDOM16 sta (ZPFrameBase1),y - sta MESSAGE.ID + sta DNSMessageID iny lda A2osX.RANDOM16+1 sta (ZPFrameBase1),y - sta MESSAGE.ID+1 + sta DNSMessageID+1 - ldy #S.DNS.F - lda /S.DNS.F.RD - sta (ZPFrameBase1),y - iny - lda #S.DNS.F.RD - sta (ZPFrameBase1),y +* ldy #S.DNS.F +* lda /S.DNS.F.RD +* sta (ZPFrameBase1),y +* iny +* lda #S.DNS.F.RD +* sta (ZPFrameBase1),y ldy #S.DNS.QDCOUNT lda /1 @@ -120,28 +126,14 @@ DNS.REQUEST jsr NEW.UDP.FRAME adc ZPFrameBase1+1 sta ZPFramePtr1+1 - lda (ZPDNSHostname) Get hostname len - tay - ldx #0 -.2 lda (ZPDNSHostname),y - cmp #'.' - bne .3 - txa - ldx #$FF -.3 sta (ZPFramePtr1),y - inx - dey - bne .2 - txa - sta (ZPFramePtr1) - - lda (ZPDNSHostname) - tay - iny - lda #$0 Ending #0 + ldy #0 +.2 lda DNSHostname,y sta (ZPFramePtr1),y - + beq .3 iny + bne .2 + +.3 iny lda /S.DNS.QTYPE.A sta (ZPFramePtr1),y iny @@ -155,7 +147,7 @@ DNS.REQUEST jsr NEW.UDP.FRAME lda #S.DNS.QCLASS.IN sta (ZPFramePtr1),y - lda (ZPDNSHostname) Get hostname len again (QNAME) + lda DNSHostnameLen Get hostname len again (QNAME) clc adc #6 (len+1) + Ending 0 + QTYPE + QCLASS adc #S.DNS @@ -203,13 +195,19 @@ DNS.REQUEST jsr NEW.UDP.FRAME *-------------------------------------- * DNS.ADD * In: -* PULLA = hostname PSTR to Add +* PULLW = hostname PSTR to Add * PULLW = PTR to IP -* PULLW = TTL *-------------------------------------- -DNS.ADD >PULLW ZPDNSHostname Get host string +DNS.ADD >PULLYA Get host string + jsr PSTR2DNSHostName >PULLW ZPDNSIP Get host IP address - >PULLW HOST.TTL + + lda #$80 + sta DNSHostTTL+3 + stz DNSHostTTL+2 + stz DNSHostTTL+1 + stz DNSHostTTL + lda #S.DNSCACHE.STATUS.RESOLVED bra DNS.ADD.I @@ -223,34 +221,35 @@ DNS.ADD.I sta Status beq DNS.ADD.ENTRY free ? lda DNS.CACHE+S.DNSCACHE.hNAME,x + phx >SYSCALL SYS.GetMemPtrA >STYA ZPQuickPtr3 - lda (ZPDNSHostname) - cmp (ZPQuickPtr3) Same Length? - bne .4 + plx - tay -.2 lda (ZPDNSHostname),y - jsr ToLowerCaseA + ldy #0 + +.2 lda DNSHostname,y cmp (ZPQuickPtr3),y bne .4 - dey - bne .2 - bra DNS.UPD.ENTRY + and #$FF End Of String? + beq DNS.UPD.ENTRY + + iny + bne .2 .4 txa clc adc #S.DNSCACHE - cmp #K.DNSCACHE.SIZE*S.DNSCACHE - beq .5 tax - bra .1 - -.5 lda DNS.CACHE+S.DNSCACHE.hNAME discard oldest entry hNAME + cmp #K.DNSCACHE.SIZE*S.DNSCACHE + bne .1 + + lda DNS.CACHE+S.DNSCACHE.hNAME discard oldest entry hNAME >SYSCALL SYS.FreeMemA ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE + .6 lda DNS.CACHE+S.DNSCACHE-1,x sta DNS.CACHE-1,x dex @@ -259,9 +258,9 @@ DNS.ADD.I sta Status ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE DNS.ADD.ENTRY phx - lda (ZPDNSHostname) - inc add 1 for len - tay + + ldy DNSHostnameLen + iny add 1 for Ending 00 lda #0 >PUSHYA push PSTR len >PUSHBI 0 no option @@ -270,29 +269,40 @@ DNS.ADD.ENTRY phx plx rts -.10 >STYA ZPQuickPtr3 +.10 >STYA ZPQuickPtr4 txa plx sta DNS.CACHE+S.DNSCACHE.hNAME,x - lda (ZPDNSHostname) - sta (ZPQuickPtr3) - tay - -.1 lda (ZPDNSHostname),y - jsr ToLowerCaseA - sta (ZPQuickPtr3),y - dey + ldy #0 +.1 lda DNSHostname,y + sta (ZPQuickPtr4),y + iny + cpy DNSHostnameLen bne .1 + + lda #0 + sta (ZPQuickPtr4),y DNS.UPD.ENTRY lda Status - sta DNS.CACHE,x - bpl .9 pending... + sta DNS.CACHE+S.DNSCACHE.STATUS,x + bmi .1 pending? - lda HOST.TTL + lda DNSMessageID + sta DNS.CACHE+S.DNSCACHE.ID,x + lda DNSMessageID+1 + sta DNS.CACHE+S.DNSCACHE.ID+1,x + + bra .9 + +.1 lda DNSHostTTL sta DNS.CACHE+S.DNSCACHE.TTL,x - lda HOST.TTL+1 + lda DNSHostTTL+1 sta DNS.CACHE+S.DNSCACHE.TTL+1,x + lda DNSHostTTL+2 + sta DNS.CACHE+S.DNSCACHE.TTL+2,x + lda DNSHostTTL+3 + sta DNS.CACHE+S.DNSCACHE.TTL+3,x ldy #0 .2 lda (ZPDNSIP),y @@ -313,6 +323,53 @@ DNS.GETCACHE >LDYA L.DNS.CACHE *-------------------------------------- * PRIVATE *-------------------------------------- +PSTR2DNSHostName >STYA ZPQuickPtr1 + + lda (ZPQuickPtr1) + beq .9 + + cmp #K.DNS.MAXLEN-1 + bcs .9 + + tay + + inc + sta DNSHostNameLen + + lda #0 Ending 0 + sta DNSHostName+1,y + + ldx #0 + +.1 lda (ZPQuickPtr1),y + and #$7f + cmp #'.' + beq .2 + + cmp #'A' + bcc .10 + cmp #'Z'+1 + bcs .10 + adc #$20 + +.10 inx + bra .3 + +.2 txa + ldx #0 + +.3 sta DNSHostName,y + dey + bne .1 + stx DNSHostName + + clc + rts + +.9 sec + rts +*-------------------------------------- + MAN SAVE LIB/LIBTCPIP.S.DNS LOAD LIB/LIBTCPIP.S diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index ae6ab2b9..bcbbe2e5 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -19,7 +19,6 @@ ZPFrameLen1 .EQ ZPLIB+2 ZPFramePtr1 .EQ ZPLIB+4 ZPARPIP .EQ ZPLIB+6 ZPARPMAC .EQ ZPLIB+8 -ZPDNSHostname .EQ ZPLIB+10 ZPDNSIP .EQ ZPLIB+12 *-------------------------------------- * File Header (16 Bytes) @@ -80,6 +79,7 @@ LIB.LOAD lda bFirstLoad bne .8 jsr ARP.CLEAR jsr DNS.CLEAR + jsr DYN.CLEAR inc bFirstLoad .8 clc rts @@ -389,11 +389,19 @@ ADD.LISTENER sec *-------------------------------------- REM.LISTENER sec rts +*-------------------------------------- +DYN.CLEAR +*-------------------------------------- +DYN.GET +*-------------------------------------- +DYN.RELEASE *-------------------------------------- .INB LIB/LIBTCPIP.S.ARP .INB LIB/LIBTCPIP.S.DNS *-------------------------------------- * PRIVATE +*-------------------------------------- + *-------------------------------------- ToLowerCaseA cmp #'A' bcc .1 @@ -466,14 +474,21 @@ CS.END *-------------------------------------- bFirstLoad .DA #0 Status .BS 1 -MESSAGE.ID .BS 2 for DNS functions -HOST.TTL .BS 4 for DNS functions +DNSMessageID .BS 2 +DNSDynamicPort .BS 2 +DNSHostTTL .BS 4 +DNSHostName .BS K.DNS.MAXLEN+1 +DNSHostNameLen .BS 1 IP.CHECKSUM .BS 4 IPCFG .BS S.IPCFG ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE UDP.TABLE .BS K.UDPTABLE.SIZE*S.LISTENER TCP.TABLE .BS K.TCPTABLE.SIZE*S.LISTENER +DYNPORT.UDP.LAST .BS 2 +DYNPORT.TCP.LAST .BS 2 +DYNPORT.UDP .BS K.DYNPORT.MAX*4 +DYNPORT.TCP .BS K.DYNPORT.MAX*4 *-------------------------------------- MAN SAVE LIB/LIBTCPIP.S diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index 4efa0309..e5067c48 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -50,38 +50,20 @@ CS.INIT ldy #S.PS.hARGS >PUSHBI $20 Push SEP=' ' >PUSHBI 1 Push 1 for getting INDEV >SYSCALL SYS.PStrGetTkn - bcs .9 + bcs .98 sta hDEVNAME >SYSCALL SYS.GetDevByNameA - bcs .8 + bcs .99 txa ldy #S.PS.hINDEV sta (pPs),y - - - lda hDEVNAME - >SYSCALL SYS.FreeMemA - - ldy #S.PS.hARGS - lda (pPs),y - >PUSHA - >PUSHBI $20 Push SEP=' ' - >PUSHBI 2 Push 1 for getting OUTDEV - >SYSCALL SYS.PStrGetTkn -.9 bcs .99 - - sta hDEVNAME - >SYSCALL SYS.GetDevByNameA -.8 bcs .98 - - >STYA pDev - txa ldy #S.PS.hOUTDEV sta (pPs),y ldy #S.PS.hERRDEV sta (pPs),y + lda hDEVNAME >SYSCALL SYS.FreeMemA @@ -89,7 +71,7 @@ CS.INIT ldy #S.PS.hARGS lda (pPs),y >PUSHA >PUSHBI $20 Push SEP=' ' - >PUSHBI 3 Push 3 for getting BIN + >PUSHBI 2 Push 3 for getting BIN >SYSCALL SYS.PStrGetTkn bcs .99 @@ -142,7 +124,7 @@ CS.RUN ldy #S.PS.hOUTDEV ldy #hBinName lda (pData),y - >SYSCALL SYS.ExecProcessA + >SYSCALL SYS.ExecProcessNewEnvA .9 rts *-------------------------------------- CS.DOEVENT sec diff --git a/SBIN/LOGIN.S.txt b/SBIN/LOGIN.S.txt index 00f36601..f0578ffe 100644 --- a/SBIN/LOGIN.S.txt +++ b/SBIN/LOGIN.S.txt @@ -82,7 +82,7 @@ CS.RUN lda #0 ldy #hSHELL lda (pData),y - >SYSCALL SYS.ExecProcessA + >SYSCALL SYS.ExecProcessNewEnvA bcc .8 diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt new file mode 100644 index 00000000..2e85c783 --- /dev/null +++ b/SBIN/SHELL.S.CMD.txt @@ -0,0 +1,390 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +EXEC.CMD stz hFullCmd + stz hEnvPath + + ldy #hCmdLine + >PUSHB (pData),y + >PUSHBI $20 Push SEP=' ' + >PUSHBI 0 Push 0 for getting CMD & ARGS + >SYSCALL SYS.PStrGetTkn + bcs .99 + + sta hExecCmd + stx hExecArgs + + >SYSCALL SYS.GetMemPtrA + >STYA ZPPtr1 + + ldx #0 + stz ExecCmdIdx + +.1 lda CMDS,x + beq EXEC.CMD.EXT + cmp (ZPPtr1) + bne .5 + + phx + ldy #0 + +.2 iny + inx + lda (ZPPtr1),y + cmp #'a' + bcc .3 + cmp #'{' + bcs .3 + eor #$20 to Uppercase +.3 cmp CMDS,x + bne .4 + tya + cmp (ZPPtr1) + bne .2 + plx + + jsr EXEC.CMD.INT + jmp EXEC.CMD.ClnUp + +.4 plx +.5 txa + sec + adc CMDS,x + tax + inc ExecCmdIdx + inc ExecCmdIdx + bra .1 +.99 rts + +EXEC.CMD.EXT ldy #1 + lda (ZPPtr1),y + cmp #'/' + bne .2 + ldy #hCmdLine + lda (pPs),y + bra .11 + +.2 >PUSHW L.ENV.PATH push ENVNAME=PATH + ldy #S.PS.hENV + lda (pPs),y + >PUSHA + >SYSCALL SYS.GetEnvVarP get value for ENV=PATH + + bcs EXEC.CMD.ClnUp + + sta hEnvPath + >PUSHB hExecCmd + >PUSHB hEnvPath + >SYSCALL SYS.FileSearch + bcc .10 + + >PUSHB hExecCmd + ldy #S.PS.hPREFIX + lda (pPs),y + >PUSHA + >SYSCALL SYS.FileSearch + + bcs EXEC.CMD.ClnUp + +.10 sta hFullCmd +.11 >SYSCALL SYS.MLIGetFileInfoA + bcs EXEC.CMD.ClnUp + + >STYA ZPPTR1 + ldy #1 Get File Type + lda (ZPPTR1),y + cmp #$04 TXT File ? + bne .1 + + bra * + +.1 jsr EXEC.CMD.ClnUp Discard CMD & ARGS + ldy #hCmdLine + lda (pData),y + >SYSCALL SYS.ExecProcessNewEnvA + + rts + +EXEC.CMD.ClnUp pha + php + lda hFullCmd + beq .1 + >SYSCALL SYS.FreeMemA + +.1 lda hEnvPath + beq .2 + >SYSCALL SYS.FreeMemA + +.2 lda hExecArgs + beq .3 + >SYSCALL SYS.FreeMemA + +.3 lda hExecCmd + beq .8 + >SYSCALL SYS.FreeMemA +.8 plp + pla + rts +*-------------------------------------- +EXEC.CMD.INT ldx ExecCmdIdx + jmp (J.INTCMDS,x) +*-------------------------------------- +EXEC.CMD.CD lda hExecArgs + bne EXEC.CMD.CD.C + ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.PRINTP + jsr CROUT + clc + rts + +EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR2 + ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 + >PUSHWI MLI.MAXPATH+1 Get a buffer for new PATH + >PUSHBI 0 no particular Option + >SYSCALL SYS.GetMem + bcs .99 + >STYA ZPPTR3 + stx hNEWPATH + + lda #0 + sta (ZPPTR3) + ldy #1 + lda (ZPPTR2),y + cmp #'/' Full Path? + beq .3 + cmp #'.' ".." ? + bne .2 + lda (ZPPTR2) + cmp #2 + bne .97 + iny + lda (ZPPTR2),y + cmp #'.' + bne .97 + lda (ZPPTR1) + tay +.1 dey + beq .97 + lda (ZPPTR1),y + cmp #'/' + bne .1 + tya + sta (ZPPTR3) +.11 lda (ZPPTR1),y + sta (ZPPTR3),y + dey + bne .11 + bra .4 +.97 lda #SYSMGR.ERRSYN +.98 pha + lda hNEWPATH + >SYSCALL SYS.FreeMemA + pla + sec +.99 rts + +.2 >PUSHW ZPPTR1 + >PUSHW ZPPTR3 + >LIBCALL hLIBSTR,LIBSTR.STRCPYP +.3 >PUSHW ZPPTR2 + >PUSHW ZPPTR3 + >LIBCALL hLIBSTR,LIBSTR.STRCATP + lda (ZPPTR3) + tay + lda #'/' Ending with '/'? + cmp (ZPPTR3),y + beq .4 + iny + sta (ZPPTR3),y + tya + sta (ZPPTR3) +.4 lda hNEWPATH + >SYSCALL SYS.CheckPrefixA + bcs .98 + ldy #S.PS.hPREFIX + lda (pPs),y + pha + lda hNEWPATH + sta (pPs),y + pla + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +EXEC.CMD.SET lda hExecArgs + bne .2 + + ldy #S.PS.hENV + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 + +.1 lda (ZPPTR1) + beq .8 Ending 0 ? + >PUSHW ZPPTR1 + >LIBCALL hLIBSTR,LIBSTR.PRINTP + jsr CROUT + + lda ZPPTR1 + sec + adc (ZPPTR1) Add len+1 to PTR + sta ZPPTR1 + bcc .1 + inc ZPPTR1 + bra .1 + +.8 clc + rts + +.2 >PUSHA Push Cmd Line + >PUSHBI $3D Push SEP='=' + >PUSHBI 0 Push Token IDX + >SYSCALL SYS.PStrGetTkn + bcc .3 + lda #SYSMGR.ERRSYN + rts + +.3 sta hVarName + stx hVarValue + txa + bne .7 + + lda hExecArgs + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 + lda (ZPPTR1) + tay + lda (ZPPTR1),y + cmp #'=' + beq .7 + + >PUSHB hVarName + ldy #S.PS.hENV + >PUSHB (pPs),y + >SYSCALL SYS.GetEnvVarH + bcs .97 + sta hVarValue + + lda hVarName + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.PRINTP + + lda #'=' + jsr COUT + + lda hVarValue + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.PRINTP + jsr CROUT + + bra .97 + +.7 >PUSHB hVarValue + >PUSHB hVarName + ldy #S.PS.hENV + >PUSHB (pPs),y + >SYSCALL SYS.SetEnvVarH + +.97 php + pha + lda hVarValue + beq .98 + >SYSCALL SYS.FreeMemA +.98 lda hVarName + >SYSCALL SYS.FreeMemA + pla + php + rts +*-------------------------------------- +EXEC.CMD.DATE >SYSCALL SYS.MLIGetTime + bcs .9 + >PUSHW DATELO + >LIBCALL hLIBSTR,LIBSTR.PRINTDATE + jsr CROUT + clc +.9 rts +*-------------------------------------- +EXEC.CMD.TIME >SYSCALL SYS.MLIGetTime + bcs .9 + >PUSHW TIMELO + >LIBCALL hLIBSTR,LIBSTR.PRINTTIME + jsr CROUT + clc +.9 rts +*-------------------------------------- +EXEC.CMD.ECHO lda hExecArgs + beq .98 + >SYSCALL SYS.ExpandPStrA + bcs .99 + + pha + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.PRINTP + jsr CROUT + pla + >SYSCALL SYS.FreeMemA + clc + rts + +.98 lda #SYSMGR.ERRSYN + sec +.99 rts +*-------------------------------------- +EXEC.CMD.TYPE lda hExecArgs + beq .98 + >SYSCALL SYS.LoadFileA + bcs .99 + + >STYA ZPPTR2 store file len + phx + txa + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 +.1 lda ZPPTR2 + bne .2 + lda ZPPTR2+1 + beq .3 + dec ZPPTR2+1 +.2 dec ZPPTR2 + + lda (ZPPTR1) + jsr COUT + inc ZPPTR1 + bne .1 + inc ZPPTR1+1 + bra .1 + +.3 pla + >SYSCALL SYS.FreeMemA + clc + rts + +.98 lda #SYSMGR.ERRSYN + sec +.99 rts +*-------------------------------------- +EXEC.CMD.EXIT ldy #bEXIT + lda #$FF + sta (pData),y + clc + rts +*-------------------------------------- +MAN +SAVE SBIN/SHELL.S.CMD +LOAD SBIN/SHELL.S +ASM diff --git a/SBIN/SHELL.S.HIS.txt b/SBIN/SHELL.S.HIS.txt new file mode 100644 index 00000000..45e66b5d --- /dev/null +++ b/SBIN/SHELL.S.HIS.txt @@ -0,0 +1,186 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +History.Init >PUSHWI 256 Get a buffer for History + >PUSHBI S.MEM.F.INIT0 + >SYSCALL SYS.GetMem + bcs .9 + + txa + ldy #hCmdHistory + sta (pData),y + + lda #0 + ldy #CmdHistory.IDX + sta (pData),y + ldy #CmdHistory.END + sta (pData),y +.9 rts +*-------------------------------------- +History.Add ldy #hCmdHistory + lda (pData),y + beq .9 + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 + +.10 ldy #CmdHistory.END + lda (pData),y + sec add len+1 + adc (pData) CmdBuffer length + bcc .2 enough room + + lda (ZPPTR1) get len of oldest string + sec + adc ZPPTR1 + sta ZPPTR2 + lda ZPPTR1+1 + adc #0 + sta ZPPTR2+1 + + ldy #$FF + +.1 iny + lda (ZPPTR2),y move back until ending 0 found + sta (ZPPTR1),y + bne .1 + + tya + + ldy #CmdHistory.END mark new end of history + sta (pData),y + bra .10 retry.... + +.2 tax keep new CmdHistory.END + + tay + lda #0 + sta (ZPPTR1),y set ending 0 + + ldy #CmdHistory.END save old END + lda (pData),y + pha + + txa get back new END + + ldy #CmdHistory.IDX set it as new IDX + sta (pData),y + + ldy #CmdHistory.END + sta (pData),y set new CmdHistory.END + + pla get back old END + clc + adc ZPPTR1 + sta ZPPTR1 + bcc .3 + inc ZPPTR1+1 + +.3 lda (pData) + tay + +.4 lda (pData),y + sta (ZPPTR1),y + dey + bpl .4 +.9 rts +*-------------------------------------- +History.GetPrev ldy #hCmdHistory + lda (pData),y + beq HISTORY.RTS + + tax + + ldy #CmdHistory.END + lda (pData),y + beq HISTORY.RTS empty history,nothing to do + ldy #CmdHistory.IDX + lda (pData),y + beq HISTORY.RTS already oldest,nothing to do + + txa + + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 + + lda #0 + +.1 tax + tay + sec + adc (ZPPTR1),y + ldy #CmdHistory.IDX + cmp (pData),y + bne .1 reached current index + +.2 txa + ldy #CmdHistory.IDX set new index + sta (pData),y + bra History.SetBuf +History.RTS rts +*-------------------------------------- +History.GetNext ldy #hCmdHistory + lda (pData),y + beq HISTORY.RTS + + tax + + ldy #CmdHistory.END + lda (pData),y + beq HISTORY.RTS empty history,nothing to do + ldy #CmdHistory.IDX + cmp (pData),y + beq HISTORY.RTS already oldest,nothing to do + + txa + + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 + + ldy #CmdHistory.IDX + lda (pData),y + phy + tay + sec + adc (ZPPTR1),y add length+1 of current line in history + ply + sta (pData),y + + ldy #CmdHistory.END + cmp (pData),y + bne History.SetBuf + jmp CmdBuffer.CLR end of history, just blank buffer +*-------------------------------------- +History.SetBuf jsr CmdBuffer.CLR + + ldy #CmdHistory.IDX + lda (pData),y + tay keep length of string + + clc + adc ZPPTR1 + sta ZPPTR1 + bcc .1 + inc ZPPTR1+1 + +.1 lda (ZPPTR1),y + sta (pData),y + dey + bpl .1 + + jmp CmdBuffer.PRINT +*-------------------------------------- +History.Quit ldy #hCmdHistory + lda (pData),y + beq .9 + >SYSCALL SYS.FreeMemA +.9 rts +*-------------------------------------- +MAN +SAVE SBIN/SHELL.S.HIS +LOAD SBIN/SHELL.S +ASM diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index 4fa60efa..425f118f 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -3,7 +3,7 @@ PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 - .LIST OFF + .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/SBIN/SHELL @@ -33,7 +33,7 @@ CS.START cld .DA 0 *-------------------------------------- * Relocation Table -*-------------------------------------- +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT @@ -43,8 +43,8 @@ L.LIBSTR .DA LIBSTR L.MSG.GREETINGS .DA MSG.GREETINGS L.MSG.UNKNOWN .DA MSG.UNKNOWN L.MSG.SYNERR .DA MSG.SYNERR -L.CMDS .DA CMDS -T.INTCMDS .DA EXEC.CMD.CD +L.ENV.PATH .DA ENV.PATH +J.INTCMDS .DA EXEC.CMD.CD .DA EXEC.CMD.SET .DA EXEC.CMD.DATE .DA EXEC.CMD.TIME @@ -53,26 +53,23 @@ T.INTCMDS .DA EXEC.CMD.CD .DA EXEC.CMD.EXIT .DA 0 *-------------------------------------- -CS.INIT lda #0 - ldy #bEXIT - sta (pData),y - ldy #CmdHistory.IDX - sta (pData),y - ldy #CmdHistory.END - sta (pData),y - - >PUSHWI 256 Get a buffer for History - >PUSHBI S.MEM.F.INIT0 - >SYSCALL SYS.GetMem - bcs .99 - - stx hCmdHistory - - >LDYA L.LIBSTR +CS.INIT >LDYA L.LIBSTR >LOADLIBYA - bcs .99 + bcs .9 sta hLIBSTR + ldy #S.PS.hARGS Batch mode ? + lda (pPs),y + beq CS.INIT.INTERACTIVE no,continue starting interactive + + + clc +.9 rts +*-------------------------------------- +CS.INIT.INTERACTIVE + jsr History.Init + bcs .9 + ldy #S.PS.ID lda (pPs),y >PUSHA @@ -88,9 +85,9 @@ CS.INIT lda #0 lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) - + clc -.99 rts +.9 rts *-------------------------------------- CS.RUN lda #0 sta (pData) @@ -107,14 +104,19 @@ CS.RUN lda #0 .2 and #$7F sta (pData) beq CS.RUN Empty line + ldy #1 + lda (pData),y + cmp #'#' Comment + beq CS.RUN + + jsr History.Add >LDYA pData >SYSCALL SYS.NewPStrYA bcs .99 - ldy #hCMDLINE + ldy #hCmdLine sta (pData),y - jsr HISTORY.ADD jsr EXEC.CMD bcc .3 @@ -127,10 +129,10 @@ CS.RUN lda #0 jsr COUT jsr CROUT -.3 ldy #hCMDLINE +.3 ldy #hCmdLine lda (pData),y >SYSCALL SYS.FreeMemA - ldy #hCMDLINE + ldy #hCmdLine lda #0 sta (pData),y @@ -238,371 +240,14 @@ CS.EVENT.CTRL.CHAR clc rts *-------------------------------------- -CS.QUIT lda hCmdHistory - beq .1 - >SYSCALL SYS.FreeMemA - -.1 lda hLIBSTR +CS.QUIT jsr History.Quit + lda hLIBSTR >SYSCALL SYS.UnloadLibA clc rts *-------------------------------------- * PRIVATE *-------------------------------------- -EXEC.CMD ldy #hCMDLINE - >PUSHB (pData),y - >PUSHBI $20 Push SEP=' ' - >PUSHBI 0 Push 0 for getting CMD & ARGS - >SYSCALL SYS.PStrGetTkn - bcs .99 - - ldy #hCMD - sta (pData),y - pha - txa - ldy #hARGS - sta (pData),y - pla - - >SYSCALL SYS.GetMemPtrA - >PUSHYA - >PUSHYA - - >LIBCALL hLIBSTR,LIBSTR.UCASEP - >PUSHW L.CMDS - >SYSCALL SYS.GetPStrIndex - bcs .1 Not An internal command - jsr EXEC.CMD.INT - bcs .98 - jsr .98 - clc - rts - -.1 jsr .98 Discard CMD & ARGS - ldy #hCMDLINE - lda (pData),y - >SYSCALL SYS.ExecProcessA - rts - -.98 pha - ldy #hCMD - lda (pData),y - >SYSCALL SYS.FreeMemA - ldy #hARGS - lda (pData),y - >SYSCALL SYS.FreeMemA - pla - sec -.99 rts -*-------------------------------------- -EXEC.CMD.INT asl - tax - jmp (T.INTCMDS,x) -*-------------------------------------- -EXEC.CMD.CD ldy #hARGS - lda (pData),y - bne EXEC.CMD.CD.C - ldy #S.PS.hPREFIX - lda (pPs),y - >SYSCALL SYS.GetMemPtrA - >PUSHYA - >LIBCALL hLIBSTR,LIBSTR.PRINTP - jsr CROUT - clc - rts - -EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR2 - ldy #S.PS.hPREFIX - lda (pPs),y - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 - >PUSHWI MLI.MAXPATH+1 Get a buffer for new PATH - >PUSHBI 0 no particular Option - >SYSCALL SYS.GetMem - bcs .99 - >STYA ZPPTR3 - stx hNEWPATH - - lda #0 - sta (ZPPTR3) - ldy #1 - lda (ZPPTR2),y - cmp #'/' Full Path? - beq .3 - cmp #'.' ".." ? - bne .2 - lda (ZPPTR2) - cmp #2 - bne .97 - iny - lda (ZPPTR2),y - cmp #'.' - bne .97 - lda (ZPPTR1) - tay -.1 dey - beq .97 - lda (ZPPTR1),y - cmp #'/' - bne .1 - tya - sta (ZPPTR3) -.11 lda (ZPPTR1),y - sta (ZPPTR3),y - dey - bne .11 - bra .4 -.97 lda #SYSMGR.ERRSYN -.98 pha - lda hNEWPATH - >SYSCALL SYS.FreeMemA - pla - sec -.99 rts - -.2 >PUSHW ZPPTR1 - >PUSHW ZPPTR3 - >LIBCALL hLIBSTR,LIBSTR.STRCPYP -.3 >PUSHW ZPPTR2 - >PUSHW ZPPTR3 - >LIBCALL hLIBSTR,LIBSTR.STRCATP - lda (ZPPTR3) - tay - lda #'/' Ending with '/'? - cmp (ZPPTR3),y - beq .4 - iny - sta (ZPPTR3),y - tya - sta (ZPPTR3) -.4 lda hNEWPATH - >SYSCALL SYS.CheckPrefixA - bcs .98 - ldy #S.PS.hPREFIX - lda (pPs),y - pha - lda hNEWPATH - sta (pPs),y - pla - >SYSCALL SYS.FreeMemA - clc - rts -*-------------------------------------- -EXEC.CMD.SET ldy #hARGS - lda (pData),y - bne .2 - - ldy #S.PS.hENV - lda (pPs),y - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 - -.1 lda (ZPPTR1) - beq .8 Ending 0 ? - >PUSHW ZPPTR1 - >LIBCALL hLIBSTR,LIBSTR.PRINTP - jsr CROUT - - lda ZPPTR1 - sec - adc (ZPPTR1) Add len+1 to PTR - sta ZPPTR1 - bcc .1 - inc ZPPTR1 - bra .1 - -.2 sec - rts - -.8 clc - rts -*-------------------------------------- -EXEC.CMD.DATE >SYSCALL SYS.MLIGetTime - bcs .9 - >PUSHW DATELO - >LIBCALL hLIBSTR,LIBSTR.PRINTDATE - jsr CROUT - clc -.9 rts -*-------------------------------------- -EXEC.CMD.TIME >SYSCALL SYS.MLIGetTime - bcs .9 - >PUSHW TIMELO - >LIBCALL hLIBSTR,LIBSTR.PRINTTIME - jsr CROUT - clc -.9 rts -*-------------------------------------- -EXEC.CMD.ECHO ldy #hARGS - lda (pData),y - beq .98 - >SYSCALL SYS.ExpandPStrA - bcs .99 - - pha - >SYSCALL SYS.GetMemPtrA - >PUSHYA - >LIBCALL hLIBSTR,LIBSTR.PRINTP - jsr CROUT - pla - >SYSCALL SYS.FreeMemA - clc - rts - -.98 lda #SYSMGR.ERRSYN - sec -.99 rts -*-------------------------------------- -EXEC.CMD.TYPE ldy #hARGS - lda (pData),y - beq .98 - >SYSCALL SYS.LoadFileA - bcs .99 - - >STYA ZPPTR2 store file len - phx - txa - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 -.1 lda ZPPTR2 - bne .2 - lda ZPPTR2+1 - beq .3 - dec ZPPTR2+1 -.2 dec ZPPTR2 - - lda (ZPPTR1) - jsr COUT - inc ZPPTR1 - bne .1 - inc ZPPTR1+1 - bra .1 - -.3 pla - >SYSCALL SYS.FreeMemA - clc - rts - -.98 lda #SYSMGR.ERRSYN - sec -.99 rts -*-------------------------------------- -EXEC.CMD.EXIT ldy #bEXIT - lda #$FF - sta (pData),y - clc - rts -*-------------------------------------- -HISTORY.ADD lda hCmdHistory - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 - -.10 lda CmdHistory.END ending 0 - inc keep room for new ending 0 - sec add len+1 - adc (pData) CmdBuffer - bcc .2 enough room - - lda (ZPPTR1) get len of oldest string - sec - adc ZPPTR1 - sta ZPPTR2 - lda ZPPTR1+1 - adc #0 - sta ZPPTR2+1 - - ldy #$FF - -.1 iny - lda (ZPPTR2),y move back until 0 found - sta (ZPPTR1),y - bne .1 - - sty CmdHistory.END mark new end of history - bra .10 retry.... - -.2 ldy CmdHistory.END - lda (pData) - tax - lda pData - sta ZPPTR2 - lda pData+1 - sta ZPPTR2+1 - -.3 lda (ZPPTR2) - sta (ZPPTR1),y - inc ZPPTR2 - bne .4 - inc ZPPTR2+1 -.4 iny - dex - bpl .3 - - lda #0 - sta (ZPPTR1),y set ending 0 - sty CmdHistory.IDX - sty CmdHistory.END -.9 rts -*-------------------------------------- -HISTORY.GETPREV lda CmdHistory.END - beq HISTORY.RTS empty history,nothing to do - lda CmdHistory.IDX - beq HISTORY.RTS already oldest,nothing to do - - lda hCmdHistory - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 - - lda #0 -.1 tay save current index - sec - adc (ZPPTR1),y - cmp CmdHistory.IDX - bne .1 not yet reached current index - sty CmdHistory.IDX set new index - bra HISTORY.SETBUF -HISTORY.RTS rts -*-------------------------------------- -HISTORY.GETNEXT ldx CmdHistory.END - beq HISTORY.RTS empty history,nothing to do - cpx CmdHistory.IDX - beq HISTORY.RTS - - lda hCmdHistory - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 - - ldy CmdHistory.IDX - lda (ZPPTR1),y - sec - adc CmdHistory.IDX - cmp CmdHistory.END - sta CmdHistory.IDX - beq CmdBuffer.CLR end of history, just blank buffer -*-------------------------------------- -HISTORY.SETBUF jsr CmdBuffer.CLR - - lda pData - sta ZPPTR2 - lda pData+1 - sta ZPPTR2+1 - - ldy CmdHistory.IDX - lda (ZPPTR1),y - tax - -.1 lda (ZPPTR1),y - sta (ZPPTR2) - - inc ZPPTR2 - bne .2 - inc ZPPTR2+1 - -.2 iny - dex - bpl .1 -*-------------------------------------- CmdBuffer.PRINT ldy #0 .1 iny lda (pData),y @@ -615,7 +260,7 @@ CmdBuffer.PRINT ldy #0 *-------------------------------------- CmdBuffer.CLR jsr CmdBuffer.DEL bne CmdBuffer.CLR -.9 rts + rts *-------------------------------------- CmdBuffer.DEL lda (pData) beq .9 @@ -654,17 +299,21 @@ COUT phx plx rts pDevJmp jmp (pDev) +*-------------------------------------- + .INB SBIN/SHELL.S.CMD + .INB SBIN/SHELL.S.HIS *-------------------------------------- CS.END *-------------------------------------- +ENV.PATH >PSTRING "PATH" CMDS >PSTRING "CD" -CMDS1 >PSTRING "SET" -CMDS2 >PSTRING "DATE" -CMDS3 >PSTRING "TIME" -CMDS4 >PSTRING "ECHO" -CMDS5 >PSTRING "TYPE" -CMDS6 >PSTRING "EXIT" - .DA #0 + >PSTRING "SET" + >PSTRING "DATE" + >PSTRING "TIME" + >PSTRING "ECHO" + >PSTRING "TYPE" + >PSTRING "EXIT" + .HS 00 *-------------------------------------- LIBSTR >PSTRING "libstr.o" MSG.GREETINGS >CSTRING "\nA2osX-Shell on Dev=(%h:%h),PS=%h\n\n" @@ -672,18 +321,23 @@ MSG.UNKNOWN >CSTRING "Command Not Found\n" MSG.SYNERR >CSTRING "Syntax Error Or Invalid Pathname\n" hLIBSTR .BS 1 hNEWPATH .BS 1 +hExecCmd .BS 1 +hExecArgs .BS 1 +hEnvPath .BS 1 +hFullCmd .BS 1 +hVarName .BS 1 +hVarValue .BS 1 +ExecCmdIdx .BS 1 *-------------------------------------- .DUMMY .OR 0 DS.START CmdBuffer .BS CmdBuffer.MAX+1 bEXIT .BS 1 -hCMDLINE .BS 1 -hCMD .BS 1 -hARGS .BS 1 +hCmdLine .BS 1 hCmdHistory .BS 1 -CmdHistory.IDX .BS 1 -CmdHistory.END .BS 1 +CmdHistory.IDX .BS 1 +CmdHistory.END .BS 1 DS.END .ED *-------------------------------------- diff --git a/SBIN/TCPIP.S.txt b/SBIN/TCPIP.S.txt index 483f0b8e..5bce549a 100644 --- a/SBIN/TCPIP.S.txt +++ b/SBIN/TCPIP.S.txt @@ -252,11 +252,11 @@ CS.QUIT lda hDev >SYSCALL SYS.GetDevByIDA >STYA pDev - ldx #DEVMGR.OPEN + ldx #DEVMGR.CLOSE jsr pDevJmp lda hLIBTCPIP - >SYSCALL SYS.FreeMemA + >SYSCALL SYS.UnloadLibA clc rts *-------------------------------------- @@ -399,7 +399,11 @@ DNSListener ldy #S.DNS.F+1 and /S.DNS.F.QR beq .9 - ldy #S.DNS.QDCOUNT + ldy #S.DNS.ANCOUNT+1 + lda (ZPFrameBase1),y + beq .9 + + ldy #S.DNS.QDCOUNT+1 lda (ZPFrameBase1),y tax beq .3 no QUERY to skip @@ -417,22 +421,9 @@ DNSListener ldy #S.DNS.F+1 dex skip another QUERY ? bne .1 -.3 lda (ZPFrameBase1),y get offset of NAME - phy save current offset in frame - tay +.3 iny skip high byte of offset + iny skip lo byte of offset - ldx #0 -.4 lda (ZPFrameBase1),y compute len of NAME - beq .5 - inx - iny - bne .4 - -.5 inx X=length of NAME - - ply get back offset in frame - - >STYA ZPQuickPtr1 clc rts diff --git a/SBIN/TELNETD.S.txt b/SBIN/TELNETD.S.txt index 1317abbf..9a156ab2 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -6,44 +6,81 @@ AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SBIN/TELNETD + .TF /A2OSX.BOOT/SBIN/TELNETD *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I - .INB INC/MONITOR.I + .INB INC/A2OSX.API.I + .INB INC/KERNEL.I + .INB INC/LIBTCPIP.I *-------------------------------------- -* 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) -.1 .DA CS.INIT - .DA CS.RUN - .DA CS.EVENT - .DA CS.QUIT + .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 Data Segemnt to Allocate + .DA 0 + .DA 0 + .DA 0 *-------------------------------------- -CS.INIT clc +* Relocation Table +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIBTCPIP .DA LIBTCPIP + .DA 0 +*-------------------------------------- +CS.INIT >LDYA L.LIBTCPIP + >LOADLIBYA + bcs .99 + + sta hLIBTCPIP + + >PUSHWI S.IP.PROTOCOL.TCP + >PUSHWI TCP.PORT.TELNETS + >LIBCALL hLIBTCPIP,LIBTCPIP.CreateSocket + bcs .99 + sta hSrvSocket + + clc +.99 rts +*-------------------------------------- +CS.RUN lda hSrvSocket + >LIBCALL hLIBTCPIP,LIBTCPIP.ListenSocket + bcs .8 + + >LIBCALL hLIBTCPIP,LIBTCPIP.CreateDevice + bcs * + + + +.8 clc rts *-------------------------------------- -CS.RUN clc +CS.DOEVENT clc rts *-------------------------------------- -CS.EVENT clc - rts -*-------------------------------------- -CS.QUIT clc +CS.QUIT >PUSHB hSrvSocket + >LIBCALL hLIBTCPIP,LIBTCPIP.DestroySocket + + + lda hLIBTCPIP + >SYSCALL SYS.UnloadLibA + clc rts *-------------------------------------- CS.END +*-------------------------------------- +LIBTCPIP >PSTRING "libtcpip.o" +hLIBTCPIP .BS 1 +hSrvSocket .BS 1 +*-------------------------------------- + MAN SAVE SBIN/TELNETD.S ASM diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 1860805c..0a3b1a0a 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -10,15 +10,15 @@ DevMgr.HiMem .EQ $FFFE Protect IRQ vector in Aux LC *-------------------------------------- * S.DevMgrInit *-------------------------------------- -S.DevMgrInit ldx #S.DEV.SIZE*2 +S.DevMgrInit ldx #S.DEV.SIZE*DevMgr.Count .1 lda DevMgr.NUL-1,x sta DevMgr.Table-1,x dex bne .1 - stz DevMgr.Table+S.DEV.SIZE*2+1 + stz DevMgr.Table+S.DEV.SIZE*DevMgr.Count+1 - lda #1 reserve #0=NUL, #1=KBD + lda #DevMgr.Count-1 sta DevMgr.LastDevID >LDYAI DevMgr.End @@ -146,45 +146,7 @@ S.GetDevEvent >LDYAI DevMgr.Table sta (pEvent),y rts *-------------------------------------- -DevMgr.Free .BS 2 -DevMgr.DevID .BS 1 -DevMgr.LastDevID .BS 1 -*-------------------------------------- -DevMgr.NUL cld - jmp (DevMgr.NUL.Code,x) - .DA #S.DEV.F.INUSE+S.DEV.F.SHARE+S.DEV.F.COUT+S.DEV.F.CHAR - >PSTRING "NUL" NAME - .HS 00 NAME must Be 5 bytes long - .HS 00.00 - .HS 00.00.00.00 -*-------------------------------------- -DevMgr.KBD cld - jmp (DevMgr.KBD.Code,x) - .DA #S.DEV.F.INUSE+S.DEV.F.EVENT+S.DEV.F.CHAR - >PSTRING "KBD" NAME - .HS 00 NAME must Be 5 bytes long - .HS 00.00 - .HS 00.00.00.00 -*-------------------------------------- -DevMgr.NUL.Code .DA .8 OPEN - .DA .8 GETEVENT - .DA .8 COUT - .DA .8 CLOSE - .DA .8 GETINFO - .DA .8 IRQ -.8 clc - rts -*-------------------------------------- -DevMgr.KBD.Code .DA .8 OPEN - .DA DevMgr.KBD.GETEVENT - .DA .8 COUT - .DA .8 CLOSE - .DA .8 GETINFO - .DA .8 IRQ -.8 clc - rts -*-------------------------------------- -DevMgr.KBD.GETEVENT +S.GetKeyboardEvent lda KBD bpl .9 @@ -212,6 +174,46 @@ DevMgr.KBD.GETEVENT sec no event rts *-------------------------------------- +DevMgr.Free .BS 2 +DevMgr.DevID .BS 1 +DevMgr.LastDevID .BS 1 +*-------------------------------------- +DevMgr.Count .EQ 2 +*-------------------------------------- +DevMgr.NUL cld + jmp (DevMgr.NUL.Code,x) + .DA #S.DEV.F.INUSE+S.DEV.F.SHARE+S.DEV.F.COUT+S.DEV.F.CHAR + >PSTRING "NUL" NAME + .HS 00 NAME must Be 5 bytes long + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +DevMgr.SYS cld + jmp (DevMgr.SYS.Code,x) + .DA #S.DEV.F.INUSE+S.DEV.F.CHAR + >PSTRING "SYS" NAME + .HS 00 NAME must Be 5 bytes long + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +DevMgr.NUL.Code .DA .8 OPEN + .DA .8 GETEVENT + .DA .8 COUT + .DA .8 CLOSE + .DA .8 GETINFO + .DA .8 IRQ +.8 clc + rts +*-------------------------------------- +DevMgr.SYS.Code .DA .8 OPEN + .DA .8 GETEVENT + .DA .8 COUT + .DA .8 CLOSE + .DA .8 GETINFO + .DA .8 IRQ +.8 clc + rts +*-------------------------------------- DevMgr.End .EQ * MAN SAVE SYS/KERNEL.S.DEV diff --git a/SYS/KERNEL.S.DRV.txt b/SYS/KERNEL.S.DRV.txt index 5e211f63..402fa0ca 100644 --- a/SYS/KERNEL.S.DRV.txt +++ b/SYS/KERNEL.S.DRV.txt @@ -24,24 +24,11 @@ S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn .1 sta LoadDrv.Cmd stx LoadDrv.Args - >PUSHA push CMD for S.FileSearch - - >PUSHWI ENV.DRV push ENVNAME=DRV - ldy #S.PS.hENV - lda TskMgr.Table,y Get PS #0 Env - >PUSHA - jsr S.GetEnvVarP get value for ENV=%DRV% - bcs .98 - - sta LoadDrv.Path - >PUSHA A=PStr to Value - jsr S.FileSearch find File in %DRV% - bcs .97 not Found - - sta LoadDrv.FullName + pha jsr S.SysScrPPSTRA - - lda LoadDrv.FullName + pla + jsr S.ExpandPStrA + sta LoadDrv.ExpCmd jsr S.LoadBinA bcs .96 @@ -71,12 +58,7 @@ S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn pla .96 pha - lda LoadDrv.FullName - jsr S.FreeMemA - pla - -.97 pha - lda LoadDrv.Path + lda LoadDrv.ExpCmd jsr S.FreeMemA pla @@ -91,11 +73,10 @@ S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn rts *-------------------------------------- MSG.DRVLOAD >PSTRING "\nLoadDrv:" -LoadDrv.Cmd .BS 1 -LoadDrv.Args .BS 1 -LoadDrv.Path .BS 1 -LoadDrv.FullName .BS 1 -LoadDrv.hMem .BS 1 +LoadDrv.Cmd .BS 1 +LoadDrv.Args .BS 1 +LoadDrv.ExpCmd .BS 1 +LoadDrv.hMem .BS 1 *-------------------------------------- * pCode = .DRV File Loaded Address *-------------------------------------- diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 2bb12b23..364a70be 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -306,28 +306,6 @@ S.SetEnvVar plp *-------------------------------------- * PRIVATE *-------------------------------------- -S.SetSysEnvA >PUSHA Push Cmd Line - >PUSHBI $3D Push SEP='=' - >PUSHBI 0 Push Token IDX - jsr S.PStrGetTkn - bcs * - phx save X,A for discard - pha - pha - txa - >PUSHA - pla - >PUSHA - ldy #S.PS.hENV - lda TSKMGR.TABLE,y - >PUSHA - jsr S.SetEnvVarH - - pla disard NAME - jsr S.FreeMemA - pla discard VALUE - jmp S.FreeMemA -*-------------------------------------- * S.SelectEnvH * In: * PULLB = hENV @@ -392,24 +370,6 @@ S.SelectEnv .9 sec rts *-------------------------------------- -S.PrintSysEnv ldy #S.PS.hENV - lda TskMgr.Table,y Get PS #0 ENV - jsr S.GetMemPtrA - >STYA R.AX -.1 lda (R.AX) - beq .8 Ending 0 ? - >LDYA R.AX - jsr S.SysScrPPSTRYA - jsr S.SysScrCROUT - lda R.AL - sec - adc (R.AX) Add len+1 to PTR - sta R.AL - bcc .1 - inc R.AH - bra .1 -.8 rts -*-------------------------------------- MAN SAVE SYS/KERNEL.S.ENV LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.EXE.txt b/SYS/KERNEL.S.EXE.txt new file mode 100644 index 00000000..12bfac21 --- /dev/null +++ b/SYS/KERNEL.S.EXE.txt @@ -0,0 +1,199 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.ExecFileA (R) +* in : +* A = hMem of FilePath (PSTRING) +* out : +* +*-------------------------------------- +S.ExecFileA jsr S.LoadFileA + bcc S.ExecFileAOK + rts + +S.ExecFileAOK >STYA S.ExecFileA.DataLen + stx S.ExecFileA.hData + txa + jsr S.GetMemPtrA + >STYA S.ExecFileA.DataPtr + +.1 stz TmpBuffer256 + +.2 >LDYA S.ExecFileA.DataPtr + >STYA ZPQuickPtr1 + + inc S.ExecFileA.DataPtr + bne .21 + inc S.ExecFileA.DataPtr+1 + +.21 lda S.ExecFileA.DataLen + bne .22 + dec S.ExecFileA.DataLen+1 +.22 dec S.ExecFileA.DataLen + + lda (ZPQuickPtr1) + cmp #$0D + beq .3 + inc TmpBuffer256 + ldx TmpBuffer256 + sta TmpBuffer256,x + + lda S.ExecFileA.DataLen + bne .2 + lda S.ExecFileA.DataLen+1 + bne .2 + +.3 lda TmpBuffer256 + beq .4 + lda TmpBuffer256+1 + cmp #'*' + beq .4 + lda #'-' + jsr S.SysScrCOUTA + lda #'>' + jsr S.SysScrCOUTA + >LDYAI TmpBuffer256 + jsr S.SysScrPPSTRYA + >LDYAI TmpBuffer256 + jsr S.NewPStrYA + bcs .99 + + pha + jsr S.ExecCmdLineA + jsr S.SysScrPRCode + pla + jsr S.FreeMemA + +.4 lda S.ExecFileA.DataLen + bne .1 + lda S.ExecFileA.DataLen+1 + bne .1 + + jsr .99 + clc + rts + +.99 lda S.ExecFileA.hData + jsr S.FreeMemA + sec + rts +*-------------------------------------- +S.ExecCmdLineA >PUSHA Push Cmd Line + >PUSHBI $20 Push SEP=' ' + >PUSHBI 0 Push Token IDX + jsr S.PStrGetTkn + bcs .99 + + sta S.ExecFileA.hCMD + stx S.ExecFileA.hARGS + jsr S.GetMemPtrA + >PUSHYA + >PUSHWI EXECCMDS + jsr S.GetPStrIndex + bcs .98 + + asl + tax + lda S.ExecFileA.hARGS + jsr S.ExecCmdLine + bcs .98 + + jsr .98 + clc + rts + +.98 pha + lda S.ExecFileA.hARGS + jsr S.FreeMemA + lda S.ExecFileA.hCMD + jsr S.FreeMemA + pla +.99 sec + rts +*-------------------------------------- +S.ExecFileA.hData .BS 1 +S.ExecFileA.DataLen .BS 2 +S.ExecFileA.DataPtr .BS 2 +S.ExecFileA.hCMD .BS 1 +S.ExecFileA.hARGS .BS 1 +*-------------------------------------- +EXECCMDS .HS .03 + .AS "SET" + .HS 04 + .AS "LOAD" + .HS 04 + .AS "EXEC" + .DA #0 +*-------------------------------------- +S.ExecCmdLine jmp (.1,x) +.1 .DA S.SetSysEnvA + .DA S.LoadDrvA VCPU!!!! + .DA S.CreateProcessA VCPU!!!! +*-------------------------------------- +* S.GetPStrIndex +* in : +* PULLW = String Table (Array Of PSTR) +* PULLW = String To Search (PSTR) +* out : +* CC: A = String Index In Table +*-------------------------------------- +S.GetPStrIndex >PULLW ZPQuickPtr1 + >PULLW ZPQuickPtr2 + ldx #0 +.1 lda (ZPQuickPtr1) + beq .99 + cmp (ZPQuickPtr2) + bne .3 + tay +.2 lda (ZPQuickPtr1),y + eor (ZPQuickPtr2),y + and #$7F + bne .3 + dey + bne .2 + txa + clc + rts +.3 inx + lda (ZPQuickPtr1) + sec + adc ZPQuickPtr1 + sta ZPQuickPtr1 + bcc .1 + inc ZPQuickPtr1+1 + bra .1 +.99 lda #SYSMGR.ERRSYN + sec + rts +*-------------------------------------- +S.SetSysEnvA >PUSHA Push Cmd Line + >PUSHBI $3D Push SEP='=' + >PUSHBI 0 Push Token IDX + jsr S.PStrGetTkn + bcs * + phx save X,A for discard + pha + pha + txa + >PUSHA + pla + >PUSHA + ldy #S.PS.hENV + lda TSKMGR.TABLE,y + >PUSHA + jsr S.SetEnvVarH + + pla disard NAME + jsr S.FreeMemA + pla discard VALUE + jmp S.FreeMemA +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.EXE +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index 075b300d..46c77e87 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -339,42 +339,6 @@ S.PStrGetTkn >PULLA Get IDX .99 sec rts *-------------------------------------- -* S.GetPStrIndex -* in : -* PULLW = String Table (Array Of PSTR) -* PULLW = String To Search (PSTR) -* out : -* CC: A = String Index In Table -*-------------------------------------- -S.GetPStrIndex >PULLW ZPQuickPtr1 - >PULLW ZPQuickPtr2 - ldx #0 -.1 lda (ZPQuickPtr1) - beq .99 - cmp (ZPQuickPtr2) - bne .3 - tay -.2 lda (ZPQuickPtr1),y - eor (ZPQuickPtr2),y - and #$7F - bne .3 - dey - bne .2 - txa - clc - rts -.3 inx - lda (ZPQuickPtr1) - sec - adc ZPQuickPtr1 - sta ZPQuickPtr1 - bcc .1 - inc ZPQuickPtr1+1 - bra .1 -.99 lda #SYSMGR.ERRSYN - sec - rts -*-------------------------------------- MAN SAVE SYS/KERNEL.S.STR LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.TSK.txt b/SYS/KERNEL.S.TSK.txt index e6ef2350..48a68b08 100644 --- a/SYS/KERNEL.S.TSK.txt +++ b/SYS/KERNEL.S.TSK.txt @@ -206,7 +206,11 @@ S.TskMgrQuit clc * out : * A = Child PSID *-------------------------------------- -S.ExecProcessA jsr S.CreateProcessA +S.ExecProcessNewEnvA + ldy #S.PS.F.ENV + bra S.ExecProcess +S.ExecProcessA ldy #0 +S.ExecProcess jsr S.CreateProcess bcs .9 terminated, do not set PID as HOLD ldy #S.PS.CID @@ -226,7 +230,12 @@ S.ExecProcessA jsr S.CreateProcessA * out : * A = Child PSID *-------------------------------------- +S.CreateProcessNewEnvA + ldy #S.PS.F.ENV + bra S.CreateProcess S.CreateProcessA + ldy #0 +S.CreateProcess sty S.CreateChildProcess.Flags sta S.CreateProcessA.Cmd >LDYAI MSG.NEWPS jsr S.SysScrPPSTRYA @@ -353,6 +362,7 @@ S.CreateChildProcess .30 inc TSKMGR.SIZE .3 lda #S.PS.F.INUSE + ora S.CreateChildProcess.Flags sta (R.AX) .4 inc TSKMGR.LASTID Get a PSID not alredy running @@ -371,6 +381,10 @@ S.CreateChildProcess iny cpy #S.PS.SIZE bne .5 + + lda S.CreateChildProcess.Flags + and #S.PS.F.ENV need to create ENV & Prefix ? + beq .6 ldy #S.PS.hPREFIX copy hPREFIX... lda (pPs),y @@ -387,8 +401,17 @@ S.CreateChildProcess ldy #S.PS.hENV sta (R.AX),y + bra .8 - ldy #S.PS.hINDEV +.6 ldy #S.PS.hPREFIX reuse same hPREFIX... + lda (pPs),y + sta (R.AX),y + + ldy #S.PS.hENV ...and hENV from parent PS + lda (pPs),y + sta (R.AX),y + +.8 ldy #S.PS.hINDEV lda (pPs),y sta (R.AX),y ldy #S.PS.hOUTDEV @@ -404,52 +427,72 @@ S.CreateChildProcess ldy #S.PS.PID sta (R.AX),y - ldy #S.PS.ID - lda (R.AX),y + lda TSKMGR.LASTID clc Exit with A=PSID rts .99 sec rts *-------------------------------------- +S.CreateChildProcess.Flags + .BS 1 +*-------------------------------------- * S.InitProcessA * In : * A = hMem To Full Cmd Line *-------------------------------------- -S.InitProcessA >PUSHA Push Cmd Line +S.InitProcessA stz S.InitProcessA.hPath + stz S.InitProcessA.hFullPath + >PUSHA Push Cmd Line >PUSHBI $20 Push SEP=' ' >PUSHBI 0 Push 0 for getting CMD And ARGS jsr S.PStrGetTkn bcc .10 - rts OOM error +.99 rts OOM error -.10 ldy #S.PS.hCMD - sta (pPs),y - >PUSHA push CMD for S.FileSearch +.10 sta S.InitProcessA.hCmd + pha txa ldy #S.PS.hARGS sta (pPs),y set ARGS hMem (0 if none) - >PUSHWI ENV.PATH push ENVNAME=PATH + pla + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + cmp #'/' + bne .20 + + lda S.InitProcessA.hCmd + bra .30 + +.20 >PUSHWI ENV.PATH push ENVNAME=PATH ldy #S.PS.hENV lda (pPs),y >PUSHA jsr S.GetEnvVarP get value for ENV=PATH bcs .99 - sta S.InitProcessA.PATH save VALUE hMem for discard + sta S.InitProcessA.hPath save VALUE hMem for discard + pha + lda S.InitProcessA.hCmd + >PUSHA push CMD for S.FileSearch + pla >PUSHA A=PStr to ENV Value jsr S.FileSearch find File in %PATH% - bcs .98 + bcs S.InitProcessA.ClnUp - sta S.InitProcessA.FULLPATH save FULLPATH hMem for discard + sta S.InitProcessA.hFullPath save FULLPATH hMem for discard + +.30 jsr S.PStrCpyA + ldy #S.PS.hCMD + sta (pPs),y pha jsr S.SysScrPPSTRA pla jsr S.LoadBinA A = BinPath hMem - - bcs .97 + bcs S.InitProcessA.ClnUp >STYA pCode save PTR to Code Segment txa @@ -468,7 +511,7 @@ S.InitProcessA >PUSHA Push Cmd Line >PUSHAX Push DS.SIZE >PUSHBI S.MEM.F.INIT0 Clear DS jsr S.GetMem - bcs .97 + bcs S.InitProcessA.ClnUp >STYA pData txa @@ -477,25 +520,25 @@ S.InitProcessA >PUSHA Push Cmd Line .1 ldx #TSKMGR.INIT jsr pCodeJmp Call INIT function - bcs .97 - jsr .97 - clc - rts -.97 pha save ERR - lda S.InitProcessA.FULLPATH +S.InitProcessA.ClnUp + php save Carry + pha save ERR + lda S.InitProcessA.hFullPath + beq .1 jsr S.FreeMemA - pla -.98 pha save ERR - lda S.InitProcessA.PATH +.1 lda S.InitProcessA.hPath + beq .2 jsr S.FreeMemA - pla - -.99 sec + +.2 pla + plp rts -S.InitProcessA.PATH .BS 1 -S.InitProcessA.FULLPATH .BS 1 +*-------------------------------------- +S.InitProcessA.hCmd .BS 1 +S.InitProcessA.hPath .BS 1 +S.InitProcessA.hFullPath .BS 1 *-------------------------------------- * S.SelectProcessA * In : A=PSID @@ -544,6 +587,10 @@ S.FreeProcessA jsr S.GetPSByIDA beq .2 jsr S.FreeMemA + + lda (ZPQuickPtr1) get S.PS.F + and #S.PS.F.ENV do we have to dscard duplicated env & prefix ? + beq .4 .2 ldy #S.PS.hENV lda (ZPQuickPtr1),y diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 90bd8056..c94bd752 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -35,7 +35,7 @@ KERNEL jmp S.KernelInit KERNEL.COLDBOOT .DA S.PStrCmp .DA S.PStrGetTkn - .DA S.GetPStrIndex + .DA 0 .DA 0 .DA 0 *-------------------------------------- @@ -104,15 +104,15 @@ KERNEL jmp S.KernelInit KERNEL.COLDBOOT .DA S.GetDevByNameYA .DA 0 - .DA 0 + .DA S.GetKeyboardEvent .DA 0 .DA 0 .DA 0 *-------------------------------------- - .DA S.ExecProcessA $90 + .DA S.ExecProcessNewEnvA $90 + .DA S.ExecProcessA + .DA S.CreateProcessNewEnvA .DA S.CreateProcessA - .DA 0 - .DA 0 .DA S.GetPSByIDA .DA 0 @@ -288,140 +288,28 @@ S.KernelRun jsr S.TskMgrRun jsr S.DestroyEvent jmp S.KernelRun *-------------------------------------- -S.KernelQuit bra * -*-------------------------------------- -* PUBLIC -*-------------------------------------- -* S.ExecFileA (R) -* in : -* A = hMem of FilePath (PSTRING) -* out : -* -*-------------------------------------- -S.ExecFileA jsr S.LoadFileA - bcc S.ExecFileAOK - rts - -S.ExecFileAOK >STYA S.ExecFileA.DataLen - stx S.ExecFileA.hData - txa +S.PrintSysEnv ldy #S.PS.hENV + lda TskMgr.Table,y Get PS #0 ENV jsr S.GetMemPtrA - >STYA S.ExecFileA.DataPtr - -.1 stz TmpBuffer256 - -.2 >LDYA S.ExecFileA.DataPtr - >STYA ZPQuickPtr1 - - inc S.ExecFileA.DataPtr - bne .21 - inc S.ExecFileA.DataPtr+1 - -.21 lda S.ExecFileA.DataLen - bne .22 - dec S.ExecFileA.DataLen+1 -.22 dec S.ExecFileA.DataLen - - lda (ZPQuickPtr1) - cmp #$0D - beq .3 - inc TmpBuffer256 - ldx TmpBuffer256 - sta TmpBuffer256,x - - lda S.ExecFileA.DataLen - bne .2 - lda S.ExecFileA.DataLen+1 - bne .2 - -.3 lda TmpBuffer256 - beq .4 - lda TmpBuffer256+1 - cmp #'*' - beq .4 - lda #'-' - jsr S.SysScrCOUTA - lda #'>' - jsr S.SysScrCOUTA - >LDYAI TmpBuffer256 - jsr S.SysScrPPSTRYA - >LDYAI TmpBuffer256 - jsr S.NewPStrYA - bcs .99 - - pha - jsr S.ExecCmdLineA - jsr S.SysScrPRCode - pla - jsr S.FreeMemA - -.4 lda S.ExecFileA.DataLen - bne .1 - lda S.ExecFileA.DataLen+1 - bne .1 - - jsr .99 - clc - rts - -.99 lda S.ExecFileA.hData - jsr S.FreeMemA + >STYA R.AX +.1 lda (R.AX) + beq .8 Ending 0 ? + >LDYA R.AX + jsr S.SysScrPPSTRYA + jsr S.SysScrCROUT + lda R.AL sec - rts -*-------------------------------------- -S.ExecCmdLineA >PUSHA Push Cmd Line - >PUSHBI $20 Push SEP=' ' - >PUSHBI 0 Push Token IDX - jsr S.PStrGetTkn - bcs .99 - - sta S.ExecFileA.hCMD - stx S.ExecFileA.hARGS - jsr S.GetMemPtrA - >PUSHYA - >PUSHWI EXECCMDS - jsr S.GetPStrIndex - bcs .98 - - asl - tax - lda S.ExecFileA.hARGS - jsr S.ExecCmdLine - bcs .98 - - jsr .98 - clc - rts - -.98 pha - lda S.ExecFileA.hARGS - jsr S.FreeMemA - lda S.ExecFileA.hCMD - jsr S.FreeMemA - pla -.99 sec - rts -*-------------------------------------- -S.ExecFileA.hData .BS 1 -S.ExecFileA.DataLen .BS 2 -S.ExecFileA.DataPtr .BS 2 -S.ExecFileA.hCMD .BS 1 -S.ExecFileA.hARGS .BS 1 -*-------------------------------------- -S.ExecCmdLine jmp (.1,x) -.1 .DA S.SetSysEnvA - .DA S.LoadDrvA VCPU!!!! - .DA S.CreateProcessA VCPU!!!! + adc (R.AX) Add len+1 to PTR + sta R.AL + bcc .1 + inc R.AH + bra .1 +.8 rts *-------------------------------------- pDevJmp jmp (pDev) pCodeJmp jmp (pCode) pLibJmp jmp (pLib) *-------------------------------------- -EXECCMDS >PSTRING "SET" -EXECCMDS1 >PSTRING "LOAD" -EXECCMDS2 >PSTRING "EXEC" - .DA #0 -*-------------------------------------- MSG.Init >PSTRING "A2osX[Stage2]:Init\n" MSG.Init.MemMgr >PSTRING "->MemMgr Init" MSG.Init.TskMgr >PSTRING "->TskMgr Init" @@ -438,8 +326,6 @@ STARTUP.FILE >PSTRING "A2osX.STARTUP" *-------------------------------------- ENV.A2osX >PSTRING "A2OSX" ENV.PATH >PSTRING "PATH" -ENV.DRV >PSTRING "DRV" -ENV.ETC >PSTRING "ETC" ENV.LIB >PSTRING "LIB" *-------------------------------------- .INB SYS/KERNEL.S.MEM @@ -455,6 +341,7 @@ ENV.LIB >PSTRING "LIB" .INB SYS/KERNEL.S.ENV .INB SYS/KERNEL.S.TSK .INB SYS/KERNEL.S.EVT + .INB SYS/KERNEL.S.EXE *-------------------------------------- .INB SYS/KERNEL.S.DEV *-------------------------------------- diff --git a/_Make_DIR.txt b/_Make_DIR.txt index c4c4f193..23908067 100644 --- a/_Make_DIR.txt +++ b/_Make_DIR.txt @@ -6,6 +6,7 @@ CREATE INC CREATE LIB CREATE SBIN CREATE SYS +CREATE USR PREFIX /A2OSX.SRC CREATE BIN CREATE DRV @@ -13,4 +14,5 @@ CREATE ETC CREATE INC CREATE LIB CREATE SBIN -CREATE SYS \ No newline at end of file +CREATE SYS +CREATE USR diff --git a/_Make_SYS.txt b/_Make_SYS.txt index a59c244d..7d8a9707 100644 --- a/_Make_SYS.txt +++ b/_Make_SYS.txt @@ -4,7 +4,6 @@ NEW INC 1 AUTO 6 PREFIX /A2OSX.BOOT -DELETE A2OSX.SYSTEM BLOAD A BSAVE A2OSX.SYSTEM,TSYS,A$2000,L$1300 -A2OSX.SYSTEM