From 3cf6dd05a6808d0f527b6c89902a03e4585c027f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 17 Aug 2016 08:25:58 +0200 Subject: [PATCH] Kernel version 0.8 (Initial Commit) --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes A2osX.S.GP.txt | 148 ---------- A2osX.S.KM.txt | 153 ---------- A2osX.S.TOOLS.txt | 179 ------------ A2osX.STARTUP.txt | 8 +- BIN/ASM.S.DIR.txt | 2 +- BIN/ASM.S.txt | 2 + BIN/CHTYP.S.txt | 2 - BIN/EDIT.S.CTRL.txt | 2 + BIN/EDIT.S.txt | 51 ++-- BIN/LS.S.txt | 72 +++-- BIN/PING.S.txt | 20 +- BIN/PS.S.txt | 20 +- DRV/UTHERNET.DRV.S.txt | 13 +- INC/A2osX.I.txt | 57 ++-- INC/MACROS.I.txt | 8 - LIB/LIBSTR.S.txt | 6 +- LIB/LIBTCPIP.S.DNS.txt | 2 - SBIN/DESKTOP.S.txt | 124 --------- SBIN/GETTY.S.txt | 38 +-- SBIN/INSDRV.S.txt | 36 ++- SBIN/LOGIN.S.txt | 21 +- SBIN/SHELL.S.CMD.txt | 618 ++++++++++++++++++++--------------------- SBIN/SHELL.S.HIS.txt | 16 +- SBIN/SHELL.S.TXT.txt | 99 +++++++ SBIN/SHELL.S.txt | 251 +++++++---------- SYS/KERNEL.S.ARG.txt | 75 +++++ SYS/KERNEL.S.BIN.txt | 67 ++--- SYS/KERNEL.S.DRV.txt | 110 ++++---- SYS/KERNEL.S.ENV.txt | 550 ++++++++++++++++++------------------ SYS/KERNEL.S.FIO.txt | 180 ++++++------ SYS/KERNEL.S.GP.txt | 3 +- SYS/KERNEL.S.INIT.txt | 35 +-- SYS/KERNEL.S.JMP.txt | 28 +- SYS/KERNEL.S.LIB.txt | 59 ++-- SYS/KERNEL.S.MEM.txt | 8 +- SYS/KERNEL.S.PS.txt | 442 +++++++++++++++++++++++++++++ SYS/KERNEL.S.REL.txt | 255 ++++++++--------- SYS/KERNEL.S.STR.txt | 330 ++++++++++------------ SYS/KERNEL.S.TSK.txt | 395 -------------------------- SYS/KERNEL.S.txt | 50 ++-- 42 files changed, 1978 insertions(+), 2557 deletions(-) delete mode 100644 A2osX.S.GP.txt delete mode 100644 A2osX.S.KM.txt delete mode 100644 A2osX.S.TOOLS.txt create mode 100644 SBIN/SHELL.S.TXT.txt create mode 100644 SYS/KERNEL.S.ARG.txt create mode 100644 SYS/KERNEL.S.PS.txt diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index cb3807df865cd497835533128689995b0727d8e2..eb59351eaaf6fa423b3b08b4e8198049c5f9f448 100644 GIT binary patch delta 17943 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 delta 19155 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≦BD6|3y}fD|bb$%s}C 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 diff --git a/A2osX.S.GP.txt b/A2osX.S.GP.txt deleted file mode 100644 index f3e429fd..00000000 --- a/A2osX.S.GP.txt +++ /dev/null @@ -1,148 +0,0 @@ -PR#3 -PREFIX /A2OSX.BOOT -DELETE A2OSX.SYSTEM -PREFIX /A2OSX.SRC -NEW -INC 1 -AUTO 6 - .LIST OFF -*-------------------------------------- -* **** START OF A2osX Global Page **** -*-------------------------------------- -A2osX.GP.B.start - .PH $BE00 -*-------------------------------------- -* A2osX.SYSCALL (AUXLC to AUXLC) -* In: -* X = SYSfnc.Index -* Y,A = free for Inline param -*-------------------------------------- -A2osX.GP.Start jmp (KERNEL.SYSCALL,x) -*-------------------------------------- -* LIBCALL (AUXLC to AUXLC) -* In: -* Y = LIB.ID -* X = LIBfnc.Index -* A = free for Inline param -*-------------------------------------- - jmp A2osX.LIBCALL1 -*-------------------------------------- -* Kernel.MLICALL (AUXLC to MAINLC) -* In: -* X = MLI Function -* A = Param Count -*-------------------------------------- - jmp A2osX.MLICALL1 -*-------------------------------------- - jmp A2osX.ROMCALL1 - jmp BrkHandler - .BS $BE10-* -*-------------------------------------- - jmp (pDev) pDevJmp - jmp (pCode) pCodeJmp - jmp (pLib) pLibJmp - .BS $BE20-* -*-------------------------------------- -GO.Reset jsr GO.AUXLC - jmp KERNEL.COLDBOOT -*-------------------------------------- -A2osX.LIBCALL1 pha - phx - tya - >SYSCALL SYS.GetMemPtrA - >STYA .1+1 - plx - pla -.1 jmp $FFFF -*-------------------------------------- -A2osX.MLICALL1 jsr GO.MAINLC - stx .1 - sta MLICALL.PARAMS - jsr MLI -.1 .BS 1 - .DA MLICALL.PARAMS - jsr GO.AUXLC - rts -*-------------------------------------- -A2osX.ROMCALL1 plx - stx .1+1 - plx - stx .1+2 - ldx RROMBNK1 - jsr .1 - ldx RRAMWRAMBNK1 - ldx RRAMWRAMBNK1 - rts -.1 jmp $FFFF -*-------------------------------------- -GO.MAINLC php - clc - .HS 2C bit abs - -GO.AUXLC php - sec - sei - - sta A2osX.SaveA - pla keep P in A for later - stx A2osX.SaveX - sty A2osX.SaveY - plx - ply - inx - bne .1 - iny -.1 stx GO.EXIT.JMP+1 - sty GO.EXIT.JMP+2 - - ldx RRAMWRAMBNK1 - ldx RRAMWRAMBNK1 - - ldy pStack - bcs GO.AUXLC1 - -GO.MAINLC1 tsx - stx A2osX.SaveSX - ldx A2osX.SaveSM - txs - stx CLRALTZP - bra GO.EXIT -*-------------------------------------- -GO.AUXLC1 stx SETALTZP - tsx - stx A2osX.SaveSM - ldx A2osX.SaveSX - txs -*-------------------------------------- -GO.EXIT sty pStack - pha push P on stack - ldy A2osX.SaveY - ldx A2osX.SaveX - lda A2osX.SaveA - plp -GO.EXIT.JMP jmp $FFFF -*-------------------------------------- -A2osX.SaveA .BS 1 -A2osX.SaveX .BS 1 -A2osX.SaveY .BS 1 -*-------------------------------------- -BrkHandler sta SETPAGE2 - bra * -*-------------------------------------- -IrqHandler bra * -*-------------------------------------- -A2osX.GP.End .EQ * -*-------------------------------------- -* CONTROL SECTION : -*-------------------------------------- - .DO A2osX.GP.End>$BEBF - ERROR:GP too big - .FIN -*-------------------------------------- - .BS A2osX.GP.START+$100-* - .EP -*-------------------------------------- -MAN -SAVE A2OSX.S.GP -LOAD A2OSX.S -ASM diff --git a/A2osX.S.KM.txt b/A2osX.S.KM.txt deleted file mode 100644 index 6a0b96d4..00000000 --- a/A2osX.S.KM.txt +++ /dev/null @@ -1,153 +0,0 @@ -PR#3 -PREFIX /A2OSX.BOOT -DELETE A2OSX.SYSTEM -PREFIX /A2OSX.SRC -NEW -INC 1 -AUTO 6 - .LIST OFF -*-------------------------------------- -EnumKM.EPB .EQ $0D -EnumKM.EL .EQ $27 -*-------------------------------------- -EnumKM ldx #0 - ldy Boot.Prefix -.1 inx - lda SYS,x - sta Boot.Prefix+1,y - iny - cpx SYS - bne .1 - - sty Boot.Prefix - - jsr MLI - .DA #MLIOPEN - .DA MLIOPEN01 - bcs .99 - - lda MLIOPEN01+5 - sta MLIREAD01+1 - sta MLICLOSE01+1 - -.2 jsr MLI - .DA #MLIREAD - .DA MLIREAD01 - bcs .98 - - lda #EnumKM.EPB - sta EnumKM.EC - >LDYAI A2osX.ReadBuff+4 - >STYA EnumKM.BPTR - -.3 >LDYA EnumKM.BPTR - >STYA TmpPtr1 - lda (TmpPtr1) - and #$F0 Empty ? - beq .5 yes, skip - and #$C0 anything out of type 1,2 or 3 ? - bne .5 yes, skip - lda (TmpPtr1) - and #$0F - cmp KM.PREFIX at least enough chars for KM.*? - bcc .5 no, skip - ldy #$10 file type - lda (TmpPtr1),y - cmp #$06 'BIN'? - bne .5 skip - ldy KM.PREFIX -.4 lda (TmpPtr1),y - cmp KM.PREFIX,y - bne .5 - dey - bne .4 - - jsr LoadKM - -.5 lda EnumKM.BPTR - clc - adc #EnumKM.EL - sta EnumKM.BPTR - bcc .6 - inc EnumKM.BPTR+1 - -.6 dec EnumKM.EC - bne .3 - bra .2 - -.8 jsr MLI - .DA #MLICLOSE - .DA MLICLOSE01 - rts - -.98 cmp #MLI.ERR.EOF - beq .8 - pha - jsr .8 - pla -.99 sec - rts -*-------------------------------------- -EnumKM.EC .BS 1 -EnumKM.BPTR .BS 2 -*-------------------------------------- -LoadKM ldx Boot.Prefix -.1 lda Boot.Prefix,x - sta KM.Filename,x - dex - bne .1 - - ldx Boot.Prefix - lda (TmpPtr1) - and #$0F - tay - clc - adc Boot.Prefix - sta KM.Filename - tax - -.2 lda (TmpPtr1),y - sta KM.Filename,x - dex - dey - bne .2 - - >LDAXI MSG.KMLOAD - jsr PrintCStrAX - >LDAXI KM.Filename - jsr PrintPStrAX - jsr CROUT - - jsr MLI - .DA #MLIOPEN - .DA MLIOPEN02 - bcs .99 - - lda MLIOPEN02+5 - sta MLIREAD02+1 - sta MLICLOSE02+1 - - jsr MLI - .DA #MLIREAD - .DA MLIREAD02 - bcs .98 - jsr .9 - - jsr A2osX.KMLOAD - jsr CROUT - -.98 pha - jsr .9 - pla - sec - rts - -.9 jsr MLI - .DA #MLICLOSE - .DA MLICLOSE02 -.99 rts -*-------------------------------------- -MAN -SAVE A2OSX.S.KM -LOAD A2OSX.S -ASM diff --git a/A2osX.S.TOOLS.txt b/A2osX.S.TOOLS.txt deleted file mode 100644 index 242272d5..00000000 --- a/A2osX.S.TOOLS.txt +++ /dev/null @@ -1,179 +0,0 @@ -PR#3 -PREFIX /A2OSX.BOOT -DELETE A2OSX.SYSTEM -PREFIX /A2OSX.SRC -NEW -INC 1 -AUTO 6 - .LIST OFF -*-------------------------------------- -PrintPStrAX >STAX TmpPtr1 - lda (TmpPtr1) - tax - beq .9 - ldy #1 - -.1 lda (TmpPtr1),y - ora #$80 - jsr COUT - iny - dex - bne .1 - -.9 rts -*-------------------------------------- -PrintCStrAX >STAX TmpPtr1 - pla - sta TmpPtr2 - pla - sta TmpPtr2+1 - - ldy #0 - -.1 stz b0Flag - stz DigitCount - lda (TmpPtr1),y - beq .9 - cmp #'%' - bne .4 - -.11 iny - lda (TmpPtr1),y - beq .9 - cmp #'0' - bne .22 - ror b0Flag beq -> CS - bra .11 - -.22 bcc .21 - cmp #'9'+1 - bcs .21 - and #$0f - sta DigitCount - bra .11 - -.21 cmp #'d' - bne .2 - pla - jsr PrintADec - bra .8 - -.2 cmp #'D' - bne .3 - pla - plx - jsr PrintAXDec - bra .8 - -.3 cmp #'h' - bne .4 - pla - jsr PRBYTE - -.4 cmp #'\' - bne .7 - iny - lda (TmpPtr1),y - beq .9 - cmp #'n' - bne .9 - lda #$0D - -.7 ora #$80 - jsr COUT -.8 iny - bne .1 - -.9 lda TmpPtr2+1 - pha - lda TmpPtr2 - pha - rts -*-------------------------------------- -PrintADec ldx #0 -PrintAXDec >STAX HEX - stz BCD - stz BCD+1 - stz BCD+2 - - phy - - ldx #16 let's roll 16 bits - sed -.2 asl HEX - rol HEX+1 - php cpy will disturb carry while BCD adc - ldy #0 -.3 plp - lda BCD,y - adc BCD,y - sta BCD,y - php - iny - cpy #3 Last byte of BCDBUF? - bne .3 - plp - dex - bne .2 - - cld - - ldx #0 - ldy #5 - -.4 lda BCD,x - pha - and #$0F - ora #$B0 - sta DigitBuffer,y - dey - - pla - lsr - lsr - lsr - lsr - ora #$B0 - sta DigitBuffer,y - inx - dey - bpl .4 - - lda DigitCount - beq .5 - lda #6 - sec - sbc DigitCount -.5 tay -.6 lda DigitBuffer,y - cmp #"0" - beq .7 - - sec - ror b0Flag - bra .8 - -.7 cpy #5 - beq .8 - lda #" " - bit b0Flag - bpl .81 - lda #"0" -.8 jsr COUT -.81 iny - cpy #6 - bne .6 - -.9 ply - rts -*-------------------------------------- -HEX .BS 2 -BCD .BS 3 -b0Flag .BS 1 -DigitCount .BS 1 -DigitBuffer .BS 6 -*-------------------------------------- -MAN -SAVE A2OSX.S.TOOLS -LOAD A2OSX.S -ASM diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index 0f896e10..570bc4b0 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -4,6 +4,8 @@ NEW INC 1 AUTO 6 ECHO *** A2osX Startup file *** +echo Working Directory: +CD echo Env: SET # Main Screen @@ -14,12 +16,12 @@ STARTPROC GETTY CON ${A2OSX}SBIN/LOGIN #STARTPROC GETTY COM2 LOGIN #INSDRV PIC.DRV # Network Section -#INSDRV UTHERNET.DRV 000E3A123456 +INSDRV UTHERNET.DRV 000E3A123456 #INSDRV UTHERNET2.DRV 0008DC123456 #INSDRV UTHER2.AI.DRV 0008DC123456 #INSDRV LANCEGS.DRV -#STARTPROC TCPIP -#STARTPROC DHCPCLNT +STARTPROC TCPIP +STARTPROC DHCPCLNT #STARTPROC HTTPD #TELNETD #MOUNT TFTP 192.168.1.5:/A2OSX /MNT/A2OSX diff --git a/BIN/ASM.S.DIR.txt b/BIN/ASM.S.DIR.txt index 0d16d93b..6efc9b38 100644 --- a/BIN/ASM.S.DIR.txt +++ b/BIN/ASM.S.DIR.txt @@ -214,7 +214,7 @@ DIR.IN jsr SRC.GetArg >LDYA L.SRC.BUFFER >SYSCALL SYS.NewPStrYA - pha + phx jsr FIO.OpenFileA plx diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 660a9b5b..f008c956 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -162,6 +162,8 @@ CS.INIT >LDYA L.LIBSTR >SYSCALL SYS.GetMemPtrA >SYSCALL SYS.NewPStrYA + + txa ldy #SRC.hFILENAME sta (pData),y diff --git a/BIN/CHTYP.S.txt b/BIN/CHTYP.S.txt index 1acfabbd..d421887d 100644 --- a/BIN/CHTYP.S.txt +++ b/BIN/CHTYP.S.txt @@ -50,8 +50,6 @@ CS.INIT ldy #S.PS.hARGS >SYSCALL SYS.PStrGetTkn bcs .99 - >DEBUG - ldy #hArg1 sta (pData),y txa diff --git a/BIN/EDIT.S.CTRL.txt b/BIN/EDIT.S.CTRL.txt index ea818a9f..d3970fef 100644 --- a/BIN/EDIT.S.CTRL.txt +++ b/BIN/EDIT.S.CTRL.txt @@ -552,6 +552,8 @@ Prompt.Save cmp #3 >SYSCALL SYS.FreeMemA .11 >LDYA pData >SYSCALL SYS.NewPStrYA + + txa ldy #hFileName sta (pData),y diff --git a/BIN/EDIT.S.txt b/BIN/EDIT.S.txt index 0f2ae66c..a89c1292 100644 --- a/BIN/EDIT.S.txt +++ b/BIN/EDIT.S.txt @@ -97,6 +97,7 @@ J.CTRL .DA Ctrl.Invalid .DA 0 *-------------------------------------- CS.INIT stz hFile + stz TmpFilename stz TmpLen stz TmpLen+1 @@ -104,50 +105,32 @@ CS.INIT stz hFile ldy #bSaved sta (pData),y - ldy #S.PS.hARGS - lda (pPs),y - beq .3 + >SYSCALL SYS.GetArgC + cmp #1 + beq .1 - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 + lda #1 + >SYSCALL SYS.GetArgA - lda (ZPPTR1) - cmp #'/' - bne .1 + >SYSCALL SYS.GetFullPathYA + stx TmpFilename - ldy #S.PS.hARGS - lda (pPs),y - >SYSCALL SYS.GetMemPtrA - >SYSCALL SYS.NewPStrYA - bra .2 - -.1 ldy #S.PS.hARGS - lda (pPs),y - >PUSHA - ldy #S.PS.hPREFIX - lda (pPs),y - >PUSHA - >SYSCALL SYS.PStrCat - -.2 ldy #hFileName - sta (pData),y - - >SYSCALL SYS.GetMemPtrA >SYSCALL SYS.LoadFileYA - bcs .3 + bcs .1 stx hFile >STYA TmpLen -.3 >LDYA TmpLen +.1 >LDYA TmpLen iny - bne .4 + bne .2 inc -.4 >PUSHYA +.2 >PUSHYA >PUSHBI S.MEM.F.INIT0 >SYSCALL SYS.GetMem bcs .98 + >STYA ZPPTR2 txa ldy #hBuffer @@ -174,7 +157,8 @@ CS.INIT stz hFile inc ZPPTR2+1 bra .5 -.6 jsr .98 +.6 lda hFile + >SYSCALL SYS.FreeMemA .7 ldy #FileLen lda TmpLen @@ -183,6 +167,10 @@ CS.INIT stz hFile lda TmpLen+1 sta (pData),y + lda TmpFilename + ldy #hFileName + sta (pData),y + lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) @@ -505,6 +493,7 @@ MSG.HELP >PSTRING "All commands: (* = Not yet implemented)" EscChars >PSTRING "DBAC" EscAscii .HS 04080A0B15 hFile .BS 1 +TmpFilename .BS 1 TmpByte .BS 1 TmpLen .BS 2 TmpCount .BS 2 diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt index f01bad2a..56bd7829 100644 --- a/BIN/LS.S.txt +++ b/BIN/LS.S.txt @@ -49,61 +49,47 @@ CS.INIT >LDYA L.LIBSTR >SYSCALL SYS.LoadLibYA sta hLIBSTR - lda #0 - ldy #DS.END-DS.START-1 -.11 sta (pData),y - dey - bpl .11 + stz TmpBuffer256 - ldy #S.PS.hARGS - lda (pPs),y - beq .1 no arg, go get current prefix + >SYSCALL SYS.GetArgC + cmp #1 + bne .1 + + jsr CS.INIT.GETPFX no arg, go get current prefix + bra .3 - >SYSCALL SYS.GetMemPtrA +.1 lda #1 + >SYSCALL SYS.GetArgA >STYA ZPPtr1 - lda (ZPPtr1) - beq .1 + ldy #1 lda (ZPPtr1),y cmp #'/' full path starting with '/'? - bne .10 no, append to current prefix + beq .2 yes, do not append to current prefix - ldy #S.PS.hARGS yes, get back arg... - lda (pPs),y - bra .3 + jsr CS.INIT.GETPFX -.10 ldy #S.PS.hARGS - lda (pPs),y - >PUSHA - ldy #S.PS.hPREFIX - lda (pPs),y - >PUSHA +.2 >PUSHW ZPPtr1 + >PUSHWI TmpBuffer256 >SYSCALL SYS.PStrCat - ldy #hDIRPATH - sta (pData),y - bra .3 - -.1 ldy #S.PS.hPREFIX - lda (pPs),y - -.3 >SYSCALL SYS.GetMemPtrA - >STYA ZPPtr1 - >SYSCALL SYS.CheckPrefixYA is it a existing directory? - bcs .4 no, let ListDirInitYA extract pattern - lda (ZPPtr1) +.3 >LDYAI TmpBuffer256 + >SYSCALL SYS.CheckPrefixYA is it a existing directory? + bcs .5 no, let ListDirInitYA extract pattern + + lda TmpBuffer256 tay lda #'/' - cmp (ZPPtr1),y - beq .31 + cmp TmpBuffer256,y + beq .4 iny - sta (ZPPtr1),y + sta TmpBuffer256,y -.31 iny +.4 iny lda #'*' - sta (ZPPtr1),y + sta TmpBuffer256,y -.4 >LDYA ZPPtr1 +.5 >LDYAI TmpBuffer256 >SYSCALL SYS.ListDirInitYA bcs .9 ldy #hS.LISTDIR @@ -118,6 +104,14 @@ CS.INIT >LDYA L.LIBSTR .9 sec rts *-------------------------------------- +CS.INIT.GETPFX ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHWI TmpBuffer256 + >SYSCALL SYS.PStrCpy + rts +*-------------------------------------- CS.RUN ldy #bCANCEL lda (pData),y beq .1 diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt index b72fc5f1..6eea6025 100644 --- a/BIN/PING.S.txt +++ b/BIN/PING.S.txt @@ -44,9 +44,10 @@ L.MSG2 .DA MSG2 L.MSG3 .DA MSG3 .DA 0 *-------------------------------------- -CS.INIT ldy #S.PS.hARGS - lda (pPs),y +CS.INIT >SYSCALL SYS.GetArgC + cmp #1 bne .1 + lda #SYSMGR.ERRSYN sec rts @@ -93,9 +94,8 @@ CS.INIT ldy #S.PS.hARGS CS.RUN jsr Init.Timeout .1 >PUSHW pData DST.IP - ldy #S.PS.hARGS - lda (pPs),y - >SYSCALL SYS.GetMemPtrA + lda #1 + >SYSCALL SYS.GetArgA >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME bcc .2 @@ -103,9 +103,8 @@ CS.RUN jsr Init.Timeout jsr Wait.Timeout bcc .1 - ldy #S.PS.hARGS - lda (pPs),y - >SYSCALL SYS.GetMemPtrA + lda #1 + >SYSCALL SYS.GetArgA >PUSHYA >PUSHW L.MSG0 >LIBCALL hLIBSTR,LIBSTR.PRINTF @@ -113,9 +112,8 @@ CS.RUN jsr Init.Timeout sec rts -.2 ldy #S.PS.hARGS - lda (pPs),y - >SYSCALL SYS.GetMemPtrA +.2 lda #1 + >SYSCALL SYS.GetArgA >PUSHYA ldy #3 diff --git a/BIN/PS.S.txt b/BIN/PS.S.txt index cb6a457c..b840542a 100644 --- a/BIN/PS.S.txt +++ b/BIN/PS.S.txt @@ -37,7 +37,6 @@ CS.START cld L.LIBSTR .DA LIBSTR L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 -L.MSG2 .DA MSG2 .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBSTR @@ -56,17 +55,7 @@ CS.RUN >LDYAI TSKMGR.TABLE+S.PS.SIZE .1 lda (ZPPTR1) bpl .4 - ldy #S.PS.hARGS - lda (ZPPTR1),y - beq .2 - - >SYSCALL SYS.GetMemPtrA - >PUSHYA - bra .3 - -.2 >PUSHW L.MSG2 - -.3 ldy #S.PS.hCMD + ldy #S.PS.hCMDLINE lda (ZPPTR1),y >SYSCALL SYS.GetMemPtrA >PUSHYA @@ -80,7 +69,7 @@ CS.RUN >LDYAI TSKMGR.TABLE+S.PS.SIZE ldy #S.PS.ID lda (ZPPTR1),y - >PUSHA DevID + >PUSHA PID >PUSHW L.MSG1 >LIBCALL hLibStr,LIBSTR.PRINTF @@ -112,9 +101,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 %30S %28S\n" -MSG2 >PSTRING "(none)" +MSG0 >CSTRING "ID Flags PID Command Line\n" +MSG1 >CSTRING "%03d %b %03d %S\n" MAN SAVE BIN/PS.S ASM diff --git a/DRV/UTHERNET.DRV.S.txt b/DRV/UTHERNET.DRV.S.txt index 6b0d078e..1c5a8336 100644 --- a/DRV/UTHERNET.DRV.S.txt +++ b/DRV/UTHERNET.DRV.S.txt @@ -124,7 +124,7 @@ L.MSG.DETECT.KO .DA MSG.DETECT.KO L.DEV.HEADER.NAME .DA DEV.HEADER.NAME .DA 0 End Of Reloc Table *-------------------------------------- -Dev.Detect sta hArgs +Dev.Detect >STYA ARGS >LDYA L.MSG.DETECT >SYSCALL SYS.PSTROutYA @@ -154,8 +154,11 @@ Dev.Detect sta hArgs .3 stx DEVSLOTx0 - lda hARGS + >LDYA ARGS + >STYA ZPTmpPTR + lda (ZPTmpPTR) bne .4 + lda #$00 sta MAC lda #$0E @@ -171,9 +174,7 @@ Dev.Detect sta hArgs sta MAC+5 bra .8 -.4 >SYSCALL SYS.GetMemPtrA - >STYA ZPTmpPTR - jsr DecodeMac +.4 jsr DecodeMac bcc .8 lda #DEVMGR.ERRICL sec @@ -194,7 +195,7 @@ CS.END MSG.DETECT >PSTRING "UtherNet/CS8900A Driver.\n" MSG.DETECT.OK >PSTRING "UtherNet/CS8900A Installed As Device : " MSG.DETECT.KO >PSTRING "Hardware Not Found.\n" -hArgs .BS 1 +ARGS .BS 2 *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 4771dc58..c909f9cd 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -16,16 +16,18 @@ K.PS.MAX .EQ 64 *-------------------------------------- ZPKERNEL .EQ $0 *-------------------------------------- +ZPMEMMGR .EQ $8 +*-------------------------------------- pCode .EQ $10 pData .EQ $12 pStack .EQ $14 pLib .EQ $16 -pDev .EQ $18 +pDrv .EQ $18 -pEvent .EQ $1A -pPs .EQ $1C -pDrv .EQ $1E +pPs .EQ $1A +pDev .EQ $1C +pEvent .EQ $1E ZPDRV .EQ $80 ZPBIN .EQ $90 @@ -34,10 +36,6 @@ ZPLIB .EQ $A0 32 bytes for TCPIP * !!!!!!! RESERVED APPLESOFT.I !!!!!!! * $5E -> $C8 *-------------------------------------- -* $B0 -> $FF KERNEL RESERVED -*-------------------------------------- -ZPMemMgr .EQ $E0 -*-------------------------------------- R.VCPU16 .EQ $F0 R.AX .EQ R.VCPU16 R.AL .EQ R.VCPU16 @@ -73,6 +71,8 @@ D.STACK.TOP .EQ $03F0 ...Down to $0300 * Main/Aux $400 -> $7FF : Console Screen * Main/Aux $800 -> $BFF : System Screen *-------------------------------------- +KrnBuffer256 .EQ $0C00 +*-------------------------------------- *** Z80 Reserved *** *-------------------------------------- Z80STACK .EQ $0FFF (0FFFFh) Down to $0F00 @@ -84,7 +84,7 @@ DevMgr.Table .EQ $1200 K.DEV.MAX*S.DEV.SIZE=32*16=512b *-------------------------------------- TskMgr.Table .EQ $1400 K.PS.MAX*S.PS.SIZE=64*16=1k *-------------------------------------- -* MemMgr : $1800->$1FFF MAIN/AUX (2 kBytes) +* MemMgr : $1800->$1FFF MAIN/AUX (2 kBytes) *-------------------------------------- MemMgr.Table .EQ $1800 MemMgr.HiMem .EQ $1800 Slot 0 is Reserved @@ -105,9 +105,10 @@ A2osX.LIBCALL .EQ $BE03 A2osX.MLICALL .EQ $BE06 A2osX.ROMCALL .EQ $BE09 *-------------------------------------- -pDevJmp .EQ $BE10 -pCodeJmp .EQ $BE13 -pLibJmp .EQ $BE16 +pCodeJmp .EQ $BE10 +pLibJmp .EQ $BE13 +pDrvJmp .EQ $BE16 +pDevJmp .EQ $BE19 *-------------------------------------- * $12 bytes min !!!! *-------------------------------------- @@ -159,28 +160,26 @@ SYS.GetStockObjectA .EQ $0C SYS.FreeStockObject .EQ $0E *-------------------------------------- SYS.NewPStrYA .EQ $10 - +SYS.PStrCpy .EQ $12 SYS.PStrCat .EQ $14 +SYS.PStrUprYA .EQ $16 -SYS.PStrGetTkn .EQ $18 -SYS.GetArgCount .EQ $1C -SYS.GetArgA .EQ $1E +SYS.PStr2StrArrayYA .EQ $1A *-------------------------------------- - +SYS.LoadDrvYA .EQ $20 SYS.LoadLibYA .EQ $22 SYS.UnloadLibA .EQ $24 -SYS.LoadDrvA .EQ $26 *-------------------------------------- -SYS.ExpandPStrA .EQ $30 -SYS.ExpandPStrYA .EQ $32 -SYS.PutEnvYA .EQ $34 -SYS.GetEnvVarYA .EQ $36 -SYS.SetEnvVarH .EQ $38 -SYS.SetEnvVarP .EQ $3A -SYS.DelEnvVarA .EQ $3C -SYS.DelEnvVarYA .EQ $3E +SYS.ExpandPStrYA .EQ $32 +SYS.GetArgC .EQ $34 +SYS.GetArgA .EQ $36 + +SYS.PutEnvYA .EQ $38 +SYS.SetEnv .EQ $3A +SYS.GetEnvYA .EQ $3C +SYS.UnsetEnvYA .EQ $3E *-------------------------------------- SYS.MLICreateFile .EQ $40 @@ -238,7 +237,7 @@ SYS.Sleep .EQ $9C *-------------------------------------- SYS.CheckPrefixYA .EQ $A0 SYS.FileSearch .EQ $A2 - +SYS.GetFullPathYA .EQ $A4 SYS.LoadFileYA .EQ $A6 SYS.ListDirInitYA .EQ $AA @@ -439,8 +438,8 @@ S.PS.hCS .EQ 3 S.PS.hDS .EQ 4 S.PS.hPREFIX .EQ 5 S.PS.hENV .EQ 6 -S.PS.hCMD .EQ 7 -S.PS.hARGS .EQ 8 +S.PS.hCMDLINE .EQ 7 +*S.PS.hARGS .EQ 8 S.PS.hINDEV .EQ 9 S.PS.hOUTDEV .EQ 10 S.PS.hERRDEV .EQ 11 diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt index 6ba6d94b..e37c1df7 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -104,12 +104,6 @@ AUTO 6 jsr A2osX.MLICALL .EM -*-------------------------------------- - .MA DRVCALL - ldy ]1 - ldx #]2 - jsr A2osX.DRVCALL - .EM *-------------------------------------- .MA LIBCALL ldy ]1 @@ -132,11 +126,9 @@ AUTO 6 .MA PUSHYA dec pStack sta (pStack) - pha tya dec pStack sta (pStack) - pla .EM *-------------------------------------- .MA PULLYA diff --git a/LIB/LIBSTR.S.txt b/LIB/LIBSTR.S.txt index 7387efac..d5fd5a4f 100644 --- a/LIB/LIBSTR.S.txt +++ b/LIB/LIBSTR.S.txt @@ -11,9 +11,9 @@ AUTO 6 .INB INC/MACROS.I .INB INC/A2OSX.I *-------------------------------------- -ZPTmpPtr1 .EQ ZPLIB+2 -ZPTmpPtr2 .EQ ZPLIB+4 -ZPTmpPtr3 .EQ ZPLIB+6 +ZPTmpPtr1 .EQ ZPLIB +ZPTmpPtr2 .EQ ZPLIB+2 +ZPTmpPtr3 .EQ ZPLIB+4 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 84c3e175..b349f015 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -372,8 +372,6 @@ DNS.DecodeMsg sta hFrame1 >SYSCALL SYS.GetMemPtrA >STYA ZPFrameBase1 -* >DEBUG - ldy #S.DNS.F+1 lda (ZPFrameBase1),y and /S.DNS.F.QR diff --git a/SBIN/DESKTOP.S.txt b/SBIN/DESKTOP.S.txt index 96beceb1..75886ca9 100644 --- a/SBIN/DESKTOP.S.txt +++ b/SBIN/DESKTOP.S.txt @@ -209,131 +209,7 @@ Destop.Paint lda #4 .8 rts *-------------------------------------- -* Midpoint algorithm - { - dx=x2-x1; - if (dx=0) => VLINE; - if(dx<0) - { - swap(&x1,&x2); - swap(&y1,&y2); - dx=-dx; - } - - dy=y2-y1; - if (dy=0) => HLINE; - if (dy<0) - { - incY=-1; - dy=-dy; - } - else - { - incY=1; - } - - if(dy>dx) - { - incE=2*dx; - d=incE-dy; - incNE=2*(dx-dy); - - while(y10) - { - d=d+incNE; - x1=x1+incY; - } - else - d=d+incE; - y1++; - putpixel(x1,y1,COLOR); - } - } - else - { - incE=2*dy; - d=incE-dx; - incNE=2*(dy-dx); - - while(x10) - { - d=d+incNE; - y1=y1+incY; - } - else - d=d+incE; - x1++; - putpixel(x1,y1,COLOR); - } - } - *-------------------------------------- -DrawLine >STYA ZPBase - ldy #9 -.1 lda (ZPBase),y - sta ZPCtrlBlk,y - dey - bpl .1 - - lda ZPCtrlBlk+4 X2.LO - sec - sbc ZPCtrlBlk X1.LO - sta DrawLine.DX - lda ZPCtrlBlk+5 X2.HI - sbc ZPCtrlBlk+1 X1.HI - sta DrawLine.DX+1 - - ora DrawLine.DX DX=0? - beq DrawLineV yes, call DRV.VLINE - - bcs .2 is CS, X1SYSCALL SYS.GetArgC + cmp #1 bne .1 >LDYA L.MSG.USAGE @@ -45,14 +45,8 @@ CS.INIT ldy #S.PS.hARGS sec rts -.1 >PUSHA - >PUSHBI $20 Push SEP=' ' - >PUSHBI 1 Push 1 for getting INDEV - >SYSCALL SYS.PStrGetTkn - bcs .99 - - sta hDEVNAME - >SYSCALL SYS.GetMemPtrA +.1 lda #1 + >SYSCALL SYS.GetArgA >SYSCALL SYS.GetDevByNameYA bcs .98 @@ -66,31 +60,24 @@ CS.INIT ldy #S.PS.hARGS ldy #S.PS.hERRDEV sta (pPs),y - lda hDEVNAME - >SYSCALL SYS.FreeMemA - ldx #DEVMGR.OPEN jsr pDevJmp bcs .99 - ldy #S.PS.hARGS - lda (pPs),y - >PUSHA - >PUSHBI $20 Push SEP=' ' - >PUSHBI 2 Push 2 for getting BIN - >SYSCALL SYS.PStrGetTkn + lda #2 + >SYSCALL SYS.GetArgA bcs .99 + >SYSCALL SYS.NewPStrYA + bcs .99 + + txa ldy #hBinName sta (pData),y clc rts -.98 pha - lda hDEVNAME - >SYSCALL SYS.FreeMemA - pla - sec +.98 sec .99 rts *-------------------------------------- CS.RUN lda #13 try send a CR... @@ -112,7 +99,7 @@ CS.RUN lda #13 try send a CR... ldy #hBinName lda (pData),y - ldy #0 + >SYSCALL SYS.GetMemPtrA >SYSCALL SYS.ExecProcessNewEnvYA .9 rts @@ -135,7 +122,6 @@ CS.QUIT ldy #hBinName CS.END MSG.USAGE >PSTRING "GETTY " MSG.GREETINGS >PSTRING "\e[12h\nA2osX-GeTTY on Dev=%S\n" -hDEVNAME .BS 1 *-------------------------------------- .DUMMY .OR 0 diff --git a/SBIN/INSDRV.S.txt b/SBIN/INSDRV.S.txt index b3dea2c5..70c91af9 100644 --- a/SBIN/INSDRV.S.txt +++ b/SBIN/INSDRV.S.txt @@ -34,23 +34,33 @@ CS.START cld .DA CS.DOEVENT .DA CS.QUIT L.MSG.HELP .DA MSG.HELP +L.MSG.LOAD .DA MSG.LOAD .DA 0 *-------------------------------------- -CS.INIT ldy #S.PS.hARGS - lda (pPs),y +CS.INIT >SYSCALL SYS.GetArgC + cmp #1 bne .1 + >LDYA L.MSG.HELP >SYSCALL SYS.PSTROutYA - bra .8 - -.1 >SYSCALL SYS.LoadDrvA - - bcs .9 - - -.8 lda #0 tell TSKMGR that all done ok, but -.9 sec we do not want to stay in memory + lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory rts + +.1 lda #1 get PTR to ARG[1] (Driver name) + >SYSCALL SYS.GetArgA + >PUSHYA + + >LDYA L.MSG.LOAD + >SYSCALL SYS.PSTROutYA + + lda #1 get PTR to ARG[1] (Driver name) + >SYSCALL SYS.GetArgA + + >SYSCALL SYS.LoadDrvYA YA = PTR to ARG[1...n] + + sec we do not want to stay in memory +.99 rts *-------------------------------------- CS.RUN CS.DOEVENT @@ -58,7 +68,9 @@ CS.QUIT clc rts *-------------------------------------- CS.END -MSG.HELP >PSTRING "Usage: insdrv file.drv \n" +MSG.HELP >PSTRING "Usage: insdrv file.drv \n" +MSG.LOAD >PSTRING "INSDRV:Loading %S...\n" +*-------------------------------------- MAN SAVE SBIN/INSDRV.S ASM diff --git a/SBIN/LOGIN.S.txt b/SBIN/LOGIN.S.txt index fd759d8e..adb89a4d 100644 --- a/SBIN/LOGIN.S.txt +++ b/SBIN/LOGIN.S.txt @@ -38,14 +38,7 @@ L.MSG.PASSWORD .DA MSG.PASSWORD L.SHELL .DA SHELL .DA 0 *-------------------------------------- -CS.INIT >LDYA L.SHELL - >SYSCALL SYS.NewPStrYA - bcs .9 - - ldy #hSHELL - sta (pData),y - - lda (pPs) +CS.INIT lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) clc Tell TskMgr To stay in memory @@ -89,9 +82,7 @@ CS.RUN lda #0 >SYSCALL SYS.COutA bcs .9 - ldy #hSHELL - lda (pData),y - ldy #0 + >LDYA L.SHELL >SYSCALL SYS.ExecProcessNewEnvYA bcs .9 @@ -124,10 +115,7 @@ CS.DOEVENT ldy #S.EVT.hDEV .99 sec rts *-------------------------------------- -CS.QUIT ldy #hSHELL - lda (pData),y - >SYSCALL SYS.FreeMemA - clc +CS.QUIT clc rts *-------------------------------------- * PRIVATE @@ -210,7 +198,7 @@ INPUT.LINEIN ldy #INPUT.Status CS.END MSG.LOGIN >PSTRING "login:" MSG.PASSWORD >PSTRING "password:" -SHELL >PSTRING "SBIN/SHELL" +SHELL >PSTRING "${A2OSX}SBIN/SHELL" .DUMMY .OR 0 DS.START @@ -219,7 +207,6 @@ INPUT.Status .BS 1 INPUT.PassChar .BS 1 hUSERNAME .BS 1 hPASSWORD .BS 1 -hSHELL .BS 1 DS.END .ED *-------------------------------------- diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt index ba263d55..b33a5cb3 100644 --- a/SBIN/SHELL.S.CMD.txt +++ b/SBIN/SHELL.S.CMD.txt @@ -5,289 +5,284 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -EXEC.CMD stz hFullCmd - stz hEnvPath - - ldy #hCmdLine - lda (pData),y - >PUSHA - >PUSHBI $20 Push SEP=' ' - >PUSHBI 0 Push 0 for getting CMD & ARGS - >SYSCALL SYS.PStrGetTkn +* Y,A -> Command line (formatted & not empty) +*-------------------------------------- +Cmd.ExecYA stz Cmd.Exec.Mode +Cmd.ExecYA.1 >SYSCALL SYS.ExpandPStrYA bcs .99 + stx hCmdLine - sta hExecCmd - stx hExecArgs - - >SYSCALL SYS.GetMemPtrA >STYA ZPPtr1 - - ldx #0 - stz ExecCmdIdx - stz ExecCmdMode -.1 lda CMDS,x - beq .6 - cmp (ZPPtr1) - bne .5 + ldy #1 + ldx #0 ARGS len - phx - ldy #0 - -.2 iny - inx lda (ZPPtr1),y - cmp #'a' - bcc .3 +.10 cmp #'a' + bcc .11 cmp #'z'+1 - bcs .3 - eor #$20 to Uppercase -.3 cmp CMDS,x - bne .4 + bcs .11 + eor #$20 to Uppercase + +.11 sta CMD,y Store Cmd in Buffer + sty CMD update CMD len + tya cmp (ZPPtr1) - bne .2 - plx + beq .13 end of string - ldx ExecCmdIdx - jsr EXEC.CMD.INT - jmp EXEC.CMD.ClnUp - -.4 plx -.5 txa - sec - adc CMDS,x - tax - inc ExecCmdIdx - inc ExecCmdIdx - bra .1 - -.6 jsr EXEC.CMD.EXT - jmp EXEC.CMD.ClnUp -.99 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 jmp (J.INTCMDS,x) -*-------------------------------------- -* ZPPtr1 = hExecCmd -*-------------------------------------- -EXEC.CMD.EXT ldy #1 + iny lda (ZPPtr1),y - cmp #'/' - bne .1 - >LDYA ZPPtr1 - >SYSCALL SYS.NewPStrYA - bra .10 - -.1 >LDYA L.ENV.PATH push ENVNAME=PATH - >SYSCALL SYS.GetEnvVarYA get value for ENV=PATH + cmp #' ' + bne .10 - bcc .12 - jmp .9 +.12 tya + cmp (ZPPtr1) + beq .13 end of string -.12 sta hEnvPath - >PUSHB hExecCmd - >PUSHB hEnvPath - >SYSCALL SYS.FileSearch - bcc .10 - - >PUSHB hExecCmd - ldy #S.PS.hPREFIX - lda (pPs),y - >PUSHA - >SYSCALL SYS.FileSearch - -.10 bcs .9 - - sta hFullCmd - >SYSCALL SYS.GetMemPtrA - >SYSCALL SYS.MLIGetFileInfoYA - bcs .9 - - >STYA ZPPTR1 - ldy #1 Get File Type - lda (ZPPTR1),y - cmp #$04 TXT File ? - bne .2 + iny + lda (ZPPtr1),y + inx + sta ARGS,x + bra .12 - lda hFullCmd - jsr OpenTxtFileA - bcs .9 +.13 stx ARGS update ARGS len + + lda hCmdLine Discard Expanded Cmd Line + >SYSCALL SYS.FreeMemA + + >LDYA L.CMDS + >STYA ZPPtr2 - lda hExecArgs - beq .11 - >SYSCALL SYS.GetMemPtrA - >SYSCALL SYS.NewPStrYA - bcs .9 -.11 ldy #hInputArgs - sta (pData),y - bra .9 + ldx #0 -.2 cmp #$06 BIN File ? +.1 lda (ZPPtr2) + beq Cmd.Exec.EXT Ending 0, must be an external Cmd.... + + cmp CMD bne .4 - lda hFullCmd - ldy hExecArgs - - bit ExecCmdMode - bmi .3 startproc + tay - >SYSCALL SYS.ExecProcessNewEnvYA - bra .9 - -.3 >SYSCALL SYS.CreateProcessYA - bra.9 +.2 lda CMD,y +.3 cmp (ZPPtr2),y + bne .4 + dey + bne .2 -.4 cmp #$ff SYS File ? - bne .5 + jmp (J.INTCMDS,x) Found an internal Cmd... + +.4 inx + inx + + lda ZPPtr2 + sec + adc (ZPPtr2) + sta ZPPtr2 + bcc .1 + inc ZPPtr2+1 + bra .1 + +.99 rts +*-------------------------------------- +Cmd.Exec.EXT ldy #1 + lda CMD,y + cmp #'/' Command line is already full path, no search + beq .3 + + >LDYA L.ENV.PATH push ENVNAME=PATH for search + >SYSCALL SYS.GetEnvYA get value for ENV=PATH + bcs .1 No PATH, try in CD + + >PUSHYA push search list + >PUSHW L.CMD + >SYSCALL SYS.FileSearch + bcc .2 + +.1 ldy #S.PS.hPREFIX not found, try in CD + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA push search list + >PUSHW L.CMD + >SYSCALL SYS.FileSearch + bcs .99 + +.2 phx save X=hMem, Y,A = Filename + >PUSHYA + >PUSHW L.CMD replace CMD in TmpBuffer with full path + >SYSCALL SYS.PStrCpy + pla + >SYSCALL SYS.FreeMemA Discard this string... + +.3 stz TmpBuffer256 reset TmpBuffer256 for final CMDLINE + + >LDYA L.CMD + >SYSCALL SYS.MLIGetFileInfoYA + bcs .99 + + >STYA ZPPtr2 + ldy #1 Get File Type + lda (ZPPtr2),y + cmp #$04 TXT File ? + beq Cmd.Exec.EXT.TXT + cmp #$06 BIN File ? + beq Cmd.Exec.EXT.BIN + cmp #$ff SYS File ? + bne .9 bra * -.5 lda #SYSMGR.ERRSYN +.9 lda #SYSMGR.ERRSYN sec -.9 rts +.99 rts *-------------------------------------- -EXEC.CMD.CD lda hExecArgs - bne EXEC.CMD.CD.C +* TXT : Launch "/PATH/SHELL /PATH/CMD ARGS" +*-------------------------------------- +Cmd.Exec.EXT.TXT + lda #0 Get arg[0] = /PATH/SHELL + >SYSCALL SYS.GetArgA + >PUSHYA + >PUSHWI TmpBuffer256 + >SYSCALL SYS.PStrCpy + + inc TmpBuffer256 Add a space.... + ldy TmpBuffer256 + lda #' ' + sta TmpBuffer256,y +*-------------------------------------- +* BIN : Launch "/PATH/CMD ARGS" +*-------------------------------------- +Cmd.Exec.EXT.BIN + >PUSHW L.CMD + >PUSHWI TmpBuffer256 + >SYSCALL SYS.PStrCat + + lda ARGS + beq .1 + + inc TmpBuffer256 Add a space.... + ldy TmpBuffer256 + lda #' ' + sta TmpBuffer256,y + + >PUSHW L.ARGS + >PUSHWI TmpBuffer256 + >SYSCALL SYS.PStrCat + +.1 >LDYAI TmpBuffer256 + bit Cmd.Exec.Mode + bmi .2 startproc + + >SYSCALL SYS.ExecProcessNewEnvYA + rts + +.2 >SYSCALL SYS.CreateProcessYA + rts +*-------------------------------------- +* Internal Commands +*-------------------------------------- +Cmd.Exec.CD lda ARGS + bne Cmd.Exec.CD1 ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL SYS.GetMemPtrA >SYSCALL SYS.PSTROutYA + bcs .9 lda #13 >SYSCALL SYS.COutA - clc - rts +.9 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 +Cmd.Exec.CD1 lda ARGS+1 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 >LDYA ZPPTR3 - >SYSCALL SYS.CheckPrefixYA - bcs .98 - ldy #S.PS.hPREFIX + + >LDYA L.ARGS + bra Cmd.Exec.CD.Change + +.1 ldy #S.PS.hPREFIX no, init target prefix with actual lda (pPs),y - pha - lda hNEWPATH - sta (pPs),y - pla - >SYSCALL SYS.FreeMemA - clc - rts -*-------------------------------------- -EXEC.CMD.STARTPROC - lda hExecCmd - >SYSCALL SYS.FreeMemA - stz hExecCmd - - lda hExecArgs - beq .9 - >PUSHA - >PUSHBI $20 Push SEP=' ' - >PUSHBI 0 Push 0 for getting CMD & ARGS - >SYSCALL SYS.PStrGetTkn - bcs .99 - phx - sta hExecCmd >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 + >PUSHYA + >PUSHWI TmpBuffer256 + >SYSCALL SYS.PStrCpy - lda hExecArgs - >SYSCALL SYS.FreeMemA - pla - sta hExecArgs + lda ARGS+1 + cmp #'.' ".." ? + bne .3 + + cmp ARGS+2 ".." ? + + bne .9 - sec - ror ExecCmdMode - - jmp EXEC.CMD.EXT + ldy TmpBuffer256 remove last dir component in actual prefix + +.2 dey + beq .9 nothing to remove, synerr + + lda TmpBuffer256,y + cmp #'/' + bne .2 + + sty TmpBuffer256 + + >LDYAI TmpBuffer256 + bra Cmd.Exec.CD.Change + .9 lda #SYSMGR.ERRSYN sec -.99 rts + rts + +.3 >PUSHW L.ARGS Append ARG to buffer + >PUSHWI TmpBuffer256 + >SYSCALL SYS.PStrCat + + ldx TmpBuffer256 + lda #'/' Ending with '/'? + cmp TmpBuffer256,x + beq .4 + sta TmpBuffer256+1,x + inc TmpBuffer256 + +.4 >LDYAI TmpBuffer256 + +Cmd.Exec.CD.Change + >STYA ZPPtr1 + >SYSCALL SYS.CheckPrefixYA + bcs .9 + + >LDYA ZPPtr1 + >SYSCALL SYS.NewPStrYA + bcs .9 + + phx + + ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL SYS.FreeMemA + + pla + + ldy #S.PS.hPREFIX + sta (pPs),y + + clc +.9 rts *-------------------------------------- -EXEC.CMD.SET lda hExecArgs - bne EXEC.CMD.SETVAR +Cmd.Exec.STARTPROC + lda ARGS + beq Cmd.Exec.ERRSYN + sec + ror Cmd.Exec.Mode + + >LDYA L.ARGS + jmp Cmd.ExecYA.1 + +Cmd.Exec.ERRSYN lda #SYSMGR.ERRSYN + sec + rts +*-------------------------------------- +Cmd.Exec.SET lda ARGS + bne Cmd.Exec.SETVAR ldy #S.PS.hENV lda (pPs),y @@ -298,82 +293,79 @@ EXEC.CMD.SET lda hExecArgs beq .8 Ending 0 ? >LDYA ZPPTR1 >SYSCALL SYS.PSTROutYA + bcs .9 + + lda ZPPTR1 + sec + adc (ZPPTR1) Add len+1 to PTR + sta ZPPTR1 + bcc .2 + inc ZPPTR1+1 + +.2 lda #'=' + >SYSCALL SYS.COutA + bcs .9 + + >LDYA ZPPTR1 + >SYSCALL SYS.PSTROutYA + bcs .9 + lda #13 >SYSCALL SYS.COutA + bcs .9 lda ZPPTR1 sec adc (ZPPTR1) Add len+1 to PTR sta ZPPTR1 bcc .1 - inc ZPPTR1 + inc ZPPTR1+1 bra .1 - .8 clc - rts +.9 rts -EXEC.CMD.SETVAR >PUSHA Push Cmd Line - >PUSHBI $3D Push SEP='=' - >PUSHBI 0 Push Token IDX - >SYSCALL SYS.PStrGetTkn - bcc .3 - lda #SYSMGR.ERRSYN +Cmd.Exec.SETVAR tax + lda ARGS,x + cmp #'=' ARGS ends with =, UnsetEnv + beq .2 + +.1 dex + beq .3 no =, GetEnv + + lda ARGS,x + cmp #'=' ARGS contains =, PutEnv + bne .1 + + cpx #1 string is '=value' ? + beq Cmd.Exec.ERRSYN syntax error + + >LDYA L.ARGS String is VAR=VALUE... + >SYSCALL SYS.PutEnvYA rts -.3 sta hVarName - stx hVarValue - txa - beq .31 +.2 dec ARGS String is "VAR=", Remove endig '=' + >LDYA L.ARGS String is "VAR"... + >SYSCALL SYS.UnsetEnvYA + rts - >PUSHB hVarValue - >PUSHB hVarName - >SYSCALL SYS.SetEnvVarH - jmp .97 - -.31 lda hExecArgs - >SYSCALL SYS.GetMemPtrA - >STYA ZPPTR1 - lda (ZPPTR1) - tay - lda (ZPPTR1),y - cmp #'=' - bne .4 - - lda hVarName - >SYSCALL SYS.DelEnvVarA - bra .97 - -.4 lda hVarName - >SYSCALL SYS.GetMemPtrA - >SYSCALL SYS.GetEnvVarYA - bcs .97 - sta hVarValue - - lda hVarName - >SYSCALL SYS.GetMemPtrA +.3 >LDYA L.ARGS String is VAR... >SYSCALL SYS.PSTROutYA + bcs .9 lda #'=' >SYSCALL SYS.COutA - lda hVarValue - >SYSCALL SYS.GetMemPtrA - >SYSCALL SYS.PSTROutYA - lda #13 + bcs .9 + + >LDYA L.ARGS + >SYSCALL SYS.GetEnvYA + bcs .8 + + >SYSCALL SYS.PSTROutYA Y,A = VALUE + +.8 lda #13 >SYSCALL SYS.COutA - - clc - -.97 php - pha - lda hVarValue - beq .98 - >SYSCALL SYS.FreeMemA -.98 lda hVarName - >SYSCALL SYS.FreeMemA - pla - php - rts +.9 rts *-------------------------------------- -EXEC.CMD.DATE >SYSCALL SYS.MLIGetTime +Cmd.Exec.DATE >SYSCALL SYS.MLIGetTime bcs .9 >PUSHW DATELO >LIBCALL hLIBSTR,LIBSTR.PRINTDATE @@ -382,7 +374,7 @@ EXEC.CMD.DATE >SYSCALL SYS.MLIGetTime clc .9 rts *-------------------------------------- -EXEC.CMD.TIME >SYSCALL SYS.MLIGetTime +Cmd.Exec.TIME >SYSCALL SYS.MLIGetTime bcs .9 >PUSHW TIMELO >LIBCALL hLIBSTR,LIBSTR.PRINTTIME @@ -391,28 +383,22 @@ EXEC.CMD.TIME >SYSCALL SYS.MLIGetTime clc .9 rts *-------------------------------------- -EXEC.CMD.ECHO lda hExecArgs - beq .98 - >SYSCALL SYS.ExpandPStrA - bcs .99 - - pha - >SYSCALL SYS.GetMemPtrA +Cmd.Exec.ECHO lda ARGS + beq .9 + >LDYA L.ARGS >SYSCALL SYS.PSTROutYA lda #13 >SYSCALL SYS.COutA - pla - >SYSCALL SYS.FreeMemA clc rts -.98 lda #SYSMGR.ERRSYN +.9 lda #SYSMGR.ERRSYN sec -.99 rts + rts *-------------------------------------- -EXEC.CMD.TYPE lda hExecArgs +Cmd.Exec.TYPE lda ARGS beq .98 - >SYSCALL SYS.GetMemPtrA + >LDYA L.ARGS >SYSCALL SYS.LoadFileYA bcs .99 @@ -444,17 +430,17 @@ EXEC.CMD.TYPE lda hExecArgs sec .99 rts *-------------------------------------- -EXEC.CMD.READ +Cmd.Exec.READ clc rts *-------------------------------------- -EXEC.CMD.PAUSE ldy #bPause +Cmd.Exec.PAUSE ldy #bPause lda #$80 sta (pData),y clc rts *-------------------------------------- -EXEC.CMD.EXIT ldy #bEXIT +Cmd.Exec.EXIT ldy #bEXIT lda #$FF sta (pData),y clc diff --git a/SBIN/SHELL.S.HIS.txt b/SBIN/SHELL.S.HIS.txt index c18f09b7..11ed8055 100644 --- a/SBIN/SHELL.S.HIS.txt +++ b/SBIN/SHELL.S.HIS.txt @@ -5,7 +5,7 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -History.Init >PUSHWI 256 Get a buffer for History +HIS.Init >PUSHWI 256 Get a buffer for History >PUSHBI S.MEM.F.INIT0 >SYSCALL SYS.GetMem bcs .9 @@ -21,7 +21,7 @@ History.Init >PUSHWI 256 Get a buffer for History sta (pData),y .9 rts *-------------------------------------- -History.Add ldy #hCmdHistory +HIS.Add ldy #hCmdHistory lda (pData),y beq .9 >SYSCALL SYS.GetMemPtrA @@ -88,7 +88,7 @@ History.Add ldy #hCmdHistory bpl .4 .9 rts *-------------------------------------- -History.GetPrev ldy #hCmdHistory +HIS.GetPrev ldy #hCmdHistory lda (pData),y beq HISTORY.RTS @@ -121,10 +121,10 @@ History.GetPrev ldy #hCmdHistory .2 txa ldy #CmdHistory.IDX set new index sta (pData),y - bra History.SetBuf + bra HIS.SetBuf History.RTS rts *-------------------------------------- -History.GetNext ldy #hCmdHistory +HIS.GetNext ldy #hCmdHistory lda (pData),y beq HISTORY.RTS @@ -153,10 +153,10 @@ History.GetNext ldy #hCmdHistory ldy #CmdHistory.END cmp (pData),y - bne History.SetBuf + bne HIS.SetBuf jmp CmdBuffer.CLR end of history, just blank buffer *-------------------------------------- -History.SetBuf jsr CmdBuffer.CLR +HIS.SetBuf jsr CmdBuffer.CLR ldy #CmdHistory.IDX lda (pData),y @@ -175,7 +175,7 @@ History.SetBuf jsr CmdBuffer.CLR jmp CmdBuffer.PRINT *-------------------------------------- -History.Quit ldy #hCmdHistory +HIS.Quit ldy #hCmdHistory lda (pData),y beq .9 >SYSCALL SYS.FreeMemA diff --git a/SBIN/SHELL.S.TXT.txt b/SBIN/SHELL.S.TXT.txt new file mode 100644 index 00000000..1eff68fe --- /dev/null +++ b/SBIN/SHELL.S.TXT.txt @@ -0,0 +1,99 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +TXT.OpenFileYA >SYSCALL SYS.MLIOpenYA + bcs .9 + + ldy #hInputFile + sta (pData),y + pha + txa + ldy #hInputBuffer + sta (pData),y + + >PUSHBI $0D Line separator for TXT file + >PUSHBI $FF + pla + >PUSHA + >SYSCALL SYS.MLINewLine + bcc .9 + pha + jsr TXT.CloseFile + pla + sec +.9 rts +*-------------------------------------- +TXT.ReadFile >PUSHWI 127 + >PUSHWI TmpBuffer256+1 + ldy #hInputFile + lda (pData),y + >PUSHA + >SYSCALL SYS.MLIRead + bcs .9 + + tya + beq .10 + + lda TmpBuffer256,y Y,A=Bytes read + cmp #$0D + bne .10 + + dey + +.10 tya + sta (pData) + beq .2 + +.1 lda TmpBuffer256,y + sta (pData),y + dey + bne .1 + +.2 ldy #bEcho + lda (pData),y + beq .8 + + lda #'>' + >SYSCALL SYS.COutA + lda #'"' + >SYSCALL SYS.COutA + >LDYA pData + >SYSCALL SYS.PSTROutYA + lda #'"' + >SYSCALL SYS.COutA + lda #13 + >SYSCALL SYS.COutA +.8 clc +.9 rts +*-------------------------------------- +TXT.CloseFile ldy #hInputArgs + lda (pData),y + beq .1 + >SYSCALL SYS.FreeMemA + +.1 ldy #hInputFile + lda (pData),y + beq .9 + + >SYSCALL SYS.MLICloseA + ldy #hInputBuffer + lda (pData),y + >SYSCALL SYS.FreeMemA + +.9 lda #0 + ldy #hInputArgs + sta (pData),y + ldy #hInputFile + sta (pData),y + ldy #hInputBuffer + sta (pData),y + rts +*-------------------------------------- +MAN +SAVE SBIN/SHELL.S.TXT +LOAD SBIN/SHELL.S +ASM diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index 9dd8cd17..fe038507 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -42,28 +42,33 @@ L.LIBSTR .DA LIBSTR L.MSG.GREETINGS .DA MSG.GREETINGS L.MSG.ERROR .DA MSG.ERROR L.ENV.PATH .DA ENV.PATH -J.INTCMDS .DA EXEC.CMD.CD - .DA EXEC.CMD.DATE - .DA EXEC.CMD.ECHO - .DA EXEC.CMD.EXIT - .DA EXEC.CMD.PAUSE - .DA EXEC.CMD.READ - .DA EXEC.CMD.SET - .DA EXEC.CMD.STARTPROC - .DA EXEC.CMD.TIME - .DA EXEC.CMD.TYPE +L.CMD .DA CMD +L.ARGS .DA ARGS +L.CMDS .DA CMDS +J.INTCMDS .DA Cmd.Exec.CD + .DA Cmd.Exec.DATE + .DA Cmd.Exec.ECHO + .DA Cmd.Exec.EXIT + .DA Cmd.Exec.PAUSE + .DA Cmd.Exec.READ + .DA Cmd.Exec.SET + .DA Cmd.Exec.STARTPROC + .DA Cmd.Exec.TIME + .DA Cmd.Exec.TYPE .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBSTR >SYSCALL SYS.LoadLibYA bcs .9 sta hLIBSTR - - ldy #S.PS.hARGS Batch file ? - lda (pPs),y - beq CS.INIT.INTERACTIVE no,continue starting interactive + >SYSCALL SYS.GetArgC + cmp #1 - jsr OpenTxtFileA + beq CS.INIT.INTERACTIVE no arg, continue starting interactive + + lda #1 + >SYSCALL SYS.GetArgA + jsr TXT.OpenFileYA bcs .9 ldy #bExitOnEOF @@ -73,7 +78,7 @@ CS.INIT >LDYA L.LIBSTR .9 rts *-------------------------------------- CS.INIT.INTERACTIVE - jsr History.Init + jsr HIS.Init bcs .9 ldy #S.PS.hINDEV @@ -92,7 +97,7 @@ CS.INIT.INTERACTIVE CS.RUN lda #0 sta (pData) - ldy #bPause +.11 ldy #bPause lda (pData),y bpl .10 clc @@ -113,41 +118,25 @@ CS.RUN lda #0 sta (pData) bra .3 -.2 jsr ReadTxtFile +.2 jsr TXT.ReadFile bcs .81 -.3 lda (pData) - beq CS.RUN Empty line +.3 jsr CmdBuffer.Normalize + lda (pData) + beq .11 Empty line - ldy #1 + ldy #hInputFile if batch mode, do not add to cmd history lda (pData),y - cmp #'#' Comment - beq CS.RUN + bne .4 - ldy #hInputFile - lda (pData),y - bne .32 - - jsr History.Add + jsr HIS.Add -.32 >LDYA pData - >SYSCALL SYS.NewPStrYA - bcs .99 - - ldy #hCmdLine - sta (pData),y - jsr EXEC.CMD - bcc .4 +.4 >LDYA pData + jsr Cmd.ExecYA + bcc .8 tay - beq .4 + beq .8 jsr PrintError - -.4 ldy #hCmdLine - lda (pData),y - >SYSCALL SYS.FreeMemA - ldy #hCmdLine - lda #0 - sta (pData),y .8 ldy #bEXIT lda (pData),y @@ -156,7 +145,7 @@ CS.RUN lda #0 clc rts -.81 jsr CloseTxtFile +.81 jsr TXT.CloseFile ldy #bExitOnEOF lda (pData),y beq .8 @@ -201,7 +190,7 @@ CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? cpx #3 test Ctrl-c bne .12 - jsr CloseTxtFile + jsr TXT.CloseFile ldy #bExitOnEOF lda (pData),y ldy #bExit @@ -303,14 +292,14 @@ CS.EVENT.CTRL.CHAR .2 cpx #10 LF (down arrow) bne .3 - jsr HISTORY.GETNEXT + jsr HIS.GetNext clc rts .3 cpx #11 VT (up arrow) bne .4 - jsr HISTORY.GETPREV + jsr His.GetPrev clc rts @@ -323,7 +312,7 @@ CS.EVENT.CTRL.CHAR .8 clc rts *-------------------------------------- -CS.QUIT jsr History.Quit +CS.QUIT jsr HIS.Quit ldy #hInputFile lda (pData),y @@ -336,8 +325,10 @@ CS.QUIT jsr History.Quit >SYSCALL SYS.FreeMemA .2 lda hLIBSTR + beq .8 >SYSCALL SYS.UnloadLibA - clc + +.8 clc rts *-------------------------------------- * PRIVATE @@ -356,6 +347,60 @@ PrintError pha pla rts *-------------------------------------- +* Remove extra SPACE & comment +*-------------------------------------- +CmdBuffer.Normalize + >LDYA pData + >STYA ZPPtr1 + + lda (pData) empty line...quit + beq .9 + + tax Char count + + ldy #0 + +.1 jsr CmdBuffer.Normalize.Next + beq .8 no more char, exit + + cmp #' ' skip leading spaces + beq .1 + + cmp #'#' Comment ? + beq .8 ignore remaining chars + +.3 iny add char to buffer + sta (pData),y + + jsr CmdBuffer.Normalize.Next + beq .8 + + cmp #' ' + bne .3 + + iny add One SPACE to buffer + sta (pData),y + +.5 jsr CmdBuffer.Normalize.Next + beq .8 + cmp #' ' + beq .5 skip additional spaces + bne .3 no more space, add next word... + +.8 tya + sta (pData) +.9 rts + +CmdBuffer.Normalize.Next + txa + beq .8 + dex + inc ZPPtr1 + bne .1 + inc ZPPtr1+1 +.1 lda (ZPPtr1) +.8 rts +*-------------------------------------- CmdBuffer.PRINT ldy #0 .1 iny lda (pData),y @@ -377,99 +422,10 @@ CmdBuffer.DEL lda (pData) dec sta (pData) .9 rts -*-------------------------------------- -OpenTxtFileA >SYSCALL SYS.GetMemPtrA - >SYSCALL SYS.MLIOpenYA - bcs .9 - - ldy #hInputFile - sta (pData),y - pha - txa - ldy #hInputBuffer - sta (pData),y - - >PUSHBI $0D Line separator for TXT file - >PUSHBI $FF - pla - >PUSHA - >SYSCALL SYS.MLINewLine - bcc .9 - pha - jsr CloseTxtFile - pla - sec -.9 rts -*-------------------------------------- -ReadTxtFile >PUSHWI 127 - >PUSHWI TmpBuffer256+1 - ldy #hInputFile - lda (pData),y - >PUSHA - >SYSCALL SYS.MLIRead - bcs .9 - - tya - beq .10 - - lda TmpBuffer256,y Y,A=Bytes read - cmp #$0D - bne .10 - - dey - -.10 tya - sta (pData) - beq .2 - -.1 lda TmpBuffer256,y - sta (pData),y - dey - bne .1 - -.2 ldy #bEcho - lda (pData),y - beq .8 - - lda #'>' - >SYSCALL SYS.COutA - lda #'"' - >SYSCALL SYS.COutA - >LDYA pData - >SYSCALL SYS.PSTROutYA - lda #'"' - >SYSCALL SYS.COutA - lda #13 - >SYSCALL SYS.COutA - -.8 clc -.9 rts -*-------------------------------------- -CloseTxtFile ldy #hInputArgs - lda (pData),y - beq .1 - >SYSCALL SYS.FreeMemA - -.1 ldy #hInputFile - lda (pData),y - beq .9 - - >SYSCALL SYS.MLICloseA - ldy #hInputBuffer - lda (pData),y - >SYSCALL SYS.FreeMemA - -.9 lda #0 - ldy #hInputArgs - sta (pData),y - ldy #hInputFile - sta (pData),y - ldy #hInputBuffer - sta (pData),y - rts *-------------------------------------- .INB SBIN/SHELL.S.CMD .INB SBIN/SHELL.S.HIS + .INB SBIN/SHELL.S.TXT *-------------------------------------- CS.END *-------------------------------------- @@ -489,20 +445,14 @@ CMDS >PSTRING "CD" LIBSTR >PSTRING "libstr.o" MSG.GREETINGS >PSTRING "\nA2osX-Shell on Dev=%h\n\n" MSG.ERROR >PSTRING "[%h]\n" -*MSG.NOTFOUND >CSTRING "Command Not Found\n" -*MSG.SYNERR >CSTRING "Syntax Error Or Invalid Pathname\n" EscChars >PSTRING "DBAC" EscAscii .HS 04080A0B15 +CMD .BS 256 +ARGS .BS 256 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 -ExecCmdMode .BS 1 +hCmdLine .BS 1 +Cmd.Exec.Mode .BS 1 *-------------------------------------- .DUMMY .OR 0 @@ -513,7 +463,6 @@ bPause .BS 1 bExit .BS 1 bEcho .BS 1 bExitOnEOF .BS 1 -hCmdLine .BS 1 hCmdHistory .BS 1 CmdHistory.IDX .BS 1 CmdHistory.END .BS 1 diff --git a/SYS/KERNEL.S.ARG.txt b/SYS/KERNEL.S.ARG.txt new file mode 100644 index 00000000..ba0612ad --- /dev/null +++ b/SYS/KERNEL.S.ARG.txt @@ -0,0 +1,75 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* Out : A = Command line Arg Count +*-------------------------------------- +S.GetArgC jsr S.InitArgPtr1 + + ldx #0 + +.1 lda (ZPQuickPtr1) + beq .8 + + jsr S.NextArgPtr1 + inx + bne .1 + +.8 txa + clc + rts +*-------------------------------------- +* In : +* A = Arg Index +* Out : +* CC : Y,A = PStr To Arg[A] +* CS : Out Of Bound +*-------------------------------------- +S.GetArgA sta S.GetArgA.Idx + jsr S.InitArgPtr1 + + lda S.GetArgA.Idx + beq .8 + + ldx #0 + +.1 lda (ZPQuickPtr1) + beq .9 + + cpx S.GetArgA.Idx + beq .8 + + jsr S.NextArgPtr1 + inx + bra .1 + +.8 >LDYA ZPQuickPtr1 + clc + rts + +.9 sec + rts +*-------------------------------------- +S.InitArgPtr1 ldy #S.PS.hCMDLINE + lda (pPs),y + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + rts +*-------------------------------------- +S.NextArgPtr1 lda ZPQuickPtr1 + sec + adc (ZPQuickPtr1) + sta ZPQuickPtr1 + bcc .8 + inc ZPQuickPtr1+1 +.8 rts +*-------------------------------------- +S.GetArgA.Idx .BS 1 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.ARG +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index c814f0ba..cc40a6b4 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -5,32 +5,17 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* S.LoadBinA +* S.LoadBinYA * in : * A = hMem of FilePath (PSTRING) * out : * Y,A = MEMPTR * X = hMem of Code Segment *-------------------------------------- -S.LoadBinA sta S.LoadBinA.hFilename save file path - - jsr S.GetMemPtrA - >STYA ZPQuickPtr1 - - lda (ZPQuickPtr1) - tay - -.1 lda (ZPQuickPtr1),y convert to UPPERCASE - cmp #'a' - bmi .2 - cmp #'z'+1 - bpl .2 - eor #$20 - sta (ZPQuickPtr1),y -.2 dey - bne .1 - - >LDYA ZPQuickPtr1 +S.LoadBinYA >STYA S.LoadBin.Filename + jsr S.PStrUprYA + + >LDYA S.LoadBin.Filename jsr S.GetMemByNameYA bcs .3 not already loaded @@ -49,13 +34,13 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path clc rts -.3 >LDYA ZPQuickPtr1 +.3 >LDYA S.LoadBin.Filename jsr S.LoadFileYA bcc .4 rts Error Loading file -.4 >STYA S.LoadBinA.FileLen - stx S.LoadBinA.hMem save hMem +.4 >STYA S.LoadBin.FileLen + stx S.LoadBin.hMem save hMem txa jsr S.GetMemPtrA >STYA ZPQuickPtr1 save base address for relocation @@ -67,8 +52,7 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path lda (ZPQuickPtr1),y sta R.AH - lda S.LoadBinA.hFilename - jsr S.GetMemPtrA + >LDYA S.LoadBin.Filename jsr S.MLIGetFileInfoYA Get File Info for AUXTYPE bcs .98 @@ -76,23 +60,23 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path ldy #2 get AUXTYPE lda (ZPQuickPtr2),y sta R.BL Make BX=Range Start=AUXTYPE - sta S.LoadBinA.AuxType + sta S.LoadBin.AuxType clc - adc S.LoadBinA.FileLen + adc S.LoadBin.FileLen sta R.CL Make CX=Range End=AUXTYPE+FILELEN iny lda (ZPQuickPtr2),y sta R.BH - sta S.LoadBinA.AuxType+1 - adc S.LoadBinA.FileLen+1 + sta S.LoadBin.AuxType+1 + adc S.LoadBin.FileLen+1 sta R.CH lda ZPQuickPtr1 Compute relocation offset in DX sec - sbc S.LoadBinA.AuxType + sbc S.LoadBin.AuxType sta R.DL DX=Offset=ZPQuickPtr1-AUXTYPE lda ZPQuickPtr1+1 - sbc S.LoadBinA.AuxType+1 + sbc S.LoadBin.AuxType+1 sta R.DH >LDYA ZPQuickPtr1 @@ -107,13 +91,12 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path bcs .98 relocation error, dicard Code segment - lda S.LoadBinA.hFilename get back bin path - jsr S.GetMemPtrA - jsr S.NewPStrYA + >LDYA S.LoadBin.Filename get back bin path + jsr S.NewPStrYA make a copy of this string bcs .98 - pha + phx save copy - lda S.LoadBinA.hMem + lda S.LoadBin.hMem jsr S.GetMemByIDA >STYA ZPQuickPtr1 @@ -125,24 +108,24 @@ S.LoadBinA sta S.LoadBinA.hFilename save file path ldy #S.MEM.BIN sta (ZPQuickPtr1),y - lda S.LoadBinA.hMem + lda S.LoadBin.hMem tax return hMEM to Caller... jsr S.GetMemPtrA clc ...and Y,A=PTR to CS rts .98 pha - lda S.LoadBinA.hMem + lda S.LoadBin.hMem jsr S.FreeMemA Discard Loaded Code pla sec rts *-------------------------------------- -S.LoadBinA.hFilename .BS 1 -S.LoadBinA.hMem .BS 1 -S.LoadBinA.AuxType .BS 2 -S.LoadBinA.FileLen .BS 2 +S.LoadBin.Filename .BS 2 +S.LoadBin.hMem .BS 1 +S.LoadBin.AuxType .BS 2 +S.LoadBin.FileLen .BS 2 *-------------------------------------- MAN SAVE SYS/KERNEL.S.BIN diff --git a/SYS/KERNEL.S.DRV.txt b/SYS/KERNEL.S.DRV.txt index ff00ac4b..db0a3230 100644 --- a/SYS/KERNEL.S.DRV.txt +++ b/SYS/KERNEL.S.DRV.txt @@ -5,44 +5,46 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* S.LoadDrvA +* S.LoadDrvYA * in : -* A = hMem To Full Cmd Line +* Y,A = PTR To Full Cmd Line PStrArray * out : * none *-------------------------------------- -S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn - >PUSHBI $20 Push SEP=' ' - >PUSHBI 0 Push 0 for getting CMD And ARGS - jsr S.PStrGetTkn - bcc .1 - rts - -.1 sta S.LoadDrv.Name - stx S.LoadDrv.Args +S.LoadDrvYA >STYA S.LoadDrv.CmdArray >LDYAI ENV.DRV push ENVNAME=DRV - jsr S.GetEnvVarYA get value for ENV=$DRV + jsr S.GetEnvYA get value for ENV=DRV + bcs .99 + + >PUSHYA Push $DRV value + + >PUSHW S.LoadDrv.CmdArray (ARG[0] = DRVNAME) + + jsr S.FileSearch find libname in $DRV + bcs .99 + stx S.LoadDrv.hFullName + + jsr S.LoadBinYA Y,A =filename full path bcs .98 - sta S.LoadDrv.Srch - - >PUSHB S.LoadDrv.Name push CMD for S.FileSearch - >PUSHB S.LoadDrv.Srch - jsr S.FileSearch find File in $DRV - bcs .97 not Found - - sta S.LoadDrv.FullName - jsr S.LoadBinA - bcs .96 - >STYA pDrv stx S.LoadDrv.hMem - lda S.LoadDrv.Args - jsr S.LoadDrvA.Jmp call Dev.Detect + >LDYA S.LoadDrv.CmdArray Advance to ARG[1] + >STYA ZPQuickPtr1 + + lda ZPQuickPtr1 + sec + adc (ZPQuickPtr1) + sta ZPQuickPtr1 + bcc .1 + inc ZPQuickPtr1+1 + +.1 >LDYA ZPQuickPtr1 + jsr pDrvJmp call Dev.Detect - bcs .95 + bcs .97 bit RRAMWRAMBNK2 bit RRAMWRAMBNK2 @@ -52,51 +54,35 @@ S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn bit RRAMWRAMBNK1 bit RRAMWRAMBNK1 - bcs .95 - - jsr .95 + bcs .97 ldy #S.DEV.F lda (pDev),y ora #S.DEV.F.INUSE sta (pDev),y + + jsr .97 Cleanup... + + lda #0 Make sure RC = 0 if success clc +.99 rts + +.97 pha + lda S.LoadDrv.hMem + jsr S.FreeMemA + pla + +.98 pha + lda S.LoadDrv.hFullName + jsr S.FreeMemA + pla + sec rts - -.95 pha - lda S.LoadDrv.hMem - jsr S.FreeMemA - pla - -.96 pha - lda S.LoadDrv.FullName - jsr S.FreeMemA - pla - -.97 pha - lda S.LoadDrv.Srch - jsr S.FreeMemA - pla - -.98 pha - lda S.LoadDrv.Args - jsr S.FreeMemA - lda S.LoadDrv.Name - jsr S.FreeMemA - pla - -.99 sec - rts -*-------------------------------------- -S.LoadDrvA.Jmp jmp (pDrv) -*-------------------------------------- -S.LoadDrv.Name .BS 1 -S.LoadDrv.Args .BS 1 -S.LoadDrv.Srch .BS 1 -S.LoadDrv.FullName .BS 1 -S.LoadDrv.hMem .BS 1 *-------------------------------------- ENV.DRV >PSTRING "DRV" +S.LoadDrv.CmdArray .BS 2 +S.LoadDrv.hFullName .BS 1 +S.LoadDrv.hMem .BS 1 *-------------------------------------- MAN SAVE SYS/KERNEL.S.DRV diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 7dd6f9f3..34758052 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -5,20 +5,20 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* S.ExpandPStrA +* S.ExpandPStrYA * In: -* A = hMem of String to Expand (PSTRING) +* Y,A = PTR to String to Expand (PSTRING) * Out: -* A = hMem to Expanded String (PSTRING) +* X = hMem to Expanded String (PSTRING) +* Y,A = PTR to Expanded String *-------------------------------------- -S.ExpandPStrA jsr S.GetMemPtrA S.ExpandPStrYA >STYA ZPQuickPtr3 - stz TmpBuffer256 init Expanded String len=0 + stz KrnBuffer256 init Expanded String len=0 ldy #0 -.10 stz S.ExpandPStrA.Start +.10 stz S.ExpandPStr.Start .1 tya cmp (ZPQuickPtr3) End of PSTR? @@ -27,19 +27,19 @@ S.ExpandPStrYA >STYA ZPQuickPtr3 iny lda (ZPQuickPtr3),y - ldx S.ExpandPStrA.Start + ldx S.ExpandPStr.Start bne .3 already in a var? cmp #'$' no, found one ? beq .2 - inc TmpBuffer256 no, copy char - ldx TmpBuffer256 - sta TmpBuffer256,x + inc KrnBuffer256 no, copy char + ldx KrnBuffer256 + sta KrnBuffer256,x bra .1 -.2 sty S.ExpandPStrA.Start save var start - stz S.ExpandPStrA.End +.2 sty S.ExpandPStr.Start save var start + stz S.ExpandPStr.End bra .1 skip this char .3 cmp #'{' in var, "{" after "$"? @@ -48,78 +48,76 @@ S.ExpandPStrYA >STYA ZPQuickPtr3 cmp #'}' end of var? beq .5 -.4 jsr S.ExpandPStrA.VC valid char ? +.4 jsr S.ExpandPStr.VC valid char ? bcs .5 no, end here - sty S.ExpandPStrA.End yes, save end + sty S.ExpandPStr.End yes, save end bra .1 -.5 lda S.ExpandPStrA.End get end +.5 lda S.ExpandPStr.End get end beq .1 empty {} or $/ phy save current index - jsr S.ExpandPStrA.AV + jsr S.ExpandPStr.AV ply restore index in string... bra .10 reset start flag and continue -.6 sty S.ExpandPStrA.End end of PSTR - lda S.ExpandPStrA.Start are we in a var? +.6 sty S.ExpandPStr.End end of PSTR + lda S.ExpandPStr.Start are we in a var? beq .7 no...exit... - jsr S.ExpandPStrA.AV yes, expand and add to STR + jsr S.ExpandPStr.AV yes, expand and add to STR -.7 >LDYAI TmpBuffer256 +.7 >LDYAI KrnBuffer256 jsr S.NewPStrYA rts *-------------------------------------- -S.ExpandPStrA.AV - ldy #S.PS.hENV - lda (pPs),y - jsr S.GetMemPtrA - >STYA ZPQuickPtr1 Store ENV for FindVar - - lda S.ExpandPStrA.End +S.ExpandPStr.AV lda S.ExpandPStr.End sec - sbc S.ExpandPStrA.Start compute len of VAR End-Start+1 + sbc S.ExpandPStr.Start compute len of VAR End-Start+1 - ldx TmpBuffer256 + ldx KrnBuffer256 inx - sta TmpBuffer256,x + sta KrnBuffer256,x stx ZPQuickPtr2 - lda /TmpBuffer256 + lda /KrnBuffer256 sta ZPQuickPtr2+1 - ldy S.ExpandPStrA.Start + ldy S.ExpandPStr.Start .1 iny inx lda (ZPQuickPtr3),y - sta TmpBuffer256,x - cpy S.ExpandPStrA.End + sta KrnBuffer256,x + cpy S.ExpandPStr.End bne .1 - jsr S.FindVar + jsr S.CheckSysVarPtr2 + bcs .10 + >STYA ZPQuickPtr1 + bra .11 + +.10 jsr S.FindVarPtr2 bcs .9 - ldy #0 + jsr S.NextEnvPtr1 Skip NAME + +.11 ldy #0 + ldx KrnBuffer256 + .2 iny lda (ZPQuickPtr1),y - cmp #'=' - bne .2 - -.3 iny - lda (ZPQuickPtr1),y - inc TmpBuffer256 - ldx TmpBuffer256 - sta TmpBuffer256,x + inx + sta KrnBuffer256,x tya - cmp (ZPQuickPtr1) last char? - bne .3 + cmp (ZPQuickPtr1) last char? + bne .2 + stx KrnBuffer256 + .9 rts *-------------------------------------- -S.ExpandPStrA.VC - cmp #'0' +S.ExpandPStr.VC cmp #'0' bcc .9 cmp #'9'+1 bcc .8 @@ -137,289 +135,297 @@ S.ExpandPStrA.VC .9 sec rts *-------------------------------------- -S.ExpandPStrA.Start .BS 1 -S.ExpandPStrA.End .BS 1 +S.ExpandPStr.Start .BS 1 +S.ExpandPStr.End .BS 1 *-------------------------------------- -* S.DupEnvA -* In: -* A = ENV hMem To Duplicate -* Out: -* A = hMem to new ENV +* S.PutEnvYA *-------------------------------------- -S.DupEnvA jsr S.GetMemPtrA - >STYA ZPQuickPtr1 - >PUSHWI K.ENV.SIZE - >PUSHBI 0 - jsr S.GetMem - bcs .9 - >STYA ZPQuickPtr2 - +S.PutEnvYA >STYA ZPQuickPtr2 NAME=VALUE + lda (ZPQuickPtr2) + beq .9 + sta KrnBuffer256 + tay + +.1 lda (ZPQuickPtr2),y + sta KrnBuffer256,y + dey + bne .1 + ldy #0 -.1 lda (ZPQuickPtr1),y - sta (ZPQuickPtr2),y - beq .8 - - iny - bne .1 - inc ZPQuickPtr1+1 - inc ZPQuickPtr2+1 - bra .1 - -.8 txa - clc -.9 rts -*-------------------------------------- -* S.GetEnvVarYA -* In: -* Y,A = PTR to NAME (PSTRING) -* Out: -* A = hMem to VALUE (PSTRING) 0,"" if not exist -*-------------------------------------- -S.GetEnvVarYA >STYA ZPQuickPtr2 - jsr S.FindVar - bcc .1 - >LDYAI 1 not found - >PUSHYA create "" PSTR - >PUSHBI 0 - jsr S.GetMem create a new PSTR - bcs .99 - >STYA ZPQuickPtr3 - lda #0 - sta (ZPQuickPtr3) set len of PSTR - txa - clc - rts - -.1 lda (ZPQuickPtr1) get NAME=VALUE len - sec - sbc (ZPQuickPtr2) substract (NAME len) - tay y=len("=VALUE") - lda #0 - >PUSHYA - >PUSHBI 0 - jsr S.GetMem create a new PSTR - bcs .99 - >STYA ZPQuickPtr3 - phx save hMem - lda (ZPQuickPtr1) get NAME=VALUE len - clc - sbc (ZPQuickPtr2) compute VALUE len - sta (ZPQuickPtr3) set new PSTR Len - tax x = chr to copy - lda (ZPQuickPtr2) get name len - inc add 1 to skip "=" - tay .2 iny - inc ZPQuickPtr3 - bne .3 - inc ZPQuickPtr3+1 -.3 lda (ZPQuickPtr1),y - sta (ZPQuickPtr3) - dex + cpy KrnBuffer256 last char ? + beq .9 no "=" found + + lda KrnBuffer256,y + cmp #'=' bne .2 - pla get back PSTR hMem + + cpy #1 String like "=value" ? + beq .9 + + cpy KrnBuffer256 last char ? + beq .9 we have "VAR=" + + lda KrnBuffer256 save actual string len + + sty KrnBuffer256 set length of VAR string + dec KrnBuffer256 ...without "=" + + +.3 clc Substract VAR len+1 from whole len to get + sbc KrnBuffer256 VALUE len + sta KrnBuffer256,y save it at "=" POS + + tya clc -.99 rts + adc #KrnBuffer256 + sta ZPQuickPtr3 + lda /KrnBuffer256 + sta ZPQuickPtr3+1 + + >LDYAI KrnBuffer256 + >STYA ZPQuickPtr2 + + bra S.SetEnvPtr2Ptr3 + +.9 sec + rts *-------------------------------------- -* S.SetEnvVarH -* In: -* PULLB = hMem To Name (PSTRING) -* PULLB = hMem To Value (PSTRING) -*-------------------------------------- -* S.SetEnvVarP +* S.SetEnv * In: * PULLW = PTR To Name (PSTRING) * PULLW = PTR To Value (PSTRING) * Out: *-------------------------------------- -S.SetEnvVarH >PULLA - jsr S.GetMemPtrA - >STYA ZPQuickPtr2 - >PULLA - jsr S.GetMemPtrA - bra S.SetEnvVar -S.SetEnvVarP >PULLW ZPQuickPtr2 - >PULLYA -S.SetEnvVar >STYA ZPQuickPtr3 ZPQuickPtr3 = VALUE - jsr S.FindVar - bcs .3 Not Found,ZPQuickPtr1 -> End Of Env - lda (ZPQuickPtr1) Found, Discard current NAME definition - sec - adc ZPQuickPtr1 add NAME=VALUE len+1 to ZPQuickPtr1 - sta ZPQuickPtr4 - lda #0 - adc ZPQuickPtr1+1 store it in ZPQuickPtr4 - sta ZPQuickPtr4+1 -.1 lda (ZPQuickPtr4) - sta (ZPQuickPtr1) - beq .3 until we move ending 0 - inc ZPQuickPtr1 - bne .2 - inc ZPQuickPtr1+1 -.2 inc ZPQuickPtr4 - bne .1 - inc ZPQuickPtr4+1 - bra .1 -.3 lda ZPQuickPtr1 Compute ENV UPPER LIMIT +S.SetEnv >PULLW ZPQuickPtr2 NAME... + >PULLW ZPQuickPtr3 ...VALUE + +S.SetEnvPtr2Ptr3 + jsr S.UnsetEnvPtr2 + + jsr S.InitEnvPtr1 Y,A = ZPQuickPtr1 -> Env + + lda ZPQuickPtr1 Compute ENV UPPER LIMIT in Ptr4 clc adc #K.ENV.SIZE sta ZPQuickPtr4 + lda ZPQuickPtr1+1 adc /K.ENV.SIZE sta ZPQuickPtr4+1 + ldy ZPQuickPtr1+1 lda ZPQuickPtr1 Compute New Env Upper limit in A,Y sec - adc (ZPQuickPtr2) add NAME len +1(for len) - bcc .4 + adc (ZPQuickPtr2) add NAME len +1 + bcc .1 iny -.4 sec - adc (ZPQuickPtr3) add VALUE len +1(for "=") - bcc .5 + +.1 sec + adc (ZPQuickPtr3) add VALUE len +1 + bcc .2 iny -.5 sec A,Y=new upper limit - sbc ZPQuickPtr4 greater than hMem Upper limit ? - bcc .51 + +.2 cmp ZPQuickPtr4 GE than hMem Upper limit ? tya sbc ZPQuickPtr4+1 - bcs .99 -.51 lda (ZPQuickPtr2) make len = NAME+VALUE+1 - sec - adc (ZPQuickPtr3) + bcs .99 + +.3 lda (ZPQuickPtr1) Scan until endig 0... + beq .4 + + inc ZPQuickPtr1 + bne .3 + inc ZPQuickPtr1+1 + bne .3 + +.4 lda (ZPQuickPtr2) sta (ZPQuickPtr1) - inc ZPQuickPtr1 + tay + +.5 lda (ZPQuickPtr2),y + sta (ZPQuickPtr1),y + dey + bne .5 + + jsr S.NextEnvPtr1 + + lda (ZPQuickPtr3) + sta (ZPQuickPtr1) + tay + +.6 lda (ZPQuickPtr3),y + sta (ZPQuickPtr1),y + dey bne .6 - inc ZPQuickPtr1+1 -.6 ldy #0 -.7 iny - lda (ZPQuickPtr2),y - sta (ZPQuickPtr1) - inc ZPQuickPtr1 - bne .8 - inc ZPQuickPtr1+1 -.8 tya - cmp (ZPQuickPtr2) - bne .7 - lda #'=' - sta (ZPQuickPtr1) - inc ZPQuickPtr1 - bne .9 - inc ZPQuickPtr1+1 -.9 ldy #0 -.10 iny - lda (ZPQuickPtr3),y - sta (ZPQuickPtr1) - inc ZPQuickPtr1 - bne .11 - inc ZPQuickPtr1+1 -.11 tya - cmp (ZPQuickPtr3) - bne .10 - lda #0 + + jsr S.NextEnvPtr1 + +.8 lda #0 + sta (ZPQuickPtr1) clc rts + .99 lda #SYSMGR.ERRENVF sec rts *-------------------------------------- -* S.PutEnvYA +* S.GetEnvYA * In: -* Y,A = PTR To Name (NAME=VALUE) +* Y,A = PTR to NAME (PSTRING) +* Out: +* CC : Y,A = PTR to VALUE (PSTRING) +* CS : not found +*-------------------------------------- +S.GetEnvYA >STYA ZPQuickPtr2 + jsr S.CheckSysVarPtr2 + bcc .9 + + jsr S.FindVarPtr2 + bcs .9 + jsr S.NextEnvPtr1 Skip NAME + >LDYA ZPQuickPtr1 +.9 rts +*-------------------------------------- +* S.UnsetEnvYA +* In: +* YA = PTR To Name (PSTRING) * Out: *-------------------------------------- -S.PutEnvYA clc - rts -*-------------------------------------- -* S.DelEnvVarA -* In: -* PULLB = hMem To Name (PSTRING) -*-------------------------------------- -* S.DelEnvVarYA -* In: -* PULLW = PTR To Name (PSTRING) -* Out: -*-------------------------------------- -S.DelEnvVarA >PULLA get NAME - jsr S.GetMemPtrA -S.DelEnvVarYA >STYA ZPQuickPtr2 Store VAR Name -S.DelEnvVar jsr S.FindVar +S.UnsetEnvYA >STYA ZPQuickPtr2 Store VAR Name +S.UnsetEnvPtr2 jsr S.FindVarPtr2 bcs .8 not found, quit - lda (ZPQuickPtr1) Found, Discard current NAME definition - sec - adc ZPQuickPtr1 add NAME=VALUE len+1 to ZPQuickPtr1 - sta ZPQuickPtr4 - lda #0 - adc ZPQuickPtr1+1 store it in ZPQuickPtr4 - sta ZPQuickPtr4+1 - -.1 lda (ZPQuickPtr4) - sta (ZPQuickPtr1) - beq .8 until we move ending 0 - inc ZPQuickPtr1 - bne .2 - inc ZPQuickPtr1+1 - -.2 inc ZPQuickPtr4 - bne .1 - inc ZPQuickPtr4+1 - bra .1 + jsr S.DiscardVarPtr1 Ptr1 -> ENVNAME .8 clc rts *-------------------------------------- * PRIVATE *-------------------------------------- -* S.FindVar +* S.CheckSysVarPtr2 * In: * ZPQuickPtr2 -> NAME -*-------------------------------------- * Out: * CC: Found -* ZPQuickPtr1 -> NAME=VALUE +* YA -> VALUE +* CS: Not Found +*-------------------------------------- +S.CheckSysVarPtr2 + lda (ZPQuickPtr2) + cmp #1 is name 1 char? + bne .9 + + ldy #1 + lda (ZPQuickPtr2),y + cmp #'0' $0...$9 ?? + bcc .1 no, + cmp #'9'+1 + bcs .99 + and #$0F + jmp S.GetArgA + +.1 cmp #'*' $* : All ARGS + bne .9 + + cmp #'#' $# : ARGC + bne .9 + + cmp #'?' $? : RC + bne .9 + + cmp #'$' $$ : PID + bne .9 + +.9 sec +.99 rts +*-------------------------------------- +* S.FindVarPtr2 +* In: +* ZPQuickPtr2 -> NAME +* Out: +* CC: Found +* ZPQuickPtr1 -> ENV.NAME * ZPQuickPtr2 -> NAME * CS: Not Found * ZPQuickPtr1 -> PTR to Ending 0 * ZPQuickPtr2 -> NAME *-------------------------------------- -S.FindVar ldy #S.PS.hENV +S.FindVarPtr2 jsr S.InitEnvPtr1 Store ENV + bcs .99 + + lda (ZPQuickPtr1) + beq .9 end of ENV + +.1 cmp (ZPQuickPtr2) Same len as NAME? + bne .3 + + tay + +.2 lda (ZPQuickPtr1),y + cmp (ZPQuickPtr2),y + bne .3 + dey + bne .2 + clc + rts + +.3 jsr S.NextEnvPtr1 Skip NAME + jsr S.NextEnvPtr1 Skip VALUE + lda (ZPQuickPtr1) + bne .1 + +.9 sec +.99 rts +*-------------------------------------- +* S.DiscardVar +* In: +* ZPQuickPtr1 -> ENV.NAME to Discard +*-------------------------------------- +S.DiscardVarPtr1 + lda ZPQuickPtr1 Discard current NAME & VALUE definition + sec ZPQuickPtr1 -> NAME + adc (ZPQuickPtr1) add NAME+1 to ZPQuickPtr1 + sta ZPQuickPtr4 store it in ZPQuickPtr4 + lda #0 + adc ZPQuickPtr1+1 + sta ZPQuickPtr4+1 + + lda ZPQuickPtr4 add VALUE+1 to ZPQuickPtr4 + sec + adc (ZPQuickPtr4) + sta ZPQuickPtr4 + bcc .1 + inc ZPQuickPtr4+1 + +.1 ldy #0 + +.2 lda (ZPQuickPtr4),y Move back tail... + sta (ZPQuickPtr1),y + beq .8 ...until we move ending 0 + iny + bne .2 + inc ZPQuickPtr1+1 + inc ZPQuickPtr4+1 + bra .2 + +.8 rts +*-------------------------------------- +S.InitEnvPtr1 ldy #S.PS.hENV lda (pPs),y jsr S.GetMemPtrA >STYA ZPQuickPtr1 Store ENV - -.1 lda (ZPQuickPtr1) - beq .9 - ldy #0 -.2 iny - lda (ZPQuickPtr1),y - cmp #'=' End Of VAR Name ? - beq .4 -.3 cmp (ZPQuickPtr2),y - bne .7 - tya - cmp (ZPQuickPtr2) - bne .2 - iny - lda (ZPQuickPtr1),y - cmp #'=' End Of VAR Name ? - bne .3 -.4 dey - tya - cmp (ZPQuickPtr2) Y = VAR Name Len ? - beq .8 yes, found VAR -.7 lda (ZPQuickPtr1) no, go to next NAME=VALUE - sec - adc ZPQuickPtr1 - sta ZPQuickPtr1 - bcc .1 - inc ZPQuickPtr1+1 - bra .1 -.8 clc rts -.9 sec - rts +*-------------------------------------- +S.NextEnvPtr1 lda ZPQuickPtr1 + sec + adc (ZPQuickPtr1) + sta ZPQuickPtr1 + bcc .8 + inc ZPQuickPtr1+1 +.8 rts *-------------------------------------- MAN SAVE SYS/KERNEL.S.ENV diff --git a/SYS/KERNEL.S.FIO.txt b/SYS/KERNEL.S.FIO.txt index f1e6dca7..a4f992ab 100644 --- a/SYS/KERNEL.S.FIO.txt +++ b/SYS/KERNEL.S.FIO.txt @@ -31,75 +31,107 @@ S.CheckPrefixYA >STYA MLICALL.PARAMS+1 *-------------------------------------- * S.FileSearch * in : -* PULLB = hMem to Search Path (PSTRING) %LIB%;/SYS/SLIB -* PULLB = hMem to File Name (PSTRING) +* PULLW = PSTR to File Name (PSTRING) +* PULLW = PSTR to Search Path (PSTRING) %LIB%;/SYS/SLIB * out : -* A = hMem of FilePath (PSTRING) +* Y,A = PSTR to FilePath (PSTRING) +* X = hMem to FilePath *-------------------------------------- -S.FileSearch >PULLA Get Search path - jsr S.ExpandPStrA Expand it - bcc .10 - pha save error code - >PULLA discard file name - pla - sec - rts - -.10 sta S.FileSearch.hSrch Store Expanded path list to search - - >PULLB S.FileSearch.hFile Store Filename - - lda #1 - sta S.FileSearch.Idx Start At Token 1 - -.1 >PUSHB S.FileSearch.hSrch push expanded path list - >PUSHBI ';' - >PUSHB S.FileSearch.Idx Push Token IDX - - jsr S.PStrGetTkn Get token in A - bcs .98 - - sta S.FileSearch.hPath Store Token path - >PUSHB S.FileSearch.hFile push filename - >PUSHB S.FileSearch.hPath Push Token path - jsr S.PStrCat - bcs .97 - - sta S.FileSearch.hFull Store Full path (Token Path+filename) +S.FileSearch >PULLW ZPQuickPtr4 ZPQuickPtr1 trashed by ExpandPStrYA + >PULLYA Get Search list + jsr S.ExpandPStrYA Expand it + bcs .99 - jsr S.GetMemPtrA + stx S.FileSearch.hSrch + >STYA ZPQuickPtr2 expanded search list ; + + stz S.FileSearch.Index + +.1 stz KrnBuffer256 reset String + ldx #0 + + ldy S.FileSearch.Index + +.2 tya + cmp (ZPQuickPtr2) end of src string ? + beq .3 end of string, try it.... + iny + lda (ZPQuickPtr2),y + cmp #';' + beq .3 + inx + sta KrnBuffer256,x + bra .2 + +.3 txa + beq .98 String is empty....nothing to try + + sty S.FileSearch.Index save current index + + ldy #0 + +.4 iny + lda (ZPQuickPtr4),y Append Fiename... + inx + sta KrnBuffer256,x + tya + cmp (ZPQuickPtr4) + bne .4 + + stx KrnBuffer256 set string length + + >LDYAI KrnBuffer256 jsr S.MLIGetFileInfoYA - bcc .8 + bcs .1 Failed...retry next path... - lda S.FileSearch.hFull Discard this Full Path + lda S.FileSearch.hSrch Discard Expanded hSrch list jsr S.FreeMemA - lda S.FileSearch.hPath Discard Token path - jsr S.FreeMemA - - inc S.FileSearch.Idx Try next Token - bne .1 - - beq .98 go to discard Expanded path list - -.97 lda S.FileSearch.hPath Discard Token path - jsr S.FreeMemA - + >LDYAI KrnBuffer256 + jmp S.NewPStrYA + .98 lda S.FileSearch.hSrch Discard Expanded hSrch list jsr S.FreeMemA lda #SYSMGR.ERRFNF sec - rts - -.8 jsr .97 Dicard all except Full Path - lda S.FileSearch.hFull - clc - rts +.99 rts *-------------------------------------- +S.FileSearch.File .BS 2 S.FileSearch.hSrch .BS 1 -S.FileSearch.hFile .BS 1 -S.FileSearch.Idx .BS 1 -S.FileSearch.hPath .BS 1 -S.FileSearch.hFull .BS 1 +S.FileSearch.Index .BS 1 +*-------------------------------------- +* S.GetFullPathYA +* in : +* Y,A = Filename (PSTRING) +* out : +* Y,A = FullPath (PSTRING) +* X = hMem of FullPath +*-------------------------------------- +S.GetFullPathYA >STYA ZPQuickPtr3 Ptr1 & 2 used by StrCpy + lda (ZPQuickPtr3) + beq .9 + + stz KrnBuffer256 + + ldy #1 + lda (ZPQuickPtr3),y + cmp #'/' full path starting with '/'? + beq .1 yes, do not append to current prefix + + ldy #S.PS.hPREFIX + lda (pPs),y + jsr S.GetMemPtrA + >PUSHYA + >PUSHWI KrnBuffer256 + jsr S.PStrCpy + +.1 >PUSHW ZPQuickPtr3 + >PUSHWI KrnBuffer256 + jsr S.PStrCat + + >LDYAI KrnBuffer256 + jmp S.NewPStrYA +.9 sec + rts *-------------------------------------- * S.LoadFileYA * in : @@ -108,12 +140,9 @@ S.FileSearch.hFull .BS 1 * Y,A = File Length * X = hMem of Loaded File *-------------------------------------- -S.LoadFileYA jsr S.ExpandPStrYA - sta S.LoadFile.hExp - jsr S.GetMemPtrA - jsr S.MLIOpenYA +S.LoadFileYA jsr S.MLIOpenYA bcc .10 - jmp .99 + rts .10 sta S.LoadFile.hRef save ref_num stx S.LoadFile.hBuf save Prodos Buffer for freemem @@ -132,25 +161,16 @@ S.LoadFileYA jsr S.ExpandPStrYA jsr S.GetMem bcs .98 - phy save Ptr - pha + >STYA S.LoadFile.Mem + stx S.LoadFile.hMem save Segment hMem >PUSHW S.LoadFile.Len Push Length for S.MLIRead - pla restore Dest PTR - ply - >PUSHYA and push for S.MLIRead + >PUSHW S.LoadFile.Mem Push PTR >PUSHB S.LoadFile.hRef Push ref_num jsr S.MLIRead bcs .97 - lda S.LoadFile.hRef - jsr S.MLICloseA - - lda S.LoadFile.hBuf - jsr S.FreeMemA Discard ProDOS IO Buffer - - lda S.LoadFile.hExp Discard Expanded String - jsr S.FreeMemA + jsr .98 Close File.... >LDYA S.LoadFile.Len Return File Length... ldx S.LoadFile.hMem ...and hMem to Caller @@ -169,17 +189,13 @@ S.LoadFileYA jsr S.ExpandPStrYA jsr S.FreeMemA ProDOS IO Buffer pla -.99 pha - lda S.LoadFile.hExp - jsr S.FreeMemA - pla - sec +.99 sec rts *-------------------------------------- S.LoadFile.hRef .BS 1 S.LoadFile.hBuf .BS 1 -S.LoadFile.hExp .BS 1 S.LoadFile.hMem .BS 1 +S.LoadFile.Mem .BS 2 S.LoadFile.Len .BS 2 *-------------------------------------- * S.ListDirInitYA @@ -229,6 +245,8 @@ S.ListDirInitYA >STYA R.BX Store path >LDYA R.BX jsr S.NewPStrYA bcs .99 + + txa ldy #S.LISTDIR.hPATH sta (R.CX),y diff --git a/SYS/KERNEL.S.GP.txt b/SYS/KERNEL.S.GP.txt index ce93af4f..54d0514f 100644 --- a/SYS/KERNEL.S.GP.txt +++ b/SYS/KERNEL.S.GP.txt @@ -32,9 +32,10 @@ A2osX.GP.Start jmp (KERNEL.SYSCALL,x) jmp BrkHandler .BS $BE10-* *-------------------------------------- - jmp (pDev) pDevJmp jmp (pCode) pCodeJmp jmp (pLib) pLibJmp + jmp (pDrv) pDrvJmp + jmp (pDev) pDevJmp .BS $BE20-* *-------------------------------------- GO.Reset jsr GO.AUXLC diff --git a/SYS/KERNEL.S.INIT.txt b/SYS/KERNEL.S.INIT.txt index 7fcaa848..049e1cac 100644 --- a/SYS/KERNEL.S.INIT.txt +++ b/SYS/KERNEL.S.INIT.txt @@ -139,50 +139,45 @@ S.TskMgrInit stz TSKMGR.LASTID >PUSHWI K.ENV.SIZE get a buffer for ENV >PUSHBI S.MEM.F.INIT0 make sure blank >SYSCALL SYS.GetMem create it... - bcs * + bcs .9 txa ldy #S.PS.hENV sta (pPs),y - + >LDYAI TmpBuffer256 >SYSCALL SYS.MLIGetPrefixYA - bcs * + bcs .9 >LDYAI TmpBuffer256 >SYSCALL SYS.NewPStrYA - bcs * + bcs .9 + txa ldy #S.PS.hPREFIX sta (pPs),y >PUSHWI TmpBuffer256 push ENV value >PUSHWI I.ENV.A2osX push ENV name - >SYSCALL SYS.SetEnvVarP + >SYSCALL SYS.SetEnv bcs .9 - >PUSHWI I.ENV.PATH.VAL - >PUSHWI I.ENV.PATH - >SYSCALL SYS.SetEnvVarP + >LDYAI I.ENV.PATH + >SYSCALL SYS.PutEnvYA bcs .9 - >PUSHWI I.ENV.LIB.VAL - >PUSHWI I.ENV.LIB - >SYSCALL SYS.SetEnvVarP + >LDYAI I.ENV.LIB + >SYSCALL SYS.PutEnvYA bcs .9 - >PUSHWI I.ENV.DRV.VAL - >PUSHWI I.ENV.DRV - >SYSCALL SYS.SetEnvVarP + >LDYAI I.ENV.DRV + >SYSCALL SYS.PutEnvYA .9 rts *-------------------------------------- I.ENV.A2osX >PSTRING "A2OSX" -I.ENV.PATH >PSTRING "PATH" -I.ENV.PATH.VAL >PSTRING "${A2OSX}SBIN/;${A2OSX}BIN/" -I.ENV.LIB >PSTRING "LIB" -I.ENV.LIB.VAL >PSTRING "${A2OSX}LIB/" -I.ENV.DRV >PSTRING "DRV" -I.ENV.DRV.VAL >PSTRING "${A2OSX}DRV/" +I.ENV.PATH >PSTRING "PATH=${A2OSX}SBIN/;${A2OSX}BIN/" +I.ENV.LIB >PSTRING "LIB=${A2OSX}LIB/" +I.ENV.DRV >PSTRING "DRV=${A2OSX}DRV/" *-------------------------------------- MAN SAVE SYS/KERNEL.S.INIT diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index f21705c0..1e6bd477 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -17,31 +17,31 @@ KERNEL.SYSCALL .DA S.GetMem $00 .DA 0 *-------------------------------------- .DA S.NewPStrYA $10 - .DA 0 + .DA S.PStrCpy .DA S.PStrCat + .DA S.PStrUprYA .DA 0 - .DA S.PStrGetTkn - .DA 0 - .DA S.GetArgCount - .DA S.GetArgA + .DA S.PStr2StrArrayYA + .DA 0 + .DA 0 *-------------------------------------- - .DA 0 $20 + .DA S.LoadDrvYA $20 .DA S.LoadLibYA .DA S.UnloadLibA - .DA S.LoadDrvA + .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 *-------------------------------------- - .DA S.ExpandPStrA $30 + .DA 0 $30 .DA S.ExpandPStrYA + .DA S.GetArgC + .DA S.GetArgA .DA S.PutEnvYA - .DA S.GetEnvVarYA - .DA S.SetEnvVarH - .DA S.SetEnvVarP - .DA S.DelEnvVarA - .DA S.DelEnvVarYA + .DA S.SetEnv + .DA S.GetEnvYA + .DA S.UnsetEnvYA *-------------------------------------- .DA S.MLICreateFile $40 .DA 0 @@ -99,7 +99,7 @@ KERNEL.SYSCALL .DA S.GetMem $00 *-------------------------------------- .DA S.CheckPrefixYA $A0 .DA S.FileSearch - .DA 0 + .DA S.GetFullPathYA .DA S.LoadFileYA .DA 0 .DA S.ListDirInitYA diff --git a/SYS/KERNEL.S.LIB.txt b/SYS/KERNEL.S.LIB.txt index 56c80aa2..56062dca 100644 --- a/SYS/KERNEL.S.LIB.txt +++ b/SYS/KERNEL.S.LIB.txt @@ -11,45 +11,24 @@ AUTO 6 * out : * A = hMem To loaded LIB *-------------------------------------- -S.LoadLibYA jsr S.NewPStrYA - bcs .99 - - sta S.LoadLibYA.hLibName save LibName hMem for discard - jsr S.LoadLibA - - php save error status - pha save error code/hMem - lda S.LoadLibYA.hLibName - jsr S.FreeMemA discard STR hMem - pla get back error code/hMem - plp ..and error status -.99 rts -*-------------------------------------- -S.LoadLibYA.hLibName .BS 1 -*-------------------------------------- -* S.LoadLibA -* in : -* A = hMem To Lib Name -* out : -* A = hMem of Loaded Lib -*-------------------------------------- -S.LoadLibA sta S.LoadLibA.hName save libname for S.FileSearch - +S.LoadLibYA >STYA S.LoadLib.Name save libname for S.FileSearch >LDYAI ENV.LIB push ENVNAME=LIB - jsr S.GetEnvVarYA get value for ENV=LIB + jsr S.GetEnvYA get value for ENV=LIB bcs .99 - sta S.LoadLibA.hSrch save hMem to LIB VALUE + >PUSHYA Push $LIB value - >PUSHB S.LoadLibA.hName - >PUSHB S.LoadLibA.hSrch + >PUSHW S.LoadLib.Name + jsr S.FileSearch find libname in $LIB + bcs .99 + + stx S.LoadLib.hFullName + + jsr S.LoadBinYA Y,A = filename full path bcs .98 - sta S.LoadLibA.hPath - jsr S.LoadBinA A = hMem of filename full path - bcs .97 - stx S.LoadLibA.hMem + stx S.LoadLib.hMem >STYA pLib ldx #LIBMGR.LOAD @@ -57,28 +36,28 @@ S.LoadLibA sta S.LoadLibA.hName save libname for S.FileSearch bcs .97 - jsr .97 + jsr .98 Cleanup... - lda S.LoadLibA.hMem + lda S.LoadLib.hMem clc rts .97 pha - lda S.LoadLibA.hPath discard LIB PATH + lda S.LoadLib.hMem jsr S.FreeMemA pla .98 pha - lda S.LoadLibA.hSrch discard LIB VALUE + lda S.LoadLib.hFullName jsr S.FreeMemA pla + sec .99 rts *-------------------------------------- -S.LoadLibA.hName .BS 1 -S.LoadLibA.hSrch .BS 1 -S.LoadLibA.hPath .BS 1 -S.LoadLibA.hMem .BS 1 +S.LoadLib.Name .BS 2 +S.LoadLib.hFullName .BS 1 +S.LoadLib.hMem .BS 1 *-------------------------------------- * S.UnloadLibA * in : diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index fd98d6ad..19b3133a 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -8,10 +8,10 @@ AUTO 6 * !!!!!!!! DO NOT USE VCPU16 !!!!!!!! * !!!!!! DO NOT USE ZPQuickPTRs !!!!! *-------------------------------------- -ZPMemMgrSPtr .EQ ZPMemMgr Pointer To Slot selected -ZPMemMgrTmp1 .EQ ZPMemMgr+2 -ZPMemMgrTmp2 .EQ ZPMemMgr+4 -ZPMemMgrTmp3 .EQ ZPMemMgr+6 +ZPMemMgrSPtr .EQ ZPMEMMGR Pointer To Slot selected +ZPMemMgrTmp1 .EQ ZPMEMMGR+2 +ZPMemMgrTmp2 .EQ ZPMEMMGR+4 +ZPMemMgrTmp3 .EQ ZPMEMMGR+6 *-------------------------------------- * TODO : * - Create a 256 bytes table diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt new file mode 100644 index 00000000..b0cbfce9 --- /dev/null +++ b/SYS/KERNEL.S.PS.txt @@ -0,0 +1,442 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* S.ExecProcessNewEnvYA +* S.ExecProcessYA (Blocking Parent PID) +* S.CreateProcessNewEnvYA +* S.CreateProcessYA (Non Blocking) +* in : +* Y,A = PTR To Cmd Line +* out : +* A = Child PSID +*-------------------------------------- +S.ExecProcessNewEnvYA + ldx #S.PS.F.ENV + .HS 2C bit abs +*-------------------------------------- +S.ExecProcessYA ldx #0 + jsr S.CreateProcess + bcs .9 terminated, do not set PID as HOLD + + ldy #S.PS.CID + sta (pPs),y + + pha Save Child PID + lda (pPs) + ora #S.PS.F.HOLD + sta (pPs) + pla Get Back PID + + clc +.9 rts +*-------------------------------------- +S.CreateProcessNewEnvYA + ldx #S.PS.F.ENV + .HS 2C bit abs +*-------------------------------------- +S.CreateProcessYA + ldx #0 +S.CreateProcess stx S.CreateChildProcess.Flags + + jsr S.ExpandPStrYA + bcs .99 + + stx S.CreateProcess.hCmdLine + >STYA S.CreateProcess.CmdLine + + jsr S.CreateChildProcess + bcs .98 + + sta S.CreateProcess.CPSID + jsr S.SelectProcessA + + jsr S.InitProcess + bcs .97 Init Failed or exit? + + ldy #S.PS.PID switch back to Parent Process + lda (pPs),y + + jsr S.SelectProcessA + + lda S.CreateProcess.CPSID + clc + rts + +.97 pha save error code + ldy #S.PS.PID switch back to Parent Process + lda (pPs),y + jsr S.SelectProcessA + + lda S.CreateProcess.CPSID + jsr S.FreeProcessA + pla get back error code + +.98 pha + lda S.CreateProcess.hCmdLine + jsr S.FreeMemA + pla + +.99 sec + rts +*-------------------------------------- +S.CreateProcess.hCmdLine .BS 1 +S.CreateProcess.CmdLine .BS 2 +S.CreateProcess.CPSID .BS 1 +*-------------------------------------- +* S.GetPSByIDA +* In : +* A = PID +* Out : +* Y,A = PTR to TSKSLOT +*-------------------------------------- +S.GetPSByIDA sta S.GetPSByIDA.PS + + >LDYAI TskMgr.Table + >STYA ZPQuickPtr1 + + lda S.GetPSByIDA.PS + beq .8 + + ldx #0 + +.1 inx + lda ZPQuickPtr1 + clc + adc #S.PS.SIZE + sta ZPQuickPtr1 + bcc .2 + inc ZPQuickPtr1+1 + +.2 lda (ZPQuickPtr1) + bpl .3 + + ldy #S.PS.ID + lda (ZPQuickPtr1),y + cmp S.GetPSByIDA.PS + beq .8 + +.3 cpx TSKMGR.SIZE + bne .1 + +.9 lda #TSKMGR.ERRNSP + sec + rts + +.8 >LDYA ZPQuickPtr1 + clc + rts +*-------------------------------------- +S.GetPSByIDA.PS .BS 1 +*-------------------------------------- +S.Sleep pla get PC LO + sec + sbc pCode + ldy #S.PS.PC + sta (pPs),y + + pla get PC HI + sbc pCode+1 + iny + sta (pPs),y + lda (pPs) + ora #S.PS.F.SLEEP + sta (pPs) + clc No error, + rts back to Kernel +*-------------------------------------- +* PRIVATE +*-------------------------------------- +* S.CreateChildProcess +* in : +* out : +* A = PSID +* we cannot use ZPQuickPtrs1 & 2 +* because of calling S.NewPStrYA & S.DupEnvA +*-------------------------------------- +S.CreateChildProcess + >LDYAI TskMgr.Table+S.PS.SIZE + >STYA ZPQuickPtr3 + + ldx #0 + +.1 inx + cpx TSKMGR.SIZE + beq .2 + + lda (ZPQuickPtr3) Found an empty slot + bpl .3 + lda ZPQuickPtr3 + clc + adc #S.PS.SIZE + sta ZPQuickPtr3 + bcc .1 + inc ZPQuickPtr3+1 + + bra .1 + +.2 cpx #K.PS.MAX + bne .30 + + lda #TSKMGR.ERROOH + sec + rts + +.30 inc TSKMGR.SIZE + +.3 lda #S.PS.F.INUSE + ora S.CreateChildProcess.Flags + sta (ZPQuickPtr3) + +.4 inc TSKMGR.LASTID Get a PSID not alredy running + beq .4 not = 0 + lda TSKMGR.LASTID + jsr S.GetPSByIDA + bcc .4 + + ldy #S.PS.ID + lda TSKMGR.LASTID + sta (ZPQuickPtr3),y + + lda #0 + ldy #S.PS.hCS +.5 sta (ZPQuickPtr3),y Blank Everything in this S.PS + 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 + jsr S.GetMemPtrA + jsr S.NewPStrYA + bcs .99 + + txa + ldy #S.PS.hPREFIX + sta (ZPQuickPtr3),y + + ldy #S.PS.hENV ...and hENV from parent PS + lda (pPs),y + jsr S.DupEnvA + bcs .99 + + ldy #S.PS.hENV + sta (ZPQuickPtr3),y + bra .8 + +.6 ldy #S.PS.hPREFIX reuse same hPREFIX... + lda (pPs),y + sta (ZPQuickPtr3),y + + ldy #S.PS.hENV ...and hENV from parent PS + lda (pPs),y + sta (ZPQuickPtr3),y + +.8 ldy #S.PS.hINDEV +.81 lda (pPs),y + sta (ZPQuickPtr3),y + iny + cpy #S.PS.hERRDEV+1 + bne .81 + + ldy #S.PS.ID + lda (pPs),y + + ldy #S.PS.PID + sta (ZPQuickPtr3),y + + lda TSKMGR.LASTID + clc Exit with A=PSID + rts + +.99 sec + rts +*-------------------------------------- +S.CreateChildProcess.Flags + .BS 1 +*-------------------------------------- +* S.InitProcess +* In : +* A = hMem To Full Cmd Line +*-------------------------------------- +S.InitProcess >LDYA S.CreateProcess.CmdLine + jsr S.PStr2StrArrayYA + bcs .9 + + phy save PTR to StrArray... + pha + + txa + ldy #S.PS.hCMDLINE + sta (pPs),y + + pla Restore PTR... + ply + + jsr S.LoadBinYA A = BinPath hMem + bcs .9 + + >STYA pCode save PTR to Code Segment + txa + ldy #S.PS.hCS + sta (pPs),y save CS hMem in TSKSLOT + + ldy #H.BIN.BIN.DS.SIZE+1 + lda (pCode),y Load DS.SIZE HI + tax + dey + ora (pCode),y + + beq .2 DS.SIZE=0... + + lda (pCode),y + >PUSHAX Push DS.SIZE + >PUSHBI S.MEM.F.INIT0 Clear DS + jsr S.GetMem + bcs .9 + + >STYA pData + txa + ldy #S.PS.hDS + sta (pPs),y save DS hMem in TSKSLOT + +.2 lda (pCode) + cmp #H.BIN.HEADER.BIN65 + bne * + + ldx #TSKMGR.INIT + jsr pCodeJmp Call INIT function + bcc .9 + + pha save error code + ldx #TSKMGR.QUIT + jsr pCodeJmp Call QUIT function + pla get back error code + sec +.9 rts +*-------------------------------------- +* S.SelectProcessA +* In : A=PSID +*-------------------------------------- +S.SelectProcessA + tay + bne S.SelectProcessN +S.SelectProcess0 + >LDYAI TskMgr.Table Make PS #0 as current process + >STYA pPs + bra S.SelectProcessDev +S.SelectProcessN + jsr S.GetPSByIDA + bcs * + >STYA pPs + +S.SelectProcess ldy #S.PS.hCS + lda (pPs),y + jsr S.GetMemPtrA + >STYA pCode + + ldy #S.PS.hDS + lda (pPs),y + beq S.SelectProcessDev + + jsr S.GetMemPtrA + >STYA pData + +S.SelectProcessDev + ldy #S.PS.hOUTDEV + lda (pPs),y + beq .8 + + jsr S.GetDevByIDA + >STYA pDev + +.8 clc + rts +*-------------------------------------- +* S.FreeProcessA +* In : A = PID to free +*-------------------------------------- +S.FreeProcessA jsr S.GetPSByIDA + bcs * + >STYA ZPQuickPtr1 + + ldy #S.PS.hCMDLINE + lda (ZPQuickPtr1),y + beq .2 + + jsr S.FreeMemA + + lda (ZPQuickPtr1) get S.PS.F + and #S.PS.F.ENV do we have to discard duplicated env & prefix ? + beq .4 + +.2 ldy #S.PS.hENV + lda (ZPQuickPtr1),y + beq .3 + + jsr S.FreeMemA + +.3 ldy #S.PS.hPREFIX + lda (ZPQuickPtr1),y + beq .4 + + jsr S.FreeMemA + +.4 ldy #S.PS.hDS + lda (ZPQuickPtr1),y + beq .5 + + jsr S.FreeMemA + +.5 ldy #S.PS.hCS + lda (ZPQuickPtr1),y + beq .8 + + jsr S.FreeMemA + +.8 lda #0 + sta (ZPQuickPtr1) Mark TSKSLOT as free + clc + rts +*-------------------------------------- +* S.DupEnvA +* In: +* A = ENV hMem To Duplicate +* Out: +* A = hMem to new ENV +*-------------------------------------- +S.DupEnvA jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + >PUSHWI K.ENV.SIZE + >PUSHBI 0 + jsr S.GetMem + bcs .9 + >STYA ZPQuickPtr2 + + ldy #0 + +.1 lda (ZPQuickPtr1),y + sta (ZPQuickPtr2),y + beq .8 + + iny + bne .1 + inc ZPQuickPtr1+1 + inc ZPQuickPtr2+1 + bra .1 + +.8 txa + clc +.9 rts +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.PS +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.REL.txt b/SYS/KERNEL.S.REL.txt index 50dbd7f6..fe397027 100644 --- a/SYS/KERNEL.S.REL.txt +++ b/SYS/KERNEL.S.REL.txt @@ -5,125 +5,7 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* S.BinRelocateYA : -* YA = Ptr to Code -* R.AX = Code Length -* R.BX = Range Start address to relocate -* R.CX = Range End address to relocate -* R.DX = offset to apply to all abs addresses between R.BX and R.CX -*-------------------------------------- -S.BinRelocateYA >STYA ZPQuickPtr1 - - ldy #H.BIN.JMP relocate Main JMP - lda (ZPQuickPtr1),y - clc - adc R.DL - sta (ZPQuickPtr1),y - - iny - lda (ZPQuickPtr1),y - adc R.DH - sta (ZPQuickPtr1),y - - ldy #H.BIN.RELOC.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes) - bra S.JmpRelocate - -S.DrvRelocateYA >STYA ZPQuickPtr1 - - ldy #0 - -S.JmpRelocate lda (ZPQuickPtr1),y Start Relocate JMP table - tax - iny - ora (ZPQuickPtr1),y - beq S.CodeRelocate $0000 = end of table - - dey - txa - clc - adc R.DL - sta (ZPQuickPtr1),y - - iny - lda (ZPQuickPtr1),y - adc R.DH - sta (ZPQuickPtr1),y - - iny - - bra S.JmpRelocate - -S.CodeRelocate lda ZPQuickPtr1 - clc - adc R.AL Make ZPQuickPtr2=End of code - sta ZPQuickPtr2 =ZPQuickPtr1+AX (code len) - lda ZPQuickPtr1+1 - adc R.AH - sta ZPQuickPtr2+1 - - iny - tya add current offset in Y to Ptr - clc - adc ZPQuickPtr1 - sta ZPQuickPtr1 - bcc .5 - inc ZPQuickPtr1+1 ZPQuickPtr1=Current Code PTR - clc - -.5 lda (ZPQuickPtr1) get OPCODE - tax - lda OPCODES,x get OPCODE definition - bpl .7 abs addressing? - - and #3 save Opcode length... - pha - - ldy #1 - lda (ZPQuickPtr1),y Get LO - sec - sbc R.BL - iny - lda (ZPQuickPtr1),y Get HI - sbc R.BH - bcc .6 addr < AX, out of range - - dey - lda (ZPQuickPtr1),y Get LO - sec - sbc R.CL - iny - lda (ZPQuickPtr1),y Get HI - sbc R.CH - bcs .6 addr > CX, out of range - - dey - lda (ZPQuickPtr1),y Get LO - clc - adc R.DL add DX to abs address - sta (ZPQuickPtr1),y store relocated addr LO - iny - lda (ZPQuickPtr1),y Get HI - adc R.DH - sta (ZPQuickPtr1),y store relocated addr HI - -.6 pla - -.7 clc A = OPCODE length - adc ZPQuickPtr1 - sta ZPQuickPtr1 - bcc .8 - inc ZPQuickPtr1+1 - -.8 lda ZPQuickPtr1 is Current PTR < Code Limit ? - sec - sbc ZPQuickPtr2 - lda ZPQuickPtr1+1 - sbc ZPQuickPtr2+1 - bcc .5 yes, continue relocating - - clc - rts -*-------------------------------------- +* S.InsDrv * pDrv = .DRV File Loaded Address *-------------------------------------- S.InsDrv ldy #H.BIN.DRV.CODE.LEN @@ -136,28 +18,28 @@ S.InsDrv ldy #H.BIN.DRV.CODE.LEN ldy #H.BIN.DRV.CODE.O lda (pDrv),y clc - adc S.LoadBinA.AuxType + adc S.LoadBin.AuxType sta R.BL iny lda (pDrv),y - adc S.LoadBinA.AuxType+1 + adc S.LoadBin.AuxType+1 sta R.BH set BX=End Of Code - lda S.LoadBinA.AuxType + lda S.LoadBin.AuxType clc - adc S.LoadBinA.FileLen + adc S.LoadBin.FileLen sta R.CL - lda S.LoadBinA.AuxType+1 - adc S.LoadBinA.FileLen+1 + lda S.LoadBin.AuxType+1 + adc S.LoadBin.FileLen+1 sta R.CH set CX=End Of Range ldy #H.BIN.DRV.CODE.O - lda S.LoadBinA.FileLen + lda S.LoadBin.FileLen sec sbc (pDrv),y sta S.InsDrv.DRVLen iny - lda S.LoadBinA.FileLen+1 + lda S.LoadBin.FileLen+1 sbc (pDrv),y sta S.InsDrv.DRVLen+1 Compute DRV Len @@ -313,6 +195,125 @@ S.InsDrv.Move ldy #H.BIN.DEV.HEADER.O S.InsDrv.DrvLen .BS 2 S.InsDrv.DrvEnd .BS 2 *-------------------------------------- +* S.BinRelocateYA : +* YA = Ptr to Code +* R.AX = Code Length +* R.BX = Range Start address to relocate +* R.CX = Range End address to relocate +* R.DX = offset to apply to all abs addresses between R.BX and R.CX +*-------------------------------------- +S.BinRelocateYA >STYA ZPQuickPtr1 + + ldy #H.BIN.JMP relocate Main JMP + lda (ZPQuickPtr1),y + clc + adc R.DL + sta (ZPQuickPtr1),y + + iny + lda (ZPQuickPtr1),y + adc R.DH + sta (ZPQuickPtr1),y + + ldy #H.BIN.RELOC.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes) + bra S.JmpRelocate + +S.DrvRelocateYA >STYA ZPQuickPtr1 + + ldy #0 + +S.JmpRelocate lda (ZPQuickPtr1),y Start Relocate JMP table + tax + iny + ora (ZPQuickPtr1),y + beq S.CodeRelocate $0000 = end of table + + dey + txa + clc + adc R.DL + sta (ZPQuickPtr1),y + + iny + lda (ZPQuickPtr1),y + adc R.DH + sta (ZPQuickPtr1),y + + iny + + bra S.JmpRelocate + +S.CodeRelocate lda ZPQuickPtr1 + clc + adc R.AL Make ZPQuickPtr2=End of code + sta ZPQuickPtr2 =ZPQuickPtr1+AX (code len) + lda ZPQuickPtr1+1 + adc R.AH + sta ZPQuickPtr2+1 + + iny + tya add current offset in Y to Ptr + clc + adc ZPQuickPtr1 + sta ZPQuickPtr1 + bcc .5 + inc ZPQuickPtr1+1 ZPQuickPtr1=Current Code PTR + clc + +.5 lda (ZPQuickPtr1) get OPCODE + tax + lda OPCODES,x get OPCODE definition + bpl .7 abs addressing? + + and #3 save Opcode length... + pha + + ldy #1 + lda (ZPQuickPtr1),y Get LO + sec + sbc R.BL + iny + lda (ZPQuickPtr1),y Get HI + sbc R.BH + bcc .6 addr < AX, out of range + + dey + lda (ZPQuickPtr1),y Get LO + sec + sbc R.CL + iny + lda (ZPQuickPtr1),y Get HI + sbc R.CH + bcs .6 addr > CX, out of range + + dey + lda (ZPQuickPtr1),y Get LO + clc + adc R.DL add DX to abs address + sta (ZPQuickPtr1),y store relocated addr LO + iny + lda (ZPQuickPtr1),y Get HI + adc R.DH + sta (ZPQuickPtr1),y store relocated addr HI + +.6 pla + +.7 clc A = OPCODE length + adc ZPQuickPtr1 + sta ZPQuickPtr1 + bcc .8 + inc ZPQuickPtr1+1 + +.8 lda ZPQuickPtr1 is Current PTR < Code Limit ? + sec + sbc ZPQuickPtr2 + lda ZPQuickPtr1+1 + sbc ZPQuickPtr2+1 + bcc .5 yes, continue relocating + + clc + rts +*-------------------------------------- * 65C02 OPCODES * Bit 7 : 1 absolute addressing * Bit 1-0 : opcode + @ length diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index 6fc88554..97dcb33d 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -7,9 +7,10 @@ AUTO 6 *-------------------------------------- * S.NewPStrYA * IN: -* PULLW = PTR to buffer +* Y,A = PTR to buffer * OUT: -* A = hMem to S (PSTRING) +* Y,A = PTR to String +* X = hMem (PSTRING) *-------------------------------------- S.NewPStrYA >STYA ZPQuickPtr1 lda (ZPQuickPtr1) @@ -17,73 +18,103 @@ S.NewPStrYA >STYA ZPQuickPtr1 tay lda #0 Y,A = len of new string >PUSHYA - >PUSHA 0 = no option + >PUSHBI 0 0 = no option jsr S.GetMem bcs .9 - phx + >STYA ZPQuickPtr2 + + jsr S.PStrCpyPtr1Ptr2 + + >LDYA ZPQuickPtr2 + + clc + rts + +.9 sec + rts +*-------------------------------------- +* S.PStrCpy +* IN: +* PULLW = PSTR to DST (PSTRING) +* PULLW = PSTR to SRC (PSTRING) +* OUT: +* DST = SRC (PSTRING) +*-------------------------------------- +S.PStrCpy >PULLW ZPQuickPtr2 save DST + >PULLW ZPQuickPtr1 save SRC + +S.PStrCpyPtr1Ptr2 lda (ZPQuickPtr1) sta (ZPQuickPtr2) tay beq .2 + .1 lda (ZPQuickPtr1),y sta (ZPQuickPtr2),y dey bne .1 -.2 pla - clc - rts -.9 sec + +.2 clc rts *-------------------------------------- * S.PStrCat * IN: -* PULLB = hMem to S1 (PSTRING) -* PULLB = hMem to S2 (PSTRING) +* PULLW = PSTR to DST (PSTRING) +* PULLW = PSTR to SRC (PSTRING) * OUT: -* A = hMem to S1+S2 (PSTRING) +* DST = DST+SRC (PSTRING) *-------------------------------------- -S.PStrCat >PULLA - jsr S.GetMemPtrA - >STYA ZPQuickPtr1 save S1 - >PULLA - jsr S.GetMemPtrA - >STYA ZPQuickPtr2 save S2 - lda (ZPQuickPtr1) Compute length of new path = S1 + S2 + 1 - sec - adc (ZPQuickPtr2) - tay - lda #0 Y,A = len of new string - >PUSHYA - >PUSHA 0 = no option - jsr S.GetMem - bcs .9 OOM error - >STYA ZPQuickPtr3 - phx save New hMem +S.PStrCat >PULLW ZPQuickPtr2 save DST + >PULLW ZPQuickPtr1 save SRC + lda (ZPQuickPtr1) tax - ldy #0 -.2 iny - lda (ZPQuickPtr1),y - sta (ZPQuickPtr3),y - dex + + lda (ZPQuickPtr2) + tay + +.1 cpy #255 + beq .8 + + iny + + inc ZPQuickPtr1 bne .2 - lda (ZPQuickPtr2) - tax -.3 inc ZPQuickPtr2 - bne .4 - inc ZPQuickPtr2+1 -.4 iny - lda (ZPQuickPtr2) - sta (ZPQuickPtr3),y + inc ZPQuickPtr1+1 + +.2 lda (ZPQuickPtr1) + sta (ZPQuickPtr2),y dex - bne .3 - tya - sta (ZPQuickPtr3) - pla returns A = new hMem + bne .1 + +.8 tya + sta (ZPQuickPtr2) clc rts -.9 sec +*-------------------------------------- +* S.PStrUpr +* IN: +* Y,A = PTR to String (PSTRING) +* OUT: +* Uppercased String in Buffer +*-------------------------------------- +S.PStrUprYA >STYA ZPQuickPtr1 + + lda (ZPQuickPtr1) + tay + +.1 lda (ZPQuickPtr1),y convert to UPPERCASE + cmp #'a' + bcc .2 + cmp #'z'+1 + bcs .2 + eor #$20 + sta (ZPQuickPtr1),y +.2 dey + bne .1 + + clc rts *-------------------------------------- * S.PStrMatch @@ -160,158 +191,81 @@ S.PStrMatch >PULLW ZPQuickPtr2 pull String .9 sec rts *-------------------------------------- -* S.PStrGetTkn -* IN: -* PULLB = Token IDX -* 0: "Split mode": first token + remaining -* !0: "Std Mode": Return token # -* PULLB = SEP char -* PULLB = hMem to PSTRING -* OUT: -* A = hMem to Token (PSTRING) -* X = hMem to Remaining String After Token "Split Mode" +* S.PStr2StrArrayYA +* In : +* Y,A = PTR to String +* Out : +* Y,A = PTR to StrArray +* X = hMem *-------------------------------------- -S.PStrGetTkn >PULLA Get IDX - sta S.PStrGetTkn.IDX - >PULLA Get SEP - sta S.PStrGetTkn.SEP - >PULLA Get PStr - jsr S.GetMemPtrA +S.PStr2StrArrayYA >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) Get mem size STRLEN+1 + ldx #0 + inc + bne .1 + inx -S.PStrGetTkn1 ldx #0 init token count to 0 - ldy #0 - stz S.PStrGetTkn.START init INTOKEN start to 0 -.1 iny - lda (ZPQuickPtr1),y - and #$7F - cmp S.PStrGetTkn.SEP char=SEP ? - bne .3 no, start a new token if not alredy in - lda S.PStrGetTkn.START SEP:in INTOKEN ? - beq .4 no, skip this SEP - inx yes, increase token count - lda S.PStrGetTkn.IDX requested token=0 ? - beq .71 yes, we are in "split mode" - cpx S.PStrGetTkn.IDX no,is current X=requested IDX? - beq .71 - stz S.PStrGetTkn.START reset in INTOKEN start - bra .4 -.3 lda S.PStrGetTkn.START char:already INTOKEN ? - bne .4 yes, keep existing start index - sty S.PStrGetTkn.START mark begining of token -.4 tya - cmp (ZPQuickPtr1) end of string ? - bne .1 no, get next one - lda S.PStrGetTkn.START INTOKEN? - beq .6 - inx yes, last one is ending with string -.6 lda S.PStrGetTkn.IDX split mode ? - beq .7 - cpx S.PStrGetTkn.IDX is token = requested? - beq .7 - sec End of String reached, no matching token -.61 rts +.1 >PUSHAX + >PUSHBI 0 + jsr S.GetMem + bcs .9 + phx save hMem + phy save PTR.LO + pha save PTR.HI + >STYA ZPQuickPtr2 -.71 dey move back yo end of token before this SEP -.7 sty S.PStrGetTkn.END we have matching token (or 1st one in split mode) at [START,END] - tya compute token len=Y-END - sec - sbc S.PStrGetTkn.START - inc +1 - inc +1 for string len - tay - lda #0 - >PUSHYA Get a hMem for this token - >PUSHA 0 = no option - jsr S.GetMem - bcs .61 - phx save hMem - >STYA ZPQuickPtr2 - lda S.PStrGetTkn.END - sec - sbc S.PStrGetTkn.START - inc - sta (ZPQuickPtr2) set this string length - ldy S.PStrGetTkn.START - dey -.8 iny - inc ZPQuickPtr2 - bne .9 - inc ZPQuickPtr2+1 -.9 lda (ZPQuickPtr1),y - sta (ZPQuickPtr2) - cpy S.PStrGetTkn.END - bne .8 - lda S.PStrGetTkn.IDX requested token=0 ? - bne .87 - tya yes, we are in "split mode" - cmp (ZPQuickPtr1) Remaining chars ? - beq .87 -.10 iny move to next char - lda (ZPQuickPtr1),y - cmp S.PStrGetTkn.SEP char=SEP? - bne .11 - tya - cmp (ZPQuickPtr1) last one ? - bne .10 - bra .87 yes, nothing to return -.11 sty S.PStrGetTkn.END S.PStrGetTkn.END=1st non SEP char - lda (ZPQuickPtr1) compute reamining len=Y-ZPQuickPtr1+1 - sec - sbc S.PStrGetTkn.END - inc - inc +1 for string len - tay - lda #0 - >PUSHYA Get a hMem for remaining string - >PUSHA 0 = no option - jsr S.GetMem - bcs .98 - phx save hMem - >STYA ZPQuickPtr2 lda (ZPQuickPtr1) + tax count in src string + beq .8 + + ldy #0 reset index in dst token + +.3 inc ZPQuickPtr1 get... + bne .4 + inc ZPQuickPtr1+1 +.4 lda (ZPQuickPtr1) ...next char + + cmp #' ' found a space ? + bne .6 + + tya in a token ? + beq .7 no, skip & go to next char + + sta (ZPQuickPtr2) yes, set this token len sec - sbcS.PStrGetTkn.END - inc - sta (ZPQuickPtr2) - ldy S.PStrGetTkn.END - dey -.12 iny - inc ZPQuickPtr2 - bne .13 + adc ZPQuickPtr2 advance to next token + sta ZPQuickPtr2 + bcc .5 inc ZPQuickPtr2+1 -.13 lda (ZPQuickPtr1),y - sta (ZPQuickPtr2) - tya - cmp (ZPQuickPtr1) - bne .12 - plx get back remaining string hMem - pla get back token hMem - clc - rts -.87 ldx #0 Splitmode but no remaining string to return - pla get back token hMem - clc - rts +.5 ldy #0 reset index in dst token + bra .7 -.98 pla get back Token hMem - jsr S.FreeMemA discard Token -.99 sec - rts -*-------------------------------------- -S.PStrGetTkn.SEP .BS 1 -S.PStrGetTkn.IDX .BS 1 -S.PStrGetTkn.START .BS 1 -S.PStrGetTkn.END .BS 1 -*-------------------------------------- -S.GetArgCount +.6 iny add char to token + sta (ZPQuickPtr2),y + +.7 dex end of src string? + bne .3 no...next char... + + tya yes, are we in a token ? + beq .8 + + sta (ZPQuickPtr2) yes, set last token len + sec + adc ZPQuickPtr2 advance to next token + sta ZPQuickPtr2 + bcc .8 + inc ZPQuickPtr2+1 + +.8 lda #0 + sta (ZPQuickPtr2) set Array Ending 0 + + pla get back PTR.HI + ply get back PTR.LO + plx get back hMem clc - rts -*-------------------------------------- -S.GetArgA - clc - rts +.9 rts *-------------------------------------- MAN SAVE SYS/KERNEL.S.STR diff --git a/SYS/KERNEL.S.TSK.txt b/SYS/KERNEL.S.TSK.txt index c89f4752..85ef5bfd 100644 --- a/SYS/KERNEL.S.TSK.txt +++ b/SYS/KERNEL.S.TSK.txt @@ -149,401 +149,6 @@ S.DispatchEvents S.TskMgrQuit clc rts *-------------------------------------- -* PUBLIC -*-------------------------------------- -* S.ExecProcessNewEnvYA -* S.ExecProcessYA (Blocking Parent PID) -* S.CreateProcessNewEnvYA -* S.CreateProcessYA (Non Blocking) -* in : -* A = hMem To Cmd Line -* Y = hMem To Args -* out : -* A = Child PSID -*-------------------------------------- -S.ExecProcessNewEnvYA - ldx #S.PS.F.ENV - .HS 2C bit abs -S.ExecProcessYA ldx #0 -S.ExecProcess jsr S.CreateProcess - bcs .9 terminated, do not set PID as HOLD - - ldy #S.PS.CID - sta (pPs),y - - pha Save Child PID - lda (pPs) - ora #S.PS.F.HOLD - sta (pPs) - pla Get Back PID - clc -.9 rts -*-------------------------------------- -S.CreateProcessNewEnvYA - ldx #S.PS.F.ENV - .HS 2C bit abs -S.CreateProcessYA - ldx #0 -S.CreateProcess stx S.CreateChildProcess.Flags - sta S.CreateProcessA.Cmd - sty S.CreateProcessA.Args - - jsr S.CreateChildProcess - bcs .99 - - sta S.CreateProcessA.CPSID - jsr S.SelectProcessA - - jsr S.InitProcess - bcs .98 Init Failed or exit? - - ldy #S.PS.PID switch back to Parent Process - lda (pPs),y - - jsr S.SelectProcessA - - lda S.CreateProcessA.CPSID - clc - rts - -.98 pha save error code - - ldy #S.PS.PID switch back to Parent Process - lda (pPs),y - jsr S.SelectProcessA - - lda S.CreateProcessA.CPSID - jsr S.FreeProcessA - - pla get back error code - -.99 sec - rts -*-------------------------------------- -S.CreateProcessA.Cmd .BS 1 -S.CreateProcessA.Args .BS 1 -S.CreateProcessA.CPSID .BS 1 -*-------------------------------------- -* S.GetPSByIDA -* In : -* A = PID -* Out : -* Y,A = PTR to TSKSLOT -*-------------------------------------- -S.GetPSByIDA sta S.GetPSByIDA.PS - - >LDYAI TskMgr.Table - >STYA ZPQuickPtr1 - - lda S.GetPSByIDA.PS - beq .8 - - ldx #0 - -.1 inx - lda ZPQuickPtr1 - clc - adc #S.PS.SIZE - sta ZPQuickPtr1 - bcc .2 - inc ZPQuickPtr1+1 - -.2 lda (ZPQuickPtr1) - bpl .3 - - ldy #S.PS.ID - lda (ZPQuickPtr1),y - cmp S.GetPSByIDA.PS - beq .8 - -.3 cpx TSKMGR.SIZE - bne .1 - -.9 lda #TSKMGR.ERRNSP - sec - rts - -.8 >LDYA ZPQuickPtr1 - clc - rts -*-------------------------------------- -S.GetPSByIDA.PS .BS 1 -*-------------------------------------- -S.Sleep pla get PC LO - sec - sbc pCode - ldy #S.PS.PC - sta (pPs),y - - pla get PC HI - sbc pCode+1 - iny - sta (pPs),y - lda (pPs) - ora #S.PS.F.SLEEP - sta (pPs) - clc No error, - rts back to Kernel -*-------------------------------------- -* PRIVATE -*-------------------------------------- -* S.CreateChildProcess -* in : -* out : -* A = PSID -* we cannot use ZPQuickPtrs -* because of calling S.NewPStrYA & S.DupEnvA -*-------------------------------------- -S.CreateChildProcess - >LDYAI TskMgr.Table+S.PS.SIZE - >STYA R.AX - - ldx #0 - -.1 inx - cpx TSKMGR.SIZE - beq .2 - - lda (R.AX) Found an empty slot - bpl .3 - lda R.AL - clc - adc #S.PS.SIZE - sta R.AL - bcc .1 - inc R.AH - - bra .1 - -.2 cpx #K.PS.MAX - bne .30 - - lda #TSKMGR.ERROOH - sec - rts - -.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 - beq .4 not = 0 - lda TSKMGR.LASTID - jsr S.GetPSByIDA - bcc .4 - - ldy #S.PS.ID - lda TSKMGR.LASTID - sta (R.AX),y - - lda #0 - ldy #S.PS.hCS -.5 sta (R.AX),y Blank Everything in this S.PS - 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 - jsr S.GetMemPtrA - jsr S.NewPStrYA - bcs .99 - - ldy #S.PS.hPREFIX - sta (R.AX),y - - ldy #S.PS.hENV ...and hENV from parent PS - lda (pPs),y - jsr S.DupEnvA - bcs .99 - - ldy #S.PS.hENV - sta (R.AX),y - bra .8 - -.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 -.81 lda (pPs),y - sta (R.AX),y - iny - cpy #S.PS.hERRDEV+1 - bne .81 - - ldy #S.PS.ID - lda (pPs),y - - ldy #S.PS.PID - sta (R.AX),y - - lda TSKMGR.LASTID - clc Exit with A=PSID - rts - -.99 sec - rts -*-------------------------------------- -S.CreateChildProcess.Flags - .BS 1 -*-------------------------------------- -* S.InitProcess -* In : -* A = hMem To Full Cmd Line -*-------------------------------------- -S.InitProcess lda S.CreateProcessA.Args - beq .1 - jsr S.ExpandPStrA -.1 ldy #S.PS.hARGS - sta (pPs),y set ARGS hMem (0 if none) - - lda S.CreateProcessA.Cmd - jsr S.ExpandPStrA - - ldy #S.PS.hCMD - sta (pPs),y - - jsr S.LoadBinA A = BinPath hMem - bcs .99 - - >STYA pCode save PTR to Code Segment - txa - ldy #S.PS.hCS - sta (pPs),y save CS hMem in TSKSLOT - - ldy #H.BIN.BIN.DS.SIZE+1 - lda (pCode),y Load DS.SIZE HI - tax - dey - ora (pCode),y - - beq .2 DS.SIZE=0... - - lda (pCode),y - >PUSHAX Push DS.SIZE - >PUSHBI S.MEM.F.INIT0 Clear DS - jsr S.GetMem - bcs .99 - - >STYA pData - txa - ldy #S.PS.hDS - sta (pPs),y save DS hMem in TSKSLOT - -.2 lda (pCode) - cmp #H.BIN.HEADER.BIN65 - bne * - - ldx #TSKMGR.INIT - jsr pCodeJmp Call INIT function - bcc .99 - pha save error code - ldx #TSKMGR.QUIT - jsr pCodeJmp Call QUIT function - pla get back error code - sec -.99 rts -*-------------------------------------- -* S.SelectProcessA -* In : A=PSID -*-------------------------------------- -S.SelectProcessA - tay - bne S.SelectProcessN -S.SelectProcess0 - >LDYAI TskMgr.Table Make PS #0 as current process - >STYA pPs - bra S.SelectProcessDev -S.SelectProcessN - jsr S.GetPSByIDA - bcs * - >STYA pPs - -S.SelectProcess ldy #S.PS.hCS - lda (pPs),y - jsr S.GetMemPtrA - >STYA pCode - - ldy #S.PS.hDS - lda (pPs),y - beq S.SelectProcessDev - - jsr S.GetMemPtrA - >STYA pData - -S.SelectProcessDev - ldy #S.PS.hOUTDEV - lda (pPs),y - beq .8 - - jsr S.GetDevByIDA - >STYA pDev - -.8 clc - rts -*-------------------------------------- -* S.FreeProcessA -* In : A = PID to free -*-------------------------------------- -S.FreeProcessA jsr S.GetPSByIDA - bcs * - >STYA ZPQuickPtr1 - ldy #S.PS.hARGS - lda (ZPQuickPtr1),y - beq .1 - - jsr S.FreeMemA - -.1 ldy #S.PS.hCMD - lda (ZPQuickPtr1),y - beq .2 - - jsr S.FreeMemA - - lda (ZPQuickPtr1) get S.PS.F - and #S.PS.F.ENV do we have to discard duplicated env & prefix ? - beq .4 - -.2 ldy #S.PS.hENV - lda (ZPQuickPtr1),y - beq .3 - - jsr S.FreeMemA - -.3 ldy #S.PS.hPREFIX - lda (ZPQuickPtr1),y - beq .4 - - jsr S.FreeMemA - -.4 ldy #S.PS.hDS - lda (ZPQuickPtr1),y - beq .5 - - jsr S.FreeMemA - -.5 ldy #S.PS.hCS - lda (ZPQuickPtr1),y - beq .8 - - jsr S.FreeMemA - -.8 lda #0 - sta (ZPQuickPtr1) Mark TSKSLOT as free - clc - rts -*-------------------------------------- TSKMGR.SIZE .BS 1 TSKMGR.COUNT .BS 1 TSKMGR.EVENTCNT .BS 1 diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 31fc7afc..0341ec69 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -117,8 +117,8 @@ Kernel.Init2 >LDAXI MSG.Init2 jsr S.TskMgrInit bcs * - sta CLRALTZP Make MAIN ZP is enabled for X.PRINT.F - lda RROMBNK1 Make sure ROM is enabled for X.PRINT.F + sta CLRALTZP Make sure MAIN ZP... + lda RROMBNK1 ... & ROM is enabled for X.PRINT.F >LDAXI MSG.Init2.OK jsr PrintCStrAX @@ -137,31 +137,22 @@ Kernel.Init3 ldx #DEVMGR.SELECT >LDYAI MSG.Init3 >SYSCALL SYS.PSTROutYA - >LDYAI MSG.StartupFile + ldy #S.PS.hPREFIX + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + + >PUSHYA + >LDYAI MSG.Prefix >SYSCALL SYS.PSTROutYA - >LDYAI STARTUP.ARGS Get A2osX.STARTUP full path... - >SYSCALL SYS.NewPStrYA - pha - >LDYAI STARTUP.CMD Get SHELL full path... - >SYSCALL SYS.NewPStrYA - ply get back ARGS in Y - phy - pha A=CMD, save for discard + >PUSHWI STARTUP.CMDLINE + >LDYAI MSG.Startup + >SYSCALL SYS.PSTROutYA + >LDYAI STARTUP.CMDLINE >SYSCALL SYS.CreateProcessYA - bcc .1 - - >PUSHA - >LDYAI MSG.StartupErr - >SYSCALL SYS.PSTROutYA - bra * + bcs .9 -.1 pla - >SYSCALL SYS.FreeMemA - pla - >SYSCALL SYS.FreeMemA - >LDYAI MSG.Init3.OK >SYSCALL SYS.PSTROutYA @@ -169,6 +160,11 @@ Kernel.Init3 ldx #DEVMGR.SELECT >STYA pPs jmp S.KernelRun + +.9 >PUSHA + >LDYAI MSG.StartupErr + >SYSCALL SYS.PSTROutYA + bra * *-------------------------------------- Kernel.Move ldy #0 .1 inc ZPQuickPtr3 @@ -197,12 +193,12 @@ MSG.K.INIT >CSTRING "Kernel Setup...\n" MSG.Init2.OK >CSTRING "A2osX[Stage2]:Complete.\n" *-------------------------------------- MSG.Init3 >PSTRING "A2osX[Stage3]:Init\n" -MSG.StartupFile >PSTRING "EXEC A2osX.Startup...\n" -MSG.StartupErr >PSTRING "SHELL A2osX.Startup Failed with Error : [$%h]\n" +MSG.Prefix >PSTRING "Prefix:%S\n" +MSG.Startup >PSTRING "Executing Kernel Startup Script...\nCmd:%S\n" +MSG.StartupErr >PSTRING "Failed : [$%h]\n" MSG.Init3.OK >PSTRING "A2osX[Stage3]:Complete.\n" *-------------------------------------- -STARTUP.CMD >PSTRING "${A2OSX}SBIN/SHELL" -STARTUP.ARGS >PSTRING "${A2OSX}A2osX.STARTUP" +STARTUP.CMDLINE >PSTRING "${A2OSX}SBIN/SHELL ${A2OSX}A2osX.STARTUP" *-------------------------------------- * Global Page *-------------------------------------- @@ -222,6 +218,7 @@ A2osX.D001 .EQ * .INB SYS/KERNEL.S.CIO .INB SYS/KERNEL.S.FIO .INB SYS/KERNEL.S.MLI + .INB SYS/KERNEL.S.ARG .INB SYS/KERNEL.S.ENV .INB SYS/KERNEL.S.EVT .EP @@ -245,6 +242,7 @@ A2osX.E000 .EQ * .INB SYS/KERNEL.S.DRV .INB SYS/KERNEL.S.LIB .INB SYS/KERNEL.S.TSK + .INB SYS/KERNEL.S.PS *-------------------------------------- * Make sure KERNEL.S.DEV is the last one *--------------------------------------