diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index 3ae06609..c3e306af 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -530,15 +530,28 @@ Load a file in AUX memory (Stock Objects) Y,A = File Length X = hMem of Loaded Object in AUX mem -# Exec +# ExecL ## C -`int exec(const char* argv[], short int flags);` +`int execl(const char* cmdline, short int flags);` + +## ASM +`>PUSHB flags` +`>LDYA cmdline` +`>SYSCALL execl` + +## RETURN VALUE +A = Child PSID + +# ExecV + +## C +`int execv(const char* argv[], short int flags);` ## ASM `>PUSHB flags` `>LDYA argv` -`>SYSCALL exec` +`>SYSCALL execv` ## RETURN VALUE A = Child PSID @@ -559,7 +572,7 @@ A = Child PSID # GetPSStat **In:** - Y,A = Ptr to 24 bytes buffer + Y,A = Ptr to K.PS.MAX*2+1 bytes buffer ## RETURN VALUE Buffer filled with PS stats diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 9495446c..ac8c4c00 100644 Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 716be651..b48383cf 100644 Binary files a/.Floppies/A2OSX.SRC.po and b/.Floppies/A2OSX.SRC.po differ diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 8c6f2fda..08a30ebf 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -199,11 +199,12 @@ SYS.UnloadLib .EQ $9A SYS.LoadDrv .EQ $9C SYS.InsDrv .EQ $9E *-------------------------------------- -* .EQ $A0 -* .EQ $A2 +SYS.ExecL .EQ $A0 +SYS.ExecV .EQ $A2 * .EQ $A4 * .EQ $A6 -SYS.Exec .EQ $A8 + +* .EQ $A8 SYS.GetMemStat .EQ $AA SYS.GetPSStatus .EQ $AC SYS.GetPSStat .EQ $AE diff --git a/INC/KERNEL.I.txt b/INC/KERNEL.I.txt index d31bec11..e3a8424a 100644 --- a/INC/KERNEL.I.txt +++ b/INC/KERNEL.I.txt @@ -107,7 +107,8 @@ Nod.Table.hFD .EQ $0C60 K.NOD.MAX *-------------------------------------- PS.Table.hMem .EQ $0C80 K.PS.MAX PS.Table.PID .EQ $0CA0 K.PS.MAX -PS.Table.Stat .EQ $0CC0 K.PS.MAX*2 +PS.Table.Hits .EQ $0CC0 K.PS.MAX +PS.Table.Stats .EQ $0CE0 K.PS.MAX *-------------------------------------- Evt.Table .EQ $0D60 K.EVT.MAX*S.EVT.SIZE=4*8=32b *-------------------------------------- diff --git a/SYS/KERNEL.S.CORE.txt b/SYS/KERNEL.S.CORE.txt index dcb7caad..559ba091 100644 --- a/SYS/KERNEL.S.CORE.txt +++ b/SYS/KERNEL.S.CORE.txt @@ -2,13 +2,11 @@ NEW PREFIX /A2OSX.BUILD AUTO 4,1 *-------------------------------------- -CORE.Run lda CORE.PSCount - sta CORE.PSIndex +CORE.Run stz CORE.PSIndex + + ldx #0 - beq CORE.Events SHOULD NEVER HAPPEN!!! - -.1 ldx CORE.PSIndex - lda PS.Table.hMem-1,x +.1 lda PS.Table.hMem,x beq .8 jsr K.GetMemPtr @@ -27,9 +25,7 @@ CORE.Run lda CORE.PSCount eor #S.PS.F.HOLD unmark as HOLD sta (pPs) -.2 jsr CORE.PSSelect Restore ZP & Ptrs - - jsr CORE.PSExec INIT/RUN/QUIT/RESUME +.2 jsr CORE.PSExec INIT/RUN/QUIT/RESUME dec IRQ.InKernel bcc .61 Error ? @@ -84,7 +80,9 @@ CORE.Run lda CORE.PSCount .7 jsr CORE.PSLeave Save ZP & Ptrs -.8 dec CORE.PSIndex +.8 inc CORE.PSIndex + ldx CORE.PSIndex + cpx #K.PS.MAX bne .1 *-------------------------------------- CORE.Events jsr CORE.GetEvents @@ -215,17 +213,11 @@ CORE.GetEvents lda #Evt.Table * CS: Not Dispatched * CC: Event Cleared *-------------------------------------- -CORE.Dispatch lda CORE.EvtCount - beq .9 +CORE.Dispatch stz CORE.PSIndex - lda CORE.PSCount - beq .9 - - sta CORE.PSIndex + ldx #0 -.1 ldx CORE.PSIndex - - lda PS.Table.hMem-1,x +.1 lda PS.Table.hMem,x beq .5 jsr K.GetMemPtr @@ -278,7 +270,9 @@ CORE.Dispatch lda CORE.EvtCount .4 jsr CORE.PSLeave -.5 dec CORE.PSIndex +.5 inc CORE.PSIndex + ldx CORE.PSIndex + cpx #K.PS.MAX bne .1 .9 sec @@ -319,48 +313,48 @@ CORE.PSFree.A sta .1+1 Save PS ID .1 lda #$ff Self Modified - ldx CORE.PSCount + ldx #0 -.2 cmp PS.Table.PID-1,x +.2 cmp PS.Table.PID,x beq .3 - dex + inx + cpx #K.PS.MAX bne .2 bra * -.3 stz PS.Table.PID-1,x - lda PS.TABLE.hMem-1,x - stz PS.TABLE.hMem-1,x +.3 stz PS.Table.PID,x + lda PS.TABLE.hMem,x + stz PS.TABLE.hMem,x .4 jmp K.FreeMem .8 lda (ZPPtr1),y bne .4 .9 rts *-------------------------------------- -* X unmodofied +* X unmodified *-------------------------------------- CORE.GetPSByID tay - bne .1 - >LDYAI CORE.S.PS0 Select PS0 - clc - rts - + beq .1 .1 jsr CORE.GetPS bcs .9 - lda PS.TABLE.hMem-1,y - beq * + + lda PS.TABLE.hMem,y jmp K.GetMemPtr + + >LDYAI CORE.S.PS0 Select PS0 + clc .9 rts *-------------------------------------- -CORE.GetPS ldy CORE.PSCount - beq .9 +CORE.GetPS ldy #0 -.1 cmp PS.Table.PID-1,y +.1 cmp PS.Table.PID,y beq .8 - dey + iny + cpy #K.PS.MAX bne .1 .9 lda #K.E.NSP - sec +* sec rts .8 clc @@ -456,7 +450,9 @@ CORE.PSLeave ldy #S.PS.ZP+ZPBIN.SIZE-1 rts *-------------------------------------- -CORE.PSExec lda (pPS) +CORE.PSExec jsr CORE.PSSelect Restore ZP & Ptrs + + lda (pPS) bit #S.PS.F.SLEEP bne CORE.PSResume @@ -545,7 +541,6 @@ CORE.InKernelStat .BS 1 CORE.EvtIndex .BS 1 CORE.EvtCount .BS 1 CORE.PSIndex .BS 1 -CORE.PSCount .DA #0 CORE.LastPSID .DA #0 CORE.S.PS0 .BS S.PS.hStdErr+1 *-------------------------------------- diff --git a/SYS/KERNEL.S.INIT.txt b/SYS/KERNEL.S.INIT.txt index c510ce19..d18f6325 100644 --- a/SYS/KERNEL.S.INIT.txt +++ b/SYS/KERNEL.S.INIT.txt @@ -153,7 +153,7 @@ Kernel.Init3 sta SETALTZP >LDYAI STARTUP.SHELL bra .8 -.1 >PUSHWI STARTUP.SCRIPT +.1 >PUSHWI STARTUP.CMDLINE >PUSHBI 2 >LDYAI MSG.Startup >SYSCALL printf @@ -161,14 +161,9 @@ Kernel.Init3 sta SETALTZP >PUSHBI 0 PS Flags >LDYAI STARTUP.CMDLINE -.8 >SYSCALL ExpandStr - phx Save Expanded CMDLINE for discard - - >SYSCALL Exec +.8 >SYSCALL ExecL bcs .9 - pla - jsr K.FreeMem ...discard... >PUSHBI 1 >LDYAI MSG.Init3.OK @@ -509,9 +504,9 @@ MemMgrInit >LDYAI Mem.MHiMem sta CLRWRITEAUX - ldx #K.Dev.MAX*4-1 + ldx #K.DEV.MAX*2-1 -.1 stz Dev.Table.hFD,x +.1 stz Dev.Table.hPath,x dex bpl .1 @@ -521,6 +516,12 @@ MemMgrInit >LDYAI Mem.MHiMem dex bpl .2 + ldx #K.PS.MAX*4-1 + +.3 stz PS.Table.hMem,x + dex + bpl .3 + rts *-------------------------------------- * Setup AuxLC $FFFE->Kernel IRQ Handler @@ -1060,10 +1061,7 @@ I.ENV.PATH .AZ "PATH=${A2OSX}SBIN/;${A2OSX}BIN/" I.ENV.LIB .AZ "LIB=${A2OSX}LIB/" I.ENV.DRV .AZ "DRV=${A2OSX}DRV/" STARTUP.SHELL .AZ "${A2OSX}SBIN/SHELL" - .HS 00 -STARTUP.CMDLINE .AZ "${A2OSX}SBIN/SHELL" -STARTUP.SCRIPT .AZ "${A2OSX}A2osX.STARTUP" - .HS 00 +STARTUP.CMDLINE .AZ "${A2OSX}SBIN/SHELL ${A2OSX}A2osX.STARTUP" *-------------------------------------- MLIOPEN00 .DA #3 .DA A2OSXCONF diff --git a/SYS/KERNEL.S.IRQ.txt b/SYS/KERNEL.S.IRQ.txt index e19d4c14..71138cd2 100644 --- a/SYS/KERNEL.S.IRQ.txt +++ b/SYS/KERNEL.S.IRQ.txt @@ -160,11 +160,13 @@ K.IrqH.Switch inc IRQ.Tick stz CORE.InKernelStat - ldx CORE.PSCount + ldx #K.PS.MAX-1 -.1 stz PS.Table.Stat-1,x +.1 lda PS.Table.Hits-1,x + stz PS.Table.Hits-1,x + stz PS.Table.Stats-1,x dex - bne .1 + bpl .1 .2 lda IRQ.InKernel keep V flag set bpl .3 @@ -176,7 +178,7 @@ K.IrqH.Switch inc IRQ.Tick rts .3 ldx CORE.PSIndex - inc PS.Table.Stat-1,x + inc PS.Table.Hits-1,x bit A2osX.F A2osX.F.PMODE .EQ %01000000 bvc .8 diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index e60cb673..f1ee30c6 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -98,11 +98,11 @@ K.SYSCALL.JMP .DA 0 $00 .DA K.LoadDrv .DA K.InsDrv - .DA 0 $A0 - .DA 0 + .DA K.ExecL $A0 + .DA K.ExecV + .DA 0 .DA 0 .DA 0 - .DA K.Exec .DA K.GetMemStat .DA K.GetPSStatus .DA K.GetPSStat diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index ec00297e..fe84b831 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -5,26 +5,60 @@ AUTO 4,1 PS.Flags .BS 1 PS.Args .BS 2 */-------------------------------------- -* # Exec +* # ExecL * ## C -* `int exec(const char* argv[], short int flags);` +* `int execl(const char* cmdline, short int flags);` * ## ASM * `>PUSHB flags` -* `>LDYA argv` -* `>SYSCALL exec` +* `>LDYA cmdline` +* `>SYSCALL execl` * ## RETURN VALUE * A = Child PSID *\-------------------------------------- -K.Exec >STYA PS.Args +K.ExecL jsr ExpandStr + bcs .9 + phx + + jsr + + + plx + jsr FreeMem + + +.9 >RET 1 discard PS.Args +*/-------------------------------------- +* # ExecV +* ## C +* `int execv(const char* argv[], short int flags);` +* ## ASM +* `>PUSHB flags` +* `>LDYA argv` +* `>SYSCALL execv` +* ## RETURN VALUE +* A = Child PSID +*\-------------------------------------- +K.ExecV >STYA PS.Args >PULLB PS.Flags K.Exec.I jsr PS.CreateChild Child S.PS at ZPPtr3 bcs .9 sta .8+1 - - >LDYA PS.Args /path/cmd \0 + >LDYA PS.Args + jsr PS.DupArgs + + ldy #S.PS.hARGS + sta (ZPPtr3),y + pha + dey S.PS.ARGC + txa + sta (ZPPtr3),y + + pla + >SYSCALL GetMemPtr + jsr PS.Load bcc .8 @@ -47,16 +81,11 @@ K.Exec.I jsr PS.CreateChild Child S.PS at ZPPtr3 *-------------------------------------- PS.CreateChild ldx #0 -.1 cpx CORE.PSCount - beq .2 - - lda PS.Table.PID,x - beq .31 Found an empty slot +.1 lda PS.Table.PID,x + beq .2 Found an empty slot inx - bra .1 - -.2 cpx #K.PS.MAX - bne .3 + cpx #K.PS.MAX + bne .1 lda #K.E.OOH sec @@ -65,11 +94,9 @@ PS.CreateChild ldx #0 .99 plx rts -.3 inc CORE.PSCount - -.31 phx save PS inex +.2 phx save PS index -.4 inc CORE.LastPSID Get a PSID not alredy running +.4 inc CORE.LastPSID Get a PSID not already running beq .4 not = 0 lda CORE.LastPSID jsr CORE.GetPSByID @@ -130,16 +157,7 @@ PS.CreateChild ldx #0 lda (pPs),y sta (ZPPtr3),y -.8 >LDYA PS.Args - jsr PS.DupArgs - - ldy #S.PS.hARGS - sta (ZPPtr3),y - dey S.PS.ARGC - txa - sta (ZPPtr3),y - - ldy #S.PS.hStdIn +.8 ldy #S.PS.hStdIn .81 lda (pPs),y sta (ZPPtr3),y @@ -271,14 +289,14 @@ PS.Load jsr BIN.Load Y,A=filename full path PS.DupArgs >STYA ZPPtr1 >STYA ZPPtr2 - + lda #1 sta .7+1 lda #0 sta .8+1 len = 1 for array ending 0 - + .1 lda (ZPPtr2) - beq .8 + beq .7 ldy #0 @@ -304,7 +322,8 @@ PS.DupArgs >STYA ZPPtr1 .7 ldy #$ff SELF MODIFIED .8 lda #$ff SELF MODIFIED - bra PS.Dup.I + + bra PS.DupStrV *-------------------------------------- * PS.DupEnv * In: @@ -318,7 +337,7 @@ PS.DupEnv jsr K.GetMemPtr >LDYAI K.ENV.SIZE -PS.Dup.I jsr K.GetMem +PS.DupStrV jsr K.GetMem bcs .9 >STYA ZPPtr2 @@ -416,7 +435,7 @@ K.GetPSStatus jsr CORE.GetPSByID */-------------------------------------- * # GetPSStat * **In:** -* Y,A = Ptr to 24 bytes buffer +* Y,A = Ptr to K.PS.MAX*2+1 bytes buffer * ## RETURN VALUE * Buffer filled with PS stats *\-------------------------------------- @@ -437,12 +456,12 @@ K.GetPSStat >STYA ZPPtr1 sta (ZPPtr1),y iny - lda PS.Table.Stat,x + lda PS.Table.Stats,x sta (ZPPtr1),y iny .2 inx - cpx CORE.PSCount + cpx #K.PS.MAX bne .1 .9 tya