From c04970fa557fe7c4c42ae597f24b245ca7774423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sat, 14 Mar 2015 22:48:35 +0100 Subject: [PATCH] Another Bunch of fixes --- A2osX.S.GP.txt | 373 +++++----- A2osX.S.QC.txt | 212 ++++++ A2osX.S.RW.txt | 1193 +++++++++++++++--------------- A2osX.S.Z80.txt | 110 +-- A2osX.S.txt | 936 ++++++++++-------------- A2osX.STARTUP.txt | 44 +- DRV/CONSOLE.DRV.S.txt | 664 ++++++++--------- DRV/DHGR.DRV.S.txt | 966 ++++++++++++------------- DRV/PPIC.DRV.S.txt | 216 +++--- DRV/SSC.DRV.S.txt | 224 +++--- DRV/UTHERNET.DRV.S.txt | 868 +++++++++++----------- ETC/TCPIP.CONF | 28 +- INC/A2osX.I.txt | 650 ++++++++--------- INC/IO.I.txt | 201 +++--- INC/KERNEL.I.txt | 120 +-- INC/LIBSTR.I.txt | 46 +- INC/LIBTCPIP.I.txt | 442 ++++++------ INC/MACROS.I.txt | 902 +++++++++++------------ INC/MONITOR.I.txt | 190 ++--- INC/PRODOS.I.txt | 262 +++---- INC/ZP.I.txt | 60 +- LIB/LIBCRYPT.I.txt | 58 +- LIB/LIBCRYPT.S.txt | 1022 +++++++++++++------------- LIB/LIBSTR.S.txt | 1566 ++++++++++++++++++++-------------------- LIB/LIBTCPIP.S.ARP.txt | 532 +++++++------- LIB/LIBTCPIP.S.DNS.txt | 628 ++++++++-------- LIB/LIBTCPIP.S.txt | 964 ++++++++++++------------- SBIN/DHCPCLNT.S.txt | 1004 +++++++++++++------------- SBIN/GETTY.S.txt | 608 ++++++++-------- SBIN/SHELL.S.txt | 1136 ++++++++++++++--------------- SBIN/TCPIP.S.txt | 898 +++++++++++------------ SBIN/TELNETD.S.txt | 98 +-- SYS/KERNEL.S.BIN.txt | 822 ++++++++++----------- SYS/KERNEL.S.DEV.txt | 496 ++++++------- SYS/KERNEL.S.ENV.txt | 770 ++++++++++---------- SYS/KERNEL.S.EVT.txt | 360 ++++----- SYS/KERNEL.S.FS.txt | 1112 ++++++++++++++-------------- SYS/KERNEL.S.MEM.txt | 926 ++++++++++++------------ SYS/KERNEL.S.MLI.txt | 302 ++++---- SYS/KERNEL.S.NET.txt | 308 ++++---- SYS/KERNEL.S.RDR.txt | 302 ++++---- SYS/KERNEL.S.SCR.txt | 618 ++++++++-------- SYS/KERNEL.S.STR.txt | 768 ++++++++++---------- SYS/KERNEL.S.TSK.txt | 1088 ++++++++++++++-------------- SYS/KERNEL.S.txt | 1040 +++++++++++++------------- SYS/KM.AECLK.S.txt | 0 SYS/KM.NSC.S.txt | 1 - SYS/KM.RAMWORKS.S.txt | 639 ++++++++++++++++ SYS/KM.SATURN.S.txt | 0 49 files changed, 13760 insertions(+), 13013 deletions(-) create mode 100644 A2osX.S.QC.txt create mode 100644 SYS/KM.AECLK.S.txt create mode 100644 SYS/KM.RAMWORKS.S.txt create mode 100644 SYS/KM.SATURN.S.txt diff --git a/A2osX.S.GP.txt b/A2osX.S.GP.txt index 7281869c..0a75ff6a 100644 --- a/A2osX.S.GP.txt +++ b/A2osX.S.GP.txt @@ -1,185 +1,188 @@ -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 +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* **** START OF A2osX Global Page **** +*-------------------------------------- +A2osX.GP.B.start + .PH $BE00 +*-------------------------------------- +A2osX.GP.Start bra A2osX.SYSCALL1 + bra A2osX.MLICALL1 + bra A2osX.LIBCALL1 + bra A2osX.SLEEP1 + bra Kernel.MLICALL1 + bra Kernel.DRVCALL1 + bra Kernel.BINCALL1 + bra Kernel.LIBCALL1 + .BS A2osX.GPCODE-* +*-------------------------------------- +* A2osX.SYSCALL (MAINLC to AUXLC) +* In: +* X = SYSfnc.Index +* Y,A = free for Inline param +*-------------------------------------- +A2osX.SYSCALL1 jsr GO.AUXLC + jsr $E003 + jsr GO.MAINLC + rts +*-------------------------------------- +* A2osX.MLICALL (MAINLC to MAINLC) +* In: +* X = MLI Function +* A = Param Count +*-------------------------------------- +A2osX.MLICALL1 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.LIBCALL1 pha + phx + tya + >SYSCALL SYS.GetMemPtrA + >STYA .1+1 + plx + pla +.1 jmp $FFFF +*-------------------------------------- +A2osX.SLEEP1 jmp A2osX.SLEEP2 +*-------------------------------------- +* SLEEP (MAINLC to AUXLC) +* In: +*-------------------------------------- +* Kernel.MLICALL (AUXLC to MAINLC) +* In: +* X = MLI Function +* A = Param Count +*-------------------------------------- +Kernel.MLICALL1 jsr GO.MAINLC + jsr A2osX.MLICALL1 + jsr GO.AUXLC + rts +*-------------------------------------- +* Kernel.DRVCALL (AUXLC to MAINLC) +* In: +* X = DRV Function Index +* Y,A = pDevContext +*-------------------------------------- +Kernel.DRVCALL1 jsr GO.MAINLC + >STYA pDevContext + jsr GO.Kernel + jsr GO.AUXLC + rts +*-------------------------------------- +* Kernel.BINCALL (AUXLC to MAINLC) +* In: +* X = BIN Function Index +* Y,A = pPsContext +*-------------------------------------- +Kernel.BINCALL1 jsr GO.MAINLC + >STYA pPsContext + jsr GO.Kernel + jsr GO.AUXLC + rts +*-------------------------------------- +* Kernel.LIBCALL (AUXLC to MAINLC) +* In: +* X = Lib Function Index +*-------------------------------------- +Kernel.LIBCALL1 jsr GO.MAINLC + jsr GO.Kernel + jsr GO.AUXLC + rts +*-------------------------------------- +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 + bcs GO.AUXLC1 + +GO.MAINLC1 tsx + stx A2osX.SaveSX + stx CLRALTZP + ldx RROMBNK2 + ldx A2osX.SaveSM + txs + sty R.SP + bra GO.EXIT +*-------------------------------------- +GO.AUXLC1 tsx + stx A2osX.SaveSM + stx SETALTZP + ldx RRAMWRAMBNK1 + ldx RRAMWRAMBNK1 + ldx A2osX.SaveSX + 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 +*-------------------------------------- +GO.Reset jsr GO.AUXLC + jsr $E000 +*-------------------------------------- +GO.Kernel jmp (Kernel.JMP) +*-------------------------------------- +A2osX.SLEEP2 ldy #S.PS.hCS + lda (pPsContext),y + >SYSCALL SYS.GetMemPtrA + >STYA Kernel.JMP + ldy #S.PS.PC + pla get PC LO + plx get PC HI + inc Advance PC one Byte + bne .1 + inx + +.1 sec + sbc Kernel.JMP + sta (pPsContext),y + iny + txa + sbc Kernel.JMP+1 + sta (pPsContext),y + clc No error, + rts back to Kernel +*-------------------------------------- +A2osX.GP.End .EQ * +A2osX.GP.SIZE .EQ A2osX.GP.END-A2osX.GP.START + .BS A2osX.GP.START+$100-* + .EP +*-------------------------------------- +MAN +SAVE A2OSX.S.GP +LOAD A2OSX.S +ASM diff --git a/A2osX.S.QC.txt b/A2osX.S.QC.txt new file mode 100644 index 00000000..563f5e38 --- /dev/null +++ b/A2osX.S.QC.txt @@ -0,0 +1,212 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +* ****** START OF MLI QUIT CODE ****** +* Load Address :$1000-$11FF +* setup $BE00 Global page : +* Copy from $1200 to $BE00 +*-------------------------------------- +MLIOPEN01.PATH .EQ $200 +MLIOPEN01.BUFF .EQ $0C00 1k Buffer for MLI open +MLIREAD01.ADDR .EQ $2000 for loading kernel.bin before moving to LC1 +*-------------------------------------- +A2osX.QC.B.Start + .PH $1000 +*-------------------------------------- +A2osX.QC.Start .EQ * +A2osX.QC cld + jmp A2osX.QC.init +A2osX.QC.Prefix .BS 32 +*-------------------------------------- +A2osX.QC.init bit RROMBNK1 + >LDYAI A2osX.QC + >STYA POWERUP + jsr SETPWRC + + ldx #$17 +.1 stz MEMTABL,x Reset ProDOS memory bitmap + dex + bpl .1 + lda #$CF protect zero page, stack and page 1 + sta MEMTABL + lda #$03 + sta MEMTABL+$17 protect ProDOS & A2osX global page + + lda #$8C Reset 80 col screen ($0C=FF=HOME) + jsr $C300 + + >LDAXI MSG.STAGE1 + jsr A2osX.QC.PrintAX + + ldx #0 +.2 lda $1200,x Setup Global Page + sta $BE00,x + inx + bne .2 + +.3 jsr MLI + .DA #MLISETPREFIX + .DA MLISETPREFIX01 + bcc .4 + >LDAXI MSG.SETPREFIXKO + jsr A2osX.QC.PrintAX + >LDAXI A2osX.QC.Prefix + jsr A2osX.QC.PrintAX + >DEBUG + bra .3 + +.4 >LDAXI MSG.SETPREFIXOK + jsr A2osX.QC.PrintAX + + >LDAXI MSG.KLOADING + jsr A2osX.QC.PrintAX + + jsr A2osX.QC.KLoad + bcs .9 + + >LDAXI MSG.KLOADING.OK + jsr A2osX.QC.PrintAX + + >LDYAI GO.Reset + >STYA POWERUP + jsr SETPWRC + + php + pla + sei + tsx + stx A2osX.SaveSM + stx SETALTZP + ldx A2osX.SaveSX + txs + bit RRAMWRAMBNK1 + bit RRAMWRAMBNK1 + pha + plp + jmp $E000 +.9 >LDAXI MSG.KLOADING.KO + jsr A2osX.QC.PrintAX + bra * +*-------------------------------------- +A2osX.QC.KLoad ldx A2osX.QC.Prefix +.1 lda A2osX.QC.Prefix,x + sta MLIOPEN01.PATH,x + dex + bne .1 + + ldx A2osX.QC.Prefix + ldy #0 +.2 lda SYSKERNEL+1,y + sta MLIOPEN01.PATH+1,x + inx + iny + cpy SYSKERNEL + bne .2 + stx MLIOPEN01.PATH + + >LDAXI MLIOPEN01.PATH + jsr A2osX.QC.PrintAX + + 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 MLIREAD01.ADDR+$1F00 + >STYA TmpPtr1 + >LDYAI $E000+$1F00 + >STYA TmpPtr2 + ldx #$20 + 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 + dex + bne .3 + + lda RROMBNK1 + sta CLRALTZP + plp + clc +.9 rts +*-------------------------------------- +A2osX.QC.PrintAX + >STAX TmpPtr1 + lda (TmpPtr1) + tax + beq .9 + ldy #1 + +.1 lda (TmpPtr1),y + ora #$80 + jsr COUT + iny + dex + bne .1 + +.9 jsr CROUT + rts +*-------------------------------------- +MLISETPREFIX01 .DA #1 + .DA A2osX.QC.Prefix +MLIOPEN01 .DA #3 + .DA MLIOPEN01.PATH + .DA MLIOPEN01.BUFF + .BS 1 +MLIREAD01 .DA #4 + .BS 1 + .DA MLIREAD01.ADDR + .DA $1FFA + .BS 2 +MLICLOSE01 .DA #1 + .BS 1 +*-------------------------------------- +SYSKERNEL >PSTRING "SYS/KERNEL" +*-------------------------------------- +MSG.STAGE1 >PSTRING "A2osX[Stage1]:Init" +MSG.SETPREFIXOK >PSTRING "Set Prefix OK" +MSG.SETPREFIXKO >PSTRING "Insert Vol:" +MSG.KLOADING >PSTRING "Loading Kernel..." +MSG.KLOADING.OK >PSTRING "OK" +MSG.KLOADING.KO >PSTRING "Error While Loading Kernel." +MSG.STAGE1OK >PSTRING "A2osX[Stage1]:Complete." +*-------------------------------------- +A2osX.QC.END .EQ * +A2osX.QC.SIZE .EQ A2osX.QC.END-A2osX.QC.START + .BS $200-A2osX.QC.SIZE + .EP +*-------------------------------------- +MAN +SAVE A2OSX.S.QC +LOAD A2OSX.S +ASM diff --git a/A2osX.S.RW.txt b/A2osX.S.RW.txt index f7c9eac2..27cba6fe 100644 --- a/A2osX.S.RW.txt +++ b/A2osX.S.RW.txt @@ -1,571 +1,622 @@ -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 +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 +*-------------------------------------- +RWBankSelect .EQ $C073 +*-------------------------------------- +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 +*-------------------------------------- +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 +*-------------------------------------- +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" +*-------------------------------------- +* 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 index e7794f7a..14b9d07e 100644 --- a/A2osX.S.Z80.txt +++ b/A2osX.S.Z80.txt @@ -1,55 +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 +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 index af1e8c3c..e1f0b521 100644 --- a/A2osX.S.txt +++ b/A2osX.S.txt @@ -1,539 +1,397 @@ -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/ -* Move Global Page From $300 to $BE00 -*-------------------------------------- -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 +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 +*-------------------------------------- +* A2osX LOADER +*-------------------------------------- +A2osX.INIT php + pla + sei + ldx #$FF init 6502 stack to highest + txs + stx A2osX.SaveSM + pha + plp + +* php EDIT:Already Set By ProDOS +* sei +* sta SETALTZP Switch to alt ZP +* stx A2osX.SaveSX make Alt SP to highest too +* sta CLRALTZP Switch to main ZP +* plp + + jsr HOME + >LDAXI MSG.STAGE0 + jsr PrintCStrAX + + >LDYAI D.STACKSEG + >STYA R.SP init Soft Stack + + >LDAXI MSG.SYSMEM + jsr PrintCStrAX + + lda MACHID + and #MACHIDRAM + cmp #MACHIDRAM128 + beq .1 + + >LDAXI MSG.SYSMEM.KO + jsr PrintCStrAX + bra * + +.1 >LDAXI MSG.SYSMEM.OK + jsr PrintCStrAX + + >LDAXI MSG.CPU + jsr PrintCStrAX + jsr Init6502 + ldy A2osX.CPUTYPE + lda MSG.CPUTYPEH,y + tax + lda MSG.CPUTYPEL,y + jsr PrintCStrAX + + lda A2osX.CPUTYPE + bne A2osX.Prefix + >LDAXI MSG.CPU.KO + jsr PrintCStrAX + bra * +*-------------------------------------- +A2osX.Prefix >LDAXI MSG.BOOTPREFIX + jsr PrintCStrAX + jsr MLI + .DA #MLIGETPREFIX + .DA MLIGETPREFIX01 + bcs * + ldx Boot.Prefix + stx A2osX.QC.B.Start+4 + ldy #1 +.1 lda Boot.Prefix,y + sta A2osX.QC.B.Start+4,y + ora #$80 + jsr COUT + iny + dex + bne .1 + jsr CROUT +*-------------------------------------- +A2osX.RamDrv >LDAXI MSG.RAMDRV + jsr PrintCStrAX + jsr DisableRamDRV + bcc .2 + tax + beq .1 + >LDAXI MSG.RAMDRV.KO1 + jsr PrintCStrAX + bra A2osX.Z80 + +.1 >LDAXI MSG.RAMDRV.KO0 + jsr PrintCStrAX + bra A2osX.Z80 +.2 >LDAXI MSG.RAMDRV.OK + jsr PrintCStrAX +*-------------------------------------- +A2osX.Z80 >LDAXI MSG.Z80 + jsr PrintCStrAX + jsr InitZ80 + bcs .1 + pha Push Z80Slot + + >LDAXI MSG.Z80.OK + jsr PrintCStrAX + bra A2osX.MLIQuit + +.1 >LDAXI MSG.Z80.KO + jsr PrintCStrAX +*-------------------------------------- +A2osX.MLIQuit >LDAXI MSG.STAGE0OK + jsr PrintCStrAX + + jsr SetupQuitCode + + >DEBUG + + jsr MLI + .DA #MLIQUIT + .DA MLIQUIT01 + 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 +*-------------------------------------- +SetupQuitCode lda RRAMWRAMBNK2 + lda RRAMWRAMBNK2 + + ldx #0 +.1 lda A2osX.QC.B.Start,x + sta $D100,x + lda A2osX.QC.B.Start+$100,x + sta $D200,x + lda A2osX.GP.B.start,x + sta $D300,x + inx + bne .1 + + lda RROMBNK1 + rts +*-------------------------------------- +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.STAGE0 >CSTRING "A2osX[Stage0]:Init\n" +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.CPU >CSTRING "Checking CPU..." +MSG.CPU.KO >CSTRING "A2osX Requires At Least A 65C02 CPU.\n" +MSG.BOOTPREFIX >CSTRING "Boot Prefix:" +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.Z80 >CSTRING "Detecting Z80 CPU..." +MSG.Z80.OK >CSTRING "Detected In Slot %d.\n" +MSG.Z80.KO >CSTRING "Not Detected.\n" +MSG.STAGE0OK >CSTRING "A2osX[Stage0]:Complete.\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" +*-------------------------------------- +MLIGETPREFIX01 .DA #1 + .DA Boot.Prefix +MLIQUIT01 .DA #4 + .DA #0 + .DA 0 + .DA #0 + .DA 0 +*-------------------------------------- +Boot.Prefix .BS MLI.MAXPATH +*-------------------------------------- +HEX .BS 2 +BCD .BS 3 +bFlag .BS 1 +*-------------------------------------- + .INB A2OSX.S.Z80 + .INB A2OSX.S.QC + .INB A2OSX.S.GP +*-------------------------------------- +MAN +SAVE A2OSX.S +ASM diff --git a/A2osX.STARTUP.txt b/A2osX.STARTUP.txt index 2e597eca..156a4275 100644 --- a/A2osX.STARTUP.txt +++ b/A2osX.STARTUP.txt @@ -1,22 +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 +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/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt index b918163f..4a125354 100644 --- a/DRV/CONSOLE.DRV.S.txt +++ b/DRV/CONSOLE.DRV.S.txt @@ -1,332 +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 +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 index 0e66fe10..e472dcf5 100644 --- a/DRV/DHGR.DRV.S.txt +++ b/DRV/DHGR.DRV.S.txt @@ -1,483 +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 +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 index efea7967..531f716a 100644 --- a/DRV/PPIC.DRV.S.txt +++ b/DRV/PPIC.DRV.S.txt @@ -1,108 +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 +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 index 6cb621d8..cf007a0e 100644 --- a/DRV/SSC.DRV.S.txt +++ b/DRV/SSC.DRV.S.txt @@ -1,112 +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 +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 index 5d0f2900..f9c8895b 100644 --- a/DRV/UTHERNET.DRV.S.txt +++ b/DRV/UTHERNET.DRV.S.txt @@ -1,434 +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 +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 index 99c93811..ec80ac68 100644 --- a/ETC/TCPIP.CONF +++ b/ETC/TCPIP.CONF @@ -1,14 +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 +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 index a6cf4411..57023e64 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -1,324 +1,326 @@ -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 +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.SaveSM .EQ $100 Main +A2osX.SaveSX .EQ $101 Aux +*-------------------------------------- +* Main $200 -> 2FF : (Reserved, ProDOS,Clock DRV....) +* Main $300 -> 3EF : +* Main $3F0 -> 3FF : ProDOS Vectors +* Aux $200 -> 3FD : /RAM Driver +* Aux $3FE -> 3FF : RESET Vector +*-------------------------------------- +* 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) + +*-------------------------------------- +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 +*-------------------------------------- +* A2osX GLOBAL PAGE +* $BE00->$BE0F : Public JMP +*-------------------------------------- +A2osX.SYSCALL .EQ $BE00 +A2osX.MLICALL .EQ $BE02 +A2osX.LIBCALL .EQ $BE04 +A2osX.SLEEP .EQ $BE06 +Kernel.MLICALL .EQ $BE08 +Kernel.DRVCALL .EQ $BE0A +Kernel.BINCALL .EQ $BE0C +Kernel.LIBCALL .EQ $BE0E +*-------------------------------------- +A2osX.SCREENS .EQ $BE10 +A2osX.SCREENS.G .EQ %00000100 +A2osX.SCREENS.C .EQ %00000010 +A2osX.SCREENS.S .EQ %00000001 +A2osX.ACTIVESCRN .EQ $BE11 + +A2osX.TIMER16 .EQ $BE12 +A2osX.RANDOM16 .EQ $BE14 + +A2osX.CPUTYPE .EQ $BE16 +A2osX.Z80SLOT .EQ $BE17 + +Kernel.JMP .EQ $BE1A +A2osX.SaveA .EQ $BE1C +A2osX.SaveX .EQ $BE1D +A2osX.SaveY .EQ $BE1E +A2osX.GPCODE .EQ $BE20 +*-------------------------------------- +* 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 index e3d2e6af..c051511c 100644 --- a/INC/IO.I.txt +++ b/INC/IO.I.txt @@ -1,103 +1,98 @@ -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 +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* Screen Holes +*-------------------------------------- +OURCH .EQ $57B +OURCV .EQ $5FB +*-------------------------------------- +* Software Switches +*-------------------------------------- +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 +MAN +SAVE INC/IO.I diff --git a/INC/KERNEL.I.txt b/INC/KERNEL.I.txt index 0bbb9e64..5184670f 100644 --- a/INC/KERNEL.I.txt +++ b/INC/KERNEL.I.txt @@ -1,60 +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 +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 index 75ba0467..7fa2418c 100644 --- a/INC/LIBSTR.I.txt +++ b/INC/LIBSTR.I.txt @@ -1,23 +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 - +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 index 50f83080..bef04373 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -1,221 +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 - +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 index 85aae937..74844b6b 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -1,451 +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 +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 index 27a589e8..3b2717c2 100644 --- a/INC/MONITOR.I.txt +++ b/INC/MONITOR.I.txt @@ -1,95 +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 +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 index 795d97d4..cde203f2 100644 --- a/INC/PRODOS.I.txt +++ b/INC/PRODOS.I.txt @@ -1,131 +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 +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 index 2161851a..f0d971d6 100644 --- a/INC/ZP.I.txt +++ b/INC/ZP.I.txt @@ -1,30 +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 +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 index 18022a55..fc4c6bdc 100644 --- a/LIB/LIBCRYPT.I.txt +++ b/LIB/LIBCRYPT.I.txt @@ -1,29 +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 - +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 index f255c4a5..2276538e 100644 --- a/LIB/LIBCRYPT.S.txt +++ b/LIB/LIBCRYPT.S.txt @@ -1,511 +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 +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 index 39c74547..c773f262 100644 --- a/LIB/LIBSTR.S.txt +++ b/LIB/LIBSTR.S.txt @@ -1,783 +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 +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 index 524d9272..fc30dc21 100644 --- a/LIB/LIBTCPIP.S.ARP.txt +++ b/LIB/LIBTCPIP.S.ARP.txt @@ -1,266 +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 +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 index 392751a7..57a4f449 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -1,314 +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 +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 index adae775a..dc9d281e 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -1,482 +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 +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 index b6685f9c..08f9521d 100644 --- a/SBIN/DHCPCLNT.S.txt +++ b/SBIN/DHCPCLNT.S.txt @@ -1,502 +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 +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 index a32b6db8..2ab90ac0 100644 --- a/SBIN/GETTY.S.txt +++ b/SBIN/GETTY.S.txt @@ -1,304 +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 +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 index 2c305857..dcf29ab2 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -1,568 +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 +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 index cd66b38e..eb53cc20 100644 --- a/SBIN/TCPIP.S.txt +++ b/SBIN/TCPIP.S.txt @@ -1,449 +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 +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 index ef52ec7a..a00dc8b1 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -1,49 +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 +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 index 0a34a8fd..9043e4dc 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -1,411 +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 +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 index e685de94..678730f3 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -1,248 +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 +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 index dea021cb..1630e2c9 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -1,385 +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 +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 index ba31fb5d..e117b4db 100644 --- a/SYS/KERNEL.S.EVT.txt +++ b/SYS/KERNEL.S.EVT.txt @@ -1,180 +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 +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 index 1faf416f..a4161b3f 100644 --- a/SYS/KERNEL.S.FS.txt +++ b/SYS/KERNEL.S.FS.txt @@ -1,556 +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 +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.MEM.txt b/SYS/KERNEL.S.MEM.txt index c7f5f369..80be4712 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -1,474 +1,452 @@ -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 +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 stz MEMMGR.MHLIMIT + stz MEMMGR.HIMEM + + ldx /MLI + dex Reserve $BE00 For Global Page + stx MEMMGR.MHLIMIT+1 + stx MEMMGR.HIMEM+1 + + >LDYAI A2osX.LOMEM + >STYA MEMMGR.MLLIMIT + >STYA MEMMGR.LOMEM + stz MEMMGR.TABLESIZE Init Table Size to 0 +* jsr S.UpdateMemStats Not needed, will be called by S.GetMem + >PUSHWI 256 get a 256 bytes buffer for Map Table, hMem=0 + >PUSHBI 0 + jsr S.GetMem create it... + 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 index 5f5a85cb..d1ff89ab 100644 --- a/SYS/KERNEL.S.MLI.txt +++ b/SYS/KERNEL.S.MLI.txt @@ -1,151 +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 +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 index 4aae2aa8..e41bc761 100644 --- a/SYS/KERNEL.S.NET.txt +++ b/SYS/KERNEL.S.NET.txt @@ -1,154 +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 +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 index 684b9638..f4d4f4f0 100644 --- a/SYS/KERNEL.S.RDR.txt +++ b/SYS/KERNEL.S.RDR.txt @@ -1,151 +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 +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 index baf83d58..5ee29c39 100644 --- a/SYS/KERNEL.S.SCR.txt +++ b/SYS/KERNEL.S.SCR.txt @@ -1,283 +1,335 @@ -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 +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 +*-------------------------------------- +* 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 CLRTEXT + sta CLRMIXED + sta SETHIRES + sta CLRPAGE2 + + 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 +*-------------------------------------- +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 index 7638832e..bda7e89f 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -1,384 +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 +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 index e345d316..e9c69a3c 100644 --- a/SYS/KERNEL.S.TSK.txt +++ b/SYS/KERNEL.S.TSK.txt @@ -1,544 +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 +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 index 30351d09..79d2d676 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -1,541 +1,499 @@ -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 +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.Start 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.Init + jsr S.SysScrPPSTR + + >LDYAI MSG.Init.MemMgr + jsr S.SysScrPPSTR + jsr S.MemMgrInit + jsr S.SysScrPRCode + bcs .1 + + >LDYAI MSG.Init.TskMgr + jsr S.SysScrPPSTR + jsr S.TskMgrInit + jsr S.SysScrPRCode +.1 bcs .2 + + >LDYAI MSG.Init.DevMgr + jsr S.SysScrPPSTR + jsr S.DevMgrInit + jsr S.SysScrPRCode +.2 bcs .3 + + >LDYAI MSG.Init.EvtMgr + jsr S.SysScrPPSTR + jsr S.EvtMgrInit + jsr S.SysScrPRCode +.3 bcs .99 + + >LDYAI MSG.Init.Startup + 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 + jsr S.SysScrPRCode + + pla + jsr S.FreeMemA + pla + jsr S.FreeMemA + pla + jsr S.FreeMemA + + >LDYAI MSG.Init.SysEnv + 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.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.Init >PSTRING "A2osX[Stage2]:Init\n" +MSG.Init.MemMgr >PSTRING "->MemMgr Init" +MSG.Init.TskMgr >PSTRING "->TskMgr Init" +MSG.Init.DevMgr >PSTRING "->DevMgr Init" +MSG.Init.EvtMgr >PSTRING "->EvtMgr Init" +MSG.Init.Startup >PSTRING "EXEC A2osX.Startup...\n" +MSG.Init.SysEnv >PSTRING "SYS ENV:\n" +MSG.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 +*-------------------------------------- +KERNEL.End .EQ * +Kernel.Size .EQ KERNEL.End-KERNEL.Start +*-------------------------------------- + .DO Kernel.Size>$1FFA + ERROR:KERNEL.SIZE too big + .FIN +*-------------------------------------- +MAN +SAVE SYS/KERNEL.S +ASM diff --git a/SYS/KM.AECLK.S.txt b/SYS/KM.AECLK.S.txt new file mode 100644 index 00000000..e69de29b diff --git a/SYS/KM.NSC.S.txt b/SYS/KM.NSC.S.txt index 7e619a30..f279ed5d 100644 --- a/SYS/KM.NSC.S.txt +++ b/SYS/KM.NSC.S.txt @@ -9,7 +9,6 @@ AUTO 6 .TF SYS/KM.NSC *-------------------------------------- .INB INC/MACROS.I - .INB INC/A2OSX.I .INB INC/IO.I .INB INC/MONITOR.I .INB INC/PRODOS.I diff --git a/SYS/KM.RAMWORKS.S.txt b/SYS/KM.RAMWORKS.S.txt new file mode 100644 index 00000000..6db2365f --- /dev/null +++ b/SYS/KM.RAMWORKS.S.txt @@ -0,0 +1,639 @@ +PR#3 +PREFIX /DATA/A2OSX +NEW +INC 1 +AUTO 6 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF SYS/KM.RAMWORKS +*-------------------------------------- + .INB INC/MACROS.I + .INB INC/IO.I + .INB INC/MONITOR.I + .INB INC/PRODOS.I +*-------------------------------------- +TmpPtr1 .EQ $0 +TmpPtr2 .EQ $2 +*-------------------------------------- +RWBankSelect .EQ $C073 +*-------------------------------------- +RW.Init >LDAXI RW.MSG + jsr RW.Print + + jsr RW.Detect1 + bcs .10 + + >LDAXI RW.MSG.OK + jsr RW.Print + + rts + +.10 jsr RW.Detect2 + bcc .1 + + >LDAXI RW.MSG.KO1 + jsr RW.Print + rts + +.1 jsr PRBYTE + >LDAXI RW.MSG.OK1 + jsr RW.Print + + jsr RW.Install + bcc .2 + + >LDAXI RW.MSG.KO2 + jsr RW.Print + rts + +.2 >LDAXI RW.MSG.OK2 + jsr RW.Print + + jsr RW.Format + bcc .3 + + >LDAXI RW.MSG.KO3 + jsr RW.Print + rts + +.3 >LDAXI RW.MSG.OK3 + jsr RW.Print + rts +*-------------------------------------- +RW.Detect1 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 +*-------------------------------------- +RW.Detect2 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 +*-------------------------------------- +RW.Install 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 +*-------------------------------------- +RW.Format 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 +*-------------------------------------- +RW.Print >STAX TmpPtr1 + ldy #0 + +.1 lda (TmpPtr1),y + beq .9 + ora #$80 + jsr COUT + iny + bne .1 +.9 jmp CROUT +*-------------------------------------- +RW.MSG >CSTRING "RAMWorks (I,II,III,z-Ram) Driver For A2osX." +RW.MSG.OK >CSTRING "/RAM31 Device Already Installed." +RW.MSG.OK1 >CSTRING " Pages Detected." +RW.MSG.KO1 >CSTRING "Not Detected." +RW.MSG.OK2 >CSTRING "RamWorks Driver Installed." +RW.MSG.KO2 >CSTRING "RamWorks Driver Install Error." +RW.MSG.OK3 >CSTRING "RamWorks Drive Formatted." +RW.MSG.KO3 >CSTRING "RamWorks Drive Format Error." +*-------------------------------------- +* Driver for Ramworks in main LC +* $FF00 -> $FF9A (Inclusive) +* $FF58 MUST BE $60 (RTS) +* DO NOT trash DRV.BLKNUM as ProDOS +* 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 SYS/KM.RAMWORKS.S +ASM diff --git a/SYS/KM.SATURN.S.txt b/SYS/KM.SATURN.S.txt new file mode 100644 index 00000000..e69de29b