From 62f272bbf24293c3e050010e38e07c48d4c0a00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sun, 8 Mar 2015 22:45:23 +0100 Subject: [PATCH] Initial --- A2osX.S.GP.txt | 185 ++++++++++ A2osX.S.RW.txt | 571 ++++++++++++++++++++++++++++++ A2osX.S.Z80.txt | 55 +++ A2osX.S.txt | 538 ++++++++++++++++++++++++++++ A2osX.STARTUP.txt | 22 ++ BIN/ARP.S.txt | 219 ++++++++++++ BIN/ASM.S.txt | 382 ++++++++++++++++++++ BIN/ASM.T.6502.S.txt | 264 ++++++++++++++ BIN/ASM.T.65C02.S.txt | 100 ++++++ BIN/ASM.T.Z80.S.txt | 36 ++ BIN/CHMOD.S.txt | 0 BIN/CHTYP.S.txt | 401 +++++++++++++++++++++ BIN/DNS.S.txt | 183 ++++++++++ BIN/EDIT.S.txt | 0 BIN/KILL.S.txt | 0 BIN/LS.S.txt | 389 ++++++++++++++++++++ BIN/LSDEV.S.txt | 139 ++++++++ BIN/MEM.S.txt | 285 +++++++++++++++ BIN/MOUNT.S.txt | 0 BIN/NETCFG.S.txt | 206 +++++++++++ BIN/NTPDATE.S.txt | 0 BIN/PING.S.txt | 367 +++++++++++++++++++ BIN/PS.S.txt | 114 ++++++ BIN/TEST.S.txt | 153 ++++++++ BIN/TOUCH.S.txt | 0 BIN/_TEMPLATE.S.txt | 57 +++ DRV/CONSOLE.DRV.S.txt | 332 +++++++++++++++++ DRV/DHGR.DRV.S.txt | 483 +++++++++++++++++++++++++ DRV/PPIC.DRV.S.txt | 108 ++++++ DRV/SSC.DRV.S.txt | 112 ++++++ DRV/UTHERNET.DRV.S.txt | 434 +++++++++++++++++++++++ ETC/TCPIP.CONF | 14 + INC/A2osX.I.txt | 324 +++++++++++++++++ INC/IO.I.txt | 103 ++++++ INC/KERNEL.I.txt | 60 ++++ INC/LIBSTR.I.txt | 23 ++ INC/LIBTCPIP.I.txt | 221 ++++++++++++ INC/MACROS.I.txt | 451 ++++++++++++++++++++++++ INC/MONITOR.I.txt | 95 +++++ INC/PRODOS.I.txt | 131 +++++++ INC/ZP.I.txt | 30 ++ LIB/LIBCRYPT.I.txt | 29 ++ LIB/LIBCRYPT.S.txt | 511 +++++++++++++++++++++++++++ LIB/LIBSTR.S.txt | 783 +++++++++++++++++++++++++++++++++++++++++ LIB/LIBTCPIP.S.ARP.txt | 266 ++++++++++++++ LIB/LIBTCPIP.S.DNS.txt | 314 +++++++++++++++++ LIB/LIBTCPIP.S.txt | 482 +++++++++++++++++++++++++ SBIN/DHCPCLNT.S.txt | 502 ++++++++++++++++++++++++++ SBIN/GETTY.S.txt | 304 ++++++++++++++++ SBIN/SHELL.S.txt | 568 ++++++++++++++++++++++++++++++ SBIN/TCPIP.S.txt | 449 +++++++++++++++++++++++ SBIN/TELNETD.S.txt | 49 +++ SYS/KERNEL.S.BIN.txt | 411 +++++++++++++++++++++ SYS/KERNEL.S.DEV.txt | 248 +++++++++++++ SYS/KERNEL.S.ENV.txt | 385 ++++++++++++++++++++ SYS/KERNEL.S.EVT.txt | 180 ++++++++++ SYS/KERNEL.S.FS.txt | 556 +++++++++++++++++++++++++++++ SYS/KERNEL.S.MD5.txt | 0 SYS/KERNEL.S.MEM.txt | 474 +++++++++++++++++++++++++ SYS/KERNEL.S.MLI.txt | 151 ++++++++ SYS/KERNEL.S.NET.txt | 154 ++++++++ SYS/KERNEL.S.RDR.txt | 151 ++++++++ SYS/KERNEL.S.SCR.txt | 283 +++++++++++++++ SYS/KERNEL.S.STR.txt | 384 ++++++++++++++++++++ SYS/KERNEL.S.TSK.txt | 544 ++++++++++++++++++++++++++++ SYS/KERNEL.S.txt | 541 ++++++++++++++++++++++++++++ 66 files changed, 16306 insertions(+) create mode 100644 A2osX.S.GP.txt create mode 100644 A2osX.S.RW.txt create mode 100644 A2osX.S.Z80.txt create mode 100644 A2osX.S.txt create mode 100644 A2osX.STARTUP.txt create mode 100644 BIN/ARP.S.txt create mode 100644 BIN/ASM.S.txt create mode 100644 BIN/ASM.T.6502.S.txt create mode 100644 BIN/ASM.T.65C02.S.txt create mode 100644 BIN/ASM.T.Z80.S.txt create mode 100644 BIN/CHMOD.S.txt create mode 100644 BIN/CHTYP.S.txt create mode 100644 BIN/DNS.S.txt create mode 100644 BIN/EDIT.S.txt create mode 100644 BIN/KILL.S.txt create mode 100644 BIN/LS.S.txt create mode 100644 BIN/LSDEV.S.txt create mode 100644 BIN/MEM.S.txt create mode 100644 BIN/MOUNT.S.txt create mode 100644 BIN/NETCFG.S.txt create mode 100644 BIN/NTPDATE.S.txt create mode 100644 BIN/PING.S.txt create mode 100644 BIN/PS.S.txt create mode 100644 BIN/TEST.S.txt create mode 100644 BIN/TOUCH.S.txt create mode 100644 BIN/_TEMPLATE.S.txt create mode 100644 DRV/CONSOLE.DRV.S.txt create mode 100644 DRV/DHGR.DRV.S.txt create mode 100644 DRV/PPIC.DRV.S.txt create mode 100644 DRV/SSC.DRV.S.txt create mode 100644 DRV/UTHERNET.DRV.S.txt create mode 100644 ETC/TCPIP.CONF create mode 100644 INC/A2osX.I.txt create mode 100644 INC/IO.I.txt create mode 100644 INC/KERNEL.I.txt create mode 100644 INC/LIBSTR.I.txt create mode 100644 INC/LIBTCPIP.I.txt create mode 100644 INC/MACROS.I.txt create mode 100644 INC/MONITOR.I.txt create mode 100644 INC/PRODOS.I.txt create mode 100644 INC/ZP.I.txt create mode 100644 LIB/LIBCRYPT.I.txt create mode 100644 LIB/LIBCRYPT.S.txt create mode 100644 LIB/LIBSTR.S.txt create mode 100644 LIB/LIBTCPIP.S.ARP.txt create mode 100644 LIB/LIBTCPIP.S.DNS.txt create mode 100644 LIB/LIBTCPIP.S.txt create mode 100644 SBIN/DHCPCLNT.S.txt create mode 100644 SBIN/GETTY.S.txt create mode 100644 SBIN/SHELL.S.txt create mode 100644 SBIN/TCPIP.S.txt create mode 100644 SBIN/TELNETD.S.txt create mode 100644 SYS/KERNEL.S.BIN.txt create mode 100644 SYS/KERNEL.S.DEV.txt create mode 100644 SYS/KERNEL.S.ENV.txt create mode 100644 SYS/KERNEL.S.EVT.txt create mode 100644 SYS/KERNEL.S.FS.txt create mode 100644 SYS/KERNEL.S.MD5.txt create mode 100644 SYS/KERNEL.S.MEM.txt create mode 100644 SYS/KERNEL.S.MLI.txt create mode 100644 SYS/KERNEL.S.NET.txt create mode 100644 SYS/KERNEL.S.RDR.txt create mode 100644 SYS/KERNEL.S.SCR.txt create mode 100644 SYS/KERNEL.S.STR.txt create mode 100644 SYS/KERNEL.S.TSK.txt create mode 100644 SYS/KERNEL.S.txt diff --git a/A2osX.S.GP.txt b/A2osX.S.GP.txt new file mode 100644 index 00000000..7281869c --- /dev/null +++ b/A2osX.S.GP.txt @@ -0,0 +1,185 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* **** START OF A2osX Global Page **** +*-------------------------------------- +A2osX.GP.start .EQ * +*-------------------------------------- + .PH $300 +*-------------------------------------- +A2osX.GP bra A2osX.SYSCALL3 + bra A2osX.MLICALL3 + bra A2osX.LIBCALL3 + bra A2osX.SLEEP3 + bra Kernel.MLICALL3 + bra Kernel.DRVCALL3 + bra Kernel.BINCALL3 + bra Kernel.LIBCALL3 + .BS A2osX.300CODE-* +*-------------------------------------- +* A2osX.SYSCALL (MAINLC to AUXLC) +* In: +* X = SYSfnc.Index +* Y,A = free for Inline param +*-------------------------------------- +A2osX.SYSCALL3 jsr GO.AUXLC + jsr $E003 + jsr GO.MAINLC + rts +*-------------------------------------- +* A2osX.MLICALL (MAINLC to MAINLC) +* In: +* X = MLI Function +* A = Param Count +*-------------------------------------- +A2osX.MLICALL3 stx .1 + sta MLICALL.PARAMS + jsr MLI +.1 .BS 1 + .DA MLICALL.PARAMS + rts +*-------------------------------------- +* LIBCALL (MAINLC to MAINLC) +* In: +* Y = LIB.ID +* X = LIBfnc.Index +* A = free for Inline param +*-------------------------------------- +A2osX.LIBCALL3 pha + phx + tya + >SYSCALL SYS.GetMemPtrA + >STYA .1+1 + plx + pla +.1 jmp $FFFF +*-------------------------------------- +A2osX.SLEEP3 jmp A2osX.SLEEP31 +*-------------------------------------- +* SLEEP (MAINLC to AUXLC) +* In: +*-------------------------------------- +* Kernel.MLICALL (AUXLC to MAINLC) +* In: +* X = MLI Function +* A = Param Count +*-------------------------------------- +Kernel.MLICALL3 jsr GO.MAINLC + jsr A2osX.MLICALL3 + jsr GO.AUXLC + rts +*-------------------------------------- +* Kernel.DRVCALL (AUXLC to MAINLC) +* In: +* X = DRV Function Index +* Y,A = pDevContext +*-------------------------------------- +Kernel.DRVCALL3 jsr GO.MAINLC + >STYA pDevContext + jsr Kernel.JMP3 + jsr GO.AUXLC + rts +*-------------------------------------- +* Kernel.BINCALL (AUXLC to MAINLC) +* In: +* X = BIN Function Index +* Y,A = pPsContext +*-------------------------------------- +Kernel.BINCALL3 jsr GO.MAINLC + >STYA pPsContext + jsr Kernel.JMP3 + jsr GO.AUXLC + rts +*-------------------------------------- +* Kernel.LIBCALL (AUXLC to MAINLC) +* In: +* X = Lib Function Index +*-------------------------------------- +Kernel.LIBCALL3 jsr GO.MAINLC + jsr Kernel.JMP3 + jsr GO.AUXLC + rts +*-------------------------------------- +Kernel.JMP3 jmp (Kernel.JMP) +*-------------------------------------- +GO.MAINLC php + clc + bra GO.SAVE.REG + +GO.AUXLC php + sec + +GO.SAVE.REG sta A2osX.SaveA + pla keep P in A for later + stx A2osX.SaveX + sty A2osX.SaveY + plx + ply + inx + bne .1 + iny +.1 stx GO.EXIT.JMP+1 + sty GO.EXIT.JMP+2 + sei + ldy R.SP + tsx + stx A2osX.SaveS + bcs GO.AUXLC1 + +GO.MAINLC1 stx CLRALTZP + ldx RROMBNK2 + ldx A2osX.SaveS + txs + sty R.SP + bra GO.EXIT +*-------------------------------------- +GO.AUXLC1 stx SETALTZP + ldx RRAMWRAMBNK2 + ldx RRAMWRAMBNK2 + ldx A2osX.SaveS + txs + sty R.SP +*-------------------------------------- +GO.EXIT pha push P on stack + + ldy A2osX.SaveY + ldx A2osX.SaveX + lda A2osX.SaveA + plp + +GO.EXIT.JMP jmp $FFFF +*-------------------------------------- +A2osX.SLEEP31 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 +*-------------------------------------- + .EP +*-------------------------------------- +A2osX.GP.End +*-------------------------------------- +MAN +SAVE A2OSX.S.GP +LOAD A2OSX.S +ASM diff --git a/A2osX.S.RW.txt b/A2osX.S.RW.txt new file mode 100644 index 00000000..f7c9eac2 --- /dev/null +++ b/A2osX.S.RW.txt @@ -0,0 +1,571 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +RWBankSelect .EQ $C073 +*-------------------------------------- +RWDetect jsr MLI + .DA #MLIONLINE + .DA RW.ONLINE + rts +*-------------------------------------- +RW.ONLINE .DA #2 + .DA #$30 Slot 3,Drive 1 + .DA RW.ONLINEBUFFER +RW.ONLINEBUFFER .BS 16 +*-------------------------------------- +RWInit php + sei + sta SETALTZP + + ldx #0 start detection at page $00 +.1 stx RWBankSelect + lda 0 + sta RW.SAVEZP0,x save Bank 0 $0000 to prevent ALTZP trash + lda 1 + sta RW.SAVEZP1,x + inx + bne .1 + + lda #0 +.2 sta RWBankSelect + sta 0 + eor #$FF + sta 1 + eor #$FF + inc + bne .2 + + ldx #0 +.3 txa + sta RWBankSelect + cmp 0 + bne .4 + eor #$FF + cmp 1 + bne .4 + inx + bne .3 + dex we reached 0,last detected page was 255 + +.4 ldy #255 X = detected page count + +.6 sty RWBankSelect + lda RW.SAVEZP0,y + sta 0 + lda RW.SAVEZP1,y + sta 1 + dey + bne .6 + + stz RWBankSelect + lda RW.SAVEZP0 Don't forget to restore Bank 0 + sta 0 + lda RW.SAVEZP1 + sta 1 + + txa + + stx RW.PGCNT PGCNT = last detected page, as we do -1 for AuxMem + + sta CLRALTZP + plp + lda RW.PGCNT + beq .9 + + clc + rts + +.9 sec + rts +*-------------------------------------- +* +*-------------------------------------- +RWInstall lda RRAMWRAMBNK1 + lda RRAMWRAMBNK1 + + ldx #RWDRV.SIZE +.1 lda RWDRV.B.START-1,x + sta RWDRV.START-1,x + dex + bne .1 + + lda RW.PGCNT + lsr + sta RWDRV.MAXHI+1 + lda #0 + ror + sta RWDRV.MAXLO+1 + + lda RROMBNK1 + + sta SETWRITEAUX + + ldx #RWDRVX.SIZE +.2 lda RWDRVX.B.START-1,x + sta RWDRVX.START-1,x + dex + bne .2 + + sta CLRWRITEAUX + + inc DEVCNT + ldx DEVCNT + lda #$30 Slot 3,Drive 1 + sta DEVLST,x + + lda #RWDRV.START + sta DEVPTRS3D1 + lda /RWDRV.START + sta DEVPTRS3D1+1 + clc + rts +*-------------------------------------- +* +*-------------------------------------- +RWFormat jsr RW.BLOCK.SET00 + + lda RW.PGCNT + lsr + sta RW.BLOCK2.TB+1 + lda #0 + ror + sta RW.BLOCK2.TB + + jsr MLI + .DA #MLIGETTIME + .DA 0 + + ldx #3 +.1 lda DATELO,x + sta RW.BLOCK2.CT,x + dex + bpl .1 + + ldx #RW.BLOCK2.END-RW.BLOCK2 +.2 lda RW.BLOCK2-1,x + sta RW.BLOCK-1,x + dex + bne .2 + + jsr MLI Write Block 2,First VOL directory block + .DA #MLIWRITEBLOCK + .DA RW.MLIWRITEBLOCK + bcc .22 + rts +*-------------------------------------- +.22 jsr RW.BLOCK.SET00 + + lda #2 + sta RW.BLOCK LO byte of previous block pointer + + inc RW.MLIWRITEBLOCK.BLK + jsr MLI Write Block 3,Last VOL directory block + .DA #MLIWRITEBLOCK + .DA RW.MLIWRITEBLOCK + bcc .33 + rts +*-------------------------------------- +.33 lda RW.PGCNT divide RW.PGCNT by 32 to get how many bitmap + lsr blocks we need : + lsr 1 page = 128 blocks = 16 bytes + lsr 32 pages = 512 bytes = 1 Block + lsr + lsr + sta RW.FBITMAPCNT store FULL bitmap block count needed + + tax + lda RW.PGCNT + and #$1F need an extra incomplete bitmap block? + beq .3 + inx +.3 stx RW.BITMAPCNT store TOTAL bitmap block needed + +.4 lda RW.FBITMAPCNT + beq .49 + + dec RW.FBITMAPCNT + jsr RW.BLOCK.SETFF + + bra .5 + +.49 jsr RW.BLOCK.SET00 + + lda RW.PGCNT + and #$1F compute incomplete bitmap block + asl + asl + asl + asl times 16 for byte count + tay + lda #$FF + bcc .42 first half of block only + + ldx #0 +.40 sta RW.BLOCK,x + inx + bne .40 + + cpy #0 + beq .5 +.41 sta RW.BLOCK+$ff,y + dey + bne .41 + + bra .5 + +.42 sta RW.BLOCK-1,y + dey + bne .42 + +.5 inc RW.MLIWRITEBLOCK.BLK + lda RW.MLIWRITEBLOCK.BLK + 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) + sta RW.BLOCK + + ldy #0 + lda #$8 Start a BLOCK 4 (%00001000) + ldx RW.BITMAPCNT + +.62 pha + eor RW.BLOCK,y Mark bitmap blocks as "used" + sta RW.BLOCK,y + pla + dex + beq .63 + lsr + bne .62 + lda #$80 + iny + bra .62 + +.63 jsr MLI Write Block 4,5... + .DA #MLIWRITEBLOCK + .DA RW.MLIWRITEBLOCK + bcs .9 + + dec RW.BITMAPCNT another bitmap block needed ? + bne .4 + + clc +.9 rts +*-------------------------------------- +RW.BLOCK.SETFF lda #$FF + bra RW.BLOCK.SET +RW.BLOCK.SET00 lda #$00 +RW.BLOCK.SET ldx #0 +.1 sta RW.BLOCK,x + sta RW.BLOCK+$100,x + inx + bne .1 + rts +*-------------------------------------- +RW.MLIWRITEBLOCK + .DA #3 + .DA #$30 Slot 3,Drive 1 + .DA RW.BLOCK +RW.MLIWRITEBLOCK.BLK + .DA 2 Start writing block at #2 +*-------------------------------------- +RW.RAM31 .DA #$30 + .DA #5 len=5 chars + .AS 'RAM31' +*-------------------------------------- +RW.PGCNT .BS 1 +RW.FBITMAPCNT .BS 1 +RW.BITMAPCNT .BS 1 +RW.SAVEZP0 .BS 256 +RW.SAVEZP1 .BS 256 +*-------------------------------------- +RW.BLOCK2 .DA 0 pointer to previous block + .DA 3 pointer to next block + .DA #$F5 $F=Vol Dir Header, 5=name len + .AS 'RAM31' + .BS 10 (RAM31 len=5, fill to 15) + .HS 0000000000000000 +RW.BLOCK2.CT .BS 4 Creation time + .HS 0100C3270D version/min version/access/EL/EPB + .DA 0 File Count + .DA 4 bitmap pointer (Block 2&3 are Volume directory) +RW.BLOCK2.TB .BS 2 Total Blocks +RW.BLOCK2.END .EQ * +*-------------------------------------- +RW.BLOCK .BS 512 +*-------------------------------------- +* Driver for Ramworks in main LC +* $FF00 -> $FF9A (Inclusive) +* $FF58 MUST BE $60 (RTS) +* DO NOT trash DRV.BLKNUM as ProDOS +* reuses it after Block operation +*-------------------------------------- +DRV.COMMAND .EQ $42 +DRV.BUFF .EQ $44 +DRV.BLKNUM .EQ $46 +*-------------------------------------- +RWDRV.B.START + .PH $FF00 +RWDRV.START cld ProDOS will check that byte!!! + ldy DRV.COMMAND 0 = Status ? + beq RMDRV.CMDSTATUS + + cpy #3 + beq RWDRV.EXITOK 3 = Format : nothing to do, exit with no error + bcs RWDRV.IOERR > 3 = Invalid OP, IO error + + lda DRV.BLKNUM + sec + sbc RWDRV.MAXLO+1 + 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 + pha + lda DRV.BLKNUM+1 compute BANK = blocknumHI *2 + rol + inc +1 for skipping Aux BANK 0 + plx move page into X + beq RWDRV.GOAUX move from/to aux page0/1 + cpx #$C0 + bcs RWDRV.GOAUX move from/to aux LC +*-------------------------------------- +* X=Page($02 -> $BF),A=Bank,Y=CMD +*-------------------------------------- + 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 + + dey Y=CMD, zero if read + bne RWDRV.W CC, go write + + sta SETREADAUX + ldx #DRV.COMMAND READ:copy from RAM to BUFF + ldy #DRV.BUFF + bra RWDRV.RW + +RWDRV.W sta SETWRITEAUX + ldx #DRV.BUFF + ldy #DRV.COMMAND WRITE:copy from BUFF to RAM + +RWDRV.RW stx RWDRV.RW.SRC+1 + sty 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 + dex + bne RWDRV.RW.SRC + + stz RWBankSelect + sta CLRREADAUX + sta CLRWRITEAUX + plp + +RMDRV.CMDSTATUS +RWDRV.MAXLO ldx #$FF return device block count in X,Y... +RWDRV.MAXHI ldy #$FF + +RWDRV.EXITOK lda #0 make A=0 + clc + rts + +RWDRV.IOERR lda #MLI.ERR.IO Carry already set + rts +*-------------------------------------- +* X=Page(0/1 or LC),A=Bank +*-------------------------------------- +RWDRV.GOAUX pha save BANK + + sta SETWRITEAUX + + ldy #RWDRVX.XM.SIZE Backup begining of $300 to generate move code +.1 lda RWDRV.XM.RUN-1,y + sta RWDRVX.XM.SAVE-1,y + dey + bne .1 + + pla restore BANK + + sta SETREADAUX + jsr RWDRVX.START Setup Code in main mem at $300 for data move +* returns : CC=WRITE, CS=READ + sta CLRREADAUX CLRWRITEAUX already triggered by code copy + jsr RWDRV.XM.RUN Now execute generated code in main memory + + sta SETREADAUX + jsr RWDRVX.RESTORE + sta CLRREADAUX + rts A & carry setup properly by RWDRVX.RESTORE + +RWDRV.END .EP +RWDRV.B.END +RWDRV.SIZE .EQ RWDRV.B.END-RWDRV.B.START +*-------------------------------------- +* Driver for Ramworks in aux memory +* $0200 -> $02FF TMP buffer for PAGE copy +* $0300 -> $03FD (Inclusive) +* do not trash $03FE-$03FF (IRQ Vector) +* X=Page(0/1 or LC),A=Bank +*-------------------------------------- +RMDRVX.TMP .EQ $200 +RWDRV.XM.RUN .EQ $300 +*-------------------------------------- +RWDRVX.B.START + .PH $0300 +RWDRVX.START sta RWDRVX.XM.BANK+1 setup BANK + txa + beq .1 page 0/1, no need to check BANK + cmp #$D0 $C0 <= PAGE < $D0 ? + bcc .1 no, store in BNK1 + ora #$10 Remap $C0 page to $D0 BNK2 + +.1 ror RWDRVX.XM.RWLC+1 Save Carry to select proper RW bank later + + ldy DRV.BUFF + ldx DRV.BUFF+1 + + lsr DRV.COMMAND DRV.COMMAND: 1=READ,2=WRITE + bcc .2 CC=WRITE, CS=READ + stz RWDRVX.XM.SRC+1 READ from src LO = 0 + sta RWDRVX.XM.SRC+2 READ from src HI = PAGE + sty RWDRVX.XM.DST+1 WRITE to DRV.BUFF + stx RWDRVX.XM.DST+2 + bra .3 + +.2 sty RWDRVX.XM.SRC+1 READ from DRV.BUFF + stx RWDRVX.XM.SRC+2 + stz RWDRVX.XM.DST+1 WRITE to dst LO = 0 + sta RWDRVX.XM.DST+2 WRITE to dst HI = PAGE + +.3 sta CLRWRITEAUX + + ldy #RWDRVX.XM.SIZE +.4 lda RWDRVX.XM.START-1,y + sta RWDRV.XM.RUN-1,y + dey + bne .4 + rts +*-------------------------------------- +* Called form Main LC after RWDRVX.XM execution +*-------------------------------------- +RWDRVX.RESTORE ldy #RWDRVX.XM.SIZE Now, restore begining of $300 +.1 lda RWDRVX.XM.SAVE-1,y + sta RWDRV.XM.RUN-1,y + dey + bne .1 + tya setup A=0 and CC for exit with non error + clc + rts +*-------------------------------------- +* "auXMove" Code, moved from Aux to main $300 +* $0200 -> $02FF TMP buffer for 2 steps moving between LCs +* CC=WRITE : +* CS=READ : +*-------------------------------------- +RWDRVX.XM.START php + sei + + ldx #0 + ldy #2 2 pages to copy + +RWDRVX.XM.COPY jsr RWDRV.XM.RUN+RWDRVX.XM.MNLC-RWDRVX.XM.START WRITE:copy from MAIN to TMP + + bcc RWDRVX.XM.SRC CC=WRITE,CS=READ? + + jsr RWDRV.XM.RUN+RWDRVX.XM.RWLC-RWDRVX.XM.START READ:copy from BANK to TMP + sta SETALTZP + +RWDRVX.XM.SRC lda $FFFF,x + sta RMDRVX.TMP,x + inx + bne RWDRVX.XM.SRC + + sta CLRALTZP + jsr RWDRV.XM.RUN+RWDRVX.XM.MNLC-RWDRVX.XM.START READ:copy from TMP to MAIN + + bcs RWDRVX.XM.1 CC=WRITE,CS=READ? + + jsr RWDRV.XM.RUN+RWDRVX.XM.RWLC-RWDRVX.XM.START WRITE:copy from TMP to BANK + sta SETALTZP + +RWDRVX.XM.1 lda RMDRVX.TMP,x +RWDRVX.XM.DST sta $FFFF,x + inx + bne RWDRVX.XM.1 + + sta CLRALTZP + + inc RWDRV.XM.RUN+RWDRVX.XM.SRC+2-RWDRVX.XM.START + inc RWDRV.XM.RUN+RWDRVX.XM.DST+2-RWDRVX.XM.START + dey + bne RWDRVX.XM.COPY + + plp + +RWDRVX.XM.MNLC stz RWBankSelect ProDOS always uses LCBANK1 + bit RRAMWRAMBNK1 + bit RRAMWRAMBNK1 + rts + +RWDRVX.XM.RWLC lda #$FF + bpl RWDRVX.XM.BANK + bit RRAMWRAMBNK2 + bit RRAMWRAMBNK2 +RWDRVX.XM.BANK lda #$FF + sta RWBankSelect + rts + +RWDRVX.XM.END +*-------------------------------------- +RWDRVX.XM.SIZE .EQ RWDRVX.XM.END-RWDRVX.XM.START +*-------------------------------------- +RWDRVX.XM.SAVE .BS RWDRVX.XM.SIZE +*-------------------------------------- + .EP +*-------------------------------------- +RWDRVX.B.END +RWDRVX.SIZE .EQ RWDRVX.B.END-RWDRVX.B.START +*-------------------------------------- +* CONTROL SECTION : +*-------------------------------------- + .DO RWDRV.RTS=$FF58 + .ELSE + ERROR:RWDRV.RTS <> $FF58 + .FIN + .DO RWDRV.SIZE>$9B + ERROR:RWDRV.SIZE too big + .FIN + .DO RWDRVX.SIZE>$FE + ERROR:RWDRVX.SIZE too big + .FIN + .DO RWDRVX.XM.SIZE>$F0 + ERROR:RWDRVX.XM.SIZE too big + .FIN +*-------------------------------------- +MAN +SAVE A2OSX.S.RW +LOAD A2OSX.S +ASM diff --git a/A2osX.S.Z80.txt b/A2osX.S.Z80.txt new file mode 100644 index 00000000..e7794f7a --- /dev/null +++ b/A2osX.S.Z80.txt @@ -0,0 +1,55 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +InitZ80 ldx Z80Code.Len +.1 lda Z80Code-1,x + sta $1000-1,x 00000H for Z80 + dex + bne .1 + + stz TmpPtr1 + lda #$C1 + sta TmpPtr1+1 + +.2 sta (TmpPtr1) + lda $100D + bmi .8 + inc TmpPtr1+1 + lda TmpPtr1+1 + cmp #$C8 + beq .9 + clc + adc #$20 + sta $100A + bra .2 + +.8 lda TmpPtr1+1 + and #$0F + sta A2osX.Z80Slot + clc + rts + +.9 stz A2osX.Z80Slot + sec + rts +*-------------------------------------- +* Moved to $1000 (0000H) +*-------------------------------------- +Z80Code .HS 31FFFF START: LD SP,0FFFFH Init Stack + .HS 3EFF LD A,0FFH Set Flag + .HS 320D00 LD (FLAG),A + .HS 3200E1 LD (0E100H),A Back to 6502 + .HS 18F3 JR START Loop + .HS 00 FLAG: .DB 0 +*31FFFF3EFF320D003200E118F300 +Z80Code.Len .EQ *-Z80Code +*-------------------------------------- +MAN +SAVE A2OSX.S.Z80 +LOAD A2OSX.S +ASM diff --git a/A2osX.S.txt b/A2osX.S.txt new file mode 100644 index 00000000..bac1db50 --- /dev/null +++ b/A2osX.S.txt @@ -0,0 +1,538 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 +* .TF A2osX.SYSTEM + .TF A +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/IO.I + .INB INC/MONITOR.I + .INB INC/PRODOS.I +*-------------------------------------- +TmpPtr1 .EQ $0 main & aux ZP +TmpPtr2 .EQ $2 main & aux ZP +*-------------------------------------- +IO.Buffer .EQ $3C00 1k Buffer for MLI open +Load.Address .EQ $4000 for loading kernel.bin before relocation +*-------------------------------------- +* A2osX LOADER +*-------------------------------------- +* TODO : +* /intercept MLI CALLS with +* PREFIX=/MNT/ +*-------------------------------------- +START jmp A2osX.INIT + .DA $EEEE + .DA #$7F + .BS $7F +*-------------------------------------- +A2osX.INIT ldx #$FF init 6502 stack to highest +* txs + + php + sei + sta SETALTZP Switch to alt ZP + stx A2osX.SaveS make Alt SP to highest too + sta CLRALTZP Switch to main ZP + plp + + >LDYAI D.STACKSEG + >STYA R.SP init Soft Stack + +* >LDYAI WARMBOOT +* >STYA POWERUP +* jsr SETPWRC + + >LDAXI MSG.SYSMEM + jsr PrintCStrAX + + lda MACHID + and #MACHIDRAM + cmp #MACHIDRAM128 + beq A2osX.SysMemOK + + >LDAXI MSG.SYSMEM.KO + jsr PrintCStrAX + bra * +*-------------------------------------- +A2osX.SysMemOK >LDAXI MSG.SYSMEM.OK + jsr PrintCStrAX + + >LDAXI MSG.65x + jsr PrintCStrAX + jsr Init6502 + ldy A2osX.CPUTYPE + lda MSG.CPUTYPEH,y + tax + lda MSG.CPUTYPEL,y + jsr PrintCStrAX + + lda A2osX.CPUTYPE + bne A2osX.RamDrv + >LDAXI MSG.65x.KO + jsr PrintCStrAX + bra * +*-------------------------------------- +A2osX.RamDrv >LDAXI MSG.RAMDRV + jsr PrintCStrAX + jsr DisableRamDRV + bcc .2 + tax + beq .1 + >LDAXI MSG.RAMDRV.KO1 + jsr PrintCStrAX + bra A2osX.RamWorks + +.1 >LDAXI MSG.RAMDRV.KO0 + jsr PrintCStrAX + bra A2osX.RamWorks +.2 >LDAXI MSG.RAMDRV.OK + jsr PrintCStrAX +*-------------------------------------- +A2osX.RamWorks >LDAXI MSG.RW + jsr PrintCStrAX + + jsr RWDetect + bcs .10 + + >LDAXI MSG.RW.OK + jsr PrintCStrAX + + bra A2osX.Z80 + +.10 jsr RWInit + bcc .1 + + >LDAXI MSG.RW.KO1 + jsr PrintCStrAX + bra A2osX.Z80 + +.1 pha + >LDAXI MSG.RW.OK1 + jsr PrintCStrAX + + jsr RWInstall + bcc .2 + + >LDAXI MSG.RW.KO2 + jsr PrintCStrAX + bra A2osX.Z80 + +.2 >LDAXI MSG.RW.OK2 + jsr PrintCStrAX + + jsr RWFormat + bcc .3 + + >LDAXI MSG.RW.KO3 + jsr PrintCStrAX + bra A2osX.Z80 + +.3 >LDAXI MSG.RW.OK3 + jsr PrintCStrAX +*-------------------------------------- +A2osX.Z80 >LDAXI MSG.Z80 + jsr PrintCStrAX + jsr InitZ80 + bcs .1 + pha Push Z80Slot + + >LDAXI MSG.Z80.OK + jsr PrintCStrAX + bra .8 + +.1 >LDAXI MSG.Z80.KO + jsr PrintCStrAX + +.8 >LDAXI MSG.LOADING + jsr PrintCStrAX + + jsr LoadKernel + bcs .9 + + phx + pha + >LDAXI MSG.LOADING.OK + jsr PrintCStrAX + + ldx #A2osX.GP.End-A2osX.GP.start + +.81 lda A2osX.GP.start-1,x + sta A2osX.GP-1,x + dex + bne .81 + + >DEBUG + + php + pla + sei + tsx + stx A2osX.SaveS + stx SETALTZP + bit RRAMWRAMBNK1 + bit RRAMWRAMBNK1 + ldx A2osX.SaveS + txs + pha + plp + jmp $E000 + + +.9 pha + >LDAXI MSG.LOADING.KO + jsr PrintCStrAX + + bra * +*-------------------------------------- +* Out: +* A = 0, 6502 +* A = 1, 65C02 +* A = 2, R65C02 +* A = 3, 65C816 +*-------------------------------------- +Init6502 ldy #0 Test 6502 BCD bug + sed + lda #$99 + clc + adc #$01 + cld + bmi .9 BUG!, we have 6502 + + ldy #3 test 65C816 TYX Instruction + ldx #0 + .OP 65816 + tyx TYX: if 65C816, x becomes non-zero + .OP 65C02 + bne .9 worked! 65C816 + + dey y=2 -> R65C02 + ldx $EA save zp $EA + stz $EA store 0 in $EA + .OP 65R02 + smb 7,$EA if not Rockwell, assemble as nop nop + .OP 65C02 + asl $EA cs if Rockwell + stx $EA restore zp $EA + bcs .9 + + dey y=1 -> 65C02 + +.9 sty A2osX.CPUTYPE + rts +*-------------------------------------- +DisableRamDRV php + sei + lda DEVPTRS3D2 + cmp DEVPTRS0D1 + bne .1 + lda DEVPTRS3D2+1 + cmp DEVPTRS0D1+1 + 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 +.4 lda DEVLST+1,x + sta DEVLST,x + inx + cpx DEVCNT + bne .4 + + stz DEVLST,x + dec DEVCNT + + lda DEVPTRS0D1 + sta DEVPTRS3D2 + lda DEVPTRS0D1+1 + sta DEVPTRS3D2+1 + plp + clc Success!! + rts + +.9 plp + lda #0 Not detected + sec + rts +*-------------------------------------- +LoadKernel jsr MLI + .DA #MLIGETPREFIX + .DA MLIGETPREFIX01 + bcs .9 + ldy #0 + ldx Path.Buffer +.1 lda SYSKERNEL,y + beq .2 + sta Path.Buffer+1,x + inx + iny + bra .1 + +.2 stx Path.Buffer + jsr MLI + .DA #MLIOPEN + .DA MLIOPEN01 + bcs .9 + + lda MLIOPEN01+5 + sta MLIREAD01+1 + sta MLICLOSE01+1 + jsr MLI + .DA #MLIREAD + .DA MLIREAD01 + bcs .9 + + jsr MLI + .DA #MLICLOSE + .DA MLICLOSE01 + bcs .9 + + php + sei + sta SETALTZP + lda RRAMWRAMBNK1 + lda RRAMWRAMBNK1 + + >LDYAI Load.Address+$1F00 + >STYA TmpPtr1 + >LDYAI $E000+$1F00 + >STYA TmpPtr2 + ldy #$F9 do not trash NMI,BRK,IRQ Vectors + +.3 lda (TmpPtr1),y + sta (TmpPtr2),y + dey + cpy #$FF + bne .3 + + dec TmpPtr1+1 + dec TmpPtr2+1 + lda TmpPtr2+1 + cmp #$DF + bne .3 + + lda RROMBNK1 + sta CLRALTZP + plp + >LDAX MLIREAD01+6 + + clc +.9 rts +*-------------------------------------- +MLIGETPREFIX01 .DA #1 + .DA Path.Buffer +MLIOPEN01 .DA #3 + .DA Path.Buffer + .DA IO.Buffer + .BS 1 +MLIREAD01 .DA #4 + .BS 1 + .DA Load.Address + .DA $2000 + .BS 2 +MLICLOSE01 .DA #1 + .BS 1 +*-------------------------------------- +Path.Buffer .BS MLI.MAXPATH +SYSKERNEL >CSTRING "SYS/KERNEL" +*-------------------------------------- +PrintCStrAX >STAX TmpPtr1 + pla + sta TmpPtr2 + pla + sta TmpPtr2+1 + + ldy #0 +.1 lda (TmpPtr1),y + beq .9 + cmp #'%' + bne .4 + + iny + lda (TmpPtr1),y + beq .9 + cmp #'d' + bne .2 + pla + jsr PrintADec + bra .8 + +.2 cmp #'D' + bne .3 + pla + plx + jsr PrintAXDec + bra .8 + +.3 cmp #'h' + bne .4 + pla + jsr PRBYTE + +.4 cmp #'\' + bne .7 + iny + lda (TmpPtr1),y + beq .9 + cmp #'n' + bne .9 + lda #$0D + +.7 ora #$80 + jsr COUT +.8 iny + bne .1 + +.9 lda TmpPtr2+1 + pha + lda TmpPtr2 + pha + rts +*-------------------------------------- +PrintADec ldx #0 +PrintAXDec >STAX HEX +PrintDec stz BCD + stz BCD+1 + stz BCD+2 + + phy + + ldx #16 let's roll 16 bits + sed +.2 asl HEX + rol HEX+1 + php cpy will disturb carry while BCD adc + ldy #0 +.3 plp + lda BCD,y + adc BCD,y + sta BCD,y + php + iny + cpy #3 Last byte of BCDBUF? + bne .3 + plp + dex + bne .2 + + cld + + stz bFlag + + ldx #2 +.4 lda BCD,x + lsr + lsr + lsr + lsr + bne .5 + bit bFlag + bpl .6 +.5 sec + ror bFlag + ora #$B0 + jsr COUT +.6 lda BCD,x + and #$0F + bne .7 + bit bFlag + bpl .8 +.7 sec + ror bFlag + ora #$B0 + jsr COUT +.8 dex + bpl .4 + + bit bFlag + bmi .9 + lda #$B0 + jsr COUT + +.9 ply + rts +*-------------------------------------- +MSG.SYSMEM >CSTRING "Checking System Memory..." +MSG.SYSMEM.OK >CSTRING "128k Detected.\n" +MSG.SYSMEM.KO >CSTRING "A2osX Requires At Least 128k Memory.\n" +MSG.65x >CSTRING "Checking 65x CPU..." +MSG.65x.KO >CSTRING "A2osX Requires At Least A 65C02 CPU.\n" +MSG.RAMDRV >CSTRING "Checking ProDOS RamDrive..." +MSG.RAMDRV.OK >CSTRING "Successfully Disabled.\n" +MSG.RAMDRV.KO0 >CSTRING "Not Detected.\n" +MSG.RAMDRV.KO1 >CSTRING "Uninstall Failed !!!\n" +MSG.CLOCK.OK1 >CSTRING "Already Installed.\n" +MSG.CLOCK.OK2 >CSTRING "Successfully Installed.\n" +MSG.CLOCK.KO >CSTRING "Install Failed !!!\n" +MSG.RW >CSTRING "Detecting Ramworks Card..." +MSG.RW.OK >CSTRING "Already Installed as /RAM31.\n" +MSG.RW.OK1 >CSTRING "%d Pages Detected.\n" +MSG.RW.OK2 >CSTRING "RamWorks Driver Installed.\n" +MSG.RW.OK3 >CSTRING "RamWorks Drive Formatted.\n" +MSG.RW.KO1 >CSTRING "Not Detected.\n" +MSG.RW.KO2 >CSTRING "RamWorks Driver Install Error.\n" +MSG.RW.KO3 >CSTRING "RamWorks Drive Format Error.\n" +MSG.Z80 >CSTRING "Detecting Z80 CPU..." +MSG.Z80.OK >CSTRING "Detected In Slot %d.\n" +MSG.Z80.KO >CSTRING "Not Detected.\n" +MSG.LOADING >CSTRING "Loading Kernel..." +MSG.LOADING.OK >CSTRING "%D Bytes Read.\n" +MSG.LOADING.KO >CSTRING "Error $%h While Loading Kernel.\n" +*-------------------------------------- +MSG.CPUTYPEL .DA #MSG.6502 + .DA #MSG.65C02 + .DA #MSG.R65C02 + .DA #MSG.65C816 +MSG.CPUTYPEH .DA /MSG.6502 + .DA /MSG.65C02 + .DA /MSG.R65C02 + .DA /MSG.65C816 +*-------------------------------------- +MSG.6502 >CSTRING "NMOS 6502.\n" +MSG.65C02 >CSTRING "CMOS 65C02.\n" +MSG.R65C02 >CSTRING "Rockwell R65C02.\n" +MSG.65C816 >CSTRING "16 Bits 65C816.\n" +*-------------------------------------- +HEX .BS 2 +BCD .BS 3 +bFlag .BS 1 +*-------------------------------------- + .INB A2OSX.S.GP + .INB A2OSX.S.RW + .INB A2OSX.S.Z80 +*-------------------------------------- +* ****** START OF MLI QUIT CODE ****** +* setup $0300 Global page : +* Copy Back from $D010-$D0FF to $300-$3F0 +* setup $1000 Z80 switch code +*-------------------------------------- + .PH $1000 + cld + rts + +ROOT.PATH .BS MLI.MAXPATH + .EP +*-------------------------------------- +* Driver for NoSlotClock +* Load at (DATETIME+1) +*-------------------------------------- +*-------------------------------------- +MAN +SAVE A2OSX.S +ASM diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt new file mode 100644 index 00000000..2e597eca --- /dev/null +++ b/A2osX.STARTUP.txt @@ -0,0 +1,22 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 +SET PATH=%A2OSX%SBIN/;%A2OSX%BIN/ +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 +*LOAD PPIC.DRV +LOAD UTHERNET.DRV 000E3A123456 +EXEC TCPIP ETH3 +EXEC DHCPCLNT +*EXEC TELNETD +*MOUNT TFTP 192.168.1.5:/AO2SX /TFTP +LOAD DHGR.DRV +MAN +TEXT A2OSX.STARTUP diff --git a/BIN/ARP.S.txt b/BIN/ARP.S.txt new file mode 100644 index 00000000..8a2183fc --- /dev/null +++ b/BIN/ARP.S.txt @@ -0,0 +1,219 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/ARP +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBSTR.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .DA CS.QUIT +L.LIBSTR .DA LIBSTR +L.LIBTCPIP .DA LIBTCPIP +L.SSCANF.IP .DA SSCANF.IP +L.DST.IP .DA DST.IP +L.DST.MAC .DA DST.MAC +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 + sta hLIBSTR + + >LIBLOADP L.LIBTCPIP + sta hLIBTCPIP + + ldy #S.PS.hARGS + lda (pPsContext),y + beq CS.INIT.CACHE + + pha + >PUSHW L.DST.IP + >PUSHW L.SSCANF.IP + pla + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.SSCANF + bcs .9 + + stz bCTRLC + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + + rts CC,Give back control to CS.RUN + +.9 lda #SYSMGR.ERRSYN + sec + rts + +CS.INIT.CACHE >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE + >STYA ZPPTR1 + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldx #K.ARPCACHE.SIZE +.1 lda (ZPPTR1) +* beq .8 + + ldy #S.ARPCACHE.IP+4 +.2 dey + lda (ZPPTR1),y + >PUSHA + cpy #S.ARPCACHE.IP + bne .2 + + ldy #S.ARPCACHE.MAC+6 +.3 dey + lda (ZPPTR1),y + >PUSHA + cpy #S.ARPCACHE.MAC + bne .3 + + ldy #S.ARPCACHE.RETRYCNT + lda (ZPPTR1),y + >PUSHA + + >PUSHB (ZPPTR1) + + >PUSHW L.MSG1 + phx + >LIBCALL hLIBSTR,LIBSTR.PRINTF + plx + lda ZPPTR1 + clc + adc #S.ARPCACHE + sta ZPPTR1 + bcc .4 + inc ZPPTR1+1 +.4 dex + bne .1 +.8 lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory + rts +*-------------------------------------- +CS.RUN lda #ARP.TIMEOUT + sta TimeOut + +.1 lda bCTRLC + bne .9 + >PUSHW L.DST.MAC + >PUSHW L.DST.IP + >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.QUERY + bcc .2 success, print & exit + + lda TimeOut + beq .9 + jsr A2osX.SLEEP + bra .1 + +.2 ldx #5 +.3 >PUSHB DST.MAC,x + dex + bpl .3 + + ldx #3 +.4 >PUSHB DST.IP,x + dex + bpl .4 + + >PUSHW L.MSG2 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.9 sec + rts +*-------------------------------------- +CS.EVENT >PULLW pEvent + lda (pEvent) + and #S.EVT.F.TIMER is it a TIMER event? + beq .1 no.... + + lda TimeOut + beq .9 + + dec TimeOut + bra .9 + +.1 lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .9 + + ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPsContext),y + bne .9 + + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (pEvent),y + bne .9 + + ldy #S.EVT.DATALO + lda (pEvent),y + cmp #$03 Ctrl-C + bne .9 + + lda #$FF + sta bCTRLC + clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT lda hLIBTCPIP + >SYSCALL SYS.UnloadLibA + lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +CS.END +LIBSTR >PSTRING "libstr.o" +LIBTCPIP >PSTRING "libtcpip.o" +SSCANF.IP >PSTRING "%d.%d.%d.%d" +MSG0 >CSTRING "STS RET MAC Address IP Address\n" +MSG1 >CSTRING "$%h %03d %h:%h:%h:%h:%h:%h %d.%d.%d.%d\n" +MSG2 >CSTRING "%d.%d.%d.%d is at %h:%h:%h:%h:%h:%h\n" +*-------------------------------------- +DS.START +hLIBSTR .BS 1 +hLIBTCPIP .BS 1 +DST.IP .BS 4 +DST.MAC .BS 6 +TimeOut .BS 1 +bCTRLC .BS 1 +DS.END +*-------------------------------------- +MAN +SAVE BIN/ARP.S +ASM diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt new file mode 100644 index 00000000..0f24127a --- /dev/null +++ b/BIN/ASM.S.txt @@ -0,0 +1,382 @@ +PR#3 +PREFIX /DATA/A2OS +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /DATA/A2OS/BIN/ASM +*--------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OS.I + .INB INC/LIBSTR.I +*--------------------------------------- +SYM.BLOCK.SIZE .EQ 4096 +SYM.BLOCK.MAX .EQ 8 +*--------------------------------------- +ERR.INV.ARGS .EQ 1 +ERR.SRC.INV.TYPE .EQ 2 +ERR.SRC.TOO.LONG .EQ 3 +ERR.SYM.TOO.LARGE .EQ 10 +*--------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .DA CS.QUIT +L.LIBSTR .DA LIBSTR +L.MSG.HELP1 .DA MSG.HELP1 +L.MSG.HELP2 .DA MSG.HELP2 +L.MSG.SRCLINE .DA MSG.SRCLINE +L.READ.BUFFER .DA READ.BUFFER + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 Data Segment to Allocate +*--------------------------------------- +CS.INIT >LIBLOADP L.LIBSTR + sta hLIBSTR + + ldx #VAR.INIT.END-VAR.INIT +.1 stz VAR.INIT-1,x + dex + bne .1 + + ldy #S.PS.hARGS + lda (TSKMGR.TSKPTR),y + bne CS.INIT.ARGS + + >PUSHW L.MSG.HELP1 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + >PUSHW L.MSG.HELP2 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + lda #ERR.INV.ARGS + sec + rts + +CS.INIT.ARGS >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + bne .1 + lda #ERR.INV.ARGS + sec + rts + +.1 ldy #1 + lda (ZPQuickPtr1),y + cmp #'/' + bne .2 + ldy #S.PS.hARGS + lda (TSKMGR.TSKPTR),y + >SYSCALL SYS.PStrCpyA + bra CS.INIT.ARGS.OK + +.2 ldy #S.PS.hARGS + lda (TSKMGR.TSKPTR),y + >PUSHA + ldy #S.PS.hPREFIX + lda (TSKMGR.TSKPTR),y + >PUSHA + >SYSCALL SYS.PStrCat + +CS.INIT.ARGS.OK sta SRC.hFILENAMES + + >SYSCALL SYS.OpenFileA + bcc CS.INIT.OPEN + sec + rts + +CS.INIT.OPEN sta SRC.hREFNUMS + stx SRC.hBUFFERS + inc SRC.COUNT + lda SRC.hFILENAMES + >SYSCALL SYS.GetFileInfoA + bcs .99 + + >STYA ZPQuickPtr1 + ldy #1 + lda (ZPQuickPtr1),y + sta SRC.hFILETYPES + cmp #$04 TXT? + bne .1 + >PUSHBI $0D + >PUSHBI $FF + >PUSHB SRC.hREFNUMS + >SYSCALL SYS.NewLine + bcs .99 + +.1 cmp #$FA BAS? + bne .98 + + stz bSTOP + stz bCANCEL + lda (TSKMGR.TSKPTR) + ora #S.PS.F.EVENT Now accept events + sta (TSKMGR.TSKPTR) + + clc + rts + +.98 lda #ERR.SRC.INV.TYPE + sec +.99 rts +*-------------------------------------- +CS.RUN lda bCANCEL + beq .1 + sec + rts + +.1 lda bSTOP + beq .2 + clc + rts + +.2 jsr CS.RUN.READLINE + bcs .9 + + >PUSHWI TmpBuffer256 + >PUSHW SRC.LINENUM + >PUSHW L.MSG.SRCLINE + >LIBCALL hLIBSTR,LIBSTR.PRINTF + clc +.9 rts +*--------------------------------------- +CS.RUN.READLINE ldx SRC.COUNT + lda SRC.hFILETYPES-1,x + bmi CS.RUN.READLINE.BIN + jmp CS.RUN.READLINE.TXT +*--------------------------------------- +CS.RUN.READLINE.BIN >LDYAI 3 LEN + LINENUM + jsr CS.RUN.READLINE.YA + bcs .9 + + lda READ.BUFFER+1 + sta SRC.LINENUM + lda READ.BUFFER+2 + sta SRC.LINENUM+1 + + lda READ.BUFFER + dec + dec + dec + beq .8 + + tay + lda #0 + jsr CS.RUN.READLINE.YA + bcs .9 + + ldy #0 + ldx #0 + +.1 lda READ.BUFFER,y + bmi .2 + sta TmpBuffer256,x + beq .8 Ending 00 + inx + beq .99 + iny + bne .1 + bra .99 +.2 cmp #$C0 REPEAT char? + bne .5 + iny + beq .99 + lda READ.BUFFER,y + iny + beq .99 +.3 pha + lda READ.BUFFER,y + sta TmpBuffer256,x + pla + inx + beq .99 + dec + bne .3 + iny + bne .1 + bra .99 + +.5 and #$3F Compute blank count +.6 pha + lda #$20 + sta TmpBuffer256,x + pla + inx + beq .99 + dec + bne .6 + iny + bne .1 + bra .99 + +.8 clc +.9 rts +.99 lda #ERR.SRC.TOO.LONG + sec + rts +*-------------------------------------- +CS.RUN.READLINE.TXT >LDYAI 256 newline = $0D + jsr CS.RUN.READLINE.YA + bcs .9 + + clc +.9 rts +*-------------------------------------- +CS.RUN.READLINE.YA >PUSHYA + >PUSHW L.READ.BUFFER + ldx SRC.COUNT + lda SRC.hREFNUMS-1,x + >PUSHA + >SYSCALL SYS.ReadFile + rts +*-------------------------------------- +CS.EVENT ldy #S.EVT.hDEV is Event from active IN device? + lda (EVTMGR.EVTPTR),y + ldy #S.PS.hINDEV + cmp (TSKMGR.TSKPTR),y + bne .9 + lda (EVTMGR.EVTPTR) + and #S.EVT.F.KEY is it a KEY event? + beq .9 + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (EVTMGR.EVTPTR),y + bne .9 + ldy #S.EVT.DATALO + lda (EVTMGR.EVTPTR),y + cmp #$03 Ctrl-C + bne .1 + lda #$FF + sta bCANCEL + bra .8 +.1 cmp #$13 Ctrl-S + bne .8 + lda bSTOP + eor #$FF + sta bSTOP +.8 >SYSCALL SYS.DestroyEvent + clc + rts +.9 sec + rts +*-------------------------------------- +CS.QUIT ldx SRC.COUNT + beq .1 + + lda SRC.hREFNUMS-1,x + >SYSCALL SYS.CloseFileA + + ldx SRC.COUNT + lda SRC.hFILENAMES-1,x + >SYSCALL SYS.FreeMemA + + ldx SRC.COUNT + lda SRC.hBUFFERS-1,x + >SYSCALL SYS.FreeMemA + + dec SRC.COUNT + bne CS.QUIT + +.1 lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts +*--------------------------------------- +LOAD.ASM.T + clc + rts +*--------------------------------------- +SYM.ADD + clc + rts + +*--------------------------------------- +SYM.LOOKUP + clc + rts +*--------------------------------------- +SYM.BLOCK.ALLOC ldx #0 +.1 lda SYM.BLOCKS,x + beq .2 + inx + cpx #SYM.BLOCK.MAX + bne .1 + lda #ERR.SYM.TOO.LARGE + sec Out of block error + rts +.2 phx Save next free block + >LDYA SYM.BLOCK.SIZE + >SYSCALL SYS.GetMem + bcs .9 + txa + plx + sta SYM.BLOCKS,x + clc +.9 rts +*--------------------------------------- +CS.END +T.DIRECTIVES .AS "AS" + .AS "AT" + .AS "AZ" + .AS "BS" + .AS "DA" + .AS "DO" + .AS "DU" + .AS "ED" + .AS "EL" + .AS "EN" + .AS "EP" + .AS "EQ" + .AS "FI" + .AS "HS" + .AS "IN" + .AS "LI" + .AS "MA" + .AS "OP" + .AS "OR" + .AS "PG" + .AS "PH" + .AS "TA" + .AS "TF" + .AS "TI" + .AS "US" +*--------------------------------------- +LIBSTR >PSTRING "libstr.o" +MSG.HELP1 >CSTRING "A2OS-Macro Assembler (S-C MASM 2.0 Based)\n" +MSG.HELP2 >CSTRING "Usage : ASM [type TXT ($04) or S-C/BAS ($FA)]\n" +MSG.SRCLINE >CSTRING "%05D-%s\n" +*--------------------------------------- +DS.START +*--------------------------------------- +hLIBSTR .BS 1 +bSTOP .BS 1 +bCANCEL .BS 1 +*--------------------------------------- +VAR.INIT +SRC.COUNT .BS 1 +SRC.hFILENAMES .BS 8 Store full path to opened SRC files +SRC.hFILETYPES .BS 8 Store file type of opened SRC files +SRC.hREFNUMS .BS 8 Store ref_num of opened files (Main, .INs & .INBs) +SRC.hBUFFERS .BS 8 Store hMem to allocated buffers +SRC.LINENUM .BS 2 +ASM.T.hFILENAME .BS 1 +ASM.T.hFILE .BS 1 handle to loaded ASM.T.xxxxx +DST.hFILENAME .BS 1 +DST.hFILE .BS 1 +DST.hBUFFER .BS 1 +VAR.INIT.END +*--------------------------------------- +ASM.T.FILENAME .BS 65 PStr ProDOS Max Path Len +1 +TARGET.FILENAME .BS 65 PStr ProDOS Max Path Len +1 +TARGET.FILETYPE .BS 1 +READ.BUFFER .BS 256 +*--------------------------------------- +PASS .BS 1 +ORIGIN .BS 4 32Bits Origin +SYM.BLOCKS .BS SYM.BLOCK.MAX +DS.END +*--------------------------------------- +MAN +SAVE /DATA/A2OS/BIN/ASM.S +ASM diff --git a/BIN/ASM.T.6502.S.txt b/BIN/ASM.T.6502.S.txt new file mode 100644 index 00000000..72d996ff --- /dev/null +++ b/BIN/ASM.T.6502.S.txt @@ -0,0 +1,264 @@ +PR#3 +PREFIX /DATA/A2OS +NEW +INC 1 +AUTO 6 + .TF /DATA/A2OS/BIN/ASM.T.6502 + .OR $2000 +*--------------------------------------- + .MA AMS AMSID,"Syntax",0,"Operand",0,"Range",0 + .DA #]1 + .AS ]2 + .DA #0 + .AS ]3 + .DA #0 + .AS ]4 + .DA #0 + .EM +*--------------------------------------- + .DA T.ADDR.MODES.SYNTAX + .DA T.OPCODES +*--------------------------------------- +T.ADDR.MODES.SYNTAX >AMS 1,"","","" Implicit + >AMS 2,"#$1",$1","" Immediate + >AMS 3,"$2","$1=$2-@+1","-127,128" rel + >AMS 4,"$1","$1","" zp + >AMS 5,"$1,X","$1","" zp,x + >AMS 6,"$2","$2","" abs + >AMS 7,"$2,X","$2","" abs,x + >AMS 8,"$2,Y","$2","" abs,y + >AMS 9,"($2)","$2","" (abs) + >AMS 10,"($1)","$1","" (zp) + >AMS 11,"($1,X)","$1","" (zp,x) + >AMS 12,"($1),Y","$1","" (zp),x + .HS 0 +*--------------------------------------- +T.OPCODES .AS "ADC" + .HS 0 + .HS 2,$69,4,$65,5,$75,6,$6D,7,$7D,8,$79,11,$61,12,$71 + .HS 0 + .AS "AND" + .HS 0 + .HS + .HS 0 + .AS "ASL" + .HS 0 + .HS + .HS 0 + .AS "BCC" + .HS 0 + .HS 3,$90 + .HS 0 + .AS "BCS" + .HS 0 + .HS 3,$B0 + .HS 0 + .AS "BEQ" + .HS 0 + .HS + .HS 0 + .AS "BIT" + .HS 0 + .HS + .HS 0 + .AS "BMI" + .HS 0 + .HS + .HS 0 + .AS "BNE" + .HS 0 + .HS + .HS 0 + .AS "BPL" + .HS 0 + .HS + .HS 0 + .AS "BRK" + .HS 0 + .HS + .HS 0 + .AS "BVC" + .HS 0 + .HS + .HS 0 + .AS "BVS" + .HS 0 + .HS + .HS 0 + .AS "CLC" + .HS 0 + .HS + .HS 0 + .AS "CLD" + .HS 0 + .HS + .HS 0 + .AS "CLI" + .HS 0 + .HS + .HS 0 + .AS "CLV" + .HS 0 + .HS + .HS 0 + .AS "CMP" + .HS 0 + .HS + .HS 0 + .AS "CPX" + .HS 0 + .HS + .HS 0 + .AS "CPY" + .HS 0 + .HS + .HS 0 + .AS "DEC" + .HS 0 + .HS + .HS 0 + .AS "DEX" + .HS 0 + .HS + .HS 0 + .AS "DEY" + .HS 0 + .HS + .HS 0 + .AS "EOR" + .HS 0 + .HS + .HS 0 + .AS "INC" + .HS 0 + .HS + .HS 0 + .AS "INX" + .HS 0 + .HS + .HS 0 + .AS "INY" + .HS 0 + .HS + .HS 0 + .AS "JMP" + .HS 0 + .HS + .HS 0 + .AS "JSR" + .HS 0 + .HS + .HS 0 + .AS "LDA" + .HS 0 + .HS + .HS 0 + .AS "LDX" + .HS 0 + .HS + .HS 0 + .AS "LDY" + .HS 0 + .HS + .HS 0 + .AS "LSR" + .HS 0 + .HS + .HS 0 + .AS "NOP" + .HS 0 + .HS + .HS 0 + .AS "NOP" + .HS 0 + .HS + .HS 0 + .AS "ORA" + .HS 0 + .HS + .HS 0 + .AS "PHA" + .HS 0 + .HS + .HS 0 + .AS "PHP" + .HS 0 + .HS + .HS 0 + .AS "PLA" + .HS 0 + .HS + .HS 0 + .AS "ROL" + .HS 0 + .HS + .HS 0 + .AS "ROR" + .HS 0 + .HS + .HS 0 + .AS "RTI" + .HS 0 + .HS + .HS 0 + .AS "RTS" + .HS 0 + .HS + .HS 0 + .AS "SBC" + .HS 0 + .HS + .HS 0 + .AS "SEC" + .HS 0 + .HS + .HS 0 + .AS "SED" + .HS 0 + .HS + .HS 0 + .AS "SEI" + .HS 0 + .HS + .HS 0 + .AS "STA" + .HS 0 + .HS + .HS 0 + .AS "STX" + .HS 0 + .HS + .HS 0 + .AS "STY" + .HS 0 + .HS + .HS 0 + .AS "TAX" + .HS 0 + .HS + .HS 0 + .AS "TAY" + .HS 0 + .HS + .HS 0 + .AS "TSX" + .HS 0 + .HS + .HS 0 + .AS "TXA" + .HS 0 + .HS + .HS 0 + .AS "TXS" + .HS 0 + .HS + .HS 0 + .AS "TYA" + .HS 0 + .HS + .HS 0 +*--------------------------------------- + .HS 0 +MAN +SAVE /DATA/A2OS/BIN/ASM.T.6502.S +ASM diff --git a/BIN/ASM.T.65C02.S.txt b/BIN/ASM.T.65C02.S.txt new file mode 100644 index 00000000..b923005b --- /dev/null +++ b/BIN/ASM.T.65C02.S.txt @@ -0,0 +1,100 @@ +PR#3 +NEW +AUTO 6 + .TF /DATA/A2OS/BIN/ASM.T.65C02 + .OR $2000 +*--------------------------------------- + .MA AMS AMSID,"Syntax",0,"Operand",0,"Rule",0 + .DA #]1 + .AS ]2 + .DA #0 + .AS ]3 + .DA #0 + .AS ]4 + .DA #0 + .EM +*--------------------------------------- +T.ADDR.MODES.SYNTAX >AMS 1,"","","" Implicit + >AMS 2,"#$1",$1","" Immediate + >AMS 3,"$2","$1=$2-@+1","-127<$1<128" rel + >AMS 4,"$1","$1","" zp + >AMS 5,"$1,X","$1","" zp,x + >AMS 6,"$2","$2","" abs + >AMS 7,"$2,X","$2","" abs,x + >AMS 8,"$2,Y","$2","" abs,y + >AMS 9,"($2)","$2","" (abs) + >AMS 10,"($1)","$1","" (zp) + >AMS 11,"($1,X)","$1","" (zp,x) + >AMS 12,"($1),Y","$1","" (zp),x + +T.OPCODES .AS "ADC" + .HS 0 + .HS 2,$69,4,$65,5,$75,6,$6D,7,$7D,8,$79,11,$61,12,$71 + .HS 0 + .AS "AND" + .AS "ASL" + .AS "BCC" + .HS 0 + .HS 3,$90 + .HS 0 + .AS "BCS" + .HS 0 + .HS 3,$B0 + .HS 0 + .AS "BEQ" + .AS "BIT" + .AS "BMI" + .AS "BNE" + .AS "BPL" + .AS "BRK" + .AS "BVC" + .AS "BVS" + .AS "CLC" + .AS "CLD" + .AS "CLI" + .AS "CLV" + .AS "CMP" + .AS "CPX" + .AS "CPY" + .AS "DEC" + .AS "DEX" + .AS "DEY" + .AS "EOR" + .AS "INC" + .AS "INX" + .AS "INY" + .AS "JMP" + .AS "JSR" + .AS "LDA" + .AS "LDX" + .AS "LDY" + .AS "LSR" + .AS "NOP" + .AS "NOP" + .AS "ORA" + .AS "PHA" + .AS "PHP" + .AS "PLA" + .AS "ROL" + .AS "ROR" + .AS "RTI" + .AS "RTS" + .AS "SBC" + .AS "SEC" + .AS "SED" + .AS "SEI" + .AS "STA" + .AS "STX" + .AS "STY" + .AS "TAX" + .AS "TAY" + .AS "TSX" + .AS "TXA" + .AS "TXS" + .AS "TYA" +*--------------------------------------- + .HS 0 +MAN +SAVE /DATA/A2OS/BIN/ASM.T.65C02.S +ASM + \ No newline at end of file diff --git a/BIN/ASM.T.Z80.S.txt b/BIN/ASM.T.Z80.S.txt new file mode 100644 index 00000000..d962e1fc --- /dev/null +++ b/BIN/ASM.T.Z80.S.txt @@ -0,0 +1,36 @@ +PR#3 +NEW +AUTO 6 + .TF /DATA/A2OS/BIN/ASM.T.Z80 + .OR $2000 +*--------------------------------------- + .MA AMS AMSID,"Syntax",0,"Operand",0,"Rule",0 + .DA #]1 + .AS ]2 + .DA #0 + .AS ]3 + .DA #0 + .AS ]4 + .DA #0 + .EM + .DA T.ADDR.MODES.SYNTAX + .DA T.OPCODES +*--------------------------------------- +T.ADDR.MODES.SYNTAX >AMS 1,"","","" Implicit + >AMS 2,"#$1",$1","" Immediate8 + >AMS 3,"#$2",$2","" Immediate16 + >AMS 4, Modified zp + >AMS 3,"$2","$1=$2-@+1","-127<$1<128" rel + >AMS 6,"$2","$2","" abs + +*--------------------------------------- +T.OPCODES .AS "ADC" + .HS 0 + .HS 2,$69,4,$65,5,$75,6,$6D,7,$7D,8,$79,11,$61,12,$71 + .HS 0 +*--------------------------------------- + .HS 0 +MAN +SAVE /DATA/A2OS/BIN/ASM.T.Z80.S +ASM + \ No newline at end of file diff --git a/BIN/CHMOD.S.txt b/BIN/CHMOD.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/BIN/CHTYP.S.txt b/BIN/CHTYP.S.txt new file mode 100644 index 00000000..ce552a41 --- /dev/null +++ b/BIN/CHTYP.S.txt @@ -0,0 +1,401 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/CHTYP +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/LIBSTR.I +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIB.LIBSTR .DA LIB.LIBSTR +L.MSG.VOL.HEADER .DA MSG.VOL.HEADER +L.MSG.DIR.HEADER .DA MSG.DIR.HEADER +L.MSG.VOL .DA MSG.VOL +L.MSG.DIR .DA MSG.DIR +L.MSG.FILE .DA MSG.FILE +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 + sta hLIBSTR + stz hDIRPATH + stz hS.LISTDIR + stz hVOLHEADER + stz hDIRHEADER + stz bSTOP + stz bCANCEL + + ldy #S.PS.hARGS + lda (pPsContext),y + beq .99 no arg, exit with err=0 + + >PUSHA + >PUSHBI $20 Push SEP=' ' + >PUSHBI 1 Push 1 for getting First arg + >SYSCALL SYS.PStrGetTkn + bcs .99 error, exit with error code + sta hArg + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + beq .99 + ldy #1 + lda (ZPQuickPtr1),y + cmp #'$' is it a TYPE ? + bne .11 + + +.11 cmp #'/' + bne .10 + ldy #S.PS.hARGS + bra .2 + +.10 ldy #S.PS.hARGS + lda (pPsContext),y + >PUSHA + ldy #S.PS.hPREFIX + lda (pPsContext),y + >PUSHA + >SYSCALL SYS.PStrCat + sta hDIRPATH + bra .3 + +.1 ldy #S.PS.hPREFIX +.2 lda (pPsContext),y + +.3 >SYSCALL SYS.ListDirInitA + bcs .98 + sta hS.LISTDIR + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + clc + rts + +.98 pha + lda hLIBSTR + >SYSCALL SYS.FreeMemA + pla +.99 sec + rts +*-------------------------------------- +CS.RUN lda bCANCEL + beq .1 + sec + rts + +.1 lda bSTOP + beq .2 + clc + rts + +.2 lda hS.LISTDIR + >SYSCALL SYS.ListDirNextA + bcc .3 + + jmp Push.Footer + +.3 pha + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + pha + + and #$0F + sta (ZPQuickPtr1) Adjust Filename len + + pla + and #$F0 + cmp #$F0 Volume ($F) HEADER ? + bne .31 + + pla + sta hVOLHEADER + >PUSHW ZPQuickPtr1 + >PUSHW L.MSG.VOL.HEADER + >LIBCALL hLIBSTR,LIBSTR.PRINTF + clc + rts + +.31 cmp #$E0 Dir ($E) HEADER ? + bne .4 + + pla + sta hDIRHEADER + + >PUSHW ZPQuickPtr1 + >PUSHW L.MSG.DIR.HEADER + >LIBCALL hLIBSTR,LIBSTR.PRINTF + clc + rts + +.4 cmp #$D0 Directory ? + bne .5 + jsr Push.Dates + jsr Push.Dir + >PUSHW L.MSG.DIR + bra .8 + +.5 cmp #$C0 Volume Name ? + bne .6 + + >PUSHW ZPQuickPtr1 + >PUSHW L.MSG.VOL + bra .8 + +.6 jsr Push.Dates File + jsr Push.File + >PUSHW L.MSG.FILE + +.8 >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.9 pla + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +Push.Dir ldy #$1E get access mask + lda (ZPQuickPtr1),y + >PUSHA + >PUSHW ZPQuickPtr1 + rts +*-------------------------------------- +Push.File >PUSHBI 0 4th byte of file len=0 + ldy #$17 get file len (3 bytes) + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + ldy #$1E get access mask + lda (ZPQuickPtr1),y + >PUSHA + + ldy #$20 get aux type + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + ldy #$10 get filetype + + lda L.PRODOS.FT.TXT + sta ZPQuickPtr2 + lda L.PRODOS.FT.TXT+1 + sta ZPQuickPtr2+1 + ldx #0 + +.1 lda (ZPQuickPtr1),y + cmp PRODOS.FT.ID,x + beq .3 + lda ZPQuickPtr2 + clc + adc #4 + sta ZPQuickPtr2 + bcc .2 + inc ZPQuickPtr2+1 +.2 inx + cpx PRODOS.FT.COUNT + bne .1 + + lda (ZPQuickPtr1),y + lsr + lsr + lsr + lsr + tax + lda HEXDIGIT,x + sta PRODOS.FT.DFLT+2 + lda (ZPQuickPtr1),y + and #$0F + tax + lda HEXDIGIT,x + sta PRODOS.FT.DFLT+3 + +.3 >PUSHW ZPQuickPtr2 + >PUSHW ZPQuickPtr1 + >LIBCALL hLIBSTR,LIBSTR.LCASEP + >PUSHW ZPQuickPtr1 + rts +*-------------------------------------- +Push.Dates ldy #$24 get modification time + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + ldy #$22 + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + ldy #$1B get creation time + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + ldy #$19 + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + rts +*-------------------------------------- +Push.Footer lda hVOLHEADER + beq .20 + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + + ldy #22 file_count + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + >PUSHW L.MSG.VOL.END + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.20 lda hDIRHEADER + beq .21 + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + + ldy #22 file_count + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + >PUSHW L.MSG.DIR.END + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.21 sec + rts +*-------------------------------------- +CS.DOEVENT 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 .8 + lda bSTOP + eor #$FF + sta bSTOP +.8 >SYSCALL SYS.DestroyEvent + clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT lda hVOLHEADER + beq .1 + + >SYSCALL SYS.FreeMemA + +.1 lda hDIRHEADER + beq .2 + + >SYSCALL SYS.FreeMemA + +.2 lda hS.LISTDIR + >SYSCALL SYS.ListDirCloseA + + lda hDIRPATH + beq .3 + >SYSCALL SYS.FreeMemA + +.3 lda hLIBSTR + >SYSCALL SYS.UnloadLibA + + clc + rts +*-------------------------------------- +CS.END +LIB.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" +MSG.DIR >CSTRING "/%15S %a %T %t %T %t\n" +MSG.FILE >CSTRING "%15S %S $%H %a %8L %T %t %T %t\n" +MSG.VOL.END >CSTRING "%D Files In Volume.\n" +MSG.DIR.END >CSTRING "%D Files In Directory.\n" +*-------------------------------------- +PRODOS.FT.COUNT .HS 07 +PRODOS.FT.ID .HS 0406FAFCFDE2FF +PRODOS.FT.TXT +T04 >PSTRING "TXT" +T06 >PSTRING "BIN" +TFA >PSTRING "S-C" +TFC >PSTRING "BAS" +TFD >PSTRING "VAR" +TE2 >PSTRING "ATK" +TFF >PSTRING "SYS" +PRODOS.FT.DFLT >PSTRING "$ " +HEXDIGIT .AS '0123456789ABCDEF' +*-------------------------------------- +DS.START +hLIBSTR .BS 1 +hDIRPATH .BS 1 +hS.LISTDIR .BS 1 +hVOLHEADER .BS 1 +hDIRHEADER .BS 1 +bSTOP .BS 1 +bCANCEL .BS 1 +DS.END +*-------------------------------------- +MAN +SAVE BIN/CHTYP.S +ASM diff --git a/BIN/DNS.S.txt b/BIN/DNS.S.txt new file mode 100644 index 00000000..c7e81c93 --- /dev/null +++ b/BIN/DNS.S.txt @@ -0,0 +1,183 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST ON + .OP 65C02 + .OR $2000 + .TF BIN/DNS +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBSTR.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +ZPPTR1 .EQ ZPBIN +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .DA CS.QUIT +L.LIBSTR .DA LIBSTR +L.LIBTCPIP .DA LIBTCPIP +L.SSCANF.IP .DA SSCANF.IP +L.IP .DA IP +L.MSG0 .DA MSG0 +L.MSG1 .DA MSG1 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segment to Allocate +*-------------------------------------- +CS.INIT stz hHostName + stz hIP + + >LIBLOADP L.LIBSTR + sta hLIBSTR + + >LIBLOADP L.LIBTCPIP + sta hLIBTCPIP + + ldy #S.PS.hARGS + lda (pPsContext),y + bne CS.INIT.ADD + jmp CS.INIT.DUMP + +CS.INIT.ADD >PUSHA + >PUSHBI $20 Push SEP=' ' + >PUSHBI 1 Push 1 for getting hostname + >SYSCALL SYS.PStrGetTkn + bcs .91 + sta hHostName + + ldy #S.PS.hARGS + lda (pPsContext),y + >PUSHA + >PUSHBI $20 Push SEP=' ' + >PUSHBI 2 Push 2 for getting IP + >SYSCALL SYS.PStrGetTkn +.91 bcs .9 + + sta hIP + >PUSHW L.IP + >PUSHW L.SSCANF.IP + lda hIP + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.SSCANF + bcs .9 + + >PUSHWI 1800 default TTL + >PUSHW L.IP + >PUSHB hHostName + >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.ADD + bcs .99 + + lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory + rts + +.9 lda #SYSMGR.ERRSYN + sec +.99 rts + +CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE + >STYA ZPPTR1 + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldx #K.DNSCACHE.SIZE +.1 phx + lda (ZPPTR1) + beq .2 + + ldy #S.DNSCACHE.IP+3 + lda (ZPPTR1),y + >PUSHA + dey + lda (ZPPTR1),y + >PUSHA + dey + lda (ZPPTR1),y + >PUSHA + dey + lda (ZPPTR1),y + >PUSHA + + ldy #S.DNSCACHE.TTL + lda (ZPPTR1),y + pha + iny + lda (ZPPTR1),y + ply + >PUSHYA + + ldy #S.DNSCACHE.hNAME + lda (ZPPTR1),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + + >PUSHB (ZPPTR1) + + >PUSHW L.MSG1 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.2 lda ZPPTR1 + clc + adc #S.DNSCACHE + sta ZPPTR1 + bcc .3 + inc ZPPTR1+1 +.3 plx + dex + bne .1 + + lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory + rts +*-------------------------------------- +CS.RUN +CS.EVENT clc + rts +*-------------------------------------- +CS.QUIT lda hHostName + beq .1 + >SYSCALL SYS.FreeMemA +.1 lda hIP + beq .2 + >SYSCALL SYS.FreeMemA +.2 lda hLIBTCPIP + >SYSCALL SYS.UnloadLibA + lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +CS.END +LIBSTR >PSTRING "libstr.o" +LIBTCPIP >PSTRING "libtcpip.o" +SSCANF.IP >PSTRING "%d.%d.%d.%d" +MSG0 >CSTRING "STS Hostname TTL IP Address\n" +MSG1 >CSTRING "$%h %32S %05D %d.%d.%d.%d\n" +DS.START +hLIBSTR .BS 1 +hLIBTCPIP .BS 1 +hHostName .BS 1 +hIP .BS 1 +IP .BS 4 +DS.END +MAN +SAVE BIN/DNS.S +ASM diff --git a/BIN/EDIT.S.txt b/BIN/EDIT.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/BIN/KILL.S.txt b/BIN/KILL.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt new file mode 100644 index 00000000..df8dd0b2 --- /dev/null +++ b/BIN/LS.S.txt @@ -0,0 +1,389 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/LS +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/LIBSTR.I +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIB.LIBSTR .DA LIB.LIBSTR +L.MSG.VOL.HEADER .DA MSG.VOL.HEADER +L.MSG.DIR.HEADER .DA MSG.DIR.HEADER +L.MSG.VOL .DA MSG.VOL +L.MSG.DIR .DA MSG.DIR +L.MSG.FILE .DA MSG.FILE +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 + sta hLIBSTR + stz hDIRPATH + stz hS.LISTDIR + stz hVOLHEADER + stz hDIRHEADER + stz bSTOP + stz bCANCEL + + ldy #S.PS.hARGS + lda (pPsContext),y + beq .1 + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + beq .1 + ldy #1 + lda (ZPQuickPtr1),y + cmp #'/' + bne .10 + ldy #S.PS.hARGS + bra .2 + +.10 ldy #S.PS.hARGS + lda (pPsContext),y + >PUSHA + ldy #S.PS.hPREFIX + lda (pPsContext),y + >PUSHA + >SYSCALL SYS.PStrCat + sta hDIRPATH + bra .3 + +.1 ldy #S.PS.hPREFIX +.2 lda (pPsContext),y + +.3 >SYSCALL SYS.ListDirInitA + bcs .98 + sta hS.LISTDIR + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + clc + rts + +.98 pha + lda hLIBSTR + >SYSCALL SYS.FreeMemA + pla + sec + rts +*-------------------------------------- +CS.RUN lda bCANCEL + beq .1 + sec + rts + +.1 lda bSTOP + beq .2 + clc + rts + +.2 lda hS.LISTDIR + >SYSCALL SYS.ListDirNextA + bcc .3 + + jmp Push.Footer + +.3 pha + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + pha + + and #$0F + sta (ZPQuickPtr1) Adjust Filename len + + pla + and #$F0 + cmp #$F0 Volume ($F) HEADER ? + bne .31 + + pla + sta hVOLHEADER + >PUSHW ZPQuickPtr1 + >PUSHW L.MSG.VOL.HEADER + >LIBCALL hLIBSTR,LIBSTR.PRINTF + clc + rts + +.31 cmp #$E0 Dir ($E) HEADER ? + bne .4 + + pla + sta hDIRHEADER + + >PUSHW ZPQuickPtr1 + >PUSHW L.MSG.DIR.HEADER + >LIBCALL hLIBSTR,LIBSTR.PRINTF + clc + rts + +.4 cmp #$D0 Directory ? + bne .5 + jsr Push.Dates + jsr Push.Dir + >PUSHW L.MSG.DIR + bra .8 + +.5 cmp #$C0 Volume Name ? + bne .6 + + >PUSHW ZPQuickPtr1 + >PUSHW L.MSG.VOL + bra .8 + +.6 jsr Push.Dates File + jsr Push.File + >PUSHW L.MSG.FILE + +.8 >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.9 pla + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +Push.Dir ldy #$1E get access mask + lda (ZPQuickPtr1),y + >PUSHA + >PUSHW ZPQuickPtr1 + rts +*-------------------------------------- +Push.File >PUSHBI 0 4th byte of file len=0 + ldy #$17 get file len (3 bytes) + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + ldy #$1E get access mask + lda (ZPQuickPtr1),y + >PUSHA + + ldy #$20 get aux type + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + ldy #$10 get filetype + + lda L.PRODOS.FT.TXT + sta ZPQuickPtr2 + lda L.PRODOS.FT.TXT+1 + sta ZPQuickPtr2+1 + ldx #0 + +.1 lda (ZPQuickPtr1),y + cmp PRODOS.FT.ID,x + beq .3 + lda ZPQuickPtr2 + clc + adc #4 + sta ZPQuickPtr2 + bcc .2 + inc ZPQuickPtr2+1 +.2 inx + cpx PRODOS.FT.COUNT + bne .1 + + lda (ZPQuickPtr1),y + lsr + lsr + lsr + lsr + tax + lda HEXDIGIT,x + sta PRODOS.FT.DFLT+2 + lda (ZPQuickPtr1),y + and #$0F + tax + lda HEXDIGIT,x + sta PRODOS.FT.DFLT+3 + +.3 >PUSHW ZPQuickPtr2 + >PUSHW ZPQuickPtr1 + >LIBCALL hLIBSTR,LIBSTR.LCASEP + >PUSHW ZPQuickPtr1 + rts +*-------------------------------------- +Push.Dates ldy #$24 get modification time + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + ldy #$22 + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + ldy #$1B get creation time + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + ldy #$19 + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + rts +*-------------------------------------- +Push.Footer lda hVOLHEADER + beq .20 + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + + ldy #22 file_count + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + >PUSHW L.MSG.VOL.END + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.20 lda hDIRHEADER + beq .21 + + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + + ldy #22 file_count + lda (ZPQuickPtr1),y + >PUSHA + dey + lda (ZPQuickPtr1),y + >PUSHA + + >PUSHW L.MSG.DIR.END + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.21 sec + rts +*-------------------------------------- +CS.DOEVENT 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 .8 + lda bSTOP + eor #$FF + sta bSTOP +.8 >SYSCALL SYS.DestroyEvent + clc + rts + +.9 sec + rts +*-------------------------------------- +CS.QUIT lda hVOLHEADER + beq .1 + + >SYSCALL SYS.FreeMemA + +.1 lda hDIRHEADER + beq .2 + + >SYSCALL SYS.FreeMemA + +.2 lda hS.LISTDIR + >SYSCALL SYS.ListDirCloseA + + lda hDIRPATH + beq .3 + >SYSCALL SYS.FreeMemA + +.3 lda hLIBSTR + >SYSCALL SYS.UnloadLibA + + clc + rts +*-------------------------------------- +CS.END +LIB.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" +MSG.DIR >CSTRING "/%15S %a %T %t %T %t\n" +MSG.FILE >CSTRING "%15S %S $%H %a %8L %T %t %T %t\n" +MSG.VOL.END >CSTRING "%D Files In Volume.\n" +MSG.DIR.END >CSTRING "%D Files In Directory.\n" +*-------------------------------------- +PRODOS.FT.COUNT .HS 07 +PRODOS.FT.ID .HS 0406FAFCFDE2FF +PRODOS.FT.TXT +T04 >PSTRING "TXT" +T06 >PSTRING "BIN" +TFA >PSTRING "S-C" +TFC >PSTRING "BAS" +TFD >PSTRING "VAR" +TE2 >PSTRING "ATK" +TFF >PSTRING "SYS" +PRODOS.FT.DFLT >PSTRING "$ " +HEXDIGIT .AS '0123456789ABCDEF' +*-------------------------------------- +DS.START +hLIBSTR .BS 1 +hDIRPATH .BS 1 +hS.LISTDIR .BS 1 +hVOLHEADER .BS 1 +hDIRHEADER .BS 1 +bSTOP .BS 1 +bCANCEL .BS 1 +DS.END +*-------------------------------------- +MAN +SAVE BIN/LS.S +ASM diff --git a/BIN/LSDEV.S.txt b/BIN/LSDEV.S.txt new file mode 100644 index 00000000..db56a5d5 --- /dev/null +++ b/BIN/LSDEV.S.txt @@ -0,0 +1,139 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/LSDEV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBSTR.I +*-------------------------------------- +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .DA CS.QUIT +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 + sta hLIBSTR + + >SYSCALL SYS.GetDevTable + >STYA ZPPTR1 + stz DEV.COUNT + +L0 >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 + +L12 >PUSHW L.MSG2 + +L13 lda ZPPTR1 + clc + adc #S.DEV.NAME + sta ZPPTR2 + lda ZPPTR1+1 + adc #0 + sta ZPPTR2+1 + >PUSHW ZPPTR2 + + ldy #S.DEV.hOWNERPS + lda (ZPPTR1),y + >PUSHA Owner PSID + lda (ZPPTR1) push flags + >PUSHA + ldy #S.DEV.ID + lda (ZPPTR1),y + >PUSHA DevID + >PUSHW L.MSG1 + >LIBCALL hLIBSTR,LIBSTR.PRINTF +L4 dec LINE.COUNT +L41 lda ZPPTR1 + clc + adc #S.DEV.SIZE + sta ZPPTR1 + bcc L5 + inc ZPPTR1+1 +L5 inc DEV.COUNT + lda DEV.COUNT + cmp #K.DEV.MAX + beq L8 + lda LINE.COUNT + beq L6 + jmp L1 +L6 >DEBUG + jmp L0 + +L8 lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory + rts +*-------------------------------------- +CS.RUN +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)" +MAN +SAVE BIN/LSDEV.S +ASM diff --git a/BIN/MEM.S.txt b/BIN/MEM.S.txt new file mode 100644 index 00000000..e436fb0e --- /dev/null +++ b/BIN/MEM.S.txt @@ -0,0 +1,285 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/MEM +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/LIBSTR.I +*-------------------------------------- +ZPPTR1 .EQ ZPBIN +ZPPTR2 .EQ ZPBIN+2 +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIBSTR .DA LIBSTR +L.MSG0 .DA MSG0 +L.MSG1 .DA MSG1 +L.MSG2 .DA MSG2 +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 + bcs .9 + sta hLIBSTR + + stz LINE.COUNT + stz MEM.COUNT + stz USED.COUNT + stz bSTOP + stz bCANCEL + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + clc +.9 rts +*-------------------------------------- +CS.RUN lda bCANCEL + bne .99 + lda bSTOP + bne .8 + lda LINE.COUNT + bne .1 + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.1 lda MEM.COUNT + >SYSCALL SYS.GetMemByIDA + >STYA ZPPTR1 + lda (ZPPTR1) + bpl .2 + inc USED.COUNT +.2 jsr CS.RUN.PRINTMEM + + inc MEM.COUNT + lda MEM.COUNT + cmp MEMMGR.TABLESIZE + beq .9 + +.8 + clc + rts + +.9 jsr CS.RUN.PRINTEND +.99 sec + rts +*-------------------------------------- +CS.RUN.PRINTMEM ldy #S.MEM.LEN + lda (ZPPTR1),y + pha + iny + lda (ZPPTR1),y + ply + >PUSHYA + ldy #S.MEM.PTR + lda (ZPPTR1),y + pha + iny + 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 + >PUSHA + >PUSHW L.MSG1 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + ldy #S.MEM.BIN + lda (ZPPTR1),y + bne .3 + + ldy #S.MEM.PTR + lda (ZPPTR1),y + sta ZPPTR2 + iny + lda (ZPPTR1),y + sta ZPPTR2+1 + lda #"{" + jsr COUT + lda (ZPPTR2) + jsr PRBYTE + 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 + +.3 >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.PRINTP + +.4 jsr CROUT + inc LINE.COUNT + lda LINE.COUNT + cmp #22 + bne .5 + lda #$FF + sta bSTOP + stz LINE.COUNT +.5 rts +*-------------------------------------- +CS.RUN.PRINTEND >PUSHB MEM.COUNT + >PUSHB USED.COUNT + >PUSHW L.MSG2 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + >PUSHW MEMMGR.LOMEM + >PUSHW L.MSG3 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + >PUSHW MEMMGR.MLLIMIT + >PUSHW L.MSG4 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + >PUSHW MEMMGR.MHLIMIT + >PUSHW L.MSG5 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + >PUSHW MEMMGR.HIMEM + >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 + 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 + >PUSHA + ldy #S.PS.hOUTDEV + lda (pPsContext),y + >SYSCALL SYS.DevOutA + ply + plx + rts +*-------------------------------------- +CS.END +DS.START +*-------------------------------------- +hLIBSTR .BS 1 +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 +*-------------------------------------- +MAN +SAVE BIN/MEM.S +ASM diff --git a/BIN/MOUNT.S.txt b/BIN/MOUNT.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/BIN/NETCFG.S.txt b/BIN/NETCFG.S.txt new file mode 100644 index 00000000..e01ad39c --- /dev/null +++ b/BIN/NETCFG.S.txt @@ -0,0 +1,206 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/NETCFG +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBSTR.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +ZPPTR1 .EQ ZPBIN +ZPPTR2 .EQ ZPBIN+2 +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIBSTR .DA LIBSTR +L.MSG0 .DA MSG0 +L.MSG0.0 .DA MSG0.0 +L.MSG0.1 .DA MSG0.1 +L.MSG0.2 .DA MSG0.2 +L.MSG0.N .DA MSG0.N +L.MSG0.U .DA MSG0.U +L.MSG0.C .DA MSG0.C +L.MSG1.DEV .DA MSG1.DEV +L.MSG1.DHCPSRVR .DA MSG1.DHCPSRVR +L.MSG1.IP .DA MSG1.IP +L.MSG1.GW .DA MSG1.GW +L.MSG1.DNS .DA MSG1.DNS +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 + sta hLIBSTR + + lda #K.PROTOID.IP + >SYSCALL SYS.GetNetCfgA + bcc CS.INIT.LOADED + + >PUSHW L.MSG0.N + >PUSHW L.MSG0.2 + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + jmp CS.INIT.END + +CS.INIT.LOADED >STYA ZPPTR1 + + ldy #S.IPCFG.STATUS + lda (ZPPTR1),y + bmi CS.INIT.CONFOK + + >PUSHW L.MSG0.U + >PUSHW L.MSG0.2 + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + jsr CS.INIT.DEV.MAC + jmp CS.INIT.END + +CS.INIT.CONFOK >PUSHW L.MSG0.C + >PUSHW L.MSG0.2 + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + jsr CS.INIT.DEV.MAC + + ldy #S.IPCFG.DHCPSRVR+3 + ldx #4 +L1 >PUSHB (ZPPTR1),y + dey + dex + bne L1 + >PUSHW L.MSG1.DHCPSRVR + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #S.IPCFG.IP+7 IP/MASK + ldx #8 +L2 >PUSHB (ZPPTR1),y + dey + dex + bne L2 + >PUSHW L.MSG1.IP + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #S.IPCFG.GW+3 + ldx #4 +L4 >PUSHB (ZPPTR1),y + dey + dex + bne L4 + >PUSHW L.MSG1.GW + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #S.IPCFG.DNS+7 + ldx #8 +L5 >PUSHB (ZPPTR1),y + dey + dex + bne L5 + >PUSHW L.MSG1.DNS + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + lda ZPPTR1 + clc + adc #S.IPCFG.HOSTNAME + tay + lda ZPPTR1+1 + adc #0 + >PUSHYA + >PUSHW L.MSG1.HOSTNAME + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #S.IPCFG.DOMAIN + lda (ZPPTR1),y + beq L6 + + lda ZPPTR1 + clc + adc #S.IPCFG.DOMAIN + tay + lda ZPPTR1+1 + adc #0 + >PUSHYA + >PUSHW L.MSG1.DOMAIN + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +L6 >PUSHW L.MSG1.END + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + +CS.INIT.END lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory + rts +*-------------------------------------- +CS.INIT.DEV.MAC ldy #S.IPCFG.MAC+6 +.1 dey + >PUSHB (ZPPTR1),y + cpy #S.IPCFG.MAC + bne .1 + + ldy #S.IPCFG.hDEV + >PUSHB (ZPPTR1),y + + >PUSHW L.MSG1.DEV + + >LIBCALL hLIBSTR,LIBSTR.PRINTF + rts +*-------------------------------------- +CS.RUN clc + rts +*-------------------------------------- +CS.DOEVENT clc + rts +*-------------------------------------- +CS.QUIT lda hLIBSTR + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +CS.END +LIBSTR >PSTRING "libstr.o" +MSG0 >CSTRING "Protocol:%s (%s)\n" +MSG0.0 >CSTRING "AppleTalk" +MSG0.1 >CSTRING "EtherTalk" +MSG0.2 >CSTRING "TCP/IP" +MSG0.N >CSTRING "Not Loaded" +MSG0.U >CSTRING "Unconfigured" +MSG0.C >CSTRING "Configured" +MSG1.DEV >CSTRING " DeviceID : %h,MAC=%02h:%02h:%02h:%02h:%02h:%02h\n" +MSG1.DHCPSRVR >CSTRING " DHCP Server : %d.%d.%d.%d\n" +MSG1.IP >CSTRING " IP/Mask : %d.%d.%d.%d/%d.%d.%d.%d\n" +MSG1.GW >CSTRING " Gateway : %d.%d.%d.%d\n" +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/NTPDATE.S.txt b/BIN/NTPDATE.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt new file mode 100644 index 00000000..9db419e0 --- /dev/null +++ b/BIN/PING.S.txt @@ -0,0 +1,367 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/PING +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBSTR.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +PING.TIMEOUT .EQ 40 40*100ms = 4 sec. +*-------------------------------------- +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .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 + bne .1 + lda #SYSMGR.ERRSYN + sec + rts + +.1 >LIBLOADP L.LIBSTR + sta hLIBSTR + + >LIBLOADP L.LIBTCPIP + sta hLIBTCPIP + + >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? + bcs .9 + >STYA ZPQuickPtr1 + + lda (ZPQuickPtr1) Configured ? + bpl .9 + + ldy #S.IPCFG.HDEV + lda (ZPQuickPtr1),y + sta hDev + + lda A2OSX.RANDOM16 + sta Identifier + lda A2OSX.RANDOM16+1 + sta Identifier+1 + + stz Sequence + stz Sequence+1 + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + clc + +.9 rts +*-------------------------------------- +CS.RUN >PUSHW L.DST.IP + >PUSHW L.SSCANF.IP + ldy #S.PS.hARGS + lda (pPsContext),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 #S.PS.hARGS + lda (pPsContext),y + >PUSHA + >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY + bcc CS.RUN.IPOK + + jsr A2osX.SLEEP + lda TimeOut + bne CS.RUN.DNSQUERY + + ldy #S.PS.hARGS + lda (pPsContext),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + sec +CS.RUN.RTS rts + +CS.RUN.IPOK ldy #S.PS.hARGS + lda (pPsContext),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHB DST.IP+3 + >PUSHB DST.IP+2 + >PUSHB DST.IP+1 + >PUSHB 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 + + ldx #3 + ldy #S.IP.DST+3 +.1 lda DST.IP,x + sta (ZPFrameBase1),y + dey + dex + bpl .1 + + ldy #S.ICMP.TYPE + lda #S.ICMP.TYPE.ECHOREQ + sta (ZPFrameBase1),y + + ldy #S.ICMP.IDENTIFIER + lda Identifier + sta (ZPFrameBase1),y + iny + lda Identifier+1 + sta (ZPFrameBase1),y + + inc Sequence + bne .2 + inc Sequence+1 + +.2 ldy #S.ICMP.SEQUENCE + lda Sequence + sta (ZPFrameBase1),y + iny + lda Sequence+1 + sta (ZPFrameBase1),y + + lda #PING.TIMEOUT + sta TimeOut + +.3 >PUSHWI S.ICMP+32 + lda hFrame + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ICMP.FRAME + bcc .4 + jsr A2osX.SLEEP + lda TimeOut + bne .3 + +.4 lda hFrame + >SYSCALL SYS.FreeMemA + + stz bReply + lda #PING.TIMEOUT + sta TimeOut + +CS.RUN.WAIT jsr A2osX.SLEEP + lda bReply + bne .1 + + lda bCTRLC + bne CS.RUN.ERROR + lda TimeOut + bne CS.RUN.WAIT + + >PUSHB DST.IP+3 + >PUSHB DST.IP+2 + >PUSHB DST.IP+1 + >PUSHB DST.IP + >PUSHW L.MSG2 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + +.1 lda bCTRLC + bne CS.RUN.ERROR + lda TimeOut + beq .2 + + jsr A2osX.SLEEP + bra .1 + +.2 jmp CS.RUN.ECHO + +CS.RUN.ERROR sec + rts +*-------------------------------------- +CS.EVENT lda (pEvent) + and #S.EVT.F.TIMER is it a TIMER event? + beq .1 no.... + + lda TimeOut + beq .10 + + dec TimeOut +.10 sec do not discard TIMER event + rts + +.1 lda (pEvent) + and #S.EVT.F.KEY is it a KEY event? + beq .2 + + ldy #S.EVT.hDEV is Event from active IN device? + lda (pEvent),y + ldy #S.PS.hINDEV + cmp (pPsContext),y + bne .9 + + ldy #S.EVT.DATAHI is it an O or SAPPLE key ? + lda (pEvent),y + bne .9 + + ldy #S.EVT.DATALO + lda (pEvent),y + cmp #$03 Ctrl-C + bne .8 + + lda #$FF + sta bCTRLC + bra .8 + +.2 lda (pEvent) + and #S.EVT.F.NET + beq .9 + + ldy #S.EVT.hDEV + lda (pEvent),y + cmp hDev + bne .9 + + ldy #S.EVT.DATALO Get Frame hMem + lda (pEvent),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPFrameBase1 + + ldy #S.IP.PROTOCOL + lda (ZPFrameBase1),y + cmp #S.IP.PROTOCOL.ICMP + + bne .9 + + ldy #S.ICMP.TYPE + lda (ZPFrameBase1),y + cmp #S.ICMP.TYPE.ECHOREP + bne .9 + + ldy #S.ICMP.IDENTIFIER + lda (ZPFrameBase1),y + cmp Identifier + bne .9 + iny + lda (ZPFrameBase1),y + cmp Identifier+1 + bne .9 + jsr CS.EVENT.REPLY +.8 >SYSCALL SYS.DestroyEvent + clc + rts + +.9 sec + rts +*-------------------------------------- +CS.EVENT.REPLY lda #PING.TIMEOUT + sec + sbc TimeOut + + stz TimeOut.ms + stz TimeOut.ms+1 + + tay + beq .3 + +.1 lda TimeOut.ms + clc + adc #K.TIMER16RESOLUTION*20 + sta TimeOut.ms + bcc .2 + inc TimeOut+1+1 +.2 dey + bne .1 + +.3 >PUSHW TimeOut.ms + ldy #S.IP.TTL + >PUSHB (ZPFrameBase1),y + + ldy #S.ICMP.SEQUENCE+1 + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + + ldy #S.IP.SRC+3 + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + dey + >PUSHB (ZPFrameBase1),y + + >PUSHW L.MSG3 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + inc bReply + rts +*-------------------------------------- +CS.QUIT lda hLIBTCPIP + >SYSCALL SYS.UnloadLibA + lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +CS.END +LIBSTR >PSTRING "libstr.o" +LIBTCPIP >PSTRING "libtcpip.o" +SSCANF.IP >PSTRING "%d.%d.%d.%d" +MSG0 >CSTRING "%S: Unknown host\n" +MSG1 >CSTRING "PING %d.%d.%d.%d (%S)\n" +MSG2 >CSTRING "%d.%d.%d.%d: TimeOut/Host unreachable\n" +MSG3 >CSTRING "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\n" +*-------------------------------------- +DS.START +hLIBSTR .BS 1 +hLIBTCPIP .BS 1 +hDev .BS 1 +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 +*-------------------------------------- +MAN +SAVE BIN/PING.S +ASM diff --git a/BIN/PS.S.txt b/BIN/PS.S.txt new file mode 100644 index 00000000..36135775 --- /dev/null +++ b/BIN/PS.S.txt @@ -0,0 +1,114 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/PS +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBSTR.I +*-------------------------------------- +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +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 + sta hLibStr + + >LDYAI TSKMGR.TABLE + >STYA ZPPTR1 + stz PS.COUNT + + >PUSHW L.MSG0 + >LIBCALL hLibStr,LIBSTR.PRINTF + +.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 + >PUSHYA + + ldy #S.PS.PID + lda (ZPPTR1),y + >PUSHA Parent PID + + lda (ZPPTR1) push flags + >PUSHA + + ldy #S.PS.ID + lda (ZPPTR1),y + >PUSHA DevID + >PUSHW L.MSG1 + >LIBCALL hLibStr,LIBSTR.PRINTF + +.4 lda ZPPTR1 + clc + adc #S.PS.SIZE + sta ZPPTR1 + bcc .5 + inc ZPPTR1+1 +.5 inc PS.COUNT + lda PS.COUNT + cmp #K.PS.MAX + beq .8 + jmp .1 + +.8 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 +*-------------------------------------- +CS.QUIT lda hLibStr + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +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" +MSG2 >PSTRING "(none)" +MAN +SAVE BIN/PS.S +ASM diff --git a/BIN/TEST.S.txt b/BIN/TEST.S.txt new file mode 100644 index 00000000..9bb38ff0 --- /dev/null +++ b/BIN/TEST.S.txt @@ -0,0 +1,153 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF BIN/TEST +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/LIBSTR.I +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .DA CS.QUIT +L.LIBSTR .DA LIBSTR +L.MSG0 .DA MSG0 +L.MSG1 .DA MSG1 +L.MSG2 .DA MSG2 +L.MSG3 .DA MSG3 +L.SSCANF.IP .DA SSCANF.IP +L.DST.IP .DA DST.IP +L.TEST1 .DA TEST1 +L.TEST2 .DA TEST2 +L.TEST3 .DA TEST3 + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 Data Segment to Allocate +*-------------------------------------- +CS.INIT >LIBLOADP L.LIBSTR + sta hLIBSTR + + ldy #S.PS.hOUTDEV + lda (TSKMGR.TSKPTR),y + >SYSCALL SYS.DevSelectA + + ldy #S.PS.hPREFIX + lda (TSKMGR.TSKPTR),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHW L.MSG0 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #S.PS.hCS + lda (TSKMGR.TSKPTR),y + >SYSCALL SYS.GetMemByIDA + >STYA ZPQuickPtr1 + ldy #S.MEM.BIN + lda (ZPQuickPtr1),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHW L.MSG1 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #S.PS.hARGS + lda (TSKMGR.TSKPTR),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + ldy #S.PS.hCMD + lda (TSKMGR.TSKPTR),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHW L.MSG2 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + ldy #S.PS.hENV + lda (TSKMGR.TSKPTR),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPBIN + +.1 lda (ZPBIN) + beq .2 + >PUSHW ZPBIN + >PUSHW L.MSG3 + >LIBCALL hLIBSTR,LIBSTR.PRINTF + lda (ZPBIN) + sec + adc ZPBIN + sta ZPBIN + bcc .1 + inc ZPBIN+1 + bra .1 + +.2 >PUSHW L.DST.IP + >PUSHW L.SSCANF.IP + >PUSHW L.TEST1 + >LIBCALL hLIBSTR,LIBSTR.SSCANF + + lda DST.IP+3 + jsr PRBYTE + jsr CROUT + + >PUSHW L.DST.IP + >PUSHW L.SSCANF.IP + >PUSHW L.TEST2 + >LIBCALL hLIBSTR,LIBSTR.SSCANF + + lda DST.IP+3 + jsr PRBYTE + jsr CROUT + + >PUSHW L.DST.IP + >PUSHW L.SSCANF.IP + >PUSHW L.TEST3 + >LIBCALL hLIBSTR,LIBSTR.SSCANF + + lda DST.IP+3 + jsr PRBYTE + jsr CROUT + + lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory + rts +*-------------------------------------- +CS.RUN +CS.EVENT clc + rts +*-------------------------------------- +CS.QUIT lda hLIBSTR + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +CS.END +hLIBSTR .BS 1 +LIBSTR >PSTRING "libstr.o" +MSG0 >CSTRING "PREFIX=%S\n" +MSG1 >CSTRING "BIN={%S}\n" +MSG2 >CSTRING "CMD={%S},ARGS={%S}\nENV:\n" +MSG3 >CSTRING " %S\n" +TEST1 >PSTRING "198.168.1.1" +TEST2 >PSTRING "198.168.1.23" +TEST3 >PSTRING "198.168.1.4" +SSCANF.IP >PSTRING "%d.%d.%d.%d" +DST.IP .BS 4 +*-------------------------------------- +MAN +SAVE BIN/TEST.S +ASM diff --git a/BIN/TOUCH.S.txt b/BIN/TOUCH.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/BIN/_TEMPLATE.S.txt b/BIN/_TEMPLATE.S.txt new file mode 100644 index 00000000..99355378 --- /dev/null +++ b/BIN/_TEMPLATE.S.txt @@ -0,0 +1,57 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/MONITOR.I +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .DA CS.QUIT + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA DS.END-DS.START Data Segemnt to Allocate +*-------------------------------------- +CS.INIT + + +CS.INIT.EXIT lda #0 tell TSKMGR that all done ok, but + sec we do not want to stay in memory + rts +*-------------------------------------- +CS.RUN clc + rts +*-------------------------------------- +CS.EVENT clc + rts +*-------------------------------------- +CS.QUIT clc + rts +*-------------------------------------- +CS.END +DS.START +*-------------------------------------- +*-------------------------------------- +DS.END +MAN +SAVE SBIN/ .S +ASM diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt new file mode 100644 index 00000000..b918163f --- /dev/null +++ b/DRV/CONSOLE.DRV.S.txt @@ -0,0 +1,332 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF DRV/CONSOLE.DRV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/IO.I +*-------------------------------------- +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA OPEN + .DA GETEVENT + .DA OUT + .DA CLOSE + .DA GETINFO + .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 + sta INVFLG + + 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 + + clc + rts +*-------------------------------------- +GETEVENT >PULLW pEvent + lda A2osX.TIMER16 + and #CURSOR.BLINK.SPEED + eor CURON + beq .9 + jsr CURBLNK + +.9 lda #0 Error = no event + sec + rts +*-------------------------------------- +OUT >PULLA + jsr COUT + clc + rts +*-------------------------------------- +CLOSE lda A2osX.SCREENS + and #$FF^A2osX.SCREENS.C + sta A2osX.SCREENS + clc + rts +*-------------------------------------- +GETINFO clc + rts + +*-------------------------------------- +* PRIVATE +*-------------------------------------- +COUT cmp #8 + bne .2 + ldx CH + beq .10 + dec CH + bra .12 + +.10 ldy CV + bne .11 + rts + +.11 lda #79 + sta CH + dec CV + +.12 lda #$A0 + ldx CH + ldy CV + jsr SetCharAtXY + rts + +.2 cmp #13 + beq CROUT + ldx CH + ldy CV + jsr SetCharAtXY +FSOUT ldx CH + cpx #79 + beq CROUT1 + inc CH + rts +*-------------------------------------- +CROUT jsr CLREOL +CROUT1 stz CH + ldy CV + cpy #23 + beq SCROLL.UP + inc CV + rts + +SCROLL.UP ldx #0 + sta SET80STORE + +.1 lda BASEL,x + sta ZPBASL1 + lda BASEH,x + sta ZPBASL1+1 + inx + lda BASEL,x + sta ZPBASL2 + lda BASEH,x + sta ZPBASL2+1 + + ldy #39 + sta SETPAGE2 + +.2 lda (ZPBASL2),y + sta (ZPBASL1),y + dey + bpl .2 + + ldy #39 + sta CLRPAGE2 + +.3 lda (ZPBASL2),y + sta (ZPBASL1),y + dey + bpl .3 + + cpx #23 + bne .1 + + +*-------------------------------------- +CLREOL ldx CH +.1 phx + ldy CV + lda #$A0 + jsr SetCharAtXY + plx + inx + cpx #80 + bne .1 + rts +*-------------------------------------- +HOME stz CH + stz CV + + lda RDPAGE2 + pha + lda RD80STORE + pha + + sta SET80STORE + + ldx #23 + +.1 lda BASEL,x + sta ZPBASL1 + lda BASEH,x + sta ZPBASL1+1 + + lda #' ' + ora INVFLG + + sta CLRPAGE2 + ldy #39 + +.2 sta (ZPBASL1),y + dey + bpl .2 + + sta SETPAGE2 + ldy #39 + +.3 sta (ZPBASL1),y + dey + bpl .3 + + dex + bpl .1 + + pla + bmi .4 + 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 + and #A2osX.SCREENS.C + bne CURBLNK1 + + lda CURON + bne CURBLNK.OFF + rts do not Light if screen is not active + +CURBLNK1 lda CURON + bne CURBLNK.OFF + ldx CH + ldy CV + jsr GetCharAtXY + sta CURCHAR + ldx CH + ldy CV + lda #$20 + jsr SetCharAtXY + bra CUREXIT + +CURBLNK.OFF ldx CH + ldy CV + lda CURCHAR + jsr SetCharAtXY + +CUREXIT lda CURON + eor #CURSOR.BLINK.SPEED + sta CURON +CUREXIT.RTS rts +*-------------------------------------- +SetCharAtXY pha + lda RDPAGE2 + pha + lda RD80STORE + pha + sta SET80STORE + txa + lsr + + bcc .1 + clc + sta CLRPAGE2 + bra .2 +.1 sta SETPAGE2 + +.2 adc BASEL,y + sta ZPBASL1 + lda BASEH,y + sta ZPBASL1+1 + + ply + plx + pla + sta (ZPBASL1) + tya + bmi .3 + sta CLR80STORE +.3 txa + bpl .4 + sta SETPAGE2 + rts +.4 sta CLRPAGE2 + rts +*-------------------------------------- +GetCharAtXY sta SET80STORE + txa + lsr + + bcc .1 + clc + sta CLRPAGE2 + bra .2 +.1 sta SETPAGE2 + +.2 adc BASEL,y + sta ZPBASL1 + lda BASEH,y + sta ZPBASL1+1 + + lda (ZPBASL1) + rts +*-------------------------------------- +CS.END +DEVNAME >PSTRING "CON" +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 +*-------------------------------------- +MAN +SAVE DRV/CONSOLE.DRV.S +ASM diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt new file mode 100644 index 00000000..0e66fe10 --- /dev/null +++ b/DRV/DHGR.DRV.S.txt @@ -0,0 +1,483 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF DRV/DHGR.DRV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA OPEN + .DA GETEVENT + .DA OUT + .DA CLOSE + .DA GETINFO + .DA SETPIXEL + .DA GETPIXEL + .DA HLINE + .DA VLINE + .DA FILLREC + .DA BITBLT +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) + + 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 + + clc + rts +*-------------------------------------- +GETEVENT +OUT clc + rts +*-------------------------------------- +CLOSE lda A2osX.SCREENS + and #$FF^A2osX.SCREENS.G + sta A2osX.SCREENS + clc + rts +*-------------------------------------- +GETINFO >LDYA L.DEVINFO + clc + rts +*-------------------------------------- +* SETPIXEL +*-------------------------------------- +* PULLB = X.LO +* PULLB = X.HI +* PULLB = Y +* PULLB = Mode +* 00000000=mono +* 00000001=xor (mono on 1 bit) +* 10000000=color +* PULLB = Color (if not xor) +*-------------------------------------- +SETPIXEL >PULLA X.LO + tax + >PULLA X.HI + lsr if 256 =< x < 511 + bcs .1 + lsr + bcs .2 if 512 < x + lda DIV7.0,x + tay + lda MOD7.0,x + bra .3 + +.1 lda DIV7.256,x + tay + lda MOD7.256,x + bra .3 + +.2 lda DIV7.512,x + tay + lda MOD7.512,x + +.3 pha save MOD,y=DIV + + >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 + + plx get back MOD in x + + >PULLA Pull Mode + bmi SETPIXEL.COLOR +*-------------------------------------- +* X=MOD,Y=DIV +*-------------------------------------- +SETPIXEL.MONO pha + tya + lsr + tay + bcs .1 odd=main ram + sta SETPAGE2 + bra .2 +.1 sta CLRPAGE2 +.2 pla + lsr CS=xor + bcs SETPIXEL.MONOX + + >PULLA get COLOR + lsr + bcs SETPIXEL.MONOW + + lda (ZPBASE),y + and Mono.NMasks,x + sta (ZPBASE),y + rts + +SETPIXEL.MONOW lda (ZPBASE),y + and #$7F switch back ths byte to mono + ora Mono.Masks,x + sta (ZPBASE),y + rts + +SETPIXEL.MONOX lda (ZPBASE),y + eor 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 + adc ZPBASE ZPBASE now point to first of the 4 columns + sta ZPBASE + txa get MOD + asl times 4 to compute index in color tables + asl + tax set in X for Masks,NMasks + + >PULLA get COLOR + asl + asl + tay + + lda Color.Masks,x + beq .1 + + sta SETPAGE2 + lda (ZPBASE) + and Color.NMasks,x reset existing pixel, + ora Color.Pixels,y apply color + and Color.Enable,x filter 4 color bits color.enable bit + sta (ZPBASE) + +.1 inx + iny + + lda Color.Masks,x + beq .2 + + sta CLRPAGE2 + lda (ZPBASE) + and Color.NMasks,x reset existing pixel, + ora Color.Pixels,y apply color + and Color.Enable,x filter 4 color bits color.enable bit + sta (ZPBASE) + +.2 inc ZPBASE + inx + iny + + lda Color.Masks,x + beq .3 + + sta SETPAGE2 + lda (ZPBASE) + and Color.NMasks,x reset existing pixel, + ora Color.Pixels,y apply color + and Color.Enable,x filter 4 color bits color.enable bit + sta (ZPBASE) + +.3 inx + iny + + lda Color.Masks,x + beq .8 + + sta CLRPAGE2 + lda (ZPBASE) + and Color.NMasks,x reset existing pixel, + ora Color.Pixels,y apply color + and Color.Enable,x filter 4 color bits color.enable bit + sta (ZPBASE) +.8 rts +*-------------------------------------- +GETPIXEL +*-------------------------------------- +HLINE +*-------------------------------------- +VLINE +*-------------------------------------- +FILLREC +*-------------------------------------- +* params : X,Y,W,H +*-------------------------------------- +BITBLT + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +DIV7.0 .HS 0000000000000001010101010101 + .HS 0202020202020203030303030303 + .HS 0404040404040405050505050505 + .HS 0606060606060607070707070707 + .HS 0808080808080809090909090909 + .HS 0A0A0A0A0A0A0A0B0B0B0B0B0B0B + .HS 0C0C0C0C0C0C0C0D0D0D0D0D0D0D + .HS 0E0E0E0E0E0E0E0F0F0F0F0F0F0F + .HS 1010101010101011111111111111 + .HS 1212121212121213131313131313 + .HS 1414141414141415151515151515 + .HS 1616161616161617171717171717 + .HS 1818181818181819191919191919 + .HS 1A1A1A1A1A1A1A1B1B1B1B1B1B1B + .HS 1C1C1C1C1C1C1C1D1D1D1D1D1D1D + .HS 1E1E1E1E1E1E1E1F1F1F1F1F1F1F + .HS 2020202020202021212121212121 + .HS 2222222222222223232323232323 + .HS 24242424 +DIV7.256 .HS 24242425252525252525 + .HS 2626262626262627272727272727 + .HS 2828282828282829292929292929 + .HS 2A2A2A2A2A2A2A2B2B2B2B2B2B2B + .HS 2C2C2C2C2C2C2C2D2D2D2D2D2D2D + .HS 2E2E2E2E2E2E2E2F2F2F2F2F2F2F + .HS 3030303030303031313131313131 + .HS 3232323232323233333333333333 + .HS 3434343434343435353535353535 + .HS 3636363636363637373737373737 + .HS 3838383838383839393939393939 + .HS 3A3A3A3A3A3A3A3B3B3B3B3B3B3B + .HS 3C3C3C3C3C3C3C3D3D3D3D3D3D3D + .HS 3E3E3E3E3E3E3E3F3F3F3F3F3F3F + .HS 4040404040404041414141414141 + .HS 4242424242424243434343434343 + .HS 4444444444444445454545454545 + .HS 4646464646464647474747474747 + .HS 4848484848484849 +DIV7.512 .HS 494949494949 + .HS 4A4A4A4A4A4A4A4B4B4B4B4B4B4B + .HS 4C4C4C4C4C4C4C4D4D4D4D4D4D4D + .HS 4E4E4E4E4E4E4E4F4F4F4F4F4F4F +*-------------------------------------- +MOD7.0 .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 00010203 +MOD7.256 .HS 04050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600 +MOD7.512 .HS 010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 + .HS 0001020304050600010203040506 +*-------------------------------------- +BASEL .HS 00.00.00.00.00.00.00.00 + .HS 80.80.80.80.80.80.80.80 + .HS 00.00.00.00.00.00.00.00 + .HS 80.80.80.80.80.80.80.80 + .HS 00.00.00.00.00.00.00.00 + .HS 80.80.80.80.80.80.80.80 + .HS 00.00.00.00.00.00.00.00 + .HS 80.80.80.80.80.80.80.80 + .HS 28.28.28.28.28.28.28.28 + .HS A8.A8.A8.A8.A8.A8.A8.A8 + .HS 28.28.28.28.28.28.28.28 + .HS A8.A8.A8.A8.A8.A8.A8.A8 + .HS 28.28.28.28.28.28.28.28 + .HS A8.A8.A8.A8.A8.A8.A8.A8 + .HS 28.28.28.28.28.28.28.28 + .HS A8.A8.A8.A8.A8.A8.A8.A8 + .HS 50.50.50.50.50.50.50.50 + .HS D0.D0.D0.D0.D0.D0.D0.D0 + .HS 50.50.50.50.50.50.50.50 + .HS D0.D0.D0.D0.D0.D0.D0.D0 + .HS 50.50.50.50.50.50.50.50 + .HS D0.D0.D0.D0.D0.D0.D0.D0 + .HS 50.50.50.50.50.50.50.50 + .HS D0.D0.D0.D0.D0.D0.D0.D0 +*-------------------------------------- +BASEH .HS 20.24.28.2C.30.34.38.3C + .HS 20.24.28.2C.30.34.38.3C + .HS 21.25.29.2D.31.35.39.3D + .HS 21.25.29.2D.31.35.39.3D + .HS 22.26.2A.2E.32.36.3A.3E + .HS 22.26.2A.2E.32.36.3A.3E + .HS 23.27.2B.2F.33.37.3B.3F + .HS 23.27.2B.2F.33.37.3B.3F + .HS 20.24.28.2C.30.34.38.3C + .HS 20.24.28.2C.30.34.38.3C + .HS 21.25.29.2D.31.35.39.3D + .HS 21.25.29.2D.31.35.39.3D + .HS 22.26.2A.2E.32.36.3A.3E + .HS 22.26.2A.2E.32.36.3A.3E + .HS 23.27.2B.2F.33.37.3B.3F + .HS 23.27.2B.2F.33.37.3B.3F + .HS 20.24.28.2C.30.34.38.3C + .HS 20.24.28.2C.30.34.38.3C + .HS 21.25.29.2D.31.35.39.3D + .HS 21.25.29.2D.31.35.39.3D + .HS 22.26.2A.2E.32.36.3A.3E + .HS 22.26.2A.2E.32.36.3A.3E + .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 .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.Enable .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 0000,Black (color bit disable) + .DA %10010001.10100010.11000100.10001000 0001,Magenta + .DA %10100010.11000100.10001000.10010001 0010,Brown + .DA %10110011.11100110.11001100.10011001 0011,Orange + .DA %11000100.10001000.10010001.10100010 0100,Dark Green + .DA %11010101.10101010.11010101.10101010 0101,Grey1 + .DA %11100110.11001100.10011001.10110011 0110,Green + .DA %11110111.11101110.11011101.10111011 0111,Yellow + .DA %10001000.10010001.10100010.11000100 1000,Dark Blue + .DA %10011001.10110011.11100110.11001100 1001,Violet + .DA %10101010.11010101.10101010.11010101 1010,Grey2 + .DA %10111011.11110111.11101111.11011101 1011,Pink + .DA %11001100.10011001.10110011.11100110 1100,Medium Blue + .DA %11011101.10111011.11110111.11101110 1101,Light Blue + .DA %11101110.11011101.10111011.11110111 1110,Aqua + .DA %01111111.01111111.01111111.01111111 1111,White (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 + + +*-------------------------------------- +CS.END +DEVNAME >PSTRING "GFX" +*-------------------------------------- +DS.START +*-------------------------------------- +DEVINFO .DA #S.DEV.F.GFX type of DEVINFO STRUCT +DEVINFO.W .DA 560 X.SIZE +DEVINFO.H .DA 192 Y.SIZE +DS.END +*-------------------------------------- +MAN +SAVE DRV/DHGR.DRV.S +ASM diff --git a/DRV/PPIC.DRV.S.txt b/DRV/PPIC.DRV.S.txt new file mode 100644 index 00000000..efea7967 --- /dev/null +++ b/DRV/PPIC.DRV.S.txt @@ -0,0 +1,108 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF DRV/PPIC.DRV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/ZP.I +*-------------------------------------- +ZPTmpPtr1 .EQ ZPDRV +*-------------------------------------- +SIG.05 .EQ $48 +SIG.07 .EQ $48 +*-------------------------------------- +* Main DRV entry point +* input : +* X = CMD +* 0 : OPEN +* 2 : GETEVENT +* 4 : SELECT +* 6 : RELEASE +* 8 : OUT +* 10 : CLOSE +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA OPEN + .DA GETEVENT + .DA SELECT + .DA RELEASE + .DA OUT + .DA CLOSE + .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 + beq .3 + +.2 inc ZPTmpPtr1+1 + lda ZPTmpPtr1+1 + cmp #$C8 + bne .1 + beq .99 + +.3 lda ZPTmpPtr1+1 + and #$0F + sta DEVSLOT + ora #$30 + sta DEVNAME+4 + + lda #S.DEV.F.CHAR+S.DEV.F.OUT + sta (DEVMGR.DEVPTR) + ldy #S.DEV.NAME + + ldx #0 +.7 lda DEVNAME,x + sta (DEVMGR.DEVPTR),y + cpx DEVNAME + beq .8 + inx + iny + bne .7 +.8 clc + rts +.99 lda #DEVMGR.ERRNOHW + sec + rts +*-------------------------------------- +GETEVENT lda #0 + sec + rts +*-------------------------------------- +SELECT +RELEASE +*-------------------------------------- +OUT clc + rts +*-------------------------------------- +CLOSE clc + rts +*-------------------------------------- +CS.END +DEVNAME >PSTRING "LPT0" +DEVSLOT .BS 1 +*-------------------------------------- +MAN +SAVE DRV/PPIC.DRV.S +ASM diff --git a/DRV/SSC.DRV.S.txt b/DRV/SSC.DRV.S.txt new file mode 100644 index 00000000..6cb621d8 --- /dev/null +++ b/DRV/SSC.DRV.S.txt @@ -0,0 +1,112 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF DRV/SSC.DRV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I +*-------------------------------------- +ZPTmpPtr1 .EQ ZPDRV +*-------------------------------------- +SIG.05 .EQ $38 +SIG.07 .EQ $18 +SIG.0B .EQ $01 +SIG.0C .EQ $31 +*-------------------------------------- +* Main DRV entry point +* input : +* X = CMD +* 0 : OPEN +* 2 : GETEVENT +* 4 : OUT +* 6 : CLOSE +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +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 +*-------------------------------------- +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 + +.2 inc ZPTmpPtr1+1 + lda ZPTmpPtr1+1 + cmp #$C8 + bne .1 + beq .99 + +.3 lda ZPTmpPtr1+1 + and #$0F + sta DEVSLOT + ora #$30 + sta DEVNAME+4 + + lda #S.DEV.F.CHAR+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 + rts +.99 lda #DEVMGR.ERRNOHW + sec + rts +*-------------------------------------- +GETEVENT lda #0 + sec + rts +*-------------------------------------- +OUT clc + rts +*-------------------------------------- +CLOSE clc + rts +*-------------------------------------- +CS.END +DEVNAME >PSTRING "COM0" +DEVSLOT .BS 1 +*-------------------------------------- +MAN +SAVE DRV/SSC.DRV.S +ASM diff --git a/DRV/UTHERNET.DRV.S.txt b/DRV/UTHERNET.DRV.S.txt new file mode 100644 index 00000000..5d0f2900 --- /dev/null +++ b/DRV/UTHERNET.DRV.S.txt @@ -0,0 +1,434 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF DRV/UTHERNET.DRV +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I +* .INB INC/ZP.I +*-------------------------------------- +ZPTmpPTR .EQ ZPDRV +*-------------------------------------- +DEVID .EQ $630E +*-------------------------------------- +* CS8900A IO Registers +*-------------------------------------- +RTDATA .EQ $C080 Receive/Transmit Data (DWORD) +TxCMD .EQ $C084 Transmit Command +TxLength .EQ $C086 Transmission Length +IntStatusQueue .EQ $C088 Interrupt Status Queue +PacketPagePTR .EQ $C08A PacketPage Pointer +PacketPageDATA .EQ $C08C PacketPage Data (DWORD) +*-------------------------------------- +TxCMD.LID .EQ %00000000.00001001 +TxCMD.TxStart5 .EQ %00000000.00000000 00 = start after 5 Bytes +TxCMD.TxStart381 .EQ %00000000.01000000 01 = start after 381 Bytes +TxCMD.TxStart1021 .EQ %00000000.10000000 10 = start after 1021 Bytes +TxCMD.TxStartFULL .EQ %00000000.11000000 11 = start after ENTIRE Frame +TxCMD.Force .EQ %00000001.00000000 +TxCMD.OneColl .EQ %00000010.00000000 +TxCMD.InhibitCRC .EQ %00010000.00000000 +TxCMD.TxPadDis .EQ %00100000.00000000 +*-------------------------------------- +* PacketPage Offsets & Masks +*-------------------------------------- +PP.ID .EQ $0000 Product ID code (RO) +PP.RFBCNT .EQ $0050 Received Frame Byte Counter (RO) +PP.RxCFG .EQ $0102 Receiver Configuration (RW) +PP.RxCFG.LID .EQ %00000000.00000011 +PP.RxCTL .EQ $0104 Receiver Control (RW) +PP.RxCTL.LID .EQ %00000000.00000101 +PP.RxCTL.IAHashA .EQ %00000000.01000000 +PP.RxCTL.PromisA .EQ %00000000.10000000 +PP.RxCTL.RxOKA .EQ %00000001.00000000 +PP.RxCTL.MulticastA .EQ %00000010.00000000 +PP.RxCTL.IA .EQ %00000100.00000000 +PP.RxCTL.BroadcastA .EQ %00001000.00000000 +PP.RxCTL.CRCerrorA .EQ %00010000.00000000 +PP.RxCTL.RuntA .EQ %00100000.00000000 +PP.RxCTL.ExtradataA .EQ %01000000.00000000 +PP.TxCFG .EQ $0106 Transmit Configuration (RW) +PP.TxCMD .EQ $0108 Receiver Control (RW) +PP.BufCFG .EQ $010A +PP.LineCTL .EQ $0112 Line Control (RW) +PP.LineCTL.LID .EQ %00000000.00010011 +PP.LineCTL.SerRxOn .EQ %00000000.01000000 +PP.LineCTL.SerTxOn .EQ %00000000.10000000 +PP.LineCTL.AUIonly .EQ %00000001.00000000 +PP.LineCTL.Auto .EQ %00000010.00000000 +PP.SelfCTL .EQ $0114 Self Control (RW) +PP.SelfCTL.LID .EQ %00000000.00010101 +PP.SelfCTL.RESET .EQ %00000000.01000000 +PP.SelfCTL.SWSuspnd .EQ %00000000.10000000 +PP.SelfCTL.HWSleepE .EQ %00000001.00000000 +PP.SelfCTL.HWStndby .EQ %00000010.00000000 +PP.BufCTL .EQ $0116 +PP.TestCTL .EQ $0118 +PP.ISQ .EQ $0120 +PP.RxEvent .EQ $0124 Receiver Event (RO) +PP.RxEvent.LID .EQ %00000000.00000100 +PP.RxEvent.RxOK .EQ %00000001.00000000 +PP.RxEvent.IA .EQ %00000100.00000000 +PP.RxEvent.Brdcast .EQ %00001000.00000000 +PP.RxEvent.CRCerror .EQ %00010000.00000000 +PP.RxEvent.Runt .EQ %00100000.00000000 +PP.RxEvent.Xtradata .EQ %01000000.00000000 +PP.TxEvent .EQ $0128 Transmitter Event (RO) +PP.TxEvent.LID .EQ %00000000.00001000 +PP.BufEvent .EQ $012C +PP.RxMISS .EQ $0130 +PP.TxCOL .EQ $0132 +PP.LineST .EQ $0134 Line Status (RO) +PP.LineST.LID .EQ %00000000.00010100 +PP.LineST.LinkOK .EQ %00000000.10000000 +PP.LineST.AUI .EQ %00000001.00000000 +PP.LineST.10BT .EQ %00000010.00000000 +PP.LineST.PolOK .EQ %00010000.00000000 +PP.LineST.CRS .EQ %01000000.00000000 +PP.SelfST .EQ $0136 Self Status (RO) +PP.SelfST.INITD .EQ %00000000.10000000 +PP.BusST .EQ $0138 Bus Status (RO) +PP.BusST.LID .EQ %00000000.00011000 +PP.BusST.TxBidErr .EQ %00000000.10000000 +PP.BusST.Rdy4TxNOW .EQ %00000001.00000000 +PP.TDR .EQ $013C +PP.MAC .EQ $0158 MAC Address (RW) +PP.RxStatus .EQ $0400 +PP.RxLength .EQ $0402 +PP.RxFrame .EQ $0404 +PP.TxFrame .EQ $0A00 +*-------------------------------------- +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 +*-------------------------------------- +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 +*-------------------------------------- +* input : +* none +* output : +* CC on success +* CS on error +*-------------------------------------- +OPEN ldx #$10 +.1 stx DEVSLOTx0 + >LDYAI PP.ID + >STYA PacketPagePTR,x + >LDYA PacketPageDATA,x + cpy #DEVID + bne .2 + cmp /DEVID + beq .3 +.2 inc DEVNAME+4 + txa + clc + adc #$10 + tax + cpx #$80 + bne .1 + lda #DEVMGR.ERRNOHW + sec + rts +.3 ldy #S.DEV.hARGS + lda (pDevContext),y + beq .4 + >SYSCALL SYS.GetMemPtrA + >STYA ZPTmpPTR + jsr DecodeMac + bcc .4 + lda #DEVMGR.ERRNICL + sec + rts + +.4 jsr Reset + + >LDYAI PP.RxCTL + >STYA PacketPagePTR,x + >LDYAI PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA + >STYA PacketPageDATA,x + + >LDYAI PP.MAC + >STYA PacketPagePTR,x + >LDYA MAC + >STYA PacketPageDATA,x + >LDYAI PP.MAC+2 + >STYA PacketPagePTR,x + >LDYA MAC+2 + >STYA PacketPageDATA,x + >LDYAI PP.MAC+4 + >STYA PacketPagePTR,x + >LDYA MAC+4 + >STYA PacketPageDATA,x + + >LDYAI PP.LineCTL + >STYA PacketPagePTR,x + >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 + rts +*-------------------------------------- +* input : +* pEvent +* output : +* CC no event +* CS event +*-------------------------------------- +GETEVENT >PULLW pEvent + ldx DEVSLOTx0 + >LDYAI PP.RxEvent + >STYA PacketPagePTR,x + >LDYA PacketPageDATA,x + and /PP.RxEvent.RxOK+PP.RxEvent.Brdcast+PP.RxEvent.IA + bne GETEVENT.RxOK + lda #ERRTNOFRAME + sec + rts +GETEVENT.RxOK + and /PP.RxEvent.Brdcast + beq .10 + lda #$80 +.10 ldy #S.EVT.DATAHI + sta (pEvent),y + >LDYA RTDATA,x discard RxStatus + >LDYA RTDATA,x get RxLength + >STYA FRAMELEN + >PUSHYA + >PUSHB 0 + >SYSCALL SYS.GetMem + bcs .99 + >STYA ZPTmpPTR + txa + ldy #S.EVT.DATALO + sta (pEvent),y + ldy #S.EVT.DATAW1 + lda FRAMELEN + sta (pEvent),y + iny + lda FRAMELEN+1 + sta (pEvent),y + lda #S.EVT.F.NET+S.EVT.F.hMEM1 + sta (pEvent) + ldy #0 + ldx DEVSLOTx0 +.1 lda RTDATA,x + sta (ZPTmpPTR),y + iny + bne .2 + inc ZPTmpPTR+1 +.2 jsr DecFrameLen + beq .8 + lda RTDATA+1,x + sta (ZPTmpPTR),y + iny + bne .3 + inc ZPTmpPTR+1 +.3 jsr DecFrameLen + beq .8 + bra .1 +.8 clc + rts + +.99 sec + rts +*-------------------------------------- +* in: +* PULLW = FRAME PTR +* PULLW = FRAME LEN +* out: +* CC on success +* CS on error +*-------------------------------------- +OUT >PULLW ZPTmpPTR + >PULLW FRAMELEN + + ldy #11 Add Src MAC Address + ldx #5 +.10 lda MAC,x + sta (ZPTmpPTR),y + dey + dex + bpl .10 + + ldx DEVSLOTx0 + >LDYAI TxCMD.LID+TxCMD.TxStartFULL + >STYA TxCMD,x + >LDYA FRAMELEN + >STYA TxLength,x + >LDYAI PP.BusST + >STYA PacketPagePTR,x + + ldy #16 +.1 lda PacketPageDATA,x + and #PP.BusST.TxBidErr + bne .9 + lda PacketPageDATA+1,x + and /PP.BusST.Rdy4TxNOW + bne SENDPREADY + bra * + lda #0 +.2 dec + bne .2 + dey + bne .1 + bra * + lda #ERRTIMEOUT + sec + rts +.9 bra * + lda #ERRNOBUFFER + sec + rts + +SENDPREADY ldy #0 +.1 lda (ZPTmpPTR),y + sta RTDATA,x + iny + bne .2 + inc ZPTmpPTR+1 +.2 jsr DecFrameLen + beq .8 +.3 lda (ZPTmpPTR),y + sta RTDATA+1,x + iny + bne .5 + inc ZPTmpPTR+1 +.5 jsr DecFrameLen + bne .1 +.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 + >LDYAI PP.SelfCTL + >STYA PacketPagePTR,x + >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 + dec FRAMELEN+1 +.1 dec FRAMELEN +.2 lda FRAMELEN + ora FRAMELEN+1 + rts +*-------------------------------------- +CS.END +DEVNAME >PSTRING "ETH1" +*-------------------------------------- +DS.START +*-------------------------------------- +DEVSLOTx0 .BS 1 +FRAMELEN .BS 2 +*-------------------------------------- +DEVINFO +MAC .BS 6 +*-------------------------------------- +DS.END +*-------------------------------------- +MAN +SAVE DRV/UTHERNET.DRV.S +ASM diff --git a/ETC/TCPIP.CONF b/ETC/TCPIP.CONF new file mode 100644 index 00000000..99c93811 --- /dev/null +++ b/ETC/TCPIP.CONF @@ -0,0 +1,14 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 +IP=192.168.1.150 +MASK=255.255.255.0 +GW=192.168.1.1 +DNS=192.168.1.2 +DNS=192.168.1.1 +HOSTNAME=apple2 +DOMAIN=coincoin.hd.free.fr +MAN +TEXT ETC/TCPIP.CONF diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt new file mode 100644 index 00000000..a6cf4411 --- /dev/null +++ b/INC/A2osX.I.txt @@ -0,0 +1,324 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* KERNEL Reserved ZP Location 00-1F,56-FF +*-------------------------------------- +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 + +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 + +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 + +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 + +SYS.SetEnvVarH .EQ $38 +SYS.SetEnvVarP .EQ $3A +*-------------------------------------- +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 +*-------------------------------------- +SYS.GetDevByIDA .EQ $70 +SYS.GetDevByNameA .EQ $72 +SYS.GetDevTable .EQ $74 +SYS.GetDevInfoA .EQ $76 + +SYS.DevOutA .EQ $78 +*-------------------------------------- +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 +*-------------------------------------- +A2osX.SaveS .EQ $100 Main,Aux +*-------------------------------------- +* Main $200 -> 2FF : (Reserved, ProDOS,Clock DRV....) +* Main $300 -> 3EF : A2osX Global Page +* Main $3F0 -> 3FF : ProDOS Vectors +* Aux $200 -> 3FD : /RAM Driver +* Aux $3FE -> 3FF : RESET Vector +*-------------------------------------- +* A2osX GLOBAL PAGE +*-------------------------------------- +A2osX.SYSCALL .EQ $0300 +A2osX.MLICALL .EQ $0302 +A2osX.LIBCALL .EQ $0304 +A2osX.SLEEP .EQ $0306 +Kernel.MLICALL .EQ $0308 +Kernel.DRVCALL .EQ $030A +Kernel.BINCALL .EQ $030C +Kernel.LIBCALL .EQ $030E +*-------------------------------------- +A2osX.SCREENS .EQ $0310 +A2osX.SCREENS.G .EQ %00000100 +A2osX.SCREENS.C .EQ %00000010 +A2osX.SCREENS.S .EQ %00000001 +A2osX.ACTIVESCRN .EQ $0311 + +A2osX.TIMER16 .EQ $0312 +A2osX.RANDOM16 .EQ $0314 + +A2osX.CPUTYPE .EQ $0316 +A2osX.Z80SLOT .EQ $0317 + +Kernel.JMP .EQ $0318 + +A2osX.300CODE .EQ $031A +*-------------------------------------- +* Console Screen .EQ $400 -> $7FF +* System Screen .EQ $800 -> $BFF +*-------------------------------------- +TmpBuffer256 .EQ $0C00 +*-------------------------------------- +D.STACKSEG .EQ $0D00 $0DFF Down to $0D00 +*-------------------------------------- +MLICALL.PARAMS .EQ $0E00 size=$12 (SET_FILE_INFO +1) +A2osX.SaveA .EQ $0E20 +A2osX.SaveX .EQ $0E21 +A2osX.SaveY .EQ $0E22 +*-------------------------------------- +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 +*-------------------------------------- +MEMMGR.TABLE .EQ $1100 256 Handles +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 +*-------------------------------------- +* MEM STRUCT +*-------------------------------------- +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.F.LC1 .EQ %00000010 +S.MEM.F.LC2 .EQ %00000001 +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.XYP .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 +*-------------------------------------- +* Driver Function Indexes +*-------------------------------------- +DEVMGR.OPEN .EQ 0 +DEVMGR.GETEVENT .EQ 2 +DEVMGR.OUT .EQ 4 +DEVMGR.CLOSE .EQ 6 +DEVMGR.GETINFO .EQ 8 +*-------------------------------------- +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 +*-------------------------------------- +* LIB Function Indexes +*-------------------------------------- +LIBMGR.LOAD .EQ 0 +LIBMGR.UNLOAD .EQ 2 +*-------------------------------------- +* Task Function Indexes +*-------------------------------------- +TSKMGR.INIT .EQ 0 +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.FENTRY STRUCT +*-------------------------------------- +S.FENTRY.F .EQ 0 +S.FENTRY.COUNT .EQ 1 +*-------------------------------------- +* 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 new file mode 100644 index 00000000..e3d2e6af --- /dev/null +++ b/INC/IO.I.txt @@ -0,0 +1,103 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* Screen Holes +*-------------------------------------- +OURCH .EQ $57B +OURCV .EQ $5FB +*-------------------------------------- +* Software Switches & Cxxx ROMs +*-------------------------------------- +KBD .EQ $C000 R +CLR80STORE .EQ $C000 W +SET80STORE .EQ $C001 W +CLRREADAUX .EQ $C002 W +SETREADAUX .EQ $C003 W +CLRWRITEAUX .EQ $C004 W +SETWRITEAUX .EQ $C005 W +CLRCXROM .EQ $C006 W +SETCXROM .EQ $C007 W +CLRALTZP .EQ $C008 W +SETALTZP .EQ $C009 W +CLRC3ROM .EQ $C00A W +SETC3ROM .EQ $C00B W +CLR80DISP .EQ $C00C W +SET80DISP .EQ $C00D W +CLRALTCHAR .EQ $C00E W +SETALTCHAR .EQ $C00F W +KBDSTROBE .EQ $C010 W +RDBNK2 .EQ $C011 R +RDLCRAM .EQ $C012 R +RDREADAUX .EQ $C013 R +RDWRITEAUX .EQ $C014 R +RDCXROM .EQ $C015 R +RDALTZP .EQ $C016 R +RDC3ROM .EQ $C017 R +RD80STORE .EQ $C018 R +VBL .EQ $C019 R +RDTEXT .EQ $C01A R +RDMIXED .EQ $C01B R +RDPAGE2 .EQ $C01C R +RDHIRES .EQ $C01D R +RDALTCHAR .EQ $C01E R +RD80DISP .EQ $C01F R +TAPEOUT .EQ $C020 W +SPEAKER .EQ $C030 W, toggle speaker diaphragm +STROBE .EQ $C040 R, generate .5 uS low pulse @ Game pin 5 + +EMUBYTE .EQ $C04F WRR, Write once then Read EMUL, Read Version + +CLRTEXT .EQ $C050 W +SETTEXT .EQ $C051 W +CLRMIXED .EQ $C052 W +SETMIXED .EQ $C053 W +CLRPAGE2 .EQ $C054 W +SETPAGE2 .EQ $C055 W +CLRHIRES .EQ $C056 W +SETHIRES .EQ $C057 W + +SETAN0 .EQ $C058 W, Set annunciator-0 output to 0 +CLRAN0 .EQ $C059 W, Set annunciator-0 output to 1 +SETAN1 .EQ $C05A W, Set annunciator-1 output to 0 +CLRAN1 .EQ $C05B W, Set annunciator-1 output to 1 +SETAN2 .EQ $C05C W, Set annunciator-2 output to 0 +CLRAN2 .EQ $C05D W, Set annunciator-2 output to 1 +SETAN3 .EQ $C05E W, Set annunciator-3 output to 0 +SETDHIRES .EQ $C05E W, if IOUDIS Set, turn on double-hires +CLRAN3 .EQ $C05F W, Set annunciator-3 output to 1 +CLRDHIRES .EQ $C05F W, if IOUDIS Set, turn off double-hires + +TAPEIN .EQ $C060 R + +OPENAPPLE .EQ $C061 R +SOLIDAPPLE .EQ $C062 R +PB2 .EQ $C063 R + +PADDLE0 .EQ $C064 R, bit 7 = status of pdl-0 timer +PADDLE1 .EQ $C065 R, bit 7 = status of pdl-1 timer +PADDLE2 .EQ $C066 R, bit 7 = status of pdl-2 timer +PADDLE3 .EQ $C067 R, bit 7 = status of pdl-3 timer +PDLTRIG .EQ $C070 W, trigger paddles + +SETIOUDIS .EQ $C07E W, enable DHIRES & disable $C058-5F +CLRIOUDIS .EQ $C07F W, disable DHIRES & enable $C058-5F +*-------------------------------------- +RRAMBNK2 .EQ $C080 R +RROMWRAMBNK2 .EQ $C081 RR +RROMBNK2 .EQ $C082 R +RRAMWRAMBNK2 .EQ $C083 RR +RRAMBNK1 .EQ $C088 R +RROMWRAMBNK1 .EQ $C089 RR +RROMBNK1 .EQ $C08A R +RRAMWRAMBNK1 .EQ $C08B RR +*-------------------------------------- +* Cxxx ROMs +*-------------------------------------- +CX00ROM .EQ $C100 +C300ROM .EQ $C300 +MAN +SAVE INC/IO.I diff --git a/INC/KERNEL.I.txt b/INC/KERNEL.I.txt new file mode 100644 index 00000000..0bbb9e64 --- /dev/null +++ b/INC/KERNEL.I.txt @@ -0,0 +1,60 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* 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.NETCFG.MAX .EQ 4 +K.NETCFG.SIZE .EQ 128 +K.PROTOID.ATALK .EQ 0 +K.PROTOID.ETALK .EQ 1 +K.PROTOID.IP .EQ 2 +K.PROTOID.SPARE .EQ 3 +K.ARPCACHE.SIZE .EQ 10 +K.DNSCACHE.SIZE .EQ 10 +K.UDPTABLE.SIZE .EQ 16 +K.TCPTABLE.SIZE .EQ 16 +K.ETH.FRAME.LEN .EQ 1514 +K.IP.TTL .EQ 64 +*-------------------------------------- +* KERNEL Reserved ZP Location 00-1F,56-FF +*-------------------------------------- +DEVMGR.DEVPTR .EQ $80 +EVTMGR.EVTPTR .EQ $82 +TSKMGR.TSKPTR .EQ $84 +TSKMGR.pNewPS .EQ $86 +*-------------------------------------- +ZPMemMgr .EQ $D0 Aux +ZPSysScr .EQ $E0 Aux +*-------------------------------------- +R.VCPU16 .EQ $F0 Aux +R.AX .EQ R.VCPU16 +R.AL .EQ R.VCPU16 +R.AH .EQ R.VCPU16+$1 +R.BX .EQ R.VCPU16+$2 +R.BL .EQ R.VCPU16+$2 +R.BH .EQ R.VCPU16+$3 +R.CX .EQ R.VCPU16+$4 +R.CL .EQ R.VCPU16+$4 +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 +*-------------------------------------- +MAN +SAVE INC/KERNEL.I diff --git a/INC/LIBSTR.I.txt b/INC/LIBSTR.I.txt new file mode 100644 index 00000000..75ba0467 --- /dev/null +++ b/INC/LIBSTR.I.txt @@ -0,0 +1,23 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +LIBSTR.PRINTF .EQ 4 +LIBSTR.PRINTC .EQ 6 +LIBSTR.PRINTP .EQ 8 +LIBSTR.STRMATCHP .EQ 10 +LIBSTR.STRCPYP .EQ 12 +LIBSTR.STRCATP .EQ 14 +LIBSTR.UCASEP .EQ 16 +LIBSTR.LCASEP .EQ 18 +LIBSTR.PRINTDATE .EQ 20 +LIBSTR.PRINTTIME .EQ 22 +LIBSTR.SSCANF .EQ 24 +*-------------------------------------- +MAN +SAVE INC/LIBSTR.I + diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt new file mode 100644 index 00000000..50f83080 --- /dev/null +++ b/INC/LIBTCPIP.I.txt @@ -0,0 +1,221 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +LIBTCPIP.SET.IPCFG .EQ 4 +LIBTCPIP.GET.IPCFG .EQ 6 + +LIBTCPIP.NEW.ICMP.FRAME .EQ 8 +LIBTCPIP.NEW.TCP.FRAME .EQ 10 +LIBTCPIP.NEW.UDP.FRAME .EQ 12 +LIBTCPIP.NEW.IP.FRAME .EQ 14 +LIBTCPIP.NEW.ARP.FRAME .EQ 16 +LIBTCPIP.NEW.ETH.FRAME .EQ 18 + +LIBTCPIP.SEND.ICMP.FRAME .EQ 20 +LIBTCPIP.SEND.TCP.FRAME .EQ 22 +LIBTCPIP.SEND.UDP.FRAME .EQ 24 +LIBTCPIP.SEND.IP.FRAME .EQ 26 +LIBTCPIP.SEND.ARP.FRAME .EQ 28 +LIBTCPIP.SEND.ETH.FRAME .EQ 30 + +LIBTCPIP.ARP.CLEAR .EQ 32 +LIBTCPIP.ARP.QUERY .EQ 34 +LIBTCPIP.ARP.ADD .EQ 36 +LIBTCPIP.ARP.GETCACHE .EQ 38 + +LIBTCPIP.DNS.CLEAR .EQ 40 +LIBTCPIP.DNS.QUERY .EQ 42 +LIBTCPIP.DNS.ADD .EQ 44 +LIBTCPIP.DNS.GETCACHE .EQ 46 + +LIBTCPIP.UDP.LISTENER .EQ 48 +LIBTCPIP.TCP.LISTENER .EQ 50 +LIBTCPIP.ADD.LISTENER .EQ 52 +LIBTCPIP.REM.LISTENER .EQ 54 +*-------------------------------------- +TCP.PORT.TELNETS .EQ 23 +UDP.PORT.DNS .EQ 53 +UDP.PORT.DHCPC .EQ 68 +UDP.PORT.DHCPS .EQ 67 +*-------------------------------------- +S.IPCFG.STATUS .EQ 0 +S.IPCFG.STATUS.OFF .EQ %00000000 TCPIP Unconfigured +S.IPCFG.STATUS.SDISC .EQ %00000001 DISCOVERY Sent +S.IPCFG.STATUS.ROFFER .EQ %00000010 OFFER Received +S.IPCFG.STATUS.SREQ .EQ %00000100 REQUEST Sent +S.IPCFG.STATUS.RACK .EQ %00001000 ACK Received +S.IPCFG.STATUS.OK .EQ %10000000 Fully configured (static or DHCP) +S.IPCFG.HDEV .EQ 1 +S.IPCFG.MAC .EQ 2 +S.IPCFG.DHCPSRVR .EQ 8 +S.IPCFG.IP .EQ 12 +S.IPCFG.MASK .EQ 16 +S.IPCFG.GW .EQ 20 +S.IPCFG.DNS .EQ 24 2 x 4 +S.IPCFG.HOSTNAME .EQ 32 1+15 char PSTR +S.IPCFG.DOMAIN .EQ 48 1+35 char PSTR +* +S.IPCFG .EQ K.NETCFG.SIZE +*-------------------------------------- +S.ARPCACHE.STATUS .EQ 0 +S.ARPCACHE.STATUS.PENDING .EQ 64 +S.ARPCACHE.STATUS.RESOLVED .EQ 128 +S.ARPCACHE.RETRYCNT .EQ 1 +S.ARPCACHE.IP .EQ 2 +S.ARPCACHE.MAC .EQ 6 +* +S.ARPCACHE .EQ 12 +*-------------------------------------- +S.DNSCACHE.STATUS .EQ 0 +S.DNSCACHE.STATUS.PENDING .EQ 64 +S.DNSCACHE.STATUS.RESOLVED .EQ 128 +S.DNSCACHE.hNAME .EQ 1 +S.DNSCACHE.TTL .EQ 2 +S.DNSCACHE.IP .EQ 4 +* +S.DNSCACHE .EQ 8 +*-------------------------------------- +S.LISTENER.PORT .EQ 0 +S.LISTENER.hPS .EQ 2 +S.LISTENER.fIDX .EQ 3 +S.LISTENER .EQ 4 +*-------------------------------------- +S.ETH.DSTMAC .EQ 0 +S.ETH.SRCMAC .EQ 6 +S.ETH.ETHERTYPE .EQ 6+6 +S.ETH.ETHERTYPE.IP .EQ $800 +S.ETH.ETHERTYPE.ARP .EQ $806 +* +S.ETH .EQ 6+6+2 +*-------------------------------------- +S.ARP.HTYPE .EQ S.ETH+0 $0001 +S.ARP.PTYPE .EQ S.ETH+2 $0800 +S.ARP.HLEN .EQ S.ETH+4 $06 +S.ARP.PLEN .EQ S.ETH+5 $04 +S.ARP.OPERATION .EQ S.ETH+6 REQ=$0001,REPLY=$0002 +S.ARP.OPERATION.REQ .EQ 1 +S.ARP.OPERATION.REP .EQ 2 +S.ARP.SHA .EQ S.ETH+8 Sender MAC +S.ARP.SPA .EQ S.ETH+14 Sender IP +S.ARP.THA .EQ S.ETH+18 Target MAC +S.ARP.TPA .EQ S.ETH+24 Target IP +* +S.ARP .EQ S.ETH+28 +*-------------------------------------- +S.IP.V.IHL.DSCP.ECN .EQ S.ETH+0 $0045, IPV4,HDR=5DWORDs +S.IP.TOTAL.LENGTH .EQ S.ETH+2 +S.IP.IDENTIFICATION .EQ S.ETH+4 $0000 +S.IP.FRAGMENT.FLAGS .EQ S.ETH+6 +S.IP.TTL .EQ S.ETH+8 +S.IP.PROTOCOL .EQ S.ETH+9 +S.IP.PROTOCOL.ICMP .EQ 1 +S.IP.PROTOCOL.TCP .EQ 6 +S.IP.PROTOCOL.UDP .EQ 17 +S.IP.HDR.CHECKSUM .EQ S.ETH+10 +S.IP.SRC .EQ S.ETH+12 +S.IP.DST .EQ S.ETH+16 +* +S.IP .EQ S.ETH+20 +*-------------------------------------- +S.ICMP.TYPE .EQ S.IP+0 +S.ICMP.TYPE.ECHOREP .EQ 0 +S.ICMP.TYPE.UNREACH .EQ 3 +S.ICMP.TYPE.ECHOREQ .EQ 8 +S.ICMP.CODE .EQ S.IP+1 +S.ICMP.CHECKSUM .EQ S.IP+2 +S.ICMP.IDENTIFIER .EQ S.IP+4 +S.ICMP.SEQUENCE .EQ S.IP+6 +* +S.ICMP .EQ S.IP+8 +*-------------------------------------- +S.UDP.SRCPORT .EQ S.IP+0 +S.UDP.DSTPORT .EQ S.IP+2 +S.UDP.LENGTH .EQ S.IP+4 +S.UDP.CHECKSUM .EQ S.IP+6 $0000 = DISABLE +* +S.UDP .EQ S.IP+8 +*-------------------------------------- +S.DHCP.OP .EQ S.UDP+0 1 = BOOTREQUEST, 2 = BOOTREPLY +S.DHCP.OP.BOOTREQUEST .EQ 1 +S.DHCP.OP.BOOTREPLY .EQ 2 +S.DHCP.HTYPE .EQ S.UDP+1 1 = ETHERNET +S.DHCP.HTYPE.ETHERNET .EQ 1 +S.DHCP.HLEN .EQ S.UDP+2 6 (MAC len) +S.DHCP.HLEN.ETHERNET .EQ 6 +S.DHCP.HOPS .EQ S.UDP+3 0 +S.DHCP.XID .EQ S.UDP+4 client : random number +S.DHCP.SECS .EQ S.UDP+8 +S.DHCP.FLAGS .EQ S.UDP+10 +S.DHCP.FLAGS.BRDCST .EQ %10000000 +S.DHCP.CIADDR .EQ S.UDP+12 +S.DHCP.YIADDR .EQ S.UDP+16 +S.DHCP.SIADDR .EQ S.UDP+20 +S.DHCP.GIADDR .EQ S.UDP+24 +S.DHCP.CHADDR .EQ S.UDP+28 +S.DHCP.SNAME .EQ S.UDP+44 +S.DHCP.FILE .EQ S.UDP+108 +S.DHCP.COOKIE .EQ S.UDP+236 +S.DHCP.OPTIONS .EQ S.UDP+240 +S.DHCP.OPTIONS.DHCPDiscover .EQ 1 +S.DHCP.OPTIONS.DHCPOffer .EQ 2 +S.DHCP.OPTIONS.DHCPRequest .EQ 3 +S.DHCP.OPTIONS.DHCPDecline .EQ 4 +S.DHCP.OPTIONS.DHCPAck .EQ 5 +S.DHCP.OPTIONS.DHCPNak .EQ 6 +S.DHCP.OPTIONS.DHCPRelease .EQ 7 +S.DHCP.OPTIONS.DHCPInform .EQ 8 +S.DHCP.OPTIONS.MASK .EQ 1 +S.DHCP.OPTIONS.GW .EQ 3 +S.DHCP.OPTIONS.DNS .EQ 6 +S.DHCP.OPTIONS.DOMAIN .EQ 15 +S.DHCP.OPTIONS.END .EQ 255 +* +S.DHCP .EQ S.UDP+240 +*-------------------------------------- +S.DNS.ID .EQ S.UDP+0 +S.DNS.F .EQ S.UDP+2 +S.DNS.F.QR .EQ %10000000.00000000 +S.DNS.F.OPCODE.I .EQ %01000000.00000000 +S.DNS.F.OPCODE.S .EQ %00100000.00000000 +S.DNS.F.AA .EQ %00000100.00000000 +S.DNS.F.TC .EQ %00000010.00000000 +S.DNS.F.RD .EQ %00000001.00000000 +S.DNS.F.RA .EQ %00000000.10000000 +S.DNS.F.RCODE.FRMT .EQ %00000000.00000001 +S.DNS.F.RCODE.SRVR .EQ %00000000.00000010 +S.DNS.F.RCODE.UKWN .EQ %00000000.00000011 +S.DNS.F.RCODE.NIMP .EQ %00000000.00000100 +S.DNS.F.RCODE.DENY .EQ %00000000.00000101 +S.DNS.QDCOUNT .EQ S.UDP+4 +S.DNS.ANCOUNT .EQ S.UDP+6 +S.DNS.NSCOUNT .EQ S.UDP+8 +S.DNS.ARCOUNT .EQ S.UDP+10 +* +S.DNS .EQ S.UDP+12 +*-------------------------------------- +S.DNS.QTYPE.A .EQ 1 +S.DNS.QTYPE.NS .EQ 2 +S.DNS.QTYPE.CNAME .EQ 5 +S.DNS.QTYPE.SOA .EQ 6 +S.DNS.QTYPE.WKS .EQ 11 +S.DNS.QTYPE.PTR .EQ 12 +S.DNS.QTYPE.MX .EQ 15 +S.DNS.QTYPE.SRV .EQ 33 +S.DNS.QTYPE.ANY .EQ 255 +S.DNS.QCLASS.IN .EQ 1 +*-------------------------------------- +S.TCP.SRCPORT .EQ S.IP+0 +S.TCP.DSTPORT .EQ S.IP+2 +S.TCP.SEQ.NUMBER .EQ S.IP+4 +S.TCP.ACK.NUMBER .EQ S.IP+8 +* +S.TCP +*-------------------------------------- +MAN +SAVE INC/LIBTCPIP.I + diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt new file mode 100644 index 00000000..85aae937 --- /dev/null +++ b/INC/MACROS.I.txt @@ -0,0 +1,451 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- + .MA DEBUG +.70 bit $C000 + bpl .70 + sta $C010 + .EM +*-------------------------------------- +* SYSCALLs Macros +*-------------------------------------- + .MA SYSCALL + ldx #]1 + jsr A2osX.SYSCALL + .EM +*-------------------------------------- + .MA MLICALL + 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 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 + ldx #]2 + jsr A2osX.DRVCALL + .EM +*-------------------------------------- + .MA LIBLOADP + >PUSHW ]1 + ldx #SYS.LoadLib + jsr A2osX.SYSCALL + .EM +*-------------------------------------- + .MA LIBLOADA + ldx #SYS.LoadLibA + jsr A2osX.SYSCALL + .EM +*-------------------------------------- + .MA LIBCALL + ldy ]1 + ldx #]2 + 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) + .EM +*-------------------------------------- + .MA PULLA + lda (R.SP) + inc R.SP + .EM +*-------------------------------------- + .MA PUSHYA + dec R.SP + sta (R.SP) + pha + tya + dec R.SP + sta (R.SP) + pla + .EM +*-------------------------------------- + .MA PULLYA + lda (R.SP) + inc R.SP + tay + lda (R.SP) + inc R.SP + .EM +*-------------------------------------- + .MA PUSHBI + dec R.SP + lda #]1 + sta (R.SP) + .EM +*-------------------------------------- + .MA PUSHB + .DO ]#=2 + dec R.SP + lda ]1,]2 + sta (R.SP) + .ELSE + dec R.SP + lda ]1 + sta (R.SP) + .FIN + .EM +*-------------------------------------- + .MA PULLB + .DO ]#=2 + lda (R.SP) + sta ]1,]2 + inc R.SP + .ELSE + lda (R.SP) + sta ]1 + inc R.SP + .FIN + .EM +*-------------------------------------- + .MA PUSHWI + dec R.SP + lda /]1 + sta (R.SP) + dec R.SP + lda #]1 + sta (R.SP) + .EM +*-------------------------------------- + .MA PUSHW + dec R.SP + lda ]1+1 + sta (R.SP) + dec R.SP + lda ]1 + sta (R.SP) + .EM +*-------------------------------------- + .MA PULLW + lda (R.SP) + sta ]1 + inc R.SP + lda (R.SP) + sta ]1+1 + inc R.SP + .EM +*-------------------------------------- +* General WORD Manipulation Macros +*-------------------------------------- + .MA LDYAI + ldy #]1 + lda /]1 + .EM +*-------------------------------------- + .MA LDAXI + lda #]1 + ldx /]1 + .EM +*-------------------------------------- + .MA LDYA + .DO ]#=2 + lda ]1+1,]2 + ldy ]1,]2 + .ELSE + lda ]1+1 + ldy ]1 + .FIN + .EM +*-------------------------------------- + .MA LDAX + .DO ]#=2 + ldx ]1+1,]2 + lda ]1,]2 + .ELSE + ldx ]1+1 + lda ]1 + .FIN + .EM +*-------------------------------------- + .MA STYA + .DO ]#=2 + sta ]1+1,]2 + tya + sta ]1,]2 + .ELSE + sta ]1+1 + sty ]1 + .FIN + .EM +*-------------------------------------- + .MA STAX + .DO ]#=2 + sta ]1+1,]2 + txa + sta ]1,]2 + .ELSE + stx ]1+1 + sta ]1 + .FIN + .EM +*-------------------------------------- +* General Strings Macros +*-------------------------------------- + .MA CSTRING + .AS "]1" + .HS 00 + .EM +*-------------------------------------- + .MA PSTRING + .DA #.74-.73 +.73 .AS "]1" +.74 .AS "" + .EM +MAN +SAVE INC/MACROS.I diff --git a/INC/MONITOR.I.txt b/INC/MONITOR.I.txt new file mode 100644 index 00000000..27a589e8 --- /dev/null +++ b/INC/MONITOR.I.txt @@ -0,0 +1,95 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 1000 +*-------------------------------------- +* ROM Standard Routines +*-------------------------------------- + .LIST OFF +POWERUP .EQ $3F2 +*-------------------------------------- +COL80FIRM .EQ $C300 +*-------------------------------------- +BASICLD .EQ $E000 ENTER BASIC COLD +BASICWM .EQ $E003 RE-ENTER BASIC WARM +HGR2 .EQ $F3D8 APPLESOFT CLEAR TO HIRES 2 +HGR .EQ $F3E2 APPLESOFT CLEAR TO HIRES 1 +BKGND .EQ $F3F4 APPLESOFT HIRES BACKGROUND CLEAR +HCOLOR .EQ $F6F0 APPLESOFT HIRES COLOR SELECT +HPOSN .EQ $F411 APPLESOFT HIRES POSITION +HPLOT .EQ $F457 APPLESOFT HIRES PLOT +PLOT .EQ $F800 PLOT LORES BLOCK +HLINE .EQ $F819 HORIZ LORES LINE +VLINE .EQ $F828 VERTICAL LORES LINE +CLRSCR .EQ $F832 CLEAR FULL LORES SCREEN +CLRTOP .EQ $FB36 CLEAR TOP. LORES SCREEN +GBSCALC .EQ $F847 LORES BASE CALCULATION +NEXTCOL .EQ $F85F INCREASE LORES COLOR BY 3 +SETCOL .EQ $F864 SET LORES COLOR +SCRN .EQ $F871 READ LORES SCREEN COLOR +PRNTAX .EQ $F941 OUTPUT A THEN X. AS HEX +PRBLNK .EQ $F948 OUTPUT 3 SPACES VIA BOOKS +PRBL2 .EQ $F94A OUTPUT X BLANKS VIA HOOKS +REGDSP .EQ $FAD7 DISPLAY WORKING REGISTERS +PREAD .EQ $FB1E READ GAME PADDLE X +INIT .EQ $FB2F INITIALIZE TEXT SCREEN +SETTXT .EQ $FB93 SET UP TEXT SCREEN (NOT 2E!) +SETGR .EQ $FB40 SET UP GRAPHICS SCREEN +SETWND .EQ $FB4B SET NORMAL TEXT WINDOW +SETPWRC .EQ $FB6F +BASCALC .EQ $FBC1 CALCULATE TEXT BASE ADDRESS (NOT 2E!} +BELL1 .EQ $FBD9 BEEP SPEAKER IF CTRL-G +BELL2 .EQ $FBE4 BEEP SPEAKER ONCE +ADVANCE .EQ $FBF4 TEXT CURSOR ONE TO RIGHT +VIDOUT .EQ $FBFD OUTPUT ASCII TO SCREEN ONLY +BS .EQ $FC10 BACKSPACE SCREEN +UP .EQ $FC1A MOVE SCREEN CURSOR UP ONE LINE +VTAB .EQ $FC22 VERTICAL SCREEN TAB USING CV +VTABA .EQ $FC24 VERTICAL SCREEN TAB USING A +ESC1 .EQ $FC66 PROCESS ESCAPE CURSOR MOVES +CLREOP .EQ $FC42 CLEAR TO END OF PAGE +HOME .EQ $FC58 CLEAR TEXT SCREEN AND HOME CURSOR +CR .EQ $FC62 CARRIAGE RETURN TO SCREEN +LF .EQ $FC66 LINEFEED TO SCREEN ONLY +SCROLL .EQ $FC70 SCROLL TEXT SCREEN UP ONE +CLEOL .EQ $FC9C CLEAR TEXT TO END OF LINE +WAIT .EQ $FCA8 TIME DELAY SET BY ACCUMULATOR +RDKEY .EQ $FD0C GET INPUT CHARACTER VIA HOOKS +KEYIN .EQ $FD1B READ THE APPLE KEYBOARD +RDCHAR .EQ $FD35 GET KEY AND PROCESS ESC A-F +CANCEL .EQ $FD62 CANCEL KEYBOARD LINE ENTRY +GETLNZ .EQ $FD67 CR THEN GET KEYBOARD INPUT LINE +GETLN .EQ $FD6A GET KEYBOARD INPUT LINE +GETLN1 .EQ $FD6F GET KBD INPUT, NO PROMPT +CROUT1 .EQ $FD8B CLEAR EOL THEN CR VIA BOOKS +CROUT .EQ $FD8E OUTPUT CR VIA HOOKS +PRBYTE .EQ $FDDA OUTPUT FULL A IN HEX TO HOOKS +PRHEX .EQ $FDE3 OUTPUT LOW A IN HEX TO HOOKS +COUT .EQ $FDED OUTPUT CHARACTER VIA HOOKS +COUTl .EQ $FDF0 OUTPUT CHARACTER TO SCREEN +MOVE .EQ $FE2C MOVE BLOCK OF MEMORY +VERIFY .EQ $FE36 VERIFY BLOCK OF MEMORY +LIST .EQ $FE5E DISASSEMBLE 20 INSTRUCTIONS +LIST2 .EQ $FE63 DISASSEMBLE •A• INSTRUCTIONS +SETINV .EQ $FE80 PRINT INVERSE TEXT TO SCREEN +SETNORM .EQ $FE84 PRINT NORMAL TEXT TO SCREEN +SETVID .EQ $FE93 GRAB OUTPUT HOOKS FOR SCREEN +XBASIC .EQ $FEB0 GO BASIC, DESTROYING OLD +BASCON .EQ $FEB3 GO BASIC, CONTINUING OLD +TRACE .EQ $FEC2 START TRACING (OLD ROM ONLY!) +STEP .EQ $FEC4 SINGLE STEP (OLD ROM ONLY!) +WRITE .EQ $FECD WRITE TO CASSETTE TAPE +READ .EQ $FEF0 READ TO CASSETTE TAPE +PRERR .EQ $FF2D PRINT "ERR" TO OUTPUT HOOK +BELL .EQ $FF3A OUTPUT BELL TO HOOKS +IORESR .EQ $FF3F RESTORE ALL WORKING REGISTER +IOSAVE .EQ $FF4A SAVE ALL WORKING REGISTERS +RETURN .EQ $FF58 "GUARANTEED" RETURN +OLDRST .EQ $FF59 OLD RESET, NO AUTOSTART +MON .EQ $FF65 ENTER MONITOR AND BEEP SPEAKER +MONZ .EQ $FF69 ENTER MONITOR QUIETLY +GETNUM .EQ $FFA7 ASCII TO HEX IN 3E & 3F +*-------------------------------------- +MAN +SAVE INC/MONITOR.I diff --git a/INC/PRODOS.I.txt b/INC/PRODOS.I.txt new file mode 100644 index 00000000..795d97d4 --- /dev/null +++ b/INC/PRODOS.I.txt @@ -0,0 +1,131 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 1000 + .LIST OFF +*-------------------------------------- +* PRODOS Constants +*-------------------------------------- +MLI.MAXPATH .EQ 64 +*-------------------------------------- +* PRODOS Defines +*-------------------------------------- +MLIALLOCIRQ .EQ $40 +MLIDEALLOCIRQ .EQ $41 +MLIATALK .EQ $42 +MLIQUIT .EQ $65 +MLIREADBLOCK .EQ $80 +MLIWRITEBLOCK .EQ $81 +MLIGETTIME .EQ $82 +MLICREATE .EQ $C0 +MLIDESTROY .EQ $C1 +MLIRENAME .EQ $C2 +MLISETFILEINFO .EQ $C3 +MLIGETFILEINFO .EQ $C4 +MLIONLINE .EQ $C5 +MLISETPREFIX .EQ $C6 +MLIGETPREFIX .EQ $C7 +MLIOPEN .EQ $C8 +MLINEWLINE .EQ $C9 +MLIREAD .EQ $CA +MLIWRITE .EQ $CB +MLICLOSE .EQ $CC +MLIFLUSH .EQ $CD +MLISETMARK .EQ $CE +MLIGETMARK .EQ $CF +MLISETEOF .EQ $D0 +MLIGETEOF .EQ $D1 +MLISETBUF .EQ $D2 +MLIGETBUF .EQ $D3 +*-------------------------------------- +MLI.ERR.BADCALL .EQ $01 +MLI.ERR.BADCNT .EQ $04 +MLI.ERR.IRQFULL .EQ $25 +MLI.ERR.IO .EQ $27 +MLI.ERR.NODEV .EQ $28 +MLI.ERR.WRTPROT .EQ $2B +MLI.ERR.DSKSWIT .EQ $2E +MLI.ERR.INVPATH .EQ $40 +MLI.ERR.FCBFULL .EQ $42 +MLI.ERR.BADREF .EQ $43 +MLI.ERR.PNOTFND .EQ $44 +MLI.ERR.VNOTFND .EQ $45 +MLI.ERR.FNOTFND .EQ $46 +MLI.ERR.DUPFILE .EQ $47 +MLI.ERR.OVERRUN .EQ $48 +MLI.ERR.VOLFULL .EQ $49 + +*-------------------------------------- +MLI .EQ $BF00 +JSPARE .EQ $BF03 +DATETIME .EQ $BF06 +SYSERR .EQ $BF09 +SYSDEATH .EQ $BF0C +SERR .EQ $BF0F +DEVPTRS0D1 .EQ $BF10 +DEVPTRS1D1 .EQ $BF12 +DEVPTRS2D1 .EQ $BF14 +DEVPTRS3D1 .EQ $BF16 +DEVPTRS4D1 .EQ $BF18 +DEVPTRS5D1 .EQ $BF1A +DEVPTRS6D1 .EQ $BF1C +DEVPTRS7D1 .EQ $BF1E +DEVPTRS0D2 .EQ $BF20 +DEVPTRS1D2 .EQ $BF22 +DEVPTRS2D2 .EQ $BF24 +DEVPTRS3D2 .EQ $BF26 +DEVPTRS4D2 .EQ $BF28 +DEVPTRS5D2 .EQ $BF2A +DEVPTRS6D2 .EQ $BF2C +DEVPTRS7D2 .EQ $BF2E +DEVNUM .EQ $BF30 +DEVCNT .EQ $BF31 +DEVLST .EQ $BF32 -> $BF3F +DEVLST0END .EQ $BF40 A 0 was added to ensure list ended with 0 if 14 devices in list +PRODOSCOPYRIGHT .EQ $BF41 ;free->$BF4B +MEMTABL .EQ $BF58 -> $BF6F +GL.BUFF .EQ $BF70 +INTRUPT1 .EQ $BF80 +INTRUPT2 .EQ $BF82 +INTRUPT3 .EQ $BF84 +INTRUPT4 .EQ $BF86 +DATELO .EQ $BF90 +TIMELO .EQ $BF92 +LEVEL .EQ $BF94 +BUBIT .EQ $BF95 +SPARE1 .EQ $BF96 +MACHID .EQ $BF98 +*-------------------------------------- +MACHID.TYPE .EQ %11001000 +MACHID.TYPE.II .EQ %00000000 +MACHID.TYPE.IIp .EQ %01000000 +MACHID.TYPE.IIe .EQ %10000000 +MACHID.TYPE.IIc .EQ %10001000 +MACHID.TYPE.III .EQ %11000000 +MACHID.RAM .EQ %00110000 +MACHID.RAM.128 .EQ %00110000 +MACHID.RAM.64 .EQ %00100000 +MACHID.RAM.48 .EQ %00010000 +MACHID.SPARE .EQ %00000100 +MACHID.COL80 .EQ %00000010 +MACHID.CLK .EQ %00000001 +*-------------------------------------- +SLTBYT .EQ $BF99 +PFIXPTR .EQ $BF9A +MLIACTV .EQ $BF9B +CMDADR .EQ $BF9C +SAVEX .EQ $BF9E +SAVEY .EQ $BF9F +*-------------------------------------- +* code $BFA0 -> $BFF3 +*-------------------------------------- +BNKBYT1 .EQ $BFF4 +BNKBYT2 .EQ $BFF5 +SYS.RTS .EQ $BFF6 code -> $BFFB +IBAKVER .EQ $BFFC +IVERSION .EQ $BFFD +KBAKVER .EQ $BFFE +KVERSION .EQ $BFFF +MAN +SAVE INC/PRODOS.I diff --git a/INC/ZP.I.txt b/INC/ZP.I.txt new file mode 100644 index 00000000..2161851a --- /dev/null +++ b/INC/ZP.I.txt @@ -0,0 +1,30 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 +*-------------------------------------- +WNDLFT .EQ $20 SCROLL WINDOW LEFT +WNDWDTH .EQ $21 SCROLL WINDOW WIDTH +WNDTOP .EQ $22 SCROLL WINDOW TOP +WNDBOT .EQ $23 SCROLL WINDOW BOTTOM +CH .EQ $24 CURSOR HORIZONTAL +CV .EQ $25 CURSOR VERTICAL +GBASL .EQ $26 LORES BASE LOW +GBASH .EQ $27 LORES BASE HIGH +BASL .EQ $28 TEXT BASE LOW +BASH .EQ $29 TEXT BASE HIGH +BEND .EQ $2C LORES RIGHT END H LINE +VBOT .EQ $2D LORES BOTTOM OF V LINE +COLOR .EQ $30 LORES COLOR +INVFLG .EQ $31 NORMAL/INVERSE /FLASH (FF,7F,3F) +PROMPT .EQ $33 HOLDS PROMPT SYMBOL +CSWL .EQ $36 OUTPUT CHARACTER HOOK LOW +CSWH .EQ $37 OUTPUT CHARACTER HOOK HIGH +KSWL .EQ $38 INPUT CHARACTER HOOOK LOW +KSWH .EQ $39 INPUT CHARACTER HOOK HIGH +RNDL .EQ $4E RANDOM NUMBER LOW +RNDH .EQ $4F RANDOM NUMBER HIGH +*-------------------------------------- +MAN +SAVE INC/ZP.I diff --git a/LIB/LIBCRYPT.I.txt b/LIB/LIBCRYPT.I.txt new file mode 100644 index 00000000..18022a55 --- /dev/null +++ b/LIB/LIBCRYPT.I.txt @@ -0,0 +1,29 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +LIBCRYPT.MD5PStrA .EQ 4 +LIBCRYPT.MD5Init .EQ 6 +LIBCRYPT.MD5Update .EQ 8 +LIBCRYPT.MD5FinalizeA .EQ 10 +*-------------------------------------- +* S.MD5 STRUCT +*-------------------------------------- +S.MD5.ABCD0 .EQ 0 +S.MD5.A0 .EQ 0 +S.MD5.B0 .EQ 4 +S.MD5.C0 .EQ 8 +S.MD5.D0 .EQ 12 +S.MD5.BITCOUNT .EQ 16 +S.MD5.EXTRABIT .EQ 24 +S.MD5.FINALIZED .EQ 25 +* +S.MD5.SIZE .EQ 26 +*-------------------------------------- +MAN +SAVE INC/LIBCRYPT.I + diff --git a/LIB/LIBCRYPT.S.txt b/LIB/LIBCRYPT.S.txt new file mode 100644 index 00000000..f255c4a5 --- /dev/null +++ b/LIB/LIBCRYPT.S.txt @@ -0,0 +1,511 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF LIB/LIBCRYPT.O +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/LIBCRYPT.I +*-------------------------------------- +* DWORD Macros : Do NOT disturb carry with cpx, cpy... +*-------------------------------------- + .MA ADC32 + ldx #3 + ldy #0 + clc +:1 lda ]1,y + adc ]2,y + sta ]3,y + iny + dex + bpl :1 + .EM +*-------------------------------------- + .MA AND32 + ldx #3 +:1 lda ]1,x + and ]2,x + sta ]3,x + dex + bpl :1 + .EM +*-------------------------------------- + .MA ORA32 + ldx #3 +:1 lda ]1,x + ora ]2,x + sta ]3,x + dex + bpl :1 + .EM +*-------------------------------------- + .MA EOR32 + ldx #3 +:1 lda ]1,x + eor ]2,x + sta ]3,x + dex + bpl :1 + .EM +*-------------------------------------- + .MA NOT32 + ldx #3 +:1 lda ]1,x + eor #$FF + sta ]2,x + dex + bpl :1 + .EM +*-------------------------------------- + .MA MOV32 + ldx #3 +:1 lda ]1,x + sta ]2,x + dex + bpl :1 + .EM +*-------------------------------------- + .MA ROL32x +:2 lda ]1+3 + rol + rol ]1 + rol ]1+1 + rol ]1+2 + rol ]1+3 + dex + bne :2 + .EM +*-------------------------------------- +* Main entry point +* input : +* X = Function +*-------------------------------------- +* Code signature and relocation table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA LIB.LOAD + .DA LIB.UNLOAD + .DA MD5PStrA + .DA MD5Init + .DA MD5Update + .DA MD5FinalizeA +*-------------------------------------- + .DA 0 + .DA CS.END-CS.START + .DA 0 +*-------------------------------------- +LIB.LOAD +LIB.UNLOAD clc + rts +*-------------------------------------- +* MD5PStrA +* in : +* A = hMem To PSTR +* out : +* A = hMem To MessageDigest +*-------------------------------------- +MD5PStrA >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr3 1 and 2 used by other MD5 functions + ldy #0 + lda (ZPQuickPtr3),y get PStr len + sta ZPQuickPtr4 ZPQuickPtr4 = str len + stz ZPQuickPtr4+1 0,PSTR len <= 255 + inc ZPQuickPtr3 + bne .1 + inc ZPQuickPtr3+1 Make DATA skip PSTR Len Byte +.1 jsr MD5Init + bcs .9 + pha save MD5 Context hMem + >PUSHW ZPQuickPtr4 Push LEN + >PUSHW ZPQuickPtr3 Push DATA + pla + pha + >PUSHA Push MD5 Context + jsr MD5Update + pla get back MD5 Context + pha + jsr MD5FinalizeA + plx get back MD5 Context hMem + pha save MessageDigest hMem + txa + >SYSCALL SYS.FreeMemA Free MD5 Context + pla get back MessageDigest hMem + clc +.9 rts +*-------------------------------------- +* MD5Init +* In : +* Out : +* A = hMem To S.MD5 +*-------------------------------------- +MD5Init >PUSHWI S.MD5.SIZE + >PUSHBI 0 + >SYSCALL SYS.GetMem + bcs .9 + >STYA ZPQuickPtr1 + ldy #0 +.1 lda MD5.ABCDINIT,y + sta (ZPQuickPtr1),y + iny + cpy #16 + bne .1 + lda #0 +.2 sta (ZPQuickPtr1),y + iny + cpy #S.MD5.SIZE Includes S.MD5.FINALIZED Flag + bne .2 + txa + clc +.9 rts +*-------------------------------------- +* MD5Update (Append "$80" & Padding & original size) +* In: +* PULLB MD5 Context hMem +* PULLW DATA PTR +* PULLW DATA LEN +*-------------------------------------- +MD5Update >PULLA get MD5 Context + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 get MD5 Context + >PULLW R.AX get DATA + >PULLW R.BX get LEN + ldy #S.MD5.FINALIZED + lda (ZPQuickPtr1),y + beq .1 + sec + rts +.1 lda R.BH More than 256 Bytes remaining to hash ? + bne .3 yes + lda R.BL + bne .2 Len = O ? + clc All data processed + rts +.2 cmp #64 More than 64 Bytes remaining to hash ? + bcc .50 yes +.3 lda #64 +.50 sta R.CL Save Chunk Len + jsr MD5UpdateBitCount + ldy #0 +.51 lda (R.AX),y Load Buffer with data + sta MD5.BUFFER64,y + iny + cpy R.CL + bne .51 + cpy #64 Full 64 Bytes DATA ? + beq .58 + lda #$80 no, Append $80 + sta MD5.BUFFER64,y + lda #0 +.52 iny Pad with 0 to 64 + cpy #64 + beq .53 + sta MD5.BUFFER64,y + bra .52 +.53 ldy #S.MD5.EXTRABIT Mark MD5 Context as Appended + lda #$80 + sta (ZPQuickPtr1),y + lda R.CL + cmp #56 Enough room for BITCOUNT ? + bcs .58 no + jsr MD5AppendBitCount +.58 jsr MD5Transform + jsr MD5UpdateABCD0 +.8 lda R.BL Substract Bytes processed from LEN + sec + sbc R.CL get back chunk Len + sta R.BL + bcs .81 + dec R.BH +.81 lda R.AL Add Bytes processed to DATA + clc + adc R.CL + sta R.AL + bcc .82 + inc R.AH +.82 jmp .1 +*-------------------------------------- +* MD5FinalizeA +* In : +* A = hMem To S.MD5 +* Out: +* A = MessageDigest (PSTR, 16 Bytes, 32 Chars) +*-------------------------------------- +MD5FinalizeA >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 get MD5 Context + ldy #S.MD5.FINALIZED + lda (ZPQuickPtr1),y + bne .11 + jsr MD5ExtraChunk +.11 >PUSHWI 33 Len + 32 Digits + >PUSHBI 0 + >SYSCALL SYS.GetMem + bcs .9 + >STYA ZPQuickPtr2 + phx save hMem for return + lda #32 + sta (ZPQuickPtr2) + inc ZPQuickPtr2 + bne .10 + inc ZPQuickPtr2+1 +.10 ldy #S.MD5.ABCD0 +.1 lda (ZPQuickPtr1),y + lsr + lsr + lsr + lsr + tax + lda MD5.DIGITS,x + sta (ZPQuickPtr2) + inc ZPQuickPtr2 + bne .2 + inc ZPQuickPtr2+1 +.2 lda (ZPQuickPtr1),y + and #$0F + tax + lda MD5.DIGITS,x + sta (ZPQuickPtr2) + inc ZPQuickPtr2 + bne .3 + inc ZPQuickPtr2+1 +.3 iny + cpy #S.MD5.ABCD0+16 + bne .1 + pla get back hMem + clc +.9 rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +* MD5AppendBitCount +* In : +* ZPQuickPtr1 = MD5 Context +*-------------------------------------- +MD5AppendBitCount + ldx #56 + ldy #S.MD5.BITCOUNT Append 8 Bytes of BITCOUNT +.1 lda (ZPQuickPtr1),y + sta MD5.BUFFER64,x + inx + iny + cpy #S.MD5.BITCOUNT+8 + bne .1 + ldy #S.MD5.FINALIZED Mark MD5 Context as Finalized + lda #$80 + sta (ZPQuickPtr1),y + rts +*-------------------------------------- +* MD5UpdateBitCount +* In : +* CL = Size (in bytes) to add to MD5 context +* ZPQuickPtr1 = MD5 Context +*-------------------------------------- +MD5UpdateBitCount + stz R.CH + lda R.CL + asl + rol R.CH + asl times 8 to get bit count + rol R.CH + asl + rol R.CH + clc + ldy #S.MD5.BITCOUNT + adc (ZPQuickPtr1),y + sta (ZPQuickPtr1),y + iny + lda R.CH + adc (ZPQuickPtr1),y + sta (ZPQuickPtr1),y + bcc .8 +.1 iny + lda (ZPQuickPtr1),y + inc + sta (ZPQuickPtr1),y + bne .8 + cpy #7 + bne .1 +.8 rts +*-------------------------------------- +* MD5ExtraChunk +* In : +* ZPQuickPtr1 = MD5 Context +*-------------------------------------- +MD5ExtraChunk ldy #S.MD5.FINALIZED + lda #$80 + sta (ZPQuickPtr1),y Mark MD5 Context as "finalized" + ldx #0 + ldy #S.MD5.EXTRABIT Extra Bit already appended ? + lda (ZPQuickPtr1),y + bne .1 + lda #$80 + sta MD5.BUFFER64 Add extra bit to buffer + sta (ZPQuickPtr1),y Mark Extrabit added + inx +.1 stz MD5.BUFFER64,x pad with "0"... + inx + cpx #56 + bne .1 ...until room for bitcount + jsr MD5AppendBitCount + jsr MD5Transform +*-------------------------------------- +* MD5UpdateABCD0 +* In: +* ZPQuickPtr1 = MD5 Context +*-------------------------------------- +MD5UpdateABCD0 ldy #0 +.1 clc ADC32 A+A0->A0, B, C, D.... +.2 lda MD5.ABCD,y + adc (ZPQuickPtr1),y + sta (ZPQuickPtr1),y + iny + tya + and #3 + bne .2 + cpy #16 + bne .1 + rts +*-------------------------------------- +* MD5Transform +* In: +* ZPQuickPtr1 = MD5 Context +* 512 Bits Padded chunk in MD5.BUFFER64 +* Out: +* Updated MD5.ABCD +*-------------------------------------- +MD5Transform ldy #15 init ABCD Chunk with Context ABCD0 +.1 lda (ZPQuickPtr1),y + sta MD5.ABCD,y + dey + bpl .1 + stz MD5.i Start Proceed 0 to 63 bytes +*-------------------------------------- +MD5.0015 lda MD5.i + cmp #16 + bcs MD5.1631 + >AND32 MD5.B,MD5.C,MD5.F1 + >NOT32 MD5.B,MD5.F2 + >AND32 MD5.F2,MD5.D,MD5.F2 + >ORA32 MD5.F1,MD5.F2,MD5.F + jmp MD5.NEXTi +*-------------------------------------- +MD5.1631 cmp #32 + bcs MD5.3247 + >AND32 MD5.D,MD5.B,MD5.F1 + >NOT32 MD5.D,MD5.F2 + >AND32 MD5.F2,MD5.C,MD5.F2 + >ORA32 MD5.F1,MD5.F2,MD5.F + jmp MD5.NEXTi +*-------------------------------------- +MD5.3247 cmp #48 + bcs MD5.4863 + >EOR32 MD5.B,MD5.C,MD5.F + >EOR32 MD5.F,MD5.D,MD5.F + jmp MD5.NEXTi +*-------------------------------------- +MD5.4863 cmp #64 + bne .1 + rts +.1 >NOT32 MD5.D,MD5.F1 + >ORA32 MD5.F1,MD5.B,MD5.F2 + >EOR32 MD5.F2,MD5.C,MD5.F +*-------------------------------------- +MD5.NEXTi >MOV32 MD5.D,MD5.DTemp + >MOV32 MD5.C,MD5.D + >MOV32 MD5.B,MD5.C + >ADC32 MD5.A,MD5.F,MD5.F + lda MD5.i + asl + asl + tay + ldx #0 + clc +.1 lda MD5.K,y ADC32 MD5.K[i],MD5.F,MD5.F + adc MD5.F,x + sta MD5.F,x + iny + inx + txa + eor #4 DO NOT DISTURB carry with cpx !!! + bne .1 + ldy MD5.i + lda MD5.g,y + asl + asl + tay + ldx #0 + clc +.2 lda MD5.BUFFER64,y ADC32 M[g],MD5.F,MD5.F + adc MD5.F,x + sta MD5.F,x + iny + inx + txa + eor #4 DO NOT DISTURB carry with cpx !!! + bne .2 + ldy MD5.i + lda MD5.s,y get s[i] in x + tax + >ROL32x MD5.F + >ADC32 MD5.B,MD5.F,MD5.B + >MOV32 MD5.DTemp,MD5.A + inc MD5.i + jmp MD5.0015 +*-------------------------------------- +CS.END +MD5.ABCD +MD5.A .BS 4 Chunk Level,A,B,C,D +MD5.B .BS 4 +MD5.C .BS 4 +MD5.D .BS 4 +MD5.DTemp .BS 4 +MD5.F .BS 4 +MD5.F1 .BS 4 +MD5.F2 .BS 4 +MD5.i .BS 1 +MD5.BUFFER64 .BS 64 +*-------------------------------------- +MD5.ABCDINIT .HS 01234567.89ABCDEF.FEDCBA98.76543210 +*-------------------------------------- +MD5.s .DA #7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22 + .DA #5,#9,#14,#20,#5,#9,#14,#20,#5,#9,#14,#20,#5,#9,#14,#20 + .DA #4,#11,#16,#23,#4,#11,#16,#23,#4,#11,#16,#23,#4,#11,#16,#23 + .DA #6,#10,#15,#21,#6,#10,#15,#21,#6,#10,#15,#21,#6,#10,#15,#21 +*-------------------------------------- +MD5.g .DA #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15 + .DA #1,#6,#11,#0,#5,#10,#15,#4,#9,#14,#3,#8,#13,#2,#7,#12 + .DA #5,#8,#11,#14,#1,#4,#7,#10,#13,#0,#3,#6,#9,#12,#15,#2 + .DA #0,#7,#14,#5,#12,#3,#10,#1,#8,#15,#6,#13,#4,#11,#2,#9 +*-------------------------------------- +MD5.K .HS 78A46AD7.56B7C7E8.DB702024.EECEBDC1 + .HS AF0F7CF5.2AC68747.134630A8.019546FD + .HS D8988069.AFF7448B.B15BFFFF.BED75C89 + .HS 2211906B.937198FD.8E4379A6.2108B449 + .HS 62251EF6.40B340C0.515A5E26.AAC7B6E9 + .HS 5D102FD6.53144402.81E6A1D8.C8FBD3E7 + .HS E6CDE121.D60737C3.870DD5F4.ED145A45 + .HS 05E9E3A9.F8A3EFFC.D9026F67.8A4C2A8D + .HS 4239FAFF.81F67187.22619D6D.0C38E5FD + .HS 44EABEA4.A9CFDE4B.604BBBF6.70BCBFBE + .HS C67E9B28.FA27A1EA.8530EFD4.051D8804 + .HS 39D0D4D9.E599DBE6.F87CA21F.6556ACC4 + .HS 442229F4.97FF2A43.A72394AB.39A093FC + .HS C3595B65.92CC0C8F.7DF4EFFF.D15D8485 + .HS 4F7EA86F.E0E62CFE.144301A3.A111084E + .HS 827E53F7.35F23ABD.BBD2D72A.91D386EB +*-------------------------------------- +MD5.DIGITS .AS "0123456789ABCDEF" +*-------------------------------------- +MAN +SAVE LIB/LIBCRYPT.S +ASM diff --git a/LIB/LIBSTR.S.txt b/LIB/LIBSTR.S.txt new file mode 100644 index 00000000..39c74547 --- /dev/null +++ b/LIB/LIBSTR.S.txt @@ -0,0 +1,783 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF LIB/LIBSTR.O +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA LIB.LOAD + .DA LIB.UNLOAD + .DA PRINTF + .DA PRINTC + .DA PRINTP + .DA STRMATCHP + .DA STRCPYP + .DA STRCATP + .DA UCASEP + .DA LCASEP + .DA PRINTDATE + .DA PRINTTIME + .DA SSCANF +*-------------------------------------- +PRINTFJMP1 .DA PRINTFA + .DA PRINTFB,PRINTFBB + .DA PRINTFD,PRINTFDD,PRINTFL + .DA PRINTFE,PRINTFEE + .DA PRINTFH,PRINTFHH + .DA PRINTFI,PRINTFII + .DA PRINTFSC,PRINTFSP + .DA PRINTFT,PRINTFTT +PRINTFJMP2 .DA PRINTFCR,PRINTFBKSLH,PRINTFPERCENT +*-------------------------------------- + .DA 0 + .DA CS.END-CS.START + .DA 0 +*-------------------------------------- +LIB.LOAD +LIB.UNLOAD clc + rts +*-------------------------------------- +* PRINTF : +* Prints C-Style String +* PULLW Pointer to Sting,Last Byte negative +* %a pull 1 byte to print ATTRIB String +* %b pull 1 byte to print BIN +* %B pull 2 byte to print BIN +* %d pull 1 byte to print unsigned DEC +* %D pull 2 bytes to print unsigned DEC +* %L pull 4 bytes to print unsigned DEC +* %e pull 1 byte to print low Nibble HEX +* %E pull 1 byte to print high Nibble HEX +* %h pull 1 byte to print HEX +* %H pull 2 bytes to print HEX +* %i pull 1 byte to print signed DEC +* %I pull 2 bytes to print signed DEC +* %s pull 2 bytes ptr to C-Style String +* %S pull 2 bytes ptr to P-Style String +* \n print CR=13 +* \\ print \ +* \% print % +* padding : +* %d '9' '12' +* %2d ' 9' '12' +* %02d '09' '12' +* %16s 'ABCDEFGHIjkl ' +* %011s 'ABCDEFGH000' +*-------------------------------------- +PRINTF >PULLW ZPTmpPtr1 + ldy #0 +PRINTFCOUT lda (ZPTmpPtr1),y + beq .1 + ora #$80 + cmp #"%" + beq PRINTFESC1 + cmp #"\" + beq PRINTFESC2 + jsr COUT + iny + bne PRINTFCOUT +.1 rts +PRINTFEXIT ply + iny + bne PRINTFCOUT + rts +*-------------------------------------- +PRINTFESC1 stz PADLEN + lda #" " + sta PADCHAR +.1 ldx #PRINTFTBL1.END-PRINTFTBL1-1 + iny + lda (ZPTmpPtr1),y + beq .9 + ora #$80 +.2 cmp PRINTFTBL1,x do we have a %x command? + beq .8 yes, jmp to it! + dex + bpl .2 no valid letter... + cmp #"0" ...a 0...mmm... padding char!! + beq .4 + bcc .9 + cmp #"9" + bcs .9 +.3 and #$0F we have a digit + pha save it... + lda PADLEN starts PADLEN * 10 + asl times 2 + pha save times 2 + asl times 4 + asl times 8 + sta PADLEN + pla get back times 2 + clc + adc PADLEN times 8 + times 2 = times 10 + sta PADLEN + pla get back current digit + adc PADLEN + sta PADLEN + bra .5 +.4 lda PADLEN do we already had met digits to build PADLEN ? + bne .3 yes, continue to build PADLEN + lda #"0" + sta PADCHAR no, this is the first 0, so make it PADCHAR +.5 bra .1 +.8 phy + txa + asl + tax + jmp (PRINTFJMP1,x) +.9 rts +*-------------------------------------- +PRINTFESC2 ldx #PRINTFTBL2.END-PRINTFTBL2-1 + iny + lda (ZPTmpPtr1),y + beq .9 + ora #$80 +.2 cmp PRINTFTBL2,x + beq .3 + dex + bpl .2 + rts +.3 phy + txa + asl + tax + jmp (PRINTFJMP2,x) +.9 rts +*-------------------------------------- +PRINTFA >PULLA + ldx #0 +.1 asl + pha + lda #"-" + bcc .2 + lda PRINTF.ATTRIB,x +.2 jsr COUT + pla + inx + cpx #8 + bne .1 + jmp PRINTFEXIT +PRINTFB ldx #8 + >PULLA +.1 asl + pha + lda #$B0 + bcc .2 + inc +.2 jsr COUT + pla + dex + bne .1 + jmp PRINTFEXIT +PRINTFBB >PULLA + >PULLA + jmp PRINTFEXIT +PRINTFD >PULLA + sta HEXBUF + stz HEXBUF+1 + stz HEXBUF+2 + stz HEXBUF+3 + jsr HEX2DEC + jmp PRINTFEXIT +PRINTFDD >PULLA + sta HEXBUF + >PULLA + sta HEXBUF+1 + stz HEXBUF+2 + stz HEXBUF+3 + jsr HEX2DEC + jmp PRINTFEXIT +PRINTFL >PULLA + sta HEXBUF + >PULLA + sta HEXBUF+1 + >PULLA + sta HEXBUF+2 + >PULLA + sta HEXBUF+3 + jsr HEX2DEC + jmp PRINTFEXIT +PRINTFE >PULLA + jsr PRHEX + jmp PRINTFEXIT +PRINTFEE >PULLA + lsr + lsr + lsr + lsr + jsr PRHEX + jmp PRINTFEXIT +PRINTFH >PULLA + jsr PRBYTE + jmp PRINTFEXIT +PRINTFHH >PULLA + pha + >PULLA + jsr PRBYTE + pla + jsr PRBYTE + jmp PRINTFEXIT +PRINTFI >PULLA + jmp PRINTFEXIT +PRINTFII >PULLA + >PULLA + jmp PRINTFEXIT +PRINTFSC >PULLYA + jsr PRINTYA + jmp PRINTFEXIT +PRINTFSP >PULLYA + jsr PRINTYAP + jmp PRINTFEXIT +PRINTFT jsr PRINTTIME + jmp PRINTFEXIT +PRINTFTT jsr PRINTDATE + jmp PRINTFEXIT +PRINTFCR jsr CROUT + jmp PRINTFEXIT +PRINTFBKSLH lda #"\" + jsr COUT + jmp PRINTFEXIT +PRINTFPERCENT lda #"%" + jsr COUT + jmp PRINTFEXIT +*-------------------------------------- +PRINTC >PULLW ZPTmpPtr2 + ldy #0 +.1 lda (ZPTmpPtr2),y + beq .8 + ora #$80 + jsr COUT + iny + bne .1 +.8 rts +*-------------------------------------- +PRINTP >PULLW ZPTmpPtr2 + ldy #0 + lda (ZPTmpPtr2),y + tax + beq .8 +.1 iny + lda (ZPTmpPtr2),y + ora #$80 + jsr COUT + dex + bne .1 +.8 rts +*-------------------------------------- +* STRMATCHP : (P-Style Strings) +* pull PTR to Dest String +* pull PTR to Src string +* works with wildcards : +* Dest Str Src str +* message = m?ss* +* = me*ge +* = *ge +* = * +* message = me?sage != me?age +*-------------------------------------- +STRMATCHP >PULLW ZPTmpPtr1 + >PULLW ZPTmpPtr2 + rts +*-------------------------------------- +* STRCPYP : (P-Style Strings) +* pull PTR to Dest String +* pull PTR to Src string +*-------------------------------------- +STRCPYP >PULLW ZPTmpPtr1 + >PULLW ZPTmpPtr2 + lda (ZPTmpPtr2) + sta (ZPTmpPtr1) + tay + beq .2 +.1 lda (ZPTmpPtr2),y + sta (ZPTmpPtr1),y + dey + bne .1 +.2 rts +*-------------------------------------- +* STRCATP : (P-Style Strings) +* pull PTR to Dest String +* pull PTR to Src string +*-------------------------------------- +STRCATP >PULLW ZPTmpPtr1 + >PULLW ZPTmpPtr2 + lda (ZPTmpPtr1) + tay + iny + lda (ZPTmpPtr2) + tax + beq .3 +.1 inc ZPTmpPtr2 + bne .2 + inc ZPTmpPtr2+1 +.2 lda (ZPTmpPtr2) + sta (ZPTmpPtr1),y + iny + dex + bne .1 + dey + tya + sta (ZPTmpPtr1) +.3 rts +*-------------------------------------- +UCASEP phx + >PULLW ZPTmpPtr2 + ldy #0 + lda (ZPTmpPtr2),y + tax + beq .9 +.1 iny + lda (ZPTmpPtr2),y + cmp #$61 "a" + bmi .2 + cmp #$7B "z"+1 + bpl .2 + sec + sbc #$20 + sta (ZPTmpPtr2),y +.2 dex + bne .1 +.9 plx + rts +*-------------------------------------- +LCASEP phx + >PULLW ZPTmpPtr2 + ldy #0 + lda (ZPTmpPtr2),y + tax + beq .9 +.1 iny + lda (ZPTmpPtr2),y + cmp #$41 "A" + bmi .2 + cmp #$5B "Z"+1 + bpl .2 + clc + adc #$20 + sta (ZPTmpPtr2),y +.2 dex + bne .1 +.9 plx + rts +*-------------------------------------- +* PULLW = DATE in ProDOS Format +* A = year, Y = month/day +*-------------------------------------- +PRINTDATE stz HEXBUF+1 + stz HEXBUF+2 + stz HEXBUF+3 + ldx #"0" + stx PADCHAR + ldx #2 + stx PADLEN + >PULLYA + pha save year to get high bit of month later + lsr + pha + cmp #70 are we in the 70s ? + bcc .1 + lda #$19 + bra .2 +.1 lda #$20 +.2 jsr PRBYTE + pla + sta HEXBUF + jsr HEX2DEC + lda #"/" + jsr COUT + ldx #"0" + stx PADCHAR + ldx #2 + stx PADLEN + pla get back year + lsr get high bit of month in carry + tya get month/day + pha save it for day + ror pick high bit from carry + lsr + lsr + lsr + lsr + sta HEXBUF + jsr HEX2DEC + lda #"/" + jsr COUT + ldx #"0" + stx PADCHAR + ldx #2 + stx PADLEN + pla get back month/day + and #$1F + sta HEXBUF + jmp HEX2DEC +*-------------------------------------- +* PULLW = TIME in ProDOS Format +* A = hours, Y = minutes +*-------------------------------------- +PRINTTIME stz HEXBUF+1 + stz HEXBUF+2 + stz HEXBUF+3 + ldx #"0" + stx PADCHAR + ldx #2 + stx PADLEN + >PULLYA + and #$1F + sta HEXBUF + jsr HEX2DEC + lda #":" + jsr COUT + ldx #"0" + stx PADCHAR + ldx #2 + stx PADLEN + tya get minutes + and #$3F + sta HEXBUF + jmp HEX2DEC +*-------------------------------------- +* +*-------------------------------------- +SSCANF >PULLW ZPTmpPtr1 get PString to scan (ex: "192.168.1.5") + >PULLW ZPTmpPtr2 get PString pattern (ex: "%d.%d.%d.%d") + >PULLW ZPTmpPtr3 get target buffer + + ldy #0 Y = PTR in pattern + + lda (ZPTmpPtr1) + beq .9 + tax X = COUNT to scan + inc ZPTmpPtr1 + bne .1 + inc ZPTmpPtr1+1 + +.1 txa End Of String? + beq .8 + tya + cmp (ZPTmpPtr2) End of pattern? + beq .8 + iny + lda (ZPTmpPtr2),y + cmp #'%' Escape? + beq .2 + cmp (ZPTmpPtr1) Same char? + bne .9 + jsr SSCANF.IncPtr1 + bne .1 + clc + rts + +.2 tya + cmp (ZPTmpPtr2) unexpected End of pattern after "%" ? + beq .9 + + iny + lda (ZPTmpPtr2),y + cmp #'d' BYTE ? + bne .3 + + stz ASCBUF +.20 lda (ZPTmpPtr1) + jsr SSCANF.IsDigit + bcs .21 + phx + inc ASCBUF + ldx ASCBUF + sta ASCBUF,x + plx + jsr SSCANF.IncPtr1 + bne .20 end of string ? + +.21 jsr DEC2HEX + lda HEXBUF + sta (ZPTmpPtr3) + inc ZPTmpPtr3 + bne .1 + inc ZPTmpPtr3+1 + bra .1 + +.3 cmp #'D' WORD ? + bne .4 + + bra .1 + +.4 cmp #'s' STRING ? + bne .9 + + bra .1 + +.8 clc + rts + +.9 sec + rts + +*-------------------------------------- +SSCANF.IncPtr1 dex + beq .1 + inc ZPTmpPtr1 + bne .1 + inc ZPTmpPtr1+1 never Zero +.1 rts +*-------------------------------------- +SSCANF.IsDigit cmp #'0' + bcc .1 + cmp #'9'+1 + bcs .1 + rts +.1 sec + rts +*-------------------------------------- +********** PRIVATE FUNCTIONS ********** +*-------------------------------------- +* PRINTYAC : +* Prints C-Style String +* Y,A=Pointer to Sting, Last Byte 0 +*-------------------------------------- +PRINTYA >STYA ZPTmpPtr2 + ldy #0 +.1 lda (ZPTmpPtr2),y + beq .2 + ora #$80 + jsr COUT + iny + bne .1 +.2 rts +*-------------------------------------- +* PRINTYAP : +* Prints Pascal-Style String +* Y,A=Pointer to Sting, LEN=1st Byte +*-------------------------------------- +PRINTYAP phx + >STYA ZPTmpPtr2 + ldy #0 + lda (ZPTmpPtr2),y + tax + beq .8 +.1 iny + lda (ZPTmpPtr2),y + ora #$80 + jsr COUT + lda PADLEN + beq .2 + cpy PADLEN + beq .8 +.2 dex + bne .1 + lda PADLEN + beq .8 +.3 lda PADCHAR + jsr COUT + iny + cpy PADLEN + bne .3 +.8 plx + rts +*-------------------------------------- +* Convert HEXBUF to ASCBUF decimal padded with 0 +*-------------------------------------- +HEX2DEC phx + phy + ldx #4 +.1 stz BCDBUF,x Clear all 5 bytes + dex + bpl .1 + ldx #32 let's roll 32 bits + sed +.2 asl HEXBUF + rol HEXBUF+1 + rol HEXBUF+2 + rol HEXBUF+3 + php cpy will disturb carry while BCD adc + ldy #0 +.3 plp + lda BCDBUF,y + adc BCDBUF,y + sta BCDBUF,y + php + iny + cpy #5 Last byte of BCDBUF? + bne .3 + plp + dex + bne .2 + cld + ldy #0 + ldx #9 +.4 lda BCDBUF,y + pha + and #$0F + ora #$B0 + sta ASCBUF,x + dex + pla + lsr + lsr + lsr + lsr + ora #$B0 + sta ASCBUF,x + iny + dex + bpl .4 + lda PADLEN any Len format ? + beq .5 no + lda #10 + sec yes, print only digits starting at pos 10-padlen + sbc PADLEN +.5 tax x=0 if no padlen, or x=10-padlen +.6 lda ASCBUF,x + cmp #$B0 a zero? + beq .7 + inc PADLEN found a non zero, print all digits, even if 0, next time + ldy #"0" + sty PADCHAR + bra .8 +.7 cpx #9 last digit ? + beq .8 print always + ldy PADLEN no pad to fill, do not print 0 + beq .9 + lda PADCHAR fill with PADCHAR +.8 jsr COUT +.9 inx + cpx #10 + bne .6 + ply + plx + rts +*-------------------------------------- +* Convert ASCBUF decimal to HEXBUF +*-------------------------------------- +DEC2HEX phx + phy + stz HEXBUF + stz HEXBUF+1 + stz HEXBUF+2 + stz HEXBUF+3 + + ldx #0 +.1 asl HEXBUF HEXBUF * 2 -> HEXBUF + rol HEXBUF+1 + rol HEXBUF+2 + rol HEXBUF+3 + + lda HEXBUF HEXBUF * 2 -> HEXBUFTMP + asl + sta HEXBUFTMP + lda HEXBUF+1 + rol + sta HEXBUFTMP+1 + lda HEXBUF+2 + rol + sta HEXBUFTMP+2 + lda HEXBUF+3 + rol + sta HEXBUFTMP+3 + + asl HEXBUFTMP HEXBUFTMP * 2 -> HEXBUFTMP + rol HEXBUFTMP+1 + rol HEXBUFTMP+2 + rol HEXBUFTMP+3 + + lda HEXBUF HEXBUF + HEXBUFTMP -> HEXBUF + clc + adc HEXBUFTMP + sta HEXBUF + lda HEXBUF+1 + adc HEXBUFTMP+1 + sta HEXBUF+1 + lda HEXBUF+2 + adc HEXBUFTMP+2 + sta HEXBUF+2 + lda HEXBUF+3 + adc HEXBUFTMP+3 + sta HEXBUF+3 + + inx + lda ASCBUF,x + and #$0F + clc + adc HEXBUF + sta HEXBUF + bcc .2 + inc HEXBUF+1 + bne .2 + inc HEXBUF+2 + bne .2 + inc HEXBUF+3 +.2 cpx ASCBUF + bne .1 + ply + plx + rts +*-------------------------------------- +PRBYTE pha + lsr + lsr + lsr + lsr + ora #$B0 + cmp #$BA + bcc .1 + adc #6 +.1 jsr COUT + pla +PRHEX and #$0F + ora #$B0 + cmp #$BA + bcc COUT + adc #6 + bra COUT +*-------------------------------------- +CROUT lda #13 +*-------------------------------------- +COUT phx + phy + >PUSHA + ldy #S.PS.hOUTDEV + lda (pPsContext),y + >SYSCALL SYS.DevOutA + ply + plx + rts +*-------------------------------------- +CS.END +PRINTFTBL1 .AS -"abBdDLeEhHiIsStT" +PRINTFTBL1.END +PRINTFTBL2 .AS -"n\%" +PRINTFTBL2.END +PRINTF.ATTRIB .AS -"dnb+++wr" +*-------------------------------------- +PADCHAR .BS 1 +PADLEN .BS 1 +HEXBUF .BS 4 32 bits max +HEXBUFTMP .BS 4 +BCDBUF .BS 5 5, enough to handle 32bits +ASCBUF .BS 11 LEN + 10 digits ($FFFFFFFF=4.294.967.295) +*-------------------------------------- +MAN +SAVE LIB/LIBSTR.S +ASM diff --git a/LIB/LIBTCPIP.S.ARP.txt b/LIB/LIBTCPIP.S.ARP.txt new file mode 100644 index 00000000..524d9272 --- /dev/null +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -0,0 +1,266 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* ARP.CLEAR +*-------------------------------------- +ARP.CLEAR ldx #K.ARPCACHE.SIZE*S.ARPCACHE +.1 stz ARP.CACHE-1,x + dex + bne .1 + clc + rts +*-------------------------------------- +* ARP.QUERY +* In: +* PULLW PTR to IP +* PULLW PTR to MAC (to fill) +* Out: +* CC: hit: MAC filled +* CS: missed +*-------------------------------------- +ARP.QUERY >PULLW ZPARPIP IP + >PULLW ZPARPMAC MAC + jmp ARP.QUERY.I +*-------------------------------------- +* ARP.ADD +* In: +* PULLW PTR to IP +* PULLW PTR to MAC +*-------------------------------------- +ARP.ADD >PULLW ZPARPIP IP + >PULLW ZPARPMAC MAC + lda #S.ARPCACHE.STATUS.RESOLVED + jmp ARP.ADD.I +*-------------------------------------- +* ARP.GETCACHE +* Out: +* Y,A = PTR to ARP.CACHE +*-------------------------------------- +ARP.GETCACHE >LDYA L.ARP.CACHE + clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +ARP.RESOLVE ldy #S.IP.DST + lda (ZPFrameBase1),y + iny +.1 and (ZPFrameBase1),y + iny + cpy #S.IP.DST+4 + bne .1 + cmp #$FF + bne .3 not a broadcast.... + + ldy #S.ETH.DSTMAC +.2 sta (ZPFrameBase1),y + iny + cpy #S.ETH.DSTMAC+6 + bne .2 + clc + rts + +.3 ldy #S.IP.DST+3 + ldx #3 +.4 lda (ZPFrameBase1),y + eor IPCFG+S.IPCFG.IP,x + and IPCFG+S.IPCFG.MASK,x + bne .5 + dey + dex + bpl .4 + + lda ZPFrameBase1 Same network, query ARP for dest IP + clc + adc #S.IP.DST + sta ZPARPIP + lda ZPFrameBase1+1 + adc /S.IP.DST + sta ZPARPIP+1 + bra .6 + +.5 lda L.IPCFG Not Same network, query ARP for GW + clc + adc #S.IPCFG.GW + sta ZPARPIP + lda L.IPCFG+1 + adc /S.IPCFG.GW + sta ZPARPIP+1 + +.6 lda ZPFrameBase1 + clc + adc #S.ETH.DSTMAC + sta ZPARPMAC + lda ZPFrameBase1+1 + adc /S.ETH.DSTMAC + sta ZPARPMAC+1 +*-------------------------------------- +ARP.QUERY.I ldx #0 + +.1 phx + lda ARP.CACHE,x + beq .5 empty ARP Cache entry, try next... + + ldy #0 +.2 lda ARP.CACHE+S.ARPCACHE.IP,x + cmp (ZPARPIP),y + bne .5 wrong IP, try next... + inx + iny + cpy #4 + bne .2 + + plx + lda ARP.CACHE,x get back status + bpl .4 Pending... + + ldy #0 already resolved, get MAC +.3 lda ARP.CACHE+S.ARPCACHE.MAC,x + sta (ZPARPMAC),y + inx + iny + cpy #6 + bne .3 + clc + rts + +.4 inc ARP.CACHE+S.ARPCACHE.RETRYCNT,x Pending, increase Retry Count + bne .41 + stz ARP.CACHE,x reached max retry,mark as free +.41 sec + rts + +.5 pla + clc + adc #S.ARPCACHE + tax + cmp #K.ARPCACHE.SIZE*S.ARPCACHE + bne .1 + + jsr NEW.ARP.FRAME nothing in ARP cache, send ARP request + bcs .9 + phx + ldy #S.ARP.OPERATION+1 + lda #S.ARP.OPERATION.REQ + sta (ZPFrameBase1),y + + ldx #5 + ldy #S.ARP.SHA+5 +.71 lda IPCFG+S.IPCFG.MAC,x + sta (ZPFrameBase1),y + dey + dex + bpl .71 + + ldx #3 + ldy #S.ARP.SPA+3 +.72 lda IPCFG+S.IPCFG.IP,x + sta (ZPFrameBase1),y + dey + dex + bpl .72 + + ldy #3 +.73 lda (ZPARPIP),y + pha + dey + bpl .73 + + ldy #S.ARP.TPA +.74 pla + sta (ZPFrameBase1),y + iny + cpy #S.ARP.TPA+4 + bne .74 + + lda #255 + ldy #S.ETH.DSTMAC +.75 sta (ZPFrameBase1),y + iny + cpy #S.ETH.DSTMAC+6 + bne .75 + + jsr SEND.ARP.FRAME.I + bcs .76 + + jsr ARP.ADD.PENDING ZPARPIP still pointing IP + +.76 pla + >SYSCALL SYS.FreeMemA + + sec +.9 rts +*-------------------------------------- +ARP.ADD.PENDING lda #S.ARPCACHE.STATUS.PENDING + +ARP.ADD.I sta Status + + ldx #0 +.1 lda ARP.CACHE,x get status + beq .7 empty ARP cache entry + + phx + + ldy #0 +.2 lda (ZPARPIP),y + cmp ARP.CACHE+S.ARPCACHE.IP,x + bne .4 + inx + iny + cpy #4 + bne .2 + plx + bra .7 same IP,update MAC + +.4 pla get back index in ARP.CACHE + clc + adc #S.ARPCACHE + cmp #K.ARPCACHE.SIZE*S.ARPCACHE + beq .5 Cache is full ? + tax + bra .1 + +.5 ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE + +.6 lda ARP.CACHE+S.ARPCACHE-1,x + sta ARP.CACHE-1,x + dex + bne .6 + + ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE + +.7 lda Status + sta ARP.CACHE,x mark ARP entry Status + inx + stz ARP.CACHE,x Init retry count + inx + ldy #0 +.8 lda (ZPARPIP),y store IP in cache + sta ARP.CACHE,x + inx + iny + cpy #4 + bne .8 + + lda Status + bpl .82 no MAC if "pending" + + ldy #0 +.81 lda (ZPARPMAC),y store MAC in cache + sta ARP.CACHE,x + inx + iny + cpy #6 + bne .81 +.82 clc + rts +*-------------------------------------- +MAN +SAVE LIB/LIBTCPIP.S.ARP +LOAD LIB/LIBTCPIP.S +ASM diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt new file mode 100644 index 00000000..392751a7 --- /dev/null +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -0,0 +1,314 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE +.1 stz DNS.CACHE-1,x + dex + bne .1 + clc + rts +*-------------------------------------- +* DNS.QUERY +* In: +* PULLA = hostname PSTR +* PULLW = PTR to IP to fill with cached data +* Out: +* CC: hit: IP filled with address +* CS: missed +*-------------------------------------- +DNS.QUERY >PULLB hHOST Get host string hMem + >SYSCALL SYS.GetMemPtrA + >STYA ZPDNSHostname + >PULLW ZPDNSIP Get IP address to fill + + ldx #0 + +.1 lda DNS.CACHE,x + beq .6 empty DNS cache entry? + + lda DNS.CACHE+S.DNSCACHE.hNAME,x + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr3 + lda (ZPDNSHostname) + cmp (ZPQuickPtr3) Same Length? + bne .6 + tay +.2 lda (ZPDNSHostname),y + jsr ToLowerCaseA + cmp (ZPQuickPtr3),y + bne .6 + dey + bne .2 + + lda DNS.CACHE,x get back status... + bpl .4 Pending... + + ldy #0 +.3 lda DNS.CACHE+S.DNSCACHE.IP,x + sta (ZPDNSIP),y + inx + iny + cpy #4 + bne .3 + clc + rts + +.4 sec + rts + +.6 txa + clc + adc #S.DNSCACHE + tax + cmp #K.DNSCACHE.SIZE*S.DNSCACHE + bne .1 + +DNS.REQUEST jsr NEW.UDP.FRAME + bcc .1 + + bra * + + rts + +.1 phx + + ldy #S.UDP.SRCPORT + lda /UDP.PORT.DNS + sta (ZPFrameBase1),y + iny + lda #UDP.PORT.DNS + sta (ZPFrameBase1),y + + ldy #S.UDP.DSTPORT + lda /UDP.PORT.DNS + sta (ZPFrameBase1),y + iny + lda #UDP.PORT.DNS + sta (ZPFrameBase1),y + + ldy #S.DNS.F + lda /S.DNS.F.RD + sta (ZPFrameBase1),y + iny + lda #S.DNS.F.RD + sta (ZPFrameBase1),y + + ldy #S.DNS.QDCOUNT + lda /1 + sta (ZPFrameBase1),y + iny + lda #1 + sta (ZPFrameBase1),y + + lda #S.DNS + clc + adc ZPFrameBase1 + sta ZPFramePtr1 + lda /S.DNS + adc ZPFrameBase1+1 + sta ZPFramePtr1+1 + + lda (ZPDNSHostname) Get hostname len + tay + ldx #0 +.2 lda (ZPDNSHostname),y + cmp #'.' + bne .3 + txa + ldx #$FF +.3 sta (ZPFramePtr1),y + inx + dey + bne .2 + txa + sta (ZPFramePtr1) + + lda (ZPDNSHostname) + tay + iny + lda #$0 Ending #0 + sta (ZPFramePtr1),y + + iny + lda /S.DNS.QTYPE.A + sta (ZPFramePtr1),y + iny + lda #S.DNS.QTYPE.A + sta (ZPFramePtr1),y + + iny + lda /S.DNS.QCLASS.IN + sta (ZPFramePtr1),y + iny + lda #S.DNS.QCLASS.IN + sta (ZPFramePtr1),y + + lda (ZPDNSHostname) Get hostname len again (QNAME) + clc + adc #6 (len+1) + Ending 0 + QTYPE + QCLASS + adc #S.DNS + sta ZPFrameLen1 + lda #0 + adc /S.DNS + sta ZPFrameLen1+1 + + ldx #S.IPCFG.DNS + ldy #S.IP.DST + + lda IPCFG,x + beq .5 + +.4 lda IPCFG,x + sta (ZPFrameBase1),y + iny + inx + cpx #S.IPCFG.DNS+4 + bne .4 + jsr SEND.UDP.FRAME.I + bcs .8 + +.5 ldx #S.IPCFG.DNS+4 + ldy #S.IP.DST + + lda IPCFG,x + beq .7 + +.6 lda IPCFG,x + sta (ZPFrameBase1),y + iny + inx + cpx #S.IPCFG.DNS+8 + bne .6 + jsr SEND.UDP.FRAME.I + bcs .8 + +.7 jsr DNS.ADD.PENDING.I + +.8 pla + >SYSCALL SYS.FreeMemA + sec + rts +*-------------------------------------- +* DNS.ADD +* In: +* PULLA = hostname PSTR to Add +* PULLW = PTR to IP +* PULLW = TTL +*-------------------------------------- +DNS.ADD >PULLB hHOST Get host string hMem + >SYSCALL SYS.GetMemPtrA + >STYA ZPDNSHostname + >PULLW ZPDNSIP Get host IP address + >PULLW HOST.TTL + lda #S.DNSCACHE.STATUS.RESOLVED + bra DNS.ADD.I + +DNS.ADD.PENDING.I + lda #S.DNSCACHE.STATUS.PENDING + +DNS.ADD.I sta Status + ldx #0 + +.1 lda DNS.CACHE,x + beq DNS.ADD.ENTRY free ? + + lda DNS.CACHE+S.DNSCACHE.hNAME,x + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr3 + lda (ZPDNSHostname) + cmp (ZPQuickPtr3) Same Length? + bne .4 + + tay +.2 lda (ZPDNSHostname),y + jsr ToLowerCaseA + cmp (ZPQuickPtr3),y + bne .4 + dey + bne .2 + + bra DNS.UPD.ENTRY + +.4 txa + clc + adc #S.DNSCACHE + cmp #K.DNSCACHE.SIZE*S.DNSCACHE + beq .5 + tax + bra .1 + +.5 lda DNS.CACHE+S.DNSCACHE.hNAME discard oldest entry hNAME + >SYSCALL SYS.FreeMemA + + ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE +.6 lda DNS.CACHE+S.DNSCACHE-1,x + sta DNS.CACHE-1,x + dex + bne .6 + + ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE + +DNS.ADD.ENTRY phx + lda (ZPDNSHostname) + inc add 1 for len + tay + lda #0 + >PUSHYA push PSTR len + >PUSHBI 0 no option + >SYSCALL SYS.GetMem + bcc .10 + plx + rts + +.10 >STYA ZPQuickPtr3 + txa + plx + sta DNS.CACHE+S.DNSCACHE.hNAME,x + + lda (ZPDNSHostname) + sta (ZPQuickPtr3) + tay + +.1 lda (ZPDNSHostname),y + jsr ToLowerCaseA + sta (ZPQuickPtr3),y + dey + bne .1 + +DNS.UPD.ENTRY lda Status + sta DNS.CACHE,x + bpl .9 pending... + + lda HOST.TTL + sta DNS.CACHE+S.DNSCACHE.TTL,x + lda HOST.TTL+1 + sta DNS.CACHE+S.DNSCACHE.TTL+1,x + + ldy #0 +.2 lda (ZPDNSIP),y + sta DNS.CACHE+S.DNSCACHE.IP,x + inx + iny + cpy #4 + bne .2 + + clc + rts +.9 sec + rts +*-------------------------------------- +DNS.GETCACHE >LDYA L.DNS.CACHE + clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +MAN +SAVE LIB/LIBTCPIP.S.DNS +LOAD LIB/LIBTCPIP.S +ASM diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt new file mode 100644 index 00000000..adae775a --- /dev/null +++ b/LIB/LIBTCPIP.S.txt @@ -0,0 +1,482 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF LIB/LIBTCPIP.O +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +ZPFrameBase1 .EQ ZPLIB +ZPFrameLen1 .EQ ZPLIB+2 +ZPFramePtr1 .EQ ZPLIB+4 +ZPARPIP .EQ ZPLIB+6 +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA LIB.LOAD + .DA LIB.UNLOAD + + .DA SET.IPCFG + .DA GET.IPCFG + + .DA NEW.ICMP.FRAME + .DA NEW.TCP.FRAME + .DA NEW.UDP.FRAME + .DA NEW.IP.FRAME + .DA NEW.ARP.FRAME + .DA NEW.ETH.FRAME + + .DA SEND.ICMP.FRAME + .DA SEND.TCP.FRAME + .DA SEND.UDP.FRAME + .DA SEND.IP.FRAME + .DA SEND.ARP.FRAME + .DA SEND.ETH.FRAME + + .DA ARP.CLEAR + .DA ARP.QUERY + .DA ARP.ADD + .DA ARP.GETCACHE + + .DA DNS.CLEAR + .DA DNS.QUERY + .DA DNS.ADD + .DA DNS.GETCACHE + + .DA UDP.LISTENER + .DA TCP.LISTENER + .DA ADD.LISTENER + .DA REM.LISTENER +*-------------------------------------- +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 + jsr ARP.CLEAR + jsr DNS.CLEAR + inc bFirstLoad +.8 clc + rts +*-------------------------------------- +LIB.UNLOAD clc + rts +*-------------------------------------- +* PULLW = PTR to S.IPCFG +*-------------------------------------- +SET.IPCFG >PUSHBI K.PROTOID.IP + >SYSCALL SYS.SetNetCfg + bcs GET.IPCFG.RTS +*-------------------------------------- +* grab a copy on the fly for lib function +* OUT : +* Y,A = PTR to S.IPCFG +*-------------------------------------- +GET.IPCFG lda #K.PROTOID.IP + >SYSCALL SYS.GetNetCfgA + bcs GET.IPCFG.RTS + >STYA ZPQuickPtr1 + ldy #S.IPCFG +.1 dey + lda (ZPQuickPtr1),y + sta IPCFG,y + tya + bne .1 + >LDYA ZPQuickPtr1 + clc +GET.IPCFG.RTS rts +*-------------------------------------- +* Out: +* Y,A = Frame PTR +* X = hMem +*-------------------------------------- +NEW.ICMP.FRAME jsr NEW.IP.FRAME + bcs .9 + ldy #S.IP.PROTOCOL + lda #S.IP.PROTOCOL.ICMP + sta (ZPFrameBase1),y + >LDYA ZPFrameBase1 + clc +.9 rts +*-------------------------------------- +* Out: +* Y,A = Frame PTR +* X = hMem +*-------------------------------------- +NEW.TCP.FRAME jsr NEW.IP.FRAME + bcs .9 + ldy #S.IP.PROTOCOL + lda #S.IP.PROTOCOL.TCP + sta (ZPFrameBase1),y + >LDYA ZPFrameBase1 + clc +.9 rts +*-------------------------------------- +* Out: +* Y,A = Frame PTR +* X = hMem +*-------------------------------------- +NEW.UDP.FRAME jsr NEW.IP.FRAME + bcs .9 + ldy #S.IP.PROTOCOL + lda #S.IP.PROTOCOL.UDP + sta (ZPFrameBase1),y + >LDYA ZPFrameBase1 + clc +.9 rts +*-------------------------------------- +* Out: +* Y,A = Frame PTR +* X = hMem +*-------------------------------------- +NEW.IP.FRAME jsr NEW.ETH.FRAME + bcs .9 + + ldy #S.ETH.ETHERTYPE + lda /S.ETH.ETHERTYPE.IP + sta (ZPFrameBase1),y + iny + lda #S.ETH.ETHERTYPE.IP + sta (ZPFrameBase1),y + + ldy #S.IP.V.IHL.DSCP.ECN + lda #$45 + sta (ZPFrameBase1),y + iny + lda #$0 + sta (ZPFrameBase1),y + + ldy #S.IP.IDENTIFICATION + sta (ZPFrameBase1),y + inc + iny + sta (ZPFrameBase1),y + dec + ldy #S.IP.FRAGMENT.FLAGS + sta (ZPFrameBase1),y + iny + sta (ZPFrameBase1),y + + ldy #S.IP.TTL + lda #K.IP.TTL + sta (ZPFrameBase1),y + >LDYA ZPFrameBase1 + clc +.9 rts +*-------------------------------------- +* Out: +* Y,A = Frame PTR +* X = hMem +*-------------------------------------- +NEW.ARP.FRAME jsr NEW.ETH.FRAME + bcs .9 + + ldy #S.ETH.ETHERTYPE + lda /S.ETH.ETHERTYPE.ARP + sta (ZPFrameBase1),y + iny + lda #S.ETH.ETHERTYPE.ARP + sta (ZPFrameBase1),y + + ldy #S.ARP.HTYPE + lda #0 + sta (ZPFrameBase1),y + iny + lda #1 + sta (ZPFrameBase1),y + iny + lda #8 + sta (ZPFrameBase1),y + iny + lda #0 + sta (ZPFrameBase1),y + iny + lda #6 + sta (ZPFrameBase1),y + iny + lda #4 + sta (ZPFrameBase1),y + >LDYA ZPFrameBase1 + clc +.9 rts +*-------------------------------------- +* Out: +* Y,A = Frame PTR +* X = hMem +*-------------------------------------- +NEW.ETH.FRAME >PUSHWI K.ETH.FRAME.LEN + >PUSHBI 0 + >SYSCALL SYS.GetMem + bcs .9 + >STYA ZPFrameBase1 + phx + txa + >SYSCALL SYS.ClrMemA + plx + clc +.9 rts +*-------------------------------------- +* In: +* Out: +*-------------------------------------- +SEND.ICMP.FRAME >PULLW ZPFrameBase1 + >PULLW ZPFrameLen1 + + >PUSHW ZPFrameLen1 + >PUSHWI S.ICMP.TYPE + jsr ComputeChecksum + + phy + ldy #S.ICMP.CHECKSUM + sta (ZPFrameBase1),y + iny + pla + sta (ZPFrameBase1),y + + bra SEND.IP.FRAME.I +*-------------------------------------- +* In: +* Out: +*-------------------------------------- +SEND.TCP.FRAME >PULLW ZPFrameBase1 + >PULLW ZPFrameLen1 + bra SEND.IP.FRAME.I +*-------------------------------------- +* In: +* Out: +*-------------------------------------- +SEND.UDP.FRAME >PULLW ZPFrameBase1 + >PULLW ZPFrameLen1 +SEND.UDP.FRAME.I + ldy #S.UDP.LENGTH+1 + lda ZPFrameLen1 + sec + sbc #S.IP + sta (ZPFrameBase1),y + dey + lda ZPFrameLen1+1 + sbc /S.IP + sta (ZPFrameBase1),y + lda #0 SET.UDP.CHECKSUM + ldy #S.UDP.CHECKSUM (0 = Disable UDP Checksum) + sta (ZPFrameBase1),y + iny + sta (ZPFrameBase1),y + bra SEND.IP.FRAME.I +*-------------------------------------- +* In: +* Out: +*-------------------------------------- +SEND.IP.FRAME >PULLW ZPFrameBase1 + >PULLW ZPFrameLen1 + +SEND.IP.FRAME.I ldx #S.IPCFG.IP + ldy #S.IP.SRC + +.10 lda IPCFG,x + sta (ZPFrameBase1),y + inx + iny + cpy #S.IP.SRC+4 + bne .10 + + jsr ARP.RESOLVE + bcs .9 + ldy #S.IP.TOTAL.LENGTH+1 + lda ZPFrameLen1 + sec + sbc #S.ETH + sta (ZPFrameBase1),y + dey + lda ZPFrameLen1+1 + sbc /S.ETH + sta (ZPFrameBase1),y + + stz IP.CHECKSUM RESET.IP.CHECKSUM + stz IP.CHECKSUM+1 + stz IP.CHECKSUM+2 +* stz IP.CHECKSUM+3 Optimized for IP Header + + ldy #S.IP.V.IHL.DSCP.ECN +.1 lda (ZPFrameBase1),y + tax + iny + lda (ZPFrameBase1),y + iny + clc + adc IP.CHECKSUM + sta IP.CHECKSUM + txa + adc IP.CHECKSUM+1 + sta IP.CHECKSUM+1 + bcc .2 + inc IP.CHECKSUM+2 +*.2 bne .3 Optimized for IP Header +* inc IP.CHECKSUM+3 Optimized for IP Header +.2 cpy #S.IP + bne .1 + + lda IP.CHECKSUM + clc + adc IP.CHECKSUM+2 + eor #$FF + ldy #S.IP.HDR.CHECKSUM+1 + sta (ZPFrameBase1),y + dey + lda IP.CHECKSUM+1 +* adc IP.CHECKSUM+3 Optimized for IP Header + adc #0 Optimized for IP Header + eor #$FF + sta (ZPFrameBase1),y + bra SEND.ETH.FRAME +.9 rts +*-------------------------------------- +* In: +* Out: +*-------------------------------------- +SEND.ARP.FRAME >PULLW ZPFrameBase1 +SEND.ARP.FRAME.I + >LDYAI S.ARP default ARP Frame length + >STYA ZPFrameLen1 +*-------------------------------------- +* In: +* Out: +*-------------------------------------- +SEND.ETH.FRAME >PUSHW ZPFrameLen1 + >PUSHW ZPFrameBase1 + ldx #S.IPCFG.HDEV + lda IPCFG,x + >SYSCALL SYS.DevOutA + rts +*-------------------------------------- +UDP.LISTENER >PULLW ZPFrameBase1 + >PULLW ZPFrameLen1 + sec + rts +*-------------------------------------- +TCP.LISTENER >PULLW ZPFrameBase1 + >PULLW ZPFrameLen1 + sec + rts +*-------------------------------------- +ADD.LISTENER sec + rts +*-------------------------------------- +REM.LISTENER sec + rts +*-------------------------------------- + .INB LIB/LIBTCPIP.S.ARP + .INB LIB/LIBTCPIP.S.DNS +*-------------------------------------- +* PRIVATE +*-------------------------------------- +ToLowerCaseA cmp #'A' + bcc .1 + cmp #'Z'+1 + bcs .1 + adc #$20 +.1 rts +*-------------------------------------- +* In: +* PULLW = Start Offset +* PULLW = End Offset +* Out: +* Y,A = CheckSum +*-------------------------------------- +ComputeChecksum >PULLA + clc + adc ZPFrameBase1 + sta ZPQuickPtr1 + >PULLA + adc ZPFrameBase1+1 + sta ZPQuickPtr1+1 + + >PULLA + clc + adc ZPFrameBase1 + sta ZPQuickPtr2 + >PULLA + adc ZPFrameBase1+1 + sta ZPQuickPtr2+1 + + stz IP.CHECKSUM RESET.IP.CHECKSUM + stz IP.CHECKSUM+1 + stz IP.CHECKSUM+2 + stz IP.CHECKSUM+3 + ldy #1 +.1 lda (ZPQuickPtr1),y + clc + adc IP.CHECKSUM + sta IP.CHECKSUM + lda (ZPQuickPtr1) + adc IP.CHECKSUM+1 + sta IP.CHECKSUM+1 + bcc .3 + inc IP.CHECKSUM+2 + bne .3 + inc IP.CHECKSUM+3 +.3 lda ZPQuickPtr1 + clc + adc #2 + sta ZPQuickPtr1 + bcc .4 + inc ZPQuickPtr1+1 +.4 cmp ZPQuickPtr2 + bne .1 + lda ZPQuickPtr1+1 + cmp ZPQuickPtr2+1 + bne .1 + lda IP.CHECKSUM + clc + adc IP.CHECKSUM+2 + eor #$FF + tay + lda IP.CHECKSUM+1 + adc IP.CHECKSUM+3 + eor #$FF + rts +*-------------------------------------- +CS.END +*-------------------------------------- +bFirstLoad .DA #0 +Status .BS 1 +hHOST .BS 1 for DNS Cache functions +HOST.TTL .BS 2 for DNS Cache functions +IP.CHECKSUM .BS 4 +IPCFG .BS S.IPCFG +ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE +DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE +UDP.TABLE .BS K.UDPTABLE.SIZE*S.LISTENER +TCP.TABLE .BS K.TCPTABLE.SIZE*S.LISTENER +*-------------------------------------- +DS.START +DS.END +*-------------------------------------- +MAN +SAVE LIB/LIBTCPIP.S +ASM diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt new file mode 100644 index 00000000..b6685f9c --- /dev/null +++ b/SBIN/DHCPCLNT.S.txt @@ -0,0 +1,502 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF SBIN/DHCPCLNT +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBSTR.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +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 + sta hLIBSTR + + >LIBLOADP L.LIBTCPIP + sta hLIBTCPIP + + >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG + bcs .9 + >STYA ZPQuickPTR1 + + ldy #S.IPCFG +.1 dey + lda (ZPQuickPTR1),y + sta IPCFG,y + tya + bne .1 + + >LDYA A2OSX.TIMER16 + >STYA FRAME.DISC.XID + >STYA FRAME.REQ.XID + >LDYA A2OSX.RANDOM16 + >STYA FRAME.DISC.XID+2 + >STYA FRAME.REQ.XID+2 + + lda #0 + sta IPCFG + + ldy #S.IPCFG.MAC+5 + ldx #5 +.2 lda IPCFG,y + sta FRAME.DISC.CHADDR,x + sta FRAME.REQ.CHADDR,x + dey + dex + bpl .2 + + lda #20 + sta TimeOut + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + + clc +.9 rts +*-------------------------------------- +CS.RUN +CS.RUN.DISC jsr SendDHCPDiscFrame + bcs CS.RUN.KO + + lda #S.IPCFG.STATUS.SDISC + sta IPCFG + +CS.RUN.OFFER jsr A2osX.SLEEP + lda IPCFG + and #S.IPCFG.STATUS.ROFFER + bne CS.RUN.REQ + lda TimeOut + bne CS.RUN.OFFER + lda #1 + bra CS.RUN.KO + +CS.RUN.REQ jsr SendDHCPReqFrame + bcs CS.RUN.KO + + lda #S.IPCFG.STATUS.SREQ + sta IPCFG + +CS.RUN.RACK jsr A2osX.SLEEP + lda IPCFG + and #S.IPCFG.STATUS.RACK + bne CS.RUN.OK + lda TimeOut + bne CS.RUN.RACK + lda #2 + bra CS.RUN.KO + +CS.RUN.OK lda #S.IPCFG.STATUS.OK + sta IPCFG + + >PUSHW L.IPCFG + >LIBCALL hLIBTCPIP,LIBTCPIP.SET.IPCFG + + lda #0 Leave with NO ERROR + sec + rts + +CS.RUN.KO sec + rts +*-------------------------------------- +CS.DOEVENT >PULLW pEvent + lda (pEvent) + and #S.EVT.F.TIMER is it a TIMER event? + beq .1 no.... + + lda TimeOut + beq .9 + + dec TimeOut + bra .9 do not discard TIMER event + +.1 lda (pEvent) + and #S.EVT.F.NET + beq .9 + + ldy #S.IPCFG.HDEV + lda IPCFG,y + ldy #S.EVT.hDEV + cmp (pEvent),y + bne .9 + + ldy #S.EVT.DATALO Get Frame hMem + lda (pEvent),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPFrameBase1 + + ldy #S.EVT.DATAW1 Get Frame Len + lda (pEvent),y + sta ZPFrameLen1 + iny + lda (pEvent),y + sta ZPFrameLen1+1 + + lda IPCFG + and #S.IPCFG.STATUS.SDISC + beq .2 + jsr CheckDHCPOfferFrame + bcs .9 + lda #S.IPCFG.STATUS.ROFFER + sta IPCFG + bra .88 + +.2 lda IPCFG + and #S.IPCFG.STATUS.SREQ + beq .9 + jsr CheckDHCPAckFrame + bcs .9 + lda #S.IPCFG.STATUS.RACK + sta IPCFG + +.88 >SYSCALL SYS.DestroyEvent +.89 clc + rts +.9 sec + rts +*-------------------------------------- +CS.QUIT lda hLIBTCPIP + >SYSCALL SYS.UnloadLibA + lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +* SendDHCPDiscFrame +* In: +* Out: +*-------------------------------------- +SendDHCPDiscFrame + jsr NewDHCPFrame + bcs .9 + phx + + lda ZPFrameBase1 + clc + adc #S.UDP + sta ZPQuickPTR1 + lda ZPFrameBase1+1 + adc /S.UDP + sta ZPQuickPTR1+1 + + ldy #FRAME.DISC.LEN +.1 dey + lda FRAME.DISC,y + sta (ZPQuickPTR1),y + tya + bne .1 + + >LDYAI S.UDP+FRAME.DISC.LEN + >PUSHYA + >PUSHW ZPFrameBase1 + >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME + pla + php + >SYSCALL SYS.FreeMemA + plp +.9 rts +*-------------------------------------- +CheckDHCPOfferFrame + jsr CheckDHCPXID + bcs .9 + + >LDAXI S.DHCP.OPTIONS + jsr SetFramePtr1AX + + ldy #2 DHCPOffer ? + lda (ZPFramePtr1),y + cmp #S.DHCP.OPTIONS.DHCPOffer + bne .9 + + ldy #S.DHCP.YIADDR+3 + ldx #3 +.1 lda (ZPFrameBase1),y + sta FRAME.REQ.OPT.REQIP,x + dey + dex + bpl .1 + + ldx #3 + ldy #S.IPCFG.IP+3 +.2 lda FRAME.REQ.OPT.REQIP,x + sta IPCFG,y + dey + dex + bpl .2 + + ldy #S.IP.SRC+3 + ldx #3 +.3 lda (ZPFrameBase1),y + sta FRAME.REQ.OPT.SVRIP,x + dey + dex + bpl .3 + + ldx #3 + ldy #S.IPCFG.DHCPSRVR+3 +.4 lda FRAME.REQ.OPT.SVRIP,x + sta IPCFG,y + dey + dex + bpl .4 + +.5 inc ZPFramePtr1 skip Option 53 (DHCPOffer:530102) + bne .6 + inc ZPFramePtr1+1 +.6 lda (ZPFramePtr1) + sec + adc ZPFramePtr1 add option len + 1 + sta ZPFramePtr1 + bcc .7 + inc ZPFramePtr1+1 + +.7 lda (ZPFramePtr1) + cmp #S.DHCP.OPTIONS.END + beq .8 + jsr GetDHCPOption + bra .5 +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +GetDHCPOption cmp #S.DHCP.OPTIONS.MASK + bne .1 + ldy #S.IPCFG.MASK + bra GetDHCPOption.CopyIP + +.1 cmp #S.DHCP.OPTIONS.GW + bne .2 + ldy #S.IPCFG.GW + bra GetDHCPOption.CopyIP + +.2 cmp #S.DHCP.OPTIONS.DNS + bne .3 + ldy #S.IPCFG.DNS + bra GetDHCPOption.CopyIP + +.3 cmp #S.DHCP.OPTIONS.DOMAIN + bne .9 + + ldy #1 + ldx #$FF +.4 iny + inx + lda (ZPFramePtr1),y + sta TmpBuffer256,x + bne .4 + ldy #S.IPCFG.DOMAIN-1 + ldx #$FF +.5 iny + inx + lda TmpBuffer256,x + sta IPCFG,y + bne .5 + + +.9 rts +GetDHCPOption.CopyIP + phy + ldy #2 + ldx #0 +.1 lda (ZPFramePtr1),y + sta TmpBuffer256,x + iny + inx + cpx #4 + bne .1 + ply + ldx #0 +.2 lda TmpBuffer256,x + sta IPCFG,y + iny + inx + cpx #4 + bne .2 + rts +*-------------------------------------- +* SendDHCPReqFrame +* In: +* Out: +*-------------------------------------- +SendDHCPReqFrame + jsr NewDHCPFrame + bcs .9 + phx + + lda ZPFrameBase1 + clc + adc #S.UDP + sta ZPQuickPTR1 + lda ZPFrameBase1+1 + adc /S.UDP + sta ZPQuickPTR1+1 + + ldy #FRAME.REQ.LEN +.1 dey + lda FRAME.REQ,y + sta (ZPQuickPTR1),y + tya + bne .1 + + >LDYAI S.UDP+FRAME.REQ.LEN + >PUSHYA + >PUSHW ZPFrameBase1 + >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME + pla + php + >SYSCALL SYS.FreeMemA + plp +.9 rts +*-------------------------------------- +CheckDHCPAckFrame + jsr CheckDHCPXID + bcs .9 + + >LDAXI S.DHCP.OPTIONS + jsr SetFramePtr1AX + + ldy #2 DHCPAck ? + lda (ZPFramePtr1),y + cmp #S.DHCP.OPTIONS.DHCPAck + bne .9 + + clc + rts + +.9 sec + rts +*-------------------------------------- +CheckDHCPXID ldy #S.DHCP.XID+3 + ldx #3 +.1 lda (ZPFrameBase1),y + cmp FRAME.DISC.XID,x same XID ? + bne .9 + dey + dex + bpl .1 + clc + rts +.9 sec + rts +*-------------------------------------- +NewDHCPFrame >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.UDP.FRAME + bcs .9 + >STYA ZPFrameBase1 + + ldy #S.UDP.SRCPORT + lda /UDP.PORT.DHCPC + sta (ZPFrameBase1),y + iny + lda #UDP.PORT.DHCPC + sta (ZPFrameBase1),y + + ldy #S.UDP.DSTPORT + lda /UDP.PORT.DHCPS + sta (ZPFrameBase1),y + iny + lda #UDP.PORT.DHCPS + sta (ZPFrameBase1),y + + lda #255 S.IP.DST = 255.255.255.255 + ldy #S.IP.DST +.1 sta (ZPFrameBase1),y + iny + cpy #S.IP.DST+4 + bne .1 + clc x = hMem +.9 rts +*-------------------------------------- +SetFramePtr1AX clc + adc ZPFrameBase1 + sta ZPFramePtr1 + txa + adc ZPFrameBase1+1 + sta ZPFramePtr1+1 + rts +*-------------------------------------- +CS.END +LIBSTR >PSTRING "libstr.o" +LIBTCPIP >PSTRING "libtcpip.o" +*-------------------------------------- +FRAME.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS +FRAME.DISC.XID .BS 4 +FRAME.DISC.SECS .HS 0000 +FRAME.DISC.FLAGS .HS 0000 +FRAME.DISC.CIADDR .HS 00000000 +FRAME.DISC.YIADDR .HS 00000000 +FRAME.DISC.SIADDR .HS 00000000 +FRAME.DISC.GIADDR .HS 00000000 +FRAME.DISC.CHADDR .HS 00000000.00000000.00000000.00000000 +FRAME.DISC.SNAME .BS 64 +FRAME.DISC.FILE .BS 128 +FRAME.DISC.COOKIE .HS 63825363 +FRAME.DISC.OPT .HS 3501 + .DA #S.DHCP.OPTIONS.DHCPDiscover + .HS 37040103060FFF +FRAME.DISC.LEN .EQ *-FRAME.DISC +*-------------------------------------- +FRAME.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS +FRAME.REQ.XID .BS 4 +FRAME.REQ.SECS .HS 0000 +FRAME.REQ.FLAGS .HS 0000 +FRAME.REQ.CIADDR .HS 00000000 +FRAME.REQ.YIADDR .HS 00000000 +FRAME.REQ.SIADDR .HS 00000000 +FRAME.REQ.GIADDR .HS 00000000 +FRAME.REQ.CHADDR .HS 00000000.00000000.00000000.00000000 +FRAME.REQ.SNAME .BS 64 +FRAME.REQ.FILE .BS 128 +FRAME.REQ.COOKIE .HS 63825363 +FRAME.REQ.OPT .HS 3501 + .DA #S.DHCP.OPTIONS.DHCPRequest + .HS 3204 +FRAME.REQ.OPT.REQIP .BS 4 + .HS 3604 +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.END +MAN +SAVE SBIN/DHCPCLNT.S +ASM diff --git a/SBIN/GETTY.S.txt b/SBIN/GETTY.S.txt new file mode 100644 index 00000000..a32b6db8 --- /dev/null +++ b/SBIN/GETTY.S.txt @@ -0,0 +1,304 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF SBIN/GETTY +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.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 +*-------------------------------------- +CS.INIT ldy #S.PS.hARGS + lda (pPsContext),y + >PUSHA + >PUSHBI $20 Push SEP=' ' + >PUSHBI 1 Push 1 for getting INDEV + >SYSCALL SYS.PStrGetTkn + bcs .9 + + sta hDEVNAME + >SYSCALL SYS.GetDevByNameA + bcs .8 + + sta hINDEV + ldy #S.PS.hINDEV + sta (pPsContext),y + lda hDEVNAME + >SYSCALL SYS.FreeMemA + + ldy #S.PS.hARGS + lda (pPsContext),y + >PUSHA + >PUSHBI $20 Push SEP=' ' + >PUSHBI 2 Push 1 for getting OUTDEV + >SYSCALL SYS.PStrGetTkn +.9 bcs .99 + + sta hDEVNAME + >SYSCALL SYS.GetDevByNameA +.8 bcs .98 + + sta hOUTDEV + ldy #S.PS.hOUTDEV + sta (pPsContext),y + ldy #S.PS.hERRDEV + sta (pPsContext),y + lda hDEVNAME + >SYSCALL SYS.FreeMemA + + ldy #S.PS.hARGS + lda (pPsContext),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 + + stz STATUS + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + clc Tell TskMgr To stay in memory + rts + +.98 pha + lda hDEVNAME + >SYSCALL SYS.FreeMemA + pla + sec +.99 rts +*-------------------------------------- +CS.RUN lda STATUS + bne CS.RUN.1 + jsr CROUT + jsr CROUT + >LDYA L.MSG.LOGIN + 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 +*-------------------------------------- +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 + rts +*-------------------------------------- +CS.QUIT clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +PRINT.MSG >STYA ZPQuickPtr1 + ldy #0 +.1 lda (ZPQuickPtr1),y + beq .2 + ora #$80 + jsr COUT + 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 +*-------------------------------------- +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 >PUSHA + phx + phy + ldy #S.PS.hOUTDEV + lda (pPsContext),y + >SYSCALL SYS.DevOutA + ply + plx + rts +*-------------------------------------- +MSG.GREETINGS >CSTRING "A2osX-GeTTY on Dev=" +MSG.LOGIN >CSTRING "login:" +MSG.PASSWORD >CSTRING "password:" +*-------------------------------------- +CS.END +DS.START +*-------------------------------------- +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 +MAN +SAVE SBIN/GETTY.S +ASM diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt new file mode 100644 index 00000000..2c305857 --- /dev/null +++ b/SBIN/SHELL.S.txt @@ -0,0 +1,568 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF SBIN/SHELL +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/PRODOS.I + .INB INC/LIBSTR.I +*-------------------------------------- +ZPPTR1 .EQ ZPBIN +ZPPTR2 .EQ ZPBIN+2 +ZPPTR3 .EQ ZPBIN+4 +*-------------------------------------- +CmdBuffer.MAX .EQ 127 +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.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 +L.CMDS .DA CMDS +T.INTCMDS .DA EXEC.CMD.CD + .DA EXEC.CMD.SET + .DA EXEC.CMD.DATE + .DA EXEC.CMD.TIME + .DA EXEC.CMD.ECHO + .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 + + bcs .99 + sta hLIBSTR + + ldy #S.PS.ID + lda (pPsContext),y + >PUSHA + ldy #S.PS.hOUTDEV + lda (pPsContext),y + >PUSHA + ldy #S.PS.hINDEV + lda (pPsContext),y + >PUSHA + >PUSHW L.MSG.GREETINGS + >LIBCALL hLIBSTR,LIBSTR.PRINTF + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + + clc +.99 rts +*-------------------------------------- +CS.RUN stz CmdBuffer + lda #"$" + jsr COUT + lda #" " + jsr COUT + +.1 lda CmdBuffer + bmi .2 + jsr A2osX.SLEEP + + bra .1 + +.2 and #$7F + sta CmdBuffer + beq CS.RUN Empty line + + >PUSHW L.CmdBuffer + >SYSCALL SYS.NewPStr + bcs .99 + sta hCMDLINE + jsr HISTORY.ADD + jsr EXEC.CMD + bcc .3 + + pha + lda #"[" + jsr COUT + pla + jsr PRBYTE + lda #"]" + jsr COUT + jsr CROUT + +.3 lda hCMDLINE + >SYSCALL SYS.FreeMemA + stz hCMDLINE + + lda bEXIT + bne .99 + clc + rts +.99 sec + 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 #$1F + bpl .1 + jsr CS.EVENT.CTRL.CHAR + bra .8 + +.1 cmp #$7f + bne .2 + jsr CmdBuffer.DEL + bra .8 + +.2 ldx CmdBuffer + cpx #CmdBuffer.MAX + beq .8 + inx + sta CmdBuffer,x + inc CmdBuffer + ora #$80 + jsr COUT + +.8 >SYSCALL SYS.DestroyEvent + clc + rts + +.9 sec + rts +*-------------------------------------- +CS.EVENT.CTRL.CHAR + cmp #13 CR + bne .10 + jsr CROUT + lda CmdBuffer + ora #$80 + sta CmdBuffer + clc + rts + +.10 cmp #3 + bne .1 + jsr CmdBuffer.CLR + clc + rts + +.1 cmp #8 BS (left arrow) + bne .2 + jsr CmdBuffer.DEL + clc + rts + +.2 cmp #10 LF (down arrow) + bne .3 + + jsr HISTORY.GETNEXT + clc + rts + +.3 cmp #11 VT (up arrow) + bne .4 + + jsr HISTORY.GETPREV + clc + rts + +.4 cmp #21 NAK (right arrow) + bne .8 + + clc + rts + +.8 jsr PRBYTE + clc + rts +*-------------------------------------- +CS.QUIT lda hLIBSTR + >SYSCALL SYS.UnloadLibA + clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +EXEC.CMD >PUSHB hCMDLINE + >PUSHBI $20 Push SEP=' ' + >PUSHBI 0 Push 0 for getting CMD & ARGS + >SYSCALL SYS.PStrGetTkn + bcs .99 + + sta hCMD + stx hARGS + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.UCASEP + >PUSHW L.CMDS + >SYSCALL SYS.GetPStrIndex + bcs .1 Not An internal command + jsr EXEC.CMD.INT + bcs .98 + jsr .98 + clc + rts + +.1 jsr .98 Discard CMD & ARGS + lda hCMDLINE + >SYSCALL SYS.ExecProcessA + rts + +.98 pha + lda hCMD + >SYSCALL SYS.FreeMemA + lda hARGS + >SYSCALL SYS.FreeMemA + pla + sec +.99 rts +*-------------------------------------- +EXEC.CMD.INT asl + tax + jmp (T.INTCMDS,x) +*-------------------------------------- +EXEC.CMD.CD lda hARGS + bne EXEC.CMD.CD.C + ldy #S.PS.hPREFIX + lda (pPsContext),y + >SYSCALL SYS.GetMemPtrA + >PUSHYA + >LIBCALL hLIBSTR,LIBSTR.PRINTP + jsr CROUT + clc + rts + +EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR2 + ldy #S.PS.hPREFIX + lda (pPsContext),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 + lda #0 + sta (ZPPTR3) + ldy #1 + lda (ZPPTR2),y + cmp #'/' Full Path? + beq .3 + cmp #'.' ".." ? + bne .2 + lda (ZPPTR2) + cmp #2 + bne .97 + iny + lda (ZPPTR2),y + cmp #'.' + bne .97 + lda (ZPPTR1) + tay +.1 dey + beq .97 + lda (ZPPTR1),y + cmp #'/' + bne .1 + tya + sta (ZPPTR3) +.11 lda (ZPPTR1),y + sta (ZPPTR3),y + dey + bne .11 + bra .4 +.97 lda #SYSMGR.ERRSYN +.98 pha + lda hNEWPATH + >SYSCALL SYS.FreeMemA + pla + sec +.99 rts +.2 >PUSHW ZPPTR1 + >PUSHW ZPPTR3 + >LIBCALL hLIBSTR,LIBSTR.STRCPYP +.3 >PUSHW ZPPTR2 + >PUSHW ZPPTR3 + >LIBCALL hLIBSTR,LIBSTR.STRCATP + lda (ZPPTR3) + tay + lda #'/' Ending with '/'? + cmp (ZPPTR3),y + beq .4 + iny + sta (ZPPTR3),y + tya + sta (ZPPTR3) +.4 lda hNEWPATH + >SYSCALL SYS.CheckPrefixA + bcs .98 + ldy #S.PS.hPREFIX + lda (pPsContext),y + pha + lda hNEWPATH + sta (pPsContext),y + pla + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +EXEC.CMD.SET clc + rts +*-------------------------------------- +EXEC.CMD.DATE jsr MLI + .DA #MLIGETTIME + .DA 0 + bcs .9 + >PUSHW DATELO + >LIBCALL hLIBSTR,LIBSTR.PRINTDATE + jsr CROUT + clc +.9 rts +*-------------------------------------- +EXEC.CMD.TIME jsr MLI + .DA #MLIGETTIME + .DA 0 + bcs .9 + >PUSHW TIMELO + >LIBCALL hLIBSTR,LIBSTR.PRINTTIME + jsr CROUT + clc +.9 rts +*-------------------------------------- +EXEC.CMD.ECHO lda #$DD + sec + rts +*-------------------------------------- +EXEC.CMD.TYPE lda hARGS + beq .98 + >SYSCALL SYS.LoadFileA + bcs .99 + >STYA ZPPTR2 store file len + phx + txa + >SYSCALL SYS.GetMemPtrA + >STYA ZPPTR1 +.1 lda ZPPTR2 + bne .2 + lda ZPPTR2+1 + beq .3 + dec ZPPTR2+1 +.2 dec ZPPTR2 + + lda (ZPPTR1) + ora #$80 + jsr COUT + inc ZPPTR1 + bne .1 + inc ZPPTR1+1 + bra .1 + +.3 pla + >SYSCALL SYS.FreeMemA + clc + rts + +.98 lda #SYSMGR.ERRSYN +.99 rts +*-------------------------------------- +EXEC.CMD.EXIT lda #$FF + sta bEXIT + clc + rts +*-------------------------------------- +HISTORY.ADD lda CmdHistory.END ending 0 + inc keep room for new ending 0 + sec add len+1 + adc CmdBuffer + bcc .2 enough room + + ldx CmdHistory get len of oldest string + ldy #0 +.1 inx + iny + lda CmdHistory,x move back until 0 found + sta CmdHistory-1,y + bne .1 + sty CmdHistory.END mark new end of history + bra HISTORY.ADD retry.... + +.2 ldx CmdHistory.END + ldy #$FF +.3 iny + lda CmdBuffer,y + sta CmdHistory,x + inx + cpy CmdBuffer + bne .3 + stz CmdHistory,x set ending 0 + stx CmdHistory.IDX + stx CmdHistory.END +.9 rts +*-------------------------------------- +HISTORY.GETPREV lda CmdHistory.END + beq HISTORY.RTS empty history,nothing to do + lda CmdHistory.IDX + beq HISTORY.RTS already oldest,nothing to do + lda #0 +.1 tax save current index + sec + adc CmdHistory,x + cmp CmdHistory.IDX + bne .1 not yet reached current index + stx CmdHistory.IDX set new index + bra HISTORY.SETBUF +HISTORY.RTS rts +*-------------------------------------- +HISTORY.GETNEXT ldx CmdHistory.END + beq HISTORY.RTS empty history,nothing to do + cpx CmdHistory.IDX + beq HISTORY.RTS + ldx CmdHistory.IDX + lda CmdHistory,x + sec + adc CmdHistory.IDX + cmp CmdHistory.END + sta CmdHistory.IDX + beq CmdBuffer.CLR end of history, just blank buffer +*-------------------------------------- +HISTORY.SETBUF jsr CmdBuffer.CLR + ldx CmdHistory.IDX + ldy #$ff +.1 iny + lda CmdHistory,x + inx + sta CmdBuffer,y + cpy CmdBuffer + bne .1 + bra CmdBuffer.PRINT +*-------------------------------------- +CmdBuffer.PRINT ldx #0 +.1 inx + lda CmdBuffer,x + ora #$80 + phx + jsr COUT + plx + cpx CmdBuffer + bne .1 + rts +*-------------------------------------- +CmdBuffer.CLR jsr CmdBuffer.DEL + bne CmdBuffer.CLR +.9 rts +*-------------------------------------- +CmdBuffer.DEL lda CmdBuffer + beq .9 + lda #8 + jsr COUT + dec CmdBuffer +.9 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 + >PUSHA + ldy #S.PS.hOUTDEV + lda (pPsContext),y + >SYSCALL SYS.DevOutA + ply + plx + rts +*-------------------------------------- +CS.END +*-------------------------------------- +CMDS >PSTRING "CD" +CMDS1 >PSTRING "SET" +CMDS2 >PSTRING "DATE" +CMDS3 >PSTRING "TIME" +CMDS4 >PSTRING "ECHO" +CMDS5 >PSTRING "TYPE" +CMDS6 >PSTRING "EXIT" + .DA #0 +*-------------------------------------- +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 +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 +*-------------------------------------- +MAN +SAVE SBIN/SHELL.S +ASM diff --git a/SBIN/TCPIP.S.txt b/SBIN/TCPIP.S.txt new file mode 100644 index 00000000..cd66b38e --- /dev/null +++ b/SBIN/TCPIP.S.txt @@ -0,0 +1,449 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF SBIN/TCPIP +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/KERNEL.I + .INB INC/LIBTCPIP.I +*-------------------------------------- +ZPFrameBase1 .EQ ZPBIN +ZPFrameLen1 .EQ ZPBIN+2 +ZPFramePtr1 .EQ ZPBIN+4 +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 +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +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 + bcs .99 + sta hLIBTCPIP + ldx #0 +.1 stz IPCFG,x + inx + cpx #S.IPCFG + bne .1 + + jsr CS.INIT.DEV + + bcs .99 + +* jsr CS.INIT.CFGFILE continue even if error opening CFG file + + ldx #S.IPCFG.HOSTNAME + lda IPCFG,x + bne .3 + + ldy #0 +.2 lda DefaultHostName,y + sta IPCFG,x + beq .3 + inx + iny + bne .2 + +.3 >PUSHW L.IPCFG + >PUSHBI K.PROTOID.IP + >SYSCALL SYS.AddNetCfg + bcs .99 + + lda (pPsContext) + ora #S.PS.F.EVENT Now accept events + sta (pPsContext) + + clc +.99 rts +*-------------------------------------- +CS.INIT.DEV ldy #S.PS.hARGS + lda (pPsContext),y + >PUSHA + >PUSHBI $20 Push SEP=' ' + >PUSHBI 1 Push 1 for getting DEV + >SYSCALL SYS.PStrGetTkn + bcs .99 + sta hDEVNAME save DevName for discard + >SYSCALL SYS.GetDevByNameA + bcs .98 + + sta hDev + ldx #S.IPCFG.HDEV + sta IPCFG,x + + >SYSCALL SYS.GetDevInfoA + >STYA ZPQuickPtr1 + + ldy #0 + ldx #S.IPCFG.MAC +.1 lda (ZPQuickPtr1),y + sta IPCFG,x + inx + iny + cpy #S.IPCFG.MAC+6 + bne .1 + + lda hDEVNAME + >SYSCALL SYS.FreeMemA + clc + rts +.98 pha + lda hDEVNAME + >SYSCALL SYS.FreeMemA + pla +.99 rts +*-------------------------------------- +CS.INIT.CFGFILE >PUSHW L.CFGFILENAME + >SYSCALL SYS.ExpandPStr + bcs .99 + sta hCfgFileName + >SYSCALL SYS.LoadFileA + bcs .98 + stx hCfgFile + >STYA hCfgFileLen + txa + >SYSCALL SYS.GetMemPtrA + >STYA ZPQuickPtr1 + + + + +.89 lda hCfgFile + >SYSCALL SYS.FreeMemA + + lda hCfgFileName + >SYSCALL SYS.FreeMemA + clc + rts + +.98 pha + lda hCfgFileName + >SYSCALL SYS.FreeMemA + pla + +.99 sec + rts +*-------------------------------------- +CS.RUN clc + rts +*-------------------------------------- +CS.DOEVENT >PULLW pEvent + lda (pEvent) + and #S.EVT.F.NET + beq .9 + + ldy #S.EVT.hDEV + lda (pEvent),y + cmp hDev + beq CS.DOEVENT.NET +.9 sec + rts + +CS.DOEVENT.NET ldy #S.EVT.DATALO Get Frame hMem + lda (pEvent),y + >SYSCALL SYS.GetMemPtrA + >STYA ZPFrameBase1 + + ldy #S.EVT.DATAW1 Get Frame Len + lda (pEvent),y + sta ZPFrameLen1 + iny + lda (pEvent),y + sta ZPFrameLen1+1 + + ldy #S.ETH.ETHERTYPE + lda (ZPFrameBase1),y + tax + iny + lda (ZPFrameBase1),y + + cmp #S.ETH.ETHERTYPE.ARP + bne .1 + cpx /S.ETH.ETHERTYPE.ARP + bne .1 + jsr ARPListener + bcc .89 + rts + +.1 cmp #S.ETH.ETHERTYPE.IP + bne .99 + cpx /S.ETH.ETHERTYPE.IP + bne .99 + + ldy #S.IP.PROTOCOL + lda (ZPFrameBase1),y + cmp #S.IP.PROTOCOL.ICMP + bne .2 + jsr ICMPListener + bcc .89 + rts + +.2 cmp #S.IP.PROTOCOL.UDP + bne .3 + >PUSHW ZPFrameLen1 + >PUSHW ZPFrameBase1 + >LIBCALL hLIBTCPIP,LIBTCPIP.UDP.LISTENER + bcc .89 + rts + +.3 cmp #S.IP.PROTOCOL.TCP + bne .99 + >PUSHW ZPFrameLen1 + >PUSHW ZPFrameBase1 + >LIBCALL hLIBTCPIP,LIBTCPIP.TCP.LISTENER + bcc .89 + rts + +.89 >SYSCALL SYS.DestroyEvent + clc + rts +.99 sec + rts +*-------------------------------------- +CS.QUIT lda hLIBTCPIP + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +ARPListener jsr GetIPCFG + + ldy #S.ARP.TPA + ldx #S.IPCFG.IP + +.1 lda (ZPFrameBase1),y + cmp IPCFG,x + bne .9 + iny + inx + cpx #S.IPCFG.IP+4 + bne .1 + + ldy #S.ARP.OPERATION+1 HI byte + lda (ZPFrameBase1),y + cmp #S.ARP.OPERATION.REQ + beq ARPListener.REQ + + cmp #S.ARP.OPERATION.REP + beq ARPListener.REP + +.9 clc Discard any other ARP frames + rts + +ARPListener.REP >LDAXI S.ARP.SHA + jsr SetFramePtr1AX + >PUSHW ZPFramePtr1 + >LDAXI S.ARP.SPA + jsr SetFramePtr1AX + >PUSHW ZPFramePtr1 + >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.ADD + clc +ARPListener.RTS rts + +ARPListener.REQ >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ARP.FRAME + bcs ARPListener.RTS + + phx + >STYA ZPFrameBase2 + ldy #S.ARP.OPERATION+1 + lda #S.ARP.OPERATION.REP + sta (ZPFrameBase2),y + + >LDAXI S.ARP.SHA + jsr SetFramePtr1AX + + >LDAXI S.ETH.DSTMAC + jsr SetFramePtr2AX + + ldy #6 + jsr CopyFramePtr12 + + >LDAXI S.ARP.THA + jsr SetFramePtr2AX + + ldy #10 IP(4) + MAC(6) + jsr CopyFramePtr12 + + >PUSHW ZPFramePtr1 still point to SHA + >LDAXI S.ARP.SPA + jsr SetFramePtr1AX + >PUSHW ZPFramePtr1 + >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.ADD + + ldx #5 + ldy #S.ARP.SHA+5 +.4 lda IPCFG+S.IPCFG.MAC,x + sta (ZPFrameBase2),y + dey + dex + bpl .4 + + ldx #3 + ldy #S.ARP.SPA+3 +.5 lda IPCFG+S.IPCFG.IP,x + sta (ZPFrameBase2),y + dey + dex + bpl .5 + + >PUSHW ZPFrameBase2 + >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ARP.FRAME + + pla + >SYSCALL SYS.FreeMemA + clc + rts +*-------------------------------------- +ICMPListener ldy #S.ICMP.TYPE + lda (ZPFrameBase1),y + cmp #S.ICMP.TYPE.ECHOREQ + bne .9 + + jsr GetIPCFG + + ldy #S.IP.DST + ldx #S.IPCFG.IP +.10 lda (ZPFrameBase1),y + cmp IPCFG,x + bne .9 + iny + inx + cpx #S.IPCFG.IP+4 + bne .10 + + >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ICMP.FRAME + bcs .9 + phx + >STYA ZPFrameBase2 + ldy #S.ICMP.TYPE + lda #S.ICMP.TYPE.ECHOREP + sta (ZPFrameBase2),y + jsr MakeIPReply + + ldy #S.ICMP.IDENTIFIER +.1 lda (ZPFrameBase1),y + sta (ZPFrameBase2),y + iny + cpy #ZPFrameLen1 + bne .1 + + >PUSHW ZPFrameLen1 + >PUSHW ZPFrameBase2 + >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ICMP.FRAME + + pla + >SYSCALL SYS.FreeMemA + clc + rts +.9 sec + rts +*-------------------------------------- +GetIPCFG >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG + >STYA ZPQuickPtr1 + + ldy #S.IPCFG +.1 dey + lda (ZPQuickPtr1),y + sta IPCFG,y + tya + bne .1 + rts +*-------------------------------------- +MakeIPReply >LDAXI S.IP.SRC + jsr SetFramePtr1AX + >LDAXI S.IP.DST + jsr SetFramePtr2AX + ldy #4 + jsr CopyFramePtr12 + + >LDAXI S.IP.DST + jsr SetFramePtr1AX + >LDAXI S.IP.SRC + jsr SetFramePtr2AX + ldy #4 + jsr CopyFramePtr12 + + >LDAXI S.ETH.SRCMAC + jsr SetFramePtr1AX + >LDAXI S.ETH.DSTMAC + jsr SetFramePtr2AX + ldy #6 + jsr CopyFramePtr12 + rts +*-------------------------------------- +* A,X = Frame PTR +*-------------------------------------- +SetFramePtr1AX clc + adc ZPFrameBase1 + sta ZPFramePtr1 + txa + adc ZPFrameBase1+1 + sta ZPFramePtr1+1 + rts +*-------------------------------------- +* A,X = Frame PTR +*-------------------------------------- +SetFramePtr2AX clc + adc ZPFrameBase2 + sta ZPFramePtr2 + txa + adc ZPFrameBase2+1 + sta ZPFramePtr2+1 + rts +*-------------------------------------- +* Y = bytes to copy from ZPFramePtr1 to ZPFramePtr2 +*-------------------------------------- +CopyFramePtr12 dey + lda (ZPFramePtr1),y + sta (ZPFramePtr2),y + tya + bne CopyFramePtr12 + rts +*-------------------------------------- +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 +hCfgFileName .BS 1 +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 new file mode 100644 index 00000000..ef52ec7a --- /dev/null +++ b/SBIN/TELNETD.S.txt @@ -0,0 +1,49 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF SBIN/TELNETD +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/A2OSX.I + .INB INC/MONITOR.I +*-------------------------------------- +* Main entry point +*-------------------------------------- +* Code signature and INIT table +*-------------------------------------- +* CLD $D8 +* JMP (*,x) $7C +* #JMPTABLE +* /JMPTABLE +*-------------------------------------- +CS.START cld + jmp (.1,x) +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.EVENT + .DA CS.QUIT + .DA 0 + .DA CS.END-CS.START Code Length To Relocate + .DA 0 Data Segemnt to Allocate +*-------------------------------------- +CS.INIT clc + rts +*-------------------------------------- +CS.RUN clc + rts +*-------------------------------------- +CS.EVENT clc + rts +*-------------------------------------- +CS.QUIT clc + rts +*-------------------------------------- +CS.END +MAN +SAVE SBIN/TELNETD.S +ASM diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt new file mode 100644 index 00000000..0a34a8fd --- /dev/null +++ b/SYS/KERNEL.S.BIN.txt @@ -0,0 +1,411 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.LoadBinA +* in : +* A = hMem of FilePath (PSTRING) +* out : +* Y,A = MEMPTR +* X = hMem of Code Segment +*-------------------------------------- +S.LoadBinA sta R.DH save file path + jsr S.GetMemByNameA + bcs .1 not already loaded + >STYA R.AX Save base address + ldy #S.MEM.REFCNT + lda (R.AX),y + inc + sta (R.AX),y + ldy #S.MEM.PTR + lda (R.AX),y + pha Y,A = MEM PTR... + iny + lda (R.AX),y + ply X=hMem from S.GetMemByNameA + clc + rts + +.1 lda R.DH + jsr S.LoadFileA + bcs .99 + >STYA R.BX save file length for relocation + stx R.DL 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 + lda (ZPQuickPtr1),y + sta R.CL + iny + lda (ZPQuickPtr1),y + sta R.CH save File load address for relocation + lda R.AL compute offset for relocation.... + sec + sbc R.CL ...AX-CX... + sta R.CL + lda R.AH + sbc R.CH + sta R.CH ...to CX + jsr S.BinRelocate + bcs .98 relocation error, dicard Code segment + lda R.DH get back bin path + jsr S.PStrCpyA + bcs .98 + pha save copy of bin path + lda R.DL + 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 + rts +.98 pha + lda R.DL + 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) + 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 + sta (ZPQuickPtr1),y + pla + clc + rts + +.1 ldy #S.MEM.PTR + lda (ZPQuickPtr1),y + pha + iny + lda (ZPQuickPtr1),y + ply + >STYA Kernel.JMP + + 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 + 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 + 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 + clc + adc (R.AX),y make DX = end of opcode range + sta R.DL + iny + lda R.AH + adc (R.AX),y + sta R.DH + 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 + clc + adc R.AL + sta ZPQuickPtr1 + lda #0 + adc R.AH + sta ZPQuickPtr1+1 +.4 lda (ZPQuickPtr1) get OPCODE + tax + lda OPCODES,x get OPCODE definition + bpl .7 abs addressing? + 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 + sbc R.BH + bcs .6 new addr > BX, out of range + dey + lda ZPQuickPtr2 Get new LO + sta (ZPQuickPtr1),y + iny + lda ZPQuickPtr2+1 Get new HI + sta (ZPQuickPtr1),y +.6 lda OPCODES,x +.7 and #$3 get OPCODE length + clc + 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 + 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 +* Bit 1-0 : opcode + @ length +*-------------------------------------- +* x0.x1.x2.x3.x4.x5.x6.x7.x8.x9.xA.xB.xC.xD.xE.xF +OPCODES .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 + .HS 83.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 + .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03 + .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 + .HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.BIN +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt new file mode 100644 index 00000000..e685de94 --- /dev/null +++ b/SYS/KERNEL.S.DEV.txt @@ -0,0 +1,248 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.DevMgrInit +*-------------------------------------- +S.DevMgrInit ldx #S.DEV.SIZE*K.DEV.MAX +.1 stz 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 + + lda #1 reserve #0=NUL, #1=KBD + sta DEVMGR.LASTID + + clc + rts +*-------------------------------------- +* S.GetDevByIDA +* IN: +* A = DevID +* OUT: +* CC = OK, CS = ERROR +* 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 .3 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 +*-------------------------------------- +* GetDevIDByNameA +* IN: +* A = hPStr +* OUT: +* CC = OK, CS = ERROR +* A = DEVID +* set DEVMGR.DEVPTR to devslot +*-------------------------------------- +S.GetDevByNameA jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + >LDYAI DEVMGR.TABLE + >STYA DEVMGR.DEVPTR + + 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) + 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.DevOpenA +* IN : +* A = hDev +* OUT CC = OK, CS = ERROR +*-------------------------------------- +S.DevOpenA ldx #DEVMGR.OPEN + bra S.DevCallFunc +*-------------------------------------- +* S.DevGetEventA +* IN : +* A = hDev +* OUT CC = OK, CS = ERROR +*-------------------------------------- +S.DevGetEventA ldx #DEVMGR.GETEVENT + bra S.DevCallFunc +*-------------------------------------- +* S.DevCloseA +*-------------------------------------- +S.DevCloseA ldx #DEVMGR.CLOSE + bra S.DevCallFunc +*-------------------------------------- +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 +* init (DEVMGR.DEVPTR),S.DEV.ID with Dev.ID +*-------------------------------------- +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 + sec + rts + +.3 lda #0 + 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 + clc + rts +*-------------------------------------- +* S.DestroyDevSlot +* selected by (DEVMGR.DEVPTR) +*-------------------------------------- +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.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 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.DEV +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt new file mode 100644 index 00000000..dea021cb --- /dev/null +++ b/SYS/KERNEL.S.ENV.txt @@ -0,0 +1,385 @@ +PR#3 +PREFIX /DATA/A2OSX +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 + stz R.BL reset "in var" + ldy #0 +.1 iny + lda (R.AX),y + cmp #'%' + beq .10 + jmp .7 +.10 ldx R.BL in var? + bne .2 + sty R.BL no, save start + jmp .8 skip this char +.2 sty R.BH yes, save end + phy save Actual char position + tya + sec + sbc R.BL compute len of %VAR% -1 + tay + lda #0 + >PUSHYA + >PUSHBI 0 + jsr S.GetMem create VARNAME + phx save hMem for discard + >STYA R.CX + lda R.BH + sec + sbc R.BL + dec skip % + sta (R.CX) + ldy R.BL + iny +.3 inc R.CL + bne .4 + inc R.CH +.4 lda (R.AX),y Copy string between % to ENVNAME + sta (R.CX) + iny + cpy R.BH + bne .3 + pla + pha Get back ENVNAME hMem + >PUSHA + ldy #S.PS.hENV + lda (TSKMGR.TSKPTR),y + >PUSHA + jsr S.GetEnvVarH + bcs .5 + pha save hMem of VALUE + jsr S.GetMemPtrA + >STYA R.DX + ldy #0 +.41 iny + lda (R.DX),y + inc TmpBuffer256 + ldx TmpBuffer256 + sta TmpBuffer256,x + tya + cmp (R.DX) + bne .41 + pla + jsr S.FreeMemA discard VALUE hMem +.5 pla + jsr S.FreeMemA discard VARNAME hMem +* ldy R.BL TODO:continue scanning from first % found + stz R.BL reset "in var" + ply + bra .8 +.7 ldx R.BL in var? + bne .8 yes, skip this char + inc TmpBuffer256 + ldx TmpBuffer256 + sta TmpBuffer256,x +.8 tya + cmp (R.AX) last char? + beq .81 + jmp .1 +.81 >PUSHWI TmpBuffer256 + jsr S.NewPStr + rts +*-------------------------------------- +* S.CreateEnv +* in : +* out : +* A = hMem to new env +*-------------------------------------- +S.CreateEnv >PUSHWI K.ENV.SIZE get a buffer for ENV + >PUSHBI 0 + jsr S.GetMem create it... + bcs .9 + >STYA ZPQuickPtr1 + lda #0 + sta (ZPQuickPtr1) + txa + clc +.9 rts +*-------------------------------------- +* S.DupEnvA2 +* In: +* A = ENV hMem To Duplicate +* Out: +* A = hMem to new ENV +*-------------------------------------- +S.DupEnvA pha + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + pla + jsr S.GetMemLenA + >PUSHYA + >PUSHBI 0 + jsr S.GetMem + bcs .9 + >STYA ZPQuickPtr2 + phx +.1 lda (ZPQuickPtr1) + sta (ZPQuickPtr2) + beq .8 + inc ZPQuickPtr1 + bne .2 + inc ZPQuickPtr1+1 +.2 inc ZPQuickPtr2 + bne .1 + inc ZPQuickPtr2+1 + bra .1 +.8 pla + clc +.9 rts +*-------------------------------------- +* S.GetEnvVarH +* In: +* PULLB = hENV +* PULLB = hMem to NAME (PSTRING) +*-------------------------------------- +* S.GetEnvVarP +* In: +* PULLB = hENV +* PULLW = PTR to NAME (PSTRING) +* Out: +* A = hMem to VALUE (PSTRING) 0,"" if not exist +*-------------------------------------- +S.GetEnvVarH jsr S.SelectEnvH + bra S.GetEnvVar +S.GetEnvVarP jsr S.SelectEnvP +S.GetEnvVar bcc .1 + >LDYAI 1 not found + >PUSHYA create "" PSTR + >PUSHBI 0 + jsr S.GetMem create a new PSTR + bcs .99 + >STYA ZPQuickPtr3 + lda #0 + sta (ZPQuickPtr3) set len of PSTR + txa + clc + rts +.1 lda (ZPQuickPtr1) get NAME=VALUE len + sec + sbc (ZPQuickPtr2) substract (NAME len) + tay y=len("=VALUE") + lda #0 + >PUSHYA + >PUSHBI 0 + jsr S.GetMem create a new PSTR + bcs .99 + >STYA ZPQuickPtr3 + phx save hMem + lda (ZPQuickPtr1) get NAME=VALUE len + clc + sbc (ZPQuickPtr2) compute VALUE len + sta (ZPQuickPtr3) set new PSTR Len + tax x = chr to copy + lda (ZPQuickPtr2) get name len + inc add 1 to skip "=" + tay +.2 iny + inc ZPQuickPtr3 + bne .3 + inc ZPQuickPtr3+1 +.3 lda (ZPQuickPtr1),y + sta (ZPQuickPtr3) + dex + bne .2 + pla get back PSTR hMem + clc +.99 rts +*-------------------------------------- +* S.SetEnvVarH +* In: +* PULLB = hENV +* PULLB = hMem To Name (PSTRING) +* PULLB = hMem To Value (PSTRING) +*-------------------------------------- +* S.SetEnvVarP +* In: +* PULLB = hENV +* PULLW = PTR To Name (PSTRING) +* PULLW = PTR To Value (PSTRING) +* Out: +*-------------------------------------- +S.SetEnvVarH jsr S.SelectEnvH + php + >PULLA + jsr S.GetMemPtrA + >STYA ZPQuickPtr3 ZPQuickPtr3 = VALUE + bra S.SetEnvVar + +S.SetEnvVarP jsr S.SelectEnvP + php + >PULLW ZPQuickPtr3 ZPQuickPtr3 = VALUE + +S.SetEnvVar plp + bcs .3 Not Found,ZPQuickPtr1 -> End Of Env + lda (ZPQuickPtr1) Found, Discard current NAME definition + sec + adc ZPQuickPtr1 add NAME=VALUE len+1 to ZPQuickPtr1 + sta ZPQuickPtr4 + lda #0 + adc ZPQuickPtr1+1 store it in ZPQuickPtr4 + sta ZPQuickPtr4+1 +.1 lda (ZPQuickPtr4) + sta (ZPQuickPtr1) + beq .3 until we move ending 0 + inc ZPQuickPtr1 + bne .2 + inc ZPQuickPtr1+1 +.2 inc ZPQuickPtr4 + bne .1 + inc ZPQuickPtr4+1 + bra .1 +.3 lda ZPQuickPtr1 Compute ENV UPPER LIMIT + clc + adc #K.ENV.SIZE + sta ZPQuickPtr4 + lda ZPQuickPtr1+1 + adc /K.ENV.SIZE + sta ZPQuickPtr4+1 + ldy ZPQuickPtr1+1 + lda ZPQuickPtr1 Compute New Env Upper limit in A,Y + sec + adc (ZPQuickPtr2) add NAME len +1(for len) + bcc .4 + iny +.4 sec + adc (ZPQuickPtr3) add VALUE len +1(for "=") + bcc .5 + iny +.5 sec A,Y=new upper limit + sbc ZPQuickPtr4 greater than hMem Upper limit ? + bcc .51 + tya + sbc ZPQuickPtr4+1 + bcs .99 +.51 lda (ZPQuickPtr2) make len = NAME+VALUE+1 + sec + adc (ZPQuickPtr3) + sta (ZPQuickPtr1) + inc ZPQuickPtr1 + bne .6 + inc ZPQuickPtr1+1 +.6 ldy #0 +.7 iny + lda (ZPQuickPtr2),y + sta (ZPQuickPtr1) + inc ZPQuickPtr1 + bne .8 + inc ZPQuickPtr1+1 +.8 tya + cmp (ZPQuickPtr2) + bne .7 + lda #'=' + sta (ZPQuickPtr1) + inc ZPQuickPtr1 + bne .9 + inc ZPQuickPtr1+1 +.9 ldy #0 +.10 iny + lda (ZPQuickPtr3),y + sta (ZPQuickPtr1) + inc ZPQuickPtr1 + bne .11 + inc ZPQuickPtr1+1 +.11 tya + cmp (ZPQuickPtr3) + bne .10 + lda #0 + sta (ZPQuickPtr1) + clc + rts +.99 lda #SYSMGR.ERRENVF + sec + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +* S.SelectEnvH +* In: +* PULLB = hENV +* PULLB = hMem to NAME (PSTRING) +*-------------------------------------- +* S.SelectEnvP +* In: +* PULLB = hENV +* PULLW = PTR to NAME (PSTRING) +*-------------------------------------- +* Out: +* CC: Found +* ZPQuickPtr1 -> NAME=VALUE +* ZPQuickPtr2 -> NAME +* CS: Not Found +* ZPQuickPtr1 -> PTR to Ending 0 +* ZPQuickPtr2 -> NAME +*-------------------------------------- +S.SelectEnvH >PULLA get ENV + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 Store ENV + >PULLA get NAME + jsr S.GetMemPtrA + >STYA ZPQuickPtr2 Store VAR Name + bra S.SelectEnv + +S.SelectEnvP >PULLA get ENV + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 Store ENV + >PULLW ZPQuickPtr2 get NAME + +S.SelectEnv +.1 lda (ZPQuickPtr1) + beq .9 + ldy #0 +.2 iny + lda (ZPQuickPtr1),y + cmp #'=' End Of VAR Name ? + beq .4 +.3 cmp (ZPQuickPtr2),y + bne .7 + tya + cmp (ZPQuickPtr2) + bne .2 + iny + lda (ZPQuickPtr1),y + cmp #'=' End Of VAR Name ? + bne .3 +.4 dey + tya + cmp (ZPQuickPtr2) Y = VAR Name Len ? + beq .8 yes, found VAR +.7 lda (ZPQuickPtr1) no, go to next NAME=VALUE + sec + adc ZPQuickPtr1 + sta ZPQuickPtr1 + bcc .1 + inc ZPQuickPtr1+1 + bra .1 +.8 clc + rts +.9 sec + rts +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.ENV +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.EVT.txt b/SYS/KERNEL.S.EVT.txt new file mode 100644 index 00000000..ba31fb5d --- /dev/null +++ b/SYS/KERNEL.S.EVT.txt @@ -0,0 +1,180 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.EvtMgrInit +*-------------------------------------- +S.EvtMgrInit stz EVTMGR.PENDING + clc + rts +*-------------------------------------- +* GETEVENT : +* IN : +* OUT : +* CS = no event, A = ERROR +* CC * event in YA +* (EVTMGR.EVTPTR) +*-------------------------------------- +S.GetEvent lda EVTMGR.PENDING Get Pending EVENT hMem if any + beq .1 + jsr S.GetMemPtrA + >STYA EVTMGR.EVTPTR + clc + rts +.1 jsr S.CreateEvent + bcs .9 + stx EVTMGR.PENDING + jsr S.GetSysEvent + bcc .9 got SYS event + jsr S.GetDevEvent + bcc .9 got DEV event + jsr S.DestroyEvent discard empty event + lda #0 error code=0 + sec no event +.9 rts +*-------------------------------------- +S.GetSysEvent lda VBL get VLINE status + eor EVTMGR.VBLSTATE + bpl .2 no change + + sta EVTMGR.VBLSTATE save new + + dec EVTMGR.FRAMECNT + bne .2 + lda #K.TIMER16RESOLUTION + sta EVTMGR.FRAMECNT + + inc A2osX.TIMER16 + bne .1 + 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 + rts + +.9 inc A2osX.RANDOM16 + bne .99 + inc A2osX.RANDOM16+1 +.99 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 + 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 +.9 rts +*-------------------------------------- +* S.DestroyEvent +* IN : +* A = Event hMem +* OUT : +*-------------------------------------- +S.DestroyEventA pha + jsr S.GetMemPtrA + >STYA EVTMGR.EVTPTR + lda (EVTMGR.EVTPTR) + and #S.EVT.F.hMEM1 + beq .1 + ldy #S.EVT.DATALO + lda (EVTMGR.EVTPTR),y + jsr S.FreeMemA +.1 lda (EVTMGR.EVTPTR) + and #S.EVT.F.hMEM2 + beq .2 + ldy #S.EVT.DATAHI + lda (EVTMGR.EVTPTR),y + jsr S.FreeMemA +.2 pla + jsr S.FreeMemA + rts +*-------------------------------------- +EVTMGR.VBLSTATE .BS 1 +EVTMGR.FRAMECNT .BS 1 +EVTMGR.PENDING .BS 1 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.EVT +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.FS.txt b/SYS/KERNEL.S.FS.txt new file mode 100644 index 00000000..1faf416f --- /dev/null +++ b/SYS/KERNEL.S.FS.txt @@ -0,0 +1,556 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* PUBLIC +*-------------------------------------- +S.CheckPrefixA jsr S.GetMemPtrA +S.CheckPrefix >STYA MLICALL.PARAMS+1 + >STYA ZPQuickPtr1 + lda (ZPQuickPtr1) + beq .98 + tax + ldy #1 + lda (ZPQuickPtr1),y + cmp #'/' + bne .98 + cpx #1 "/" allowed for listing online volumes + beq .8 + >KMLICALL MLIGETFILEINFO + bcs .98 No, invalid path... + lda MLICALL.PARAMS+4 Check file type + cmp #$0F Directory? + bne .98 +.8 clc + rts +.98 lda #SYSMGR.ERRIDIR +.99 sec + rts +*-------------------------------------- +* S.FileSearch +* in : +* PULLB = hMem to Search Path (PSTRING) %LIB%;/SYS/SLIB +* PULLB = hMem to File Name (PSTRING) +* out : +* A = hMem of FilePath (PSTRING) +*-------------------------------------- +S.FileSearch >PULLA Get Search path + jsr S.ExpandPStrA Expand it + bcc .10 + pha save error code + >PULLA discard file name + pla + sec + rts +.10 sta 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 + rts +*-------------------------------------- +* S.LoadFileA +* in : +* A = hMem of FilePath (PSTRING) +* out : +* Y,A = File Length +* X = hMem of Loaded File +*-------------------------------------- +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 + >PUSHW R.CX Push Dest PTR + >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 +*-------------------------------------- +* S.ListDirInitA +* in : +* A = PATH (PSTR) /DIR,/DIR/*.?s +* out : +* A = hMem of Dir Listing +*-------------------------------------- +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? + bcc .4 yes, continue with empty pattern + + lda (R.BX) no, get pattern at end of full path + tay + ldx #0 + +.1 lda (R.BX),y + cmp #'/' + beq .2 + inx + dey + bne .1 + +.2 stx TmpFileName + txa + beq .4 + + lda (R.BX) + tay + +.3 lda (R.BX),y + sta TmpFileName,x + dey + dex + bne .3 + + tya + sta (R.BX) remove pattern from path + +.4 >PUSHWI S.LISTDIR.SIZE get LISTDIR Struct + >PUSHBI 0 + 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 + + lda #0 + >PUSHYA + >PUSHBI 0 + jsr S.GetMem + bcs .98 + >STYA ZPQuickPtr1 + + txa + ldy #S.LISTDIR.hPATTERN + sta (R.CX),y + + ldy TmpFileName +.40 lda TmpFileName,y + sta (ZPQuickPtr1),y + dey + bpl .40 + +.5 lda (R.BX) + cmp #1 length = 1 ? ('/') + bne .6 + jsr S.ListDirInitAV + bcs .98 + lda R.AH + rts + +.6 jsr S.ListDirInitAD + bcs .98 + lda R.AH + rts + +.98 pha + lda R.AH Discard S.LISTDIR + jsr S.ListDirCloseA + pla +.99 sec + rts +*-------------------------------------- +S.ListDirInitAV >PUSHWI 256 + >PUSHBI 0 + jsr S.GetMem + bcs .99 + >PUSHYA push buffer for online call + txa + sta (R.CX) save hONLINE buffer + >PUSHBI 0 All devices + jsr S.MLIOnline + bcs .98 + ldy #S.LISTDIR.ONLINEPTR + lda #0 make index point first Entry + sta (R.CX),y + clc + rts +.98 lda (R.CX) + jsr S.FreeMemA +.99 sec + rts +*-------------------------------------- +S.ListDirInitAD lda #0 + sta (R.CX) reset hONLINE + >LDYA R.BX Open DIR + jsr S.MLIOpen + bcs .99 + ldy #S.LISTDIR.REFNUM + sta (R.CX),y save ref_num + txa + ldy #S.LISTDIR.hIOBUF + sta (R.CX),y save ProDOS IO buffer hMem + + >PUSHWI 512 get Read buffer + >PUSHBI 0 + jsr S.GetMem + bcs .99 + txa + ldy #S.LISTDIR.hREADBUF save Read Buffer hMem + sta (R.CX),y + jsr S.ListDirReadBlock + bcs .99 + >STYA ZPQuickPtr1 + + ldy #$23 get entry_length + lda (ZPQuickPtr1),y + ldy #S.LISTDIR.EL + sta (R.CX),y + + ldy #$24 get entry_per_block + lda (ZPQuickPtr1),y + ldy #S.LISTDIR.EPB + sta (R.CX),y + + ldy #$25 get File_count LO + lda (ZPQuickPtr1),y + ldy #S.LISTDIR.FC + sta (R.CX),y + + ldy #$26 get File_count HI + lda (ZPQuickPtr1),y + 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 + clc +.99 rts +*-------------------------------------- +* S.DirListNextA +* A = S.LISTDIR hMEM +* out : +* A = hMem To Dir Entry +*-------------------------------------- +S.ListDirNextA jsr S.GetMemPtrA Get PTR to S.LISTDIR + >STYA R.CX + lda (R.CX) Online Data? + beq S.ListDirNextAD no,list files +*-------------------------------------- +S.ListDirNextAV jsr S.GetMemPtrA + >STYA ZPQuickPtr1 ZPQuickPtr1 = Online DATA +.10 ldy #S.LISTDIR.ONLINEPTR + lda (R.CX),y + cmp #16 + beq .9 + + inc + sta (R.CX),y + dec + asl + asl + asl + asl + tay + + lda (ZPQuickPtr1),y + and #$0F + beq .10 + + sta TmpFileName + ldx #0 +.1 iny + inx + lda (ZPQuickPtr1),y + sta TmpFileName,x + cpx TmpFileName + bne .1 + + >PUSHWI 16 + >PUSHBI 0 + jsr S.GetMem + bcs .9 + + >STYA ZPQuickPtr2 + + ldy #15 +.2 lda TmpFileName,y + sta (ZPQuickPtr2),y + dey + bpl .2 + + lda (ZPQuickPtr2) Mark Record as "VOL" + ora #$C0 + sta (ZPQuickPtr2) + + txa Get back hMem of Volume.Name + clc + rts + +.9 sec + rts +*-------------------------------------- +S.ListDirNextAD stz R.DL Reset Return Record hMem + ldy #S.LISTDIR.FI File Index = File count ? + lda (R.CX),y + ldy #S.LISTDIR.FC + cmp (R.CX),y + bne .1 + ldy #S.LISTDIR.FI+1 + lda (R.CX),y + ldy #S.LISTDIR.FC+1 + cmp (R.CX),y + bne .1 + sec yes, exit no more file + rts +*-------------------------------------- +.1 ldy #S.LISTDIR.EIB Entry Index in block = Entry per block ? + lda (R.CX),y + ldy #S.LISTDIR.EPB + cmp (R.CX),y + bne .2 + jsr S.ListDirReadBlock + bcc .3 + rts +*-------------------------------------- +.2 ldy #S.LISTDIR.hREADBUF + lda (R.CX),y + jsr S.GetMemPtrA +.3 >STYA R.AX R.AX = READ BUFFER + ldy #S.LISTDIR.BLKPTR + lda (R.CX),y + clc + adc R.AX + sta R.AX + iny + lda (R.CX),y + adc R.AX+1 + sta R.AX+1 + + lda (R.AX) Is is a deleted file ? (storage_type=0) + and #$F0 + beq .40 + + cmp #$F0 Volume header ? + beq .30 yes, do not filter + cmp #$E0 Directory header ? + beq .30 yes, do not filter + + ldy #S.LISTDIR.hPATTERN any filter ? + lda (R.CX),y + beq .30 + jsr S.GetMemPtrA + >PUSHYA push Filter hMem + + lda (R.AX) + and #$0F + sta TmpFileName + tay +.31 lda (R.AX),y + sta TmpFileName,y + dey + bne .31 + + >PUSHWI TmpFileName push Filename + jsr S.PStrMatchP + bcs .40 no match + +.30 ldy #S.LISTDIR.EL Get Entry length + lda (R.CX),y + tay + lda #0 + >PUSHYA Get an entry_length buffer + >PUSHBI 0 + jsr S.GetMem + bcs .99 + >STYA R.BX R.BX = DEST RECORD + stx R.DL + + ldy #S.LISTDIR.EL + lda (R.CX),y + tay + dey +.4 lda (R.AX),y + sta (R.BX),y + dey + bpl .4 + +.40 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 + sta (R.CX),y + +.5 lda (R.AX) + and #$E0 is storage_type = $F or $E ? + cmp #$E0 yes, do NOT increase FI + bne .6 + + ldy #S.LISTDIR.FI Increase FILE INDEX + lda (R.CX),y + inc + sta (R.CX),y + bne .6 + iny + lda (R.CX),y + inc + sta (R.CX),y + +.6 lda R.DL + bne .8 + jmp S.ListDirNextAD Nothing to return, start over for next file entry + +.8 clc + rts + +.99 sec + rts +*-------------------------------------- +* S.DirListCloseA +* in : +* A = hS.LISTDIR +*-------------------------------------- +S.ListDirCloseA pha + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + ldy #S.LISTDIR.REFNUM + lda (ZPQuickPtr1),y + beq .1 + jsr S.MLICloseA + bcs * If Close Failed, we cannot free IOBUF + +.1 ldy #S.LISTDIR.hIOBUF + lda (ZPQuickPtr1),y + beq .2 + jsr S.FreeMemA + +.2 ldy #S.LISTDIR.hREADBUF + lda (ZPQuickPtr1),y + beq .3 + jsr S.FreeMemA + +.3 lda (ZPQuickPtr1) Online buffer + beq .4 + jsr S.FreeMemA + +.4 ldy #S.LISTDIR.hPATTERN + lda (ZPQuickPtr1),y + beq .5 + jsr S.FreeMemA + +.5 pla + jsr S.FreeMemA + clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +* S.ListDirReadBlock +* In : +* CX = LISTDIR +* Out : +* Y,A = READ BUFFER +*-------------------------------------- +S.ListDirReadBlock + ldy #S.LISTDIR.REFNUM + lda (R.CX),y get ref_num + sta MLICALL.PARAMS+1 + ldy #S.LISTDIR.hREADBUF + lda (R.CX),y get READ BUFFER + jsr S.GetMemPtrA + >STYA MLICALL.PARAMS+2 + >LDYAI 512 + >STYA MLICALL.PARAMS+4 + >KMLICALL MLIREAD + bcs .9 + ldy #S.LISTDIR.BLKPTR set BLKPTR to $0004 + lda #4 + sta (R.CX),y + iny + lda #0 + sta (R.CX),y + ldy #S.LISTDIR.EIB set EIB to 0 + sta (R.CX),y + >LDYA MLICALL.PARAMS+2 +.9 rts +*-------------------------------------- +TmpFileName .BS 16 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.FS +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.MD5.txt b/SYS/KERNEL.S.MD5.txt new file mode 100644 index 00000000..e69de29b diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt new file mode 100644 index 00000000..c7f5f369 --- /dev/null +++ b/SYS/KERNEL.S.MEM.txt @@ -0,0 +1,474 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* !!!!!!!! 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 +*-------------------------------------- +* TODO : +* Create a 256 bytes table in SLOT #0 +* (eh, mem.ID=0 always used! useful to test if hMem=0) +* mapping hMem's to real memory blocks to help +* Garbage collector move blocks +*-------------------------------------- +S.MemMgrInit ldx /A2osX.LOMEM + lda #A2osX.LOMEM + beq .1 + inx +.1 phx + txa + lsr + lsr + lsr + tay + txa + and #7 + tax + lda #$80 +.2 dex + bmi .3 + lsr + bra .2 +.3 and MEMTABL,y + bne .4 + plx + inx + cpx /MLI + bne .1 + bra .5 +.4 plx +.5 stz MEMMGR.MHLIMIT + stz MEMMGR.HIMEM + stx MEMMGR.MHLIMIT+1 + stx MEMMGR.HIMEM+1 + >LDYAI A2osX.LOMEM + >STYA MEMMGR.LOMEM + >STYA MEMMGR.MLLIMIT + 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... + clc + rts +*-------------------------------------- +* PUBLIC +*-------------------------------------- +S.SetLowMemLimit + clc + rts +*-------------------------------------- +S.GarbageCollector + clc + rts +*-------------------------------------- +* S.GetMem +* In: +* PULLB = FLAGS +* PULLW = Size Requested +* Out: +* YA = PTR to Mem +* 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 + and #$0F + beq .10 + lda ZPMemMgrReqS + and #$F0 + clc + adc #$10 + sta ZPMemMgrReqS + bcc .10 + inc ZPMemMgrReqS+1 +.10 ldx #0 init to SLOT #0 of MEMSLOT list + lda MEMMGR.TABLESIZE Check if some free slot to reuse first + beq .6 +.1 txa + jsr S.GetMemByIDA + lda (ZPMemMgrSPtr) Get Flags + bmi .4 in use ? +.2 lda ZPMemMgrReqF 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 + 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 +*-------------- Reuse this SLOT +.5 lda ZPMemMgrReqF get requested flags + ora #S.MEM.F.INUSE mark as in use + sta (ZPMemMgrSPtr) + lda #0 + ldy #S.MEM.BIN + sta (ZPMemMgrSPtr),y + inc Mark this slot used by one task + ldy #S.MEM.REFCNT + sta (ZPMemMgrSPtr),y + ldy #S.PS.ID + lda (TSKMGR.TSKPTR),y + ldy #S.MEM.OWNERPID + sta (ZPMemMgrSPtr),y + ldy #S.MEM.PTR + lda (ZPMemMgrSPtr),y + pha + iny + 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 ? + sec + sbc ZPMemMgrReqS + beq .7 yes, allocate + 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 + sta (ZPMemMgrSPtr),y + ldy #S.PS.ID + lda (TSKMGR.TSKPTR),y + ldy #S.MEM.OWNERPID + sta (ZPMemMgrSPtr),y + jsr S.UpdateMemStats + >LDYA ZPMemMgrTmp1 Y,A = PTR + plx X = hMem + clc + rts +.99 sec + rts +*-------------------------------------- +* S.FreeMemA +* In: +* A = hMem To Free +* Out: +* X,Y unmodified +*-------------------------------------- +S.FreeMemA and #$FF + bne S.FreeMemA0 Slot=0, reserved by Kernel + rts + +S.FreeMemA0 phy + phx + jsr S.GetMemByIDA + lda (ZPMemMgrSPtr) + bmi .10 In use ? + bra * + +.10 ldy #S.MEM.REFCNT + 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 + + ldy #S.MEM.BIN + lda (ZPMemMgrSPtr),y Any BINPATH to discard ? + beq .11 + + pha save hMem + >PUSHW ZPMemMgrSPtr + pla + jsr S.GetMemByIDA + lda (ZPMemMgrSPtr) + bmi .12 In use ? + bra * + +.12 lda (ZPMemMgrSPtr) mark record as free + and #$7F + sta (ZPMemMgrSPtr) + >PULLW ZPMemMgrSPtr + +.11 lda (ZPMemMgrSPtr) mark record as free + and #$7F + sta (ZPMemMgrSPtr) + +.20 lda MEMMGR.TABLESIZE + beq .82 +.21 dec + jsr S.GetMemByIDA + lda (ZPMemMgrSPtr) + bmi .81 + dec MEMMGR.TABLESIZE discard last record + ldy #S.MEM.LEN + lda (ZPMemMgrSPtr),y give back LEN bytes + clc + adc MEMMGR.MHLIMIT to HLIMIT + sta MEMMGR.MHLIMIT + 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 + 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 +* Out: +* Y,A = PTR to MemBlock +* X unmodified +*-------------------------------------- +S.GetMemPtrA jsr S.GetMemByIDA + ldy #S.MEM.PTR + lda (ZPMemMgrSPtr),y + pha + iny + lda (ZPMemMgrSPtr),y + ply + rts +*-------------------------------------- +* S.GetMemLenA +* In: +* A = hMem +* Out: +* Y,A = PTR to MemLength +* X unmodified +*-------------------------------------- +S.GetMemLenA jsr S.GetMemByIDA + ldy #S.MEM.LEN + lda (ZPMemMgrSPtr),y + pha + iny + lda (ZPMemMgrSPtr),y + ply + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +* 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 + 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 + 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 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.MEM +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.MLI.txt b/SYS/KERNEL.S.MLI.txt new file mode 100644 index 00000000..5f5a85cb --- /dev/null +++ b/SYS/KERNEL.S.MLI.txt @@ -0,0 +1,151 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* PUBLIC +*-------------------------------------- +S.MLICreate +S.MLIDestroy +S.MLIRename +S.MLISetFileInfo +*-------------------------------------- +* S.MLIGetFileInfoA +* in : +* A = hMem To FileName +* out : +* Y,A = PTR To Buffer (L=15) +*-------------------------------------- +S.MLIGetFileInfoA + jsr S.GetMemPtrA +S.MLIGetFileInfo + >STYA MLICALL.PARAMS+1 + >KMLICALL MLIGETFILEINFO + bcs .9 + >LDYAI MLICALL.PARAMS+3 +.9 rts +*-------------------------------------- +* S.MLIOnline +* in : +* PULLB = Device +* PULLW = Dest PTR +*-------------------------------------- +S.MLIOnline >PULLB MLICALL.PARAMS+1 + >PULLW MLICALL.PARAMS+2 + >KMLICALL MLIONLINE + rts +*-------------------------------------- +S.MLISetPrefix +*-------------------------------------- +S.MLIGetPrefixA jsr S.GetMemPtrA +S.MLIGetPrefix >STYA MLICALL.PARAMS+1 + >KMLICALL MLIGETPREFIX + rts +*-------------------------------------- +* S.MLIOpenA +* in : +* A = hMem To FileName +* out : +* A = ref_num +* X = buf hMem +*-------------------------------------- +S.MLIOpenA jsr S.GetMemPtrA +S.MLIOpen >STYA MLICALL.PARAMS+1 + >PUSHWI 1024 get a ProDOS IO buffer + >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOV + jsr S.GetMem + bcs .99 + phx save Prodos Buffer hMem + >STYA MLICALL.PARAMS+3 + >KMLICALL 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 + jsr S.FreeMemA discard Prodos Buffer + pla get back MLI error + sec +.99 rts +*-------------------------------------- +* S.MLINewline +* in : +* PULLB = ref_num +* PULLB = Enable Mask +* PULLB = Newline Char +*-------------------------------------- +S.MLINewLine >PULLB MLICALL.PARAMS+1 + >PULLB MLICALL.PARAMS+2 + >PULLB MLICALL.PARAMS+3 + >KMLICALL MLINEWLINE + rts +*-------------------------------------- +* S.MLIRead +* in : +* PULLB = ref_num +* PULLW = Dest PTR +* PULLW = Bytes To Read +* out : +* Y,A = Bytes Read +*-------------------------------------- +S.MLIRead >PULLB MLICALL.PARAMS+1 + >PULLW MLICALL.PARAMS+2 + >PULLW MLICALL.PARAMS+4 + >KMLICALL MLIREAD + bcs .9 + >LDYA MLICALL.PARAMS+6 +.9 rts +*-------------------------------------- +* S.MLIWrite +* in : +* PULLB = ref_num +* PULLW = Dest PTR +* PULLW = Bytes To Read +* out : +* Y,A = Bytes Written +*-------------------------------------- +S.MLIWrite >PULLB MLICALL.PARAMS+1 + >PULLW MLICALL.PARAMS+2 + >PULLW MLICALL.PARAMS+4 + >KMLICALL MLIWRITE + bcs .9 + >LDYA MLICALL.PARAMS+6 +.9 rts +*-------------------------------------- +* S.MLIClose +* in : +* A = ref_num +* out : +*-------------------------------------- +S.MLICloseA sta MLICALL.PARAMS+1 + >KMLICALL MLICLOSE + rts +*-------------------------------------- +S.MLIFlushA +S.MLISetMark +S.MLIGetMark +S.MLISetEOF +*-------------------------------------- +* S.MLIGetEOF +* in : +* A = ref_num +* out : +* Y,A,X = EOF +*-------------------------------------- +S.MLIGetEOFA sta MLICALL.PARAMS+1 + >KMLICALL MLIGETEOF + bcs .9 + >LDYA MLICALL.PARAMS+2 + ldx MLICALL.PARAMS+4 + clc +.9 rts +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.MLI +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.NET.txt b/SYS/KERNEL.S.NET.txt new file mode 100644 index 00000000..4aae2aa8 --- /dev/null +++ b/SYS/KERNEL.S.NET.txt @@ -0,0 +1,154 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.AddNetCfg +* in : +* PULLB = ProtocolID +* PULLW = PTR to NetCfg Struct +* out : +* A = +* cc,cs +*-------------------------------------- +S.AddNetCfg lda NetCfgCnt + cmp #K.NETCFG.MAX + beq .9 + + asl + sta NetCfgIdx + tax + >PULLB NetCfgTbl,x save PROTOID + >PULLW ZPQuickPtr1 + + >PUSHWI K.NETCFG.SIZE + >PUSHBI 0 + jsr S.GetMem + bcs .99 + >STYA ZPQuickPtr2 + txa + ldx NetCfgIdx + sta NetCfgTbl+1,x + + ldy #K.NETCFG.SIZE +.1 dey + lda (ZPQuickPtr1),y + sta (ZPQuickPtr2),y + tya + bne .1 + + lda NetCfgCnt + inc NetCfgCnt + clc + rts +.9 >PULLA discard parameters + >PULLA + >PULLA + sec +.99 rts +*-------------------------------------- +* S.SetNetCfg +* in : +* PULLB = ProtocolID +* PULLW = PTR to NetConfig +* out : +*-------------------------------------- +S.SetNetCfg >PULLA + pha + >PULLW ZPQuickPtr1 + pla + ldx NetCfgCnt + beq .9 + + ldy #0 +.1 cmp NetCfgTbl,y + beq .2 + iny + iny + dex + bne .1 + +.9 sec + rts + +.2 lda NetCfgTbl+1,y + jsr S.GetMemPtrA + >STYA ZPQuickPtr2 + ldy #K.NETCFG.SIZE +.3 dey + lda (ZPQuickPtr1),y + sta (ZPQuickPtr2),y + tya + bne .3 + clc + rts +*-------------------------------------- +* S.GetNetCfgA +* in : +* A = ProtocolID +* out : +* Y,A = PTR to NetConfig +*-------------------------------------- +S.GetNetCfgA ldx NetCfgCnt + beq .9 + ldy #0 +.1 cmp NetCfgTbl,y + beq .2 + iny + iny + dex + bne .1 +.9 sec + rts +.2 lda NetCfgTbl+1,y + jsr S.GetMemPtrA + clc + rts +*-------------------------------------- +* S.ClrNetCfgA +* in : +* A = ProtocolID +* out : +* cc,cs +*-------------------------------------- +S.ClrNetCfgA ldx NetCfgCnt + beq .9 + ldy #0 +.1 cmp NetCfgTbl,y + beq .2 + iny + iny + dex + bne .1 +.9 sec + rts + +.2 lda NetCfgTbl+1,y + jsr S.FreeMemA X,Y unmodified + cpy #K.NETCFG.MAX*2-2 last slot? + beq .4 +.3 lda NetCfgTbl+2,y + sta NetCfgTbl,y + lda NetCfgTbl+3,y + sta NetCfgTbl+1,y + iny + iny + cpy #K.NETCFG.MAX*2-2 last slot? + bne .3 +.4 lda #0 + sta NetCfgTbl+1,y + sta NetCfgTbl,y + clc + rts +*-------------------------------------- +NetCfgCnt .HS 00 +NetCfgIdx .BS 1 +NetCfgTbl .BS K.NETCFG.MAX*2 +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.NET +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.RDR.txt b/SYS/KERNEL.S.RDR.txt new file mode 100644 index 00000000..684b9638 --- /dev/null +++ b/SYS/KERNEL.S.RDR.txt @@ -0,0 +1,151 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.NewBufRdr +* In : +* PULLB = DATA hMem +* PULLB = Delim Char +* PULLW = Size of DATA +* Out : +* A = hMem To newly created BufRdr +*-------------------------------------- +S.NewBufRdr >PUSHWI S.BUFRDR.SIZE + >PUSHBI 0 0 = no option + jsr S.GetMem + bcs .98 + phx save hMem + >STYA ZPQuickPtr1 + ldy #S.BUFRDR.hMEM + + >PULLB (ZPQuickPtr1),y + ldy #S.BUFRDR.DELIM + + >PULLB (ZPQuickPtr1),y + ldy #S.BUFRDR.LEN+1 + >PULLB (ZPQuickPtr1),y + dey + >PULLB (ZPQuickPtr1),y + + ldy #S.BUFRDR.IDX + lda #0 + sta (ZPQuickPtr1),y + iny + sta (ZPQuickPtr1),y + + pla + clc + rts +.98 pha + >PULLA + >PULLYA + pla +.99 rts +*-------------------------------------- +* S.BufRdrReadA +* In : +* A = hMem To BufRdr +* Out : +* CC: Y,A = PTR to line (PSTR) +* CS: EOF +*-------------------------------------- +S.BufRdrReadA jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + ldy #S.BUFRDR.hMEM + jsr S.GetMemPtrA + >STYA ZPQuickPtr2 PTR to DATA + + ldy #S.BUFRDR.IDX + lda (ZPQuickPtr1),y + sta ZPQuickPtr3 IDX + clc + adc ZPQuickPtr2 PTR=PTR+IDX + sta ZPQuickPtr2 + iny + lda (ZPQuickPtr1),y + sta ZPQuickPtr3+1 + adc ZPQuickPtr2+1 + sta ZPQuickPtr2+1 + + ldy #S.BUFRDR.LEN + lda (ZPQuickPtr1),y + sta ZPQuickPtr4 + iny + lda (ZPQuickPtr1),y + sta ZPQuickPtr4+1 + + stz TmpBuffer256 + ldy #S.BUFRDR.DELIM + +.1 lda ZPQuickPtr4 + bne .2 + lda ZPQuickPtr4 + beq .8 + dec ZPQuickPtr4+1 +.2 dec ZPQuickPtr4 + + lda (ZPQuickPtr2) + + inc ZPQuickPtr2 + bne .3 + inc ZPQuickPtr2+1 + +.3 inc ZPQuickPtr3 + bne .4 + inc ZPQuickPtr3+1 + +.4 cmp (ZPQuickPtr1),y DELIM + beq .8 + inc TmpBuffer256 + beq .8 + ldx TmpBuffer256 + sta TmpBuffer256,x + bra .1 + +.8 lda TmpBuffer256 + bne .81 + sec + rts + +.81 ldy #S.BUFRDR.IDX + lda ZPQuickPtr3 + sta (ZPQuickPtr1),y + iny + lda ZPQuickPtr3+1 + sta (ZPQuickPtr1),y + + ldy #S.BUFRDR.LEN + lda ZPQuickPtr4 + sta (ZPQuickPtr1),y + iny + lda ZPQuickPtr4+1 + sta (ZPQuickPtr1),y + >LDYAI TmpBuffer256 + clc + rts +*-------------------------------------- +* S.BufRdrCloseA +* In : +* A = hMem To BufRdr +*-------------------------------------- +S.BufRdrCloseA pha + jsr S.GetMemPtrA + >STYA S.BUFRDR.hMEM + ldy #S.BUFRDR.hMEM + lda (S.BUFRDR.hMEM),y + jsr S.FreeMemA + pla + jsr S.FreeMemA + clc + rts +*-------------------------------------- +* PRIVATE +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.RDR +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.SCR.txt b/SYS/KERNEL.S.SCR.txt new file mode 100644 index 00000000..baf83d58 --- /dev/null +++ b/SYS/KERNEL.S.SCR.txt @@ -0,0 +1,283 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* !!!!!!!! DO NOT USE VCPU16 !!!!!!!! +* !!!!!! DO NOT USE ZPQuickPTRs !!!!! +*-------------------------------------- +SYSSCR.BASL .EQ ZPSysScr COUT +SYSSCR.BASLTMP .EQ ZPSysScr+2 Scrolling +SYSSCR.STRPTR .EQ ZPSysScr+4 PPSTR +*-------------------------------------- +SYSSCR.BASL0 .EQ $800 +*-------------------------------------- +* S.SysScrInit +*-------------------------------------- +S.SysScrInit stz SYSSCR.CPULOADI + stz SYSSCR.CH + stz SYSSCR.CV + + ldx #0 + + ldy #0 +.1 lda SYSSCR.TITLE,y + beq .2 + + jsr S.SysScrSetCharAtYX + iny + bne .1 + +.2 lda #$20 + jsr S.SysScrSetCharAtYX + iny + cpy #80 + bne .2 + + jsr S.SysScrHOME + + lda A2osX.SCREENS + ora #A2osX.SCREENS.S + sta A2osX.SCREENS + lda #A2osX.SCREENS.S + jsr S.ScreenSelectA + clc + rts +*-------------------------------------- +S.SysScrCPULoad ldx SYSSCR.CPULOADI + lda SYSSCR.CPULOADC,x + sta SYSSCR.BASL0+38 + dec SYSSCR.CPULOADI + bpl .1 + lda #3 + sta SYSSCR.CPULOADI +.1 rts +*-------------------------------------- +* S.SysScrPRCode +* In: +* CC : Prints [OK] +* CS : [$$] at column 36-39 +*-------------------------------------- +S.SysScrPRCode php save P to keep carry + bcs .1 + lda #0 ensure we have ERR=0 if cc +.1 pha + ldy #76 HTAB to 76 + sty SYSSCR.CH + lda #"[" + jsr S.SysScrCOUTA + pla + pha + bne .2 + + lda #"O" + jsr S.SysScrCOUTA + lda #"K" + jsr S.SysScrCOUTA + bra .3 + +.2 jsr S.SysScrPRBYTEA +.3 lda #"]" + jsr S.SysScrCOUTA + pla + plp + rts +*-------------------------------------- +S.SysScrPPSTRA jsr S.GetMemPtrA +S.SysScrPPSTR >STYA SYSSCR.STRPTR + lda (SYSSCR.STRPTR) + beq .9 + ldy #0 +.1 iny + lda (SYSSCR.STRPTR),y + cmp #'\' + bne .7 + tya + cmp (SYSSCR.STRPTR) + beq .9 + iny + lda (SYSSCR.STRPTR),y + cmp #'n' + bne .7 + lda #13 +.7 jsr S.SysScrCOUTA +.8 tya + cmp (SYSSCR.STRPTR) + bne .1 +.9 >LDYA SYSSCR.STRPTR + rts +*-------------------------------------- +S.SysScrPRBYTEA pha + lsr + lsr + lsr + lsr + ora #$B0 + cmp #$BA + bcc .1 + adc #6 +.1 jsr S.SysScrCOUTA + pla + and #$0F + ora #$B0 + cmp #$BA + bcc S.SysScrCOUTA + adc #6 +*-------------------------------------- +S.SysScrCOUTA phx + phy + cmp #13 + bne .1 + jsr S.SysScrCROUT + ply + plx + rts + +.1 ldy SYSSCR.CH + ldx SYSSCR.CV + ora #$80 + jsr S.SysScrSetCharAtYX + jsr S.SysScrFSOUT + ply + plx + rts +*-------------------------------------- +S.SysScrFSOUT lda SYSSCR.CH + cmp #79 + beq S.SysScrCROUT1 + inc SYSSCR.CH + rts +*-------------------------------------- +S.SysScrCROUT jsr S.SysScrCLREOL +S.SysScrCROUT1 stz SYSSCR.CH + ldx SYSSCR.CV + cpx #23 + beq S.SysScrScroll + inc SYSSCR.CV + rts +*-------------------------------------- +S.SysScrCLREOL ldx SYSSCR.CV + lda #$A0 + ldy SYSSCR.CH +.1 cpy #79 + beq .2 + jsr S.SysScrSetCharAtYX + iny + bne .1 +.2 rts +*-------------------------------------- +S.SysScrScroll ldx #1 +.1 lda SYSSCR.BASEL,x + sta SYSSCR.BASL + lda SYSSCR.BASEH,x + sta SYSSCR.BASL+1 + inx + lda SYSSCR.BASEL,x + sta SYSSCR.BASLTMP + lda SYSSCR.BASEH,x + sta SYSSCR.BASLTMP+1 + + ldy #39 + sta SETWRITEAUX + sta SETREADAUX +.2 lda (SYSSCR.BASLTMP),y + sta (SYSSCR.BASL),y + dey + bpl .2 + + ldy #39 + sta CLRWRITEAUX + sta CLRREADAUX +.3 lda (SYSSCR.BASLTMP),y + sta (SYSSCR.BASL),y + dey + bpl .3 + + cpx #23 + bne .1 + + ldy #39 + lda #$A0 +.4 sta SETWRITEAUX + sta (SYSSCR.BASLTMP),y + sta CLRWRITEAUX + sta (SYSSCR.BASLTMP),y + dey + bpl .4 + rts +*-------------------------------------- +S.SysScrClrLineAtX + lda SYSSCR.BASEL,x + sta SYSSCR.BASL + lda SYSSCR.BASEH,x + sta SYSSCR.BASL+1 + + lda #$A0 + + ldy #39 + sta SETWRITEAUX +.1 sta (SYSSCR.BASL),y + dey + bpl .1 + + ldy #39 + sta CLRWRITEAUX +.2 sta (SYSSCR.BASL),y + dey + bpl .2 + + rts +*-------------------------------------- +S.SysScrHOME ldx #23 + +.1 jsr S.SysScrClrLineAtX + dex + bne .1 + + stz SYSSCR.CH + lda #1 + sta SYSSCR.CV + + rts +*-------------------------------------- +S.SysScrSetCharAtYX + cmp #$40 + bcc .1 + cmp #$5F + bcs .1 + and #$3F + +.1 phy + pha + lda SYSSCR.BASEL,x + sta SYSSCR.BASL + lda SYSSCR.BASEH,x + sta SYSSCR.BASL+1 + tya + lsr + tay + bcs .2 + sta SETWRITEAUX + +.2 pla + sta (SYSSCR.BASL),y + sta CLRWRITEAUX + ply + rts +*-------------------------------------- +SYSSCR.CH .BS 1 +SYSSCR.CV .BS 1 +SYSSCR.CPULOADI .BS 1 +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 +SYSSCR.BASEH .HS 08.08.09.09.0A.0A.0B.0B.08.08.09.09.0A.0A.0B.0B.08.08.09.09.0A.0A.0B.0B +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.SCR +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt new file mode 100644 index 00000000..7638832e --- /dev/null +++ b/SYS/KERNEL.S.STR.txt @@ -0,0 +1,384 @@ +PR#3 +PREFIX /DATA/A2OSX +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.PStrCpyA jsr S.GetMemPtrA + >STYA ZPQuickPtr1 +S.PStrCpy2 lda (ZPQuickPtr1) + inc + tay + lda #0 Y,A = len of new string + >PUSHYA + >PUSHA 0 = no option + jsr S.GetMem + bcs .9 + phx + >STYA ZPQuickPtr2 + lda (ZPQuickPtr1) + sta (ZPQuickPtr2) + tay + beq .2 +.1 lda (ZPQuickPtr1),y + sta (ZPQuickPtr2),y + dey + bne .1 +.2 pla + clc + rts +.9 sec + rts +*-------------------------------------- +* S.PStrCat +* IN: +* PULLB = hMem to S1 (PSTRING) +* PULLB = hMem to S2 (PSTRING) +* OUT: +* A = hMem to S1+S2 (PSTRING) +*-------------------------------------- +S.PStrCat >PULLA + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 save S1 + >PULLA + jsr S.GetMemPtrA + >STYA ZPQuickPtr2 save S2 + lda (ZPQuickPtr1) Compute length of new path = S1 + S2 + 1 + sec + adc (ZPQuickPtr2) + tay + lda #0 Y,A = len of new string + >PUSHYA + >PUSHA 0 = no option + jsr S.GetMem + bcs .9 OOM error + >STYA ZPQuickPtr3 + phx save New hMem + lda (ZPQuickPtr1) + tax + ldy #0 +.2 iny + lda (ZPQuickPtr1),y + sta (ZPQuickPtr3),y + dex + bne .2 + lda (ZPQuickPtr2) + tax +.3 inc ZPQuickPtr2 + bne .4 + inc ZPQuickPtr2+1 +.4 iny + lda (ZPQuickPtr2) + sta (ZPQuickPtr3),y + dex + bne .3 + tya + sta (ZPQuickPtr3) + pla returns A = new hMem + clc + rts +.9 sec + rts +*-------------------------------------- +* S.PStrCmp +* IN: +* PULLB = hMem to S1 (PSTRING) +* PULLB = hMem to S2 (PSTRING) +* OUT: +* cc or cs +*-------------------------------------- +S.PStrCmp >PULLA + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 save S1 + >PULLA + jsr S.GetMemPtrA + >STYA ZPQuickPtr2 save S2 + lda (ZPQuickPtr1) + tay + cmp (ZPQuickPtr2) + bne .9 +.1 lda (ZPQuickPtr1),y + cmp (ZPQuickPtr2),y + bne .9 + dey + bne .1 + clc + rts +.9 sec + rts +*-------------------------------------- +* S.PStrMatch +* IN: +* PULLB = hMem to String (PSTRING) +* PULLB = hMem to Pattern (PSTRING) +* OUT: +* cc = match +* cs = no match +*-------------------------------------- +S.PStrMatch >PULLA + jsr S.GetMemPtrA + >STYA ZPQuickPtr2 save String + >PULLA + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 save Pattern + bra S.PStrMatch1 + +S.PStrMatchP >PULLW ZPQuickPtr2 pull String + >PULLW ZPQuickPtr1 pull Pattern + +S.PStrMatch1 lda (ZPQuickPTR1) Keep Pattern Length in X + tax + beq .8 Match always if empty + ldy #0 + +.1 inc ZPQuickPTR1 Make PTR1 advance to next char + bne .2 + inc ZPQuickPTR1+1 + +.2 lda (ZPQuickPTR1) get pattern char + cmp #'*' + beq .5 + +.3 tya we must match ? or regular char + cmp (ZPQuickPTR2) check if at end of string + beq .9 yes, no char left, exit with error + + iny advance to next char to compare + + lda (ZPQuickPTR1) get back pattern char + cmp #'?' + beq .4 no need to compare, any char will match + cmp (ZPQuickPTR2),y Regular Char, compare with string at Y + bne .9 no match, exit + +.4 dex char matched, check if end of pattern + bne .1 continue if remaining char in pattern + + tya end of pattern, but end of string ? + cmp (ZPQuickPTR2) end of string ? + beq .8 yes, string matched entirely + bra .9 no, remaining char in string, no match + +.5 dex we have '*', last char of pattern ? + beq .8 yes, match everything, including empty string + + inc ZPQuickPTR1 Make PTR1 advance to next char + bne .6 + inc ZPQuickPTR1+1 + +.6 lda (ZPQuickPTR1) get next char of pattern + cmp #'*' another '*' ? + beq .5 yes, '**' = '*', go next char + cmp #'?' '*?' ??? we must match a least one char + beq .3 + +.7 tya we need at least one remaining char in string, + cmp (ZPQuickPTR2) check if at end of string + beq .9 no chance to match ? or regular char + + iny + lda (ZPQuickPTR1) get again char in pattern + cmp (ZPQuickPTR2),y compare with char in string + bne .7 not equal to next non wildcard in pattern + + bra .4 go check remaining char in pattern... + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +* S.PStrGetTkn +* IN: +* PULLB = Token IDX +* 0: "Split mode": first token + remaining +* !0: "Std Mode": Return token # +* PULLB = SEP char +* PULLB = hMem to PSTRING +* OUT: +* A = hMem to Token (PSTRING) +* X = hMem to Remaining String After Token "Split Mode" +*-------------------------------------- +S.PStrGetTkn >PULLA Get IDX + sta ZPQuickPtr2+1 + >PULLA Get SEP + sta ZPQuickPtr2 + >PULLA Get PStr + jsr S.GetMemPtrA + >STYA ZPQuickPtr1 + ldx #0 init token count to 0 + ldy #0 + stz ZPQuickPtr3 init INTOKEN start to 0 +.1 iny + lda (ZPQuickPtr1),y + and #$7F + cmp ZPQuickPtr2 char=SEP ? + bne .3 no, start a new token if not alredy in + lda ZPQuickPtr3 SEP:in INTOKEN ? + beq .4 no, skip this SEP + inx yes, increase token count + lda ZPQuickPtr2+1 requested token=0 ? + beq .71 yes, we are in "split mode" + cpx ZPQuickPtr2+1 no,is current X=requested IDX? + beq .71 + stz ZPQuickPtr3 reset in INTOKEN start + bra .4 +.3 lda ZPQuickPtr3 char:already INTOKEN ? + bne .4 yes, keep existing start index + sty ZPQuickPtr3 mark begining of token +.4 tya + cmp (ZPQuickPtr1) end of string ? + bne .1 no, get next one + lda ZPQuickPtr3 INTOKEN? + beq .6 + inx yes, last one is ending with string +.6 lda ZPQuickPtr2+1 split mode ? + beq .7 + cpx ZPQuickPtr2+1 is token = requested? + beq .7 + sec End of String reached, no matching token +.61 rts +.71 dey move back yo end of token before this SEP +.7 sty ZPQuickPtr3+1 we have matching token (or 1st one in split mode) at [ZPQuickPtr3,ZPQuickPtr3+1] + tya compute token len=Y-ZPQuickPtr3+1 + sec + sbc ZPQuickPtr3 + inc +1 + inc +1 for string len + tay + lda #0 + >PUSHYA Get a hMem for this token + >PUSHA 0 = no option + jsr S.GetMem + bcs .61 + phx save hMem + >STYA ZPQuickPtr4 + lda ZPQuickPtr3+1 + sec + sbc ZPQuickPtr3 + inc + sta (ZPQuickPtr4) set this string length + ldy ZPQuickPtr3 + dey +.8 iny + inc ZPQuickPtr4 + bne .9 + inc ZPQuickPtr4+1 +.9 lda (ZPQuickPtr1),y + sta (ZPQuickPtr4) + cpy ZPQuickPtr3+1 + bne .8 + lda ZPQuickPtr2+1 requested token=0 ? + bne .87 + tya yes, we are in "split mode" + cmp (ZPQuickPtr1) Remaining chars ? + beq .87 +.10 iny move to next char + lda (ZPQuickPtr1),y + cmp ZPQuickPtr2 char=SEP? + bne .11 + tya + cmp (ZPQuickPtr1) last one ? + bne .10 + bra .87 yes, nothing to return +.11 sty ZPQuickPtr3+1 ZPQuickPtr3+1=1st non SEP char + lda (ZPQuickPtr1) compute reamining len=Y-ZPQuickPtr3+1 + sec + sbc ZPQuickPtr3+1 + inc + inc +1 for string len + tay + lda #0 + >PUSHYA Get a hMem for remaining string + >PUSHA 0 = no option + jsr S.GetMem + bcs .98 + phx save hMem + >STYA ZPQuickPtr4 + lda (ZPQuickPtr1) + sec + sbc ZPQuickPtr3+1 + inc + sta (ZPQuickPtr4) + ldy ZPQuickPtr3+1 + dey +.12 iny + inc ZPQuickPtr4 + bne .13 + inc ZPQuickPtr4+1 +.13 lda (ZPQuickPtr1),y + sta (ZPQuickPtr4) + tya + cmp (ZPQuickPtr1) + bne .12 + plx get back remaining string hMem + pla get back token hMem + clc + rts +.87 ldx #0 Splitmode but no remaining string to return + pla get back token hMem + clc + rts +.98 pla get back Token hMem + jsr S.FreeMemA discard Token +.99 sec + rts +*-------------------------------------- +* S.GetPStrIndex +* in : +* PULLW = String Table (Array Of PSTR) +* PULLW = String To Search (PSTR) +* out : +* CC: A = String Index In Table +*-------------------------------------- +S.GetPStrIndex >PULLW ZPQuickPtr1 + >PULLW ZPQuickPtr2 + ldx #0 +.1 lda (ZPQuickPtr1) + beq .99 + cmp (ZPQuickPtr2) + bne .3 + tay +.2 lda (ZPQuickPtr1),y + eor (ZPQuickPtr2),y + and #$7F + bne .3 + dey + bne .2 + txa + clc + rts +.3 inx + lda (ZPQuickPtr1) + sec + adc ZPQuickPtr1 + sta ZPQuickPtr1 + bcc .1 + inc ZPQuickPtr1+1 + bra .1 +.99 lda #SYSMGR.ERRSYN + sec + rts +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S.STR +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.TSK.txt b/SYS/KERNEL.S.TSK.txt new file mode 100644 index 00000000..e345d316 --- /dev/null +++ b/SYS/KERNEL.S.TSK.txt @@ -0,0 +1,544 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* S.TskMgrInit +*-------------------------------------- +S.TskMgrInit stz TSKMGR.LASTID + + >LDYAI TSKMGR.TABLE + >STYA TSKMGR.TSKPTR + + ldx #K.PS.MAX + +.1 lda #0 + ldy #S.PS.SIZE-1 + +.2 sta (TSKMGR.TSKPTR),y + dey + bpl .2 + + lda TSKMGR.TSKPTR + clc + adc #S.PS.SIZE + sta TSKMGR.TSKPTR + bcc .3 + inc TSKMGR.TSKPTR+1 +.3 dex + bne .1 + + >LDYAI TSKMGR.TABLE Make PS #0 as current process + >STYA TSKMGR.TSKPTR + + jsr S.CreateEnv + bcs .9 + ldy #S.PS.hENV + sta TSKMGR.TABLE,y + + >LDYAI TmpBuffer256 + jsr S.MLIGetPrefix + bcs .9 + >PUSHWI TmpBuffer256 + jsr S.NewPStr + bcs .9 + ldy #S.PS.hPREFIX + sta TSKMGR.TABLE,y + >PUSHWI TmpBuffer256 push ENV value + >PUSHWI ENV.A2osX push ENV name + ldy #S.PS.hENV + 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 + + lda #K.PS.MAX-1 Skip PS #0 + sta TSKMGR.COUNT + +.1 lda (TSKMGR.TSKPTR) get S.PS.F + and #S.PS.F.INUSE In use ? + beq .5 + + lda (TSKMGR.TSKPTR) get S.PS.F + and #S.PS.F.HOLD Waiting for Another Task to Terminate? + beq .3 + + ldy #S.PS.CID + lda (TSKMGR.TSKPTR),y + jsr S.IsPSRunningA + 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 + clc + adc (TSKMGR.TSKPTR),y + sta Kernel.JMP + iny + pla + adc (TSKMGR.TSKPTR),y + sta Kernel.JMP+1 + + lda #0 Don't forget to reset S.PC + sta (TSKMGR.TSKPTR),y + dey + sta (TSKMGR.TSKPTR),y + + >LDYA TSKMGR.TSKPTR + ldx #TSKMGR.RUN + jsr Kernel.BINCALL Call RUN function + 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 + + ldy #S.PS.ID + lda (TSKMGR.TSKPTR),y + jsr S.FreeProcessA + bcs .99 + +.5 lda TSKMGR.TSKPTR + clc + adc #S.PS.SIZE + sta TSKMGR.TSKPTR + bcc .6 + inc TSKMGR.TSKPTR+1 + +.6 dec TSKMGR.COUNT + bne .1 + clc + rts +.99 bra * +*-------------------------------------- +* S.DispatchEvent +* IN: +* PULLW = Event +* OUT: +* CS: Not Dispatched +* CC: Event Cleared +*-------------------------------------- +S.DispatchEvent >LDYAI TSKMGR.TABLE+S.PS.SIZE + >STYA TSKMGR.TSKPTR + + lda #K.PS.MAX-1 + sta TSKMGR.COUNT + +.1 lda (TSKMGR.TSKPTR) get S.PS.F + and #S.PS.F.INUSE In use ? + beq .3 + + lda (TSKMGR.TSKPTR) get S.PS.F + and #S.PS.F.HOLD Waiting for Another Task to Terminate? + bne .3 + + lda (TSKMGR.TSKPTR) get S.PS.F + and #S.PS.F.EVENT Accept Events ? + beq .3 + + 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 + bcc .8 + +.3 lda TSKMGR.TSKPTR + clc + adc #S.PS.SIZE + sta TSKMGR.TSKPTR + bcc .4 + inc TSKMGR.TSKPTR+1 + +.4 dec TSKMGR.COUNT + bne .1 + sec +.8 rts +*-------------------------------------- +* S.TskMgrQuit +*-------------------------------------- +S.TskMgrQuit clc + rts +*-------------------------------------- +* PUBLIC +*-------------------------------------- +* S.ExecProcessA (Blocking Parent PID) +* in : +* A = hMem To Full 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 + pha Save Child PID + lda (TSKMGR.TSKPTR) + ora #S.PS.F.HOLD + sta (TSKMGR.TSKPTR) + pla Get Back PID + clc +.9 rts +*-------------------------------------- +* S.CreateProcessA (Non Blocking) +* in : +* A = hMem To Full Cmd Line +* out : +* A = Child PSID +*-------------------------------------- +S.CreateProcessA + pha save CMD line + >LDYAI MSG.NEWPS + jsr S.SysScrPPSTR + + ldy #S.PS.ID + lda (TSKMGR.TSKPTR),y + + jsr S.CreateChildProcessA + + bcs .99 + >STYA TSKMGR.pNewPS + + pla Get Back CMD Line + jsr S.InitProcessA + bcs .97 Init Failed or exit? + ldy #S.PS.ID + lda (TSKMGR.pNewPS),y + 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 + jsr S.FreeProcessA + bra .90 + +.99 plx Discard CMD Line + pha save error code + +.90 pla get back error code + sec + rts +*-------------------------------------- +* S.GetPSByIDA +* In : +* A = PID +* Out : +* Y,A = PTR to TSKSLOT +*-------------------------------------- +S.GetPSByIDA tax + bne .10 + >LDYAI TSKMGR.TABLE + clc + rts + +.10 sta ZPQuickPtr1 Store requested PID + lda #K.PS.MAX + sta ZPQuickPtr1+1 + + >LDYAI TSKMGR.TABLE+S.PS.SIZE + >STYA ZPQuickPtr2 + +.1 lda (ZPQuickPtr2) + bpl .2 + ldy #S.PS.ID + lda (ZPQuickPtr2),y + cmp ZPQuickPtr1 + beq .8 +.2 dec ZPQuickPtr1+1 + beq .9 + lda ZPQuickPtr2 + 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 + bcc .2 + inc R.BH +.2 dex + bne .1 + lda #TSKMGR.ERROOS + sec + rts + +.9 lda #TSKMGR.ERRNSP + sec + rts + +.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 + + inc TSKMGR.LASTID + bne .4 + inc TSKMGR.LASTID Ensure PSID not 0 +.4 lda TSKMGR.LASTID + + ldy #S.PS.ID + sta (R.BX),y + lda #0 + ldy #S.PS.hCS +.5 sta (R.BX),y Blank Everything in this S.PS + iny + cpy #S.PS.SIZE + bne .5 + + ldy #S.PS.hPREFIX copy hPREFIX... + lda (R.AX),y + jsr S.PStrCpyA + bcs .99 + + ldy #S.PS.hPREFIX + sta (R.BX),y + ldy #S.PS.hENV ...and hENV from parent PS + lda (R.AX),y + jsr S.DupEnvA + bcs .99 + ldy #S.PS.hENV + sta (R.BX),y + + ldy #S.PS.hINDEV + lda (R.AX),y + sta (R.BX),y + ldy #S.PS.hOUTDEV + lda (R.AX),y + sta (R.BX),y + ldy #S.PS.hERRDEV + lda (R.AX),y + sta (R.BX),y + + ldy #S.PS.ID + lda (R.BX),y + tax Exit with X=PSID + >LDYA R.BX And Y,A=S.PS + clc + rts +.99 sec + rts +*-------------------------------------- +* S.InitProcessA +* 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 + >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 + >PUSHA push CMD for S.FileSearch + txa + ldy #S.PS.hARGS + sta (TSKMGR.pNewPS),y set ARGS hMem (0 if none) + >PUSHWI ENV.PATH push ENVNAME=PATH + ldy #S.PS.hENV + lda (TSKMGR.pNewPS),y + >PUSHA + jsr S.GetEnvVarP get value for ENV=PATH + bcs .99 + >STAL 0 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 + pha + jsr S.SysScrPPSTRA + pla + jsr S.LoadBinA A = BinPath hMem + bcs .97 + >STYA Kernel.JMP 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 + bcs .97 + jsr .97 + clc + rts +.97 pha save ERR + >LDAL 1 + jsr S.FreeMemA + pla +.98 pha save ERR + >LDAL 0 + jsr S.FreeMemA + pla +.99 >REMLOCAL 2 + sec + rts +*-------------------------------------- +* S.QuitProcessA +* In : A = PID to Quit (call TSKMGR.QUIT) +*-------------------------------------- +S.QuitProcessA jsr S.GetPSByIDA + bcs .9 + >STYA ZPQuickPtr1 + ldy #S.PS.hCS + lda (ZPQuickPtr1),y + jsr S.GetMemPtrA + >STYA Kernel.JMP + >LDYA ZPQuickPtr1 + ldx #TSKMGR.QUIT + jsr Kernel.BINCALL Call QUIT function + clc + rts +.9 bra * +*-------------------------------------- +* S.FreeProcessA +* In : A = PID to free +*-------------------------------------- +S.FreeProcessA jsr S.GetPSByIDA + bcs .9 + >STYA ZPQuickPtr1 + ldy #S.PS.hARGS + lda (ZPQuickPtr1),y + beq .1 + jsr S.FreeMemA +.1 ldy #S.PS.hCMD + lda (ZPQuickPtr1),y + beq .2 + jsr S.FreeMemA +.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.COUNT .BS 1 +TSKMGR.LASTID .BS 1 +*-------------------------------------- +MSG.NEWPS >PSTRING "\nTskMgr:" +MAN +SAVE SYS/KERNEL.S.TSK +LOAD SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt new file mode 100644 index 00000000..30351d09 --- /dev/null +++ b/SYS/KERNEL.S.txt @@ -0,0 +1,541 @@ +PR#3 +PREFIX /DATA/A2osX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $E000 + .TF SYS/KERNEL +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/KERNEL.I + .INB INC/A2OSX.I + .INB INC/IO.I + .INB INC/PRODOS.I +*-------------------------------------- +KERNEL.BOOT jmp S.Kernel +*-------------------------------------- +KERNEL.SYSCALL jmp (.1,x) +*-------------------------------------- +.1 .DA S.GetMem $00 + .DA S.FreeMemA + .DA S.ClrMemA + .DA S.GetMemPtrA + + .DA S.GetMemLenA + .DA S.GetMemByIDA + .DA S.GetMemByNameA + .DA 0 +*-------------------------------------- + .DA S.NewPStr $10 + .DA S.PStrCpyA + .DA S.PStrCat + .DA S.PStrCmp + + .DA S.PStrGetTkn + .DA S.GetPStrIndex + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.LoadBinA $20 + .DA S.LoadLib + .DA S.UnloadLibA + .DA S.LoadDrvA + + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.ExpandPStrA $30 + .DA S.ExpandPStr + .DA S.GetEnvVarH + .DA S.GetEnvVarP + + .DA S.SetEnvVarH + .DA S.SetEnvVarP + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.MLICreate $40 + .DA S.MLIDestroy + .DA S.MLIRename + .DA S.MLISetFileInfo + + .DA S.MLIGetFileInfoA + .DA S.MLIOnline + .DA S.MLISetPrefix + .DA S.MLIGetPrefixA + + .DA S.MLIOpenA $50 + .DA S.MLINewLine + .DA S.MLIRead + .DA S.MLIWrite + + .DA S.MLICloseA + .DA S.MLIFlushA + .DA S.MLISetMark + .DA S.MLIGetMark + + .DA S.MLISetEOF $60 + .DA S.MLIGetEOFA + .DA 0 + .DA 0 + + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.GetDevByIDA $70 + .DA S.GetDevByNameA + .DA S.GetDevTable + .DA S.GetDevInfoA + + .DA S.DevOutA + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.GetEvent $80 + .DA S.DestroyEvent + .DA 0 + .DA 0 + + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.ExecProcessA $90 + .DA S.CreateProcessA + .DA 0 + .DA 0 + + .DA S.GetPSByIDA + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.CheckPrefixA $A0 + .DA S.FileSearch + .DA S.LoadFileA + .DA S.ListDirInitA + + .DA S.ListDirNextA + .DA S.ListDirCloseA + .DA 0 + .DA 0 +*-------------------------------------- + .DA S.AddNetCfg $B0 + .DA S.SetNetCfg + .DA S.GetNetCfgA + .DA S.ClrNetCfgA + + .DA 0 + .DA 0 + .DA 0 + .DA 0 +*-------------------------------------- +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 + + stz A2osX.SCREENS + stz A2osX.ACTIVESCRN + jsr S.SysScrInit + + >LDYAI MSG.INIT0 + jsr S.SysScrPPSTR + + >LDYAI MSG.INIT1 + jsr S.SysScrPPSTR + jsr S.MemMgrInit + jsr S.SysScrPRCode + bcs .1 + + >LDYAI MSG.INIT2 + jsr S.SysScrPPSTR + + jsr S.TskMgrInit + jsr S.SysScrPRCode +.1 bcs .2 + + >LDYAI MSG.INIT3 + jsr S.SysScrPPSTR + jsr S.DevMgrInit + jsr S.SysScrPRCode +.2 bcs .3 + + >LDYAI MSG.INIT4 + jsr S.SysScrPPSTR + jsr S.EvtMgrInit + jsr S.SysScrPRCode +.3 bcs .99 + + >LDYAI MSG.INIT5 + jsr S.SysScrPPSTR + + >PUSHWI STARTUP.FILE Build A2osX.STARTUP full path... + jsr S.NewPStr + pha save for discard + >PUSHA + >PUSHWI ENV.A2osX get KRNL root path + ldy #S.PS.hENV + lda TSKMGR.TABLE,y + >PUSHA + jsr S.GetEnvVarP + pha save for discard + >PUSHA + jsr S.PStrCat + pha save for discard + jsr S.ExecFileA + bcs .99 + pla + jsr S.FreeMemA + pla + jsr S.FreeMemA + pla + jsr S.FreeMemA + + >LDYAI MSG.INIT6 + jsr S.SysScrPPSTR + + jsr S.PrintSysEnv + +.99 rts +*-------------------------------------- +S.KernelRun jsr S.TskMgrRun + bcs .98 + + jsr S.SysScrCPULoad + jsr S.GetEvent + bcs S.KernelRun CS=no event + + jsr S.DispatchEvent + bcc S.KernelRun CC=Event Dispatched + + lda (EVTMGR.EVTPTR) + and #S.EVT.F.TIMER Discard any TIMER event + beq .1 + jsr S.DestroyEvent + bra S.KernelRun + +.1 lda (EVTMGR.EVTPTR) + and #S.EVT.F.KEY any special key? + beq .99 + + ldy #S.EVT.DATAHI Open-Apple? + lda (EVTMGR.EVTPTR),y + bpl .99 + + ldy #S.EVT.DATALO + lda (EVTMGR.EVTPTR),y + + cmp #$31 + bne .2 + lda #A2osX.SCREENS.S + jsr S.ScreenSelectA + bra .8 + +.2 cmp #$32 + bne .3 + lda #A2osX.SCREENS.C + jsr S.ScreenSelectA + bra .8 + +.3 cmp #$33 + 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 + 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.DestroyEvent + jmp S.KernelRun +*-------------------------------------- +S.KernelQuit clc + rts +*-------------------------------------- +* PUBLIC +*-------------------------------------- +* S.ScreenSelectA +* IN : +* A = Screen to display +*-------------------------------------- +S.ScreenSelectA and A2osX.SCREENS Screen is available ? + beq .9 ...not setup up + + cmp #A2osX.SCREENS.S + bne .1 + sta SETTEXT + sta SET80DISP + sta CLR80STORE + sta SETPAGE2 + sta SETALTCHAR + lda #A2osX.SCREENS.S + bra .8 + +.1 cmp #A2osX.SCREENS.C + bne .2 + sta SETTEXT + sta SET80DISP + sta SET80STORE + sta CLRPAGE2 + sta SETALTCHAR + lda #A2osX.SCREENS.C + bra .8 + +.2 cmp #A2osX.SCREENS.G + bne .9 + sta CLRMIXED + sta SETHIRES + sta CLRTEXT + sta SETIOUDIS + + sta CLR80DISP + sta SETDHIRES + sta CLRDHIRES + sta SETDHIRES + sta CLRDHIRES + + sta SET80DISP + sta SETDHIRES + sta CLRDHIRES + sta SETDHIRES + + lda #A2osX.SCREENS.G + +.8 sta A2osX.ACTIVESCRN +.9 rts +*-------------------------------------- +* S.ExecFileA (R) +* 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 + txa + >STAL 0 hMem of Loaded File + jsr S.GetMemPtrA + >STYAL 2 +.1 stz TmpBuffer256 +.2 >LDYAL 2 + >STYA ZPQuickPtr1 + >INCLW 2 + >DECLW 4 + lda (ZPQuickPtr1) + cmp #$0D + beq .3 + inc TmpBuffer256 + ldx TmpBuffer256 + sta TmpBuffer256,x + >LDAL 4 + bne .2 + >LDAL 5 + bne .2 +.3 lda TmpBuffer256 + beq .4 + lda TmpBuffer256+1 + cmp #'*' + beq .4 + lda #'-' + jsr S.SysScrCOUTA + lda #'>' + jsr S.SysScrCOUTA + >LDYAI TmpBuffer256 + jsr S.SysScrPPSTR + >PUSHWI TmpBuffer256 + jsr S.NewPStr + 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 + clc + rts +.99 >LDAL 0 + jsr S.FreeMemA + >REMLOCAL 8 + sec + rts +*-------------------------------------- +S.ExecCmdLineA >PUSHA + >PUSHBI $20 Push SEP=' ' + >PUSHBI 0 Push Token IDX + jsr S.PStrGetTkn + bcs .99 + >STAL 6 + pha + txa + >STAL 7 + pla + jsr S.GetMemPtrA + >PUSHYA + >PUSHWI EXECCMDS + jsr S.GetPStrIndex + bcs .98 + asl + tax + >LDAL 7 + jsr S.ExecCmdLine + bcs .98 + jsr .98 + clc + rts +.98 pha + >LDAL 7 + jsr S.FreeMemA + >LDAL 6 + jsr S.FreeMemA + pla +.99 sec + rts +*-------------------------------------- +S.ExecCmdLine jmp (.1,x) +.1 .DA S.SetSysEnvA + .DA S.LoadDrvA VCPU!!!! + .DA S.CreateProcessA VCPU!!!! +*-------------------------------------- +S.SetSysEnvA >PUSHA Push Cmd Line + >PUSHBI $3D Push SEP='=' + >PUSHBI 0 Push Token IDX + jsr S.PStrGetTkn + bcs * + phx save X,A for discard + pha + pha + txa + >PUSHA + pla + >PUSHA + ldy #S.PS.hENV + lda TSKMGR.TABLE,y + >PUSHA + jsr S.SetEnvVarH + + pla disard NAME + jsr S.FreeMemA + pla discard VALUE + jmp S.FreeMemA +*-------------------------------------- +S.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 +*-------------------------------------- +EXECCMDS >PSTRING "SET" +EXECCMDS1 >PSTRING "LOAD" +EXECCMDS2 >PSTRING "EXEC" + .DA #0 +*-------------------------------------- +MSG.INIT0 >PSTRING "\nKernel Startup...\n" +MSG.INIT1 >PSTRING "->MemMgr Init" +MSG.INIT2 >PSTRING "->TskMgr Init" +MSG.INIT3 >PSTRING "->DevMgr Init" +MSG.INIT4 >PSTRING "->EvtMgr Init" +MSG.INIT5 >PSTRING "EXEC A2osX.Startup...\n" +MSG.INIT6 >PSTRING "SYS ENV:\n" +MSG.EVNTPANIC >PSTRING "\nEVT:F/hDev/DATA/W1/W2=" +MSG.KRNLPANIC >PSTRING "\n\n!!!Kernel Panic!!!" +*-------------------------------------- +STARTUP.FILE >PSTRING "A2osX.STARTUP" +*-------------------------------------- +ENV.A2osX >PSTRING "A2OSX" +ENV.PATH >PSTRING "PATH" +ENV.DRV >PSTRING "DRV" +ENV.ETC >PSTRING "ETC" +ENV.LIB >PSTRING "LIB" +*-------------------------------------- + .INB SYS/KERNEL.S.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.TSK +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S +ASM