diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index d3897026..af92fdd6 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -18,15 +18,19 @@ CS : Out Of Bound **Out:** none -#K.InsDrv +#InsDrv + +##C +`void * insdrv (void * src, void * crvcsstart, void * drvcsend, void * drvend);` ##ASM **In:** -Y,A = .DRV File Loaded Address -Note: - BIN.Load called from K.LoadDrv - Already setup correctly pDrv, - BIN.R.Start,End +>PUSHW DRV.END +>PUSHW DRV.CS.END +>PUSHW DRV.CS.START +>LDYA L.SRC +**Out:** +Y,A = Ptr to installed driver # GetDevByID **In:** @@ -41,7 +45,7 @@ Y,A = DEVSLOT **Out:** CC = OK, CS = ERROR X = DEVID - Y,A = DEVSLOT + Y,A = FD # GetDevStatus **In:** @@ -49,19 +53,11 @@ Y,A = DEVSLOT **Out:** Y,A = S.DSTAT -# IOCTL - -## C -`int ioctl ( short int id, short int op, void *param);` - -## ASM +# MKDev **In:** -`PUSHWI param` -`lda #op` -`ldy id` -`>SYSCALL IOCTL` + Y,A = Ptr to FD.DEV **Out:** - Y,A = ... + A = DEVID # OpenDir **In:** @@ -177,6 +173,42 @@ Load a file in memory PUSHW = GID PUSHW = PATH +# open + +## C +`int open(const char *pathname, int flags);` + +## ASM +**In:** +`>PUSHB flags` +`>LDYA pathname` +`>SYSCALL open` +**Out:** +A = hFD +note : if file is created on ProDOS : T=TXT,X=$0000 + +# IOCTL + +## C +`int ioctl(int fd, unsigned long request, void * param );` + +## ASM +**In:** +`PUSHWI param` +`lda #request` +`ldy fd` +`>SYSCALL IOCTL` +**Out:** + Y,A = ... + +# pipe + +## C +`int pipe(int pipefd[2]);` + +## ASM +**In:** + # FAdd,FSub,FMult,FDiv,FPwr Return X+Y, X-Y, X*Y, X/Y, X^Y @@ -601,6 +633,15 @@ Open a file + SYS.FOpen.A : Append + SYS.FOpen.T : Open/Append in Text mode + SYS.FOpen.X : Create if not exists +http://man7.org/linux/man-pages/man3/fopen.3.html +r = O_RDONLY +w = O_WRONLY | O_CREAT | O_TRUNC +a = O_WRONLY | O_CREAT | O_APPEND +r+ = O_RDWR +w+ = O_RDWR | O_CREAT | O_TRUNC +a+ = O_RDWR | O_CREAT | O_APPEND +* +TODO: mode="w+t=TYP,x=AUXTYPE" `>LDYAI filename` **Out:** CC : A = hFILE @@ -608,6 +649,11 @@ Open a file # FClose Close a file + +## C +int fclose ( FILE * stream ); + +## ASM **In:** A = hFILE **Out:** diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index c5f3aeed..db472970 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 9fa094ab..f073cf4c 100644 Binary files a/.Floppies/A2OSX.SRC.po and b/.Floppies/A2OSX.SRC.po differ diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index 9beb9d23..9c1c61c5 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -26,31 +26,30 @@ CS.START cld * Relocation Table *-------------------------------------- L.MSG.DETECT .DA MSG.DETECT -L.INSDRV .DA DRV.CS.START - .DA DRV.CS.END - .DA DRV.END -L.NODE .DA NODE +L.DRV.CS.START .DA DRV.CS.START +L.FD.DEV .DA FD.DEV .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect >LDYA L.MSG.DETECT >SYSCALL printf - >PUSHW L.INSDRV+4 - >PUSHW L.INSDRV+2 - >LDYA L.INSDRV + >PUSHWI DRV.END + >PUSHWI DRV.CS.END + >PUSHWI DRV.CS.START + >LDYA L.DRV.CS.START >SYSCALL InsDrv bcs .9 - >STYA NODE+S.FD.DEV.DRVPTR + >STYA FD.DEV+S.FD.DEV.DRVPTR - >LDYA L.NODE - >SYSCALL MKNOD + >LDYA L.FD.DEV + >SYSCALL MKDEV .9 rts CS.END MSG.DETECT .AZ "Apple IIe/IIc 80 Col Driver.\r\n" *-------------------------------------- -NODE .DA #S.FD.T.CDEV +FD.DEV .DA #S.FD.T.CDEV .DA #0 HANDLER .DA #0 BUSID .DA #0 DEVID diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 9be6279f..075f28f8 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -124,7 +124,7 @@ SYS.Rename .EQ $42 SYS.GetDevByID .EQ $48 SYS.GetDevByName .EQ $4A SYS.GetDevStatus .EQ $4C -* .EQ $4E +SYS.MKDev .EQ $4E * .EQ $50 SYS.SScanF .EQ $52 diff --git a/INC/KERNEL.I.txt b/INC/KERNEL.I.txt index 855cfb31..93dd371f 100644 --- a/INC/KERNEL.I.txt +++ b/INC/KERNEL.I.txt @@ -167,7 +167,7 @@ H.BIN.ZP.SIZE .EQ 13 * H.BIN.EXE.REL.TABLE .EQ 16 * -H.BIN.DRV.REL.TABLE .EQ 4 +H.BIN.DRV.REL.TABLE .EQ 2 Including main jmp *-------------------------------------- MAN SAVE /A2OSX.BUILD/INC/KERNEL.I diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index 1663bc75..99fa0e0e 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -42,10 +42,12 @@ CS.INIT ldy #S.PS.ARGC cmp #2 bne .90 - lda #1 - >SYSCALL GetArg + >PUSHBI 0 - >SYSCALL MkNod + lda #1 + >SYSCALL GetArg get /dev/xxx + + >SYSCALL open bcs .9 ldy #S.PS.hStdIn @@ -55,7 +57,7 @@ CS.INIT ldy #S.PS.ARGC iny #S.PS.hStdErr sta (pPs),y - >STA.G hNode + >STA.G hDEV lda #2 >SYSCALL GetArg @@ -220,7 +222,7 @@ CS.QUIT >LDA.G hBinName beq .1 >SYSCALL FreeMem -.1 >LDA.G hNode +.1 >LDA.G hDEV beq .8 >PUSHA @@ -267,7 +269,7 @@ IAC.SB.DATA .BS 64 IAC.VERB .BS 1 IAC.OPT .BS 1 IAC.SB .BS 1 -hNode .BS 1 +hDEV .BS 1 hBinName .BS 1 TimeOut .BS 1 DS.END .ED diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index 1f7eac26..92393759 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -280,34 +280,39 @@ BIN.Load.1 >PUSHWI K.S.STAT BIN.CmdLine .BS 2 BIN.hMem .BS 1 */-------------------------------------- -* #K.InsDrv +* #InsDrv +* ##C +* `void * insdrv (void * src, void * crvcsstart, void * drvcsend, void * drvend);` * ##ASM * **In:** -* PUSHW = DRV.END -* PUSHW = DRV.CS.END -* Y,A = DRV.CS.START +* >PUSHW DRV.END +* >PUSHW DRV.CS.END +* >PUSHW DRV.CS.START +* >LDYA L.SRC +* **Out:** +* Y,A = Ptr to installed driver *\-------------------------------------- -K.InsDrv >STYA BIN.R.CS.Start +K.InsDrv >STYA ZPPtr1 + + >PULLW BIN.R.CS.Start >PULLW BIN.R.CS.End >PULLW BIN.R.End - + lda BIN.R.End Compute DRVLen=End-start sec sbc BIN.R.CS.Start - sta BIN.R.Len + sta BIN.Move.Len lda BIN.R.End+1 sbc BIN.R.CS.Start+1 - sta BIN.R.Len+1 + sta BIN.Move.Len+1 lda DevMgr.Free Compute new DevMgr.Free clc - adc BIN.R.Len - sta BIN.R.End + adc BIN.Move.Len tay Save DRVEnd LO lda DevMgr.Free+1 - adc BIN.R.Len+1 A = DRVEnd HI - sta BIN.R.End+1 + adc BIN.Move.Len+1 A = DRVEnd HI bcs .9 we crossed $FFFF, out of mem @@ -315,67 +320,48 @@ K.InsDrv >STYA BIN.R.CS.Start sbc /DevMgr.HiMem bcs .9 No More Room to load Driver.... - lda DevMgr.DevCnt - cmp #K.DEV.MAX - bne .10 No Device Handle Left + >LDYA DevMgr.Free + jsr BIN.MoveToYA - lda #K.E.OOH - sec - rts - -.9 lda #K.E.OOM - sec - rts - -.10 lda DevMgr.Free Offset = Target DRV address-Src Address + lda DevMgr.Free + sta ZPPtr1 sec sbc BIN.R.CS.Start sta BIN.R.Offset lda DevMgr.Free+1 + sta ZPPtr1+1 sbc BIN.R.CS.Start+1 sta BIN.R.Offset+1 - - jsr BIN.Move - - >LDYA BIN.R.CS.Start - >STYA ZPPtr1 - + jsr BIN.RelDrv - >LDYA BIN.R.End - >STYA DevMgr.Free - - ldx DevMgr.DevCnt lda DevMgr.Free - sta FD.Table.PTRLO,x - inx + tay + clc + adc BIN.Move.Len + sta DevMgr.Free lda DevMgr.Free+1 - sta FD.Table.PTRHI,x - - inx - stx DevMgr.DevCnt + pha + adc BIN.Move.Len+1 + sta DevMgr.Free+1 + pla clc rts -*-------------------------------------- -BIN.Move lda BIN.R.CS.Start - clc - sta ZPPtr1 - adc BIN.R.Offset - sta BIN.R.CS.Start - sta ZPPtr2 - - lda BIN.R.CS.Start+1 - sta ZPPtr1+1 - adc BIN.R.Offset+1 - sta BIN.R.CS.Start+1 - sta ZPPtr2+1 - lda BIN.R.Len+1 +.9 lda #K.E.OOM + sec + rts +*-------------------------------------- +BIN.Move.Len .BS 2 +*-------------------------------------- +BIN.MoveToYA >STYA ZPPtr2 + + lda BIN.Move.Len+1 eor #$ff pha - lda BIN.R.Len + lda BIN.Move.Len eor #$ff tax @@ -397,24 +383,7 @@ BIN.Move lda BIN.R.CS.Start inc ZPPtr2+1 bra .1 -.3 lda BIN.R.CS.End - clc - adc BIN.R.Offset - sta BIN.R.CS.End - - lda BIN.R.CS.End+1 - adc BIN.R.Offset+1 - sta BIN.R.CS.End+1 - - lda BIN.R.End - clc - adc BIN.R.Offset - sta BIN.R.End - - lda BIN.R.End+1 - adc BIN.R.Offset+1 - sta BIN.R.End+1 - rts +.3 rts *-------------------------------------- * BIN.Rel___ : *-------------------------------------- @@ -423,8 +392,6 @@ BIN.R.CS.End .BS 2 BIN.R.End .BS 2 BIN.R.Offset .BS 2 *-------------------------------------- -BIN.R.Len .BS 2 -*-------------------------------------- BIN.RelExe ldy #H.BIN.T+1 lda (ZPPtr1),y cmp /H.BIN.T.BIN65 @@ -452,7 +419,7 @@ BIN.RelExe ldy #H.BIN.T+1 .HS 2C bit abs *-------------------------------------- BIN.RelDrv ldy #H.BIN.DRV.REL.TABLE - + .1 lda (ZPPtr1),y Start Relocate JMP table tax LO in X iny @@ -501,31 +468,31 @@ BIN.RelDrv ldy #H.BIN.DRV.REL.TABLE pha ldy #1 - lda (ZPPtr1),y Get LO + lda (ZPPtr1),y Get LO tax save LO in X iny make Y point to HI + lda (ZPPtr1),y Get HI cpx BIN.R.CS.Start - lda (ZPPtr1),y Get HI sbc BIN.R.CS.Start+1 bcc .5 addr < BIN.R.CS.Start, out of range txa Get back LO cpx BIN.R.End - lda (ZPPtr1),y Get HI + lda (ZPPtr1),y Get HI sbc BIN.R.End+1 bcs .5 addr > BIN.R.End, out of range txa Get back LO * clc CC from bcs .6 - adc BIN.R.Offset add Offset to abs address + adc BIN.R.Offset add Offset to abs address dey - sta (ZPPtr1),y store relocated addr LO + sta (ZPPtr1),y store relocated addr LO iny - lda (ZPPtr1),y Get HI + lda (ZPPtr1),y Get HI adc BIN.R.Offset+1 - sta (ZPPtr1),y store relocated addr HI + sta (ZPPtr1),y store relocated addr HI .5 pla get back Opcode length... diff --git a/SYS/KERNEL.S.CORE.txt b/SYS/KERNEL.S.CORE.txt index 197fff33..41a990b4 100644 --- a/SYS/KERNEL.S.CORE.txt +++ b/SYS/KERNEL.S.CORE.txt @@ -385,6 +385,8 @@ CORE.ScrSel and #$0F lda A2osX.SCRNDEVS-1,x beq .8 No device claimed this screen + >DEBUG + jsr K.GetDevByID x unmodified..... bcs .8 ??? diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index fca31bd6..7e015865 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -83,6 +83,46 @@ K.GetDevStatus ldx #IOCTL.STATUS >STYA pFD jmp (pFD) +*/-------------------------------------- +* # MKDev +* **In:** +* Y,A = Ptr to FD.DEV +* **Out:** +* A = DEVID +*\-------------------------------------- +K.MKDev >STYA .1+1 + ldx DevMgr.DevCnt + cmp #K.DEV.MAX + beq .9 + + >LDYAI S.FD.DEV + jsr K.GetMem + >STYA .2+1 + phx + + ldx DevMgr.DevCnt + sta FD.Table.PTRHI,x + tya + sta FD.Table.PTRLO,x + pla + sta FD.Table.hMem,x + +.10 lda #$ff SELF MODIFIED + sta FD.Table.F,x + + ldx #S.FD.DEV-1 + +.1 lda $ffff,x SELF MODIFIED +.2 sta $ffff,x SELF MODIFIED + dex + bpl .1 + + inc DevMgr.DevCnt + rts + +.9 lda #K.E.OOH +* sec + rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.DEV diff --git a/SYS/KERNEL.S.INIT.txt b/SYS/KERNEL.S.INIT.txt index b1fe1173..ada8f300 100644 --- a/SYS/KERNEL.S.INIT.txt +++ b/SYS/KERNEL.S.INIT.txt @@ -106,10 +106,10 @@ Kernel.Init3 sta SETALTZP jsr MemMgrInit >LDYAI FD.NULL - jsr DevMgrInit.AddCDev + >SYSCALL MKDev >LDYAI FD.SYS - jsr DevMgrInit.AddCDev + >SYSCALL MKDev jsr PS0.Init @@ -138,12 +138,24 @@ Kernel.Init3 sta SETALTZP >LDYAI MSG.Prefix >SYSCALL printf - >PUSHWI STARTUP.CMDLINE + lda KBD + bpl .1 + sta KBDSTROBE + cmp #$84 CTRL-D for Maintenace mode + bne .1 + + >LDYAI MSG.MMode + >SYSCALL printf + >LDYAI STARTUP.SHELL + bra .8 + +.1 >PUSHWI STARTUP.CMDLINE >LDYAI MSG.Startup >SYSCALL printf - + >LDYAI STARTUP.CMDLINE - >SYSCALL ExpandStr + +.8 >SYSCALL ExpandStr phx Save Expanded CMDLINE for discard >SYSCALL CreatePS @@ -862,33 +874,7 @@ DevMgrInit.AddBDev >LDYAI FD.BDEV -DevMgrInit.AddCDev - >STYA .1+1 - stx .10+1 - - >LDYAI S.FD.DEV - jsr K.GetMem - >STYA .2+1 - phx - - ldx DevMgr.DevCnt - sta FD.Table.PTRHI,x - tya - sta FD.Table.PTRLO,x - pla - sta FD.Table.hMem,x - -.10 lda #$ff SELF MODIFIED - sta FD.Table.F,x - - ldx #S.FD.DEV-1 - -.1 lda $ffff,x SELF MODIFIED -.2 sta $ffff,x SELF MODIFIED - dex - bpl .1 - - inc DevMgr.DevCnt + >SYSCALL MKDev rts *-------------------------------------- EvtMgrInit >LDYAI MSG.EVT @@ -1006,7 +992,7 @@ MSG.KCREAD.OK .AZ "OK\n" MSG.KCREAD.KO .AZ "\nError While Reading Kernel Config File, Using Default.\n" MSG.Init2.OK .AZ "A2osX[Stage2]:Complete.\n" *-------------------------------------- -MSG.Init3 .AZ "A2osX[Stage3]:Init\r\n" +MSG.Init3 .AZ "A2osX[Stage3]:Init\r\nPress Ctrl-D for Mantenance Mode." MSG.DEV .AZ "-Device Manager...\r\n" MSG.BLKDEV .AZ " /DEV/%s\r\n" MSG.IRQ .AZ "-Interrupt Manager..." @@ -1017,6 +1003,7 @@ MSG.EVT .AZ "-Event Manager...\r\n" MSG.FLT .AZ "-Path Filter...\r\n" MSG.TSK .AZ "-Task Manager...\r\n" MSG.Prefix .AZ "Prefix:%s\r\n" +MSG.MMode .AZ "Ctrl-D Pressed, entering Maintenance mode...\r\n" MSG.Startup .AZ "Executing Kernel Startup Script...\r\nCmd:%s\r\n" MSG.StartupErr .AZ "Failed : [$%h]\r\n" MSG.Init3.OK .AZ "A2osX[Stage3]:Complete.\r\n" @@ -1041,6 +1028,7 @@ I.ENV.A2osX .AZ "A2OSX" 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" STARTUP.CMDLINE .AZ "${A2OSX}SBIN/SHELL ${A2OSX}A2osX.STARTUP" *-------------------------------------- MLIOPEN00 .DA #3 diff --git a/SYS/KERNEL.S.IO.txt b/SYS/KERNEL.S.IO.txt index dab148d3..5c7f792d 100644 --- a/SYS/KERNEL.S.IO.txt +++ b/SYS/KERNEL.S.IO.txt @@ -45,6 +45,7 @@ K.Open.DEV ldy #K.MLI.PATH+6 skip L/DEV/ sta .1+2 >PULLA get flags + lda .8+1 pass A=DEVID To Driver ldx #IOCTL.OPEN .1 jsr $ffff SELF MODIFIED bcs .99 diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index bbda3ef3..c0ffb4f8 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -49,7 +49,7 @@ K.SYSCALL.JMP .DA 0 $00 .DA K.GetDevByID .DA K.GetDevByName .DA K.GetDevStatus - .DA K.IOCTL + .DA K.MKDev .DA 0 $50 .DA K.SScanF