From 11591911b9de502bb5a52c0dcae31bea651e0d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 3 Jun 2015 20:30:57 +0200 Subject: [PATCH] Complete Rewrite #3 : many new bugs... --- A2OSX.BOOT.DSK | Bin 143360 -> 143360 bytes A2OSX.BUILD.HDV | Bin 864256 -> 864256 bytes A2OSX.SRC.po | Bin 0 -> 819200 bytes A2osX.S.GP.txt | 135 +++------- A2osX.S.QC.txt | 52 ++-- A2osX.S.TOOLS.txt | 2 +- A2osX.S.txt | 63 +++-- A2osX.STARTUP.txt | 11 +- BIN/ARP.S.txt | 45 ++-- BIN/ASM.S.txt | 2 +- BIN/CHTYP.S.txt | 2 +- BIN/DNS.S.txt | 2 +- BIN/LS.S.txt | 141 ++++++---- BIN/LSDEV.S.txt | 110 +++----- BIN/MD.S.txt | 133 ++++++++++ BIN/MEM.S.txt | 274 +++++++++++-------- BIN/NETCFG.S.txt | 34 ++- BIN/PING.S.txt | 215 +++++++++------ BIN/PS.S.txt | 50 ++-- BIN/TEST.S.txt | 2 +- BIN/_TEMPLATE.S.txt | 2 +- DRV/CONSOLE.DRV.S.txt | 184 +++++++------ DRV/DHGR.DRV.S.txt | 434 +++++++++++++++--------------- DRV/MOUSE.DRV.S.txt | 131 +++++---- DRV/PPIC.DRV.S.txt | 6 +- DRV/SSC.DRV.S.txt | 281 +++++++++++++++++--- DRV/UTHERNET.DRV.S.txt | 269 ++++++++++--------- ETC/TCPIP.CONF | 2 +- INC/A2osX.API.I.txt | 268 +++++++++++++++++++ INC/A2osX.I.txt | 330 ++++------------------- INC/IO.I.txt | 2 +- INC/KERNEL.I.txt | 63 +++-- INC/LIBCRYPT.I.txt | 2 +- INC/LIBGFX.I.txt | 2 +- INC/LIBSTR.I.txt | 2 +- INC/LIBTCPIP.I.txt | 2 +- INC/MACROS.I.txt | 288 +++++--------------- INC/MONITOR.I.txt | 2 +- INC/PRODOS.I.txt | 2 +- INC/ZP.I.txt | 14 +- LIB/LIBCRYPT.S.txt | 2 +- LIB/LIBGFX.S.txt | 2 +- LIB/LIBSTR.S.txt | 35 ++- LIB/LIBTCPIP.S.ARP.txt | 2 +- LIB/LIBTCPIP.S.DNS.txt | 2 +- LIB/LIBTCPIP.S.txt | 44 ++- SBIN/DHCPCLNT.S.txt | 50 ++-- SBIN/GETTY.S.txt | 296 +++++++-------------- SBIN/GUI.S.txt | 174 +++++++++--- SBIN/LOGIN.S.txt | 236 +++++++++++++++++ SBIN/SHELL.S.txt | 270 ++++++++++++------- SBIN/TCPIP.S.txt | 82 +++--- SBIN/TELNETD.S.txt | 2 +- SYS/KERNEL.S.BIN.txt | 460 +++++++++++--------------------- SYS/KERNEL.S.DEV.txt | 333 ++++++++++++----------- SYS/KERNEL.S.DRV.txt | 285 ++++++++++++++++++++ SYS/KERNEL.S.ENV.txt | 43 +-- SYS/KERNEL.S.EVT.txt | 119 ++------- SYS/KERNEL.S.FS.txt | 75 ++++-- SYS/KERNEL.S.LIB.txt | 115 ++++++++ SYS/KERNEL.S.MEM.txt | 590 ++++++++++++++++++++--------------------- SYS/KERNEL.S.MLI.txt | 115 ++++++-- SYS/KERNEL.S.NET.txt | 2 +- SYS/KERNEL.S.RDR.txt | 2 +- SYS/KERNEL.S.SCR.txt | 55 +++- SYS/KERNEL.S.STR.txt | 21 +- SYS/KERNEL.S.TSK.txt | 586 +++++++++++++++++++++------------------- SYS/KERNEL.S.txt | 320 +++++++++++----------- SYS/KM.NSC.S.txt | 4 +- SYS/KM.RAMWORKS.S.txt | 54 ++-- _Make_DIR.txt | 16 ++ _Make_SYS.txt | 11 +- 72 files changed, 4505 insertions(+), 3457 deletions(-) create mode 100644 A2OSX.SRC.po create mode 100644 INC/A2osX.API.I.txt create mode 100644 SBIN/LOGIN.S.txt create mode 100644 SYS/KERNEL.S.DRV.txt create mode 100644 SYS/KERNEL.S.LIB.txt create mode 100644 _Make_DIR.txt diff --git a/A2OSX.BOOT.DSK b/A2OSX.BOOT.DSK index 9ef7597ab8dcb8f4707c1c279e891df8f3ea4bc8..9a99ed166c967ed6e1b09094ffeff11eddb91882 100644 GIT binary patch delta 29574 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%0AbJd4MLtXOZB?Oc}ae3spI0j$WfF7{@j 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 delta 55146 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 RWBZ%V?QgmcyqP@x{{zw)h%*2H diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po new file mode 100644 index 0000000000000000000000000000000000000000..28e6e3ce0b0a2f9adc5c7b0fc9799d2177ee4bd9 GIT binary patch literal 819200 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 SYS.GetMemPtrA + >STYA A2osX.SaveCS + ldy #S.PS.PC + pla get PC LO + plx get PC HI + inc Advance PC one Byte + bne .1 + inx + +.1 sec + sbc A2osX.SaveCS + sta (pPs),y + iny + txa + sbc A2osX.SaveCS+1 + sta (pPs),y + clc No error, + rts back to Kernel +*-------------------------------------- * Kernel.MLICALL (AUXLC to MAINLC) * In: * X = MLI Function * A = Param Count *-------------------------------------- -Kernel.MLICALL1 jsr GO.MAINLC - jsr A2osX.MLICALL1 - jsr GO.AUXLC - rts -*-------------------------------------- -* Kernel.DRVCALL (AUXLC to MAINLC) -* In: -* X = DRV Function Index -* Y,A = pDevContext -*-------------------------------------- -Kernel.DRVCALL1 jsr GO.MAINLC - >STYA pDevContext - jsr GO.Kernel - jsr GO.AUXLC - rts -*-------------------------------------- -* Kernel.BINCALL (AUXLC to MAINLC) -* In: -* X = BIN Function Index -* Y,A = pPsContext -*-------------------------------------- -Kernel.BINCALL1 jsr GO.MAINLC - >STYA pPsContext - jsr GO.Kernel - jsr GO.AUXLC - rts -*-------------------------------------- -* Kernel.LIBCALL (AUXLC to MAINLC) -* In: -* X = Lib Function Index -*-------------------------------------- -Kernel.LIBCALL1 jsr GO.MAINLC - jsr GO.Kernel +A2osX.MLICALL1 jsr GO.MAINLC + stx .1 + sta MLICALL.PARAMS + jsr MLI +.1 .BS 1 + .DA MLICALL.PARAMS jsr GO.AUXLC rts *-------------------------------------- @@ -123,28 +95,27 @@ GO.SAVE.REG sta A2osX.SaveA .1 stx GO.EXIT.JMP+1 sty GO.EXIT.JMP+2 sei - ldy R.SP + ldy pStack bcs GO.AUXLC1 GO.MAINLC1 tsx stx A2osX.SaveSX - stx CLRALTZP - ldx RROMBNK2 ldx A2osX.SaveSM txs - sty R.SP + stx CLRALTZP + ldx RROMBNK1 bra GO.EXIT *-------------------------------------- -GO.AUXLC1 tsx +GO.AUXLC1 stx SETALTZP + tsx stx A2osX.SaveSM - stx SETALTZP - ldx RRAMWRAMBNK1 - ldx RRAMWRAMBNK1 ldx A2osX.SaveSX txs - sty R.SP + ldx RRAMWRAMBNK1 + ldx RRAMWRAMBNK1 *-------------------------------------- -GO.EXIT pha push P on stack +GO.EXIT sty pStack + pha push P on stack ldy A2osX.SaveY ldx A2osX.SaveX lda A2osX.SaveA @@ -152,30 +123,12 @@ GO.EXIT pha push P on stack GO.EXIT.JMP jmp $FFFF *-------------------------------------- GO.Reset jsr GO.AUXLC - jsr $E000 + jmp KERNEL.COLDBOOT *-------------------------------------- -GO.Kernel jmp (Kernel.JMP) -*-------------------------------------- -A2osX.SLEEP2 ldy #S.PS.hCS - lda (pPsContext),y - >SYSCALL SYS.GetMemPtrA - >STYA Kernel.JMP - ldy #S.PS.PC - pla get PC LO - plx get PC HI - inc Advance PC one Byte - bne .1 - inx - -.1 sec - sbc Kernel.JMP - sta (pPsContext),y - iny - txa - sbc Kernel.JMP+1 - sta (pPsContext),y - clc No error, - rts back to Kernel +A2osX.SaveCS .BS 2 +A2osX.SaveA .BS 1 +A2osX.SaveX .BS 1 +A2osX.SaveY .BS 1 *-------------------------------------- A2osX.GP.End .EQ * A2osX.GP.SIZE .EQ A2osX.GP.END-A2osX.GP.START diff --git a/A2osX.S.QC.txt b/A2osX.S.QC.txt index f6cbb23b..f0239d73 100644 --- a/A2osX.S.QC.txt +++ b/A2osX.S.QC.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -20,10 +20,16 @@ A2osX.QC.B.Start *-------------------------------------- A2osX.QC.Start .EQ * A2osX.QC cld - jmp A2osX.QC.init -A2osX.QC.Prefix .BS 32 -*-------------------------------------- -A2osX.QC.init bit RROMBNK1 + jmp A2osX.QC.Start1 + +A2osX.QC.Prefix .BS 32 + +A2osX.QC.Start1 sei + ldx #$FF + txs + cli + + bit RROMBNK1 >LDYAI A2osX.QC >STYA POWERUP jsr SETPWRC @@ -53,11 +59,14 @@ A2osX.QC.init bit RROMBNK1 .DA #MLISETPREFIX .DA MLISETPREFIX00 bcc .4 + >LDAXI MSG.SETPREFIXKO jsr A2osX.QC.PrintAX >LDAXI A2osX.QC.Prefix jsr A2osX.QC.PrintAX + >DEBUG + bra .3 .4 >LDAXI MSG.SETPREFIXOK @@ -69,26 +78,18 @@ A2osX.QC.init bit RROMBNK1 jsr A2osX.QC.KLoad bcs .9 - >LDAXI MSG.KLOADING.OK - jsr A2osX.QC.PrintAX - >LDYAI GO.Reset >STYA POWERUP + bit RROMBNK1 jsr SETPWRC - php - pla - sei - tsx - stx A2osX.SaveSM - stx SETALTZP - ldx A2osX.SaveSX - txs - bit RRAMWRAMBNK1 - bit RRAMWRAMBNK1 - pha - plp - jmp $E000 + >LDAXI MSG.STAGE1OK + jsr A2osX.QC.PrintAX + + >DEBUG + + jmp (POWERUP) + .9 >LDAXI MSG.KLOADING.KO jsr A2osX.QC.PrintAX bra * @@ -136,11 +137,11 @@ A2osX.QC.KLoad ldx A2osX.QC.Prefix lda RRAMWRAMBNK1 lda RRAMWRAMBNK1 - >LDYAI MLIREAD00.ADDR+$1F00 + >LDYAI MLIREAD00.ADDR+$2F00 >STYA TmpPtr1 - >LDYAI $E000+$1F00 + >LDYAI $D000+$2F00 >STYA TmpPtr2 - ldx #$20 + ldx #$30 ldy #$F9 do not trash NMI,BRK,IRQ Vectors .3 lda (TmpPtr1),y @@ -186,7 +187,7 @@ MLIOPEN00 .DA #3 MLIREAD00 .DA #4 .BS 1 .DA MLIREAD00.ADDR - .DA $1FFA + .DA $2FFA .BS 2 MLICLOSE00 .DA #1 .BS 1 @@ -197,7 +198,6 @@ MSG.STAGE1 >PSTRING "A2osX[Stage1]:Init" MSG.SETPREFIXOK >PSTRING "Set Prefix OK" MSG.SETPREFIXKO >PSTRING "Insert Vol:" MSG.KLOADING >PSTRING "Loading Kernel..." -MSG.KLOADING.OK >PSTRING "OK" MSG.KLOADING.KO >PSTRING "Error While Loading Kernel." MSG.STAGE1OK >PSTRING "A2osX[Stage1]:Complete." *-------------------------------------- diff --git a/A2osX.S.TOOLS.txt b/A2osX.S.TOOLS.txt index 0f601112..482cdcc9 100644 --- a/A2osX.S.TOOLS.txt +++ b/A2osX.S.TOOLS.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/A2osX.S.txt b/A2osX.S.txt index aacd4051..9610fc04 100644 --- a/A2osX.S.txt +++ b/A2osX.S.txt @@ -1,15 +1,17 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF A + .TF /A2OSX.BOOT/A *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/KERNEL.I .INB INC/IO.I .INB INC/MONITOR.I .INB INC/PRODOS.I @@ -27,11 +29,15 @@ A2osX.ReadBuff .EQ $6800 512 Buffer for MLIREAD01 Boot.Prefix .EQ $6A00 MLI.MAXPATH KM.Filename .EQ $6A80 MLI.MAXPATH *-------------------------------------- +Z80STACK .EQ $0FFF (0FFFFh) Down to $0F00 +Z80JMP .EQ $1000 +*-------------------------------------- A2osX.Start .EQ * .PH A2osX.RelocAddr -A2osX.Init0 ldx #$FF init 6502 stack to highest +A2osX.Init0 + + ldx #$FF init 6502 stack to highest txs - stx A2osX.SaveSM >LDYAI A2osX.Start >STYA TmpPtr1 @@ -50,16 +56,14 @@ A2osX.Init0 ldx #$FF init 6502 stack to highest inc TmpPtr2+1 dex bne .1 - + jmp A2osX.Init1 *-------------------------------------- -A2osX.Init1 jsr HOME +A2osX.Init1 bit RROMBNK1 + jsr HOME >LDAXI MSG.STAGE0 jsr PrintCStrAX - >LDYAI D.STACKSEG - >STYA R.SP init Soft Stack - >LDAXI MSG.SYSMEM jsr PrintCStrAX @@ -78,7 +82,10 @@ A2osX.Init1 jsr HOME >LDAXI MSG.CPU jsr PrintCStrAX jsr Init6502 Y = CPU type - sty A2osX.CPUTYPE + tya + ora #$60 + sta A2osX.CPUTYPE + lda MSG.CPUTYPEH,y tax lda MSG.CPUTYPEL,y @@ -110,17 +117,20 @@ A2osX.Prefix >LDAXI MSG.BOOTPREFIX *-------------------------------------- A2osX.RamDrv >LDAXI MSG.RAMDRV jsr PrintCStrAX + jsr DisableRamDRV bcc .2 + tax - beq .1 - >LDAXI MSG.RAMDRV.KO1 + bne .1 + >LDAXI MSG.RAMDRV.KO0 jsr PrintCStrAX bra A2osX.Z80 -.1 >LDAXI MSG.RAMDRV.KO0 +.1 >LDAXI MSG.RAMDRV.KO1 jsr PrintCStrAX bra A2osX.Z80 + .2 >LDAXI MSG.RAMDRV.OK jsr PrintCStrAX *-------------------------------------- @@ -137,8 +147,6 @@ A2osX.Z80 >LDAXI MSG.Z80 .1 >LDAXI MSG.Z80.KO jsr PrintCStrAX *-------------------------------------- -* WARNING : -*-------------------------------------- A2osX.SetupQC lda RRAMWRAMBNK2 lda RRAMWRAMBNK2 @@ -162,7 +170,7 @@ A2osX.MLIQuit >LDAXI MSG.STAGE0OK jsr PrintCStrAX >DEBUG - + jsr MLI .DA #MLIQUIT .DA MLIQUIT01 @@ -213,24 +221,30 @@ DisableRamDRV php beq .9 S3D2=NODEV, nothing to do .1 ldx DEVCNT + .2 lda DEVLST,x LOOKING FOR $BF, $BB, $B7, $B3 and #$F3 cmp #$B3 beq .3 + dex bpl .2 + plp lda #1 No device found, exit with error sec rts -.3 ldx #0 +.3 cpx DEVCNT + beq .5 + .4 lda DEVLST+1,x sta DEVLST,x inx cpx DEVCNT bne .4 +.5 ldx DEVCNT stz DEVLST,x dec DEVCNT @@ -239,6 +253,10 @@ DisableRamDRV php lda DEVPTRS0D1+1 sta DEVPTRS3D2+1 plp + + jsr MLI + .DA #MLIONLINE + .DA MLIONLINE01 clc Success!! rts @@ -247,7 +265,10 @@ DisableRamDRV php sec rts *-------------------------------------- -InitZ80 ldx #Z80Code.Size +InitZ80 sec + rts + + ldx #Z80Code.Size .1 lda Z80Code.Start-1,x sta $1000-1,x 00000H for Z80 dex @@ -435,7 +456,7 @@ MSG.Z80 >CSTRING "Detecting Z80 CPU..." MSG.Z80.OK >CSTRING "Detected In Slot %d.\n" MSG.Z80.KO >CSTRING "Not Detected.\n" MSG.KMENUM >CSTRING "Looking For Kernel Modules...\n" -MSG.KMLOAD >CSTRING "Loading KM : " +MSG.KMLOAD >CSTRING "\nLoading KM : " MSG.STAGE0OK >CSTRING "A2osX[Stage0]:Complete.\n" MSG.CPUTYPEL .DA #MSG.6502 .DA #MSG.65C02 @@ -452,6 +473,10 @@ MSG.65C816 >CSTRING "65C816.\n" *-------------------------------------- MLIGETPREFIX01 .DA #1 .DA Boot.Prefix +MLIONLINE01 .DA #2 + .DA #0 + .DA MLIONLINE01BUF +MLIONLINE01BUF .BS 256 MLIOPEN01 .DA #3 For DIR listing .DA Boot.Prefix .DA A2osX.OpenBuff1 diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index debf90fc..d903c454 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.BOOT NEW INC 1 AUTO 6 @@ -8,15 +8,16 @@ SET DRV=%A2OSX%DRV/ SET ETC=%A2OSX%ETC/ SET LIB=%A2OSX%LIB/ LOAD CONSOLE.DRV -EXEC GETTY KBD CON SHELL -*LOAD SSC.DRV 9600 N 8 1 -*EXEC GETTY COM2 COM2 SHELL +EXEC GETTY KBD CON LOGIN +*LOAD SSC.DRV 9600 N 8 1 X +*EXEC GETTY COM2 COM2 LOGIN *LOAD PPIC.DRV LOAD UTHERNET.DRV 000E3A123456 EXEC TCPIP ETH3 EXEC DHCPCLNT *EXEC TELNETD -*MOUNT TFTP 192.168.1.5:/AO2SX /TFTP +*MOUNT TFTP 192.168.1.5:/AO2SX /MNT/A2OSX +*MOUNT CIFS 192.168.1.5:/MSSHARE /MNT/MSSHARE LOAD DHGR.DRV LOAD MOUSE.DRV EXEC GUI diff --git a/BIN/ARP.S.txt b/BIN/ARP.S.txt index 42b0b187..b249c860 100644 --- a/BIN/ARP.S.txt +++ b/BIN/ARP.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/ARP + .TF /A2OSX.BOOT/BIN/ARP *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBSTR.I .INB INC/LIBTCPIP.I @@ -18,20 +19,23 @@ ARP.TIMEOUT .EQ 50 50*100ms = 5 sec. *-------------------------------------- ZPPTR1 .EQ ZPBIN *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN - .DA CS.EVENT + .DA CS.DOEVENT .DA CS.QUIT L.LIBSTR .DA LIBSTR L.LIBTCPIP .DA LIBTCPIP @@ -42,17 +46,17 @@ L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 L.MSG2 .DA MSG2 .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIBSTR +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA sta hLIBSTR - >LIBLOADP L.LIBTCPIP + >LDYA L.LIBTCPIP + >LOADLIBYA sta hLIBTCPIP ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y beq CS.INIT.CACHE pha @@ -66,9 +70,9 @@ CS.INIT >LIBLOADP L.LIBSTR stz bCTRLC - lda (pPsContext) + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) rts CC,Give back control to CS.RUN @@ -152,8 +156,7 @@ CS.RUN lda #ARP.TIMEOUT .9 sec rts *-------------------------------------- -CS.EVENT >PULLW pEvent - lda (pEvent) +CS.DOEVENT lda (pEvent) and #S.EVT.F.TIMER is it a TIMER event? beq .1 no.... @@ -170,7 +173,7 @@ CS.EVENT >PULLW pEvent ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y ldy #S.PS.hINDEV - cmp (pPsContext),y + cmp (pPs),y bne .9 ldy #S.EVT.DATAHI is it an O or SAPPLE key ? diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 3369950b..16ebd1d3 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/BIN/CHTYP.S.txt b/BIN/CHTYP.S.txt index 306edfc3..c5559891 100644 --- a/BIN/CHTYP.S.txt +++ b/BIN/CHTYP.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/BIN/DNS.S.txt b/BIN/DNS.S.txt index 111862e2..ef9d6749 100644 --- a/BIN/DNS.S.txt +++ b/BIN/DNS.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt index f282604b..8da59e68 100644 --- a/BIN/LS.S.txt +++ b/BIN/LS.S.txt @@ -1,33 +1,37 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/LS + .TF /A2OSX.BOOT/BIN/LS *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/LIBSTR.I *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT -L.LIB.LIBSTR .DA LIB.LIBSTR +L.LIBSTR .DA LIBSTR L.MSG.VOL.HEADER .DA MSG.VOL.HEADER L.MSG.DIR.HEADER .DA MSG.DIR.HEADER L.MSG.VOL .DA MSG.VOL @@ -37,21 +41,21 @@ L.MSG.VOL.END .DA MSG.VOL.END L.MSG.DIR.END .DA MSG.DIR.END L.PRODOS.FT.TXT .DA PRODOS.FT.TXT .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIB.LIBSTR +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA sta hLIBSTR - stz hDIRPATH - stz hS.LISTDIR - stz hVOLHEADER - stz hDIRHEADER - stz bSTOP - stz bCANCEL + + lda #0 + ldy #DS.END-DS.START-1 +.11 sta (pData),y + dey + bpl .11 ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y beq .1 + >SYSCALL SYS.GetMemPtrA >STYA ZPQuickPtr1 lda (ZPQuickPtr1) @@ -60,50 +64,52 @@ CS.INIT >LIBLOADP L.LIB.LIBSTR lda (ZPQuickPtr1),y cmp #'/' bne .10 + ldy #S.PS.hARGS - bra .2 + lda (pPs),y + bra .3 .10 ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA ldy #S.PS.hPREFIX - lda (pPsContext),y + lda (pPs),y >PUSHA >SYSCALL SYS.PStrCat sta hDIRPATH bra .3 .1 ldy #S.PS.hPREFIX -.2 lda (pPsContext),y + lda (pPs),y .3 >SYSCALL SYS.ListDirInitA - bcs .98 - sta hS.LISTDIR + bcs .9 + ldy #hS.LISTDIR + sta (pData),y - lda (pPsContext) + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) clc rts -.98 pha - lda hLIBSTR - >SYSCALL SYS.FreeMemA - pla - sec +.9 sec rts *-------------------------------------- -CS.RUN lda bCANCEL +CS.RUN ldy #bCANCEL + lda (pData),y beq .1 sec rts -.1 lda bSTOP +.1 ldy #bSTOP + lda (pData),y beq .2 clc rts -.2 lda hS.LISTDIR +.2 ldy #hS.LISTDIR + lda (pData),y >SYSCALL SYS.ListDirNextA bcc .3 @@ -124,7 +130,8 @@ CS.RUN lda bCANCEL bne .31 pla - sta hVOLHEADER + ldy #hVOLHEADER + sta (pData),y >PUSHW ZPQuickPtr1 >PUSHW L.MSG.VOL.HEADER >LIBCALL hLIBSTR,LIBSTR.PRINTF @@ -135,8 +142,9 @@ CS.RUN lda bCANCEL bne .4 pla - sta hDIRHEADER - + ldy #hDIRHEADER + sta (pData),y + >PUSHW ZPQuickPtr1 >PUSHW L.MSG.DIR.HEADER >LIBCALL hLIBSTR,LIBSTR.PRINTF @@ -145,6 +153,7 @@ CS.RUN lda bCANCEL .4 cmp #$D0 Directory ? bne .5 + jsr Push.Dates jsr Push.Dir >PUSHW L.MSG.DIR @@ -263,13 +272,14 @@ Push.Dates ldy #$24 get modification time >PUSHA rts *-------------------------------------- -Push.Footer lda hVOLHEADER +Push.Footer ldy #hVOLHEADER + lda (pData),y beq .20 >SYSCALL SYS.GetMemPtrA >STYA ZPQuickPtr1 - ldy #22 file_count + ldy #$22 file_count lda (ZPQuickPtr1),y >PUSHA dey @@ -279,13 +289,14 @@ Push.Footer lda hVOLHEADER >PUSHW L.MSG.VOL.END >LIBCALL hLIBSTR,LIBSTR.PRINTF -.20 lda hDIRHEADER +.20 ldy #hDIRHEADER + lda (pData),y beq .21 >SYSCALL SYS.GetMemPtrA >STYA ZPQuickPtr1 - ldy #22 file_count + ldy #$22 file_count lda (ZPQuickPtr1),y >PUSHA dey @@ -301,47 +312,60 @@ Push.Footer lda hVOLHEADER CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y ldy #S.PS.hINDEV - cmp (pPsContext),y + cmp (pPs),y bne .9 + lda (pEvent) and #S.EVT.F.KEY is it a KEY event? beq .9 + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? lda (pEvent),y bne .9 + ldy #S.EVT.DATALO lda (pEvent),y cmp #$03 Ctrl-C bne .1 + lda #$FF - sta bCANCEL + ldy #bCANCEL + sta (pData),y bra .8 + .1 cmp #$13 Ctrl-S bne .8 - lda bSTOP + + ldy #bSTOP + lda (pData),y eor #$FF - sta bSTOP -.8 >SYSCALL SYS.DestroyEvent - clc + sta (pData),y + +.8 clc rts .9 sec rts *-------------------------------------- -CS.QUIT lda hVOLHEADER +CS.QUIT ldy #hVOLHEADER + lda (pData),y beq .1 >SYSCALL SYS.FreeMemA -.1 lda hDIRHEADER +.1 ldy #hDIRHEADER + lda (pData),y beq .2 >SYSCALL SYS.FreeMemA -.2 lda hS.LISTDIR +.2 ldy #hS.LISTDIR + lda (pData),y + >SYSCALL SYS.ListDirCloseA - lda hDIRPATH + ldy #hDIRPATH + lda (pData),y beq .3 >SYSCALL SYS.FreeMemA @@ -352,7 +376,7 @@ CS.QUIT lda hVOLHEADER rts *-------------------------------------- CS.END -LIB.LIBSTR >PSTRING "libstr.o" +LIBSTR >PSTRING "libstr.o" MSG.VOL.HEADER >CSTRING "Volume Listing Of %S\n" MSG.DIR.HEADER >CSTRING "Directory Listing Of %S\n" MSG.VOL >CSTRING "/%S\n" @@ -373,9 +397,11 @@ TE2 >PSTRING "ATK" TFF >PSTRING "SYS" PRODOS.FT.DFLT >PSTRING "$ " HEXDIGIT .AS '0123456789ABCDEF' -*-------------------------------------- -DS.START hLIBSTR .BS 1 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START hDIRPATH .BS 1 hS.LISTDIR .BS 1 hVOLHEADER .BS 1 @@ -383,6 +409,7 @@ hDIRHEADER .BS 1 bSTOP .BS 1 bCANCEL .BS 1 DS.END + .ED *-------------------------------------- MAN SAVE BIN/LS.S diff --git a/BIN/LSDEV.S.txt b/BIN/LSDEV.S.txt index c716cc40..ce666f40 100644 --- a/BIN/LSDEV.S.txt +++ b/BIN/LSDEV.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/LSDEV + .TF /A2OSX.BOOT/BIN/LSDEV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBSTR.I *-------------------------------------- @@ -17,17 +18,20 @@ ZPPTR1 .EQ ZPBIN ZPPTR2 .EQ ZPBIN+2 ZPPTR3 .EQ ZPBIN+4 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.EVENT @@ -35,46 +39,25 @@ CS.START cld L.LIBSTR .DA LIBSTR L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 -L.MSG2 .DA MSG2 .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA 0 Data Segment to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIBSTR -* bcs .9 +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA + bcs .9 sta hLIBSTR - >SYSCALL SYS.GetDevTable + >LDYAI DevMgr.Table >STYA ZPPTR1 - stz DEV.COUNT + stz DEV.ID -L0 >PUSHW L.MSG0 + >PUSHW L.MSG0 >LIBCALL hLIBSTR,LIBSTR.PRINTF - lda #22 - sta LINE.COUNT -L1 lda (ZPPTR1) - bmi .1 - jmp L41 - -.1 ldy #S.DEV.hARGS - lda (ZPPTR1),y - beq L10 - >SYSCALL SYS.GetMemPtrA - >PUSHYA - bra L11 - -L10 >PUSHW L.MSG2 -L11 ldy #S.DEV.hCMD - lda (ZPPTR1),y - beq L12 - >SYSCALL SYS.GetMemPtrA - >PUSHYA - bra L13 +.1 lda (ZPPTR1) + cmp #$D8 + bne .8 -L12 >PUSHW L.MSG2 - -L13 lda ZPPTR1 + lda ZPPTR1 clc adc #S.DEV.NAME sta ZPPTR2 @@ -83,35 +66,27 @@ L13 lda ZPPTR1 sta ZPPTR2+1 >PUSHW ZPPTR2 - ldy #S.DEV.hOWNERPS - lda (ZPPTR1),y - >PUSHA Owner PSID - lda (ZPPTR1) push flags + ldy #S.DEV.F + lda (ZPPTR1),y push flags >PUSHA - ldy #S.DEV.ID - lda (ZPPTR1),y - >PUSHA DevID + >PUSHB DEV.ID >PUSHW L.MSG1 >LIBCALL hLIBSTR,LIBSTR.PRINTF -L4 dec LINE.COUNT -L41 lda ZPPTR1 + + lda ZPPTR1 clc adc #S.DEV.SIZE sta ZPPTR1 - bcc L5 + bcc .3 inc ZPPTR1+1 -L5 inc DEV.COUNT - lda DEV.COUNT + +.3 inc DEV.ID + lda DEV.ID cmp #K.DEV.MAX - beq L8 - lda LINE.COUNT - beq L6 - jmp L1 -L6 >DEBUG - jmp L0 + bne .1 -L8 lda #0 tell TSKMGR that all done ok, but - sec we do not want to stay in memory +.8 lda #0 tell TSKMGR that all done ok, but +.9 sec we do not want to stay in memory rts *-------------------------------------- CS.RUN @@ -119,21 +94,16 @@ CS.EVENT clc rts *-------------------------------------- CS.QUIT lda hLIBSTR - - bra * - >SYSCALL SYS.UnloadLibA clc rts *-------------------------------------- CS.END -hLIBSTR .BS 1 -DEV.COUNT .BS 1 -LINE.COUNT .BS 1 LIBSTR >PSTRING "libstr.o" -MSG0 >CSTRING "hDev Flags PID NAME CMD ARGS\n" -MSG1 >CSTRING " %03d %b $%h %4S %16S %32S\n" -MSG2 >PSTRING "(none)" +MSG0 >CSTRING "ID Flags Name\n" +MSG1 >CSTRING "%03d %b %4S\n" +hLIBSTR .BS 1 +DEV.ID .BS 1 MAN SAVE BIN/LSDEV.S ASM diff --git a/BIN/MD.S.txt b/BIN/MD.S.txt index e69de29b..ef70d7e6 100644 --- a/BIN/MD.S.txt +++ b/BIN/MD.S.txt @@ -0,0 +1,133 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/BIN/MD +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/KERNEL.I + .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/LIBSTR.I +*-------------------------------------- +ZPPTR1 .EQ ZPBIN +ZPPTR2 .EQ ZPBIN+2 +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- +CS.START cld + jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT + .DA 0 +*-------------------------------------- +CS.INIT stz hFullPath + ldy #S.PS.hARGS + lda (pPs),y + beq .9 + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + beq .9 + + ldy #1 + lda (ZPQuickPtr1),y + cmp #'/' + bne .1 + + ldy #S.PS.hARGS + lda (pPs),y + bra .2 + +.1 ldy #S.PS.hARGS + lda (pPs),y + >PUSHA + ldy #S.PS.hPREFIX + lda (pPs),y + >PUSHA + >SYSCALL SYS.PStrCat + sta hFullPath + +.2 >SYSCALL SYS.MLICreateDirA + bcc .8 + + pha + jsr .8 + pla + sec + rts + +.8 lda hFullPath + beq .88 + >SYSCALL SYS.FreeMemA +.88 clc + rts + +.9 lda hFullPath + beq .99 + >SYSCALL SYS.FreeMemA +.99 lda #SYSMGR.ERRSYN + sec + rts +*-------------------------------------- +CS.RUN sec + rts +*-------------------------------------- +CS.DOEVENT sec + rts +*-------------------------------------- +CS.QUIT clc + rts +*-------------------------------------- +PRBYTE pha + lsr + lsr + lsr + lsr + ora #$B0 + cmp #$BA + bcc .1 + adc #6 +.1 jsr COUT + pla + and #$0F + ora #$B0 + cmp #$BA + bcc COUT + adc #6 + bra COUT +*-------------------------------------- +CROUT lda #13 +*-------------------------------------- +COUT phx + phy + ldx #DEVMGR.COUT + jsr pDevJmp + ply + plx + rts +pDevJmp jmp (pDev) +*-------------------------------------- +CS.END +hFullPath .BS 1 +*-------------------------------------- +MAN +SAVE BIN/MD.S +ASM diff --git a/BIN/MEM.S.txt b/BIN/MEM.S.txt index ea3af86e..51e121f0 100644 --- a/BIN/MEM.S.txt +++ b/BIN/MEM.S.txt @@ -1,31 +1,38 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/MEM + .TF /A2OSX.BOOT/BIN/MEM *-------------------------------------- .INB INC/MACROS.I + .INB INC/KERNEL.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/LIBSTR.I *-------------------------------------- +PAGELEN .EQ 22 +*-------------------------------------- ZPPTR1 .EQ ZPBIN ZPPTR2 .EQ ZPBIN+2 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT @@ -38,55 +45,120 @@ L.MSG3 .DA MSG3 L.MSG4 .DA MSG4 L.MSG5 .DA MSG5 L.MSG6 .DA MSG6 -L.MSG7 .DA MSG7 .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIBSTR +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA bcs .9 sta hLIBSTR - stz LINE.COUNT - stz MEM.COUNT - stz USED.COUNT - stz bSTOP - stz bCANCEL + lda #0 + ldy #DS.END-DS.START-1 - lda (pPsContext) +.1 sta (pData),y + dey + bpl .1 + + ldy #MEM.COUNT Skip SLOT0 + lda (pData),y + inc + sta (pData),y + + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) clc .9 rts *-------------------------------------- -CS.RUN lda bCANCEL - bne .99 - lda bSTOP +CS.RUN ldy #bCANCEL + lda (pData),y + bne .9 + + ldy #bSTOP + lda (pData),y bne .8 - lda LINE.COUNT + + ldy #LINE.COUNT + lda (pData),y bne .1 + >PUSHW L.MSG0 >LIBCALL hLIBSTR,LIBSTR.PRINTF -.1 lda MEM.COUNT +.1 ldy #MEM.COUNT + lda (pData),y >SYSCALL SYS.GetMemByIDA >STYA ZPPTR1 lda (ZPPTR1) bpl .2 - inc USED.COUNT + + ldy #USED.COUNT + lda (pData),y + inc + sta (pData),y + .2 jsr CS.RUN.PRINTMEM - inc MEM.COUNT - lda MEM.COUNT - cmp MEMMGR.TABLESIZE + ldy #MEM.COUNT + lda (pData),y + inc + sta (pData),y + cmp MemMgr.LastSlot beq .9 -.8 - clc +.8 clc rts .9 jsr CS.RUN.PRINTEND -.99 sec + sec + rts +*-------------------------------------- +CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPs),y + bne .9 + + lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .9 + + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (pEvent),y + bne .9 + + ldy #S.EVT.DATALO + lda (pEvent),y + cmp #$03 Ctrl-C + bne .1 + + lda #$FF + ldy #bCANCEL + sta (pData),y + bra .8 + +.1 cmp #$13 Ctrl-S + bne .2 + + ldy #bSTOP + lda (pData),y + eor #$FF + sta (pData),y + bra .8 + +.2 ldy #bSTOP + lda #0 + sta (pData),y + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc rts *-------------------------------------- CS.RUN.PRINTMEM ldy #S.MEM.LEN @@ -96,6 +168,7 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN lda (ZPPTR1),y ply >PUSHYA + ldy #S.MEM.PTR lda (ZPPTR1),y pha @@ -103,18 +176,25 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN lda (ZPPTR1),y ply >PUSHYA + ldy #S.MEM.REFCNT lda (ZPPTR1),y >PUSHA + ldy #S.MEM.OWNERPID lda (ZPPTR1),y >PUSHA + lda (ZPPTR1) >PUSHA - lda MEM.COUNT + + ldy #MEM.COUNT + lda (pData),y >PUSHA + >PUSHW L.MSG1 >LIBCALL hLIBSTR,LIBSTR.PRINTF + ldy #S.MEM.BIN lda (ZPPTR1),y bne .3 @@ -132,15 +212,18 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN lda #"|" jsr COUT ldy #1 + .1 lda (ZPPTR2),y ora #$80 cmp #$A0 bcs .2 + ora #$20 .2 jsr COUT iny cpy #40 bne .1 + lda #"}" jsr COUT bra .4 @@ -150,84 +233,52 @@ CS.RUN.PRINTMEM ldy #S.MEM.LEN >LIBCALL hLIBSTR,LIBSTR.PRINTP .4 jsr CROUT - inc LINE.COUNT - lda LINE.COUNT - cmp #22 + ldy #LINE.COUNT + lda (pData),y + inc + sta (pData),y + cmp #PAGELEN bne .5 + lda #$FF - sta bSTOP - stz LINE.COUNT + ldy #bSTOP + sta (pData),y + + ldy #LINE.COUNT + lda #0 + sta (pData),y + .5 rts *-------------------------------------- -CS.RUN.PRINTEND >PUSHB MEM.COUNT - >PUSHB USED.COUNT +CS.RUN.PRINTEND ldy #MEM.COUNT + >PUSHB (pData),y + ldy #USED.COUNT + >PUSHB (pData),y >PUSHW L.MSG2 >LIBCALL hLIBSTR,LIBSTR.PRINTF - >PUSHW MEMMGR.LOMEM + >PUSHW MemMgr.HiMem >PUSHW L.MSG3 >LIBCALL hLIBSTR,LIBSTR.PRINTF - >PUSHW MEMMGR.MLLIMIT + >PUSHW MemMgr.Free >PUSHW L.MSG4 >LIBCALL hLIBSTR,LIBSTR.PRINTF - - >PUSHW MEMMGR.MHLIMIT + + >PUSHW MemMgr.LoMem >PUSHW L.MSG5 >LIBCALL hLIBSTR,LIBSTR.PRINTF - - >PUSHW MEMMGR.HIMEM + + lda MemMgr.Free + sec + sbc MemMgr.LoMem + tay + lda MemMgr.Free+1 + sbc MemMgr.LoMem+1 + + >PUSHYA >PUSHW L.MSG6 >LIBCALL hLIBSTR,LIBSTR.PRINTF - - >PUSHW MEMMGR.MFREE - >PUSHW L.MSG7 - >LIBCALL hLIBSTR,LIBSTR.PRINTF - rts -*-------------------------------------- -CS.DOEVENT >PULLW pEvent - ldy #S.EVT.hDEV is Event from active IN device? - lda (pEvent),y - ldy #S.PS.hINDEV - cmp (pPsContext),y - bne .9 - - lda (pEvent) - and #S.EVT.F.KEY is it a KEY event? - beq .9 - - ldy #S.EVT.DATAHI is it an O or SAPPLE key ? - lda (pEvent),y - bne .9 - - ldy #S.EVT.DATALO - lda (pEvent),y - cmp #$03 Ctrl-C - bne .1 - lda #$FF - sta bCANCEL - bra .8 - -.1 cmp #$13 Ctrl-S - bne .2 - lda bSTOP - eor #$FF - sta bSTOP - bra .8 - -.2 lda bSTOP - beq .8 - stz bSTOP - -.8 >SYSCALL SYS.DestroyEvent - clc - rts -.9 sec - rts -*-------------------------------------- -CS.QUIT lda hLIBSTR - >SYSCALL SYS.UnloadLibA - clc rts *-------------------------------------- PRBYTE pha @@ -252,33 +303,34 @@ CROUT lda #13 *-------------------------------------- COUT phx phy - >PUSHA - ldy #S.PS.hOUTDEV - lda (pPsContext),y - >SYSCALL SYS.DevOutA + ldx #DEVMGR.COUT + jsr pDevJmp ply plx rts +pDevJmp jmp (pDev) *-------------------------------------- CS.END -DS.START -*-------------------------------------- +LIBSTR >PSTRING "libstr.o" +MSG0 >CSTRING "hMem Flags PID REF PTR LEN BINPATH/DATA\n" +MSG1 >CSTRING " %03d %b $%h $%h $%H $%H " +MSG2 >CSTRING "\nAllocated hMem:%d, Total:%d\n" +MSG3 >CSTRING "High Memory: $%H\n" +MSG4 >CSTRING "Free ULimit: $%H\n" +MSG5 >CSTRING "Low Memory: $%H\n" +MSG6 >CSTRING "\nFree Memory: %D Bytes.\n" hLIBSTR .BS 1 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START LINE.COUNT .BS 1 MEM.COUNT .BS 1 USED.COUNT .BS 1 bSTOP .BS 1 bCANCEL .BS 1 -LIBSTR >PSTRING "libstr.o" -MSG0 >CSTRING "hMem Flags PID REF PTR LEN BINPATH/DATA\n" -MSG1 >CSTRING " %03d %b $%h $%h $%H $%H " -MSG2 >CSTRING "\nAllocated hMem:%d, Total:%d\n" -MSG3 >CSTRING "Low Memory: $%H\n" -MSG4 >CSTRING "Low Free PTR: $%H\n" -MSG5 >CSTRING "High Free PTR: $%H\n" -MSG6 >CSTRING "High Memory: $%H\n" -MSG7 >CSTRING "\nFree Memory: %D Bytes.\n" DS.END + .ED *-------------------------------------- MAN SAVE BIN/MEM.S diff --git a/BIN/NETCFG.S.txt b/BIN/NETCFG.S.txt index eea2293c..3ad69086 100644 --- a/BIN/NETCFG.S.txt +++ b/BIN/NETCFG.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/NETCFG + .TF /A2OSX.BOOT/BIN/NETCFG *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBSTR.I .INB INC/LIBTCPIP.I @@ -17,17 +18,20 @@ AUTO 6 ZPPTR1 .EQ ZPBIN ZPPTR2 .EQ ZPBIN+2 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT @@ -49,10 +53,9 @@ L.MSG1.HOSTNAME .DA MSG1.HOSTNAME L.MSG1.DOMAIN .DA MSG1.DOMAIN L.MSG1.END .DA MSG1.END .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segemnt to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIBSTR +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA sta hLIBSTR lda #K.PROTOID.IP @@ -195,12 +198,7 @@ MSG1.DNS >CSTRING " DNS : %d.%d.%d.%d,%d.%d.%d.%d\n" MSG1.HOSTNAME >CSTRING " Hostname : %s" MSG1.DOMAIN >CSTRING ".%s" MSG1.END >CSTRING "\nEnd of network configuration.\n" -*-------------------------------------- -DS.START -*-------------------------------------- hLIBSTR .BS 1 -*-------------------------------------- -DS.END MAN SAVE BIN/NETCFG.S ASM diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt index d72929be..b37a6aee 100644 --- a/BIN/PING.S.txt +++ b/BIN/PING.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/PING + .TF /A2OSX.BOOT/BIN/PING *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBSTR.I .INB INC/LIBTCPIP.I @@ -20,44 +21,44 @@ ZPFrameBase1 .EQ ZPBIN ZPFrameLen1 .EQ ZPBIN+2 ZPFramePtr1 .EQ ZPBIN+4 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN - .DA CS.EVENT + .DA CS.DOEVENT .DA CS.QUIT L.LIBSTR .DA LIBSTR L.LIBTCPIP .DA LIBTCPIP L.SSCANF.IP .DA SSCANF.IP -L.DST.IP .DA DST.IP L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 L.MSG2 .DA MSG2 L.MSG3 .DA MSG3 .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- CS.INIT ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y bne .1 lda #SYSMGR.ERRSYN sec rts -.1 >LIBLOADP L.LIBSTR +.1 >LDYA L.LIBSTR + >LOADLIBYA sta hLIBSTR - >LIBLOADP L.LIBTCPIP + >LDYA L.LIBTCPIP + >LOADLIBYA sta hLIBTCPIP >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? @@ -72,45 +73,52 @@ CS.INIT ldy #S.PS.hARGS sta hDev lda A2OSX.RANDOM16 - sta Identifier + ldy #Identifier + sta (pData),y lda A2OSX.RANDOM16+1 - sta Identifier+1 + iny + sta (pData),y - stz Sequence - stz Sequence+1 + lda #0 + ldy #Sequence + sta (pData),y + iny + sta (pData),y - lda (pPsContext) + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) clc .9 rts *-------------------------------------- -CS.RUN >PUSHW L.DST.IP +CS.RUN >PUSHW pData DST.IP >PUSHW L.SSCANF.IP ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >SYSCALL SYS.GetMemPtrA >PUSHYA >LIBCALL hLIBSTR,LIBSTR.SSCANF bcc CS.RUN.IPOK lda #PING.TIMEOUT - sta TimeOut - -CS.RUN.DNSQUERY >PUSHW L.DST.IP + ldy #TimeOut + sta (pData),y + +CS.RUN.DNSQUERY >PUSHW pData DST.IP ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY bcc CS.RUN.IPOK jsr A2osX.SLEEP - lda TimeOut + ldy #TimeOut + lda (pData),y bne CS.RUN.DNSQUERY ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >SYSCALL SYS.GetMemPtrA >PUSHYA >PUSHW L.MSG0 @@ -120,24 +128,37 @@ CS.RUN.DNSQUERY >PUSHW L.DST.IP CS.RUN.RTS rts CS.RUN.IPOK ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >SYSCALL SYS.GetMemPtrA >PUSHYA - >PUSHB DST.IP+3 - >PUSHB DST.IP+2 - >PUSHB DST.IP+1 - >PUSHB DST.IP + ldy #3 + >PUSHB (pData),y DST.IP+3 + dey + >PUSHB (pData),y DST.IP+2 + dey + >PUSHB (pData),y DST.IP+1 + >PUSHB (pData) DST.IP >PUSHW L.MSG1 >LIBCALL hLIBSTR,LIBSTR.PRINTF CS.RUN.ECHO >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ICMP.FRAME bcs CS.RUN.RTS >STYA ZPFrameBase1 - stx hFrame + txa + ldy #hFrame + sta (pData),y + + ldx #3 + ldy #0 +.10 lda (pData),y + pha + iny + dex + bpl .10 ldx #3 ldy #S.IP.DST+3 -.1 lda DST.IP,x +.1 pla sta (ZPFrameBase1),y dey dex @@ -147,63 +168,92 @@ CS.RUN.ECHO >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ICMP.FRAME lda #S.ICMP.TYPE.ECHOREQ sta (ZPFrameBase1),y - ldy #S.ICMP.IDENTIFIER - lda Identifier - sta (ZPFrameBase1),y + ldy #Identifier + lda (pData),y + tax iny - lda Identifier+1 + lda (pData),y + + ldy #S.ICMP.IDENTIFIER+1 + sta (ZPFrameBase1),y + dey + txa sta (ZPFrameBase1),y - inc Sequence + ldy #Sequence+1 + lda (pData),y + tax + dey + lda (pData),y + inc + sta (pData),y bne .2 - inc Sequence+1 + pha + inx + txa + sta (pData),y + pla .2 ldy #S.ICMP.SEQUENCE - lda Sequence sta (ZPFrameBase1),y iny - lda Sequence+1 + txa sta (ZPFrameBase1),y lda #PING.TIMEOUT - sta TimeOut + ldy #TimeOut + sta (pData),y .3 >PUSHWI S.ICMP+32 - lda hFrame + ldy #hFrame + lda (pData),y >SYSCALL SYS.GetMemPtrA >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ICMP.FRAME bcc .4 jsr A2osX.SLEEP - lda TimeOut + ldy #TimeOut + lda (pData),y bne .3 -.4 lda hFrame +.4 ldy #hFrame + lda (pData),y >SYSCALL SYS.FreeMemA - stz bReply + ldy #bReply + lda #0 + sta (pData),y lda #PING.TIMEOUT - sta TimeOut + ldy #TimeOut + sta (pData),y CS.RUN.WAIT jsr A2osX.SLEEP - lda bReply + ldy #bReply + lda (pData),y bne .1 - lda bCTRLC + ldy #bCTRLC + lda (pData),y bne CS.RUN.ERROR - lda TimeOut + ldy #TimeOut + lda (pData),y bne CS.RUN.WAIT - >PUSHB DST.IP+3 - >PUSHB DST.IP+2 - >PUSHB DST.IP+1 - >PUSHB DST.IP + ldy #3 + >PUSHB (pData),y DST.IP+3 + dey + >PUSHB (pData),y DST.IP+2 + dey + >PUSHB (pData),y DST.IP+1 + >PUSHB (pData) DST.IP >PUSHW L.MSG2 >LIBCALL hLIBSTR,LIBSTR.PRINTF -.1 lda bCTRLC +.1 ldy #bCTRLC + lda (pData),y bne CS.RUN.ERROR - lda TimeOut + ldy #TimeOut + lda (pData),y beq .2 jsr A2osX.SLEEP @@ -214,14 +264,16 @@ CS.RUN.WAIT jsr A2osX.SLEEP CS.RUN.ERROR sec rts *-------------------------------------- -CS.EVENT lda (pEvent) +CS.DOEVENT lda (pEvent) and #S.EVT.F.TIMER is it a TIMER event? beq .1 no.... - lda TimeOut + ldy #TimeOut + lda (pData),y beq .10 - dec TimeOut + dec + sta (pData),y .10 sec do not discard TIMER event rts @@ -232,7 +284,7 @@ CS.EVENT lda (pEvent) ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y ldy #S.PS.hINDEV - cmp (pPsContext),y + cmp (pPs),y bne .9 ldy #S.EVT.DATAHI is it an O or SAPPLE key ? @@ -245,7 +297,8 @@ CS.EVENT lda (pEvent) bne .8 lda #$FF - sta bCTRLC + ldy #bCTRLC + sta (pData),y bra .8 .2 lda (pEvent) @@ -275,15 +328,19 @@ CS.EVENT lda (pEvent) ldy #S.ICMP.IDENTIFIER lda (ZPFrameBase1),y - cmp Identifier - bne .9 + tax iny lda (ZPFrameBase1),y - cmp Identifier+1 + ldy #Identifier+1 + cmp (pData),y bne .9 + dey + txa + cmp (pData),y + bne .9 + jsr CS.EVENT.REPLY -.8 >SYSCALL SYS.DestroyEvent - clc +.8 clc rts .9 sec @@ -304,7 +361,7 @@ CS.EVENT.REPLY lda #PING.TIMEOUT adc #K.TIMER16RESOLUTION*20 sta TimeOut.ms bcc .2 - inc TimeOut+1+1 + inc TimeOut .2 dey bne .1 @@ -329,7 +386,10 @@ CS.EVENT.REPLY lda #PING.TIMEOUT >PUSHW L.MSG3 >LIBCALL hLIBSTR,LIBSTR.PRINTF - inc bReply + ldy #bReply + lda (pData),y + inc + sta (pData),y rts *-------------------------------------- CS.QUIT lda hLIBTCPIP @@ -347,20 +407,23 @@ MSG0 >CSTRING "%S: Unknown host\n" MSG1 >CSTRING "PING %d.%d.%d.%d (%S)\n" MSG2 >CSTRING "%d.%d.%d.%d: TimeOut/Host unreachable\n" MSG3 >CSTRING "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\n" -*-------------------------------------- -DS.START hLIBSTR .BS 1 hLIBTCPIP .BS 1 hDev .BS 1 +TimeOut.ms .BS 2 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START DST.IP .BS 4 hFrame .BS 1 TimeOut .BS 1 -TimeOut.ms .BS 2 Identifier .BS 2 Sequence .BS 2 bCTRLC .BS 1 bReply .BS 1 DS.END + .ED *-------------------------------------- MAN SAVE BIN/PING.S diff --git a/BIN/PS.S.txt b/BIN/PS.S.txt index 49dce0d7..26d1bf63 100644 --- a/BIN/PS.S.txt +++ b/BIN/PS.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF BIN/PS + .TF /A2OSX.BOOT/BIN/PS *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBSTR.I *-------------------------------------- @@ -17,17 +18,20 @@ ZPPTR1 .EQ ZPBIN ZPPTR2 .EQ ZPBIN+2 ZPPTR3 .EQ ZPBIN+4 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT @@ -37,13 +41,14 @@ L.MSG0 .DA MSG0 L.MSG1 .DA MSG1 L.MSG2 .DA MSG2 .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA 0 Data Segment to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIBSTR +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA sta hLibStr - - >LDYAI TSKMGR.TABLE + clc + rts +*-------------------------------------- +CS.RUN >LDYAI TSKMGR.TABLE+S.PS.SIZE >STYA ZPPTR1 stz PS.COUNT @@ -52,13 +57,17 @@ CS.INIT >LIBLOADP L.LIBSTR .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 lda (ZPPTR1),y >SYSCALL SYS.GetMemPtrA @@ -83,17 +92,16 @@ CS.INIT >LIBLOADP L.LIBSTR sta ZPPTR1 bcc .5 inc ZPPTR1+1 + .5 inc PS.COUNT lda PS.COUNT cmp #K.PS.MAX - beq .8 - jmp .1 + bne .1 -.8 lda #0 tell TSKMGR that all done ok, but + lda #0 tell TSKMGR that all done ok, but sec we do not want to stay in memory rts *-------------------------------------- -CS.RUN CS.DOEVENT clc rts *-------------------------------------- @@ -106,8 +114,8 @@ CS.END hLibStr .BS 1 PS.COUNT .BS 1 LIBSTR >PSTRING "libstr.o" -MSG0 >CSTRING "hPS Flags PID CMD ARGS\n" -MSG1 >CSTRING " %03d %b $%h %16S %32S\n" +MSG0 >CSTRING "ID Flags PID CMD ARGS\n" +MSG1 >CSTRING "%03d %b %03d %16S %32S\n" MSG2 >PSTRING "(none)" MAN SAVE BIN/PS.S diff --git a/BIN/TEST.S.txt b/BIN/TEST.S.txt index 97daaeb7..9a244b65 100644 --- a/BIN/TEST.S.txt +++ b/BIN/TEST.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/BIN/_TEMPLATE.S.txt b/BIN/_TEMPLATE.S.txt index aa02877d..0f6d986b 100644 --- a/BIN/_TEMPLATE.S.txt +++ b/BIN/_TEMPLATE.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index b84ee5ba..f2ddf4cd 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -1,45 +1,73 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF DRV/CONSOLE.DRV + .TF /A2OSX.BOOT/DRV/CONSOLE.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/KERNEL.I .INB INC/IO.I *-------------------------------------- +CURSOR.BLINK.SPEED .EQ 2 +*-------------------------------------- ZPBASL1 .EQ ZPDRV ZPBASL2 .EQ ZPDRV+2 *-------------------------------------- -* Main DRV entry point -* input : -* X = CMD -* 0 : OPEN -* 2 : GETEVENT -* 6 : OUT -* 8 : CLOSE -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE -*-------------------------------------- -CURSOR.BLINK.SPEED .EQ 2 +* File Header (16 Bytes) *-------------------------------------- CS.START cld - jmp (.1,x) -.1 .DA OPEN + jmp Dev.Detect cld,jmp abs=DRV + .DA #$61 6502,Level 1 (65c02) + .DA #1 DRV Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length + .DA DEV.HEADER-CS.START Device Header Offset + .DA DRV.CS.START-CS.START Driver Code Offset + .DA DRV.CS.END-DRV.CS.START Drv Code Length +*-------------------------------------- +* Relocation Table +*-------------------------------------- +L.MSG.DETECT .DA MSG.DETECT + .DA 0 End Of Reloc Table +*-------------------------------------- +Dev.Detect >LDYA L.MSG.DETECT + >SYSCALL SYS.SysScrPPSTRYA + + lda A2osX.SCREENS + ora #A2osX.SCREENS.C + sta A2osX.SCREENS + + clc + rts +CS.END +MSG.DETECT >PSTRING "\nApple IIe/IIc 80 Col Driver." +*-------------------------------------- +* Device Header (16 Bytes) +*-------------------------------------- +DEV.HEADER cld + jmp (DRV.CS.START,x) + .DA #S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR + >PSTRING "CON" NAME + .HS 00 NAME must Be 5 bytes long + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +* Driver Code +*-------------------------------------- +DRV.CS.START .DA OPEN .DA GETEVENT - .DA OUT + .DA COUT .DA CLOSE .DA GETINFO + .DA IRQ +L.DEVINFO .DA DEVINFO .DA 0 end or relocation - .DA CS.END-CS.START Code Length To Relocate - .DA 0 Data Segemnt to Allocate *-------------------------------------- OPEN stz CURON lda #$80 @@ -47,31 +75,10 @@ OPEN stz CURON jsr HOME - lda #S.DEV.F.CHAR+S.DEV.F.EVENT+S.DEV.F.OUT - sta (pDevContext) - - ldy #S.DEV.NAME - ldx #0 -.1 lda DEVNAME,x - sta (pDevContext),y - cpx DEVNAME - beq .8 - inx - iny - bne .1 - -.8 lda A2osX.SCREENS - ora #A2osX.SCREENS.C - sta A2osX.SCREENS - - lda #A2osX.SCREENS.C - >SYSCALL SYS.ScreenSelectA - clc rts *-------------------------------------- -GETEVENT >PULLW pEvent - lda A2osX.TIMER16 +GETEVENT lda A2osX.TIMER16 and #CURSOR.BLINK.SPEED eor CURON beq .9 @@ -81,24 +88,24 @@ GETEVENT >PULLW pEvent sec rts *-------------------------------------- -OUT >PULLA - jsr COUT +COUT jsr COUT1 clc rts *-------------------------------------- -CLOSE lda A2osX.SCREENS - and #$FF^A2osX.SCREENS.C - sta A2osX.SCREENS +CLOSE +* lda A2osX.SCREENS +* and #$FF^A2osX.SCREENS.C +* sta A2osX.SCREENS clc rts *-------------------------------------- -GETINFO clc +GETINFO >LDYA L.DEVINFO +IRQ clc rts - *-------------------------------------- * PRIVATE *-------------------------------------- -COUT cmp #8 +COUT1 cmp #8 bne .2 ldx CH beq .10 @@ -113,7 +120,8 @@ COUT cmp #8 sta CH dec CV -.12 lda #$A0 +.12 lda #$20 + ora INVFLG ldx CH ldy CV jsr SetCharAtXY @@ -121,6 +129,7 @@ COUT cmp #8 .2 cmp #13 beq CROUT + ora INVFLG ldx CH ldy CV jsr SetCharAtXY @@ -131,14 +140,19 @@ FSOUT ldx CH rts *-------------------------------------- CROUT jsr CLREOL +*-------------------------------------- CROUT1 stz CH ldy CV cpy #23 beq SCROLL.UP inc CV rts - +*-------------------------------------- SCROLL.UP ldx #0 + + lda RD80STORE + pha + sta SET80STORE .1 lda BASEL,x @@ -169,13 +183,18 @@ SCROLL.UP ldx #0 cpx #23 bne .1 + jsr CLREOL + pla + bmi .8 + sta CLR80STORE - +.8 rts *-------------------------------------- CLREOL ldx CH .1 phx ldy CV - lda #$A0 + lda #$20 + ora INVFLG jsr SetCharAtXY plx inx @@ -186,8 +205,6 @@ CLREOL ldx CH HOME stz CH stz CV - lda RDPAGE2 - pha lda RD80STORE pha @@ -221,23 +238,15 @@ HOME stz CH bpl .1 pla - bmi .4 + bmi .8 sta CLR80STORE - bra .5 -.4 sta SET80STORE - -.5 pla - bmi .6 - sta CLRPAGE2 - bra .8 -.6 sta SETPAGE2 .8 rts *-------------------------------------- CUROFF lda CURON beq CUREXIT.RTS -CURBLNK lda A2osX.ACTIVESCRN +CURBLNK lda A2osX.ASCREEN and #A2osX.SCREENS.C bne CURBLNK1 @@ -268,8 +277,6 @@ CUREXIT lda CURON CUREXIT.RTS rts *-------------------------------------- SetCharAtXY pha - lda RDPAGE2 - pha lda RD80STORE pha sta SET80STORE @@ -287,23 +294,16 @@ SetCharAtXY pha lda BASEH,y sta ZPBASL1+1 - ply plx pla sta (ZPBASL1) - tya - bmi .3 + txa + bmi .8 sta CLR80STORE -.3 txa - bpl .4 - sta SETPAGE2 - rts -.4 sta CLRPAGE2 - rts + +.8 rts *-------------------------------------- -GetCharAtXY lda RDPAGE2 - pha - lda RD80STORE +GetCharAtXY lda RD80STORE pha sta SET80STORE txa @@ -323,28 +323,22 @@ GetCharAtXY lda RDPAGE2 lda (ZPBASL1) plx - bmi .3 + bmi .8 sta CLR80STORE -.3 plx - bpl .4 - - sta SETPAGE2 - rts - -.4 sta CLRPAGE2 - rts +.8 rts *-------------------------------------- -CS.END -DEVNAME >PSTRING "CON" +DRV.CS.END +BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0 +BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07 CH .BS 1 CV .BS 1 INVFLG .BS 1 CURON .BS 1 CURCHAR .BS 1 -*-------------------------------------- -BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0 -BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07 +DEVINFO .DA #S.DEVINFO.TYPE.CHAR + .DA #80 + .DA #24 *-------------------------------------- MAN SAVE DRV/CONSOLE.DRV.S diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt index b6881735..47ee3248 100644 --- a/DRV/DHGR.DRV.S.txt +++ b/DRV/DHGR.DRV.S.txt @@ -1,73 +1,81 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF DRV/DHGR.DRV + .TF /A2OSX.BOOT/DRV/DHGR.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/KERNEL.I .INB INC/IO.I *-------------------------------------- ZPBASE .EQ ZPDRV ZPCOLOR .EQ ZPDRV+2 *-------------------------------------- -* Main DRV entry point -* input : -* X = CMD -* 0 : OPEN -* 2 : GETEVENT -* 6 : OUT -* 8 : CLOSE -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld - jmp (.1,x) -.1 .DA OPEN + jmp Dev.Detect cld,jmp abs=DRV + .DA #$61 6502,Level 1 (65c02) + .DA #1 DRV Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length + .DA DEV.HEADER-CS.START Device Header Offset + .DA DRV.CS.START-CS.START Driver Code Offset + .DA DRV.CS.END-DRV.CS.START Drv Code Length +*-------------------------------------- +* Relocation Table +*-------------------------------------- +L.MSG.DETECT .DA MSG.DETECT + .DA 0 End Of Reloc Table +*-------------------------------------- +Dev.Detect >LDYA L.MSG.DETECT + >SYSCALL SYS.SysScrPPSTRYA + + lda A2osX.SCREENS + ora #A2osX.SCREENS.G + sta A2osX.SCREENS + + clc + rts +CS.END +MSG.DETECT >PSTRING "\nApple IIe/IIc DoubleHGR Driver." +*-------------------------------------- +* Device Header (16 Bytes) +*-------------------------------------- +DEV.HEADER cld + jmp (DRV.CS.START,x) + .DA #0 + >PSTRING "GFX" NAME + .HS 00 NAME must Be 5 bytes long + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +* Driver Code +*-------------------------------------- +DRV.CS.START .DA OPEN .DA GETEVENT - .DA OUT + .DA COUT .DA CLOSE .DA GETINFO + .DA IRQ .DA SETPIXEL .DA GETPIXEL .DA HLINE .DA VLINE - .DA FILLREC .DA BITBLT + .DA FILLREC L.DEVINFO .DA DEVINFO .DA 0 end or relocation - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- -OPEN lda #S.DEV.F.GFX - sta (pDevContext) +OPEN sta SETHIRES + sta SET80STORE prepare for page switching - ldy #S.DEV.NAME - ldx #0 -.1 lda DEVNAME,x - sta (pDevContext),y - cpx DEVNAME - beq .8 - inx - iny - bne .1 - - -.8 lda A2osX.SCREENS - ora #A2osX.SCREENS.G - sta A2osX.SCREENS - - lda #A2osX.SCREENS.G - >SYSCALL SYS.ScreenSelectA - - sta SET80STORE ldx #192 .81 dex @@ -77,61 +85,37 @@ OPEN lda #S.DEV.F.GFX lda BASEH,x sta ZPBASE+1 - lda #$D5 - + lda #$55 +* lda #$00 + ldy #39 sta SETPAGE2 .82 sta (ZPBASE),y dey bpl .82 - lda #$AA - + lda #$2A +* lda #$00 + ldy #39 sta CLRPAGE2 .83 sta (ZPBASE),y dey bpl .83 - dex - - lda BASEL,x - sta ZPBASE - lda BASEH,x - sta ZPBASE+1 - - lda #$2A - - ldy #39 - sta SETPAGE2 -.84 sta (ZPBASE),y - dey - bpl .84 - - lda #$55 - - ldy #39 - sta CLRPAGE2 -.85 sta (ZPBASE),y - dey - bpl .85 - txa bne .81 >DEBUG - clc rts *-------------------------------------- GETEVENT -OUT clc +COUT +IRQ sec rts *-------------------------------------- -CLOSE lda A2osX.SCREENS - and #$FF^A2osX.SCREENS.G - sta A2osX.SCREENS - clc +CLOSE clc rts *-------------------------------------- GETINFO >LDYA L.DEVINFO @@ -139,104 +123,139 @@ GETINFO >LDYA L.DEVINFO rts *-------------------------------------- * SETPIXEL -*-------------------------------------- -* PULLB = X.LO -* PULLB = X.HI -* PULLB = Y * PULLB = Mode -* 00000001=mono +* 00000001=B/W * 00000010=16 colors * 1000000=xor (mono on 1 bit) +* PULLW = X +* PULLB = Y * PULLB = Color (if not xor) *-------------------------------------- -SETPIXEL >PULLA X.LO - tax - >PULLA X.HI +SETPIXEL sta SETHIRES + sta SET80STORE prepare for page switching + + >PULLA Pull Mode + and #$FF + bpl SETPIXEL.1 + +SETPIXEL.XOR >PULLYA Y=X.LO,A=X.HI lsr if 256 =< x < 511 bcs .1 lsr bcs .2 if 512 < x - ldy DIV7.0,x - lda MOD7.0,x + lda DIV7.0,y + ldx MOD7.0,y bra .3 -.1 ldy DIV7.256,x - lda MOD7.256,x +.1 lda DIV7.256,y + ldx MOD7.256,y bra .3 -.2 ldy DIV7.512,x - lda MOD7.512,x +.2 lda DIV7.512,y + ldx MOD7.512,y -.3 pha save MOD,y=DIV +.3 lsr + tay + bcs .4 odd=main ram + sta SETPAGE2 + bra .5 +.4 sta CLRPAGE2 + +.5 >PULLA Pull Y + tax + lda BASEL,x setup line Base Ptr + sta ZPBASE + lda BASEH,x + sta ZPBASE+1 + lda (ZPBASE),y + eor Mono.Masks,x + sta (ZPBASE),y + rts +*-------------------------------------- +SETPIXEL.1 lsr + bcc SETPIXEL.COLOR + + >PULLYA Y=X.LO,A=X.HI + lsr if 256 =< x < 511 + bcs .1 + lsr + bcs .2 if 512 < x + lda DIV7.0,y + ldx MOD7.0,y + bra .3 + +.1 lda DIV7.256,y + ldx MOD7.256,y + bra .3 + +.2 lda DIV7.512,y + ldx MOD7.512,y + +.3 lsr + tay + bcs .4 odd=main ram + sta SETPAGE2 + bra .5 +.4 sta CLRPAGE2 + +.5 phx >PULLA Pull Y tax lda BASEL,x setup line Base Ptr sta ZPBASE lda BASEH,x sta ZPBASE+1 - - sta SET80STORE and prepare for page switching - sta SETHIRES - plx get back MOD in x - - >PULLA Pull Mode - and #$FF - bpl SETPIXEL.SOLID - -SETPIXEL.XOR tya - lsr - tay - bcs .1 odd=main ram - sta SETPAGE2 - bra .2 -.1 sta CLRPAGE2 -.2 lda (ZPBASE),y - eor Mono.Masks,x - sta (ZPBASE),y - rts -*-------------------------------------- -* A=Mode,X=MOD,Y=DIV -*-------------------------------------- -SETPIXEL.SOLID dec - bne SETPIXEL.COLOR - tya - lsr - tay - bcs .1 odd=main ram - sta SETPAGE2 - bra .2 -.1 sta CLRPAGE2 - -.2 >PULLA get COLOR + plx + + >PULLA Pull Color lsr - bcs .3 set white pixel + bcs .6 set white pixel lda (ZPBASE),y and Mono.NMasks,x includes And $7F for mono sta (ZPBASE),y rts -.3 lda (ZPBASE),y +.6 lda (ZPBASE),y and #$7F switch back this byte to mono ora Mono.Masks,x sta (ZPBASE),y rts *-------------------------------------- -* X=MOD,Y=DIV -*-------------------------------------- -SETPIXEL.COLOR tya - lsr Divide Col by 2 to get in range 0->39 - and #$FE make it 0->38 as color mask on 4 bytes - clc +SETPIXEL.COLOR >PULLA Get X.LO... + pha + >PULLB GBYTE Get X.HI in temp location + pla + lsr GBYTE divide by 4 (range 0->139) + ror + lsr GBYTE + ror + tay + + >PULLA Pull Y + tax + lda BASEL,x setup line Base Ptr + sta ZPBASE + lda BASEH,x + sta ZPBASE+1 + + lda DIV7.0,y + + asl Carry Cleared, by ASL adc ZPBASE ZPBASE now point to first of the 4 columns sta ZPBASE + + + ldx MOD7.0,y + txa get MOD asl times 4 to compute index in color tables - asl + asl tax set in X for Masks,NMasks >PULLA get COLOR + asl asl tay @@ -310,7 +329,68 @@ FILLREC BITBLT rts *-------------------------------------- -CS.END +DRV.CS.END +*-------------------------------------- +Mono.NMasks .DA #%01111110 + .DA #%01111101 + .DA #%01111011 + .DA #%01110111 + .DA #%01101111 + .DA #%01011111 + .DA #%00111111 +*-------------------------------------- +Mono.Masks .DA #%00000001 + .DA #%00000010 + .DA #%00000100 + .DA #%00001000 + .DA #%00010000 + .DA #%00100000 + .DA #%01000000 +*-------------------------------------- +* bits to "and" to reset color of pixel (0 means nothing to do) +*-------------------------------------- +* c1110000 c3322221 c5444433 c6666555 +Color.NMasks .DA #%01110000,#%00000000,#%00000000,#%00000000 + .DA #%00001111,#%01111110,#%00000000,#%00000000 + .DA #%00000000,#%01100001,#%00000000,#%00000000 + .DA #%00000000,#%00011111,#%01111100,#%00000000 + .DA #%00000000,#%00000000,#%01000011,#%00000000 + .DA #%00000000,#%00000000,#%00111111,#%01111000 + .DA #%00000000,#%00000000,#%00000000,#%00000111 +*-------------------------------------- +* bits to "and" to Get color of pixel (0 means nothing to do) +* 4 bytes * 7 mods +*-------------------------------------- +* c1110000 c3322221 c5444433 c6666555 +Color.Masks .DA #%10001111,#%00000000,#%00000000,#%00000000 + .DA #%11110000,#%00000001,#%00000000,#%00000000 + .DA #%00000000,#%10011110,#%00000000,#%00000000 + .DA #%00000000,#%11100000,#%00000011,#%00000000 + .DA #%00000000,#%00000000,#%10111100,#%00000000 + .DA #%00000000,#%00000000,#%11000000,#%00000111 + .DA #%00000000,#%00000000,#%00000000,#%11111000 +*-------------------------------------- +* bits to "ora" to set color of pixel (including "color bit set" for byte hosting bit0) +* 4 bytes * 16 Colors +*-------------------------------------- +* c1110000 c3322221 c5444433 c6666555 +Color.Pixels .DA #%00000000,#%00000000,#%00000000,#%00000000 black (color bit disable) + .DA #%10010001,#%10100010,#%11000100,#%10001000 dark blue + .DA #%10100010,#%11000100,#%10001000,#%10010001 dark green + .DA #%10110011,#%11100110,#%11001100,#%10011001 medium blue + .DA #%11000100,#%10001000,#%10010001,#%10100010 brown + .DA #%11010101,#%10101010,#%11010101,#%10101010 grey2 + .DA #%11100110,#%11001100,#%10011001,#%10110011 green + .DA #%11110111,#%11101110,#%11011101,#%10111011 aqua + .DA #%10001000,#%10010001,#%10100010,#%11000100 Magenta + .DA #%10011001,#%10110011,#%11100110,#%11001100 violet + .DA #%10101010,#%11010101,#%10101010,#%11010101 grey1 + .DA #%10111011,#%11110111,#%11101110,#%11011101 light blue + .DA #%11001100,#%10011001,#%10110011,#%11100110 orange + .DA #%11011101,#%10111011,#%11110111,#%11101110 pink + .DA #%11101110,#%11011101,#%10111011,#%11110111 yellow + .DA #%01111111,#%01111111,#%01111111,#%01111111 white (color bit disable) +*-------------------------------------- DIV7.0 .HS 0000000000000001010101010101 .HS 0202020202020203030303030303 .HS 0404040404040405050505050505 @@ -447,98 +527,12 @@ BASEH .HS 20.24.28.2C.30.34.38.3C .HS 23.27.2B.2F.33.37.3B.3F .HS 23.27.2B.2F.33.37.3B.3F *-------------------------------------- -Mono.NMasks .DA #%01111110 - .DA #%01111101 - .DA #%01111011 - .DA #%01110111 - .DA #%01101111 - .DA #%01011111 - .DA #%00111111 -*-------------------------------------- -Mono.Masks .DA #%00000001 - .DA #%00000010 - .DA #%00000100 - .DA #%00001000 - .DA #%00010000 - .DA #%00100000 - .DA #%01000000 -*-------------------------------------- -* bits to "and" to reset color of pixel (0 means nothing to do) -*-------------------------------------- -Color.NMasks .DA #%01110000,#%00000000,#%00000000,#%00000000 - .DA #%00001111,#%01111110,#%00000000,#%00000000 - .DA #%00000000,#%01100001,#%00000000,#%00000000 - .DA #%00000000,#%00011111,#%01111100,#%00000000 - .DA #%00000000,#%00000000,#%01000011,#%00000000 - .DA #%00000000,#%00000000,#%00111111,#%01111000 - .DA #%00000000,#%00000000,#%00000000,#%00000111 -*-------------------------------------- -* bits to "and" to Get color of pixel (0 means nothing to do) -* 4 bytes * 7 mods -*-------------------------------------- -Color.Masks.DEL .DA #%00001111,#%00000000,#%00000000,#%00000000 (nothing to do) - .DA #%01110000,#%00000001,#%00000000,#%00000000 asl0,asl0,rol1,asl0,rol1,asl0,rol1 - .DA #%00000000,#%00011110,#%00000000,#%00000000 lsr1 - .DA #%00000000,#%01100000,#%00000011,#%00000000 asl1,asl1,rol2,asl1,rol2 - .DA #%00000000,#%00000000,#%00111100,#%00000000 lsr2,lsr2 - .DA #%00000000,#%00000000,#%01000000,#%00000111 asl2,asl2,rol3 - .DA #%00000000,#%00000000,#%00000000,#%01111000 lsr3,lsr3,lsr3 -*-------------------------------------- -Color.Masks .DA #%10001111,#%00000000,#%00000000,#%00000000 - .DA #%11110000,#%00000001,#%00000000,#%00000000 - .DA #%00000000,#%10011110,#%00000000,#%00000000 - .DA #%00000000,#%11100000,#%00000011,#%00000000 - .DA #%00000000,#%00000000,#%10111100,#%00000000 - .DA #%00000000,#%00000000,#%11000000,#%00000111 - .DA #%00000000,#%00000000,#%00000000,#%11111000 -*-------------------------------------- -* bits to "ora" to set color of pixel (including "color bit set " for byte hosting bit0) -* 4 bytes * 16 Colors -* pixel masks c1110000.c3322221.c5444433.c6666555 -*-------------------------------------- -Color.Pixels .DA #%00000000,#%00000000,#%00000000,#%00000000 (color bit disable) - .DA #%10010001,#%10100010,#%11000100,#%10001000 - .DA #%10100010,#%11000100,#%10001000,#%10010001 - .DA #%10110011,#%11100110,#%11001100,#%10011001 - .DA #%11000100,#%10001000,#%10010001,#%10100010 - .DA #%11010101,#%10101010,#%11010101,#%10101010 - .DA #%11100110,#%11001100,#%10011001,#%10110011 - .DA #%11110111,#%11101110,#%11011101,#%10111011 - .DA #%10001000,#%10010001,#%10100010,#%11000100 - .DA #%10011001,#%10110011,#%11100110,#%11001100 - .DA #%10101010,#%11010101,#%10101010,#%11010101 - .DA #%10111011,#%11110111,#%11101111,#%11011101 - .DA #%11001100,#%10011001,#%10110011,#%11100110 - .DA #%11011101,#%10111011,#%11110111,#%11101110 - .DA #%11101110,#%11011101,#%10111011,#%11110111 - .DA #%01111111,#%01111111,#%01111111,#%01111111 (color bit disable) - -*Black 00 00 00 00 0000 -*Magenta 08 11 22 44 0001 -*Brown 44 08 11 22 0010 -*Orange 4C 19 33 66 0011 -*Dark Green 22 44 08 11 0100 -*Grey1 2A 55 2A 55 0101 -*Green 66 4C 19 33 0110 -*Yellow 6E 5D 3B 77 0111 -*Dark Blue 11 22 44 08 1000 -*Violet 19 33 66 4C 1001 -*Grey2 55 2A 55 2A 1010 -*Pink 5D 3B 77 6E 1011 -*Medium Blue 33 66 4C 19 1100 -*Light Blue 3B 77 6E 5D 1101 -*Aqua 77 6E 5D 3B 1110 -*White 7F 7F 7F 7F 1111 -*-------------------------------------- -DEVNAME >PSTRING "GFX" GBYTE .BS 1 *-------------------------------------- -DS.START -DEVINFO .DA #S.DEV.F.GFX type of DEVINFO STRUCT +DEVINFO .DA #S.DEVINFO.TYPE.GFX type of DEVINFO STRUCT DEVINFO.MODES .DA #%10000011 XOR,16 & B/W DEVINFO.W .DA 560 X.SIZE DEVINFO.H .DA 192 Y.SIZE -DS.END *-------------------------------------- MAN SAVE DRV/DHGR.DRV.S diff --git a/DRV/MOUSE.DRV.S.txt b/DRV/MOUSE.DRV.S.txt index 11c1b508..9ad10cec 100644 --- a/DRV/MOUSE.DRV.S.txt +++ b/DRV/MOUSE.DRV.S.txt @@ -1,16 +1,17 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF DRV/MOUSE.DRV + .TF /A2OSX.BOOT/DRV/MOUSE.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/IO.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I *-------------------------------------- ZPGoMouse .EQ ZPDRV ZPTmpPtr1 .EQ ZPDRV+2 @@ -43,29 +44,30 @@ MOUSESTSx.DOWN .EQ %10000000 MOUSESTSx.LDOWN .EQ %01000000 MOUSESTSx.MOVED .EQ %00100000 *-------------------------------------- -* Main DRV entry point -* input : -* X = CMD -* 0 : OPEN -* 2 : GETEVENT -* 4 : OUT -* 6 : CLOSE -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld - jmp (.1,x) -.1 .DA OPEN - .DA GETEVENT - .DA OUT - .DA CLOSE - .DA 0 end or relocation - .DA CS.END-CS.START + jmp Dev.Detect cld,jmp abs=DRV + .DA #$61 6502,Level 1 (65c02) + .DA #1 DRV Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length + .DA DEV.HEADER-CS.START Device Header Offset + .DA DRV.CS.START-CS.START Driver Code Offset + .DA DRV.CS.END-DRV.CS.START Drv Code Length *-------------------------------------- -OPEN stz ZPTmpPtr1 +* Relocation Table +*-------------------------------------- +L.MSG.DETECT .DA MSG.DETECT +L.MSG.DETECT.OK .DA MSG.DETECT.OK +L.MSG.DETECT.KO .DA MSG.DETECT.KO +L.DEV.HEADER.NAME .DA DEV.HEADER.NAME + .DA 0 End Of Reloc Table +*-------------------------------------- +Dev.Detect >LDYA L.MSG.DETECT + >SYSCALL SYS.SysScrPPSTRYA + + stz ZPTmpPtr1 lda #$C1 sta ZPTmpPtr1+1 @@ -77,44 +79,66 @@ OPEN stz ZPTmpPtr1 bne .3 dex bpl .2 - bra .10 + bra .4 .3 inc ZPTmpPtr1+1 no match, try next slot.... lda ZPTmpPtr1+1 cmp #$C8 bne .1 + >LDYA L.MSG.DETECT.KO + >SYSCALL SYS.SysScrPPSTRYA + lda #DEVMGR.ERRNOHW Not Found in any slot, exiting sec rts -.10 lda ZPTmpPtr1+1 +.4 lda ZPTmpPtr1+1 + sta DEVSLOTCn and #$0F sta DEVSLOT0n - pha ora #$30 - sta DEVNAME+4 - pla - ora #$C0 - sta DEVSLOTCn + sta DEV.HEADER.NAME+4 asl asl asl asl sta DEVSLOTn0 - ldx #0 - ldy #S.DEV.NAME - -.4 lda DEVNAME,x - sta (pDevContext),y - cpx DEVNAME - beq .5 - inx - iny - bne .4 - -.5 bit RROMBNK2 Renable ROM to allow MOUSE II firmware + >LDYA L.MSG.DETECT.OK + >SYSCALL SYS.SysScrPPSTRYA + >LDYA L.DEV.HEADER.NAME + >SYSCALL SYS.SysScrPPSTRYA + clc + rts +*-------------------------------------- +CS.END +MSG.DETECT >PSTRING "\nApple II Mouse Driver." +MSG.DETECT.OK >PSTRING "\nMouse Card Driver Installed As Device : " +MSG.DETECT.KO >PSTRING "\nMouse Card Not Found." +*-------------------------------------- +* Device Header (16 Bytes) +*-------------------------------------- +DEV.HEADER cld + jmp (DRV.CS.START,x) + .DA #S.DEV.F.EVENT +DEV.HEADER.NAME >PSTRING "MOU1" NAME + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +* Driver Code +*-------------------------------------- +DRV.CS.START .DA OPEN + .DA GETEVENT + .DA COUT + .DA CLOSE + .DA GETINFO + .DA IRQ +L.DEVINFO .DA DEVINFO + .DA 0 end or relocation +*-------------------------------------- +OPEN +* bit RROMBNK2 Renable ROM to allow MOUSE II firmware php to read IIe ROM ID bytes sei @@ -156,19 +180,15 @@ OPEN stz ZPTmpPtr1 jsr GOMOUSE pla - bpl .6 + bpl .1 sta SET80STORE -.6 plp +.1 plp - lda #S.DEV.F.MOUSE+S.DEV.F.EVENT - sta (pDevContext) clc rts *-------------------------------------- -GETEVENT >PULLW pEvent - - php +GETEVENT php sei lda RD80STORE @@ -205,7 +225,7 @@ GETEVENT >PULLW pEvent ora #EVENT.MOUSEMOVE sta (pEvent),y - ldy #S.EVT.DATAW1 +.4 ldy #S.EVT.DATAW1 lda MOUSEXLOx,x sta (pEvent),y iny @@ -218,7 +238,7 @@ GETEVENT >PULLW pEvent lda MOUSEYHIx,x sta (pEvent),y -.4 pla + pla bpl .5 sta SET80STORE @@ -235,7 +255,8 @@ GETEVENT >PULLW pEvent .9 sec A=0 : no event rts *-------------------------------------- -OUT clc +COUT +IRQ sec rts *-------------------------------------- CLOSE php @@ -247,6 +268,10 @@ CLOSE php clc rts *-------------------------------------- +GETINFO >LDYA L.DEVINFO + clc + rts +*-------------------------------------- GOMOUSE pha stz ZPGoMouse ldx DEVSLOTCn @@ -257,15 +282,15 @@ GOMOUSE pha pla jmp (ZPGoMouse) *-------------------------------------- -CS.END +DRV.CS.END DEVSIG.Offset .HS 05070B0CFB DEVSIG.Value .HS 38180120D6 DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset -DEVNAME >PSTRING "MOU0" DEVSLOT0n .BS 1 DEVSLOTCn .BS 1 DEVSLOTn0 .BS 1 *-------------------------------------- +DEVINFO .DA #S.DEVINFO.TYPE.XY MAN SAVE DRV/MOUSE.DRV.S ASM diff --git a/DRV/PPIC.DRV.S.txt b/DRV/PPIC.DRV.S.txt index 80e8ccd0..e91731ea 100644 --- a/DRV/PPIC.DRV.S.txt +++ b/DRV/PPIC.DRV.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -69,12 +69,12 @@ OPEN stz ZPTmpPtr1 sta DEVNAME+4 lda #S.DEV.F.CHAR+S.DEV.F.OUT - sta (DEVMGR.DEVPTR) + sta (pDev) ldy #S.DEV.NAME ldx #0 .7 lda DEVNAME,x - sta (DEVMGR.DEVPTR),y + sta (pDev),y cpx DEVNAME beq .8 inx diff --git a/DRV/SSC.DRV.S.txt b/DRV/SSC.DRV.S.txt index 072052d3..f5f26e6a 100644 --- a/DRV/SSC.DRV.S.txt +++ b/DRV/SSC.DRV.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -11,12 +11,46 @@ AUTO 6 .INB INC/MACROS.I .INB INC/A2OSX.I *-------------------------------------- -ZPTmpPtr1 .EQ ZPDRV +BUF.SIZE .EQ $20 +BUF.MASK .EQ $1F *-------------------------------------- -SIG.05 .EQ $38 -SIG.07 .EQ $18 -SIG.0B .EQ $01 -SIG.0C .EQ $31 +ZPGoCard .EQ ZPDRV +ZPTmpPtr1 .EQ ZPDRV+2 +*-------------------------------------- +* Pascal 1.1 Protocol +*-------------------------------------- +SSC.INIT .EQ $0D +SSC.READ .EQ $0E +SSC.WRITE .EQ $0F +SSC.STATUS .EQ $10 +*-------------------------------------- +* SSC/ACIA I/O +*-------------------------------------- +SSC.REG.DIPSW1 .EQ $C081 R +SSC.REG.DIPSW2 .EQ $C082 R +SSC.REG.DATA .EQ $C088 R,W +SSC.REG.RESET .EQ $C089 W +SSC.REG.STATUS .EQ $C089 R +SSC.REG.STATUS.IRQ .EQ %10000000 +SSC.REG.STATUS.DSR .EQ %01000000 +SSC.REG.STATUS.DCD .EQ %00100000 +SSC.REG.STATUS.TDRF .EQ %00010000 +SSC.REG.STATUS.RDRF .EQ %00001000 +SSC.REG.STATUS.OE .EQ %00000100 +SSC.REG.STATUS.FE .EQ %00000010 +SSC.REG.STATUS.PE .EQ %00000001 +SSC.REG.CMD .EQ $C08A W +SSC.REG.CMD.ODDP .EQ %00100000 +SSC.REG.CMD.EVENP .EQ %01100000 +SSC.REG.CMD.MARKP .EQ %10100000 +SSC.REG.CMD.SPACEP .EQ %11100000 +SSC.REG.CMD.ECHO .EQ %00010000 +SSC.REG.CMD.TE .EQ %00001000 +SSC.REG.CMD.TEIRQ .EQ %00000100 +SSC.REG.CMD.TBRK .EQ %00001100 +SSC.REG.CMD.RIRQDIS .EQ %00000010 +SSC.REG.CMD.DTR .EQ %00000001 +SSC.REG.CTL .EQ $C08B W *-------------------------------------- * Main DRV entry point * input : @@ -25,6 +59,8 @@ SIG.0C .EQ $31 * 2 : GETEVENT * 4 : OUT * 6 : CLOSE +* 8 : GETINFO +* 10 : IRQ *-------------------------------------- * CLD $D8 * JMP (*,x) $7C @@ -33,53 +69,81 @@ SIG.0C .EQ $31 *-------------------------------------- CS.START cld jmp (.1,x) + .DA CS.END-CS.START + .DA 0 .1 .DA OPEN .DA GETEVENT .DA OUT .DA CLOSE + .DA GETINFO +L.IRQ .DA IRQ +L.DEVINFO .DA DEVINFO .DA 0 end or relocation - .DA CS.END-CS.START *-------------------------------------- OPEN stz ZPTmpPtr1 lda #$C1 sta ZPTmpPtr1+1 -.1 ldy #5 - lda (ZPTmpPtr1),y - cmp #SIG.05 - bne .2 - ldy #7 - lda (ZPTmpPtr1),y - cmp #SIG.07 - bne .2 - - ldy #$B - lda (ZPTmpPtr1),y - cmp #SIG.0B - bne .2 - - ldy #$C - lda (ZPTmpPtr1),y - cmp #SIG.0C - beq .3 +.1 ldx #DEVSIG.Length-1 -.2 inc ZPTmpPtr1+1 +.2 ldy DEVSIG.Offset,x + lda (ZPTmpPtr1),y + cmp DEVSIG.Value,x + bne .3 + dex + bpl .2 + bra .4 + +.3 inc ZPTmpPtr1+1 no match, try next slot.... lda ZPTmpPtr1+1 cmp #$C8 bne .1 - beq .99 -.3 lda ZPTmpPtr1+1 + lda #DEVMGR.ERRNOHW Not Found in any slot, exiting + sec + rts + +.4 lda ZPTmpPtr1+1 + sta DEVSLOTCn and #$0F - sta DEVSLOT + sta DEVSLOT0n ora #$30 sta DEVNAME+4 + asl + asl + asl + asl + sta DEVSLOTn0 - lda #S.DEV.F.CHAR+S.DEV.F.OUT - sta (pDevContext) - ldy #S.DEV.NAME +* ldy #SSC.INIT +* jsr GoCard + ldx DEVSLOTn0 + + stz SSC.REG.RESET,x + lda #$1E + sta SSC.REG.CTL,x + + stz INBUF.PTR + stz INBUF.CNT + stz OUTBUF.PTR + stz OUTBUF.CNT + + >PUSHW L.IRQ + >PUSHBI 4 + >SYSCALL SYS.MLIAllocIRQ + bcs * + + php + sei + ldx DEVSLOTn0 + lda #SSC.REG.CMD.TEIRQ+SSC.REG.CMD.DTR + sta SSC.REG.CMD,x + + lda SSC.REG.STATUS,x clear any IRQ pending + plp ldx #0 + ldy #S.DEV.NAME .7 lda DEVNAME,x sta (pDevContext),y cpx DEVNAME @@ -87,25 +151,166 @@ OPEN stz ZPTmpPtr1 inx iny bne .7 + + lda #S.DEV.F.CHAR+S.DEV.F.OUT+S.DEV.F.EVENT + sta (pDevContext) + .8 clc rts -.99 lda #DEVMGR.ERRNOHW - sec - rts *-------------------------------------- -GETEVENT lda #0 +GETEVENT >PULLW pEvent + + php + sei + lda INBUF.CNT + beq .9 + + ldx INBUF.PTR + lda INBUF,x + ldy #S.EVT.DATA + sta (pEvent),y + + iny + lda #0 + sta (pEvent),y + + lda #S.EVT.F.KEY + sta (pEvent) + + inx + cpx #BUF.SIZE + bne .1 + ldx #0 + +.1 stx INBUF.PTR + dec INBUF.CNT + + + plp + clc + rts + +.9 plp + lda #0 sec rts *-------------------------------------- -OUT clc +OUT php + sei + + ldx DEVSLOTn0 + lda SSC.REG.STATUS,x + and #SSC.REG.STATUS.DCD+SSC.REG.STATUS.DSR + beq .9 + + ldx OUTBUF.CNT + cpx #BUF.SIZE + beq .9 + + >PULLA + ldx OUTBUF.PTR + sta OUTBUF,x + inx + cpx #BUF.SIZE + bne .1 + ldx #0 + +.1 stx OUTBUF.PTR + inc OUTBUF.CNT + + plp + clc + rts + +.9 >PULLA + plp + sec rts *-------------------------------------- CLOSE clc rts *-------------------------------------- +GETINFO >LDYA L.DEVINFO + clc + rts +*-------------------------------------- +* IRQ Handler +* on exit, CS if handled +*-------------------------------------- +IRQ cld + + ldx DEVSLOTn0 + lda SSC.REG.STATUS,x IRQ from this device ? +* bpl .9 no, exit + pha save status ... + and #SSC.REG.STATUS.RDRF incoming char? + beq .1 + + ldy SSC.REG.DATA,x read data to clear IRQ + lda INBUF.CNT + cmp #BUF.SIZE + beq .1 buffer full, discard + phy + clc + adc INBUF.PTR + and #BUF.MASK + tay + pla get back data + sta INBUF,y + inc INBUF.CNT + +.1 pla get back status + and #SSC.REG.STATUS.TDRF + beq .8 + + lda OUTBUF.CNT something to transmit ? + beq .8 no, exit + + clc + adc OUTBUF.PTR + and #BUF.MASK + tay + + lda OUTBUF,Y + sta SSC.REG.DATA,x + + dec INBUF.CNT + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +GOCARD sta $CFFF Prevent SSC firmware bug + pha + stz ZPGoCard + ldx DEVSLOTCn + stx ZPGoCard+1 + lda (ZPGoCard),y + sta ZPGoCard + ldy DEVSLOTn0 + pla + jmp (ZPGoCard) +*-------------------------------------- CS.END +DEVSIG.Offset .HS 05070B0C +DEVSIG.Value .HS 38180131 +DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset DEVNAME >PSTRING "COM0" -DEVSLOT .BS 1 +DEVSLOT0n .BS 1 +DEVSLOTCn .BS 1 +DEVSLOTn0 .BS 1 +INBUF.PTR .BS 1 +INBUF.CNT .BS 1 +OUTBUF.PTR .BS 1 +OUTBUF.CNT .BS 1 +INBUF .BS BUF.SIZE +OUTBUF .BS BUF.SIZE +DEVINFO .DA #S.DEV.F.CHAR+S.DEV.F.OUT+S.DEV.F.EVENT + .DA #0 *-------------------------------------- MAN SAVE DRV/SSC.DRV.S diff --git a/DRV/UTHERNET.DRV.S.txt b/DRV/UTHERNET.DRV.S.txt index b0303e76..0a2ad0d5 100644 --- a/DRV/UTHERNET.DRV.S.txt +++ b/DRV/UTHERNET.DRV.S.txt @@ -1,16 +1,17 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF DRV/UTHERNET.DRV + .TF /A2OSX.BOOT/DRV/UTHERNET.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I -* .INB INC/ZP.I + .INB INC/A2OSX.API.I + .INB INC/KERNEL.I *-------------------------------------- ZPTmpPTR .EQ ZPDRV *-------------------------------------- @@ -110,39 +111,28 @@ ERRTNOFRAME .EQ 0 ERRNOBUFFER .EQ 1 ERRTIMEOUT .EQ 2 *-------------------------------------- -* Main DRV entry point -* input : -* X = CMD -* 0 : OPEN -* 2 : GETEVENT -* 4 : OUT -* 6 : CLOSE -* 8 : GETINFO -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld - jmp (.1,x) -.1 .DA OPEN - .DA GETEVENT - .DA OUT - .DA CLOSE - .DA GETINFO -L.DEVINFO .DA DEVINFO - .DA 0 end or relocation - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate + jmp Dev.Detect cld,jmp abs=DRV + .DA #$61 6502,Level 1 (65c02) + .DA #1 DRV Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length + .DA DEV.HEADER-CS.START Device Header Offset + .DA DRV.CS.START-CS.START Driver Code Offset + .DA DRV.CS.END-DRV.CS.START Drv Code Length *-------------------------------------- -* input : -* none -* output : -* CC on success -* CS on error -*-------------------------------------- -OPEN ldx #$10 +* Relocation Table +*-------------------------------------- +L.MSG.DETECT .DA MSG.DETECT + .DA 0 End Of Reloc Table +*-------------------------------------- +Dev.Detect sta hArgs + >LDYA L.MSG.DETECT + >SYSCALL SYS.SysScrPPSTRYA + + ldx #$10 .1 stx DEVSLOTx0 >LDYAI PP.ID >STYA PacketPagePTR,x @@ -151,18 +141,21 @@ OPEN ldx #$10 bne .2 cmp /DEVID beq .3 -.2 inc DEVNAME+4 + +.2 inc DEV.HEADER.NAME+4 txa clc adc #$10 tax cpx #$80 bne .1 + lda #DEVMGR.ERRNOHW sec rts -.3 ldy #S.DEV.hARGS - lda (pDevContext),y + +.3 lda hARGS + beq .4 >SYSCALL SYS.GetMemPtrA >STYA ZPTmpPTR @@ -172,8 +165,93 @@ OPEN ldx #$10 sec rts -.4 jsr Reset - +.4 clc + rts +*-------------------------------------- +DecodeMac lda (ZPTmpPTR) + cmp #12 + bne .9 + + ldy #1 + ldx #0 + +.1 lda (ZPTmpPTR),y + jsr Asc2NibbleA + bcs .9 + + asl + asl + asl + asl + sta MAC,x + + iny + lda (ZPTmpPTR),y + jsr Asc2NibbleA + bcs .9 + + ora MAC,x + sta MAC,x + inx + iny + cpy #13 + bne .1 + + clc + rts + +.9 sec + rts +*-------------------------------------- +Asc2NibbleA cmp #$30 + bcc .9 + cmp #$3A + bcs .1 + and #$0F + clc + rts +.1 cmp #$41 + bcc .9 + cmp #$47 + bcs .9 + sbc #$36 + clc + rts +.9 sec + rts +*-------------------------------------- +CS.END +MSG.DETECT >PSTRING "\nUtherNet/CS8900A Driver." +hArgs .BS 1 +*-------------------------------------- +* Device Header (16 Bytes) +*-------------------------------------- +DEV.HEADER cld + jmp (DRV.CS.START,x) + .DA #S.DEV.F.SHARE+S.DEV.F.EVENT +DEV.HEADER.NAME >PSTRING "ETH1" NAME + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +* Driver Code +*-------------------------------------- +DRV.CS.START .DA OPEN + .DA GETEVENT + .DA $FFFF no COUT + .DA CLOSE + .DA GETINFO + .DA $FFFF no IRQ + .DA SEND +L.DEVINFO .DA DEVINFO + .DA 0 end or relocation +*-------------------------------------- +* input : +* none +* output : +* CC on success +* CS on error +*-------------------------------------- +OPEN jsr Reset >LDYAI PP.RxCTL >STYA PacketPagePTR,x >LDYAI PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA @@ -197,18 +275,7 @@ OPEN ldx #$10 >LDYAI PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.Auto >STYA PacketPageDATA,x - lda #S.DEV.F.NET+S.DEV.F.EVENT+S.DEV.F.OUT - sta (pDevContext) - ldy #S.DEV.NAME - ldx #0 -.7 lda DEVNAME,x - sta (pDevContext),y - cpx DEVNAME - beq .8 - inx - iny - bne .7 -.8 clc + clc rts *-------------------------------------- * input : @@ -217,8 +284,7 @@ OPEN ldx #$10 * CC no event * CS event *-------------------------------------- -GETEVENT >PULLW pEvent - ldx DEVSLOTx0 +GETEVENT ldx DEVSLOTx0 >LDYAI PP.RxEvent >STYA PacketPagePTR,x >LDYA PacketPageDATA,x @@ -237,7 +303,7 @@ GETEVENT.RxOK >LDYA RTDATA,x get RxLength >STYA FRAMELEN >PUSHYA - >PUSHB 0 + >PUSHBI 0 >SYSCALL SYS.GetMem bcs .99 >STYA ZPTmpPTR @@ -254,6 +320,7 @@ GETEVENT.RxOK sta (pEvent) ldy #0 ldx DEVSLOTx0 + .1 lda RTDATA,x sta (ZPTmpPTR),y iny @@ -267,13 +334,26 @@ GETEVENT.RxOK bne .3 inc ZPTmpPTR+1 .3 jsr DecFrameLen - beq .8 - bra .1 + bne .1 .8 clc rts .99 sec rts +*-------------------------------------- +CLOSE jsr Reset + clc + rts +*-------------------------------------- +* in: +* out: +* Y,A = BUFFER PTR +* CC on success +* CS on error +*-------------------------------------- +GETINFO >LDYA L.DEVINFO + clc + rts *-------------------------------------- * in: * PULLW = FRAME PTR @@ -282,7 +362,7 @@ GETEVENT.RxOK * CC on success * CS on error *-------------------------------------- -OUT >PULLW ZPTmpPTR +SEND >PULLW ZPTmpPTR >PULLW FRAMELEN ldy #11 Add Src MAC Address @@ -341,20 +421,6 @@ SENDPREADY ldy #0 .8 clc rts *-------------------------------------- -CLOSE jsr Reset - clc - rts -*-------------------------------------- -* in: -* out: -* Y,A = BUFFER PTR -* CC on success -* CS on error -*-------------------------------------- -GETINFO >LDYA L.DEVINFO - clc - rts -*-------------------------------------- * PRIVATE *-------------------------------------- Reset ldx DEVSLOTx0 @@ -363,74 +429,25 @@ Reset ldx DEVSLOTx0 >LDYAI PP.SelfCTL.LID+PP.SelfCTL.RESET >STYA PacketPageDATA,x rts -*-------------------------------------- -DecodeMac lda (ZPTmpPTR) - cmp #12 - bne .9 - ldy #1 - ldx #0 -.1 lda (ZPTmpPTR),y - jsr Asc2NibbleA - bcs .9 - asl - asl - asl - asl - sta MAC,x - iny - lda (ZPTmpPTR),y - jsr Asc2NibbleA - bcs .9 - ora MAC,x - sta MAC,x - inx - iny - cpy #13 - bne .1 - clc - rts -.9 sec - rts -*-------------------------------------- -Asc2NibbleA cmp #$30 - bcc .9 - cmp #$3A - bcs .1 - and #$0F - clc - rts -.1 cmp #$41 - bcc .9 - cmp #$47 - bcs .9 - sbc #$36 - clc - rts -.9 sec - rts *-------------------------------------- DecFrameLen lda FRAMELEN bne .1 lda FRAMELEN+1 - beq .2 + beq .8 dec FRAMELEN+1 .1 dec FRAMELEN -.2 lda FRAMELEN - ora FRAMELEN+1 - rts + lda #1 Make something NZ +.8 rts *-------------------------------------- -CS.END -DEVNAME >PSTRING "ETH1" -*-------------------------------------- -DS.START +DRV.CS.END *-------------------------------------- DEVSLOTx0 .BS 1 FRAMELEN .BS 2 *-------------------------------------- -DEVINFO +DEVINFO .DA #S.DEVINFO.TYPE.NET MAC .BS 6 -*-------------------------------------- -DS.END +LINK.STATUS .BS 1 +LINK.SPEED .BS 1 SPEED/DUPLEX *-------------------------------------- MAN SAVE DRV/UTHERNET.DRV.S diff --git a/ETC/TCPIP.CONF b/ETC/TCPIP.CONF index 305e8a3f..b28034df 100644 --- a/ETC/TCPIP.CONF +++ b/ETC/TCPIP.CONF @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.BOOT NEW INC 1 AUTO 6 diff --git a/INC/A2osX.API.I.txt b/INC/A2osX.API.I.txt new file mode 100644 index 00000000..dbda570b --- /dev/null +++ b/INC/A2osX.API.I.txt @@ -0,0 +1,268 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +************ A2osX API **************** +*-------------------------------------- +* A2osX.SYSCALL Functions Indexes +*-------------------------------------- +SYS.GetMem .EQ $00 +SYS.FreeMemA .EQ $02 +SYS.GetMemPtrA .EQ $04 +SYS.GetMemByIDA .EQ $06 + +SYS.GetMemByNameA .EQ $08 +SYS.GetMemByNameYA .EQ $0A +*-------------------------------------- +SYS.NewPStrYA .EQ $10 +SYS.PStrCpyA .EQ $12 +SYS.PStrCat .EQ $14 +SYS.PStrCmp .EQ $16 + +SYS.PStrGetTkn .EQ $18 +SYS.GetPStrIndex .EQ $1A +*-------------------------------------- +SYS.LoadBinA .EQ $20 +SYS.LoadLibYA .EQ $22 +SYS.UnloadLibA .EQ $24 +SYS.LoadDrvA .EQ $26 +*-------------------------------------- +SYS.ExpandPStrA .EQ $30 +SYS.ExpandPStrYA .EQ $32 +SYS.GetEnvVarH .EQ $34 +SYS.GetEnvVarP .EQ $36 + +SYS.SetEnvVarH .EQ $38 +SYS.SetEnvVarP .EQ $3A +*-------------------------------------- +SYS.MLICreateFile .EQ $40 +SYS.MLICreateDirA .EQ $42 +SYS.MLICreateDirYA .EQ $44 +SYS.MLIDestroyA .EQ $46 + +SYS.MLIDestroyYA .EQ $48 +SYS.MLIRename .EQ $4A +SYS.MLISetFileInfo .EQ $4C +SYS.MLIGetFileInfoA .EQ $4E + +SYS.MLIGetFileInfoYA .EQ $50 +SYS.MLIOnline .EQ $52 +SYS.MLISetPrefixA .EQ $54 +SYS.MLISetPrefixYA .EQ $56 + +SYS.MLIGetPrefixA .EQ $58 +SYS.MLIGetPrefixYA .EQ $5A +SYS.MLIOpenA .EQ $5C +SYS.MLIOpenYA .EQ $5E + +SYS.MLINewLine .EQ $60 +SYS.MLIRead .EQ $62 +SYS.MLIWrite .EQ $64 +SYS.MLICloseA .EQ $66 + +SYS.MLIFlushA .EQ $68 +SYS.MLISetMark .EQ $6A +SYS.MLIGetMarkA .EQ $6A +SYS.MLISetEOF .EQ $6C + +SYS.MLIGetEOFA .EQ $70 +SYS.MLISetBuf .EQ $72 +SYS.MLIGetBuf .EQ $74 +SYS.MLIGetTime .EQ $76 + +SYS.MLIAllocIRQ .EQ $78 +SYS.MLIDeallocIRQ .EQ $7A +SYS.MLIReadBlock .EQ $7C +SYS.MLIWriteBlock .EQ $7E +*-------------------------------------- +SYS.GetDevByIDA .EQ $80 +SYS.GetDevByNameA .EQ $82 +SYS.GetDevByNameYA .EQ $84 +*-------------------------------------- +SYS.ExecProcessA .EQ $90 +SYS.CreateProcessA .EQ $92 + +SYS.GetPSByIDA .EQ $98 +*-------------------------------------- +SYS.CheckPrefixA .EQ $A0 +SYS.FileSearch .EQ $A2 +SYS.LoadFileA .EQ $A4 +SYS.ListDirInitA .EQ $A6 + +SYS.ListDirNextA .EQ $A8 +SYS.ListDirCloseA .EQ $AA +*-------------------------------------- +SYS.AddNetCfg .EQ $B0 +SYS.SetNetCfg .EQ $B2 +SYS.GetNetCfgA .EQ $B4 +SYS.ClrNetCfgA .EQ $B6 +*-------------------------------------- +SYS.ScreenSelectA .EQ $C0 + +SYS.SysScrPPSTRA .EQ $C4 +SYS.SysScrPPSTRYA .EQ $C6 +*-------------------------------------- +* ERROR CODES +*-------------------------------------- +MEMMGR.ERROOM .EQ $FF Out Of Memory Error +MEMMGR.ERROOH .EQ $FE Out Of Handle Error +*-------------------------------------- +DEVMGR.ERROOM .EQ $EF Out Of Memory Error +DEVMGR.ERROOH .EQ $EE Out Of Handle Error +DEVMGR.ERRNICL .EQ $ED Invalid Command Line +DEVMGR.ERRNOHW .EQ $EC No Hardware +DEVMGR.ERRDNF .EQ $EB Device Not Found Error +*-------------------------------------- +TSKMGR.ERROOH .EQ $DF Out Of Handle Error +TSKMGR.ERRNSP .EQ $DD No Such Process Error +*-------------------------------------- +SYSMGR.ERRSYN .EQ $CF Syntax Error +SYSMGR.ERRENVF .EQ $CE Env is Full +SYSMGR.ERRIDIR .EQ $CD Invalid Directory +SYSMGR.ERRFTB .EQ $CC File Too Big Error +SYSMGR.ERRFNF .EQ $CB File Not Found Error +*-------------------------------------- +* MEM STRUCT +*-------------------------------------- +S.MEM.F .EQ 0 +S.MEM.F.AUX .EQ %10000000 Request Stock Object +S.MEM.F.INIT0 .EQ %01000000 Fill with "0" +S.MEM.F.CODE .EQ %00100000 +S.MEM.F.NOMOVE .EQ %00010000 +S.MEM.F.ALIGN .EQ %00001000 +S.MEM.F.INUSE .EQ %10000000 (Internal Flag) +S.MEM.REFCNT .EQ 1 +S.MEM.OWNERPID .EQ 2 +S.MEM.BIN .EQ 3 +S.MEM.PTR .EQ 4 +S.MEM.LEN .EQ 6 +* +S.MEM.SIZE .EQ 8 +*-------------------------------------- +* BIN STRUCT +*-------------------------------------- +S.BIN.CODE .EQ 0 +*-------------------------------------- +* DEV STRUCT +*-------------------------------------- +S.DEV.CODE .EQ 0 +S.DEV.JMP .EQ 2 +S.DEV.F .EQ 4 +S.DEV.F.INUSE .EQ %10000000 +S.DEV.F.BUSY .EQ %01000000 +S.DEV.F.SHARE .EQ %00100000 Device is shareable +S.DEV.F.IRQ .EQ %00010000 Device is irq driven +S.DEV.F.EVENT .EQ %00001000 Device is event driven +S.DEV.F.COUT .EQ %00000100 Device supports Char OUT +S.DEV.F.BLOCK .EQ %00000010 +S.DEV.F.CHAR .EQ %00000001 +S.DEV.NAME .EQ 5 5 Bytes : LEN+NUL KBD CON COMx LPTx ETHx +* +S.DEV.SIZE .EQ 16 +*-------------------------------------- +S.DEVINFO.TYPE .EQ 0 +S.DEVINFO.TYPE.CHAR .EQ %00000001 +S.DEVINFO.TYPE.XY .EQ %00000010 +S.DEVINFO.TYPE.NET .EQ %00000011 +S.DEVINFO.TYPE.GFX .EQ %00000100 +*-------------------------------------- +* Generic Driver Functions +*-------------------------------------- +DEVMGR.OPEN .EQ 0 +DEVMGR.GETEVENT .EQ 2 +DEVMGR.COUT .EQ 4 +DEVMGR.CLOSE .EQ 6 +DEVMGR.GETINFO .EQ 8 +DEVMGR.IRQ .EQ 10 +*-------------------------------------- +* 'XY' Class Driver Functions +*-------------------------------------- +DEVMGR.XY.SETPOS .EQ 12 +*-------------------------------------- +* 'NET' Class Driver Functions +*-------------------------------------- +DEVMGR.NET.SEND .EQ 12 +*-------------------------------------- +* 'GFX' Class Driver Functions +*-------------------------------------- +DEVMGR.GFX.SETPIXEL .EQ 12 +DEVMGR.GFX.GETPIXEL .EQ 14 +DEVMGR.GFX.HLINE .EQ 16 +DEVMGR.GFX.VLINE .EQ 18 +DEVMGR.GFX.BITBLT .EQ 20 +*-------------------------------------- +* PS STRUCT +*-------------------------------------- +S.PS.F .EQ 0 +S.PS.F.INUSE .EQ %10000000 +S.PS.F.HOLD .EQ %01000000 +S.PS.F.EVENT .EQ %00100000 +S.PS.ID .EQ 1 +S.PS.PID .EQ 2 +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.hINDEV .EQ 9 +S.PS.hOUTDEV .EQ 10 +S.PS.hERRDEV .EQ 11 +S.PS.CID .EQ 12 +S.PS.LASTERROR .EQ 13 +S.PS.PC .EQ 14 +* +S.PS.SIZE .EQ 16 +*-------------------------------------- +* EVENT STRUCT +*-------------------------------------- +S.EVT.F .EQ 0 +S.EVT.F.SYS .EQ %10000000 +S.EVT.F.WND .EQ %01000000 +S.EVT.F.hMEM2 .EQ %00100000 Indicates That S.EVT.DATAHI is a hMem +S.EVT.F.hMEM1 .EQ %00010000 Indicates That S.EVT.DATALO is a hMem +S.EVT.F.TIMER .EQ %00001000 +S.EVT.F.NET .EQ %00000100 +S.EVT.F.MOUSE .EQ %00000010 +S.EVT.F.KEY .EQ %00000001 +S.EVT.hDEV .EQ 1 +S.EVT.DATA .EQ 2 +S.EVT.DATALO .EQ 2 +S.EVT.DATAHI .EQ 3 +S.EVT.DATAW1 .EQ 4 +S.EVT.DATAW2 .EQ 6 +* +S.EVT.SIZE .EQ 8 +*-------------------------------------- +* S.LISTDIR STRUCT +*-------------------------------------- +S.LISTDIR.hONLINE .EQ 0 +S.LISTDIR.ONLINEPTR .EQ 1 +S.LISTDIR.REFNUM .EQ 2 ref_num file +S.LISTDIR.hIOBUF .EQ 3 hMem to ProDOS IO buffer +S.LISTDIR.hREADBUF .EQ 4 hMem to 512 Read Buffer +S.LISTDIR.EL .EQ 5 entry_length +S.LISTDIR.EIB .EQ 6 ENTRY_INDEX in block +S.LISTDIR.EPB .EQ 7 entry_per_block +S.LISTDIR.BLKPTR .EQ 8 entry PTR in block +S.LISTDIR.FI .EQ 10 FILE_INDEX in DIR +S.LISTDIR.FC .EQ 12 file_count +S.LISTDIR.hPATTERN .EQ 14 Pattern for file filtering +* +S.LISTDIR.SIZE .EQ 16 +*-------------------------------------- +* S.BUFRDR STRUCT +*-------------------------------------- +S.BUFRDR.hMEM .EQ 0 +S.BUFRDR.DELIM .EQ 1 +S.BUFRDR.LEN .EQ 2 +S.BUFRDR.IDX .EQ 4 +* +S.BUFRDR.SIZE .EQ 6 +*-------------------------------------- + +MAN +SAVE INC/A2OSX.API.I diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index f68eae16..32ea09dc 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -1,258 +1,77 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* KERNEL Reserved ZP Location 00-1F,56-FF +* Aux ZP *-------------------------------------- -ZPQuickPtr1 .EQ $90 Temp Ptrs for use in very limited scope -ZPQuickPtr2 .EQ $92 (could be trashed by any JSR) -ZPQuickPtr3 .EQ $94 -ZPQuickPtr4 .EQ $96 +ZPQuickPtr1 .EQ $0 Temp Ptrs for use in very limited scope +ZPQuickPtr2 .EQ $2 (could be trashed by any JSR) +ZPQuickPtr3 .EQ $4 +ZPQuickPtr4 .EQ $6 -ZPLIB .EQ $A0 Main -ZPDRV .EQ $B0 Main -ZPBIN .EQ $C0 Main -*-------------------------------------- -pPsContext .EQ $F0 -pDevContext .EQ $F2 -pEvent .EQ $F4 -*-------------------------------------- -R.SP .EQ $FE Main -*-------------------------------------- -* A2OS.SYSCALL Functions Indexes -*-------------------------------------- -SYS.GetMem .EQ $00 -SYS.FreeMemA .EQ $02 -SYS.ClrMemA .EQ $04 -SYS.GetMemPtrA .EQ $06 +pCode .EQ $10 +pData .EQ $12 +pStack .EQ $14 -SYS.GetMemLenA .EQ $08 -SYS.GetMemByIDA .EQ $0A -SYS.GetMemByNameA .EQ $0C -*-------------------------------------- -SYS.NewPStr .EQ $10 -SYS.PStrCpyA .EQ $12 -SYS.PStrCat .EQ $14 -SYS.PStrCmp .EQ $16 +pLib .EQ $16 +pDev .EQ $18 -SYS.PStrGetTkn .EQ $18 -SYS.GetPStrIndex .EQ $1A -*-------------------------------------- -SYS.LoadBinA .EQ $20 -SYS.LoadLib .EQ $22 -SYS.UnloadLibA .EQ $24 -SYS.LoadDrvA .EQ $26 -*-------------------------------------- -SYS.ExpandPStrA .EQ $30 -SYS.ExpandPStr .EQ $32 -SYS.GetEnvVarH .EQ $34 -SYS.GetEnvVarP .EQ $36 +pEvent .EQ $1A +pPs .EQ $1C -SYS.SetEnvVarH .EQ $38 -SYS.SetEnvVarP .EQ $3A +ZPDRV .EQ $80 +ZPBIN .EQ $90 +ZPLIB .EQ $A0 *-------------------------------------- -SYS.MLICreate .EQ $40 -SYS.MLIDestroy .EQ $42 -SYS.MLIRename .EQ $44 -SYS.MLISetFileInfo .EQ $46 - -SYS.MLIGetFileInfoA .EQ $48 -SYS.MLIOnline .EQ $4A -SYS.MLISetPrefix .EQ $4C -SYS.MLIGetPrefixA .EQ $4E - -SYS.MLIOpenA .EQ $50 -SYS.MLINewLine .EQ $52 -SYS.MLIRead .EQ $54 -SYS.MLIWrite .EQ $56 - -SYS.MLICloseA .EQ $58 -SYS.MLIFlushA .EQ $5A -SYS.MLISetMark .EQ $5C -SYS.MLIGetMark .EQ $5E - -SYS.MLISetEOF .EQ $60 -SYS.MLIGetEOFA .EQ $62 +* $C0 -> $FF KERNEL RESERVED *-------------------------------------- -SYS.GetDevByIDA .EQ $70 -SYS.GetDevByNameA .EQ $72 -SYS.GetDevTable .EQ $74 -SYS.GetDevInfoA .EQ $76 - -SYS.DevOutA .EQ $78 -SYS.GetDevByNameYA .EQ $7A -*-------------------------------------- -SYS.GetEvent .EQ $80 -SYS.DestroyEvent .EQ $82 -*-------------------------------------- -SYS.ExecProcessA .EQ $90 -SYS.CreateProcessA .EQ $92 - -SYS.GetPSByIDA .EQ $98 -*-------------------------------------- -SYS.CheckPrefixA .EQ $A0 -SYS.FileSearch .EQ $A2 -SYS.LoadFileA .EQ $A4 -SYS.ListDirInitA .EQ $A6 - -SYS.ListDirNextA .EQ $A8 -SYS.ListDirCloseA .EQ $AA -*-------------------------------------- -SYS.AddNetCfg .EQ $B0 -SYS.SetNetCfg .EQ $B2 -SYS.GetNetCfgA .EQ $B4 -SYS.ClrNetCfgA .EQ $B6 -*-------------------------------------- -SYS.ScreenSelectA .EQ $C0 -*-------------------------------------- -A2osX.SaveSM .EQ $100 Main +A2osX.SaveSM .EQ $100 Aux A2osX.SaveSX .EQ $101 Aux *-------------------------------------- -* Main $200 -> 2FF : (Reserved, ProDOS,Clock DRV....) -* Main $300 -> 3EF : -* Main $3F0 -> 3FF : SYS Vectors (reset,IRQ...) -* Aux $200 -> 3FD : /RAM Driver -* Aux $3FE -> 3FF : IRQ Vector +* Main $200 -> 2FF : (Used By ProDOS,Clock DRV....) +* Main $300 -> 3EF : +* Main $3F0 -> 3FF : SYS Vectors (reset,IRQ...) +* Aux $200 -> 3FD : /RAM Driver +* Aux $3FE -> 3FF : IRQ Vector +* Main/Aux $400 -> $7FF : Console Screen +* Main/Aux $800 -> $BFF : System Screen *-------------------------------------- -* Console Screen .EQ $400 -> $7FF -* System Screen .EQ $800 -> $BFF +TmpBuffer256 .EQ $0200 Main *-------------------------------------- -TmpBuffer256 .EQ $0C00 -*-------------------------------------- -D.STACKSEG .EQ $0D00 $0DFF Down to $0D00 -*-------------------------------------- -MLICALL.PARAMS .EQ $0E00 size=$12 (SET_FILE_INFO +1) -*-------------------------------------- -MEMMGR.LOMEM .EQ $0E30 -MEMMGR.MLLIMIT .EQ $0E32 -MEMMGR.MHLIMIT .EQ $0E34 -MEMMGR.HIMEM .EQ $0E36 -MEMMGR.MFREE .EQ $0E38 -MEMMGR.TABLESIZE .EQ $0E3A -*-------------------------------------- -Z80STACK .EQ $0FFF (0FFFFh) Down to $0F00 -Z80JMP .EQ $1000 -*-------------------------------------- -DEVMGR.TABLE .EQ $1200 K.DEV.MAX*S.DEV.SIZE=20*12=240 -TSKMGR.TABLE .EQ $1300 K.PS.MAX*S.PS.SIZE=32*16=512 -*-------------------------------------- -A2osX.LOMEM .EQ $1500 +D.STACK.BASE .EQ $0300 $03EF... +D.STACK.TOP .EQ $03F0 ...Down to $0300 *-------------------------------------- * A2osX GLOBAL PAGE -* $BE00->$BE0F : Public JMP +* $BE00->$BE0F : Public Vetors *-------------------------------------- A2osX.SYSCALL .EQ $BE00 -A2osX.MLICALL .EQ $BE02 -A2osX.LIBCALL .EQ $BE04 -A2osX.SLEEP .EQ $BE06 -Kernel.MLICALL .EQ $BE08 -Kernel.DRVCALL .EQ $BE0A -Kernel.BINCALL .EQ $BE0C -Kernel.LIBCALL .EQ $BE0E +A2osX.LIBCALL .EQ $BE02 +A2osX.SLEEP .EQ $BE04 +A2osX.MLICALL .EQ $BE06 *-------------------------------------- -A2osX.SCREENS .EQ $BE10 -A2osX.SCREENS.G .EQ %00000100 -A2osX.SCREENS.C .EQ %00000010 -A2osX.SCREENS.S .EQ %00000001 -A2osX.ACTIVESCRN .EQ $BE11 +* $BEE0->$BEFF : Public Variables +*-------------------------------------- +A2osX.SCREENS .EQ $BEE0 +A2osX.SCREENS.S .EQ %00000001 System Screen +A2osX.SCREENS.C .EQ %00000010 Console Screen +A2osX.SCREENS.G .EQ %00000100 Graphic Screen +A2osX.ASCREEN .EQ $BEE1 Active Screen -A2osX.TIMER16 .EQ $BE12 -A2osX.RANDOM16 .EQ $BE14 +A2osX.CSCREEN.DEV .EQ $BEE2 +A2osX.GSCREEN.DEV .EQ $BEE3 -A2osX.CPUTYPE .EQ $BE16 -A2osX.Z80SLOT .EQ $BE17 +A2osX.TIMER16 .EQ $BEE4 +A2osX.RANDOM16 .EQ $BEE6 -Kernel.JMP .EQ $BE1A -A2osX.SaveA .EQ $BE1C -A2osX.SaveX .EQ $BE1D -A2osX.SaveY .EQ $BE1E -A2osX.GPCODE .EQ $BE20 +A2osX.CPUTYPE .EQ $BEE8 +A2osX.Z80SLOT .EQ $BEEA *-------------------------------------- -* MEM STRUCT +*** Z80 Reserved *** *-------------------------------------- -S.MEM.F .EQ 0 -S.MEM.F.INUSE .EQ %10000000 -S.MEM.F.CLEAR .EQ %10000000 Fill with "0" -S.MEM.F.CODE .EQ %01000000 -S.MEM.F.NOMOV .EQ %00100000 -S.MEM.F.ALIGN .EQ %00010000 -S.MEM.F.SPARE .EQ %00001000 -S.MEM.F.AUX .EQ %00000100 -S.MEM.REFCNT .EQ 1 -S.MEM.PTR .EQ 2 -S.MEM.LEN .EQ 4 -S.MEM.BIN .EQ 6 -S.MEM.OWNERPID .EQ 7 -* -S.MEM.SIZE .EQ 8 -*-------------------------------------- -MEMMGR.ERROOM .EQ $FF Out Of Memory Error -MEMMGR.ERROOS .EQ $FE Out Of Slot Error -*-------------------------------------- -* DEV STRUCT -*-------------------------------------- -S.DEV.F .EQ 0 -S.DEV.F.INUSE .EQ %10000000 -S.DEV.F.EVENT .EQ %01000000 -S.DEV.F.OUT .EQ %00100000 -S.DEV.F.MOUSE .EQ %00010000 -S.DEV.F.GFX .EQ %00001000 -S.DEV.F.NET .EQ %00000100 -S.DEV.F.BLOCK .EQ %00000010 -S.DEV.F.CHAR .EQ %00000001 -S.DEV.ID .EQ 1 -S.DEV.NAME .EQ 2 5 Bytes : NUL KBD CON COMx LPTx ETHx -S.DEV.hCS .EQ 7 -S.DEV.hDS .EQ 8 -S.DEV.hCMD .EQ 9 -S.DEV.hARGS .EQ 10 -S.DEV.hOWNERPS .EQ 11 -* -S.DEV.SIZE .EQ 12 -*-------------------------------------- -* Generic Driver Functions -*-------------------------------------- -DEVMGR.OPEN .EQ 0 -DEVMGR.GETEVENT .EQ 2 -DEVMGR.OUT .EQ 4 -DEVMGR.CLOSE .EQ 6 -DEVMGR.GETINFO .EQ 8 -*-------------------------------------- -* 'GFX' Class Driver Functions -*-------------------------------------- -DEVMGR.GFX.SETPIXEL .EQ 10 -DEVMGR.GFX.GETPIXEL .EQ 12 -*-------------------------------------- -DEVMGR.ERRNICL .EQ $EB Invalid Command Line -DEVMGR.ERRNOHW .EQ $EC No Hardware -DEVMGR.ERRDNF .EQ $ED Device Not Found Error -DEVMGR.ERROOS .EQ $EE Out Of Slot Error -*-------------------------------------- -* PS STRUCT -*-------------------------------------- -S.PS.F .EQ 0 -S.PS.F.INUSE .EQ %10000000 -S.PS.F.HOLD .EQ %01000000 -S.PS.F.EVENT .EQ %00100000 -S.PS.ID .EQ 1 -S.PS.PID .EQ 2 -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.hINDEV .EQ 9 -S.PS.hOUTDEV .EQ 10 -S.PS.hERRDEV .EQ 11 -S.PS.CID .EQ 12 -S.PS.LASTERROR .EQ 13 -S.PS.PC .EQ 14 -* -S.PS.SIZE .EQ 16 +*** IRQ Handler *** *-------------------------------------- * LIB Function Indexes *-------------------------------------- @@ -266,60 +85,5 @@ TSKMGR.RUN .EQ 2 TSKMGR.DOEVENT .EQ 4 TSKMGR.QUIT .EQ 6 *-------------------------------------- -TSKMGR.ERROOS .EQ $DE Out Of Slot Error -TSKMGR.ERRNSP .EQ $DF No Such Process Error -*-------------------------------------- -* EVENT STRUCT -*-------------------------------------- -S.EVT.F .EQ 0 -S.EVT.F.SYS .EQ %10000000 -S.EVT.F.WND .EQ %01000000 -S.EVT.F.hMEM2 .EQ %00100000 Indicates That S.EVT.DATAHI is a hMem -S.EVT.F.hMEM1 .EQ %00010000 Indicates That S.EVT.DATALO is a hMem -S.EVT.F.TIMER .EQ %00001000 -S.EVT.F.NET .EQ %00000100 -S.EVT.F.MOUSE .EQ %00000010 -S.EVT.F.KEY .EQ %00000001 -S.EVT.hDEV .EQ 1 -S.EVT.DATA .EQ 2 -S.EVT.DATALO .EQ 2 -S.EVT.DATAHI .EQ 3 -S.EVT.DATAW1 .EQ 4 -S.EVT.DATAW2 .EQ 6 -* -S.EVT.SIZE .EQ 8 -*-------------------------------------- -SYSMGR.ERRENVF .EQ $CB Env is Full -SYSMGR.ERRIDIR .EQ $CC Invalid Directory -SYSMGR.ERRFTB .EQ $CD File Too Big Error -SYSMGR.ERRFNF .EQ $CE File Not Found Error -SYSMGR.ERRSYN .EQ $CF Syntax Error -*-------------------------------------- -* S.LISTDIR STRUCT -*-------------------------------------- -S.LISTDIR.hONLINE .EQ 0 -S.LISTDIR.ONLINEPTR .EQ 1 -S.LISTDIR.REFNUM .EQ 2 ref_num file -S.LISTDIR.hIOBUF .EQ 3 hMem to ProDOS IO buffer -S.LISTDIR.hREADBUF .EQ 4 hMem to 512 Read Buffer -S.LISTDIR.EL .EQ 5 entry_length -S.LISTDIR.EIB .EQ 6 ENTRY_INDEX in block -S.LISTDIR.EPB .EQ 7 entry_per_block -S.LISTDIR.BLKPTR .EQ 8 entry PTR in block -S.LISTDIR.FI .EQ 10 FILE_INDEX in DIR -S.LISTDIR.FC .EQ 12 file_count -S.LISTDIR.hPATTERN .EQ 14 Pattern for file filtering -* -S.LISTDIR.SIZE .EQ 16 -*-------------------------------------- -* S.BUFRDR STRUCT -*-------------------------------------- -S.BUFRDR.hMEM .EQ 0 -S.BUFRDR.DELIM .EQ 1 -S.BUFRDR.LEN .EQ 2 -S.BUFRDR.IDX .EQ 4 -* -S.BUFRDR.SIZE .EQ 6 -*-------------------------------------- MAN SAVE INC/A2OSX.I diff --git a/INC/IO.I.txt b/INC/IO.I.txt index 0008d291..308a5d50 100644 --- a/INC/IO.I.txt +++ b/INC/IO.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/INC/KERNEL.I.txt b/INC/KERNEL.I.txt index 7a3dbd2a..ad4a2bfd 100644 --- a/INC/KERNEL.I.txt +++ b/INC/KERNEL.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -7,13 +7,11 @@ AUTO 6 *-------------------------------------- * KERNEL CONSTANTS DEFINITON *-------------------------------------- -K.BIN.MAGICHEADER .EQ $7CD8 -*-------------------------------------- K.TIMER16RESOLUTION .EQ 5 every 5 VBL (50hz), so 100ms *-------------------------------------- K.ENV.SIZE .EQ $100 -K.DEV.MAX .EQ 20 -K.PS.MAX .EQ 32 +K.DEV.MAX .EQ 32 +K.PS.MAX .EQ 64 *-------------------------------------- K.NETCFG.MAX .EQ 4 K.NETCFG.SIZE .EQ 128 @@ -28,17 +26,31 @@ K.TCPTABLE.SIZE .EQ 16 K.ETH.FRAME.LEN .EQ 1514 K.IP.TTL .EQ 64 *-------------------------------------- -* KERNEL Reserved ZP Location 00-1F,56-FF +H.BIN.HEADER .EQ 0 +H.BIN.HEADER.DRV65 .EQ $4C8D 6502:cld,jmp abs +H.BIN.HEADER.LIB65 .EQ $7C8D 6502:cld,jmp (abs,x) +H.BIN.HEADER.BIN65 .EQ $7C8D 6502:cld,jmp (abs,x) +H.BIN.HEADER.DRV80 .EQ $A28D Z80: +H.BIN.HEADER.LIB80 .EQ $A28D Z80: +H.BIN.HEADER.BIN80 .EQ $A28D Z80: +H.BIN.JMP .EQ 2 +H.BIN.CODE.TYPE .EQ 4 +H.BIN.VERSION .EQ 5 +H.BIN.CODE.LEN .EQ 8 +H.BIN.BIN.DS.SIZE .EQ 10 +H.BIN.DEV.HEADER.O .EQ 10 +H.BIN.DRV.CODE.O .EQ 12 +H.BIN.DRV.CODE.LEN .EQ 14 +H.BIN.RELOC.TABLE .EQ 16 *-------------------------------------- -DEVMGR.DEVPTR .EQ $80 -EVTMGR.EVTPTR .EQ $82 -TSKMGR.TSKPTR .EQ $84 -TSKMGR.pNewPS .EQ $86 +* KERNEL Reserved ZP (Aux) Location 00-1F,56-FF *-------------------------------------- -ZPMemMgr .EQ $D0 Aux -ZPSysScr .EQ $E0 Aux +ZPMemMgr .EQ $B0 +ZPSysScr .EQ $C0 +ZPDevMgr .EQ $D0 +ZPTskMgr .EQ $E0 *-------------------------------------- -R.VCPU16 .EQ $F0 Aux +R.VCPU16 .EQ $F0 R.AX .EQ R.VCPU16 R.AL .EQ R.VCPU16 R.AH .EQ R.VCPU16+$1 @@ -51,10 +63,27 @@ R.CH .EQ R.VCPU16+$5 R.DX .EQ R.VCPU16+$6 R.DL .EQ R.VCPU16+$6 R.DH .EQ R.VCPU16+$7 -*R.CS .EQ R.VCPU16+$8 -*R.DS .EQ R.VCPU16+$A -R.LS .EQ R.VCPU16+$C -*R.SP .EQ R.VCPU16+$E +*-------------------------------------- +MLICALL.PARAMS .EQ $1100 +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.Table .EQ $1800 +MemMgr.HiMem .EQ $1800 Slot 0 is Reserved +MemMgr.Free .EQ $1802 +MemMgr.LoMem .EQ $1804 +MemMgr.LastSlot .EQ $1806 +*-------------------------------------- +MemMgr.MLoMem .EQ $2000 +MemMgr.MHiMem .EQ $BE00 +MemMgr.XLoMem .EQ $2000 +MemMgr.XHiMem .EQ $C000 +*-------------------------------------- +KERNEL.COLDBOOT .EQ $D000 +KERNEL.SYSCALL .EQ $D003 *-------------------------------------- MAN SAVE INC/KERNEL.I diff --git a/INC/LIBCRYPT.I.txt b/INC/LIBCRYPT.I.txt index 425e1c93..d32d9751 100644 --- a/INC/LIBCRYPT.I.txt +++ b/INC/LIBCRYPT.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/INC/LIBGFX.I.txt b/INC/LIBGFX.I.txt index 266dca32..eee49fb3 100644 --- a/INC/LIBGFX.I.txt +++ b/INC/LIBGFX.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/INC/LIBSTR.I.txt b/INC/LIBSTR.I.txt index d4bd7727..d13bc09e 100644 --- a/INC/LIBSTR.I.txt +++ b/INC/LIBSTR.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index 5f5cf76b..13c858c9 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt index c07d4605..07997d9c 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -1,13 +1,13 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- .MA DEBUG -.70 bit $C000 - bpl .70 +:1 bit $C000 + bpl :1 sta $C010 .EM *-------------------------------------- @@ -20,6 +20,12 @@ AUTO 6 *-------------------------------------- .MA MLICALL ldx #]1 + .DO ]1=MLIALLOCIRQ + lda #2 + .FIN + .DO ]1=MLIDEALLOCIRQ + lda #1 + .FIN .DO ]1=MLIREADBLOCK lda #3 .FIN @@ -89,78 +95,6 @@ AUTO 6 jsr A2osX.MLICALL .EM -*-------------------------------------- - .MA KMLICALL - ldx #]1 - .DO ]1=MLIREADBLOCK - lda #3 - .FIN - .DO ]1=MLIWRITEBLOCK - lda #3 - .FIN - .DO ]1=MLICREATE - lda #7 - .FIN - .DO ]1=MLIDESTROY - lda #1 - .FIN - .DO ]1=MLIRENAME - lda #2 - .FIN - .DO ]1=MLISETFILEINFO - lda #7 - .FIN - .DO ]1=MLIGETFILEINFO - lda #10 - .FIN - .DO ]1=MLIONLINE - lda #2 - .FIN - .DO ]1=MLISETPREFIX - lda #1 - .FIN - .DO ]1=MLIGETPREFIX - lda #1 - .FIN - .DO ]1=MLIOPEN - lda #3 - .FIN - .DO ]1=MLINEWLINE - lda #3 - .FIN - .DO ]1=MLIREAD - lda #4 - .FIN - .DO ]1=MLIWRITE - lda #4 - .FIN - .DO ]1=MLICLOSE - lda #1 - .FIN - .DO ]1=MLIFLUSH - lda #1 - .FIN - .DO ]1=MLISETMARK - lda #2 - .FIN - .DO ]1=MLIGETMARK - lda #2 - .FIN - .DO ]1=MLISETEOF - lda #2 - .FIN - .DO ]1=MLIGETEOF - lda #2 - .FIN - .DO ]1=MLISETBUF - lda #2 - .FIN - .DO ]1=MLIGETBUF - lda #2 - .FIN - - jsr Kernel.MLICALL - .EM *-------------------------------------- .MA DRVCALL ldy ]1 @@ -168,13 +102,12 @@ AUTO 6 jsr A2osX.DRVCALL .EM *-------------------------------------- - .MA LIBLOADP - >PUSHW ]1 - ldx #SYS.LoadLib + .MA LOADLIBYA + ldx #SYS.LoadLibYA jsr A2osX.SYSCALL .EM *-------------------------------------- - .MA LIBLOADA + .MA LOADLIBA ldx #SYS.LoadLibA jsr A2osX.SYSCALL .EM @@ -185,200 +118,111 @@ AUTO 6 jsr A2osX.LIBCALL .EM *-------------------------------------- -* LOCAL SEGMENT Manipulation Macros -*-------------------------------------- - .MA ADDLOCAL - pha - lda R.LS - dec R.SP - sta (R.SP) - lda R.SP - sec - sbc #]1 - sta R.SP - sta R.LS - pla - .EM -*-------------------------------------- - .MA REMLOCAL - php - pha - lda R.SP - clc - adc #]1 - sta R.SP - lda (R.SP) - inc R.SP - sta R.LS - pla - plp - .EM -*-------------------------------------- - .MA LDAL - ldy #]1 - lda (R.LS),y - .EM -*-------------------------------------- - .MA ADCL - ldy #]1 - adc (R.LS),y - .EM -*-------------------------------------- - .MA SBCL - ldy #]1 - adc (R.LS),y - .EM -*-------------------------------------- - .MA STAL - ldy #]1 - sta (R.LS),y - .EM -*-------------------------------------- - .MA LDYAL - ldy #]1 - lda (R.LS),y - pha - iny - lda (R.LS),y - ply - .EM -*-------------------------------------- - .MA STYAL - phy - ldy #]1+1 - sta (R.LS),y - dey - pla - sta (R.LS),y - tay - .EM -*-------------------------------------- - .MA INCL - ldy #]1 - lda (R.LS),y - inc - sta (R.LS),y - .EM -*-------------------------------------- - .MA INCLW - ldy #]1 - lda (R.LS),y - inc - bne .71 - sta (R.LS),y - iny - lda (R.LS),y - inc -.71 sta (R.LS),y - .EM -*-------------------------------------- - .MA DECL - ldy #]1 - lda (R.LS),y - dec - sta (R.LS),y - .EM -*-------------------------------------- - .MA DECLW - ldy #]1 - lda (R.LS),y - bne .72 - pha - iny - lda (R.LS),y - dec - sta (R.LS),y - dey - pla -.72 dec - sta (R.LS),y - .EM -*-------------------------------------- * D.STACK PUSH/PULL Macros *-------------------------------------- .MA PUSHA - dec R.SP - sta (R.SP) + dec pStack + sta (pStack) .EM *-------------------------------------- .MA PULLA - lda (R.SP) - inc R.SP + lda (pStack) + inc pStack .EM *-------------------------------------- .MA PUSHYA - dec R.SP - sta (R.SP) + dec pStack + sta (pStack) pha tya - dec R.SP - sta (R.SP) + dec pStack + sta (pStack) pla .EM *-------------------------------------- .MA PULLYA - lda (R.SP) - inc R.SP + lda (pStack) + inc pStack tay - lda (R.SP) - inc R.SP + lda (pStack) + inc pStack + .EM +*-------------------------------------- + .MA PUSHAX + pha + txa + dec pStack + sta (pStack) + pla + dec pStack + sta (pStack) + .EM +*-------------------------------------- + .MA PULLAX + lda (pStack) + inc pStack + pha + lda (pStack) + inc pStack + tax + pla .EM *-------------------------------------- .MA PUSHBI - dec R.SP + dec pStack lda #]1 - sta (R.SP) + sta (pStack) .EM *-------------------------------------- .MA PUSHB .DO ]#=2 - dec R.SP + dec pStack lda ]1,]2 - sta (R.SP) + sta (pStack) .ELSE - dec R.SP + dec pStack lda ]1 - sta (R.SP) + sta (pStack) .FIN .EM *-------------------------------------- .MA PULLB .DO ]#=2 - lda (R.SP) + lda (pStack) sta ]1,]2 - inc R.SP + inc pStack .ELSE - lda (R.SP) + lda (pStack) sta ]1 - inc R.SP + inc pStack .FIN .EM *-------------------------------------- .MA PUSHWI - dec R.SP + dec pStack lda /]1 - sta (R.SP) - dec R.SP + sta (pStack) + dec pStack lda #]1 - sta (R.SP) + sta (pStack) .EM *-------------------------------------- .MA PUSHW - dec R.SP + dec pStack lda ]1+1 - sta (R.SP) - dec R.SP + sta (pStack) + dec pStack lda ]1 - sta (R.SP) + sta (pStack) .EM *-------------------------------------- .MA PULLW - lda (R.SP) + lda (pStack) sta ]1 - inc R.SP - lda (R.SP) + inc pStack + lda (pStack) sta ]1+1 - inc R.SP + inc pStack .EM *-------------------------------------- * General WORD Manipulation Macros diff --git a/INC/MONITOR.I.txt b/INC/MONITOR.I.txt index 1182b59f..002f088e 100644 --- a/INC/MONITOR.I.txt +++ b/INC/MONITOR.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 1000 diff --git a/INC/PRODOS.I.txt b/INC/PRODOS.I.txt index 22850004..c8b6be71 100644 --- a/INC/PRODOS.I.txt +++ b/INC/PRODOS.I.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 1000 diff --git a/INC/ZP.I.txt b/INC/ZP.I.txt index 8cde0ef8..d2161c96 100644 --- a/INC/ZP.I.txt +++ b/INC/ZP.I.txt @@ -1,9 +1,11 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 *-------------------------------------- +* ProDOS Reserved ZP Location 00-1F,56-FF +*-------------------------------------- WNDLFT .EQ $20 SCROLL WINDOW LEFT WNDWDTH .EQ $21 SCROLL WINDOW WIDTH WNDTOP .EQ $22 SCROLL WINDOW TOP @@ -26,5 +28,15 @@ KSWH .EQ $39 INPUT CHARACTER HOOK HIGH RNDL .EQ $4E RANDOM NUMBER LOW RNDH .EQ $4F RANDOM NUMBER HIGH *-------------------------------------- +* Applesoft FP Registers +*-------------------------------------- +EXPSGN .EQ $9C +FAC .EQ $9D -> A1, MAIN FLT PT ACCUMULATOR +FAC.SIGN .EQ $A2 HOLDS UNPACKED SIGN +ARG .EQ $A5 -> A9, SECONDARY FP ACC +ARG.SIGN .EQ $AA +SGNCPR .EQ $AB FLAGS OPP SIGN IN FP ROUT. +FAC.EXTENSION .EQ $AC FAC EXTENSION BYTE +*-------------------------------------- MAN SAVE INC/ZP.I diff --git a/LIB/LIBCRYPT.S.txt b/LIB/LIBCRYPT.S.txt index a9dfe8a8..b9abd002 100644 --- a/LIB/LIBCRYPT.S.txt +++ b/LIB/LIBCRYPT.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/LIB/LIBGFX.S.txt b/LIB/LIBGFX.S.txt index 67eee76c..213391e6 100644 --- a/LIB/LIBGFX.S.txt +++ b/LIB/LIBGFX.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/LIB/LIBSTR.S.txt b/LIB/LIBSTR.S.txt index f6016821..9bfb534f 100644 --- a/LIB/LIBSTR.S.txt +++ b/LIB/LIBSTR.S.txt @@ -1,33 +1,35 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF LIB/LIBSTR.O + .TF /A2OSX.BOOT/LIB/LIBSTR.O *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I *-------------------------------------- ZPTmpPtr1 .EQ ZPLIB+2 ZPTmpPtr2 .EQ ZPLIB+4 ZPTmpPtr3 .EQ ZPLIB+6 *-------------------------------------- -* Main entry point -* input : -* X = Function -*-------------------------------------- -* Code signature and relocation table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA LIB.LOAD .DA LIB.UNLOAD .DA PRINTF @@ -53,8 +55,6 @@ PRINTFJMP1 .DA PRINTFA PRINTFJMP2 .DA PRINTFCR,PRINTFBKSLH,PRINTFPERCENT *-------------------------------------- .DA 0 - .DA CS.END-CS.START - .DA 0 *-------------------------------------- LIB.LOAD LIB.UNLOAD clc @@ -756,13 +756,12 @@ CROUT lda #13 *-------------------------------------- COUT phx phy - >PUSHA - ldy #S.PS.hOUTDEV - lda (pPsContext),y - >SYSCALL SYS.DevOutA + ldx #DEVMGR.COUT + jsr pDevJmp ply plx rts +pDevJmp jmp (pDev) *-------------------------------------- CS.END PRINTFTBL1 .AS -"abBdDLeEhHiIsStT" diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt index 83e9df38..b24289d3 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index d18a8a01..13d589da 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index c532999d..c78743ea 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF LIB/LIBTCPIP.O + .TF /A2OSX.BOOT/LIB/LIBTCPIP.O *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBTCPIP.I *-------------------------------------- @@ -21,19 +22,20 @@ ZPARPMAC .EQ ZPLIB+8 ZPDNSHostname .EQ ZPLIB+10 ZPDNSIP .EQ ZPLIB+12 *-------------------------------------- -* Main entry point -* input : -* X = Function -*-------------------------------------- -* Code signature and relocation table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA LIB.LOAD .DA LIB.UNLOAD @@ -73,8 +75,6 @@ L.IPCFG .DA IPCFG L.ARP.CACHE .DA ARP.CACHE L.DNS.CACHE .DA DNS.CACHE .DA 0 - .DA CS.END-CS.START - .DA DS.END-DS.START *-------------------------------------- LIB.LOAD lda bFirstLoad bne .8 @@ -230,14 +230,10 @@ NEW.ARP.FRAME jsr NEW.ETH.FRAME * X = hMem *-------------------------------------- NEW.ETH.FRAME >PUSHWI K.ETH.FRAME.LEN - >PUSHBI 0 + >PUSHBI S.MEM.F.INIT0 >SYSCALL SYS.GetMem bcs .9 >STYA ZPFrameBase1 - phx - txa - >SYSCALL SYS.ClrMemA - plx clc .9 rts *-------------------------------------- @@ -371,7 +367,11 @@ SEND.ETH.FRAME >PUSHW ZPFrameLen1 >PUSHW ZPFrameBase1 ldx #S.IPCFG.HDEV lda IPCFG,x - >SYSCALL SYS.DevOutA + + >SYSCALL SYS.GetDevByIDA + >STYA pDev + ldx #DEVMGR.NET.SEND + jsr pDevJmp rts *-------------------------------------- UDP.LISTENER >PULLW ZPFrameBase1 @@ -461,6 +461,7 @@ ComputeChecksum >PULLA eor #$FF rts *-------------------------------------- +pDevJmp jmp (pDev) CS.END *-------------------------------------- bFirstLoad .DA #0 @@ -474,9 +475,6 @@ DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE UDP.TABLE .BS K.UDPTABLE.SIZE*S.LISTENER TCP.TABLE .BS K.TCPTABLE.SIZE*S.LISTENER *-------------------------------------- -DS.START -DS.END -*-------------------------------------- MAN SAVE LIB/LIBTCPIP.S ASM diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt index a1d49610..3959d5ed 100644 --- a/SBIN/DHCPCLNT.S.txt +++ b/SBIN/DHCPCLNT.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SBIN/DHCPCLNT + .TF /A2OSX.BOOT/SBIN/DHCPCLNT *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBSTR.I .INB INC/LIBTCPIP.I @@ -18,17 +19,20 @@ ZPFrameBase1 .EQ ZPBIN ZPFrameLen1 .EQ ZPBIN+2 ZPFramePtr1 .EQ ZPBIN+4 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT @@ -37,13 +41,13 @@ L.LIBSTR .DA LIBSTR L.LIBTCPIP .DA LIBTCPIP L.IPCFG .DA IPCFG .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segemnt to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIBSTR +CS.INIT >LDYA L.LIBSTR + >LOADLIBYA sta hLIBSTR - >LIBLOADP L.LIBTCPIP + >LDYA L.LIBTCPIP + >LOADLIBYA sta hLIBTCPIP >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG @@ -79,9 +83,9 @@ CS.INIT >LIBLOADP L.LIBSTR lda #20 sta TimeOut - lda (pPsContext) + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) clc .9 rts @@ -130,8 +134,7 @@ CS.RUN.OK lda #S.IPCFG.STATUS.OK CS.RUN.KO sec rts *-------------------------------------- -CS.DOEVENT >PULLW pEvent - lda (pEvent) +CS.DOEVENT lda (pEvent) and #S.EVT.F.TIMER is it a TIMER event? beq .1 no.... @@ -170,7 +173,8 @@ CS.DOEVENT >PULLW pEvent bcs .9 lda #S.IPCFG.STATUS.ROFFER sta IPCFG - bra .88 + clc + rts .2 lda IPCFG and #S.IPCFG.STATUS.SREQ @@ -180,9 +184,9 @@ CS.DOEVENT >PULLW pEvent lda #S.IPCFG.STATUS.RACK sta IPCFG -.88 >SYSCALL SYS.DestroyEvent -.89 clc + clc rts + .9 sec rts *-------------------------------------- @@ -489,14 +493,14 @@ FRAME.REQ.OPT.SVRIP .BS 4 .HS FF FRAME.REQ.LEN .EQ *-FRAME.REQ *-------------------------------------- -DS.START -*-------------------------------------- hLIBSTR .BS 1 hLIBTCPIP .BS 1 TimeOut .BS 1 IPCFG .BS S.IPCFG *-------------------------------------- +DS.START DS.END +*-------------------------------------- MAN SAVE SBIN/DHCPCLNT.S ASM diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt index cb354af7..5fa30cca 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -1,40 +1,43 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SBIN/GETTY + .TF /A2OSX.BOOT/SBIN/GETTY *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I + .INB INC/KERNEL.I *-------------------------------------- -* Main entry point +ZPTmp1 .EQ ZPBIN *-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.MSG.GREETINGS .DA MSG.GREETINGS -L.MSG.LOGIN .DA MSG.LOGIN -L.MSG.PASSWORD .DA MSG.PASSWORD - .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate + .DA 0 End Of Reloc Table *-------------------------------------- CS.INIT ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA >PUSHBI $20 Push SEP=' ' >PUSHBI 1 Push 1 for getting INDEV @@ -45,14 +48,16 @@ CS.INIT ldy #S.PS.hARGS >SYSCALL SYS.GetDevByNameA bcs .8 - sta hINDEV + txa ldy #S.PS.hINDEV - sta (pPsContext),y + sta (pPs),y + + lda hDEVNAME >SYSCALL SYS.FreeMemA ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA >PUSHBI $20 Push SEP=' ' >PUSHBI 2 Push 1 for getting OUTDEV @@ -63,40 +68,31 @@ CS.INIT ldy #S.PS.hARGS >SYSCALL SYS.GetDevByNameA .8 bcs .98 - sta hOUTDEV + >STYA pDev + txa ldy #S.PS.hOUTDEV - sta (pPsContext),y + sta (pPs),y ldy #S.PS.hERRDEV - sta (pPsContext),y + sta (pPs),y lda hDEVNAME >SYSCALL SYS.FreeMemA ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA >PUSHBI $20 Push SEP=' ' >PUSHBI 3 Push 3 for getting BIN >SYSCALL SYS.PStrGetTkn bcs .99 - sta BINID - ldy #S.PS.ID - lda (pPsContext),y -* ldy #S.DEV.hOWNERPS -* sta (DEVMGR.DEVPTR),y - - >LDYA L.MSG.GREETINGS - jsr PRINT.MSG - - lda hOUTDEV - jsr PRBYTE + ldy #hBinName + sta (pData),y + + ldx #DEVMGR.OPEN + jsr pDevJmp if error CS, else... - stz STATUS - lda (pPsContext) - ora #S.PS.F.EVENT Now accept events - sta (pPsContext) - clc Tell TskMgr To stay in memory - rts + rts ...Tell TskMgr To stay in memory + .98 pha lda hDEVNAME @@ -105,200 +101,108 @@ CS.INIT ldy #S.PS.hARGS sec .99 rts *-------------------------------------- -CS.RUN lda STATUS - bne CS.RUN.1 - jsr CROUT - jsr CROUT - >LDYA L.MSG.LOGIN +CS.RUN ldy #S.PS.hOUTDEV + lda (pPs),y + >SYSCALL SYS.GetDevByIDA + >STYA pDev + + lda #13 try send a CR... + + jsr COUT Device Is Ready ? + + bcc .1 + clc no..loop... + rts + +.1 >LDYA L.MSG.GREETINGS jsr PRINT.MSG - jsr INPUT.INIT - inc STATUS - clc - rts -CS.RUN.1 cmp #1 - bne CS.RUN.2 - ldx INSTATUS - beq .9 - ldx INBUFFER - beq .2 -.1 lda INBUFFER,x - sta USERNAME,x - dex - bpl .1 - inc STATUS - clc - rts -.2 dec STATUS -.9 clc - rts -CS.RUN.2 cmp #2 - bne CS.RUN.3 - jsr CROUT - >LDYA L.MSG.PASSWORD - jsr PRINT.MSG - jsr INPUT.INIT - inc STATUS - clc - rts -CS.RUN.3 cmp #3 - bne CS.RUN.4 - ldx INSTATUS - beq .9 - ldx INBUFFER - beq .2 -.1 lda INBUFFER,x - sta PASSWORD,x - dex - bpl .1 -.2 inc STATUS -.9 clc - rts -CS.RUN.4 cmp #4 - bne CS.RUN.5 - jsr CROUT - inc STATUS TODO:CHECK USER/PASS - clc - rts -CS.RUN.5 cmp #5 - bne CS.RUN.6 - lda BINID - ldx pPsContext - stx pPsContext.SAVE - ldx pPsContext+1 - stx pPsContext.SAVE+1 - >SYSCALL SYS.CreateProcessA - ldx pPsContext.SAVE - stx pPsContext - ldx pPsContext.SAVE+1 - stx pPsContext+1 bcs .9 - sta CHILDPSID - inc STATUS - clc - rts -.9 jsr PRBYTE - stz STATUS - clc - rts -CS.RUN.6 dec CHILDPSIDPOLL - bne .8 - lda CHILDPSID Check for CHILDTSKID - >SYSCALL SYS.GetPSByIDA - bcc .8 Still Alive ? - stz STATUS - stz CHILDPSID -.8 clc - rts + + ldy #S.PS.hINDEV + lda (pPs),y + jsr PRBYTE + bcs .9 + lda #',' + + jsr COUT + bcs .9 + + ldy #S.PS.hOUTDEV + lda (pPs),y + jsr PRBYTE + bcs .9 + + ldy #hBinName + lda (pData),y + >SYSCALL SYS.ExecProcessA +.9 rts *-------------------------------------- -CS.DOEVENT >PULLW pEvent - lda CHILDPSID - bne .99 - ldy #S.EVT.hDEV - lda (pEvent),y - cmp hINDEV - bne .99 - lda (pEvent) - and #S.EVT.F.KEY - beq .99 - ldy #S.EVT.DATAHI - lda (pEvent),y - bne .99 - ldy #S.EVT.DATALO - lda (pEvent),y - jsr INPUT.CHARIN - >SYSCALL SYS.DestroyEvent - clc - rts -.99 sec +CS.DOEVENT sec rts *-------------------------------------- -CS.QUIT clc +CS.QUIT ldy #hBinName + lda (pData),y + >SYSCALL SYS.FreeMemA + + ldx #DEVMGR.CLOSE + jsr pDevJmp + + clc rts *-------------------------------------- * PRIVATE *-------------------------------------- -PRINT.MSG >STYA ZPQuickPtr1 +PRINT.MSG >STYA ZPTmp1 ldy #0 -.1 lda (ZPQuickPtr1),y +.1 lda (ZPTmp1),y beq .2 - ora #$80 jsr COUT + bcs .9 iny bne .1 -.2 rts -*-------------------------------------- -INPUT.INIT stz INSTATUS - stz INBUFFER - rts -*-------------------------------------- -INPUT.CHARIN ldx INSTATUS - bne .9 - cmp #$20 - bcc .1 - ldx INBUFFER - inx - cpx #16 - beq .9 - sta INBUFFER,x - stx INBUFFER - ora #$80 - jmp COUT -.1 cmp #$0D - bne .9 - inc INSTATUS -.9 rts +.2 clc +.9 rts *-------------------------------------- PRBYTE pha lsr lsr lsr lsr - ora #$B0 - cmp #$BA + ora #$30 + cmp #$3A bcc .1 adc #6 .1 jsr COUT pla + bcs .9 and #$0F - ora #$B0 - cmp #$BA - bcc COUT + ora #$30 + cmp #$3A + bcc .2 adc #6 - bra COUT +.2 jsr COUT +.9 rts *-------------------------------------- CROUT lda #13 *-------------------------------------- -COUT >PUSHA - phx +COUT phx phy - ldy #S.PS.hOUTDEV - lda (pPsContext),y - >SYSCALL SYS.DevOutA + ldx #DEVMGR.COUT + jsr pDevJmp ply plx rts -*-------------------------------------- -MSG.GREETINGS >CSTRING "A2osX-GeTTY on Dev=" -MSG.LOGIN >CSTRING "login:" -MSG.PASSWORD >CSTRING "password:" +pDevJmp jmp (pDev) *-------------------------------------- CS.END -DS.START -*-------------------------------------- +MSG.GREETINGS >CSTRING "A2osX-GeTTY on Dev=" hDEVNAME .BS 1 -hINDEV .BS 1 -hOUTDEV .BS 1 -BINID .BS 1 -STATUS .BS 1 -CHILDPSID .BS 1 -CHILDPSIDPOLL .BS 1 -INSTATUS .BS 1 -INBUFFER .BS 16 -USERNAME .BS 16 -PASSWORD .BS 16 -pPsContext.SAVE .BS 2 *-------------------------------------- -DS.END + .DUMMY + .OR 0 +DS.START +hBinName .BS 1 +DS.END .ED MAN SAVE SBIN/GETTY.S ASM diff --git a/SBIN/GUI.S.txt b/SBIN/GUI.S.txt index eccb925e..17006f7d 100644 --- a/SBIN/GUI.S.txt +++ b/SBIN/GUI.S.txt @@ -1,74 +1,120 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SBIN/GUI + .TF /A2OSX.BOOT/SBIN/GUI *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.DEVNAME.GFX .DA DEVNAME.GFX +L.DEVNAME.MOUSE .DA DEVNAME.MOUSE .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- CS.INIT >LDYA L.DEVNAME.GFX >SYSCALL SYS.GetDevByNameYA bcc .10 rts -.10 sta hDevGFX - >SYSCALL SYS.GetDevByIDA - >STYA ZPQuickPtr1 - - ldy #S.DEV.hCS - lda (ZPQuickPtr1),y - >SYSCALL SYS.GetMemPtrA - - >STYA DevJMP +.10 stx hDevGFX + >STYA pDevGFX - stz C - stz X - stz X+1 +.11 >LDYA L.DEVNAME.MOUSE + >SYSCALL SYS.GetDevByNameYA + bcc .20 -.1 stz Y - >DEBUG -.2 - >PUSHBI C Color - >PUSHBI 2 Mode:1=B/W,2=16 colors,...,128=XOR + inc DEVNAME.MOUSE+4 + lda DEVNAME.MOUSE+4 + cmp #'8' + bne .11 + sec + rts + +.20 stx hDevMouse + >STYA pDevMouse + + lda #A2osX.SCREENS.G + >SYSCALL SYS.ScreenSelectA + + ldx #DEVMGR.OPEN + jsr GoDevGFX + bcs * + + ldx #DEVMGR.OPEN + jsr GoDevMouse + bcs * + + jmp .8 + + lda #2 + sta BW + + stz C + + lda #4 + sta X + lda /4 + sta X+1 + +.1 lda #2 + sta Y + +.2 lda Y + lsr + lsr + lsr + clc + adc C + and #$0F + + >PUSHA + >PUSHB Y >PUSHW X - jsr SetPixel + >PUSHBI 2 Mode:1=B/W,2=16 colors,...,128=XOR + + ldx #DEVMGR.GFX.SETPIXEL + jsr GoDevGFX inc Y lda Y - cmp #192 + cmp #190 bne .2 + dec BW + bne .3 + + lda #2 + sta BW + inc C lda C cmp #16 bne .3 - stz C + stz C .3 lda X clc @@ -77,38 +123,78 @@ CS.INIT >LDYA L.DEVNAME.GFX bcc .4 inc X+1 -.4 lda X - sec - sbc #560 +.4 sec + sbc #556 lda X+1 - sbc /560 + sbc /556 bcc .1 +.8 lda (pPs) + ora #S.PS.F.EVENT Now accept events + sta (pPs) + clc -.9 rts + rts *-------------------------------------- CS.RUN clc rts *-------------------------------------- -CS.DOEVENT clc +CS.DOEVENT ldy #S.EVT.hDEV + lda (pEvent),y + + cmp hDevMouse + bne .99 + + lda (pEvent) + and #S.EVT.F.MOUSE + beq .99 + + ldy #S.EVT.DATALO + lda (pEvent),y + and #4 mouse move + beq .99 + + >PUSHBI 15 COLOR + + ldy #S.EVT.DATAW2 + lda (pEvent),y + >PUSHA Y + + dey + lda (pEvent),y X.HI + >PUSHA + + dey + lda (pEvent),y + >PUSHA X.LO + + >PUSHBI 2 Mode:1=B/W,2=16 colors,...,128=XOR + ldx #DEVMGR.GFX.SETPIXEL + jsr GoDevGFX + + clc rts + +.99 sec + rts *-------------------------------------- CS.QUIT clc rts *-------------------------------------- -SetPixel ldx #DEVMGR.GFX.SETPIXEL - jmp (DevJMP) +GoDevGFX jmp (pDevGFX) +GoDevMouse jmp (pDevMouse) *-------------------------------------- CS.END DEVNAME.GFX >PSTRING "GFX" -DEVNAME.MOU0 >PSTRING "MOU0" -DS.START +DEVNAME.MOUSE >PSTRING "MOU1" hDevGFX .BS 1 -DevJMP .BS 2 +pDevGFX .BS 2 +hDevMouse .BS 1 +pDevMouse .BS 2 X .BS 2 Y .BS 1 C .BS 1 -DS.END +BW .BS 1 MAN SAVE SBIN/GUI.S ASM diff --git a/SBIN/LOGIN.S.txt b/SBIN/LOGIN.S.txt new file mode 100644 index 00000000..00f36601 --- /dev/null +++ b/SBIN/LOGIN.S.txt @@ -0,0 +1,236 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BOOT/SBIN/LOGIN +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/A2OSX.API.I +*-------------------------------------- +INPUT.BUFFER.SIZE .EQ 16 +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- +CS.START cld + jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.MSG.LOGIN .DA MSG.LOGIN +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) + ora #S.PS.F.EVENT Now accept events + sta (pPs) + clc Tell TskMgr To stay in memory +.9 rts +*-------------------------------------- +CS.RUN lda #0 + ldy #hUSERNAME + sta (pData),y + ldy #hPASSWORD + sta (pData),y + + jsr CROUT + jsr CROUT + >LDYA L.MSG.LOGIN + jsr PRINT.MSG + lda #0 Echo all caracters + jsr INPUT.RESET + +.1 jsr A2osX.Sleep + jsr INPUT.LINEIN + bcc .1 + + jsr CROUT + + >LDYA L.MSG.PASSWORD + jsr PRINT.MSG + lda #'*' + jsr INPUT.RESET + +.2 jsr A2osX.Sleep + jsr INPUT.LINEIN + bcc .2 + + jsr CROUT + + ldy #hSHELL + lda (pData),y + >SYSCALL SYS.ExecProcessA + + bcc .8 + + jsr PRBYTE +.8 clc + rts +*-------------------------------------- +CS.DOEVENT ldy #S.EVT.hDEV + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPs),y + bne .99 + + lda (pEvent) + and #S.EVT.F.KEY + beq .99 + + ldy #S.EVT.DATAHI + lda (pEvent),y + bne .99 + + ldy #S.EVT.DATALO + lda (pEvent),y + jsr INPUT.CHARIN + clc + rts + +.99 sec + rts +*-------------------------------------- +CS.QUIT clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +INPUT.RESET ldy #INPUT.STATUS + sta (pData),y + lda #0 + ldy #INPUT.BUFFER + sta (pData),y + rts +*-------------------------------------- +INPUT.CHARIN tax saver char... + ldy #INPUT.STATUS + lda (pData),y + bmi .9 + + lda #INPUT.BUFFER + clc + adc pData + sta ZPQuickPtr1 + lda pData+1 + adc /INPUT.BUFFER + sta ZPQuickPtr1+1 + + cpx #$20 Control Char? + bcc .2 + + lda (ZPQuickPtr1) + + cmp #INPUT.BUFFER.SIZE Buffer full? + beq .9 + + inc + sta (ZPQuickPtr1) + tay + + txa + sta (ZPQuickPtr1),y + + ldy #INPUT.STATUS + lda (pData),y + bne .1 + txa +.1 jmp COUT + +.2 cpx #$0D + bne .9 + ldy #INPUT.STATUS + lda #$80 + sta (pData),y + +.9 rts +*-------------------------------------- +INPUT.LINEIN ldy #INPUT.STATUS + lda (pData),y + asl CS is a line is in the buffer + rts + ldy #INPUT.BUFFER + lda (pData),y get Line Length + bne .9 if 0, empty line + clc +.9 rts +*-------------------------------------- +PRINT.MSG >STYA ZPQuickPtr1 + ldy #0 +.1 lda (ZPQuickPtr1),y + beq .2 + jsr COUT + iny + bne .1 +.2 rts +*-------------------------------------- +PRBYTE pha + lsr + lsr + lsr + lsr + ora #$30 + cmp #$3A + bcc .1 + adc #6 +.1 jsr COUT + pla + and #$0F + ora #$30 + cmp #$3A + bcc COUT + adc #6 + bra COUT +*-------------------------------------- +CROUT lda #13 +*-------------------------------------- +COUT phx + phy + ldx #DEVMGR.COUT + jsr pDevJmp + ply + plx + rts +pDevJmp jmp (pDev) +CS.END +*-------------------------------------- +MSG.LOGIN >CSTRING "login:" +MSG.PASSWORD >CSTRING "password:" +SHELL >PSTRING "SHELL" +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +INPUT.BUFFER .BS INPUT.BUFFER.SIZE+1 +INPUT.STATUS .BS 1 +hUSERNAME .BS 1 +hPASSWORD .BS 1 +hSHELL .BS 1 +DS.END + .ED +*-------------------------------------- +MAN +SAVE SBIN/LOGIN.S +ASM diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index a20b2b15..fb93d7f4 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -1,16 +1,17 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SBIN/SHELL + .TF /A2OSX.BOOT/SBIN/SHELL *-------------------------------------- .INB INC/MACROS.I - .INB INC/A2OSX.I .INB INC/PRODOS.I + .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/LIBSTR.I *-------------------------------------- ZPPTR1 .EQ ZPBIN @@ -19,24 +20,26 @@ ZPPTR3 .EQ ZPBIN+4 *-------------------------------------- CmdBuffer.MAX .EQ 127 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT *-------------------------------------- L.LIBSTR .DA LIBSTR -L.CmdBuffer .DA CmdBuffer L.MSG.GREETINGS .DA MSG.GREETINGS L.MSG.UNKNOWN .DA MSG.UNKNOWN L.MSG.SYNERR .DA MSG.SYNERR @@ -49,60 +52,66 @@ T.INTCMDS .DA EXEC.CMD.CD .DA EXEC.CMD.TYPE .DA EXEC.CMD.EXIT .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- -CS.INIT stz bEXIT - - stz CmdHistory - stz CmdHistory.IDX - stz CmdHistory.END - - >LIBLOADP L.LIBSTR +CS.INIT lda #0 + ldy #bEXIT + sta (pData),y + ldy #CmdHistory + sta (pData),y + ldy #CmdHistory.IDX + sta (pData),y + ldy #CmdHistory.END + sta (pData),y + >LDYA L.LIBSTR + >LOADLIBYA bcs .99 sta hLIBSTR ldy #S.PS.ID - lda (pPsContext),y + lda (pPs),y >PUSHA ldy #S.PS.hOUTDEV - lda (pPsContext),y + lda (pPs),y >PUSHA ldy #S.PS.hINDEV - lda (pPsContext),y + lda (pPs),y >PUSHA >PUSHW L.MSG.GREETINGS >LIBCALL hLIBSTR,LIBSTR.PRINTF - lda (pPsContext) + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) clc .99 rts *-------------------------------------- -CS.RUN stz CmdBuffer +CS.RUN lda #0 + sta (pData) + lda #"$" jsr COUT lda #" " jsr COUT -.1 lda CmdBuffer +.1 lda (pData) bmi .2 jsr A2osX.SLEEP bra .1 .2 and #$7F - sta CmdBuffer + sta (pData) beq CS.RUN Empty line - >PUSHW L.CmdBuffer - >SYSCALL SYS.NewPStr + >LDYA pData + >SYSCALL SYS.NewPStrYA bcs .99 - sta hCMDLINE - jsr HISTORY.ADD + + ldy #hCMDLINE + sta (pData),y +* jsr HISTORY.ADD jsr EXEC.CMD bcc .3 @@ -115,23 +124,27 @@ CS.RUN stz CmdBuffer jsr COUT jsr CROUT -.3 lda hCMDLINE +.3 ldy #hCMDLINE + lda (pData),y >SYSCALL SYS.FreeMemA - stz hCMDLINE + ldy #hCMDLINE + lda #0 + sta (pData),y - lda bEXIT + ldy #bEXIT + lda (pData),y bne .99 + clc rts + .99 sec rts *-------------------------------------- -CS.DOEVENT >PULLW pEvent - - ldy #S.EVT.hDEV is Event from active IN device? +CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y ldy #S.PS.hINDEV - cmp (pPsContext),y + cmp (pPs),y bne .9 lda (pEvent) @@ -144,27 +157,33 @@ CS.DOEVENT >PULLW pEvent ldy #S.EVT.DATALO lda (pEvent),y - cmp #$1F - bpl .1 + tax + + cpx #$20 + bcs .1 jsr CS.EVENT.CTRL.CHAR bra .8 -.1 cmp #$7f +.1 cpx #$7f bne .2 jsr CmdBuffer.DEL bra .8 -.2 ldx CmdBuffer - cpx #CmdBuffer.MAX +.2 lda (pData) CmdBuffer + + cmp #CmdBuffer.MAX beq .8 - inx - sta CmdBuffer,x - inc CmdBuffer + + inc + sta (pData) + tay + txa + sta (pData),y + ora #$80 jsr COUT -.8 >SYSCALL SYS.DestroyEvent - clc +.8 clc rts .9 sec @@ -174,9 +193,9 @@ CS.EVENT.CTRL.CHAR cmp #13 CR bne .10 jsr CROUT - lda CmdBuffer + lda (pData) CmdBuffer ora #$80 - sta CmdBuffer + sta (pData) clc rts @@ -195,14 +214,14 @@ CS.EVENT.CTRL.CHAR .2 cmp #10 LF (down arrow) bne .3 - jsr HISTORY.GETNEXT +* jsr HISTORY.GETNEXT clc rts .3 cmp #11 VT (up arrow) bne .4 - jsr HISTORY.GETPREV +* jsr HISTORY.GETPREV clc rts @@ -223,17 +242,25 @@ CS.QUIT lda hLIBSTR *-------------------------------------- * PRIVATE *-------------------------------------- -EXEC.CMD >PUSHB hCMDLINE +EXEC.CMD ldy #hCMDLINE + >PUSHB (pData),y >PUSHBI $20 Push SEP=' ' >PUSHBI 0 Push 0 for getting CMD & ARGS >SYSCALL SYS.PStrGetTkn bcs .99 - sta hCMD - stx hARGS + ldy #hCMD + sta (pData),y + pha + txa + ldy #hARGS + sta (pData),y + pla + >SYSCALL SYS.GetMemPtrA >PUSHYA >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.UCASEP >PUSHW L.CMDS >SYSCALL SYS.GetPStrIndex @@ -245,14 +272,17 @@ EXEC.CMD >PUSHB hCMDLINE rts .1 jsr .98 Discard CMD & ARGS - lda hCMDLINE + ldy #hCMDLINE + lda (pData),y >SYSCALL SYS.ExecProcessA rts .98 pha - lda hCMD + ldy #hCMD + lda (pData),y >SYSCALL SYS.FreeMemA - lda hARGS + ldy #hARGS + lda (pData),y >SYSCALL SYS.FreeMemA pla sec @@ -262,10 +292,11 @@ EXEC.CMD.INT asl tax jmp (T.INTCMDS,x) *-------------------------------------- -EXEC.CMD.CD lda hARGS +EXEC.CMD.CD ldy #hARGS + lda (pData),y bne EXEC.CMD.CD.C ldy #S.PS.hPREFIX - lda (pPsContext),y + lda (pPs),y >SYSCALL SYS.GetMemPtrA >PUSHYA >LIBCALL hLIBSTR,LIBSTR.PRINTP @@ -276,15 +307,16 @@ EXEC.CMD.CD lda hARGS EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA >STYA ZPPTR2 ldy #S.PS.hPREFIX - lda (pPsContext),y + 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 - stx hNEWPATH >STYA ZPPTR3 + stx hNEWPATH + lda #0 sta (ZPPTR3) ldy #1 @@ -321,6 +353,7 @@ EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA pla sec .99 rts + .2 >PUSHW ZPPTR1 >PUSHW ZPPTR3 >LIBCALL hLIBSTR,LIBSTR.STRCPYP @@ -340,21 +373,45 @@ EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA >SYSCALL SYS.CheckPrefixA bcs .98 ldy #S.PS.hPREFIX - lda (pPsContext),y + lda (pPs),y pha lda hNEWPATH - sta (pPsContext),y + sta (pPs),y pla >SYSCALL SYS.FreeMemA clc rts *-------------------------------------- -EXEC.CMD.SET clc +EXEC.CMD.SET ldy #hARGS + lda (pData),y + bne .2 + + ldy #S.PS.hENV + lda (pPs),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 + +.1 lda (ZPPTR1) + beq .8 Ending 0 ? + >PUSHW ZPPTR1 + >LIBCALL hLIBSTR,LIBSTR.PRINTP + jsr CROUT + + lda ZPPTR1 + sec + adc (ZPPTR1) Add len+1 to PTR + sta ZPPTR1 + bcc .1 + inc ZPPTR1 + bra .1 + +.2 sec rts + +.8 clc + rts *-------------------------------------- -EXEC.CMD.DATE jsr MLI - .DA #MLIGETTIME - .DA 0 +EXEC.CMD.DATE >SYSCALL SYS.MLIGetTime bcs .9 >PUSHW DATELO >LIBCALL hLIBSTR,LIBSTR.PRINTDATE @@ -362,9 +419,7 @@ EXEC.CMD.DATE jsr MLI clc .9 rts *-------------------------------------- -EXEC.CMD.TIME jsr MLI - .DA #MLIGETTIME - .DA 0 +EXEC.CMD.TIME >SYSCALL SYS.MLIGetTime bcs .9 >PUSHW TIMELO >LIBCALL hLIBSTR,LIBSTR.PRINTTIME @@ -372,14 +427,32 @@ EXEC.CMD.TIME jsr MLI clc .9 rts *-------------------------------------- -EXEC.CMD.ECHO lda #$DD - sec +EXEC.CMD.ECHO ldy #hARGS + lda (pData),y + beq .98 + >SYSCALL SYS.ExpandPStrA + bcs .99 + + pha + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.PRINTP + jsr CROUT + pla + >SYSCALL SYS.FreeMemA + clc rts + +.98 lda #SYSMGR.ERRSYN + sec +.99 rts *-------------------------------------- -EXEC.CMD.TYPE lda hARGS +EXEC.CMD.TYPE ldy #hARGS + lda (pData),y beq .98 >SYSCALL SYS.LoadFileA bcs .99 + >STYA ZPPTR2 store file len phx txa @@ -393,7 +466,6 @@ EXEC.CMD.TYPE lda hARGS .2 dec ZPPTR2 lda (ZPPTR1) - ora #$80 jsr COUT inc ZPPTR1 bne .1 @@ -406,10 +478,12 @@ EXEC.CMD.TYPE lda hARGS rts .98 lda #SYSMGR.ERRSYN + sec .99 rts *-------------------------------------- -EXEC.CMD.EXIT lda #$FF - sta bEXIT +EXEC.CMD.EXIT ldy #bEXIT + lda #$FF + sta (pData),y clc rts *-------------------------------------- @@ -479,14 +553,13 @@ HISTORY.SETBUF jsr CmdBuffer.CLR bne .1 bra CmdBuffer.PRINT *-------------------------------------- -CmdBuffer.PRINT ldx #0 -.1 inx - lda CmdBuffer,x +CmdBuffer.PRINT ldy #0 +.1 iny + lda (pData),y ora #$80 - phx jsr COUT - plx - cpx CmdBuffer + tya + cmp (pData) bne .1 rts *-------------------------------------- @@ -494,11 +567,13 @@ CmdBuffer.CLR jsr CmdBuffer.DEL bne CmdBuffer.CLR .9 rts *-------------------------------------- -CmdBuffer.DEL lda CmdBuffer +CmdBuffer.DEL lda (pData) beq .9 lda #8 jsr COUT - dec CmdBuffer + lda (pData) + dec + sta (pData) .9 rts *-------------------------------------- PRBYTE pha @@ -523,13 +598,12 @@ CROUT lda #13 *-------------------------------------- COUT phx phy - >PUSHA - ldy #S.PS.hOUTDEV - lda (pPsContext),y - >SYSCALL SYS.DevOutA + ldx #DEVMGR.COUT + jsr pDevJmp ply plx rts +pDevJmp jmp (pDev) *-------------------------------------- CS.END *-------------------------------------- @@ -546,22 +620,22 @@ LIBSTR >PSTRING "libstr.o" MSG.GREETINGS >CSTRING "\nA2osX-Shell on Dev=(%h:%h),PS=%h\n\n" MSG.UNKNOWN >CSTRING "Command Not Found\n" MSG.SYNERR >CSTRING "Syntax Error Or Invalid Pathname\n" -*-------------------------------------- -DS.START -*-------------------------------------- hLIBSTR .BS 1 +hNEWPATH .BS 1 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +CmdBuffer .BS CmdBuffer.MAX+1 bEXIT .BS 1 hCMDLINE .BS 1 hCMD .BS 1 hARGS .BS 1 -hNEWPATH .BS 1 -CmdBuffer .BS CmdBuffer.MAX+1 -CmdBuffer.POS .BS 1 CmdHistory .BS 256 CmdHistory.IDX .BS 1 CmdHistory.END .BS 1 -*-------------------------------------- DS.END + .ED *-------------------------------------- MAN SAVE SBIN/SHELL.S diff --git a/SBIN/TCPIP.S.txt b/SBIN/TCPIP.S.txt index d23f07ec..9a584760 100644 --- a/SBIN/TCPIP.S.txt +++ b/SBIN/TCPIP.S.txt @@ -1,15 +1,16 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SBIN/TCPIP + .TF /A2OSX.BOOT/SBIN/TCPIP *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/KERNEL.I .INB INC/LIBTCPIP.I *-------------------------------------- @@ -20,17 +21,20 @@ ZPFrameBase2 .EQ ZPBIN+6 ZPFrameLen2 .EQ ZPBIN+8 ZPFramePtr2 .EQ ZPBIN+10 *-------------------------------------- -* Main entry point -*-------------------------------------- -* Code signature and INIT table -*-------------------------------------- -* CLD $D8 -* JMP (*,x) $7C -* #JMPTABLE -* /JMPTABLE +* File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT @@ -39,11 +43,11 @@ L.LIBTCPIP .DA LIBTCPIP L.CFGFILENAME .DA CFGFILENAME L.IPCFG .DA IPCFG .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA DS.END-DS.START Data Segment to Allocate *-------------------------------------- -CS.INIT >LIBLOADP L.LIBTCPIP +CS.INIT >LDYA L.LIBTCPIP + >LOADLIBYA bcs .99 + sta hLIBTCPIP ldx #0 .1 stz IPCFG,x @@ -74,15 +78,15 @@ CS.INIT >LIBLOADP L.LIBTCPIP >SYSCALL SYS.AddNetCfg bcs .99 - lda (pPsContext) + lda (pPs) ora #S.PS.F.EVENT Now accept events - sta (pPsContext) + sta (pPs) clc .99 rts *-------------------------------------- CS.INIT.DEV ldy #S.PS.hARGS - lda (pPsContext),y + lda (pPs),y >PUSHA >PUSHBI $20 Push SEP=' ' >PUSHBI 1 Push 1 for getting DEV @@ -91,25 +95,29 @@ CS.INIT.DEV ldy #S.PS.hARGS sta hDEVNAME save DevName for discard >SYSCALL SYS.GetDevByNameA bcs .98 - + >STYA pDev + txa sta hDev ldx #S.IPCFG.HDEV sta IPCFG,x - >SYSCALL SYS.GetDevInfoA - >STYA ZPQuickPtr1 + ldx #DEVMGR.OPEN + jsr pDevJmp - ldy #0 + ldx #DEVMGR.GETINFO + jsr pDevJmp + >STYA ZPQuickPtr1 + + ldy #1 ldx #S.IPCFG.MAC .1 lda (ZPQuickPtr1),y sta IPCFG,x - inx iny - cpy #S.IPCFG.MAC+6 + inx + cpx #S.IPCFG.MAC+6 bne .1 - lda hDEVNAME - >SYSCALL SYS.FreeMemA + jsr .98 clc rts @@ -120,8 +128,8 @@ CS.INIT.DEV ldy #S.PS.hARGS .99 sec rts *-------------------------------------- -CS.INIT.CFGFILE >PUSHW L.CFGFILENAME - >SYSCALL SYS.ExpandPStr +CS.INIT.CFGFILE >LDYA L.CFGFILENAME + >SYSCALL SYS.ExpandPStrYA bcs .99 sta hCfgFileName >SYSCALL SYS.LoadFileA @@ -154,8 +162,7 @@ CS.INIT.CFGFILE >PUSHW L.CFGFILENAME CS.RUN clc rts *-------------------------------------- -CS.DOEVENT >PULLW pEvent - lda (pEvent) +CS.DOEVENT lda (pEvent) and #S.EVT.F.NET beq .9 @@ -221,13 +228,20 @@ CS.DOEVENT.NET ldy #S.EVT.DATALO Get Frame hMem bcc .89 rts -.89 >SYSCALL SYS.DestroyEvent - clc +.89 clc rts + .99 sec rts *-------------------------------------- -CS.QUIT lda hLIBTCPIP +CS.QUIT lda hDev + >SYSCALL SYS.GetDevByIDA + >STYA pDev + + ldx #DEVMGR.OPEN + jsr pDevJmp + + lda hLIBTCPIP >SYSCALL SYS.FreeMemA clc rts @@ -428,14 +442,12 @@ CopyFramePtr12 dey bne CopyFramePtr12 rts *-------------------------------------- +pDevJmp jmp (pDev) CS.END *-------------------------------------- LIBTCPIP >PSTRING "libtcpip.o" CFGFILENAME >PSTRING "%ETC%TCPIP.CONF" DefaultHostName >CSTRING "a2osx-host" -*-------------------------------------- -DS.START -*-------------------------------------- hLIBTCPIP .BS 1 hDEVNAME .BS 1 hDev .BS 1 @@ -444,8 +456,6 @@ hCfgFile .BS 1 hCfgFileLen .BS 2 IPCFG .BS S.IPCFG Get in cache for faster access with ,X *-------------------------------------- -DS.END -*-------------------------------------- MAN SAVE SBIN/TCPIP.S ASM diff --git a/SBIN/TELNETD.S.txt b/SBIN/TELNETD.S.txt index d2ba3ef0..1317abbf 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index cf142aab..178aa4f3 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -13,375 +13,227 @@ AUTO 6 * Y,A = MEMPTR * X = hMem of Code Segment *-------------------------------------- -S.LoadBinA sta R.DH save file path +S.LoadBinA sta S.LoadBinA.hFilename save file path jsr S.GetMemByNameA bcs .1 not already loaded - >STYA R.AX Save base address + + >STYA ZPQuickPtr1 Save base address ldy #S.MEM.REFCNT - lda (R.AX),y + lda (ZPQuickPtr1),y inc - sta (R.AX),y + sta (ZPQuickPtr1),y + ldy #S.MEM.PTR - lda (R.AX),y + lda (ZPQuickPtr1),y pha Y,A = MEM PTR... iny - lda (R.AX),y + lda (ZPQuickPtr1),y ply X=hMem from S.GetMemByNameA clc rts -.1 lda R.DH +.1 lda S.LoadBinA.hFilename jsr S.LoadFileA - bcs .99 - >STYA R.BX save file length for relocation - stx R.DL save hMem + bcc .2 + rts Error Loading file + +.2 >STYA S.LoadBinA.FileLen + stx S.LoadBinA.hMem save hMem txa jsr S.GetMemPtrA - >STYA R.AX save base address for relocation - lda R.DH - jsr S.MLIGetFileInfoA Get File Info for AUXTYPE - bcs .98 - >STYA ZPQuickPtr1 - ldy #2 get AUXTYPE + >STYA ZPQuickPtr1 save base address for relocation + + ldy #H.BIN.CODE.LEN make AX = Code Len lda (ZPQuickPtr1),y - sta R.CL + sta R.AL iny lda (ZPQuickPtr1),y - sta R.CH save File load address for relocation - lda R.AL compute offset for relocation.... + sta R.AH + + lda S.LoadBinA.hFilename + jsr S.MLIGetFileInfoA Get File Info for AUXTYPE + bcs .98 + + >STYA ZPQuickPtr2 + ldy #2 get AUXTYPE + lda (ZPQuickPtr2),y + sta R.BL Make BX=Range Start=AUXTYPE + sta S.LoadBinA.AuxType + clc + adc S.LoadBinA.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 R.CH + + lda ZPQuickPtr1 Compute relocation offset in DX sec - sbc R.CL ...AX-CX... - sta R.CL - lda R.AH - sbc R.CH - sta R.CH ...to CX - jsr S.BinRelocate + sbc S.LoadBinA.AuxType + sta R.DL DX=Offset=ZPQuickPtr1-AUXTYPE + lda ZPQuickPtr1+1 + sbc S.LoadBinA.AuxType+1 + sta R.DH + + >LDYA ZPQuickPtr1 + jsr S.BinRelocateYA + bcs .98 relocation error, dicard Code segment - lda R.DH get back bin path + + lda S.LoadBinA.hFilename get back bin path jsr S.PStrCpyA bcs .98 + pha save copy of bin path - lda R.DL + lda S.LoadBinA.hMem jsr S.GetMemByIDA >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) ora #S.MEM.F.CODE This is a code segment sta (ZPQuickPtr1) + ldy #S.MEM.BIN pla get back copy of bin path sta (ZPQuickPtr1),y - >LDYA R.AX return CS PTR ... not modified by S.LoadCodeReloc - ldx R.DL ...and hMEM to Caller - clc + + lda S.LoadBinA.hMem + tax return hMEM to Caller... + jsr S.GetMemPtrA + clc ...and Y,A=PTR to CS rts + .98 pha - lda R.DL + lda S.LoadBinA.hMem jsr S.FreeMemA Discard Loaded Code pla -.99 sec - rts -*-------------------------------------- -* S.LoadDrvA -* in : -* A = hMem To Full Cmd Line -* out : -* none -*-------------------------------------- -S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn - >LDYAI MSG.DRVLOAD - jsr S.SysScrPPSTR - jsr S.CreateDevice - bcc .1 - pha save error code - >PULLA discard Cmd Line - pla + sec rts - -.1 >PUSHBI $20 Push SEP=' ' - >PUSHBI 0 Push 0 for getting CMD And ARGS - jsr S.PStrGetTkn - bcs .98 - ldy #S.DEV.hCMD - sta (DEVMGR.DEVPTR),y - - >PUSHA push CMD for S.FileSearch - txa - ldy #S.DEV.hARGS - sta (DEVMGR.DEVPTR),y - >PUSHWI ENV.DRV push ENVNAME=DRV - ldy #S.PS.hENV - lda TSKMGR.TABLE,y Get PS #0 Env - >PUSHA - jsr S.GetEnvVarP get value for ENV=%DRV% - bcs .98 - - sta LoadDrv.ENV - >PUSHA A=PStr to Value - jsr S.FileSearch find File in %DRV% - bcs .98 not Found - - sta LoadDrv.BIN - jsr S.SysScrPPSTRA - - lda LoadDrv.BIN - jsr S.LoadBinA X = BinPath hMem - bcs .97 - >STYA Kernel.JMP save PTR to Code Segment - txa - ldy #S.DEV.hCS - sta (DEVMGR.DEVPTR),y save CS hMem in DEVSLOT - - lda LoadDrv.BIN - jsr S.FreeMemA - lda LoadDrv.ENV - jsr S.FreeMemA - - ldx #DEVMGR.OPEN - >LDYA DEVMGR.DEVPTR - jsr Kernel.DRVCALL Call DRV Open function - bcs .99 - - lda (DEVMGR.DEVPTR) - ora #S.DEV.F.INUSE Get Device Flags in A - sta (DEVMGR.DEVPTR) +*-------------------------------------- +S.LoadBinA.hFilename .BS 1 +S.LoadBinA.hMem .BS 1 +S.LoadBinA.AuxType .BS 2 +S.LoadBinA.FileLen .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 - rts - -.97 pha save error code - lda LoadDrv.BIN - jsr S.FreeMemA discard BIN in case of failed load - pla - -.98 pha - lda LoadDrv.ENV - jsr S.FreeMemA - pla - -.99 pha - jsr S.DestroyDevice - pla - sec - rts -*-------------------------------------- -* S.LoadLib -* in : -* PULLW = PTR To Lib Name -* out : -* A = hMem To loaded LIB -*-------------------------------------- -S.LoadLib jsr S.NewPStr - bcs .99 - pha save LibName hMem for discard - jsr S.LoadLibA - bcs .98 - plx get back STR hMem - pha save error code/hMem - txa - jsr S.FreeMemA discard STR hMem - pla get back error code/hMem - clc - rts -.98 plx get back STR hMem - pha save error code/hMem - txa - jsr S.FreeMemA discard STR hMem - pla get back error code/hMem - sec -.99 rts -*-------------------------------------- -* S.LoadLibA -* in : -* A = hMem To Lib Name -* out : -* A = hMem of Loaded Lib -*-------------------------------------- -S.LoadLibA >PUSHA push libname for S.FileSearch - >LDYAI MSG.LOADLIB - jsr S.SysScrPPSTR - >PUSHWI ENV.LIB push ENVNAME=LIB - ldy #S.PS.hENV - lda (TSKMGR.TSKPTR),y - >PUSHA - jsr S.GetEnvVarP get value for ENV=LIB - bcs .99 - pha save hMem to LIB VALUE - >PUSHA Push %LIB% VALUE - jsr S.FileSearch find libname in %LIB% - bcs .98 - pha save hMem to LIB full path - jsr S.SysScrPPSTRA - pla - pha - jsr S.LoadBinA A = hMem of filename full path - bcs .97 - phx - >STYA Kernel.JMP - - ldx #LIBMGR.LOAD - jsr Kernel.LIBCALL Call LIB.LOAD function - - bcs .97 - - plx - pla discard LIB PATH - jsr S.FreeMemA - pla discard LIB VALUE - jsr S.FreeMemA - txa - clc - rts -.97 pla discard LIB PATH - jsr S.FreeMemA -.98 pla discard LIB VALUE - jsr S.FreeMemA - sec -.99 rts -*-------------------------------------- -* S.UnloadLibA -* in : -* A = hMem To Lib -* out : -*-------------------------------------- -S.UnloadLibA pha - jsr S.GetMemByIDA - >STYA ZPQuickPtr1 - ldy #S.MEM.REFCNT - lda (ZPQuickPtr1),y Get count of those referencing this lib - dec only one left ? - beq .1 + adc R.DL sta (ZPQuickPtr1),y - pla - clc - rts - -.1 ldy #S.MEM.PTR - lda (ZPQuickPtr1),y - pha + iny lda (ZPQuickPtr1),y - ply - >STYA Kernel.JMP + adc R.DH + sta (ZPQuickPtr1),y + + ldy #H.BIN.RELOC.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes) + bra S.JmpRelocate - ldx #LIBMGR.UNLOAD - jsr Kernel.BINCALL Call LIB.UNLOAD function - pla - jmp S.FreeMemA -*-------------------------------------- -* S.BinRelocate : -* R.AX = base address to start relocate -* R.BX = segment length (including data) -* R.CX = offset to apply to all abs addresses within segment -* R.DX unmodified -*-------------------------------------- -S.BinRelocate lda (R.AX) - cmp #K.BIN.MAGICHEADER - bne .99 - ldy #1 - lda (R.AX),y - cmp /K.BIN.MAGICHEADER - beq .1 -.99 sec Not a Valid Relocatable BIN File, exiting - rts -.1 >PUSHW R.DX - lda R.AL - clc - adc R.BL Make BX end of Segment Range (BX=AX+BX) - sta R.BL - lda R.AH - adc R.BH - sta R.BH +S.DrvRelocateYA >STYA ZPQuickPtr1 + ldy #0 + +S.JmpRelocate lda (ZPQuickPtr1),y Start Relocate JMP table + tax iny -.2 lda (R.AX),y Start Relocate JMP table - clc - adc R.CL - tax save LO to X - iny - lda (R.AX),y if HI = 0,we are done - beq .3 - adc R.CH - sta (R.AX),y + ora (ZPQuickPtr1),y + beq S.CodeRelocate $0000 = end of table + dey - txa get back LO - sta (R.AX),y - iny - iny - bra .2 -.3 iny we already skipped the 2 "0" bytes indicating end of JMP table - lda R.AL + txa clc - adc (R.AX),y make DX = end of opcode range - sta R.DL + adc R.DL + sta (ZPQuickPtr1),y + iny - lda R.AH - adc (R.AX),y - sta R.DH + lda (ZPQuickPtr1),y + adc R.DH + sta (ZPQuickPtr1),y + iny -* Start relocating opcodes between R.AX and R.DX with abs addressing pointing between R.AX and R.BX -* Applying offset = R.CX - tya add current offset in Y to R.AX + + bra S.JmpRelocate + +S.CodeRelocate lda ZPQuickPtr1 clc - adc R.AL - sta ZPQuickPtr1 - lda #0 + adc R.AL Make ZPQuickPtr2=End of code + sta ZPQuickPtr2 =ZPQuickPtr1+AX (code len) + lda ZPQuickPtr1+1 adc R.AH - sta ZPQuickPtr1+1 -.4 lda (ZPQuickPtr1) get OPCODE + 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 - clc - adc R.CL add CX to abs address - sta ZPQuickPtr2 store relocated addr LO - iny - lda (ZPQuickPtr1),y Get HI - adc R.CH - sta ZPQuickPtr2+1 store relocated addr LO - dey - lda ZPQuickPtr2 Get new LO - sec - sbc R.AL - iny - lda ZPQuickPtr2+1 Get new HI - sbc R.AH - bcc .6 new addr < AX, out of range - dey - lda ZPQuickPtr2 Get new LO sec sbc R.BL iny - lda ZPQuickPtr2+1 Get new HI + lda (ZPQuickPtr1),y Get HI sbc R.BH - bcs .6 new addr > BX, out of range + bcc .6 addr < AX, out of range + dey - lda ZPQuickPtr2 Get new LO - sta (ZPQuickPtr1),y + lda (ZPQuickPtr1),y Get LO + sec + sbc R.CL iny - lda ZPQuickPtr2+1 Get new HI - sta (ZPQuickPtr1),y -.6 lda OPCODES,x -.7 and #$3 get OPCODE length + 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 sec A already got Ptr LO - sbc R.DL - lda ZPQuickPtr1+1 is Ptr greater than DX ? - sbc R.DH - bcc .4 no, continue relocating - >PULLW R.DX + +.8 lda ZPQuickPtr1 is Current PTR < Code Limit ? + sec + sbc ZPQuickPtr2 + lda ZPQuickPtr1+1 + sbc ZPQuickPtr2+1 + bcc .5 yes, continue relocating + clc rts -*-------------------------------------- -MSG.DRVLOAD >PSTRING "\nLoadDrv:" -MSG.LOADLIB >PSTRING "\nLoadLib:" -LoadDrv.ENV .BS 1 -LoadDrv.BIN .BS 1 - *-------------------------------------- * 65C02 OPCODES * Bit 7 : 1 absolute addressing diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 3df7e7c7..1860805c 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -1,35 +1,28 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 *-------------------------------------- +DevMgr.HiMem .EQ $FFFE Protect IRQ vector in Aux LC +*-------------------------------------- * S.DevMgrInit *-------------------------------------- -S.DevMgrInit ldx #S.DEV.SIZE*K.DEV.MAX -.1 stz DEVMGR.TABLE-1,x +S.DevMgrInit ldx #S.DEV.SIZE*2 +.1 lda DevMgr.NUL-1,x + sta DevMgr.Table-1,x dex bne .1 - - ldy #5 -.2 lda DEVMGR.TABLE.NUL,y - sta DEVMGR.TABLE,y - dey - bpl .2 - - ldy #5 - ldx #S.DEV.SIZE+5 -.3 lda DEVMGR.TABLE.KBD,y - sta DEVMGR.TABLE,x - dex - dey - bpl .3 + + stz DevMgr.Table+S.DEV.SIZE*2+1 lda #1 reserve #0=NUL, #1=KBD - sta DEVMGR.LASTID - + sta DevMgr.LastDevID + + >LDYAI DevMgr.End + >STYA DevMgr.Free clc rts *-------------------------------------- @@ -41,185 +34,185 @@ S.DevMgrInit ldx #S.DEV.SIZE*K.DEV.MAX * Y,A = devslot * X Unmodified *-------------------------------------- -S.GetDevByIDA sta ZPQuickPtr1 - lda #K.DEV.MAX - sta ZPQuickPtr1+1 - - >LDYAI DEVMGR.TABLE - >STYA ZPQuickPtr2 - -.1 lda (ZPQuickPtr2) get S.DEV.F - bpl .2 In use ? - ldy #S.DEV.ID - lda (ZPQuickPtr2),y - cmp ZPQuickPtr1 - beq .8 - -.2 lda ZPQuickPtr2 - clc - adc #S.DEV.SIZE - sta ZPQuickPtr2 - bcc .3 - inc ZPQuickPtr2+1 - -.3 dec ZPQuickPtr1+1 - bne .1 - sec - rts - -.8 >LDYA ZPQuickPtr2 - clc - rts +S.GetDevByIDA cmp DevMgr.LastDevID + beq .1 + bcs .9 + +.1 stz S.GetDevByIDA.T + + asl + ror S.GetDevByIDA.T + asl + ror S.GetDevByIDA.T + asl + ror S.GetDevByIDA.T + asl + ror S.GetDevByIDA.T + + adc #DevMgr.Table + tay + lda S.GetDevByIDA.T + adc /DevMgr.Table + rts CC + +.9 lda #DEVMGR.ERRDNF + rts CS +S.GetDevByIDA.T .BS 1 *-------------------------------------- * GetDevIDByNameA * IN: * A = hPStr * OUT: * CC = OK, CS = ERROR -* A = DEVID -* set DEVMGR.DEVPTR to devslot +* X = DEVID +* Y,A = pDev *-------------------------------------- S.GetDevByNameA jsr S.GetMemPtrA S.GetDevByNameYA >STYA ZPQuickPtr1 - >LDYAI DEVMGR.TABLE - >STYA DEVMGR.DEVPTR + >LDYAI DevMgr.Table+S.DEV.NAME + >STYA ZPQuickPtr2 - ldx #K.DEV.MAX -.1 lda (DEVMGR.DEVPTR) get S.DEV.F - bpl .3 empty ? - lda DEVMGR.DEVPTR - clc - adc #S.DEV.NAME - sta ZPQuickPtr2 - lda DEVMGR.DEVPTR+1 - adc /S.DEV.NAME - sta ZPQuickPtr2+1 - lda (ZPQuickPtr1) + ldx #0 + +.1 lda (ZPQuickPtr1) cmp (ZPQuickPtr2) bne .3 + tay .2 lda (ZPQuickPtr1),y cmp (ZPQuickPtr2),y bne .3 + dey bne .2 - ldy #S.DEV.ID - lda (DEVMGR.DEVPTR),y - clc - rts -.3 lda DEVMGR.DEVPTR - clc - adc #S.DEV.SIZE - sta DEVMGR.DEVPTR - bcc .5 - inc DEVMGR.DEVPTR+1 -.5 dex - bne .1 - lda #DEVMGR.ERRDNF - sec - rts -*-------------------------------------- -* S.GetDevTable -* IN : -* OUT CC = OK, CS = ERROR -* Y,A = PTR to dev table -* X = LASTID -*-------------------------------------- -S.GetDevTable >LDYAI DEVMGR.TABLE - ldx DEVMGR.LASTID - rts -*-------------------------------------- -* S.DevOutA -* IN : -* A = hDev -*-------------------------------------- -S.DevOutA ldx #DEVMGR.OUT - jmp S.DevCallFunc -*-------------------------------------- -* S.GetDevInfoA -*-------------------------------------- -S.GetDevInfoA ldx #DEVMGR.GETINFO - jmp S.DevCallFunc -*-------------------------------------- -* PRIVATE -*-------------------------------------- -S.DevCallFunc jsr S.GetDevByIDA - bcs .9 - >STYA pDevContext - ldy #S.DEV.hCS - lda (pDevContext),y - jsr S.GetMemPtrA X = unmodified - >STYA Kernel.JMP - >LDYA pDevContext - jsr Kernel.DRVCALL Call DRV function -.9 rts -*-------------------------------------- -* S.CreateDevSlot -* IN : none -* OUT : A = DevID -* set DEVMGR.DEVPTR to freeslot -*-------------------------------------- -S.CreateDevice >LDYAI DEVMGR.TABLE - >STYA DEVMGR.DEVPTR - ldx #K.DEV.MAX -.1 lda (DEVMGR.DEVPTR) - bpl .3 - lda DEVMGR.DEVPTR - clc - adc #S.DEV.SIZE - sta DEVMGR.DEVPTR - bcc .2 - inc DEVMGR.DEVPTR+1 -.2 dex - bne .1 - lda #DEVMGR.ERROOS + lda ZPQuickPtr2 sec - rts - -.3 lda #0 + sbc #S.DEV.NAME tay -.4 sta (DEVMGR.DEVPTR),y - iny - cpy #S.DEV.SIZE - bne .4 - inc DEVMGR.LASTID - lda DEVMGR.LASTID - ldy #S.DEV.ID - sta (DEVMGR.DEVPTR),y + lda ZPQuickPtr2+1 + sbc /S.DEV.NAME clc rts + +.3 lda ZPQuickPtr2 + clc + adc #S.DEV.SIZE + sta ZPQuickPtr2 + bcc .4 + + inc ZPQuickPtr2+1 + +.4 cpx DevMgr.LastDevID + inx + bcc .1 + +.9 lda #DEVMGR.ERRDNF + rts *-------------------------------------- -* S.DestroyDevSlot -* selected by (DEVMGR.DEVPTR) +S.GetDevEvent >LDYAI DevMgr.Table + >STYA pDev + + stz DevMgr.DevID + +.1 ldy #S.DEV.F + lda (pDev),y get S.DEV.F + and #S.DEV.F.EVENT + beq .2 EVENT enabled ? + + ldx #DEVMGR.GETEVENT + jsr pDevJmp Call DRV GetEvent function + bcc .8 Got An Event + +.2 lda pDev + clc + adc #S.DEV.SIZE + sta pDev + bcc .3 + inc pDev+1 + +.3 lda DevMgr.DevID + inc DevMgr.DevID + cmp DevMgr.LastDevID + bne .1 + + lda #0 error code=0,CS=no event + sec + rts + +.8 lda DevMgr.DevID Carry is alredy clear + ldy #S.EVT.hDEV + sta (pEvent),y + rts *-------------------------------------- -S.DestroyDevice ldy #S.DEV.hCS - lda (DEVMGR.DEVPTR),y - beq .1 - jsr S.FreeMemA -.1 ldy #S.DEV.hDS - lda (DEVMGR.DEVPTR),y - beq .2 - jsr S.FreeMemA -.2 ldy #S.DEV.hCMD - lda (DEVMGR.DEVPTR),y - beq .3 - jsr S.FreeMemA -.3 ldy #S.DEV.hARGS - lda (DEVMGR.DEVPTR),y - beq .4 - jsr S.FreeMemA -.4 rts +DevMgr.Free .BS 2 +DevMgr.DevID .BS 1 +DevMgr.LastDevID .BS 1 *-------------------------------------- -DEVMGR.TABLE.NUL .DA #S.DEV.F.INUSE+S.DEV.F.CHAR+S.DEV.F.BLOCK - .HS 00 ID - >PSTRING "NUL" NAME -DEVMGR.TABLE.KBD .DA #S.DEV.F.INUSE+S.DEV.F.CHAR - .HS 01 ID - >PSTRING "KBD" NAME -DEVMGR.LASTID .BS 1 +DevMgr.NUL cld + jmp (DevMgr.NUL.Code,x) + .DA #S.DEV.F.INUSE+S.DEV.F.SHARE+S.DEV.F.COUT+S.DEV.F.CHAR + >PSTRING "NUL" NAME + .HS 00 NAME must Be 5 bytes long + .HS 00.00 + .HS 00.00.00.00 *-------------------------------------- +DevMgr.KBD cld + jmp (DevMgr.KBD.Code,x) + .DA #S.DEV.F.INUSE+S.DEV.F.EVENT+S.DEV.F.CHAR + >PSTRING "KBD" NAME + .HS 00 NAME must Be 5 bytes long + .HS 00.00 + .HS 00.00.00.00 +*-------------------------------------- +DevMgr.NUL.Code .DA .8 OPEN + .DA .8 GETEVENT + .DA .8 COUT + .DA .8 CLOSE + .DA .8 GETINFO + .DA .8 IRQ +.8 clc + rts +*-------------------------------------- +DevMgr.KBD.Code .DA .8 OPEN + .DA DevMgr.KBD.GETEVENT + .DA .8 COUT + .DA .8 CLOSE + .DA .8 GETINFO + .DA .8 IRQ +.8 clc + rts +*-------------------------------------- +DevMgr.KBD.GETEVENT + lda KBD + bpl .9 + + sta KBDSTROBE + and #$7F + ldy #S.EVT.DATA + sta (pEvent),y + iny + lda OPENAPPLE + asl + lda SOLIDAPPLE + ror + and #$C0 + sta (pEvent),y + lda #S.EVT.F.KEY + + sta (pEvent) + clc + rts + +.9 inc A2osX.RANDOM16 + bne .99 + inc A2osX.RANDOM16+1 +.99 lda #0 error code=0 + sec no event + rts +*-------------------------------------- +DevMgr.End .EQ * MAN SAVE SYS/KERNEL.S.DEV LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.DRV.txt b/SYS/KERNEL.S.DRV.txt new file mode 100644 index 00000000..5e211f63 --- /dev/null +++ b/SYS/KERNEL.S.DRV.txt @@ -0,0 +1,285 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.LoadDrvA +* in : +* A = hMem To Full Cmd Line +* out : +* none +*-------------------------------------- +S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn + >LDYAI MSG.DRVLOAD + jsr S.SysScrPPSTRYA + + >PUSHBI $20 Push SEP=' ' + >PUSHBI 0 Push 0 for getting CMD And ARGS + jsr S.PStrGetTkn + bcc .1 + rts + +.1 sta LoadDrv.Cmd + stx LoadDrv.Args + >PUSHA push CMD for S.FileSearch + + >PUSHWI ENV.DRV push ENVNAME=DRV + ldy #S.PS.hENV + lda TskMgr.Table,y Get PS #0 Env + >PUSHA + jsr S.GetEnvVarP get value for ENV=%DRV% + bcs .98 + + sta LoadDrv.Path + >PUSHA A=PStr to Value + jsr S.FileSearch find File in %DRV% + bcs .97 not Found + + sta LoadDrv.FullName + jsr S.SysScrPPSTRA + + lda LoadDrv.FullName + jsr S.LoadBinA + bcs .96 + + >STYA pCode + stx LoadDrv.hMem + + lda LoadDrv.Args + jsr pCodeJmp call Dev.Detect + + bcs .95 + + jsr S.InsDrv + bcs .95 + + jsr .95 + + ldy #S.DEV.F + lda (pDev),y + ora #S.DEV.F.INUSE + sta (pDev),y + clc + rts + +.95 pha + lda LoadDrv.hMem + jsr S.FreeMemA + pla + +.96 pha + lda LoadDrv.FullName + jsr S.FreeMemA + pla + +.97 pha + lda LoadDrv.Path + jsr S.FreeMemA + pla + +.98 pha + lda LoadDrv.Args + jsr S.FreeMemA + lda LoadDrv.Cmd + jsr S.FreeMemA + pla + +.99 sec + rts +*-------------------------------------- +MSG.DRVLOAD >PSTRING "\nLoadDrv:" +LoadDrv.Cmd .BS 1 +LoadDrv.Args .BS 1 +LoadDrv.Path .BS 1 +LoadDrv.FullName .BS 1 +LoadDrv.hMem .BS 1 +*-------------------------------------- +* pCode = .DRV File Loaded Address +*-------------------------------------- +S.InsDrv ldy #H.BIN.DRV.CODE.LEN + lda (pCode),y + sta R.AL + iny + lda (pCode),y + sta R.AH + + ldy #H.BIN.DRV.CODE.O + lda (pCode),y + clc + adc S.LoadBinA.AuxType + sta R.BL + iny + lda (pCode),y + adc S.LoadBinA.AuxType+1 + sta R.BH set BX=End Of Code + + lda S.LoadBinA.AuxType + clc + adc S.LoadBinA.FileLen + sta R.CL + lda S.LoadBinA.AuxType+1 + adc S.LoadBinA.FileLen+1 + sta R.CH set CX=End Of Range + + ldy #H.BIN.DRV.CODE.O + lda S.LoadBinA.FileLen + sec + sbc (pCode),y + sta S.InsDrv.DRVLen + iny + lda S.LoadBinA.FileLen+1 + sbc (pCode),y + sta S.InsDrv.DRVLen+1 Compute DRV Len + + lda DevMgr.Free + clc + adc S.InsDrv.DRVLen + sta S.InsDrv.DRVEnd + lda DevMgr.Free+1 + adc S.InsDrv.DRVLen+1 + sta S.InsDrv.DRVEnd+1 + + bcs .98 we crossed $FFFF, out of mem + + lda S.InsDrv.DRVEnd + sec + sbc #DevMgr.HiMem + lda S.InsDrv.DRVEnd+1 + sbc /DevMgr.HiMem + bcs .98 No More Room to load Driver.... + + lda DevMgr.LastDevID + inc + cmp #K.DEV.MAX + beq .99 No Device Handle Left + + sta DevMgr.LastDevID + + ldy #H.BIN.DEV.HEADER.O + lda (pCode),y + clc + adc pCode + sta ZPQuickPtr1 + iny + lda (pCode),y + adc pCode+1 + sta ZPQuickPtr1+1 + + ldy #S.DEV.JMP + + lda DevMgr.Free + sec + sbc (ZPQuickPtr1),y + sta R.DL + lda DevMgr.Free+1 + iny + sbc (ZPQuickPtr1),y + sta R.DH set DX=Offset + + ldy #H.BIN.DRV.CODE.O + lda (pCode),y + clc + adc pCode + pha + iny + lda (pCode),y + adc pCode+1 + ply + + jsr S.DrvRelocateYA + + jsr S.InsDrv.Move + + >LDYA S.InsDrv.DrvEnd + >STYA DevMgr.Free + clc + rts + +.98 lda #DEVMGR.ERROOM + sec + rts + +.99 lda #DEVMGR.ERROOH + sec + rts +*-------------------------------------- +S.InsDrv.Move ldy #H.BIN.DEV.HEADER.O + lda (pCode),y + clc + adc pCode + sta ZPQuickPtr1 + iny + lda (pCode),y + adc pCode+1 + sta ZPQuickPtr1+1 + + ldy #S.DEV.JMP Relocate Main JMP + lda (ZPQuickPtr1),y + clc + adc R.DL + sta (ZPQuickPtr1),y + iny + lda (ZPQuickPtr1),y + adc R.DH + sta (ZPQuickPtr1),y + + lda DevMgr.LastDevID + jsr S.GetDevByIDA + >STYA pDev + + ldy #S.DEV.SIZE-1 Copy DRV.Header + +.1 lda (ZPQuickPtr1),y + sta (pDev),y + dey + bpl .1 + + ldy #H.BIN.DRV.CODE.O + lda (pCode),y + clc + adc pCode + sta ZPQuickPtr1 + iny + lda (pCode),y + adc pCode+1 + sta ZPQuickPtr1+1 Make ZPQuickPtr1=DRV.CODE + + lda DevMgr.Free + sta ZPQuickPtr2 + lda DevMgr.Free+1 + sta ZPQuickPtr2+1 Make ZPQuickPtr2=Dest Ram Location + + ldy S.InsDrv.DrvLen + ldx S.InsDrv.DrvLen+1 + +.2 lda (ZPQuickPtr1) + sta (ZPQuickPtr2) + + inc ZPQuickPtr1 + bne .3 + inc ZPQuickPtr1+1 + +.3 inc ZPQuickPtr2 + bne .4 + inc ZPQuickPtr2+1 + +.4 tya + bne .5 + txa + beq .8 + dex + +.5 dey + bra .2 +.8 rts +*-------------------------------------- +S.InsDrv.DrvLen .BS 2 +S.InsDrv.DrvEnd .BS 2 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.DRV +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 69df3806..2bb12b23 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -1,28 +1,20 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 *-------------------------------------- -* S.ExpandPStr -* In: -* PULLW = PSTR to String to Expand (PSTRING) -* Out: -* A = hMem to Expanded String (PSTRING) -*-------------------------------------- * S.ExpandPStrA * In: * A = hMem of String to Expand (PSTRING) * Out: * A = hMem to Expanded String (PSTRING) *-------------------------------------- -S.ExpandPStr >PULLW R.AX - bra S.ExpandPStr2 S.ExpandPStrA jsr S.GetMemPtrA - >STYA R.AX -S.ExpandPStr2 stz TmpBuffer256 init Expanded String len=0 +S.ExpandPStrYA >STYA R.AX + stz TmpBuffer256 init Expanded String len=0 stz R.BL reset "in var" ldy #0 .1 iny @@ -65,7 +57,7 @@ S.ExpandPStr2 stz TmpBuffer256 init Expanded String len=0 pha Get back ENVNAME hMem >PUSHA ldy #S.PS.hENV - lda (TSKMGR.TSKPTR),y + lda (pPs),y >PUSHA jsr S.GetEnvVarH bcs .5 @@ -98,8 +90,8 @@ S.ExpandPStr2 stz TmpBuffer256 init Expanded String len=0 cmp (R.AX) last char? beq .81 jmp .1 -.81 >PUSHWI TmpBuffer256 - jsr S.NewPStr +.81 >LDYAI TmpBuffer256 + jsr S.NewPStrYA rts *-------------------------------------- * S.CreateEnv @@ -118,7 +110,7 @@ S.CreateEnv >PUSHWI K.ENV.SIZE get a buffer for ENV clc .9 rts *-------------------------------------- -* S.DupEnvA2 +* S.DupEnvA * In: * A = ENV hMem To Duplicate * Out: @@ -128,8 +120,7 @@ S.DupEnvA pha jsr S.GetMemPtrA >STYA ZPQuickPtr1 pla - jsr S.GetMemLenA - >PUSHYA + >PUSHWI K.ENV.SIZE >PUSHBI 0 jsr S.GetMem bcs .9 @@ -401,6 +392,24 @@ S.SelectEnv .9 sec rts *-------------------------------------- +S.PrintSysEnv ldy #S.PS.hENV + lda TskMgr.Table,y Get PS #0 ENV + jsr S.GetMemPtrA + >STYA R.AX +.1 lda (R.AX) + beq .8 Ending 0 ? + >LDYA R.AX + jsr S.SysScrPPSTRYA + jsr S.SysScrCROUT + lda R.AL + sec + adc (R.AX) Add len+1 to PTR + sta R.AL + bcc .1 + inc R.AH + bra .1 +.8 rts +*-------------------------------------- MAN SAVE SYS/KERNEL.S.ENV LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.EVT.txt b/SYS/KERNEL.S.EVT.txt index abde36ad..d8bdfd3a 100644 --- a/SYS/KERNEL.S.EVT.txt +++ b/SYS/KERNEL.S.EVT.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -17,17 +17,18 @@ S.EvtMgrInit stz EVTMGR.PENDING * OUT : * CS = no event, A = ERROR * CC * event in YA -* (EVTMGR.EVTPTR) +* (pEvent) *-------------------------------------- S.GetEvent lda EVTMGR.PENDING Get Pending EVENT hMem if any beq .1 jsr S.GetMemPtrA - >STYA EVTMGR.EVTPTR + >STYA pEvent clc rts + .1 jsr S.CreateEvent bcs .9 - stx EVTMGR.PENDING + jsr S.GetSysEvent bcc .9 got SYS event jsr S.GetDevEvent @@ -39,12 +40,12 @@ S.GetEvent lda EVTMGR.PENDING Get Pending EVENT hMem if any *-------------------------------------- S.GetSysEvent lda VBL get VLINE status eor EVTMGR.VBLSTATE - bpl .2 no change + bpl .9 no change sta EVTMGR.VBLSTATE save new dec EVTMGR.FRAMECNT - bne .2 + bne .9 lda #K.TIMER16RESOLUTION sta EVTMGR.FRAMECNT @@ -53,97 +54,26 @@ S.GetSysEvent lda VBL get VLINE status inc A2osX.TIMER16+1 .1 lda #S.EVT.F.TIMER - sta (EVTMGR.EVTPTR) - clc - rts -.2 lda KBD - bpl .9 - and #$7F - sta KBDSTROBE - ldy #S.EVT.DATA - sta (EVTMGR.EVTPTR),y - iny - lda OPENAPPLE - asl - lda SOLIDAPPLE - ror - and #$C0 - sta (EVTMGR.EVTPTR),y - lda #S.EVT.F.KEY - sta (EVTMGR.EVTPTR) - ldy #S.EVT.hDEV - lda #1 Source dev = KBD - sta (EVTMGR.EVTPTR),y - clc +.8 sta (pEvent) + clc rts -.9 inc A2osX.RANDOM16 - bne .99 - inc A2osX.RANDOM16+1 -.99 lda #0 error code=0 +.9 lda #0 error code=0 sec no event rts *-------------------------------------- -S.GetDevEvent >LDYAI DEVMGR.TABLE - >STYA DEVMGR.DEVPTR - ldx #K.DEV.MAX -.1 lda (DEVMGR.DEVPTR) get S.DEV.F - bpl .3 empty ? - and #S.DEV.F.EVENT - beq .3 EVENT enabled ? - ldy #S.DEV.ID - lda (DEVMGR.DEVPTR),y - ldy #S.EVT.hDEV - sta (EVTMGR.EVTPTR),y - ldy #S.DEV.hCS - lda (DEVMGR.DEVPTR),y - jsr S.GetMemPtrA - >STYA Kernel.JMP - - phx - >PUSHW EVTMGR.EVTPTR - ldx #DEVMGR.GETEVENT - - jsr Kernel.DRVCALL Call DRV GetEvent function - - plx - bcc .9 Got An Event - -.3 lda DEVMGR.DEVPTR - clc - adc #S.DEV.SIZE - sta DEVMGR.DEVPTR - bcc .4 - inc DEVMGR.DEVPTR+1 -.4 dex - bne .1 - lda #0 error code=0 - sec no event -.9 rts -*-------------------------------------- * S.CreateEvent * OUT : * X = hMem * Y,A = PTR to EVENT *-------------------------------------- S.CreateEvent >PUSHWI S.EVT.SIZE - >PUSHBI 0 + >PUSHBI S.MEM.F.INIT0 jsr S.GetMem bcs .9 - >STYA EVTMGR.EVTPTR - lda #0 - ldy #S.EVT.SIZE-1 -.1 sta (EVTMGR.EVTPTR),y - dey - bpl .1 - clc -.9 rts -*-------------------------------------- -S.DestroyEvent lda EVTMGR.PENDING - beq .9 - jsr S.DestroyEventA - stz EVTMGR.PENDING + >STYA pEvent + stx EVTMGR.PENDING .9 rts *-------------------------------------- * S.DestroyEvent @@ -151,24 +81,29 @@ S.DestroyEvent lda EVTMGR.PENDING * A = Event hMem * OUT : *-------------------------------------- -S.DestroyEventA pha - jsr S.GetMemPtrA - >STYA EVTMGR.EVTPTR - lda (EVTMGR.EVTPTR) +S.DestroyEvent lda EVTMGR.PENDING + beq .9 + + lda (pEvent) and #S.EVT.F.hMEM1 beq .1 + ldy #S.EVT.DATALO - lda (EVTMGR.EVTPTR),y + lda (pEvent),y jsr S.FreeMemA -.1 lda (EVTMGR.EVTPTR) + +.1 lda (pEvent) and #S.EVT.F.hMEM2 beq .2 + ldy #S.EVT.DATAHI - lda (EVTMGR.EVTPTR),y + lda (pEvent),y jsr S.FreeMemA -.2 pla + +.2 lda EVTMGR.PENDING jsr S.FreeMemA - rts + stz EVTMGR.PENDING +.9 rts *-------------------------------------- EVTMGR.VBLSTATE .BS 1 EVTMGR.FRAMECNT .BS 1 diff --git a/SYS/KERNEL.S.FS.txt b/SYS/KERNEL.S.FS.txt index 95a9a989..fefa0e65 100644 --- a/SYS/KERNEL.S.FS.txt +++ b/SYS/KERNEL.S.FS.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -9,7 +9,7 @@ AUTO 6 * PUBLIC *-------------------------------------- S.CheckPrefixA jsr S.GetMemPtrA -S.CheckPrefix >STYA MLICALL.PARAMS+1 +S.CheckPrefixYA >STYA MLICALL.PARAMS+1 >STYA ZPQuickPtr1 lda (ZPQuickPtr1) beq .98 @@ -20,7 +20,7 @@ S.CheckPrefix >STYA MLICALL.PARAMS+1 bne .98 cpx #1 "/" allowed for listing online volumes beq .8 - >KMLICALL MLIGETFILEINFO + >MLICALL MLIGETFILEINFO bcs .98 No, invalid path... lda MLICALL.PARAMS+4 Check file type cmp #$0F Directory? @@ -46,37 +46,46 @@ S.FileSearch >PULLA Get Search path pla sec rts + .10 sta R.BL Store Expanded path list to search >PULLB R.AH Store Filename lda #1 sta R.BH Start At Token 1 + .1 >PUSHB R.BL push expanded path list >PUSHBI $3B Push SEP=';' >PUSHB R.BH Push Token IDX jsr S.PStrGetTkn Get R.BL token in A bcs .98 + sta R.CL Store Token path >PUSHB R.AH push filename >PUSHB R.CL Push Token path jsr S.PStrCat bcs .97 + sta R.CH Store Full path (Token Path+filename) jsr S.MLIGetFileInfoA bcc .8 + lda R.CH Discard this Full Path jsr S.FreeMemA lda R.CL Discard Token path jsr S.FreeMemA inc R.BH Try next Token bne .1 + beq .98 go to discard Expanded path list + .97 lda R.CL Discard Token path jsr S.FreeMemA + .98 lda R.BL Discard Expanded Path list jsr S.FreeMemA lda #SYSMGR.ERRFNF sec rts + .8 jsr .97 Dicard all except Full Path lda R.CH clc @@ -91,20 +100,24 @@ S.FileSearch >PULLA Get Search path *-------------------------------------- S.LoadFileA jsr S.MLIOpenA bcs .99 + sta R.AL save ref_num stx R.AH save Prodos Buffer for freemem jsr S.MLIGetEOFA bcs .98 + phx Larger than 64k? plx beq .1 File too big!!!! lda #SYSMGR.ERRFTB bra .98 + .1 >STYA R.BX save Length >PUSHYA Push Length for S.GetMem >PUSHBI 0 jsr S.GetMem bcs .98 + >STYA R.CX stx R.DL save Segment hMem >PUSHW R.BX Push Length for S.ReadFile @@ -112,24 +125,29 @@ S.LoadFileA jsr S.MLIOpenA >PUSHB R.AL Push ref_num jsr S.MLIRead bcs .97 + lda R.AL jsr S.MLICloseA + lda R.AH jsr S.FreeMemA Discard ProDOS IO Buffer >LDYA R.BX Return File Length... ldx R.DL ...and hMem to Caller clc rts + .97 pha lda R.DL jsr S.FreeMemA freemem because of failed load pla + .98 pha lda R.AL jsr S.MLICloseA lda R.AH jsr S.FreeMemA ProDOS IO Buffer pla + .99 sec rts *-------------------------------------- @@ -143,7 +161,7 @@ S.ListDirInitA sta R.AL stz TmpFileName Reset File.Pattern jsr S.GetMemPtrA >STYA R.BX Store path - jsr S.CheckPrefix is it a existing directory? + jsr S.CheckPrefixYA is it a existing directory? bcc .4 yes, continue with empty pattern lda (R.BX) no, get pattern at end of full path @@ -174,13 +192,11 @@ S.ListDirInitA sta R.AL sta (R.BX) remove pattern from path .4 >PUSHWI S.LISTDIR.SIZE get LISTDIR Struct - >PUSHBI 0 + >PUSHBI S.MEM.F.INIT0 reset all bytes jsr S.GetMem bcs .99 stx R.AH >STYA R.CX Store LISTDIR Struct - txa - jsr S.ClrMemA reset all bytes ldy TmpFileName beq .5 @@ -233,8 +249,10 @@ S.ListDirInitAV >PUSHWI 256 jsr S.MLIOnline bcs .98 ldy #S.LISTDIR.ONLINEPTR - lda #0 make index point first Entry - sta (R.CX),y + +* lda #0 make index point first Entry +* sta (R.CX),y + clc rts .98 lda (R.CX) @@ -242,10 +260,12 @@ S.ListDirInitAV >PUSHWI 256 .99 sec rts *-------------------------------------- -S.ListDirInitAD lda #0 - sta (R.CX) reset hONLINE +S.ListDirInitAD +* lda #0 +* sta (R.CX) reset hONLINE + >LDYA R.BX Open DIR - jsr S.MLIOpen + jsr S.MLIOpenYA bcs .99 ldy #S.LISTDIR.REFNUM sta (R.CX),y save ref_num @@ -284,10 +304,11 @@ S.ListDirInitAD lda #0 ldy #S.LISTDIR.FC+1 sta (R.CX),y - ldy #S.LISTDIR.FI - sta (R.CX),y - iny - sta (R.CX),y set FI to $0000 +* ldy #S.LISTDIR.FI +* lda #0 +* sta (R.CX),y +* iny +* sta (R.CX),y set FI to $0000 clc .99 rts *-------------------------------------- @@ -393,7 +414,7 @@ S.ListDirNextAD stz R.DL Reset Return Record hMem lda (R.AX) Is is a deleted file ? (storage_type=0) and #$F0 - beq .40 + beq .5 cmp #$F0 Volume header ? beq .30 yes, do not filter @@ -403,8 +424,9 @@ S.ListDirNextAD stz R.DL Reset Return Record hMem ldy #S.LISTDIR.hPATTERN any filter ? lda (R.CX),y beq .30 + jsr S.GetMemPtrA - >PUSHYA push Filter hMem + >PUSHYA push Filter PTR lda (R.AX) and #$0F @@ -415,9 +437,9 @@ S.ListDirNextAD stz R.DL Reset Return Record hMem dey bne .31 - >PUSHWI TmpFileName push Filename + >PUSHWI TmpFileName push Filename PTR jsr S.PStrMatchP - bcs .40 no match + bcs .5 no match .30 ldy #S.LISTDIR.EL Get Entry length lda (R.CX),y @@ -439,23 +461,23 @@ S.ListDirNextAD stz R.DL Reset Return Record hMem dey bpl .4 -.40 ldy #S.LISTDIR.EIB Set ENTRY INDEX IN BLOCK +=1 +.5 ldy #S.LISTDIR.EIB Set ENTRY INDEX IN BLOCK +=1 lda (R.CX),y inc sta (R.CX),y + ldy #S.LISTDIR.EL Set BLOCK PTR +=entry_length lda (R.CX),y ldy #S.LISTDIR.BLKPTR clc adc (R.CX),y sta (R.CX),y - bcc .5 iny lda (R.CX),y - inc + adc #0 sta (R.CX),y -.5 lda (R.AX) + lda (R.AX) and #$E0 is storage_type = $F or $E ? cmp #$E0 yes, do NOT increase FI bne .6 @@ -503,7 +525,8 @@ S.ListDirCloseA pha beq .3 jsr S.FreeMemA -.3 lda (ZPQuickPtr1) Online buffer +.3 ldy #S.LISTDIR.hONLINE + lda (ZPQuickPtr1),y beq .4 jsr S.FreeMemA @@ -535,7 +558,7 @@ S.ListDirReadBlock >STYA MLICALL.PARAMS+2 >LDYAI 512 >STYA MLICALL.PARAMS+4 - >KMLICALL MLIREAD + >MLICALL MLIREAD bcs .9 ldy #S.LISTDIR.BLKPTR set BLKPTR to $0004 lda #4 diff --git a/SYS/KERNEL.S.LIB.txt b/SYS/KERNEL.S.LIB.txt new file mode 100644 index 00000000..0af123d5 --- /dev/null +++ b/SYS/KERNEL.S.LIB.txt @@ -0,0 +1,115 @@ +PR#3 +PREFIX /A2OSX.SRC +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.LoadLibYA +* in : +* Y,A = PTR To Lib Name +* 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 >PUSHA push libname for S.FileSearch + >LDYAI MSG.LOADLIB + jsr S.SysScrPPSTRYA + >PUSHWI ENV.LIB push ENVNAME=LIB + ldy #S.PS.hENV + lda (pPs),y + >PUSHA + jsr S.GetEnvVarP get value for ENV=LIB + bcs .99 + pha save hMem to LIB VALUE + >PUSHA Push %LIB% VALUE + jsr S.FileSearch find libname in %LIB% + bcs .98 + pha save hMem to LIB full path + jsr S.SysScrPPSTRA + pla + pha + jsr S.LoadBinA A = hMem of filename full path + bcs .97 + phx + >STYA pLib + + ldx #LIBMGR.LOAD + jsr pLibJmp Call LIB.LOAD function + + bcs .97 + + plx + pla discard LIB PATH + jsr S.FreeMemA + pla discard LIB VALUE + jsr S.FreeMemA + txa + clc + rts + +.97 pla discard LIB PATH + jsr S.FreeMemA +.98 pla discard LIB VALUE + jsr S.FreeMemA + sec +.99 rts +*-------------------------------------- +* S.UnloadLibA +* in : +* A = hMem To Lib +* out : +*-------------------------------------- +S.UnloadLibA pha + jsr S.GetMemByIDA + >STYA ZPQuickPtr1 + ldy #S.MEM.REFCNT + lda (ZPQuickPtr1),y Get count of those referencing this lib + dec only one left ? + beq .1 + sta (ZPQuickPtr1),y + pla + clc + rts + +.1 ldy #S.MEM.PTR + lda (ZPQuickPtr1),y + pha + iny + lda (ZPQuickPtr1),y + ply + >STYA pLib + + ldx #LIBMGR.UNLOAD + jsr pLibJmp Call LIB.UNLOAD function + pla + jmp S.FreeMemA +*-------------------------------------- +MSG.LOADLIB >PSTRING "\nLoadLib:" +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.LIB +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index a00abda0..b3d7201d 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -9,48 +9,46 @@ AUTO 6 * !!!!!!!! DO NOT USE VCPU16 !!!!!!!! * !!!!!! DO NOT USE ZPQuickPTRs !!!!! *-------------------------------------- -ZPMemMgrReqS .EQ ZPMemMgr store requested Size -ZPMemMgrReqF .EQ ZPMemMgr+2 store requested Flags -ZPMemMgrSPtr .EQ ZPMemMgr+6 Pointer To Slot selected -ZPMemMgrTmp1 .EQ ZPMemMgr+8 -ZPMemMgrTmp2 .EQ ZPMemMgr+10 -ZPMemMgrTmp3 .EQ ZPMemMgr+12 +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 in SLOT #0 -* (eh, mem.ID=0 always used! useful to test if hMem=0) +* - Create a 256 bytes table * mapping hMem's to real memory blocks to help * Garbage collector move blocks +* - mem.ID=0 always used! useful to test if hMem=0 *-------------------------------------- -S.MemMgrInit stz MEMMGR.MHLIMIT - stz MEMMGR.HIMEM +S.MemMgrInit >LDYAI MemMgr.MHiMem + >STYA MemMgr.HiMem + >STYA MemMgr.Free - ldx /MLI - dex Reserve $BE00 For Global Page - stx MEMMGR.MHLIMIT+1 - stx MEMMGR.HIMEM+1 + >LDYAI MemMgr.MLoMem + >STYA MemMgr.LoMem - >LDYAI A2osX.LOMEM - >STYA MEMMGR.MLLIMIT - >STYA MEMMGR.LOMEM - stz MEMMGR.TABLESIZE Init Table Size to 0 -* jsr S.UpdateMemStats Not needed, will be called by S.GetMem - >PUSHWI 256 get a 256 bytes buffer for Map Table, hMem=0 - >PUSHBI 0 - jsr S.GetMem create it... + stz MemMgr.LastSlot Reserve Slot #0 + + sta SETREADAUX + sta SETWRITEAUX + + >LDYAI MemMgr.XHiMem + >STYA MemMgr.HiMem + >STYA MemMgr.Free + + >LDYAI MemMgr.XLoMem + >STYA MemMgr.LoMem + + stz MemMgr.LastSlot Reserve Slot #0 + + sta CLRREADAUX + sta CLRWRITEAUX + clc rts *-------------------------------------- * PUBLIC *-------------------------------------- -S.SetLowMemLimit - clc - rts -*-------------------------------------- -S.GarbageCollector - clc - rts -*-------------------------------------- * S.GetMem * In: * PULLB = FLAGS @@ -60,58 +58,99 @@ S.GarbageCollector * X = S.MEM.ID * CS on err *-------------------------------------- -S.GetMem >PULLB ZPMemMgrReqF store requested flags - >PULLW ZPMemMgrReqS store requested size - lda ZPMemMgrReqS align REQS to 16 bytes +S.GetMem >PULLB MemMgr.ReqFlags store requested flags + and #S.MEM.F.AUX + beq .11 + + sta SETREADAUX Aux Mem requested,switch to AUX + sta SETWRITEAUX + +.11 >PULLW MemMgr.ReqSize Store requested size + lda MemMgr.ReqSize align REQS to 16 bytes and #$0F beq .10 - lda ZPMemMgrReqS + + lda MemMgr.ReqSize and #$F0 clc adc #$10 - sta ZPMemMgrReqS + sta MemMgr.ReqSize bcc .10 - inc ZPMemMgrReqS+1 -.10 ldx #0 init to SLOT #0 of MEMSLOT list + inc MemMgr.ReqSize+1 + +.10 >LDYAI MemMgr.Table + >STYA ZPMemMgrSPtr + + ldx #0 Current slot=0 - lda MEMMGR.TABLESIZE Check if some free slot to reuse first - beq .6 -.1 txa - jsr S.GetMemByIDA + lda MemMgr.LastSlot Check if some free slot to reuse first + beq .41 + + sta MemMgr.SlotCnt + +.1 inx move to next slot + jsr MemMgr.NextSlot lda (ZPMemMgrSPtr) Get Flags bmi .4 in use ? -.2 lda ZPMemMgrReqF Found an empty slot + +.2 lda MemMgr.ReqFlags Found an empty slot and #S.MEM.F.ALIGN is request needs a page align ? beq .3 + ldy #S.MEM.PTR lda (ZPMemMgrSPtr),y get LO of PTR bne .4 not page-aligned + .3 ldy #S.MEM.LEN lda (ZPMemMgrSPtr),y get LEN of this block - cmp ZPMemMgrReqS compare with requested size + cmp MemMgr.ReqSize compare with requested size bne .4 + iny lda (ZPMemMgrSPtr),y - cmp ZPMemMgrReqS+1 - beq .5 requested size matches slot size !!! -.4 inx move to next slot - cpx MEMMGR.TABLESIZE last slot ? - bne .1 check for another slot - beq .6 last one, create a new slot + cmp MemMgr.ReqSize+1 + beq .7 requested size matches slot size !!! + +.4 dec MemMgr.SlotCnt any other slot to check? + bne .1 last one, create a new slot +*-------------- Create a New SLOT +.41 lda MemMgr.ReqFlags + and #S.MEM.F.ALIGN is request needs a page align ? + beq .6 + + lda MemMgr.Free target PTR will be page aligned ? + sec + sbc MemMgr.ReqSize + beq .6 yes, allocate + + tay no, reserve a free slot to fill gap + lda #0 + jsr MemMgr.AddSlot X = new slot + bcs .9 + +.6 >LDYA MemMgr.ReqSize + jsr MemMgr.AddSlot X = new slot + bcs .9 *-------------- Reuse this SLOT -.5 lda ZPMemMgrReqF get requested flags +.7 lda MemMgr.ReqFlags get requested flags ora #S.MEM.F.INUSE mark as in use sta (ZPMemMgrSPtr) - lda #0 + and #S.MEM.F.INIT0 + beq .8 + + jsr MemMgr.Init0 + +.8 lda #0 ldy #S.MEM.BIN sta (ZPMemMgrSPtr),y - inc Mark this slot used by one task + + inc Mark this slot used by one process ldy #S.MEM.REFCNT sta (ZPMemMgrSPtr),y ldy #S.PS.ID - lda (TSKMGR.TSKPTR),y + lda (pPs),y ldy #S.MEM.OWNERPID sta (ZPMemMgrSPtr),y @@ -122,45 +161,112 @@ S.GetMem >PULLB ZPMemMgrReqF store requested flags lda (ZPMemMgrSPtr),y A = HI PTR ply Y = LO PTR clc X = Current hMem - rts -*-------------- Create a New SLOT -.6 lda ZPMemMgrReqF - and #S.MEM.F.ALIGN is request needs a page align ? - beq .7 - lda MEMMGR.MHLIMIT target PTR will be page aligned ? +.9 bit MemMgr.ReqFlags + bpl .99 + + sta CLRREADAUX + sta CLRWRITEAUX + +.99 rts +*-------------------------------------- +* MemMgr.AddSlot +* In: +* Y,A = Requested size +* Out: +*-------------------------------------- +MemMgr.AddSlot >STYA ZPMemMgrTmp1 save req size + ldx MemMgr.LastSlot + inx + beq .99 > 255 ERR:OUT OF SLOT + + lda MemMgr.Free Compute base PTR=FREE-REQ size sec - sbc ZPMemMgrReqS - beq .7 yes, allocate + sbc ZPMemMgrTmp1 + sta ZPMemMgrTmp2 store new MemMgr.Free in ZPMemMgrTmp2 + lda MemMgr.Free+1 + sbc ZPMemMgrTmp1+1 + sta ZPMemMgrTmp2+1 + + lda ZPMemMgrTmp2 ensure new MemMgr.Free is not lower + sec than LoMem + sbc MemMgr.LoMem + lda ZPMemMgrTmp2+1 + sbc MemMgr.LoMem+1 + bcc .98 ERR out of mem + + jsr MemMgr.NextSlot - tay no, reserve a free slot to fill gap - lda #0 - jsr S.AddSlot - bcs .99 - -.7 >LDYA ZPMemMgrReqS - jsr S.AddSlot - bcs .99 - phx Save hMem - >STYA ZPMemMgrTmp1 - lda ZPMemMgrReqF - ora #S.MEM.F.INUSE - sta (ZPMemMgrSPtr) set Flags - - lda #1 - ldy #S.MEM.REFCNT Mark this slot referenced + ldy #S.MEM.PTR + lda ZPMemMgrTmp2 get new MemMgr.Free + sta MemMgr.Free set as system MemMgr.Free value + sta (ZPMemMgrSPtr),y store is as base address of new slot + iny + lda ZPMemMgrTmp2+1 + sta MemMgr.Free+1 sta (ZPMemMgrSPtr),y - ldy #S.PS.ID - lda (TSKMGR.TSKPTR),y - ldy #S.MEM.OWNERPID + + iny + lda ZPMemMgrTmp1 get requested size + sta (ZPMemMgrSPtr),y setup slot LEN + iny + lda ZPMemMgrTmp1+1 sta (ZPMemMgrSPtr),y - jsr S.UpdateMemStats - >LDYA ZPMemMgrTmp1 Y,A = PTR - plx X = hMem + + stx MemMgr.LastSlot mark this slot allocated clc rts -.99 sec + +.98 lda #MemMgr.ERROOM + sec rts + +.99 lda #MemMgr.ERROOH + sec + rts +*-------------------------------------- +MemMgr.NextSlot lda ZPMemMgrSPtr + clc + adc #S.MEM.SIZE + sta ZPMemMgrSPtr + bcc .8 + inc ZPMemMgrSPtr+1 +.8 rts +*-------------------------------------- +MemMgr.Init0 ldy #S.MEM.PTR + lda (ZPMemMgrSPtr),y ZPMemMgrSPtr already set + sta ZPMemMgrTmp1 set ZPMemMgrTmp1 to Mem Ptr + iny + lda (ZPMemMgrSPtr),y + sta ZPMemMgrTmp1+1 + + ldy #S.MEM.LEN + lda (ZPMemMgrSPtr),y + sta ZPMemMgrTmp2 set ZPMemMgrTmp2 to mem size + iny + lda (ZPMemMgrSPtr),y + sta ZPMemMgrTmp2+1 + + lda #0 + +.1 ldy ZPMemMgrTmp2 + bne .2 + ldy ZPMemMgrTmp2+1 + beq .3 + dec ZPMemMgrTmp2+1 +.2 dec ZPMemMgrTmp2 + + sta (ZPMemMgrTmp1) + inc ZPMemMgrTmp1 + bne .1 + inc ZPMemMgrTmp1+1 + bra .1 + +.3 rts +*-------------------------------------- +MemMgr.SlotCnt .BS 1 +MemMgr.ReqFlags .BS 1 store requested Flags +MemMgr.ReqSize .BS 2 store requested Size *-------------------------------------- * S.FreeMemA * In: @@ -168,12 +274,11 @@ S.GetMem >PULLB ZPMemMgrReqF store requested flags * Out: * X,Y unmodified *-------------------------------------- -S.FreeMemA and #$FF - bne S.FreeMemA0 Slot=0, reserved by Kernel - rts - -S.FreeMemA0 phy +S.FreeMemA phy phx + tax + beq .8 Slot=0, reserved by Kernel + jsr S.GetMemByIDA lda (ZPMemMgrSPtr) bpl * In use ? @@ -182,156 +287,51 @@ S.FreeMemA0 phy lda (ZPMemMgrSPtr),y Get count of those referencing this hMem dec only one left ? sta (ZPMemMgrSPtr),y - bne .82 no, must be a code segment loaded several times + bne .8 no, must be a code segment loaded several times ldy #S.MEM.BIN lda (ZPMemMgrSPtr),y Any BINPATH to discard ? - beq .11 + beq .1 pha save hMem >PUSHW ZPMemMgrSPtr pla jsr S.GetMemByIDA lda (ZPMemMgrSPtr) - bmi .12 In use ? - bra * + bpl * ***MUST BE ALLOCATED*** -.12 lda (ZPMemMgrSPtr) mark record as free - and #$7F + lda #0 mark BINPATH slot as free sta (ZPMemMgrSPtr) >PULLW ZPMemMgrSPtr -.11 lda (ZPMemMgrSPtr) mark record as free - and #$7F +.1 lda #0 mark this slot as free sta (ZPMemMgrSPtr) -.20 lda MEMMGR.TABLESIZE - beq .82 -.21 dec +.2 lda MemMgr.LastSlot + beq .8 + jsr S.GetMemByIDA lda (ZPMemMgrSPtr) - bmi .81 - dec MEMMGR.TABLESIZE discard last record + bmi .8 + ldy #S.MEM.LEN lda (ZPMemMgrSPtr),y give back LEN bytes clc - adc MEMMGR.MHLIMIT to HLIMIT - sta MEMMGR.MHLIMIT + adc MemMgr.Free to MemMgr.Free + sta MemMgr.Free iny lda (ZPMemMgrSPtr),y - adc MEMMGR.MHLIMIT+1 - sta MEMMGR.MHLIMIT+1 - lda MEMMGR.MLLIMIT And give back S.MEM.SIZE - sec - sbc #S.MEM.SIZE - sta MEMMGR.MLLIMIT to LLIMIT - bcs .2 - dec MEMMGR.MLLIMIT+1 -.2 lda MEMMGR.TABLESIZE - bne .21 no slot left, exit -.81 jsr S.UpdateMemStats -.82 plx + adc MemMgr.Free+1 + sta MemMgr.Free+1 + + dec MemMgr.LastSlot discard last slot + bne .2 no slot left, exit + +.8 plx ply clc rts *-------------------------------------- -* IN/OUT -* A = hMem -*-------------------------------------- -S.ClrMemA pha - jsr S.GetMemByIDA - ldy #S.MEM.LEN ZPMemMgrSPtr already set by S.GetMemByIDA - lda (ZPMemMgrSPtr),y - sta ZPMemMgrReqS set ZPMemMgrReqS to mem size - iny - lda (ZPMemMgrSPtr),y - sta ZPMemMgrReqS+1 - ldy #S.MEM.PTR - lda (ZPMemMgrSPtr),y - tax - iny - lda (ZPMemMgrSPtr),y - stx ZPMemMgrSPtr - sta ZPMemMgrSPtr+1 set ZPMemMgrSPtr to Mem - lda #0 -.1 ldx ZPMemMgrReqS - bne .2 - ldx ZPMemMgrReqS+1 - beq .3 - dec ZPMemMgrReqS+1 -.2 dec ZPMemMgrReqS - sta (ZPMemMgrSPtr) - inc ZPMemMgrSPtr - bne .1 - inc ZPMemMgrSPtr+1 - bra .1 -.3 pla - rts -*-------------------------------------- -* S.GetMemByIDA -* In: -* A = hMem -* Out: -* Y,A = ZPMemMgrSPtr = PTR to S.MEM -* X unmodified -*-------------------------------------- -S.GetMemByIDA stz ZPMemMgrSPtr+1 - asl - rol ZPMemMgrSPtr+1 - asl - rol ZPMemMgrSPtr+1 - asl - rol ZPMemMgrSPtr+1 - clc - adc MEMMGR.LOMEM - sta ZPMemMgrSPtr - tay - lda ZPMemMgrSPtr+1 - adc MEMMGR.LOMEM+1 - sta ZPMemMgrSPtr+1 - rts -*-------------------------------------- -* In: -* A = hMem to BINPATH (PSTR) -* Out: -* Y,A = ZPMemMgrSPtr = PTR to S.MEM -* X = hMem -*-------------------------------------- -S.GetMemByNameA jsr S.GetMemPtrA - >STYA ZPMemMgrTmp1 save BINPATH - >LDYA MEMMGR.LOMEM - >STYA ZPMemMgrTmp2 - ldx #0 -.1 lda (ZPMemMgrTmp2) - bpl .6 In Use? - ldy #S.MEM.BIN any BIN PATH in this slot? - lda (ZPMemMgrTmp2),y - beq .6 - jsr S.GetMemPtrA get pathname - >STYA ZPMemMgrTmp3 - ldy #0 -.2 lda (ZPMemMgrTmp1),y - cmp (ZPMemMgrTmp3),y - bne .6 - tya - iny - cmp (ZPMemMgrTmp1) - bne .2 - >LDYA ZPMemMgrTmp2 - clc - rts -.6 lda ZPMemMgrTmp2 - clc - adc #S.MEM.SIZE - sta ZPMemMgrTmp2 - bcc .7 - inc ZPMemMgrTmp2+1 -.7 inx - cpx MEMMGR.TABLESIZE - bne .1 - sec - rts -*-------------------------------------- * S.GetMemPtrA * In: * A = hMem @@ -348,110 +348,90 @@ S.GetMemPtrA jsr S.GetMemByIDA ply rts *-------------------------------------- -* S.GetMemLenA +* S.GetMemByIDA * In: * A = hMem * Out: -* Y,A = PTR to MemLength +* Y,A = ZPMemMgrSPtr = PTR to S.MEM * X unmodified *-------------------------------------- -S.GetMemLenA jsr S.GetMemByIDA - ldy #S.MEM.LEN - lda (ZPMemMgrSPtr),y - pha - iny - lda (ZPMemMgrSPtr),y - ply +S.GetMemByIDA stz ZPMemMgrSPtr+1 + + asl + rol ZPMemMgrSPtr+1 + asl + rol ZPMemMgrSPtr+1 + asl + rol ZPMemMgrSPtr+1 + + clc + adc #MemMgr.Table + sta ZPMemMgrSPtr + tay + lda ZPMemMgrSPtr+1 + adc /MemMgr.Table + sta ZPMemMgrSPtr+1 rts *-------------------------------------- -* PRIVATE +* In: +* A = hMem to BINPATH (PSTR) +* Out: +* Y,A = ZPMemMgrSPtr = PTR to S.MEM +* X = hMem *-------------------------------------- -* S.AddSlot -* In: -* Y,A = Requested size -* Out: -* Y,A = PTR to MemSlot -* X = SLOT.ID -*-------------------------------------- -S.AddSlot >STYA ZPMemMgrTmp1 save req size - lda MEMMGR.TABLESIZE - inc - beq .99 > 255 ERR:OUT OF SLOT - dec - jsr S.GetMemByIDA yes, get PTR to slot - - lda MEMMGR.MHLIMIT Compute base PTR=HLIMIT-REQ size - sec - sbc ZPMemMgrTmp1 - sta ZPMemMgrTmp2 store new HLIMIT in ZPMemMgrTmp2 - lda MEMMGR.MHLIMIT+1 - sbc ZPMemMgrTmp1+1 - sta ZPMemMgrTmp2+1 - - lda MEMMGR.MLLIMIT compute new LLIMIT +S.GetMemByNameA jsr S.GetMemPtrA +S.GetMemByNameYA + >STYA ZPMemMgrTmp1 save BINPATH + >LDYAI MemMgr.Table+S.MEM.SIZE + >STYA ZPMemMgrSPtr + ldx #0 + +.1 cpx MemMgr.LastSlot + beq .9 + inx + lda (ZPMemMgrSPtr) + bpl .6 In Use? + + ldy #S.MEM.BIN any BIN PATH in this slot? + lda (ZPMemMgrSPtr),y + beq .6 + + jsr S.GetMemPtrA get pathname + >STYA ZPMemMgrTmp2 + + ldy #0 + +.2 lda (ZPMemMgrTmp1),y + cmp (ZPMemMgrTmp2),y + bne .6 + + tya + iny + cmp (ZPMemMgrTmp1) + bne .2 + + >LDYA ZPMemMgrSPtr + clc + rts + +.6 lda ZPMemMgrSPtr clc adc #S.MEM.SIZE - sta ZPMemMgrTmp3 store new LLIMIT in ZPMemMgrTmp3 - lda MEMMGR.MLLIMIT+1 - adc #0 - sta ZPMemMgrTmp3+1 - - lda ZPMemMgrTmp2 ensure new LLIMIT is not higher - sec than new HLIMIT - sbc ZPMemMgrTmp3 - lda ZPMemMgrTmp2+1 - sbc ZPMemMgrTmp3+1 - bcc .98 ERR out of mem - - >LDYA ZPMemMgrTmp3 get new LLIMIT - >STYA MEMMGR.MLLIMIT And set it allocated - - lda #0 - sta (ZPMemMgrSPtr) - ldy #S.MEM.BIN - sta (ZPMemMgrSPtr),y - ldy #S.MEM.REFCNT - sta (ZPMemMgrSPtr),y - ldy #S.MEM.OWNERPID - sta (ZPMemMgrSPtr),y - - ldy #S.MEM.PTR - lda ZPMemMgrTmp2 get new HLIMIT - sta MEMMGR.MHLIMIT set as system HLIMIT value - sta (ZPMemMgrSPtr),y store is as base address of new slot - iny - lda ZPMemMgrTmp2+1 - sta MEMMGR.MHLIMIT+1 - sta (ZPMemMgrSPtr),y - - ldy #S.MEM.LEN - lda ZPMemMgrTmp1 get requested size - sta (ZPMemMgrSPtr),y setup slot LEN - iny - lda ZPMemMgrTmp1+1 - sta (ZPMemMgrSPtr),y - - >LDYA ZPMemMgrTmp2 Y,A = PTR - ldx MEMMGR.TABLESIZE X = SLOT.ID - inc MEMMGR.TABLESIZE mark this slot allocated + sta ZPMemMgrSPtr + bcc .1 + inc ZPMemMgrSPtr+1 + bra .1 + +.9 sec + rts +*-------------------------------------- +S.SetLoMem clc rts -.98 lda #MEMMGR.ERROOM - sec - rts -.99 lda #MEMMGR.ERROOS - sec - rts *-------------------------------------- -S.UpdateMemStats - lda MEMMGR.MHLIMIT - sec - sbc MEMMGR.MLLIMIT - sta MEMMGR.MFREE - lda MEMMGR.MHLIMIT+1 - sbc MEMMGR.MLLIMIT+1 - sta MEMMGR.MFREE+1 - rts +S.GarbageCollector + clc + rts *-------------------------------------- MAN SAVE SYS/KERNEL.S.MEM diff --git a/SYS/KERNEL.S.MLI.txt b/SYS/KERNEL.S.MLI.txt index 08654481..11986cb5 100644 --- a/SYS/KERNEL.S.MLI.txt +++ b/SYS/KERNEL.S.MLI.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -8,9 +8,33 @@ AUTO 6 *-------------------------------------- * PUBLIC *-------------------------------------- -S.MLICreate -S.MLIDestroy -S.MLIRename +S.MLICreateFile + clc + rts +*-------------------------------------- +S.MLICreateDirA jsr S.GetMemPtrA +S.MLICreateDirYA + >STYA MLICALL.PARAMS+1 + lda #$C3 + sta MLICALL.PARAMS+3 Access + lda #$0F + sta MLICALL.PARAMS+4 type=Directory + lda #$0D + sta MLICALL.PARAMS+7 Storage=Linked List + + >MLICALL MLICREATE + rts +*-------------------------------------- +S.MLIDestroyA jsr S.GetMemPtrA +S.MLIDestroyYA >STYA MLICALL.PARAMS+1 + >MLICALL MLIDESTROY + rts +*-------------------------------------- +S.MLIRename >PULLW MLICALL.PARAMS+3 + >PULLW MLICALL.PARAMS+1 + >MLICALL MLIRENAME + rts +*-------------------------------------- S.MLISetFileInfo *-------------------------------------- * S.MLIGetFileInfoA @@ -21,9 +45,9 @@ S.MLISetFileInfo *-------------------------------------- S.MLIGetFileInfoA jsr S.GetMemPtrA -S.MLIGetFileInfo +S.MLIGetFileInfoYA >STYA MLICALL.PARAMS+1 - >KMLICALL MLIGETFILEINFO + >MLICALL MLIGETFILEINFO bcs .9 >LDYAI MLICALL.PARAMS+3 .9 rts @@ -35,14 +59,19 @@ S.MLIGetFileInfo *-------------------------------------- S.MLIOnline >PULLB MLICALL.PARAMS+1 >PULLW MLICALL.PARAMS+2 - >KMLICALL MLIONLINE + >MLICALL MLIONLINE rts *-------------------------------------- -S.MLISetPrefix +S.MLISetPrefixA jsr S.GetMemPtrA +S.MLISetPrefixYA + >STYA MLICALL.PARAMS+1 + >MLICALL MLISETPREFIX + rts *-------------------------------------- S.MLIGetPrefixA jsr S.GetMemPtrA -S.MLIGetPrefix >STYA MLICALL.PARAMS+1 - >KMLICALL MLIGETPREFIX +S.MLIGetPrefixYA + >STYA MLICALL.PARAMS+1 + >MLICALL MLIGETPREFIX rts *-------------------------------------- * S.MLIOpenA @@ -53,18 +82,20 @@ S.MLIGetPrefix >STYA MLICALL.PARAMS+1 * X = buf hMem *-------------------------------------- S.MLIOpenA jsr S.GetMemPtrA -S.MLIOpen >STYA MLICALL.PARAMS+1 +S.MLIOpenYA >STYA MLICALL.PARAMS+1 >PUSHWI 1024 get a ProDOS IO buffer - >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOV + >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE jsr S.GetMem bcs .99 + phx save Prodos Buffer hMem >STYA MLICALL.PARAMS+3 - >KMLICALL MLIOPEN + >MLICALL MLIOPEN bcs .98 lda MLICALL.PARAMS+5 get ref_num plx get back Prodos Buffer hMem rts CC + .98 plx get back Prodos Buffer hMem pha save MLI error txa @@ -82,7 +113,7 @@ S.MLIOpen >STYA MLICALL.PARAMS+1 S.MLINewLine >PULLB MLICALL.PARAMS+1 >PULLB MLICALL.PARAMS+2 >PULLB MLICALL.PARAMS+3 - >KMLICALL MLINEWLINE + >MLICALL MLINEWLINE rts *-------------------------------------- * S.MLIRead @@ -96,7 +127,7 @@ S.MLINewLine >PULLB MLICALL.PARAMS+1 S.MLIRead >PULLB MLICALL.PARAMS+1 >PULLW MLICALL.PARAMS+2 >PULLW MLICALL.PARAMS+4 - >KMLICALL MLIREAD + >MLICALL MLIREAD bcs .9 >LDYA MLICALL.PARAMS+6 .9 rts @@ -112,23 +143,40 @@ S.MLIRead >PULLB MLICALL.PARAMS+1 S.MLIWrite >PULLB MLICALL.PARAMS+1 >PULLW MLICALL.PARAMS+2 >PULLW MLICALL.PARAMS+4 - >KMLICALL MLIWRITE + >MLICALL MLIWRITE bcs .9 >LDYA MLICALL.PARAMS+6 .9 rts *-------------------------------------- -* S.MLIClose +* S.MLICloseA * in : * A = ref_num * out : *-------------------------------------- S.MLICloseA sta MLICALL.PARAMS+1 - >KMLICALL MLICLOSE + >MLICALL MLICLOSE + rts +*-------------------------------------- +S.MLIFlushA sta MLICALL.PARAMS+1 + >MLICALL MLIFLUSH rts *-------------------------------------- -S.MLIFlushA S.MLISetMark -S.MLIGetMark +*-------------------------------------- +* S.MLIGetMarkA +* in : +* A = ref_num +* out : +* Y,A,X = EOF +*-------------------------------------- +S.MLIGetMarkA sta MLICALL.PARAMS+1 + >MLICALL MLIGETMARK + bcs .9 + >LDYA MLICALL.PARAMS+2 + ldx MLICALL.PARAMS+4 + clc +.9 rts +*-------------------------------------- S.MLISetEOF *-------------------------------------- * S.MLIGetEOF @@ -138,13 +186,38 @@ S.MLISetEOF * Y,A,X = EOF *-------------------------------------- S.MLIGetEOFA sta MLICALL.PARAMS+1 - >KMLICALL MLIGETEOF + >MLICALL MLIGETEOF bcs .9 >LDYA MLICALL.PARAMS+2 ldx MLICALL.PARAMS+4 clc .9 rts *-------------------------------------- +S.MLISetBuf clc + rts +*-------------------------------------- +S.MLIGetBuf clc + rts +*-------------------------------------- +S.MLIGetTime >MLICALL MLIGETTIME + rts +*-------------------------------------- +S.MLIAllocIRQ >PULLB MLICALL.PARAMS+1 + >PULLW MLICALL.PARAMS+2 + >MLICALL MLIALLOCIRQ + rts +*-------------------------------------- +S.MLIDeallocIRQA + sta MLICALL.PARAMS+1 + >MLICALL MLIDEALLOCIRQ + rts +*-------------------------------------- +S.MLIReadBlock clc + rts +*-------------------------------------- +S.MLIWriteBlock clc + rts +*-------------------------------------- MAN SAVE SYS/KERNEL.S.MLI LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.NET.txt b/SYS/KERNEL.S.NET.txt index 1b86fc69..9aa893b0 100644 --- a/SYS/KERNEL.S.NET.txt +++ b/SYS/KERNEL.S.NET.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/SYS/KERNEL.S.RDR.txt b/SYS/KERNEL.S.RDR.txt index 6718f3f8..8a5307e0 100644 --- a/SYS/KERNEL.S.RDR.txt +++ b/SYS/KERNEL.S.RDR.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 diff --git a/SYS/KERNEL.S.SCR.txt b/SYS/KERNEL.S.SCR.txt index 19593730..a0b9aa6d 100644 --- a/SYS/KERNEL.S.SCR.txt +++ b/SYS/KERNEL.S.SCR.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -68,8 +68,8 @@ S.ScreenSelectA and A2osX.SCREENS Screen is available ? bne .2 sta SETTEXT sta SET80DISP + sta CLR80STORE sta CLRPAGE2 - sta SET80STORE sta SETALTCHAR lda #A2osX.SCREENS.C bra .8 @@ -80,19 +80,22 @@ S.ScreenSelectA and A2osX.SCREENS Screen is available ? sta CLRTEXT sta CLRMIXED sta SETHIRES + sta CLR80STORE sta CLRPAGE2 - - sta SET80DISP sta SETIOUDIS sta SETDHIRES - sta CLRDHIRES - sta SETDHIRES - sta CLRDHIRES - sta SETDHIRES + +* sta CLR80DISP +* sta SETDHIRES +* sta CLRDHIRES +* sta SET80DISP +* sta SETDHIRES +* sta CLRDHIRES +* sta SETDHIRES lda #A2osX.SCREENS.G -.8 sta A2osX.ACTIVESCRN +.8 sta A2osX.ASCREEN .9 rts *-------------------------------------- S.SysScrCPULoad ldx SYSSCR.CPULOADI @@ -134,8 +137,38 @@ S.SysScrPRCode php save P to keep carry plp rts *-------------------------------------- +S.DumpEvent lda (pEvent) + jsr S.SysScrPRBYTEA + ldy #S.EVT.hDEV + lda (pEvent),y + jsr S.SysScrPRBYTEA + ldy #S.EVT.DATALO + lda (pEvent),y + jsr S.SysScrPRBYTEA + ldy #S.EVT.DATAHI + lda (pEvent),y + jsr S.SysScrPRBYTEA + + lda #'.' + jsr S.SysScrCOUTA + ldy #S.EVT.DATAW1 + lda (pEvent),y + jsr S.SysScrPRBYTEA + iny + lda (pEvent),y + jsr S.SysScrPRBYTEA + + lda #'.' + jsr S.SysScrCOUTA + ldy #S.EVT.DATAW2 + lda (pEvent),y + jsr S.SysScrPRBYTEA + iny + lda (pEvent),y + jmp S.SysScrPRBYTEA +*-------------------------------------- S.SysScrPPSTRA jsr S.GetMemPtrA -S.SysScrPPSTR >STYA SYSSCR.STRPTR +S.SysScrPPSTRYA >STYA SYSSCR.STRPTR lda (SYSSCR.STRPTR) beq .9 ldy #0 @@ -319,7 +352,7 @@ S.SysScrSetCharAtYX SYSSCR.CH .BS 1 SYSSCR.CV .BS 1 SYSSCR.CPULOADI .BS 1 -SYSSCR.CPULOADC .AS -"|\-/" +SYSSCR.CPULOADC .AS -"|/-\" *-------------------------------------- SYSSCR.TITLE >CSTRING "A2osX System Screen" SYSSCR.BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0 diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index 3f5cddd1..075b300d 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -1,29 +1,26 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 *-------------------------------------- -* S.NewPStr -* IN: -* PULLW = PTR to buffer -* OUT: -* A = hMem to S (PSTRING) -*-------------------------------------- -S.NewPStr >PULLW ZPQuickPtr1 - bra S.PStrCpy2 -*-------------------------------------- * S.PStrCpyA * In: * A = hMem of Src String * Out: * A = hMem of Dest String *-------------------------------------- +* S.NewPStrYA +* IN: +* PULLW = PTR to buffer +* OUT: +* A = hMem to S (PSTRING) +*-------------------------------------- S.PStrCpyA jsr S.GetMemPtrA - >STYA ZPQuickPtr1 -S.PStrCpy2 lda (ZPQuickPtr1) +S.NewPStrYA >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) inc tay lda #0 Y,A = len of new string diff --git a/SYS/KERNEL.S.TSK.txt b/SYS/KERNEL.S.TSK.txt index 7c15db60..c74f5349 100644 --- a/SYS/KERNEL.S.TSK.txt +++ b/SYS/KERNEL.S.TSK.txt @@ -1,5 +1,5 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 @@ -9,177 +9,189 @@ AUTO 6 * S.TskMgrInit *-------------------------------------- S.TskMgrInit stz TSKMGR.LASTID + lda #1 + sta TSKMGR.SIZE One Slot Busy (Kernel PS=0) - >LDYAI TSKMGR.TABLE - >STYA TSKMGR.TSKPTR - + >LDYAI TskMgr.Table Make PS #0 as current process + >STYA pPs + ldx #K.PS.MAX .1 lda #0 ldy #S.PS.SIZE-1 -.2 sta (TSKMGR.TSKPTR),y +.2 sta (pPs),y dey bpl .2 - lda TSKMGR.TSKPTR + lda pPs clc adc #S.PS.SIZE - sta TSKMGR.TSKPTR + sta pPs bcc .3 - inc TSKMGR.TSKPTR+1 -.3 dex + + inc pPs+1 +.3 dex bne .1 - >LDYAI TSKMGR.TABLE Make PS #0 as current process - >STYA TSKMGR.TSKPTR + >LDYAI TskMgr.Table Make PS #0 as current process + >STYA pPs jsr S.CreateEnv - bcs .9 + bcs * + ldy #S.PS.hENV - sta TSKMGR.TABLE,y + sta TskMgr.Table,y >LDYAI TmpBuffer256 - jsr S.MLIGetPrefix - bcs .9 - >PUSHWI TmpBuffer256 - jsr S.NewPStr - bcs .9 + jsr S.MLIGetPrefixYA + bcs * + + >LDYAI TmpBuffer256 + jsr S.NewPStrYA + bcs * + ldy #S.PS.hPREFIX - sta TSKMGR.TABLE,y + sta TskMgr.Table,y >PUSHWI TmpBuffer256 push ENV value >PUSHWI ENV.A2osX push ENV name ldy #S.PS.hENV - lda TSKMGR.TABLE,y + lda TskMgr.Table,y >PUSHA jsr S.SetEnvVarP rts + .9 sec rts *-------------------------------------- * S.TskMgrRun *-------------------------------------- -S.TskMgrRun >LDYAI TSKMGR.TABLE+S.PS.SIZE - >STYA TSKMGR.TSKPTR +S.TskMgrRun >LDYAI TskMgr.Table+S.PS.SIZE + >STYA pPs - lda #K.PS.MAX-1 Skip PS #0 + lda #1 Skip PS #0 sta TSKMGR.COUNT -.1 lda (TSKMGR.TSKPTR) get S.PS.F +.1 lda (pPs) get S.PS.F and #S.PS.F.INUSE In use ? beq .5 - lda (TSKMGR.TSKPTR) get S.PS.F + lda (pPs) get S.PS.F and #S.PS.F.HOLD Waiting for Another Task to Terminate? - beq .3 + beq .2 ldy #S.PS.CID - lda (TSKMGR.TSKPTR),y - jsr S.IsPSRunningA + lda (pPs),y + jsr S.GetPSByIDA bcc .5 yes, running.... - lda (TSKMGR.TSKPTR) get S.PS.F - and #$FF^S.PS.F.HOLD unmark as HOLD - sta (TSKMGR.TSKPTR) -.3 ldy #S.PS.hCS - lda (TSKMGR.TSKPTR),y - jsr S.GetMemPtrA Y,A = CS - pha - tya get CS LO - ldy #S.PS.PC + lda (pPs) get S.PS.F + and #$FF^S.PS.F.HOLD unmark as HOLD + sta (pPs) + +.2 jsr S.SelectProcess + + ldy #S.PS.PC+1 Is this PS sleeping? + lda (pPs),y + tax + dey + ora (pPs),y + beq .3 no, call TSKMGR.RUN + + lda (pPs),y clc - adc (TSKMGR.TSKPTR),y - sta Kernel.JMP - iny - pla - adc (TSKMGR.TSKPTR),y - sta Kernel.JMP+1 + adc pCode + sta S.TskMgrRunJmp+1 + txa + adc pCode+1 + sta S.TskMgrRunJmp+2 lda #0 Don't forget to reset S.PC - sta (TSKMGR.TSKPTR),y - dey - sta (TSKMGR.TSKPTR),y + ldy #S.PS.PC + sta (pPs),y + iny + sta (pPs),y - >LDYA TSKMGR.TSKPTR - ldx #TSKMGR.RUN - jsr Kernel.BINCALL Call RUN function - bcc .5 RUN said CS=QUIT? + jsr S.TskMgrRunJmp + bra .4 + +.3 ldx #TSKMGR.RUN + jsr pCodeJmp Call RUN function +.4 bcc .5 RUN said CS=QUIT? - ldy #S.PS.hCS - lda (TSKMGR.TSKPTR),y - jsr S.GetMemPtrA Y,A = CS - >STYA Kernel.JMP - - >LDYA TSKMGR.TSKPTR ldx #TSKMGR.QUIT yes, quit this process - - jsr Kernel.BINCALL Call QUIT function + jsr pCodeJmp Call QUIT function ldy #S.PS.ID - lda (TSKMGR.TSKPTR),y + lda (pPs),y jsr S.FreeProcessA bcs .99 -.5 lda TSKMGR.TSKPTR +.5 lda pPs clc adc #S.PS.SIZE - sta TSKMGR.TSKPTR + sta pPs bcc .6 - inc TSKMGR.TSKPTR+1 + inc pPs+1 -.6 dec TSKMGR.COUNT +.6 lda TSKMGR.COUNT + inc TSKMGR.COUNT + cmp TSKMGR.SIZE bne .1 clc rts + .99 bra * *-------------------------------------- +S.TskMgrRunJmp jmp $FFFF +*-------------------------------------- * S.DispatchEvent * IN: -* PULLW = Event * OUT: * CS: Not Dispatched * CC: Event Cleared *-------------------------------------- -S.DispatchEvent >LDYAI TSKMGR.TABLE+S.PS.SIZE - >STYA TSKMGR.TSKPTR +S.DispatchEvent >LDYAI TskMgr.Table+S.PS.SIZE + >STYA pPs - lda #K.PS.MAX-1 + lda #1 sta TSKMGR.COUNT -.1 lda (TSKMGR.TSKPTR) get S.PS.F +.1 lda (pPs) get S.PS.F and #S.PS.F.INUSE In use ? beq .3 - lda (TSKMGR.TSKPTR) get S.PS.F + lda (pPs) get S.PS.F and #S.PS.F.HOLD Waiting for Another Task to Terminate? bne .3 - lda (TSKMGR.TSKPTR) get S.PS.F + lda (pPs) get S.PS.F and #S.PS.F.EVENT Accept Events ? beq .3 + + jsr S.SelectProcess - ldy #S.PS.hCS - lda (TSKMGR.TSKPTR),y - jsr S.GetMemPtrA - >STYA Kernel.JMP - - >PUSHW EVTMGR.EVTPTR - >LDYA TSKMGR.TSKPTR ldx #TSKMGR.DOEVENT - jsr Kernel.BINCALL Call DOEVENT function + jsr pCodeJmp Call DOEVENT function bcc .8 -.3 lda TSKMGR.TSKPTR +.3 lda pPs clc adc #S.PS.SIZE - sta TSKMGR.TSKPTR + sta pPs bcc .4 - inc TSKMGR.TSKPTR+1 + inc pPs+1 -.4 dec TSKMGR.COUNT +.4 lda TSKMGR.COUNT + inc TSKMGR.COUNT + cmp TSKMGR.SIZE bne .1 sec -.8 rts + rts + +.8 jsr S.DestroyEvent + clc + rts *-------------------------------------- * S.TskMgrQuit *-------------------------------------- @@ -190,18 +202,20 @@ S.TskMgrQuit clc *-------------------------------------- * S.ExecProcessA (Blocking Parent PID) * in : -* A = hMem To Full Cmd Line +* A = hMem To Cmd Line * out : * A = Child PSID *-------------------------------------- S.ExecProcessA jsr S.CreateProcessA bcs .9 terminated, do not set PID as HOLD + ldy #S.PS.CID - sta (TSKMGR.TSKPTR),y + sta (pPs),y + pha Save Child PID - lda (TSKMGR.TSKPTR) + lda (pPs) ora #S.PS.F.HOLD - sta (TSKMGR.TSKPTR) + sta (pPs) pla Get Back PID clc .9 rts @@ -213,174 +227,188 @@ S.ExecProcessA jsr S.CreateProcessA * A = Child PSID *-------------------------------------- S.CreateProcessA - pha save CMD line + sta S.CreateProcessA.Cmd >LDYAI MSG.NEWPS - jsr S.SysScrPPSTR - - ldy #S.PS.ID - lda (TSKMGR.TSKPTR),y - - jsr S.CreateChildProcessA + jsr S.SysScrPPSTRYA + jsr S.CreateChildProcess bcs .99 - >STYA TSKMGR.pNewPS + + sta S.CreateProcessA.CPSID + + jsr S.SelectProcessA - pla Get Back CMD Line + lda S.CreateProcessA.Cmd jsr S.InitProcessA - bcs .97 Init Failed or exit? - ldy #S.PS.ID - lda (TSKMGR.pNewPS),y + 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 -.97 pha save error code - tay error code =0 ? - bne .98 no, init failed - >LDYA TSKMGR.pNewPS - ldx #TSKMGR.QUIT yes, simply call QUIT function - jsr Kernel.BINCALL Call QUIT function - -.98 ldy #S.PS.ID - lda (TSKMGR.pNewPS),y +.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 - bra .90 -.99 plx Discard CMD Line - pha save error code + pla get back error code -.90 pla get back error code - sec +.99 sec rts *-------------------------------------- +S.CreateProcessA.Cmd .BS 1 +S.CreateProcessA.CPSID .BS 1 +*-------------------------------------- * S.GetPSByIDA * In : -* A = PID +* A = PID * Out : * Y,A = PTR to TSKSLOT *-------------------------------------- -S.GetPSByIDA tax - bne .10 - >LDYAI TSKMGR.TABLE - clc - rts +S.GetPSByIDA sta S.GetPSByIDA.PS -.10 sta ZPQuickPtr1 Store requested PID - lda #K.PS.MAX - sta ZPQuickPtr1+1 + >LDYAI TskMgr.Table + >STYA ZPQuickPtr1 - >LDYAI TSKMGR.TABLE+S.PS.SIZE - >STYA ZPQuickPtr2 - -.1 lda (ZPQuickPtr2) - bpl .2 - ldy #S.PS.ID - lda (ZPQuickPtr2),y - cmp ZPQuickPtr1 + lda S.GetPSByIDA.PS beq .8 -.2 dec ZPQuickPtr1+1 - beq .9 - lda ZPQuickPtr2 + + ldx #0 + +.1 inx + lda ZPQuickPtr1 clc adc #S.PS.SIZE - sta ZPQuickPtr2 - bcc .1 - inc ZPQuickPtr2+1 - bra .1 -.8 >LDYA ZPQuickPtr2 - clc - rts -.9 sec - rts -*-------------------------------------- -* PRIVATE -*-------------------------------------- -* S.CreateChildProcessA -* in : -* A = Parent PSID -* out : -* X = PSID -* Y,A = PTR to S.PS -* we cannot use ZPQuickPtrs -* because of calling S.PStrCpyA & S.DupEnvA -*-------------------------------------- -S.CreateChildProcessA - jsr S.GetPSByIDA - bcs .9 - - >STYA R.AX - >LDYAI TSKMGR.TABLE+S.PS.SIZE - >STYA R.BX - - ldx #K.PS.MAX -.1 lda (R.BX) - bpl .3 - lda R.BL - clc - adc #S.PS.SIZE - sta R.BL + sta ZPQuickPtr1 bcc .2 - inc R.BH -.2 dex + 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 - lda #TSKMGR.ERROOS - sec - rts .9 lda #TSKMGR.ERRNSP + sec + rts + +.8 >LDYA ZPQuickPtr1 + clc + rts +*-------------------------------------- +S.GetPSByIDA.PS .BS 1 +*-------------------------------------- +* PRIVATE +*-------------------------------------- +* S.CreateChildProcess +* in : +* out : +* A = PSID +* we cannot use ZPQuickPtrs +* because of calling S.PStrCpyA & 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 - sta (R.BX) - ldy #S.PS.ID - lda (R.AX),y - ldy #S.PS.PID - sta (R.BX),y + sta (R.AX) - inc TSKMGR.LASTID - bne .4 - inc TSKMGR.LASTID Ensure PSID not 0 -.4 lda TSKMGR.LASTID +.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 - sta (R.BX),y + lda TSKMGR.LASTID + sta (R.AX),y + lda #0 ldy #S.PS.hCS -.5 sta (R.BX),y Blank Everything in this S.PS +.5 sta (R.AX),y Blank Everything in this S.PS iny cpy #S.PS.SIZE bne .5 ldy #S.PS.hPREFIX copy hPREFIX... - lda (R.AX),y + lda (pPs),y jsr S.PStrCpyA bcs .99 ldy #S.PS.hPREFIX - sta (R.BX),y + sta (R.AX),y + ldy #S.PS.hENV ...and hENV from parent PS - lda (R.AX),y + lda (pPs),y jsr S.DupEnvA bcs .99 + ldy #S.PS.hENV - sta (R.BX),y + sta (R.AX),y ldy #S.PS.hINDEV - lda (R.AX),y - sta (R.BX),y + lda (pPs),y + sta (R.AX),y ldy #S.PS.hOUTDEV - lda (R.AX),y - sta (R.BX),y + lda (pPs),y + sta (R.AX),y ldy #S.PS.hERRDEV - lda (R.AX),y - sta (R.BX),y + lda (pPs),y + sta (R.AX),y ldy #S.PS.ID - lda (R.BX),y - tax Exit with X=PSID - >LDYA R.BX And Y,A=S.PS - clc + lda (pPs),y + + ldy #S.PS.PID + sta (R.AX),y + + ldy #S.PS.ID + lda (R.AX),y + clc Exit with A=PSID rts + .99 sec rts *-------------------------------------- @@ -388,77 +416,116 @@ S.CreateChildProcessA * In : * A = hMem To Full Cmd Line *-------------------------------------- -* LS(2) -* 0 : hMem to ENVPATH value -* 1 : hMem to FULLPATH value -*-------------------------------------- -S.InitProcessA >ADDLOCAL 2 - >PUSHA Push Cmd Line +S.InitProcessA >PUSHA Push Cmd Line >PUSHBI $20 Push SEP=' ' >PUSHBI 0 Push 0 for getting CMD And ARGS jsr S.PStrGetTkn - bcs .99 OOM error - ldy #S.PS.hCMD - sta (TSKMGR.pNewPS),y + bcc .10 + rts OOM error + +.10 ldy #S.PS.hCMD + sta (pPs),y >PUSHA push CMD for S.FileSearch txa ldy #S.PS.hARGS - sta (TSKMGR.pNewPS),y set ARGS hMem (0 if none) + sta (pPs),y set ARGS hMem (0 if none) + >PUSHWI ENV.PATH push ENVNAME=PATH ldy #S.PS.hENV - lda (TSKMGR.pNewPS),y + lda (pPs),y >PUSHA jsr S.GetEnvVarP get value for ENV=PATH bcs .99 - >STAL 0 save VALUE hMem for discard + + sta S.InitProcessA.PATH save VALUE hMem for discard >PUSHA A=PStr to ENV Value jsr S.FileSearch find File in %PATH% bcs .98 - >STAL 1 save FULLPATH hMem for discard + + sta S.InitProcessA.FULLPATH save FULLPATH hMem for discard pha jsr S.SysScrPPSTRA pla + jsr S.LoadBinA A = BinPath hMem + bcs .97 - >STYA Kernel.JMP save PTR to Code Segment + + >STYA pCode save PTR to Code Segment txa ldy #S.PS.hCS - sta (TSKMGR.pNewPS),y save CS hMem in TSKSLOT - >LDYA TSKMGR.pNewPS - ldx #TSKMGR.INIT - jsr Kernel.BINCALL Call INIT function + 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 .1 DS.SIZE=0... + + lda (pCode),y + >PUSHAX Push DS.SIZE + >PUSHBI 0 no option + jsr S.GetMem + bcs .97 + + >STYA pData + txa + ldy #S.PS.hDS + sta (pPs),y save DS hMem in TSKSLOT + +.1 ldx #TSKMGR.INIT + jsr pCodeJmp Call INIT function bcs .97 jsr .97 clc rts + .97 pha save ERR - >LDAL 1 + lda S.InitProcessA.FULLPATH jsr S.FreeMemA pla + .98 pha save ERR - >LDAL 0 + lda S.InitProcessA.PATH jsr S.FreeMemA pla -.99 >REMLOCAL 2 - sec + +.99 sec rts +S.InitProcessA.PATH .BS 1 +S.InitProcessA.FULLPATH .BS 1 *-------------------------------------- -* S.QuitProcessA -* In : A = PID to Quit (call TSKMGR.QUIT) +* S.SelectProcessA +* In : A=PSID *-------------------------------------- -S.QuitProcessA jsr S.GetPSByIDA - bcs .9 - >STYA ZPQuickPtr1 - ldy #S.PS.hCS - lda (ZPQuickPtr1),y +S.SelectProcessA + jsr S.GetPSByIDA + bcs * + >STYA pPS + +S.SelectProcess ldy #S.PS.hCS + lda (pPs),y jsr S.GetMemPtrA - >STYA Kernel.JMP - >LDYA ZPQuickPtr1 - ldx #TSKMGR.QUIT - jsr Kernel.BINCALL Call QUIT function - clc + >STYA pCode + + ldy #S.PS.hDS + lda (pPs),y + beq .1 + + jsr S.GetMemPtrA + >STYA pData + +.1 ldy #S.PS.hOUTDEV + lda (pPs),y + beq .8 + + jsr S.GetDevByIDA + >STYA pDev + +.8 clc rts -.9 bra * *-------------------------------------- * S.FreeProcessA * In : A = PID to free @@ -469,71 +536,46 @@ S.FreeProcessA jsr S.GetPSByIDA 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 + .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 .9 bra * *-------------------------------------- -* S.IsPSRunningA -* In : -* A = PID -* Out : -* CC = Running -* CS = no PS -*-------------------------------------- -S.IsPSRunningA pha save PID - ldx #K.PS.MAX - >LDYAI TSKMGR.TABLE+S.PS.SIZE - >STYA ZPQuickPtr1 - -.1 lda (ZPQuickPtr1) - bpl .2 - ldy #S.PS.ID - pla - pha - cmp (ZPQuickPtr1),y - beq .8 - - lda ZPQuickPtr1 - clc - adc #S.PS.SIZE - sta ZPQuickPtr1 - bcc .2 - - inc ZPQuickPtr2+1 -.2 dex - bne .1 - - pla - sec - rts - -.8 pla - clc - rts -*-------------------------------------- +TSKMGR.SIZE .BS 1 TSKMGR.COUNT .BS 1 TSKMGR.LASTID .BS 1 *-------------------------------------- diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 0827f794..90bd8056 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -1,34 +1,35 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 - .OR $E000 - .TF SYS/KERNEL + .OR $D000 + .TF /A2OSX.BOOT/SYS/KERNEL *-------------------------------------- .INB INC/MACROS.I .INB INC/KERNEL.I .INB INC/A2OSX.I + .INB INC/A2OSX.API.I .INB INC/IO.I .INB INC/PRODOS.I *-------------------------------------- -KERNEL.Start jmp S.Kernel +KERNEL jmp S.KernelInit KERNEL.COLDBOOT *-------------------------------------- -KERNEL.SYSCALL jmp (.1,x) + jmp (.1,x) KERNEL.SYSCALL *-------------------------------------- .1 .DA S.GetMem $00 .DA S.FreeMemA - .DA S.ClrMemA .DA S.GetMemPtrA - - .DA S.GetMemLenA .DA S.GetMemByIDA + .DA S.GetMemByNameA + .DA S.GetMemByNameYA + .DA 0 .DA 0 *-------------------------------------- - .DA S.NewPStr $10 + .DA S.NewPStrYA $10 .DA S.PStrCpyA .DA S.PStrCat .DA S.PStrCmp @@ -39,7 +40,7 @@ KERNEL.SYSCALL jmp (.1,x) .DA 0 *-------------------------------------- .DA S.LoadBinA $20 - .DA S.LoadLib + .DA S.LoadLibYA .DA S.UnloadLibA .DA S.LoadDrvA @@ -49,7 +50,7 @@ KERNEL.SYSCALL jmp (.1,x) .DA 0 *-------------------------------------- .DA S.ExpandPStrA $30 - .DA S.ExpandPStr + .DA S.ExpandPStrYA .DA S.GetEnvVarH .DA S.GetEnvVarP @@ -58,51 +59,51 @@ KERNEL.SYSCALL jmp (.1,x) .DA 0 .DA 0 *-------------------------------------- - .DA S.MLICreate $40 - .DA S.MLIDestroy + .DA S.MLICreateFile $40 + .DA S.MLICreateDirA + .DA S.MLICreateDirYA + .DA S.MLIDestroyA + + .DA S.MLIDestroyYA .DA S.MLIRename .DA S.MLISetFileInfo - .DA S.MLIGetFileInfoA + + .DA S.MLIGetFileInfoYA $50 .DA S.MLIOnline - .DA S.MLISetPrefix - .DA S.MLIGetPrefixA + .DA S.MLISetPrefixA + .DA S.MLISetPrefixYA - .DA S.MLIOpenA $50 - .DA S.MLINewLine + .DA S.MLIGetPrefixA + .DA S.MLIGetPrefixYA + .DA S.MLIOpenA + .DA S.MLIOpenYA + + .DA S.MLINewLine $60 .DA S.MLIRead .DA S.MLIWrite - .DA S.MLICloseA + .DA S.MLIFlushA .DA S.MLISetMark - .DA S.MLIGetMark + .DA S.MLIGetMarkA + .DA S.MLISetEOF - .DA S.MLISetEOF $60 - .DA S.MLIGetEOFA - .DA 0 - .DA 0 + .DA S.MLIGetEOFA $70 + .DA S.MLISetBuf + .DA S.MLIGetBuf + .DA S.MLIGetTime - .DA 0 - .DA 0 - .DA 0 - .DA 0 + .DA S.MLIAllocIRQ + .DA S.MLIDeallocIRQA + .DA S.MLIReadBlock + .DA S.MLIWriteBlock *-------------------------------------- - .DA S.GetDevByIDA $70 + .DA S.GetDevByIDA $80 .DA S.GetDevByNameA - .DA S.GetDevTable - .DA S.GetDevInfoA - - .DA S.DevOutA .DA S.GetDevByNameYA .DA 0 - .DA 0 -*-------------------------------------- - .DA S.GetEvent $80 - .DA S.DestroyEvent - .DA 0 - .DA 0 - + .DA 0 .DA 0 .DA 0 @@ -139,58 +140,66 @@ KERNEL.SYSCALL jmp (.1,x) .DA 0 *-------------------------------------- .DA S.ScreenSelectA $C0 + .DA 0 + .DA S.SysScrPPSTRA + .DA S.SysScrPPSTRYA *-------------------------------------- -S.Kernel jsr S.KernelInit - jsr S.KernelRun - jsr S.KernelQuit - - bra * -*-------------------------------------- -S.KernelInit >LDYAI D.STACKSEG - >STYA R.SP init Soft Stack - >STYA R.LS init LS - +S.KernelInit sei + ldx #$FF init 6502 stack to highest + txs + stx A2osX.SaveSM + stx A2osX.SaveSX + cli + + >LDYAI D.STACK.TOP + >STYA pStack init Soft Stack + stz A2osX.SCREENS - stz A2osX.ACTIVESCRN + stz A2osX.ASCREEN + + stz A2osX.CSCREEN.DEV + stz A2osX.GSCREEN.DEV + jsr S.SysScrInit >LDYAI MSG.Init - jsr S.SysScrPPSTR - + jsr S.SysScrPPSTRYA + >LDYAI MSG.Init.MemMgr - jsr S.SysScrPPSTR + jsr S.SysScrPPSTRYA jsr S.MemMgrInit jsr S.SysScrPRCode bcs .1 >LDYAI MSG.Init.TskMgr - jsr S.SysScrPPSTR + jsr S.SysScrPPSTRYA jsr S.TskMgrInit jsr S.SysScrPRCode .1 bcs .2 >LDYAI MSG.Init.DevMgr - jsr S.SysScrPPSTR + jsr S.SysScrPPSTRYA jsr S.DevMgrInit jsr S.SysScrPRCode .2 bcs .3 >LDYAI MSG.Init.EvtMgr - jsr S.SysScrPPSTR + jsr S.SysScrPPSTRYA jsr S.EvtMgrInit jsr S.SysScrPRCode .3 bcs .99 >LDYAI MSG.Init.Startup - jsr S.SysScrPPSTR + jsr S.SysScrPPSTRYA - >PUSHWI STARTUP.FILE Build A2osX.STARTUP full path... - jsr S.NewPStr + >LDYAI STARTUP.FILE Build A2osX.STARTUP full path... + jsr S.NewPStrYA pha save for discard + >PUSHA >PUSHWI ENV.A2osX get KRNL root path ldy #S.PS.hENV - lda TSKMGR.TABLE,y + lda TskMgr.Table,y >PUSHA jsr S.GetEnvVarP pha save for discard @@ -200,7 +209,8 @@ S.KernelInit >LDYAI D.STACKSEG jsr S.ExecFileA jsr S.SysScrPRCode - + bcs * + pla jsr S.FreeMemA pla @@ -209,11 +219,14 @@ S.KernelInit >LDYAI D.STACKSEG jsr S.FreeMemA >LDYAI MSG.Init.SysEnv - jsr S.SysScrPPSTR + jsr S.SysScrPPSTRYA jsr S.PrintSysEnv -.99 rts +.99 bcs * + + >LDYAI MSG.Init.OK + jsr S.SysScrPPSTRYA *-------------------------------------- S.KernelRun jsr S.TskMgrRun bcs .98 @@ -225,22 +238,22 @@ S.KernelRun jsr S.TskMgrRun jsr S.DispatchEvent bcc S.KernelRun CC=Event Dispatched - lda (EVTMGR.EVTPTR) + lda (pEvent) and #S.EVT.F.TIMER Discard any TIMER event beq .1 jsr S.DestroyEvent bra S.KernelRun -.1 lda (EVTMGR.EVTPTR) +.1 lda (pEvent) and #S.EVT.F.KEY any special key? beq .99 ldy #S.EVT.DATAHI Open-Apple? - lda (EVTMGR.EVTPTR),y + lda (pEvent),y bpl .99 ldy #S.EVT.DATALO - lda (EVTMGR.EVTPTR),y + lda (pEvent),y cmp #$31 bne .2 @@ -258,52 +271,24 @@ S.KernelRun jsr S.TskMgrRun bne .8 lda #A2osX.SCREENS.G jsr S.ScreenSelectA + .8 jsr S.DestroyEvent bra S.KernelRun .98 lda #A2osX.SCREENS.S jsr S.ScreenSelectA >LDYAI MSG.KRNLPANIC - jsr S.SysScrPPSTR + jsr S.SysScrPPSTRYA bra * .99 >LDYAI MSG.EVNTPANIC - jsr S.SysScrPPSTR - lda (EVTMGR.EVTPTR) - jsr S.SysScrPRBYTEA - ldy #S.EVT.hDEV - lda (EVTMGR.EVTPTR),y - jsr S.SysScrPRBYTEA - ldy #S.EVT.DATALO - lda (EVTMGR.EVTPTR),y - jsr S.SysScrPRBYTEA - ldy #S.EVT.DATAHI - lda (EVTMGR.EVTPTR),y - jsr S.SysScrPRBYTEA - - lda #'.' - jsr S.SysScrCOUTA - ldy #S.EVT.DATAW1 - lda (EVTMGR.EVTPTR),y - jsr S.SysScrPRBYTEA - iny - lda (EVTMGR.EVTPTR),y - jsr S.SysScrPRBYTEA - - lda #'.' - jsr S.SysScrCOUTA - ldy #S.EVT.DATAW2 - lda (EVTMGR.EVTPTR),y - jsr S.SysScrPRBYTEA - iny - lda (EVTMGR.EVTPTR),y - jsr S.SysScrPRBYTEA + jsr S.SysScrPPSTRYA + jsr S.DumpEvent jsr S.DestroyEvent jmp S.KernelRun *-------------------------------------- -S.KernelQuit clc - rts +S.KernelQuit bra * *-------------------------------------- * PUBLIC *-------------------------------------- @@ -311,38 +296,44 @@ S.KernelQuit clc * in : * A = hMem of FilePath (PSTRING) * out : -*-------------------------------------- -* LS : (8) -* 0 = hMem of Loaded File -* 2 = PTR to File data -* 4 = Data Len -* 6 = CMD hMem -* 7 = ARGS hMem +* *-------------------------------------- S.ExecFileA jsr S.LoadFileA bcc S.ExecFileAOK rts -S.ExecFileAOK >ADDLOCAL 8 - >STYAL 4 Store File Length + +S.ExecFileAOK >STYA S.ExecFileA.DataLen + stx S.ExecFileA.hData txa - >STAL 0 hMem of Loaded File jsr S.GetMemPtrA - >STYAL 2 + >STYA S.ExecFileA.DataPtr + .1 stz TmpBuffer256 -.2 >LDYAL 2 + +.2 >LDYA S.ExecFileA.DataPtr >STYA ZPQuickPtr1 - >INCLW 2 - >DECLW 4 + + inc S.ExecFileA.DataPtr + bne .21 + inc S.ExecFileA.DataPtr+1 + +.21 lda S.ExecFileA.DataLen + bne .22 + dec S.ExecFileA.DataLen+1 +.22 dec S.ExecFileA.DataLen + lda (ZPQuickPtr1) cmp #$0D beq .3 inc TmpBuffer256 ldx TmpBuffer256 sta TmpBuffer256,x - >LDAL 4 + + lda S.ExecFileA.DataLen bne .2 - >LDAL 5 + lda S.ExecFileA.DataLen+1 bne .2 + .3 lda TmpBuffer256 beq .4 lda TmpBuffer256+1 @@ -353,83 +344,78 @@ S.ExecFileAOK >ADDLOCAL 8 lda #'>' jsr S.SysScrCOUTA >LDYAI TmpBuffer256 - jsr S.SysScrPPSTR - >PUSHWI TmpBuffer256 - jsr S.NewPStr + jsr S.SysScrPPSTRYA + >LDYAI TmpBuffer256 + jsr S.NewPStrYA bcs .99 + pha jsr S.ExecCmdLineA jsr S.SysScrPRCode pla jsr S.FreeMemA -.4 >LDAL 4 -.5 bne .6 - >LDAL 5 - beq .8 -.6 jmp .1 -.8 jsr .99 + +.4 lda S.ExecFileA.DataLen + bne .1 + lda S.ExecFileA.DataLen+1 + bne .1 + + jsr .99 clc rts -.99 >LDAL 0 + +.99 lda S.ExecFileA.hData jsr S.FreeMemA - >REMLOCAL 8 sec rts *-------------------------------------- -S.ExecCmdLineA >PUSHA +S.ExecCmdLineA >PUSHA Push Cmd Line >PUSHBI $20 Push SEP=' ' >PUSHBI 0 Push Token IDX jsr S.PStrGetTkn bcs .99 - >STAL 6 - pha - txa - >STAL 7 - pla + + sta S.ExecFileA.hCMD + stx S.ExecFileA.hARGS jsr S.GetMemPtrA >PUSHYA >PUSHWI EXECCMDS jsr S.GetPStrIndex bcs .98 + asl tax - >LDAL 7 + lda S.ExecFileA.hARGS jsr S.ExecCmdLine bcs .98 + jsr .98 clc rts + .98 pha - >LDAL 7 + lda S.ExecFileA.hARGS jsr S.FreeMemA - >LDAL 6 + lda S.ExecFileA.hCMD jsr S.FreeMemA pla .99 sec rts *-------------------------------------- +S.ExecFileA.hData .BS 1 +S.ExecFileA.DataLen .BS 2 +S.ExecFileA.DataPtr .BS 2 +S.ExecFileA.hCMD .BS 1 +S.ExecFileA.hARGS .BS 1 +*-------------------------------------- S.ExecCmdLine jmp (.1,x) .1 .DA S.SetSysEnvA .DA S.LoadDrvA VCPU!!!! .DA S.CreateProcessA VCPU!!!! *-------------------------------------- -S.PrintSysEnv ldy #S.PS.hENV - lda TSKMGR.TABLE,y Get PS #0 ENV - jsr S.GetMemPtrA - >STYA R.AX -.1 lda (R.AX) - beq .8 Ending 0 ? - >LDYA R.AX - jsr S.SysScrPPSTR - jsr S.SysScrCROUT - lda R.AL - sec - adc (R.AX) Add len+1 to PTR - sta R.AL - bcc .1 - inc R.AH - bra .1 -.8 rts +pDevJmp jmp (pDev) +pCodeJmp jmp (pCode) +pLibJmp jmp (pLib) *-------------------------------------- EXECCMDS >PSTRING "SET" EXECCMDS1 >PSTRING "LOAD" @@ -443,6 +429,8 @@ MSG.Init.DevMgr >PSTRING "->DevMgr Init" MSG.Init.EvtMgr >PSTRING "->EvtMgr Init" MSG.Init.Startup >PSTRING "EXEC A2osX.Startup...\n" MSG.Init.SysEnv >PSTRING "SYS ENV:\n" +MSG.Init.OK >PSTRING "A2osX[Stage2]:Complete." + MSG.EVNTPANIC >PSTRING "\nEVT:F/hDev/DATA/W1/W2=" MSG.KRNLPANIC >PSTRING "\n\n!!!Kernel Panic!!!" *-------------------------------------- @@ -454,25 +442,21 @@ ENV.DRV >PSTRING "DRV" ENV.ETC >PSTRING "ETC" ENV.LIB >PSTRING "LIB" *-------------------------------------- - .INB SYS/KERNEL.S.BIN - .INB SYS/KERNEL.S.DEV - .INB SYS/KERNEL.S.ENV - .INB SYS/KERNEL.S.EVT - .INB SYS/KERNEL.S.FS .INB SYS/KERNEL.S.MEM - .INB SYS/KERNEL.S.MLI - .INB SYS/KERNEL.S.NET -* .INB SYS/KERNEL.S.RDR .INB SYS/KERNEL.S.SCR .INB SYS/KERNEL.S.STR + .INB SYS/KERNEL.S.FS + .INB SYS/KERNEL.S.MLI + .INB SYS/KERNEL.S.BIN + .INB SYS/KERNEL.S.DRV + .INB SYS/KERNEL.S.LIB + .INB SYS/KERNEL.S.NET + .INB SYS/KERNEL.S.RDR + .INB SYS/KERNEL.S.ENV .INB SYS/KERNEL.S.TSK + .INB SYS/KERNEL.S.EVT *-------------------------------------- -KERNEL.End .EQ * -Kernel.Size .EQ KERNEL.End-KERNEL.Start -*-------------------------------------- - .DO Kernel.Size>$1FFA - ERROR:KERNEL.SIZE too big - .FIN + .INB SYS/KERNEL.S.DEV *-------------------------------------- MAN SAVE SYS/KERNEL.S diff --git a/SYS/KM.NSC.S.txt b/SYS/KM.NSC.S.txt index ffe34e85..64198b22 100644 --- a/SYS/KM.NSC.S.txt +++ b/SYS/KM.NSC.S.txt @@ -1,12 +1,12 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SYS/KM.NSC + .TF /A2OSX.BOOT/SYS/KM.NSC *-------------------------------------- .INB INC/MACROS.I .INB INC/IO.I diff --git a/SYS/KM.RAMWORKS.S.txt b/SYS/KM.RAMWORKS.S.txt index 7c183885..2886dd54 100644 --- a/SYS/KM.RAMWORKS.S.txt +++ b/SYS/KM.RAMWORKS.S.txt @@ -1,12 +1,12 @@ PR#3 -PREFIX /A2OSX.BUILD +PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 - .TF SYS/KM.RAMWORKS + .TF /A2OSX.BOOT/SYS/KM.RAMWORKS *-------------------------------------- .INB INC/MACROS.I .INB INC/IO.I @@ -166,7 +166,7 @@ RW.Install lda RRAMWRAMBNK1 inc DEVCNT ldx DEVCNT - lda #$30 Slot 3,Drive 1 + lda #$30 Slot 3,Drive 1,0=Not Removable, 0=no int, 00=1 Volume sta DEVLST,x lda #RWDRV.START @@ -276,7 +276,8 @@ RW.Format jsr RW.BLOCK.SET00 cmp #4 Are we writing first volume bitmap ? bne .63 no, regular one - lda #$CF Mark Block 0 & 1 free, 2,3 used (vol hdr) +* lda #$CF Mark Block 0 & 1 free, 2,3 used (vol hdr) + lda #$0F sta RW.BLOCK ldy #0 @@ -371,9 +372,13 @@ RW.MSG.KO3 >CSTRING "RamWorks Drive Format Error." * Driver for Ramworks in main LC * $FF00 -> $FF9A (Inclusive) * $FF58 MUST BE $60 (RTS) -* DO NOT trash DRV.BLKNUM as ProDOS +* DO NOT trash DRV.COMMAND...DRV.BLKNUM as ProDOS * reuses it after Block operation +* A1,A2 are used by Disk II Driver, +* so we use it safely as Tmp Ptr *-------------------------------------- +DRV.A2L .EQ $3E +DRV.A2H .EQ $3F DRV.COMMAND .EQ $42 DRV.BUFF .EQ $44 DRV.BLKNUM .EQ $46 @@ -389,14 +394,13 @@ RWDRV.START cld ProDOS will check that byte!!! bcs RWDRV.IOERR > 3 = Invalid OP, IO error lda DRV.BLKNUM - sec - sbc RWDRV.MAXLO+1 + sbc RWDRV.MAXLO+1 Carry is Clear lda DRV.BLKNUM+1 sbc RWDRV.MAXHI+1 bcs RWDRV.IOERR DRV.BLKNUM >= RW.DRV.SIZE, IO error - lda DRV.BLKNUM compute PAGE = blocknumLO *2 - asl + lda DRV.BLKNUM Get Back DRV.BLKNUM + asl compute PAGE = blocknumLO *2 pha lda DRV.BLKNUM+1 compute BANK = blocknumHI *2 rol @@ -408,50 +412,54 @@ RWDRV.START cld ProDOS will check that byte!!! *-------------------------------------- * X=Page($02 -> $BF),A=Bank,Y=CMD *-------------------------------------- - php +* php sei Disable IRQ as no vector set in RW Banks sta RWBankSelect Select RAMWorks Bank sta CLR80STORE make sure SETREADAUX/SETWRITEAUX effective everywhere - stx DRV.COMMAND+1 Reuse DRV.COMMAND for RAM PTR - stz DRV.COMMAND + inx second 256 bytes first + stx DRV.A2H Use DRV.A1L/H for RAM PTR + stz DRV.A2L + + inc DRV.BUFF+1 dey Y=CMD, zero if read - bne RWDRV.W CC, go write - + bne RWDRV.W non zero, go write + sta SETREADAUX - ldx #DRV.COMMAND READ:copy from RAM to BUFF - ldy #DRV.BUFF + ldx #DRV.A2L READ:copy from RAM to BUFF + lda #DRV.BUFF bra RWDRV.RW RWDRV.W sta SETWRITEAUX ldx #DRV.BUFF - ldy #DRV.COMMAND WRITE:copy from BUFF to RAM + lda #DRV.A2L WRITE:copy from BUFF to RAM + dey Make sure Y=0 for main loop below RWDRV.RW stx RWDRV.RW.SRC+1 - sty RWDRV.RW.DST+1 + sta RWDRV.RW.DST+1 ldx #2 2 pages to copy - ldy #0 - RWDRV.RW.SRC lda ($FF),y RWDRV.RW.DST sta ($FF),y iny bne RWDRV.RW.SRC + .HS 24 BIT Zero Page to skip RTS RWDRV.RTS rts $FF58 Must Be RTS - inc DRV.BUFF+1 - inc DRV.COMMAND+1 + dec DRV.BUFF+1 + dec DRV.A2H dex bne RWDRV.RW.SRC stz RWBankSelect sta CLRREADAUX sta CLRWRITEAUX - plp +* plp + cli RMDRV.CMDSTATUS RWDRV.MAXLO ldx #$FF return device block count in X,Y... diff --git a/_Make_DIR.txt b/_Make_DIR.txt new file mode 100644 index 00000000..c4c4f193 --- /dev/null +++ b/_Make_DIR.txt @@ -0,0 +1,16 @@ +PREFIX /A2OSX.BOOT +CREATE BIN +CREATE DRV +CREATE ETC +CREATE INC +CREATE LIB +CREATE SBIN +CREATE SYS +PREFIX /A2OSX.SRC +CREATE BIN +CREATE DRV +CREATE ETC +CREATE INC +CREATE LIB +CREATE SBIN +CREATE SYS \ No newline at end of file diff --git a/_Make_SYS.txt b/_Make_SYS.txt index 07a59e85..a59c244d 100644 --- a/_Make_SYS.txt +++ b/_Make_SYS.txt @@ -1,5 +1,12 @@ -PREFIX /A2OSX.BUILD +PR#3 +PREFIX /A2OSX.SRC NEW -BLOAD A +INC 1 +AUTO 6 +PREFIX /A2OSX.BOOT DELETE A2OSX.SYSTEM +BLOAD A BSAVE A2OSX.SYSTEM,TSYS,A$2000,L$1300 +-A2OSX.SYSTEM +MAN +TEXT MSYS