From 402c85d065ff5c8a284a480b1d15fdcb95c1725c Mon Sep 17 00:00:00 2001 From: burniouf Date: Sun, 13 Mar 2022 13:58:15 +0100 Subject: [PATCH] KMs & PMs Cleanup #2 --- SYS/PM.APPLETALK.S.txt | 181 +++++++++ SYS/PM.NSC.S.txt | 323 +++++++++++++++ SYS/PM.RAMWORKS.S.txt | 796 +++++++++++++++++++++++++++++++++++++ SYS/PM.VEDRIVE.S.CF.txt | 379 ++++++++++++++++++ SYS/PM.VEDRIVE.S.GS.txt | 17 + SYS/PM.VEDRIVE.S.IP.txt | 529 +++++++++++++++++++++++++ SYS/PM.VEDRIVE.S.U1.txt | 245 ++++++++++++ SYS/PM.VEDRIVE.S.U2.txt | 431 ++++++++++++++++++++ SYS/PM.VEDRIVE.S.txt | 857 ++++++++++++++++++++++++++++++++++++++++ SYS/PM.VSDRIVE.S.txt | 622 +++++++++++++++++++++++++++++ 10 files changed, 4380 insertions(+) create mode 100644 SYS/PM.APPLETALK.S.txt create mode 100644 SYS/PM.NSC.S.txt create mode 100644 SYS/PM.RAMWORKS.S.txt create mode 100644 SYS/PM.VEDRIVE.S.CF.txt create mode 100644 SYS/PM.VEDRIVE.S.GS.txt create mode 100644 SYS/PM.VEDRIVE.S.IP.txt create mode 100644 SYS/PM.VEDRIVE.S.U1.txt create mode 100644 SYS/PM.VEDRIVE.S.U2.txt create mode 100644 SYS/PM.VEDRIVE.S.txt create mode 100644 SYS/PM.VSDRIVE.S.txt diff --git a/SYS/PM.APPLETALK.S.txt b/SYS/PM.APPLETALK.S.txt new file mode 100644 index 00000000..28d24cac --- /dev/null +++ b/SYS/PM.APPLETALK.S.txt @@ -0,0 +1,181 @@ +NEW + AUTO 3,1 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF sys/pm/pm.appletalk +*-------------------------------------- + .INB inc/macros.i + .INB inc/io.i + .INB inc/monitor.i + .INB inc/mli.i + .INB inc/appletalk.i +*-------------------------------------- +TmpPtr1 .EQ $0 +*-------------------------------------- +BUF.PREFIX .EQ $300 +*-------------------------------------- +AT.INIT >LDYAI MSG.INIT + jsr PrintFYA + + lda #$F9 + sta TmpPtr1 + lda #$C7 + sta TmpPtr1+1 + +.1 ldy #3 + +.2 lda (TmpPtr1),y + cmp SIG.ATLK,y + bne .3 + + dey + bpl .2 + + ldx #0 + + ldy #4 + lda (TmpPtr1),y + cmp #1 + beq .4 + + ldx #$80 + cmp #2 + beq .4 + + pha + >LDYAI MSG.FAILED + jsr PrintFYA + rts + +.3 dec TmpPtr1+1 + lda TmpPtr1+1 + cmp #$C0 + bne .1 + + >LDYAI MSG.NOHW + jsr PrintFYA + rts + +.4 stx WC.Flag + tay + lda TmpPtr1+1 + and #$0f + pha Push slot # + phy Push Type # + >LDYAI MSG.HWOK + jsr PrintFYA + + >LDYA MLI+1 + >STYA GO.OLDMLI+1 + >STYA MLIATALK.PARAMS.OLDMLI + ldy #$14 + lda TmpPtr1+1 Cn + sta MLIALLOCIRQ.PARAMS.SLOT + >STYA GO.WSCARD+1 + bit WC.Flag + bmi .5 + >STYA MLI+1 + +.5 >LDYAI MSG.ATINIT + jsr PrintFYA + + jsr GO.WSCARD + .DA #MLIATALK + .DA MLIATALK.PARAMS + bcs .9 + + >LDYAI MSG.IRQ + jsr PrintFYA + + jsr MLI + .DA #MLIALLOCIRQ + .DA MLIALLOCIRQ.PARAMS + bcs .9 + + cli + >LDYAI MSG.PREFIX1 + jsr PrintFYA + + jsr GO.OLDMLI + .DA #MLIGETPREFIX + .DA MLIGETPREFIX.PARAMS + bcs .9 + + >LDYAI MSG.PREFIX2 + jsr PrintFYA + + jsr GO.WSCARD + .DA #MLISETPREFIX + .DA MLIGETPREFIX.PARAMS + bcs .9 + + jsr MLI + .DA #MLIATALK + .DA MLI.AT.FINaming + bcc .8 + + lda MLI.AT.FINaming+2 + pha + lda MLI.AT.FINaming+3 + pha + >LDYAI MSG.AFPKO + jsr PrintFYA + +.8 >LDYAI MSG.OK + jsr PrintFYA + rts + +.9 pha + >LDYAI MSG.KO + jsr PrintFYA + rts +*-------------------------------------- +GO.WSCARD jmp $ffff SELF MODIFIED +GO.OLDMLI jmp $ffff SELF MODIFIED +*-------------------------------------- + .INB usr/src/shared/x.printf.s +*-------------------------------------- +MSG.INIT .AZ "AppleTalk Driver For A2osX\n" +MSG.FAILED .AZ "AppleTalk Workstation Card Failed Power Up Diagnostics : EC=%h.\n" +MSG.NOHW .AZ "AppleTalk Workstation Card Not Found.\n" +MSG.HWOK .AZ "AppleTalk Workstation Card Type #%d Found In Slot #%d.\n" +MSG.ATINIT .AZ "Calling ATInit...\n" +MSG.IRQ .AZ "Setting Up IRQ Vector...\n" +MSG.PREFIX1 .AZ "Getting ProDOS Prefix...\n" +MSG.PREFIX2 .AZ "Setting AppleTalk Prefix...\n" +MSG.AFPKO .AZ "WARNING : Enabling AFP failed : EC=%h%h.\n" +MSG.OK .AZ "AppleTalk Driver Successfully Installed.\n" +MSG.KO .AZ "AppleTalk Driver Install Failed : EC=%h.\n" +*-------------------------------------- +SIG.ATLK .AS "ATLK" +WC.Flag .BS 1 +*-------------------------------------- +MLIATALK.PARAMS .DA #0 Sync + .DA #1 INIT + .BS 2 RC + .DA #$40 ??? from ATINIT disassembly +MLIATALK.PARAMS.OLDMLI + .BS 2 ??? from ATINIT disassembly + .BS 5 ??? from ATINIT disassembly +*-------------------------------------- +MLIALLOCIRQ.PARAMS + .DA #2 Param Count + .BS 1 Int Num returned + .DA #$19 Lo byte always $19 for WS Card +MLIALLOCIRQ.PARAMS.SLOT + .BS 1 hi byte : $Cn +*-------------------------------------- +MLIGETPREFIX.PARAMS + .DA #1 + .DA BUF.PREFIX +*-------------------------------------- +MLI.AT.FINaming .DA #0 Synchonous + .DA #AT.FINaming + .BS 2 Result Code + .DA #%11000000 set Bit 7 & 6 + .DA #%10000000 b7=1:Use AFP long Name, b6=0:Update ProDOS dev table +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.appletalk.s +ASM diff --git a/SYS/PM.NSC.S.txt b/SYS/PM.NSC.S.txt new file mode 100644 index 00000000..988f51ea --- /dev/null +++ b/SYS/PM.NSC.S.txt @@ -0,0 +1,323 @@ +NEW + AUTO 3,1 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF sys/pm/pm.nsc +*-------------------------------------- + .INB inc/macros.i + .INB inc/io.i + .INB inc/monitor.i + .INB inc/mli.i +*-------------------------------------- +NSC.IOBASE .EQ $C300 +*-------------------------------------- +TmpPtr1 .EQ $0 +TmpPtr2 .EQ $2 +offset .EQ $4 +*-------------------------------------- +NSC.Init >LDYAI NSC.MSG0 + jsr NSC.Print + lda MACHID + and #MACHID.CLK Clock already installed ? + beq .1 + + >LDYAI NSC.MSG1 + bra NSC.Print + +.1 jsr NSC.Detect + bcc .2 + + >LDYAI NSC.MSG2 + bra NSC.Print + +.2 jsr NSC.Install + lda #MACHID.CLK + tsb MACHID + + >LDYAI NSC.MSG3 +* jmp NSC.Print +*-------------------------------------- +NSC.Print sty TmpPtr1 + sta TmpPtr1+1 + ldy #0 + +.1 lda (TmpPtr1),y + beq .8 + + jsr COUT + iny + bne .1 + +.8 jmp CROUT +*-------------------------------------- +DS1216E.DATA1 .EQ $10 +DS1216E.DATA2 .EQ $18 +*-------------------------------------- +NSC.Detect php + sei + + lda RDCXROM + php + + sta SETCXROM + + sta NSC.IOBASE +* lda $C00B Workaround for Ultrawarp bug + + ldx #8 + +.1 ldy #8 + +.2 lda NSC.IOBASE+4 + lsr + ror DS1216E.DATA1-1,x + dey + bne .2 + + dex + bne .1 + + sta NSC.IOBASE +* lda $C00B Workaround for Ultrawarp bug + + lda NSC.IOBASE+4 Reset DS1216E comparison register with READ A2=1 + + ldy #8 Read 8 bytes... + +.3 lda DS1216E.PATTERN-1,x + phy + + ldy #8 ....of 8 bits + +.4 ldx #0 + lsr + bcc .5 + + inx + +.5 bit NSC.IOBASE,x Write Pattern bit in A0, with A2=0 + + dey + bne .4 + + ply + dey + bne .3 +*-------------------------------------- + ldx #8 + +.6 ldy #8 + +.7 lda NSC.IOBASE+4 + lsr + ror DS1216E.DATA2-1,x + dey + bne .7 + + dex + bne .6 + + plp + bmi .8 + + sta CLRCXROM + +.8 plp +*-------------------------------------- + ldx #8 + +.81 lda DS1216E.DATA1-1,x + cmp DS1216E.DATA2-1,x + bne .9 + + dex + bne .81 + +* sec from CMP + rts + +.9 clc + rts +*-------------------------------------- +NSC.Install lda DATETIME+1 + sta TmpPtr1 + sec + sbc #NSCDRV.B.START + sta offset + lda DATETIME+2 + sta TmpPtr1+1 + sbc /NSCDRV.B.START + sta offset+1 + + ldy #1 + ldx #0 + +.1 lda NSCDRV.RELOC,x + beq .2 + + sta TmpPtr2 + inx + lda NSCDRV.RELOC,x + sta TmpPtr2+1 + lda (TmpPtr2) + clc + adc offset + sta (TmpPtr2) + lda (TmpPtr2),y + adc offset+1 + sta (TmpPtr2),y + inx + bne .1 + +.2 lda RRAMWRAMBNK1 + lda RRAMWRAMBNK1 +.3 ldy #NSCDRV.SIZE-1 always < 128 + +.7 lda NSCDRV.B.START,y + sta (TmpPtr1),y + dey + bpl .7 + + lda RROMBNK1 + lda #$4C + sta DATETIME + rts +*-------------------------------------- +NSCDRV.RELOC .DA NSCDRV.R1+1 +* .DA NSCDRV.R2+1 +* .DA NSCDRV.R3+1 + .DA NSCDRV.R4+1 + .DA NSCDRV.R5+1 + .DA NSCDRV.R6+1 + .DA NSCDRV.R7+1 + .DA NSCDRV.R8+1 +* .DA NSCDRV.R9+1 + .DA #0 +*-------------------------------------- +NSC.MSG0 .AZ -"NSC 'No-Slot-Clock'/DS1216E Driver For A2osX" +NSC.MSG1 .AZ -"Clock Already Present!" +NSC.MSG2 .AZ -"No DS1216E Detected!" +NSC.MSG3 .AZ -"DS1216E Driver Successfully Installed." +*-------------------------------------- +* Driver For DS1216E +*-------------------------------------- +DS1216E.DATA .EQ $200 Reverted YY MM DD Day HH mm SS CS +*-------------------------------------- +NSCDRV.B.START .EQ * +NSCDRV php + sei + + lda RDCXROM + php + + sta SETCXROM + + sta NSC.IOBASE +* lda $C00B Workaround for Ultrawarp bug + + lda NSC.IOBASE+4 Reset DS1216E comparison register with READ A2=1 + + ldy #8 Read 8 bytes... + +NSCDRV.R1 lda DS1216E.PATTERN-1,y + phy + + ldy #8 ....of 8 bits + +NSCDRV.2 ldx #0 + lsr + bcc NSCDRV.3 + + inx + +NSCDRV.3 bit NSC.IOBASE,x Write Pattern bit in A0, with A2=0 + + dey + bne NSCDRV.2 + + ply + dey + bne NSCDRV.R1 + + ldx #8 + +NSCDRV.4 ldy #8 + +NSCDRV.5 pha + lda NSC.IOBASE+4 Read Byte... + + lsr + pla + ror + + dey + bne NSCDRV.5 + + pha + lsr + lsr + lsr + lsr + tay + pla + and #$0F + + clc + + .HS 2C Bit Absolute to skip adc #$0A + +NSCDRV.6 adc #$0A + dey + bpl NSCDRV.6 + +NSCDRV.R4 sta DS1216E.DATA-1,x + dex + bne NSCDRV.4 + + pha DS1216E.DATA + +NSCDRV.R7 lda DS1216E.DATA+1 Get MM + asl + asl + asl + asl + asl +NSCDRV.R8 ora DS1216E.DATA+2 Get DD + sta DATELO + +*NSCDRV.R9 lda DS1216E.DATA Get YY + + pla + rol + sta DATELO+1 + +NSCDRV.R6 lda DS1216E.DATA+5 Get mm + sta TIMELO + +NSCDRV.R5 lda DS1216E.DATA+4 Get HH + sta TIMELO+1 + + plp + bmi .8 + + sta CLRCXROM + +.8 plp + rts +*-------------------------------------- +DS1216E.PATTERN .HS 5CA33AC55CA33AC5 Reverted 7->0 +*-------------------------------------- + .LIST ON +NSCDRV.SIZE .EQ *-NSCDRV.B.START + .LIST OFF +*-------------------------------------- +* CONTROL SECTION : +*-------------------------------------- + .DO NSCDRV.SIZE>125 + ERROR:NSCDRV.SIZE too big + .FIN +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.nsc.s +ASM diff --git a/SYS/PM.RAMWORKS.S.txt b/SYS/PM.RAMWORKS.S.txt new file mode 100644 index 00000000..1420d377 --- /dev/null +++ b/SYS/PM.RAMWORKS.S.txt @@ -0,0 +1,796 @@ +NEW + AUTO 3,1 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF sys/pm/pm.ramworks +*-------------------------------------- + .INB inc/macros.i + .INB inc/io.i + .INB inc/monitor.i + .INB inc/mli.i + .INB inc/mli.e.i +*-------------------------------------- +TmpPtr1 .EQ $0 +TmpPtr2 .EQ $2 +Type .EQ $4 +*-------------------------------------- +RW.SAVEZP0 .EQ $2800 +RW.SAVEZP1 .EQ $2900 +*-------------------------------------- +RW.BLOCK .EQ $2A00 +RW.ONLINEBUFFER .EQ $2C00 +*-------------------------------------- +* A2OSX.SYSTEM relocated at $1000 !!! +*-------------------------------------- +SEBankSelect .EQ $C071 +RWBankSelect .EQ $C073 +*-------------------------------------- +RW.Init >LDYAI RW.MSG + jsr PrintFYA + + jsr RW.CheckRAM3 + bcs .5 + + >LDYAI RW.MSG.RAM3OK + jsr PrintFYA + rts + +.5 jsr RW.DisableRAM + bcc .10 + + >LDYAI RW.MSG.RAMDISKO + jsr PrintFYA + rts + +.10 >LDYAI RW.MSG.RAMDISOK + jsr PrintFYA + + lda #RWBankSelect + jsr RW.DetectHW + bcc .1 + + lda #SEBankSelect + jsr RW.DetectHW + bcc .1 + + >LDYAI RW.MSG.KO1 + bra .9 + +.1 tay save RAM drive pages + + pha + + lsr divide by 4 to compute KB size + ror .12+1 + lsr + ror .12+1 + +.12 ldx #$00 X,A = RAM drive size + phx Push Kbyte LO + pha Push Kbyte HI + + tya + inc + 1 page AUX mem + + pha Total page detected + + lsr divide by 4 to compute KB size + ror .11+1 + lsr + ror .11+1 + +.11 ldx #$00 X,A = Total KB detected + phx Push Kbyte LO + pha Push Kbyte HI + + >LDYAI RW.MSG.OK1 + jsr PrintFYA + + jsr RW.Install + bcc .2 + + >LDYAI RW.MSG.KO2 + bra .9 + +.2 >LDYAI RW.MSG.OK2 + jsr PrintFYA + + jsr RW.Format + bcc .3 + + >LDYAI RW.MSG.KO3 + bra .9 + +.3 >LDYAI RW.MSG.OK3 + +.9 jsr PrintFYA + rts +*-------------------------------------- +RW.CheckRAM3 jsr RW.ONLINE MLI Online at S3D2 + bcs .9 + + lda RW.ONLINEBUFFER + and #$0F + + cmp #4 'RAM3' ? + sec + bne .9 + + tax + +.1 lda RW.ONLINEBUFFER,x + eor RW.MSG.RAM3OK,x + asl ignore b7 + bne .9 + + dex + bne .1 + + clc +.9 rts +*-------------------------------------- +RW.DisableRAM lda DEVPTRS3D2 + cmp DEVPTRS S0D1=NOVEV + bne .1 + + lda DEVPTRS3D2+1 + cmp DEVPTRS+1 S0D1=NODEV + beq .8 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 + + sec No device found, exit with error + rts + +.3 cpx DEVCNT + beq .5 + +.4 lda DEVLST+1,x + sta DEVLST,x + inx + cpx DEVCNT + bne .4 + +.5 ldx DEVCNT + stz DEVLST,x + dec DEVCNT + lda DEVPTRS + sta DEVPTRS3D2 + lda DEVPTRS+1 + sta DEVPTRS3D2+1 + + jsr RW.ONLINE + +.8 clc Success!! + rts +*-------------------------------------- +RW.ONLINE jsr MLI + .DA #MLIONLINE + .DA RW.ONLINEPARAM + rts +*-------------------------------------- +RW.ONLINEPARAM .DA #2 + .DA #$B0 Slot 3,Drive 2 + .DA RW.ONLINEBUFFER +*-------------------------------------- +RW.DetectHW php + sei + sta Type + sta .1+1 + sta .2+1 + sta .3+1 + sta .6+1 + + 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 + bpl .1 + + lda #0 + +.2 sta RWBankSelect +*-------------------------------------- +* Added after David Finnigan from macgui.com testing sessions +* + pha + pla +* +* to address possibly a timing issue with Accelerators +*-------------------------------------- + sta 0 + eor #$FF + sta 1 + eor #$FF + inc + bpl .2 + + ldx #0 + +.3 stx RWBankSelect +*-------------------------------------- +* Added after David Finnigan from macgui.com testing sessions +* + pha + pla +* +* to address possibly a timing issue with Accelerators +*-------------------------------------- + lda 0 + tay + eor #$ff + cmp 1 + bne .4 + + inx + + cpy #127 + bne .3 + +.4 ldy #127 X = detected page count + +.6 sty RWBankSelect + + lda RW.SAVEZP0,y + sta 0 + lda RW.SAVEZP1,y + sta 1 + dey + bpl .6 + + sta CLRALTZP + plp + + txa PGCNT > 0 ? + beq .9 + + dec minus 1 for AUX mem + beq .9 + + sta RW.PGCNT PGCNT = last detected page + + 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 Type + sta RWDRV.IO1+1 + sta RWDRV.EXIT+1 + + lda RROMBNK1 + + sta SETWRITEAUX + + ldx #RWDRVX.SIZE + +.2 lda RWDRVX.B.START-1,x + sta RWDRVX.START-1,x + dex + bne .2 + + lda Type + sta RWDRVX.XM.IO1+1 + sta RWDRVX.XM.IO2+1 + sta RWDRVX.XM.IO3+1 + + sta CLRWRITEAUX + inc DEVCNT + ldx DEVCNT + lda #$B0 Slot 3,Drive 2,0=Not Removable, 0=no int, 00=1 Volume + sta DEVLST,x + + lda #RWDRV.START + sta DEVPTRS3D2 + lda /RWDRV.START + sta DEVPTRS3D2+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) + lda #$0F + 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 + .HS 2C BIT ABS + +RW.BLOCK.SET00 lda #$00 + + ldx #0 + +.1 sta RW.BLOCK,x + sta RW.BLOCK+$100,x + inx + bne .1 + + rts +*-------------------------------------- +RW.MLIWRITEBLOCK + .DA #3 + .DA #$B0 Slot 3,Drive 2 + .DA RW.BLOCK +RW.MLIWRITEBLOCK.BLK + .DA 2 Start writing block at #2 +*-------------------------------------- +RW.PGCNT .BS 1 +RW.FBITMAPCNT .BS 1 +RW.BITMAPCNT .BS 1 +*-------------------------------------- +RW.BLOCK2 .DA 0 pointer to previous block + .DA 3 pointer to next block + .DA #$F4 $F=Vol Dir Header, 4=name len + .AS 'RAM3' + .BS 11 (RAM3 len=4, 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 * +*-------------------------------------- + .INB usr/src/shared/x.printf.s +*-------------------------------------- +RW.MSG .AZ "SuperExpander E, RAMWorks (I,II,III,z-Ram) Driver For A2osX\n" +RW.MSG.RAMDISOK .AZ "/RAM Device Disabled/Not Present.\n" +RW.MSG.RAMDISKO .AZ "Problem Disabling /RAM Device.\n" +RW.MSG.RAM3OK .AZ "/RAM3 Device Already Installed.\n" +RW.MSG.OK1 .AZ "%D KB Detected (%d Pages), %D KB (%d Pages) Available for RamDrive.\n" +RW.MSG.KO1 .AZ "Not Detected.\n" +RW.MSG.OK2 .AZ "RamWorks Driver Installed.\n" +RW.MSG.KO2 .AZ "RamWorks Driver Install Error.\n" +RW.MSG.OK3 .AZ "RamWorks Drive Formatted as /RAM3.\n" +RW.MSG.KO3 .AZ "RamWorks Drive Format Error.\n" +*-------------------------------------- +* Driver for Ramworks in main LC +* $FF00 -> $FF9A (Inclusive) +* $FF58 MUST BE $60 (RTS) +* DO NOT trash DRV.COMMAND...DRV.BLKNUM as ProDOS +* reuses it after Block operation +* A1,A2 are used by Disk II Driver, +* so we use it safely as Tmp Ptr +*-------------------------------------- +DRV.A2L .EQ $3E +DRV.A2H .EQ $3F +DRV.COMMAND .EQ $42 +DRV.BUFF .EQ $44 +DRV.BLKNUM .EQ $46 +*-------------------------------------- +RWDRV.B.START .PH $FF00 +RWDRV.START 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 + + ldx DRV.BLKNUM + cpx RWDRV.MAXLO+1 + lda DRV.BLKNUM+1 + sbc RWDRV.MAXHI+1 + bcs RWDRV.IOERR DRV.BLKNUM >= RW.DRV.SIZE, IO error + + bit RD80STORE save 80 Store status + + php Disable IRQ as no vector set in RW Banks + sei + + sta CLR80STORE make sure SETREADAUX/SETWRITEAUX effective everywhere + + txa Get Back DRV.BLKNUM + asl compute PAGE = blocknumLO *2 + 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 +*-------------------------------------- +RWDRV.IO1 sta RWBankSelect Select RAMWorks Bank + + inx second 256 bytes first + stx DRV.A2H Use DRV.A1L/H for RAM PTR + stz DRV.A2L + inc DRV.BUFF+1 + dey Y=CMD, zero if read + bne RWDRV.W non zero, go write + + sta SETREADAUX + ldx #DRV.A2L READ:copy from RAM to BUFF + lda #DRV.BUFF + bra RWDRV.RW + +RWDRV.W sta SETWRITEAUX + ldx #DRV.BUFF + lda #DRV.A2L WRITE:copy from BUFF to RAM + dey Make sure Y=0 for main loop below + +RWDRV.RW stx RWDRV.RW.SRC+1 + sta RWDRV.RW.DST+1 + +* clc 2 pages to copy + .HS B0 BCS +RWDRV.RW.LOOP sec + +RWDRV.RW.SRC lda ($FF),y +RWDRV.RW.DST sta ($FF),y + iny + bne RWDRV.RW.SRC + + dec DRV.BUFF+1 + dec DRV.A2H + bcc RWDRV.RW.LOOP + +RWDRV.EXIT stz RWBankSelect + sta CLRREADAUX + sta CLRWRITEAUX + + plp restore IRQ + + bpl RMDRV.CMDSTATUS + sta SET80STORE + +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.E.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 + jmp RWDRVX.RESTORE + +RWDRV.END .EP +RWDRV.B.END + .LIST ON +RWDRV.SIZE .EQ RWDRV.B.END-RWDRV.B.START + .LIST OFF +*-------------------------------------- +* 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 + + lda DRV.COMMAND DRV.COMMAND: 1=READ,2=WRITE + lsr + php + + ldy #RRAMWRAMBNK1 + + txa + beq .1 page 0/1, no need to check BANK + + cmp #$D0 $C0 <= PAGE < $D0 ? + bcs .1 no, store in BNK1 + + ora #$10 Remap $C0 page to $D0 BNK2 + + ldy #RRAMWRAMBNK2 + +.1 sty RWDRVX.XM.RWLC+1 Save to select proper RW bank later + + ldy DRV.BUFF + ldx DRV.BUFF+1 + + plp + 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 + + jmp RWDRV.EXIT +*-------------------------------------- +* LC Copy Code, moved from Aux to main $300 +* $0200 -> $02FF TMP buffer for 2 steps move between LCs +* CC=WRITE : +* CS=READ : +*-------------------------------------- +RWDRVX.XM.START ldy #2 2 pages to copy + +RWDRVX.XM.COPY sta CLRALTZP + + jsr RWDRV.XM.RUN+RWDRVX.XM.SRCLC-RWDRVX.XM.START + sta $C000,x select proper Main/Aux ZP/LC +RWDRVX.XM.IO1 sta RWBankSelect + + ldx #0 + +RWDRVX.XM.SRC lda $FFFF,x + sta RMDRVX.TMP,x + inx + bne RWDRVX.XM.SRC + + sta CLRALTZP + + jsr RWDRV.XM.RUN+RWDRVX.XM.DSTLC-RWDRVX.XM.START + sta $C000,x select proper Main/Aux ZP/LC +RWDRVX.XM.IO2 sta RWBankSelect + + ldx #0 + +RWDRVX.XM.2 lda RMDRVX.TMP,x +RWDRVX.XM.DST sta $FFFF,x + inx + bne RWDRVX.XM.2 + + 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 + + sta CLRALTZP +RWDRVX.XM.IO3 stz RWBankSelect +*-------------------------------------- +RWDRVX.XM.MNLC bit RRAMWRAMBNK1 ProDOS always uses LCBANK1 + + lda #0 + + ldx #CLRALTZP + + rts +*-------------------------------------- +RWDRVX.XM.SRCLC bcc RWDRVX.XM.MNLC CC=WRITE,CS=READ? + .HS 2C BIT ABS +RWDRVX.XM.DSTLC bcs RWDRVX.XM.MNLC CC=WRITE,CS=READ? +*-------------------------------------- +RWDRVX.XM.RWLC bit $C000 + +RWDRVX.XM.BANK lda #$FF + + ldx #SETALTZP + + rts +*-------------------------------------- + .LIST ON +RWDRVX.XM.SIZE .EQ *-RWDRVX.XM.START + .LIST OFF +*-------------------------------------- +RWDRVX.XM.SAVE .BS RWDRVX.XM.SIZE +*-------------------------------------- + .EP +*-------------------------------------- +RWDRVX.B.END .LIST ON +RWDRVX.SIZE .EQ RWDRVX.B.END-RWDRVX.B.START + .LIST OFF +*-------------------------------------- +* CONTROL SECTION : +*-------------------------------------- + .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 usr/src/sys/pm.ramworks.s +ASM diff --git a/SYS/PM.VEDRIVE.S.CF.txt b/SYS/PM.VEDRIVE.S.CF.txt new file mode 100644 index 00000000..371d30e6 --- /dev/null +++ b/SYS/PM.VEDRIVE.S.CF.txt @@ -0,0 +1,379 @@ +NEW + AUTO 3,1 +*-------------------------------------- +VEDRIVE.ReadConf + jsr MLI + .DA #MLIGETPREFIX + .DA MLIGETPREFIX.P + bcs .9 + + ldx #0 + ldy CONF.FILEPATH + +.1 lda CONF.FILENAME,x + iny + sta CONF.FILEPATH,y + inx + cpx #CONF.FILENAME.L + bne .1 + + sty CONF.FILEPATH + + lda #CONF.FILEPATH + pha + lda /CONF.FILEPATH + pha + >LDYAI VEDRIVE.CONF + jsr PrintFYA + + jsr MLI + .DA #MLIOPEN + .DA MLIOPEN.P + bcc .10 + + >LDYAI VEDRIVE.CONFKO + jsr PrintFYA + sec + rts + +.10 lda MLIOPEN.P+5 + sta MLINEWLINE.P+1 + sta MLIREAD.P+1 + sta MLICLOSE.P+1 + + jsr MLI + .DA #MLINEWLINE + .DA MLINEWLINE.P + bcs .9 + +.2 jsr MLI + .DA #MLIREAD + .DA MLIREAD.P + bcs .8 + + jsr VEDRIVE.CONF.L + bcc .2 + + >LDYAI VEDRIVE.CONFSYN + jsr PrintFYA + + sec + bra .9 + +.8 cmp #MLI.E.EOF + sec + bne .9 + + lda CONF.NIC + bmi .9 + + lda CONF.SLOT + beq .9 + + lda CONF.SERVER + beq .9 + + clc + +.9 php + pha + jsr MLI + .DA #MLICLOSE + .DA MLICLOSE.P + pla + plp + rts +*-------------------------------------- +VEDRIVE.CONF.L lda CONF.LBUF + + cmp #13 CR + beq .8 + + cmp #'#' comment + beq .8 + + lda #CONF.LBUF + sta ZPPtr1 + lda /CONF.LBUF + sta ZPPtr1+1 + + ldy #CONF.KW + lda /CONF.KW + jsr VEDRIVE.CONF.KW + bcs .9 + + ldx idx + jmp (.5,x) + +.5 .DA VEDRIVE.CONF.KW.NIC + .DA VEDRIVE.CONF.KW.SLOT + .DA VEDRIVE.CONF.KW.ADDRESS + .DA VEDRIVE.CONF.KW.MASK + .DA VEDRIVE.CONF.KW.GATEWAY + .DA VEDRIVE.CONF.KW.SERVER + .DA VEDRIVE.CONF.KW.PORT + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +VEDRIVE.CONF.KW.NIC + jsr VEDRIVE.CONF.SKIPSP + bcs .9 + + ldy #CONF.KW.NIC + lda /CONF.KW.NIC + + jsr VEDRIVE.CONF.KW + bcs .9 + + lda idx + sta CONF.NIC + + clc +.9 rts +*-------------------------------------- +VEDRIVE.CONF.KW.SLOT + jsr VEDRIVE.CONF.SKIPSP + bcs .9 + + lda (ZPPtr1) + cmp #'1' + bcc .9 + + cmp #'8' + bcs .9 + + and #$0F + sta CONF.SLOT + + clc + rts + +.9 sec + rts +*-------------------------------------- +VEDRIVE.CONF.KW.ADDRESS + ldx #CONF.ADDRESS-CONF.IPCFG + .HS 2C BIT ABS +VEDRIVE.CONF.KW.MASK + ldx #CONF.MASK-CONF.IPCFG + .HS 2C BIT ABS +VEDRIVE.CONF.KW.GATEWAY + ldx #CONF.GATEWAY-CONF.IPCFG + .HS 2C BIT ABS +VEDRIVE.CONF.KW.SERVER + ldx #CONF.SERVER-CONF.IPCFG + + jsr VEDRIVE.CONF.SKIPSP + bcs .9 + + jsr VEDRIVE.CONF.GetIPatX + +.9 rts +*-------------------------------------- +VEDRIVE.CONF.KW.PORT + jsr VEDRIVE.CONF.SKIPSP + bcs .9 + + jsr VEDRIVE.CONF.GetInt + bcs .9 + + lda int + sta CONF.PORT+1 + + lda int+1 + sta CONF.PORT + +.9 rts +*-------------------------------------- +VEDRIVE.CONF.KW sty ZPPtr2 + sta ZPPtr2+1 + + ldy #$ff + +.1 iny + lda (ZPPtr1),y + cmp #13 CR + beq .2 + + cmp #32 SPACE + bne .1 + +.2 sty len + + stz idx + +.3 lda len + cmp (ZPPtr2) + bne .6 + + tay + +.4 lda (ZPPtr2),y + dey + cmp (ZPPtr1),y + bne .6 + + tya + bne .4 + + lda ZPPtr1 + clc + adc len + sta ZPPtr1 + bcc .5 + + inc ZPPtr1+1 + +.5 clc + rts + +.6 lda (ZPPtr2) + sec + adc ZPPtr2 + sta ZPPtr2 + bcc .7 + + inc ZPPtr2+1 + +.7 inc idx + inc idx + lda (ZPPtr2) + bne .3 + + sec + rts +*-------------------------------------- +VEDRIVE.CONF.SKIPSP + lda (ZPPtr1) + cmp #32 + bne .9 + + bra .3 + +.1 lda (ZPPtr1) + cmp #13 + beq .9 + +.2 cmp #32 + bne .8 + +.3 inc ZPPtr1 + bne .1 + + inc ZPPtr1+1 + bra .1 + +.8 clc + +.9 rts +*-------------------------------------- +VEDRIVE.CONF.GetIPatX + jsr VEDRIVE.CONF.GetShort + bcs .9 + + ldy #4 + +.1 sta CONF.IPCFG,x + inx + dey + beq .9 CC + + jsr VEDRIVE.GetCharPtr1 + bcs .9 + + cmp #'.' + sec + bne .9 + + jsr VEDRIVE.CONF.GetShort + bcc .1 + +.9 rts +*-------------------------------------- +VEDRIVE.CONF.GetShort + jsr VEDRIVE.CONF.GetInt + bcs .9 + + lda int+1 + sec + bne .9 + + lda int + clc + +.9 rts +*-------------------------------------- +VEDRIVE.CONF.GetInt + stz int + stz int+1 + +.1 lda (ZPPtr1) + cmp #'0' + bcc .8 + + cmp #'9'+1 + bcs .8 + + inc ZPPtr1 + bne .2 + + inc ZPPtr1+1 + +.2 and #$0F + pha + + lda int+1 + pha + lda int + pha + + asl int + rol int+1 x2 + asl int + rol int+1 x4 + + pla + clc + adc int + sta int + + pla + adc int+1 + sta int+1 x4+1 = x5 + + asl int + rol int+1 x10 + + pla + clc + adc int + sta int + bcc .1 + + inc int+1 + bra .1 + +.8 clc + rts +*-------------------------------------- +VEDRIVE.GetCharPtr1 + lda (ZPPtr1) + cmp #13 + beq .9 + + inc ZPPtr1 + bne .8 + + inc ZPPtr1+1 + +.8 clc +.9 rts +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.vedrive.s.cf +LOAD usr/src/sys/pm.vedrive.s +ASM diff --git a/SYS/PM.VEDRIVE.S.GS.txt b/SYS/PM.VEDRIVE.S.GS.txt new file mode 100644 index 00000000..61a724a2 --- /dev/null +++ b/SYS/PM.VEDRIVE.S.GS.txt @@ -0,0 +1,17 @@ +NEW + AUTO 3,1 +*-------------------------------------- +GS.Init sec + rts +*-------------------------------------- +DRV.GS .EQ * + .PH $D400 + + +*-------------------------------------- + .EP +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.vedrive.s.gs +LOAD usr/src/sys/pm.vedrive.s +ASM diff --git a/SYS/PM.VEDRIVE.S.IP.txt b/SYS/PM.VEDRIVE.S.IP.txt new file mode 100644 index 00000000..980e5361 --- /dev/null +++ b/SYS/PM.VEDRIVE.S.IP.txt @@ -0,0 +1,529 @@ +NEW + AUTO 3,1 +*-------------------------------------- +VEDRIVE.MACInit ldx #5 + +.1 lda CONF.SRCMAC,x + sta DHCP.DISC.SRCMAC,x + sta DHCP.REQ.SRCMAC,x + sta DHCP.DISC.CHADDR,x + sta DHCP.REQ.CHADDR,x + sta ARP.REQ.SRCMAC,x + sta ARP.REQ.SHA,x + sta ARP.REP.SRCMAC,x + sta ARP.REP.SHA,x + sta ADT.REQ.SRCMAC,x + dex + bpl .1 + + rts +*-------------------------------------- +VEDRIVE.IPInit ldx #3 + +.1 lda CONF.ADDRESS,x + sta ARP.REQ.SPA,x + sta ARP.REP.TPA,x + sta ADT.REQ.IP.SRC,x + + lda CONF.SERVER,x + sta ARP.REQ.TPA,x + sta ADT.REQ.IP.DST,x + dex + bpl .1 + + rts +*-------------------------------------- +VEDRIVE.DHCPReq >LDYAI DHCP.DISC + >STYA ZPBufPtr + >LDYAI DHCP.DISC.LEN + >STYA ZPBufCnt + jsr VEDRIVE.SendUDP + bcs .9 + + jsr VEDRIVE.InitTimer + +.2 jsr VEDRIVE.READ + bcc .3 + + jsr VEDRIVE.Wait + bcc .2 + + rts + +.3 jsr VEDRIVE.CheckDHCPOffer + bcs .2 + + >LDYAI DHCP.REQ + >STYA ZPBufPtr + >LDYAI DHCP.REQ.LEN + >STYA ZPBufCnt + jsr VEDRIVE.SendUDP + bcs .9 + + jsr VEDRIVE.InitTimer + +.4 jsr VEDRIVE.READ + bcc .5 + + jsr VEDRIVE.Wait + bcc .4 + + rts + +.5 >LDYAI FRAMEBUF + >STYA ZPBufPtr + + jsr VEDRIVE.CheckDHCPFrame + bcs .4 + + eor #S.DHCP.OPTIONS.DHCPAck + bne .4 + +* clc + rts + +.9 sec + rts +*-------------------------------------- +VEDRIVE.IPChecksum + ldy #S.IP.TOTAL.LENGTH+1 + lda ZPBufCnt + sec + sbc #S.ETH.EII + sta (ZPBufPtr),y + dey + lda ZPBufCnt+1 + sbc /S.ETH.EII + sta (ZPBufPtr),y + lda #0 + ldy #S.IP.HDR.CHECKSUM + sta (ZPBufPtr),y + iny + sta (ZPBufPtr),y + + stz ZPCheckSum RESET IP CHECKSUM + stz ZPCheckSum+1 + + clc + + ldy #S.IP.V.IHL + + ldx #10 10 words for IP Header + +.2 lda (ZPBufPtr),y + adc ZPCheckSum + sta ZPCheckSum + iny + lda (ZPBufPtr),y + adc ZPCheckSum+1 + sta ZPCheckSum+1 + iny + dex + bne .2 + + ldy #S.IP.HDR.CHECKSUM + lda ZPCheckSum + adc #0 + eor #$FF + sta (ZPBufPtr),y + iny + lda ZPCheckSum+1 + adc #0 + eor #$FF + sta (ZPBufPtr),y + rts +*-------------------------------------- +VEDRIVE.UDPChecksum + clc + + ldy #S.UDP.LENGTH+1 + lda (ZPBufPtr),y + adc #S.IP.PROTOCOL.UDP + sta ZPCheckSum+1 + + dey + lda (ZPBufPtr),y + adc /S.IP.PROTOCOL.UDP (all zero) + sta ZPCheckSum + jsr VEDRIVE.AddSrcDstIPToChecksum + + ldy #S.UDP.LENGTH+1 + lda (ZPBufPtr),y + eor #$ff + tax + + dey + lda (ZPBufPtr),y + eor #$ff + ldy #S.UDP.CHECKSUM +*-------------------------------------- +* X,A = !ByteCount, Y = Offset in Frame +*-------------------------------------- +VEDRIVE.ComputeChecksum + phy Save Offset + pha Save !ByteCount.HI + + lda #0 Reset Checksum + sta (ZPBufPtr),y + iny + sta (ZPBufPtr),y + + >LDYA ZPBufPtr + >STYA ZPPtr1 + + ldy #S.IP + +.1 inx + bne .11 + + pla + inc + beq .8 + + pha +.11 lda (ZPPtr1),y + adc ZPCheckSum + sta ZPCheckSum + + iny + bne .20 + + inc ZPPtr1+1 +.20 inx + bne .2 + + pla + inc + beq .7 + + pha + +.2 lda (ZPPtr1),y + + adc ZPCheckSum+1 + sta ZPCheckSum+1 + iny + bne .1 + + inc ZPPtr1+1 + bra .1 + +.7 adc ZPCheckSum+1 A=0 from beq .7 + sta ZPCheckSum+1 + +.8 ply + lda ZPCheckSum + adc #0 Don't forget to add last carry!!! + eor #$FF + sta (ZPBufPtr),y + iny + lda ZPCheckSum+1 + adc #0 Don't forget to add last carry!!! + eor #$FF + sta (ZPBufPtr),y + rts +*-------------------------------------- +VEDRIVE.AddSrcDstIPToChecksum + ldy #S.IP.SRC + ldx #4 4 words for SRC & DST IP + +.1 lda (ZPBufPtr),y + adc ZPCheckSum + sta ZPCheckSum + iny + lda (ZPBufPtr),y + adc ZPCheckSum+1 + sta ZPCheckSum+1 + iny + dex + bne .1 + + rts +*-------------------------------------- +VEDRIVE.CheckDHCPOffer + >LDYAI FRAMEBUF + >STYA ZPBufPtr + + jsr VEDRIVE.CheckDHCPFrame + bcs .9 + + cmp #S.DHCP.OPTIONS.DHCPOffer + bne .9 + + ldy #S.DHCP.YIADDR+3 + ldx #3 + +.2 lda (ZPBufPtr),y + sta DHCP.REQ.OPT.REQIP,x + sta CONF.ADDRESS,x + dey + dex + bpl .2 + + ldy #S.DHCP.SIADDR+3 + lda (ZPBufPtr),y + bne .3 + + ldy #S.IP.SRC+3 + +.3 ldx #3 + +.4 lda (ZPBufPtr),y + sta DHCP.REQ.OPT.SVRIP,x + dey + dex + bpl .4 + +.5 inc ZPPtr1 skip Option 53 (DHCPOffer:530102) + bne .6 + + inc ZPPtr1+1 + +.6 lda (ZPPtr1) + sec + adc ZPPtr1 add option len + 1 + sta ZPPtr1 + bcc .7 + + inc ZPPtr1+1 + +.7 lda (ZPPtr1) + cmp #S.DHCP.OPTIONS.END + beq .8 + + jsr VEDRIVE.GetDHCPOption + bra .5 + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +VEDRIVE.CheckDHCPFrame + jsr VEDRIVE.CheckUDPFrame + bcs .9 + + ldy #S.DHCP.XID+3 + ldx #3 + +.1 lda (ZPBufPtr),y + cmp DHCP.DISC.XID,x same XID ? + bne .9 + + dey + dex + bpl .1 + + lda ZPBufPtr + clc + adc #S.DHCP.OPTIONS + sta ZPPtr1 + + lda ZPBufPtr+1 + adc /S.DHCP.OPTIONS + sta ZPPtr1+1 + + lda (ZPPtr1) + cmp #S.DHCP.OPTIONS.MSGTYPE + bne .9 + + ldy #2 + lda (ZPPtr1),y + + clc + rts + +.9 sec + rts +*-------------------------------------- +VEDRIVE.GetDHCPOption + cmp #S.DHCP.OPTIONS.MASK + bne .1 + + ldx #CONF.MASK-CONF.IPCFG + bra .5 + +.1 cmp #S.DHCP.OPTIONS.GW + bne .2 + + ldx #CONF.GATEWAY-CONF.IPCFG + bra .5 + +.2 cmp #S.DHCP.OPTIONS.SRVID + bne .9 + + ldy #5 + ldx #3 + +.3 lda (ZPPtr1),y + sta DHCP.REQ.OPT.SVRIP,x + dey + dex + bpl .3 + + rts + +.5 ldy #2 Skip Byte count + lda #4 + +.6 pha + lda (ZPPtr1),y + sta CONF.IPCFG,x + iny + inx + pla + dec + bne .6 + +.9 rts +*-------------------------------------- +VEDRIVE.CheckADTRep + jsr VEDRIVE.CheckUDPFrame + bcs .9 + + ldy #S.TCPUDP.DSTPORT + lda (ZPBufPtr),y + cmp #$C0 + bne .9 + + iny + lda (ZPBufPtr),y + bne .9 + + clc + rts + +.9 sec + rts +*-------------------------------------- +VEDRIVE.CheckUDPFrame + ldy #S.ETH.EII.TYPE + lda (ZPBufPtr),y + cmp /S.ETH.EII.TYPE.IP + bne .9 + + iny + lda (ZPBufPtr),y + cmp #S.ETH.EII.TYPE.IP + bne .9 + + ldy #S.IP.PROTOCOL + lda (ZPBufPtr),y + cmp #S.IP.PROTOCOL.UDP + bne .9 + + clc + rts + +.9 sec + rts +*-------------------------------------- +VEDRIVE.ARPReq >LDYAI ARP.REQ + >STYA ZPBufPtr + >LDYAI S.ARP + >STYA ZPBufCnt + jsr VEDRIVE.SendARP + bcs .9 + + jsr VEDRIVE.InitTimer + + stz bRemoteMac + +.2 jsr VEDRIVE.READ + bcc .3 + + jsr VEDRIVE.Wait + bcc .2 + + rts + +.3 jsr VEDRIVE.CheckARPFrame + + bit bRemoteMac + bpl .2 + + clc +.9 rts +*-------------------------------------- +VEDRIVE.CheckARPFrame + ldy #S.ETH.EII.TYPE + lda (ZPBufPtr),y + cmp /S.ETH.EII.TYPE.ARP + bne .9 + + iny + lda (ZPBufPtr),y + cmp #S.ETH.EII.TYPE.ARP + bne .9 + + ldy #S.ARP.OPERATION+1 + lda (ZPBufPtr),y + + cmp #S.ARP.OPERATION.REP + bne .5 +*-------------------------------------- + ldy #S.ARP.SPA+3 + ldx #3 + +.1 lda (ZPBufPtr),y + cmp CONF.SERVER,x + bne .8 + + dey + dex + bpl .1 + + ldy #S.ARP.SHA+5 + ldx #5 + +.2 lda (ZPBufPtr),y + sta ADT.REQ.DSTMAC,x + dey + dex + bpl .2 + + dec bRemoteMac + + clc + rts +*-------------------------------------- +.5 cmp #S.ARP.OPERATION.REQ + bne .8 + + ldy #S.ARP.TPA+3 + ldx #3 + +.6 lda (ZPBufPtr),y + cmp CONF.ADDRESS,x + bne .8 + + dey + dex + bpl .6 + + ldy #S.ARP.SHA+9 + ldx #9 + +.7 lda (ZPBufPtr),y + sta ARP.REP.THA,x + dey + dex + bpl .7 + + >LDYAI ARP.REP + >STYA ZPBufPtr + >LDYAI S.ARP + >STYA ZPBufCnt + jsr VEDRIVE.SendARP + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.vedrive.s.ip +LOAD usr/src/sys/pm.vedrive.s +ASM diff --git a/SYS/PM.VEDRIVE.S.U1.txt b/SYS/PM.VEDRIVE.S.U1.txt new file mode 100644 index 00000000..d3400516 --- /dev/null +++ b/SYS/PM.VEDRIVE.S.U1.txt @@ -0,0 +1,245 @@ +NEW + AUTO 3,1 +*-------------------------------------- +U1.Init lda CONF.SLOT + asl + asl + asl + asl + sta Slotn0 + tax + + lda /PP.ID + sta PacketPagePTR+1,x + lda #PP.ID + sta PacketPagePTR,x + + lda PacketPageDATA+1,x + cmp /CS8900A.DEVID + bne .9 + + lda PacketPageDATA,x + cmp #CS8900A.DEVID + beq .1 + +.9 sec + rts + +.1 lda CONF.SLOT + pha + + lda /PP.REVISION Get Revision# of ths chip... + sta PacketPagePTR+1,x + lda #PP.REVISION + sta PacketPagePTR,x + + lda PacketPageDATA+1,x + pha + lda PacketPageDATA,x + pha + + lda #U1.Name + pha + lda /U1.Name + pha + + >LDYAI VEDRIVE.NICOK + jsr PrintFYA + + ldx Slotn0 + + lda /PP.RxCTL + sta PacketPagePTR+1,x + lda #PP.RxCTL + sta PacketPagePTR,x + lda /PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA+PP.RxCTL.RuntA + sta PacketPageDATA+1,x + lda #PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA+PP.RxCTL.RuntA + sta PacketPageDATA,x + + lda /PP.MAC + sta PacketPagePTR+1,x + lda #PP.MAC + sta PacketPagePTR,x + + lda CONF.SRCMAC+1 + sta PacketPageDATA+1,x + lda CONF.SRCMAC+0 + sta PacketPageDATA,x + + lda /PP.MAC+2 + sta PacketPagePTR+1,x + lda #PP.MAC+2 + sta PacketPagePTR,x + + lda CONF.SRCMAC+3 + sta PacketPageDATA+1,x + lda CONF.SRCMAC+2 + sta PacketPageDATA,x + + lda /PP.MAC+4 + sta PacketPagePTR+1,x + lda #PP.MAC+4 + sta PacketPagePTR,x + + lda CONF.SRCMAC+5 + sta PacketPageDATA+1,x + lda CONF.SRCMAC+4 + sta PacketPageDATA,x + + lda /PP.LineCTL + sta PacketPagePTR+1,x + lda #PP.LineCTL + sta PacketPagePTR,x + + lda /PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.10BaseT + sta PacketPageDATA+1,x + lda #PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.10BaseT + sta PacketPageDATA,x + + clc + rts +*-------------------------------------- +U1.READ php + sei + + ldx Slotn0 + + lda /PP.RxEvent + sta PacketPagePTR+1,x + lda #PP.RxEvent + sta PacketPagePTR,x + + lda PacketPageDATA+1,x + ldy PacketPageDATA,x + and /PP.RxEvent.RxOK+PP.RxEvent.IA+PP.RxEvent.Brdcast+PP.RxEvent.Runt + beq U1.READWRITE.9 + + lda RTDATA+1,x discard RxStatus + lda RTDATA,x + + lda RTDATA+1,x get RxLength + sta ZPBufCnt+1 + eor #$ff + sta ZPnCnt+1 + + lda RTDATA,x + sta ZPBufCnt + eor #$ff + sta ZPnCnt + + ldx Slotn0 + + lda ZPBufPtr+1 + pha + + ldy #0 + +.2 inc ZPnCnt + bne .3 + + inc ZPnCnt+1 + beq .8 + +.3 lda RTDATA,x + sta (ZPBufPtr),y + iny + + inc ZPnCnt + bne .4 + + inc ZPnCnt+1 + beq .8 + +.4 lda RTDATA+1,x + sta (ZPBufPtr),y + iny + bne .2 + + inc ZPBufPtr+1 + bra .2 + +.8 pla + sta ZPBufPtr+1 + + plp + clc + rts +*-------------------------------------- +U1.READWRITE.9 plp + sec + rts +*-------------------------------------- +U1.WRITE php + sei + + ldx Slotn0 + + lda /PP.TxCMD.LID+PP.TxCMD.TxStartFULL + sta TxCMD+1,x + lda #PP.TxCMD.LID+PP.TxCMD.TxStartFULL + sta TxCMD,x + + lda ZPBufCnt+1 + sta TxLength+1,x + eor #$ff + sta ZPnCnt+1 + + lda ZPBufCnt + sta TxLength,x + eor #$ff + sta ZPnCnt + + lda /PP.BusST + sta PacketPagePTR+1,x + lda #PP.BusST + sta PacketPagePTR,x + + lda PacketPageDATA+1,x + ldy PacketPageDATA,x + bit /PP.BusST.Rdy4TxNOW + beq U1.READWRITE.9 + + ldx Slotn0 + + ldy #0 + +.1 inc ZPnCnt + bne .2 + + inc ZPnCnt+1 + beq .8 + +.2 lda (ZPBufPtr),y + sta RTDATA,x + iny + + inc ZPnCnt + bne .3 + + inc ZPnCnt+1 + beq .8 + +.3 lda (ZPBufPtr),y + sta RTDATA+1,x + iny + bne .1 + + inc ZPBufPtr+1 + bne .1 + +.8 plp + clc + rts +*-------------------------------------- +U1.Name >PSTR "Uthernet V1" +*-------------------------------------- +DRV.U1 .EQ * + .PH $D400 + + .EP +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.vedrive.s.u1 +LOAD usr/src/sys/pm.vedrive.s +ASM diff --git a/SYS/PM.VEDRIVE.S.U2.txt b/SYS/PM.VEDRIVE.S.U2.txt new file mode 100644 index 00000000..1090a55c --- /dev/null +++ b/SYS/PM.VEDRIVE.S.U2.txt @@ -0,0 +1,431 @@ +NEW + AUTO 3,1 +*-------------------------------------- +U2.Init lda CONF.SLOT + asl + asl + asl + asl + clc + adc #$88 + sta Slotn0 + tax + + lda #W5100.MR.RST + sta W5100.MR,x + + lda #0 + +.1 dec give some time.... + bne .1 + + lda #W5100.MR.PB+W5100.MR.AI+W5100.MR.IND + sta W5100.MR,x + + pha + pla + + lda W5100.MR,x + cmp #W5100.MR.PB+W5100.MR.AI+W5100.MR.IND + bne .9 + + >AR.SELECT RTR + lda W5100.DR,x Get RTR HI + cmp /2000 + bne .9 + + lda W5100.DR,x Get RTR LO + cmp #2000 + beq .3 + +.9 sec + rts + +.3 lda CONF.SLOT + pha + + lda #0 + pha + pha + + lda #U2.Name + pha + lda /U2.Name + pha + + >LDYAI VEDRIVE.NICOK + jsr PrintFYA + + ldx Slotn0 + + lda #W5100.MR.PB+W5100.MR.AI+W5100.MR.IND + sta W5100.MR,x + + >AR.SELECT SHAR + ldy #0 + +.4 lda CONF.SRCMAC,y + sta W5100.DR,x + iny + cpy #6 + bne .4 + + >AR.SELECT RMSR + lda #3 8k,0k,0k,0k + sta W5100.DR,x ...for Socket RX Buffers + sta W5100.DR,x ...for Socket TX Buffers + + >AR.SELECT S0.MR + lda #W5100.AR.Sn.MR.MACRAW+W5100.AR.Sn.MR.MF + sta W5100.DR,x + + >AR.SELECT S0.CR + lda #W5100.AR.Sn.CR.OPEN + sta W5100.DR,x + + clc + rts +*-------------------------------------- +U2.Read php + sei + + ldx Slotn0 + + >AR.SELECT S0.RX.RSR + lda W5100.DR,x get the received size HI + nop + nop + ora W5100.DR,x LO + bne .1 + + jmp U2.READWRITE.9 + +.1 >AR.SELECT S0.RX.RD + lda W5100.DR,x get the received ptr HI + sta Offset+1 + ldy W5100.DR,x get the received ptr LO + sty Offset + + and /RXTX.MASK + ora /RX.BASE + sta W5100.AR,x + tya + sta W5100.AR+1,x + + lda W5100.DR,x get RX.Size HI (Frame size + 2) + sta TotalSize+1 + lda W5100.DR,x get RX.Size LO + sta TotalSize + + sec + sbc #2 MACRAW:strip 2 bytes Header from Size + sta ZPBufCnt + eor #$ff + sta ZPnCnt + + lda TotalSize+1 + sbc #0 + sta ZPBufCnt + eor #$ff + sta ZPnCnt+1 + + lda ZPBufPtr+1 + pha + + ldy #0 + +.2 inc ZPnCnt + bne .3 + + inc ZPnCnt+1 + beq .8 + +.3 lda W5100.DR,x + sta (ZPBufPtr),y + iny + bne .2 + + inc ZPBufPtr+1 + bra .2 + +.8 >AR.SELECT S0.RX.RD + + lda Offset + clc + adc TotalSize + pha save LO + + lda Offset+1 + adc TotalSize+1 + sta W5100.DR,x write HI + pla + sta W5100.DR,x write LO + + >AR.SELECT S0.CR + lda #W5100.AR.Sn.CR.RCVD + sta W5100.DR,x + + pla + sta ZPBufPtr+1 + + plp + clc + rts +*-------------------------------------- +U2.READWRITE.9 plp + sec + rts +*-------------------------------------- +U2.Write php + sei + + ldx Slotn0 + + lda ZPBufCnt + eor #$ff + sta ZPnCnt + + lda ZPBufCnt+1 + eor #$ff + sta ZPnCnt+1 + + >AR.SELECT S0.TX.FSR + lda W5100.DR,x get send size HI + nop + nop + ldy W5100.DR,x LO + cpy ZPBufCnt + sbc ZPBufCnt+1 + bcc U2.READWRITE.9 + + >AR.SELECT S0.TX.WR + lda W5100.DR,x Get HI + nop + nop + ldy W5100.DR,x Get LO + and /RXTX.MASK + ora /TX.BASE + sta W5100.AR,x Write HI + sta Offset+1 + tya + sta W5100.AR+1,x Write LO + sta Offset + + ldy #0 + +.2 inc ZPnCnt + bne .3 + + inc ZPnCnt+1 + beq .8 + +.3 lda (ZPBufPtr),y + sta W5100.DR,x + iny + bne .2 + + inc ZPBufPtr+1 + bra .2 + +.8 >AR.SELECT S0.TX.WR + lda Offset + clc + adc ZPBufCnt + pha save LO + lda Offset+1 + adc ZPBufCnt+1 + sta W5100.DR,x write HI + pla + sta W5100.DR,x write LO + + >AR.SELECT S0.CR + lda #W5100.AR.Sn.CR.SEND + sta W5100.DR,x + + plp + clc + rts +*-------------------------------------- +U2.Name >PSTR "Uthernet II" +Offset .BS 2 +TotalSize .BS 2 +*-------------------------------------- +DRV.U2 .EQ * + .PH DRV.NIC.START + +DRV.U2.START jmp DRV.U2.Write + +DRV.U2.Read php + sei + + ldx DRV.START + + >AR.SELECT S0.RX.RSR + lda W5100.DR,x get the received size HI + nop + nop + ora W5100.DR,x LO + bne .1 + + jmp DRV.U2.9 + +.1 >AR.SELECT S0.RX.RD + lda W5100.DR,x get the received ptr HI + sta Offset+1 + ldy W5100.DR,x get the received ptr LO + sty Offset + + and /RXTX.MASK + ora /RX.BASE + sta W5100.AR,x + tya + sta W5100.AR+1,x + + lda W5100.DR,x get RX.Size HI (Frame size + 2) + sta TotalSize+1 + lda W5100.DR,x get RX.Size LO + sta TotalSize + + sec + sbc #2 MACRAW:strip 2 bytes Header from Size + sta ZPBufCnt + eor #$ff + sta ZPnCnt + + lda TotalSize+1 + sbc #0 + sta ZPBufCnt + eor #$ff + sta ZPnCnt+1 + + lda ZPBufPtr+1 + pha + + ldy #0 + +.2 inc ZPnCnt + bne .3 + + inc ZPnCnt+1 + beq .8 + +.3 lda W5100.DR,x + sta (ZPBufPtr),y + iny + bne .2 + + inc ZPBufPtr+1 + bra .2 + +.8 >AR.SELECT S0.RX.RD + + lda Offset + clc + adc TotalSize + pha save LO + + lda Offset+1 + adc TotalSize+1 + sta W5100.DR,x write HI + pla + sta W5100.DR,x write LO + + >AR.SELECT S0.CR + lda #W5100.AR.Sn.CR.RCVD + sta W5100.DR,x + + pla + sta ZPBufPtr+1 + + plp + clc + rts +*-------------------------------------- +DRV.U2.9 plp + sec + rts +*-------------------------------------- +DRV.U2.Write php + sei + + >STYA ZPBufCnt + + eor #$ff + sta ZPnCnt+1 + + tya + eor #$ff + sta ZPnCnt + + >LDYA DRV.OutBuf + >STYA ZPBufPtr + + ldx DRV.START + + >AR.SELECT S0.TX.FSR + lda W5100.DR,x get send size HI + nop + nop + ldy W5100.DR,x LO + cpy ZPBufCnt + sbc ZPBufCnt+1 + bcc DRV.U2.9 + + >AR.SELECT S0.TX.WR + lda W5100.DR,x Get HI + nop + nop + ldy W5100.DR,x Get LO + and /RXTX.MASK + ora /TX.BASE + sta W5100.AR,x Write HI + sta Offset+1 + tya + sta W5100.AR+1,x Write LO + sta Offset + + ldy #0 + +.2 inc ZPnCnt + bne .3 + + inc ZPnCnt+1 + beq .8 + +.3 lda (ZPBufPtr),y + sta W5100.DR,x + iny + bne .2 + + inc ZPBufPtr+1 + bra .2 + +.8 >AR.SELECT S0.TX.WR + lda Offset + clc + adc ZPBufCnt + pha save LO + lda Offset+1 + adc ZPBufCnt+1 + sta W5100.DR,x write HI + pla + sta W5100.DR,x write LO + + >AR.SELECT S0.CR + lda #W5100.AR.Sn.CR.SEND + sta W5100.DR,x + + plp + clc + rts + + .EP + + .LIST ON +DRV.U2.SIZE .EQ *-DRV.U2 + .LIST OFF +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.vedrive.s.u2 +LOAD usr/src/sys/pm.vedrive.s +ASM diff --git a/SYS/PM.VEDRIVE.S.txt b/SYS/PM.VEDRIVE.S.txt new file mode 100644 index 00000000..850fc55c --- /dev/null +++ b/SYS/PM.VEDRIVE.S.txt @@ -0,0 +1,857 @@ +NEW + AUTO 3,1 + .LIST OFF + .OP 65C02 + .OR $2000 +* .TF sys/pm/pm.vedrive + .TF sys/pm.vedrive +*-------------------------------------- + .INB inc/macros.i + .INB inc/io.i + .INB inc/monitor.i + .INB inc/mli.i + .INB inc/mli.e.i + .INB inc/nic.i + .INB inc/nic.8900a.i + .INB inc/nic.w5100.i + .INB inc/nic.91c96.i + .INB inc/eth.i + .INB inc/net.tcpip.i + .INB inc/net.dhcp.i +*-------------------------------------- +ZPPtr1 .EQ $0 +ZPPtr2 .EQ $2 +len .EQ 4 +idx .EQ 5 +int .EQ 6 +ZPBufPtr .EQ 8 +ZPBufCnt .EQ 10 +ZPnCnt .EQ 12 +ZPCheckSum .EQ 14 +timerS .EQ 16 +timerC .EQ 17 +bRemoteMac .EQ 18 +Slotn0 .EQ 19 +*-------------------------------------- +ADT.CMD.VSD .EQ $C5 "E": Virtual Drive Command Envelope +ADT.CMD.PING .EQ $D9 "Y": PING +DRV.EntryPoint .EQ $BF41 +DRV.NIC.START .EQ $D500 +*-------------------------------------- +CONF.FBUF .EQ $4000 +CONF.LBUF .EQ $4400 +CONF.FILEPATH .EQ $4500 +FRAMEBUF .EQ $4600 +*-------------------------------------- +VEDRIVE.Init >LDYAI VEDRIVE.MSG0 + jsr PrintFYA + + jsr VEDRIVE.CheckDRV + bcc .1 + + >LDYAI VEDRIVE.DRVKO + jsr PrintFYA + rts + +.1 jsr VEDRIVE.ReadConf + bcc .2 + + >LDYAI VEDRIVE.CONFINV + jsr PrintFYA + rts + +.2 jsr VEDRIVE.CheckHW + bcc .3 + + >LDYAI VEDRIVE.NICKO + jsr PrintFYA + rts + +.3 jsr VEDRIVE.MACInit + lda CONF.ADDRESS + bne .4 + + >LDYAI VEDRIVE.DHCP + jsr PrintFYA + + jsr VEDRIVE.DHCPReq + bcc .4 + + >LDYAI VEDRIVE.DHCPKO + jsr PrintFYA + rts + +.4 jsr VEDRIVE.IPInit + + jsr VEDRIVE.ARPReq + bcc .5 + + >LDYAI VEDRIVE.IPKO + jsr PrintFYA + + rts + +.5 ldx #11 + +.6 lda CONF.ADDRESS,x + pha + dex + bpl .6 + + >LDYAI VEDRIVE.IPOK + jsr PrintFYA + + jsr VEDRIVE.Ping + bcc .7 + + >LDYAI VEDRIVE.SRVKO + jsr PrintFYA + rts + +.7 >LDYAI VEDRIVE.SRVOK + jsr PrintFYA + +* jsr VEDRIVE.SetSlot + bcc .8 + + >LDYAI VEDRIVE.NOSLOT + jsr PrintFYA + rts + +.8 pha Push slot + pha 2 times + >LDYAI VEDRIVE.DEVOK + jsr PrintFYA + + jsr VEDRIVE.Install + bcc .9 + + >LDYAI VEDRIVE.DRVIKO + jsr PrintFYA + rts + +.9 >LDYAI VEDRIVE.DRVIOK + jsr PrintFYA + rts +*-------------------------------------- +VEDRIVE.CheckDRV + ldx #COPYRIGHT.LEN + + sec + +.1 lda DRV.EntryPoint-1,x + eor COPYRIGHT-1,x + bne .9 + + dex + bne .1 + + clc + +.9 rts +*-------------------------------------- +VEDRIVE.Ping lda CONF.PORT + sta ADT.REQ.UDP.DST + + lda CONF.PORT+1 + sta ADT.REQ.UDP.DST+1 + + >LDYAI ADT.REQ + >STYA ZPBufPtr + + >LDYAI ADT.REQ.LEN + >STYA ZPBufCnt + jsr VEDRIVE.SendUDP + bcs .9 + + jsr VEDRIVE.InitTimer + +.3 jsr VEDRIVE.READ + bcc .4 + + jsr VEDRIVE.Wait + bcc .3 + + rts + +.4 jsr VEDRIVE.CheckADTRep + bcc .8 + + jsr VEDRIVE.CheckARPFrame + bra .3 + +.8 +* clc +.9 rts +*-------------------------------------- +VEDRIVE.CheckHW ldx CONF.NIC + jmp (.1,x) + +.1 .DA GS.Init + .DA U1.Init + .DA U2.Init +*-------------------------------------- +VEDRIVE.SendUDP jsr VEDRIVE.IPChecksum + jsr VEDRIVE.UDPChecksum + +VEDRIVE.SendARP ldx CONF.NIC + jmp (.1,x) + +.1 .DA U1.WRITE + .DA U1.WRITE + .DA U2.WRITE +*-------------------------------------- +VEDRIVE.READ >LDYAI FRAMEBUF + >STYA ZPBufPtr + + ldx CONF.NIC + jmp (.1,x) + +.1 .DA U1.READ + .DA U1.READ + .DA U2.READ +*-------------------------------------- +VEDRIVE.InitTimer + lda VBL + sta timerS + stz timerC + rts +*-------------------------------------- +VEDRIVE.Wait lda VBL + tax + eor timerS + bpl .8 + + stx timerS + + dec timerC + bne .8 + + sec + rts + +.8 clc + rts +*-------------------------------------- +* Find 2 free slots in DEVPTRS (D1 & D2) +*-------------------------------------- +VEDRIVE.SetSlot ldx #2 Starts at Slot1 + +.1 lda DEVPTRS,x Drive1 + cmp DEVPTRS pointing to S0D1 NODEV ? + bne .2 + + lda DEVPTRS+1,x + cmp DEVPTRS+1 + bne .2 + + lda DEVPTRS+16,x Drive2 + cmp DEVPTRS + bne .2 + + lda DEVPTRS+17,x + cmp DEVPTRS+1 + bne .2 + + lda #DRV.EntryPoint + sta DEVPTRS,x + sta DEVPTRS+16,x + lda /DRV.EntryPoint + sta DEVPTRS+1,x + sta DEVPTRS+17,x + txa + asl + asl + asl + ora #$0D + ldy DEVCNT + iny + sta DEVLST,y add Drv1 + ora #$80 + iny + sta DEVLST,y add Drv2 + sty DEVCNT + txa + lsr exit with A=SLOT + clc + rts + +.2 inx + inx + cpx #16 + bne .1 + + rts sec from CPX +*-------------------------------------- +VEDRIVE.Install ldx #PATCH.SIZE + +*.1 lda PATCH-1,x +* sta DRV.EntryPoint-1,x +* dex +* bne .1 + + bit RRAMWRAMBNK2 + bit RRAMWRAMBNK2 + + ldy #DRV.SIZE-1 + +.2 lda DRV,y + sta DRV.START,y + dey + bne .2 + + lda Slotn0 + sta DRV.START + + ldy #DRV.IP.SIZE-1 + +.3 lda DRV.IP,y + sta DRV.IP.START,y + dey + bne .3 + + ldx CONF.NIC + lda .10,x + sta ZPPtr1 + + lda .10+1,x + sta ZPPtr1+1 + + lda .20,x + eor #$ff + sta ZPnCnt + + lda .20+1,x + eor #$ff + sta ZPnCnt+1 + + lda #DRV.NIC.START + sta ZPPtr2 + lda /DRV.NIC.START + sta ZPPtr2+1 + + ldy #0 + +.4 inc ZPnCnt + bne .5 + + inc ZPnCnt+1 + beq .6 + +.5 lda (ZPPtr1),y + sta (ZPPtr2),y + iny + bne .4 + + inc ZPPtr1+1 + inc ZPPtr2+1 + bra .4 + +.6 ldy #S.UDP + +.7 lda ADT.REQ-1,y + sta DRV.OutBuf-1,y + dey + bne .7 + + bit RROMBNK1 + clc + rts +*-------------------------------------- +.10 .DA DRV.U2 + .DA DRV.U2 + .DA DRV.U2 +*-------------------------------------- +.20 .DA DRV.U2.SIZE + .DA DRV.U2.SIZE + .DA DRV.U2.SIZE +*-------------------------------------- + .INB usr/src/shared/x.printf.s +*-------------------------------------- +* ProDOS $BE41->$BE4B Patch for switching to BANK2 (10 bytes) +*-------------------------------------- +COPYRIGHT .AS "(C)APPLE " +COPYRIGHT.LEN .EQ *-COPYRIGHT +PATCH .PH DRV.EntryPoint + bit RRAMWRAMBNK2 + jsr $D002 + bit RRAMWRAMBNK1 + rts + .EP +PATCH.SIZE .EQ *-PATCH +*-------------------------------------- +* Drivers +*-------------------------------------- +* OP = 2 : Write drv1 +* OP = 3 : Read drv1 +* OP = 4 : Write drv2 +* OP = 5 : Read drv2 +* CMD = $C5+OP+BLKLO+BLKHI+CHKSUM +* DO NOT trash DRV.COMMAND...DRV.BLKNUM as ProDOS +* reuses them after Block operation +* A1,A2 are used by Disk II Driver, +* so we use it safely as Tmp Ptr +*-------------------------------------- +DRV.A1L .EQ $3C +DRV.A1H .EQ $3D +DRV.A2L .EQ $3E +DRV.A2H .EQ $3F +DRV.COMMAND .EQ $42 +DRV.UNITNUM .EQ $43 +DRV.BUFF .EQ $44 +DRV.BLKNUM .EQ $46 +*-------------------------------------- +DRV.Write .EQ DRV.NIC.START +DRV.Read .EQ DRV.NIC.START+3 +*-------------------------------------- +DRV.OutBuf .EQ $D800-S.UDP-6 Frame Buffer = S.UDP+5+512+1 bytes +DRV.OutBuf.Env .EQ DRV.OutBuf+S.UDP +DRV.OutBuf.Cmd .EQ DRV.OutBuf+S.UDP+1 +DRV.OutBuf.BlkL .EQ DRV.OutBuf+S.UDP+2 +DRV.OutBuf.BlkH .EQ DRV.OutBuf+S.UDP+3 +DRV.OutBuf.Sum .EQ DRV.OutBuf+S.UDP+4 +DRV.OutBuf.Data .EQ DRV.OutBuf+S.UDP+5 +*-------------------------------------- +DRV.InBuf .EQ $DA00 Frame Buffer = 1536 bytes +*-------------------------------------- +DRV .PH $D001 Main LC Bnk 2 $D001->$DFFF + +DRV.START .BS 1 SELF MODIFIED slot 0n + + lda DRV.COMMAND S=0,R=1,W=2,F=3 + bne .1 + + ldx #$ff return Status + ldy #$ff + +.8 lda #0 + clc + rts + +.1 cmp #3 + beq .8 Format .... + + bcs DRV.DO.CMD.ERR more....IO error + + ora #2 W=2,R=3 + ldy DRV.UNITNUM + bpl .2 + + adc #2 CC from bcs + +.2 sta DRV.OutBuf.Cmd store cmd + eor #ADT.CMD.VSD + eor DRV.BLKNUM + eor DRV.BLKNUM+1 + sta DRV.OutBuf.Sum Compute & store CheckSum + + lda DRV.BLKNUM + sta DRV.OutBuf.BlkL + lda DRV.BLKNUM+1 + sta DRV.OutBuf.BlkH +*-------------------------------------- + lda DRV.COMMAND + dec 1-1=0 if read + bne DRV.DO.CMD.W go write +*-------------------------------------- +* Read block +*-------------------------------------- +DRV.DO.CMD.R ldy #S.UDP+5 + lda /S.UDP+5 + jsr DRV.Write + + + +DRV.DO.CMD.ERR + lda #MLI.E.IO + sec + rts +*-------------------------------------- +* Write Block +*-------------------------------------- +DRV.DO.CMD.W lda #$B1 lda (),y + + lda #MLI.E.IO + sec + rts +*-------------------------------------- +DRV.RWBYTE bit RRAMWRAMBNK1 + sta (DRV.BUFF),y + bit RRAMWRAMBNK2 + rts +*-------------------------------------- + .EP +*-------------------------------------- + .LIST ON +DRV.SIZE .EQ *-DRV + .LIST OFF +*-------------------------------------- +DRV.IP .PH $D400 + +DRV.IP.START ldy #S.IP.TOTAL.LENGTH+1 + lda ZPBufCnt + sec + sbc #S.ETH.EII + sta (ZPBufPtr),y + dey + lda ZPBufCnt+1 + sbc /S.ETH.EII + sta (ZPBufPtr),y + lda #0 + ldy #S.IP.HDR.CHECKSUM + sta (ZPBufPtr),y + iny + sta (ZPBufPtr),y + + stz ZPCheckSum RESET IP CHECKSUM + stz ZPCheckSum+1 + + clc + + ldy #S.IP.V.IHL + + ldx #10 10 words for IP Header + +.1 lda (ZPBufPtr),y + adc ZPCheckSum + sta ZPCheckSum + iny + lda (ZPBufPtr),y + adc ZPCheckSum+1 + sta ZPCheckSum+1 + iny + dex + bne .1 + + ldy #S.IP.HDR.CHECKSUM + lda ZPCheckSum + adc #0 + eor #$FF + sta (ZPBufPtr),y + iny + lda ZPCheckSum+1 + adc #0 + eor #$FF + sta (ZPBufPtr),y + rts +*-------------------------------------- + clc + + ldy #S.UDP.LENGTH+1 + lda (ZPBufPtr),y + adc #S.IP.PROTOCOL.UDP + sta ZPCheckSum+1 + + dey + lda (ZPBufPtr),y + adc /S.IP.PROTOCOL.UDP (all zero) + sta ZPCheckSum + + ldy #S.IP.SRC + ldx #4 4 words for SRC & DST IP + +.2 lda (ZPBufPtr),y + adc ZPCheckSum + sta ZPCheckSum + iny + lda (ZPBufPtr),y + adc ZPCheckSum+1 + sta ZPCheckSum+1 + iny + dex + bne .2 + + ldy #S.UDP.LENGTH+1 + lda (ZPBufPtr),y + eor #$ff + tax + + dey + lda (ZPBufPtr),y + eor #$ff + ldy #S.UDP.CHECKSUM + + phy Save Offset + pha Save !ByteCount.HI + + lda #0 Reset Checksum + sta (ZPBufPtr),y + iny + sta (ZPBufPtr),y + + >LDYA ZPBufPtr + >STYA ZPPtr1 + + ldy #S.IP + +.3 inx + bne .4 + + pla + inc + beq .8 + + pha +.4 lda (ZPPtr1),y + adc ZPCheckSum + sta ZPCheckSum + + iny + bne .5 + + inc ZPPtr1+1 +.5 inx + bne .6 + + pla + inc + beq .7 + + pha + +.6 lda (ZPPtr1),y + + adc ZPCheckSum+1 + sta ZPCheckSum+1 + iny + bne .3 + + inc ZPPtr1+1 + bra .3 + +.7 adc ZPCheckSum+1 A=0 from beq .7 + sta ZPCheckSum+1 + +.8 ply + lda ZPCheckSum + adc #0 Don't forget to add last carry!!! + eor #$FF + sta (ZPBufPtr),y + iny + lda ZPCheckSum+1 + adc #0 Don't forget to add last carry!!! + eor #$FF + sta (ZPBufPtr),y + rts +*-------------------------------------- + .EP +*-------------------------------------- + .LIST ON +DRV.IP.SIZE .EQ *-DRV.IP + .LIST OFF +*-------------------------------------- +* CONTROL SECTION : +*-------------------------------------- + .DO DRV.SIZE>255 + ERROR:DRV.SIZE too big + .FIN +*-------------------------------------- + + +*-------------------------------------- + .INB usr/src/sys/pm.vedrive.s.cf + .INB usr/src/sys/pm.vedrive.s.ip + .INB usr/src/sys/pm.vedrive.s.u1 + .INB usr/src/sys/pm.vedrive.s.u2 + .INB usr/src/sys/pm.vedrive.s.gs +*-------------------------------------- +VEDRIVE.MSG0 .AZ "VEDRIVE (ADTPro Virtual Ethernet HD) Driver\n" +VEDRIVE.DRVKO .AZ "VEDRIVE (Or other custom Driver) Already Installed.\n" +VEDRIVE.CONF .AZ "Checking %S...\n" +VEDRIVE.CONFKO .AZ "Error reading VEDRIVE.CONF file.\n" +VEDRIVE.CONFSYN .AZ "Syntax error in VEDRIVE.CONF file.\n" +VEDRIVE.CONFINV .AZ "Invalid VEDRIVE.CONF file.\n" +VEDRIVE.NICKO .AZ "Hardware not detected.\n" +VEDRIVE.NICOK .AZ "%S Rev. %d.%d Found At Slot %d.\n" +VEDRIVE.DHCP .AZ "Querying DHCP...\n" +VEDRIVE.DHCPKO .AZ "No response from DHCP.\n" +VEDRIVE.IPKO .AZ "Unable to setup IP configuration.\n" +VEDRIVE.IPOK .AZ "IP config : %d.%d.%d.%d/%d.%d.%d.%d GW=%d.%d.%d.%d\n" +VEDRIVE.SRV .AZ "Contacting ADTPro Server..." +VEDRIVE.SRVKO .AZ "No Response From ADTPro Server.\n" +VEDRIVE.SRVOK .AZ "ADTPro Server Is Online.\n" +VEDRIVE.NOSLOT .AZ "No ProDOS device slot available.\n" +VEDRIVE.DEVOK .AZ "VEDRIVE Installed 2 devices at S%d,D1 & S%d,D2.\n" +VEDRIVE.DRVIKO .AZ "Unable to install VEDRIVE.\n" +VEDRIVE.DRVIOK .AZ "VEDRIVE Successfully Installed.\n" +*-------------------------------------- +CONF.FILENAME .AS "vedrive.conf" +CONF.FILENAME.L .EQ *-CONF.FILENAME +*-------------------------------------- +CONF.KW >PSTR "nic" + >PSTR "slot" + >PSTR "address" + >PSTR "netmask" + >PSTR "gateway" + >PSTR "server" + >PSTR "port" + .HS 00 +*-------------------------------------- +CONF.KW.NIC >PSTR "lancegs" + >PSTR "uthernet" + >PSTR "uthernet2" + .HS 00 +*-------------------------------------- +CONF.NIC .HS FF +CONF.SLOT .HS 00 +CONF.IPCFG .EQ * +CONF.SRCMAC .HS 000E3A123456 +CONF.ADDRESS .HS 00000000 +CONF.MASK .HS 00000000 +CONF.GATEWAY .HS 00000000 +CONF.SERVER .HS 00000000 +CONF.PORT .DA /1977,#1977 +*-------------------------------------- +MLIGETPREFIX.P .DA #1 + .DA CONF.FILEPATH +*-------------------------------------- +MLIOPEN.P .DA #3 + .DA CONF.FILEPATH + .DA CONF.FBUF + .BS 1 FILE# +*-------------------------------------- +MLINEWLINE.P .DA #3 + .BS 1 + .DA #$7F + .DA #$0D +*-------------------------------------- +MLIREAD.P .DA #4 + .BS 1 + .DA CONF.LBUF + .DA 255 + .BS 2 +*-------------------------------------- +MLICLOSE.P .DA #1 + .BS 1 +*-------------------------------------- +ARP.REQ .HS FFFFFFFFFFFF S.ETH.DSTMAC +ARP.REQ.SRCMAC .BS 6 +ARP.REQ.ETYPE .DA /S.ETH.EII.TYPE.ARP + .DA #S.ETH.EII.TYPE.ARP + .HS 0001.0800.06.04 +ARP.REQ.OP .DA /S.ARP.OPERATION.REQ + .DA #S.ARP.OPERATION.REQ +ARP.REQ.SHA .BS 6 +ARP.REQ.SPA .BS 4 +ARP.REQ.THA .BS 6 +ARP.REQ.TPA .BS 4 +*-------------------------------------- +ARP.REP .EQ * +ARP.REP.DSTMAC .BS 6 +ARP.REP.SRCMAC .BS 6 +ARP.REP.ETYPE .DA /S.ETH.EII.TYPE.ARP + .DA #S.ETH.EII.TYPE.ARP + .HS 0001.0800.06.04 +ARP.REP.OP .DA /S.ARP.OPERATION.REP + .DA #S.ARP.OPERATION.REP +ARP.REP.SHA .BS 6 +ARP.REP.SPA .BS 4 +ARP.REP.THA .BS 6 +ARP.REP.TPA .BS 4 +*-------------------------------------- +DHCP.DISC .HS FFFFFFFFFFFF DST MAC +DHCP.DISC.SRCMAC .BS 6 + .DA /S.ETH.EII.TYPE.IP + .DA #S.ETH.EII.TYPE.IP +DHCP.DISC.IP .HS 4500 + .DA /DHCP.DISC.END-DHCP.DISC.IP,#DHCP.DISC.END-DHCP.DISC.IP + .HS 0000 + .HS 0000 + .DA #64 TTL + .DA #S.IP.PROTOCOL.UDP + .BS 2 IP CHECKSUM + .HS 00000000 + .HS FFFFFFFF +*-------------------------------------- +DHCP.DISC.UDP .DA #0,#UDP.PORT.DHCPC + .DA #0,#UDP.PORT.DHCPS + .DA /DHCP.DISC.END-DHCP.DISC.UDP,#DHCP.DISC.END-DHCP.DISC.UDP + .BS 2 UDP CHECKSUM +*-------------------------------------- + .HS 01010600 OP,HTYPE,HLEN,HOPS +DHCP.DISC.XID .HS 54328574 + .HS 0000 SECS + .DA S.DHCP.FLAGS.BRDCST + .HS 00000000 CIADDR +DHCP.DISC.YIADDR .HS 00000000 + .HS 00000000 SIADDR +DHCP.DISC.GIADDR .HS 00000000 +DHCP.DISC.CHADDR .HS 00000000.00000000.00000000.00000000 + .BS 64 SNAME + .BS 128 FILE + .HS 63825363 COOKIE + .HS 3501 OPT + .DA #S.DHCP.OPTIONS.DHCPDiscover + .HS 37020103FF 37040103060FFF +DHCP.DISC.END .EQ * +DHCP.DISC.LEN .EQ *-DHCP.DISC +*-------------------------------------- +DHCP.REQ .HS FFFFFFFFFFFF DST MAC +DHCP.REQ.SRCMAC .BS 6 + .DA /S.ETH.EII.TYPE.IP + .DA #S.ETH.EII.TYPE.IP +DHCP.REQ.IP .HS 4500 + .DA /DHCP.REQ.END-DHCP.REQ.IP,#DHCP.REQ.END-DHCP.REQ.IP + .HS 0000 + .HS 0000 + .DA #64 TTL + .DA #S.IP.PROTOCOL.UDP + .BS 2 IP CHECKSUM + .HS 00000000 + .HS FFFFFFFF +*-------------------------------------- +DHCP.REQ.UDP .DA #0,#UDP.PORT.DHCPC + .DA #0,#UDP.PORT.DHCPS + .DA /DHCP.REQ.END-DHCP.REQ.UDP,#DHCP.REQ.END-DHCP.REQ.UDP + .BS 2 UDP CHECKSUM +*-------------------------------------- + .HS 01010600 OP,HTYPE,HLEN,HOPS +DHCP.REQ.XID .HS 54328574 + .HS 0000 SECS + .DA S.DHCP.FLAGS.BRDCST + .HS 00000000 CIADDR +DHCP.REQ.YIADDR .HS 00000000 + .HS 00000000 SIADDR + .HS 00000000 GIADDR +DHCP.REQ.CHADDR .HS 00000000.00000000.00000000.00000000 + .BS 64 SNAME + .BS 128 FILE + .HS 63825363 COOKIE + .HS 3501 OPT + .DA #S.DHCP.OPTIONS.DHCPRequest + .HS 3204 +DHCP.REQ.OPT.REQIP .BS 4 + .HS 3604 +DHCP.REQ.OPT.SVRIP .BS 4 + .HS FF +DHCP.REQ.END .EQ * +DHCP.REQ.LEN .EQ *-DHCP.REQ +*-------------------------------------- +ADT.REQ +ADT.REQ.DSTMAC .BS 6 DST MAC +ADT.REQ.SRCMAC .BS 6 + .DA /S.ETH.EII.TYPE.IP + .DA #S.ETH.EII.TYPE.IP +ADT.REQ.IP .HS 4500 + .DA /ADT.REQ.END-ADT.REQ.IP,#ADT.REQ.END-ADT.REQ.IP + .HS 0000 + .HS 0000 + .DA #64 TTL + .DA #S.IP.PROTOCOL.UDP + .BS 2 IP CHECKSUM +ADT.REQ.IP.SRC .BS 4 SRC IP +ADT.REQ.IP.DST .BS 4 DST IP +*-------------------------------------- +ADT.REQ.UDP .DA #$C0,#$00 SRC PORT +ADT.REQ.UDP.DST .BS 2 DST PORT + .DA /ADT.REQ.END-ADT.REQ.UDP,#ADT.REQ.END-ADT.REQ.UDP + .BS 2 UDP CHECKSUM +*-------------------------------------- + .DA #ADT.CMD.VSD + .HS 030000C6 READ D1, BLK 0 +ADT.REQ.END .EQ * +ADT.REQ.LEN .EQ *-ADT.REQ +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.vedrive.s +ASM diff --git a/SYS/PM.VSDRIVE.S.txt b/SYS/PM.VSDRIVE.S.txt new file mode 100644 index 00000000..80133c3e --- /dev/null +++ b/SYS/PM.VSDRIVE.S.txt @@ -0,0 +1,622 @@ +NEW + AUTO 3,1 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF sys/pm/pm.vsdrive +*-------------------------------------- + .INB inc/macros.i + .INB inc/io.i + .INB inc/monitor.i + .INB inc/mli.i + .INB inc/mli.e.i + .INB inc/com.6551.i +*-------------------------------------- +TmpPtr1 .EQ $0 +ADT.CMD.VSD .EQ $C5 "E": Virtual Drive Command Envelope +ADT.CMD.PING .EQ $D9 "Y": PING +DRV.EntryPoint .EQ $BF41 +*-------------------------------------- +VSDRIVE.Init >LDYAI VSDRIVE.MSG0 + jsr PrintFYA + + jsr VSDRIVE.Check + bcs .90 + + stz TmpPtr1 + lda #$C1 + sta TmpPtr1+1 + +.2 jsr SSC.Detect + bcs .99 + + lda TmpPtr1+1 Slot Cn + and #$0F + pha slot n + >LDYAI VSDRIVE.SSCOK + jsr PrintFYA + + jsr VSDRIVE.Ping + bcs .92 + + >LDYAI VSDRIVE.SRVOK + jsr PrintFYA + + jsr VSDRIVE.SetSlot + bcs .91 + + pha Push slot + pha 2 times + >LDYAI VSDRIVE.DEVOK + jsr PrintFYA + + jsr VSDRIVE.Install + >LDYAI VSDRIVE.OK + jsr PrintFYA + rts + +.90 >LDYAI VSDRIVE.DRVKO + jsr PrintFYA + rts + +.91 >LDYAI VSDRIVE.NOSLOT + jsr PrintFYA + rts + +.92 pha Push EC + >LDYAI VSDRIVE.SRVKO + jsr PrintFYA + + inc TmpPtr1+1 + lda TmpPtr1+1 + cmp #$C8 + bne .2 Go try next SSC.... + +.99 >LDYAI VSDRIVE.SSCKO + jsr PrintFYA + rts +*-------------------------------------- +VSDRIVE.Check ldx #COPYRIGHT.LEN + + sec + +.1 lda DRV.EntryPoint-1,x + eor COPYRIGHT-1,x + bne .9 + + dex + bne .1 + + clc + +.9 rts +*-------------------------------------- +SSC.Detect +.1 ldx #DEVSIG.Value-DEVSIG.Offset-1 + +.2 ldy DEVSIG.Offset,x + lda (TmpPtr1),y + cmp DEVSIG.Value,x + bne .3 + + dex + bpl .2 + + clc + rts + +.3 inc TmpPtr1+1 no match, try next slot.... + lda TmpPtr1+1 + cmp #$C8 + bne .1 + + sec + rts +*-------------------------------------- +VSDRIVE.Ping lda TmpPtr1+1 A=SlotCN + asl + asl + asl + asl + clc + adc #$8F + tax X=SlotN0 + + php + sei + + stz SSC.RESET-$8F,x + + lda #SSC.CTL.1S+SSC.CTL.8D+SSC.CTL.CLKINT+SSC.CTL.B115200 + sta SSC.CTL-$8F,x + + lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.TE+SSC.CMD.DTR + sta SSC.CMD-$8F,x + + lda SSC.DATA-$8F,x discard any garbage byte + lda SSC.STATUS-$8F,x clear any IRQ pending + + stz VSDRIVE.Ping.TO + stz VSDRIVE.Ping.TO+1 + +.10 jsr VSDRIVE.IncTimer Wait....... + bne .10 + + ldy #10 + +.1 lda SSC.STATUS-$8F,x + and #SSC.STATUS.nDCD Ready for transmit? + beq .20 + + jsr VSDRIVE.IncTimer Wait....... + bne .1 + + dey + bne .1 + + lda #1 + bra .9 Time Out..... + +.20 ldy #5 5 bytes to send + +.2 lda VSDRIVE.CMDS-1,y + sta SSC.DATA-$8F,x + +.3 lda SSC.STATUS-$8F,x + and #SSC.STATUS.TDRE char transmitted? + bne .4 + + jsr VSDRIVE.IncTimer + bne .3 + + lda #2 + bra .9 + +.4 dey + bne .2 next byte + + lda #521^$ffff 522 bytes to receive + sta VSDRIVE.Ping.BC + lda /521^$ffff + sta VSDRIVE.Ping.BC+1 + + stz VSDRIVE.Ping.TO + stz VSDRIVE.Ping.TO+1 + + ldy #3 EC=3 if no byte received + +.5 lda SSC.STATUS-$8F,x + and #SSC.STATUS.RDRF incoming char? + bne .6 + + jsr VSDRIVE.IncTimer + bne .5 + + tya + +.9 stz SSC.CMD-$8F,x Applewin Bug ??? + + stz SSC.RESET-$8F,x + + plp + sec + rts + +.6 ldy #4 EC=4 if recieved only partial reply + + lda SSC.DATA-$8F,x + inc VSDRIVE.Ping.BC + bne .5 + + inc VSDRIVE.Ping.BC+1 + bne .5 + + lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.TE + sta SSC.CMD-$8F,x + + plp + clc + rts +*-------------------------------------- +VSDRIVE.IncTimer + inc VSDRIVE.Ping.TO + bne .8 + + inc VSDRIVE.Ping.TO+1 +.8 rts +*-------------------------------------- +VSDRIVE.CMDS .HS C6.00.00.03 + .DA #ADT.CMD.VSD +* C6=C5 eor 03 eor 00 eor 00 +VSDRIVE.Ping.TO .BS 2 +VSDRIVE.Ping.BC .BS 2 +*-------------------------------------- +* Find 2 free slots in DEVPTRS (D1 & D2) +*-------------------------------------- +VSDRIVE.SetSlot ldx #2 Starts at Slot1 + +.1 lda DEVPTRS,x Drive1 + cmp DEVPTRS pointing to S0D1 NODEV ? + bne .2 + + lda DEVPTRS+1,x + cmp DEVPTRS+1 + bne .2 + + lda DEVPTRS+16,x Drive2 + cmp DEVPTRS + bne .2 + + lda DEVPTRS+17,x + cmp DEVPTRS+1 + bne .2 + + lda #DRV.EntryPoint + sta DEVPTRS,x + sta DEVPTRS+16,x + lda /DRV.EntryPoint + sta DEVPTRS+1,x + sta DEVPTRS+17,x + txa + asl + asl + asl + ora #$0D + ldy DEVCNT + iny + sta DEVLST,y add Drv1 + ora #$80 + iny + sta DEVLST,y add Drv2 + sty DEVCNT + txa + lsr exit with A=SLOT + clc + rts + +.2 inx + inx + cpx #16 + bne .1 + + rts sec from CPX +*-------------------------------------- +VSDRIVE.Install ldx #PATCH.LEN + +.1 lda PATCH-1,x + sta DRV.EntryPoint-1,x + dex + bne .1 + + bit RRAMWRAMBNK2 + bit RRAMWRAMBNK2 + + ldx #DRV.SIZE + +.2 lda DRV-1,x + sta $D000,x + dex + bne .2 + + lda TmpPtr1+1 A=SlotCN + asl + asl + asl + asl + + ora #SSC.DATA + sta DRV.SSCWrite.D+1 + sta DRV.SSCSend.D+1 + sta DRV.SSCGet.D+1 + + inc #SSC.STATUS + + sta DRV.SSCWrite.S+1 + sta DRV.SSCSend.S+1 + sta DRV.SSCGet.S+1 + sta DRV.SSCClose.S+1 + + inc #SSC.CMD + + sta DRV.INIT.C+1 + sta DRV.SSCClose.C+1 + + lda TmpPtr1+1 A=SlotCN + and #$0F + sta DRV.START + + bit RROMBNK1 + + clc + rts +*-------------------------------------- + .INB usr/src/shared/x.printf.s +*-------------------------------------- +DEVSIG.Offset .HS 05070B0C +DEVSIG.Value .HS 38180131 +VSDRIVE.MSG0 .AZ "VSDRIVE (ADTPro Virtual Serial HD) Driver For A2osX\n" +VSDRIVE.DRVKO .AZ "VSDRIVE (Or other custom Driver) Already Installed.\n" +VSDRIVE.SSCKO .AZ "SSC Not Detected.\n" +VSDRIVE.SSCOK .AZ "SSC Found At Slot %d.\nContacting ADTPro Server..." +VSDRIVE.SRVKO .AZ "No Response From ADTPro Server (EC=%d).\n" +VSDRIVE.SRVOK .AZ "ADTPro Server Is Online.\n" +VSDRIVE.NOSLOT .AZ "No ProDOS device slot available.\n" +VSDRIVE.DEVOK .AZ "VSDRIVE Installed 2 devices at S%d,D1 & S%d,D2.\n" +VSDRIVE.OK .AZ "VSDRIVE Driver Successfully Installed.\n" +*-------------------------------------- +* ProDOS $BE41->$BE4B Patch for switching to BANK2 (10 bytes) +*-------------------------------------- +COPYRIGHT .AS "(C)APPLE " +COPYRIGHT.LEN .EQ *-COPYRIGHT +PATCH .PH DRV.EntryPoint + bit RRAMWRAMBNK2 + jsr $D002 + bit RRAMWRAMBNK1 + rts + .EP +PATCH.LEN .EQ *-PATCH +*-------------------------------------- +* Driver +*-------------------------------------- +* OP = 2 : Write drv1 +* OP = 3 : Read drv1 +* OP = 4 : Write drv2 +* OP = 5 : Read drv2 +* CMD = $C5+OP+BLKLO+BLKHI+CHKSUM +* DO NOT trash DRV.COMMAND...DRV.BLKNUM as ProDOS +* reuses them after Block operation +* PC,A1,A2 are used by Disk II Driver, +* so we use it safely as Tmp Ptr +*-------------------------------------- +*DRV.PCL .EQ $3A +*DRV.PCH .EQ $3B +*DRV.A1L .EQ $3C +*DRV.A1H .EQ $3D +*DRV.A2L .EQ $3E +*DRV.A2H .EQ $3F +*-------------------------------------- + .DUMMY + .OR $3A +DRV.CmdBuf.Sum .BS 1 Reverse order for dey +DRV.CmdBuf.BlkH .BS 1 +DRV.CmdBuf.BlkL .BS 1 +DRV.CmdBuf.Cmd .BS 1 +DRV.CmdBuf.Env .BS 1 + .ED +*-------------------------------------- +DRV.COMMAND .EQ $42 +DRV.UNITNUM .EQ $43 +DRV.BUFF .EQ $44 +DRV.BLKNUM .EQ $46 +*-------------------------------------- +DRV .PH $D001 Main LC Bnk 2 $D001->$DFFF + +DRV.START .BS 1 SELF MODIFIED slot 0n + + lda DRV.COMMAND S=0,R=1,W=2,F=3 + bne .1 + + ldx #$ff return Status + ldy #$ff + +.8 lda #0 + clc + rts + +.1 cmp #3 + beq .8 Format .... + bcc DRV.START.OK + +DRV.START.IO lda #MLI.E.IO + sec + rts + +DRV.START.OK tax + + ora #2 W=2,R=3 + + bit DRV.UNITNUM + bpl .2 + + adc #2 CC from bcs + +.2 sta DRV.CmdBuf.Cmd store cmd + + lda #ADT.CMD.VSD + sta DRV.CmdBuf.Env + + lda DRV.BLKNUM + sta DRV.CmdBuf.BlkL + + lda DRV.BLKNUM+1 + sta DRV.CmdBuf.BlkH + + stz DRV.CmdBuf.Sum +*-------------------------------------- +* send CMD+CS +*-------------------------------------- + php + sei + + phx + + ldy #DRV.200.LEN-1 + +.1 lda DRV.200,y + sta $200,y + dey + bpl .1 + +* lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.TE+SSC.CMD.DTR +DRV.INIT.C inc SSC.CMD SELF MODIFIED + + ldy #4 Send 5 bytes including Sum + +.3 lda DRV.CmdBuf.Sum,y + jsr DRV.SSCSend + eor DRV.CmdBuf.Sum + sta DRV.CmdBuf.Sum + dey + bne .3 + + jsr DRV.SSCSend A = Sum +*-------------------------------------- + plx + dex 1-1=0 if read + bne DRV.DO.CMD.W go write +*-------------------------------------- +* Read block +*-------------------------------------- +DRV.DO.CMD.R ldy #4 Read Back and check 4 bytes + +.1 jsr DRV.SSCGet + eor DRV.CmdBuf.Sum,y + bne DRV.DO.CMD.ERR + + dey + bne .1 + + ldy #4 Read 4 bytes DATE/TIME + 1 Byte Checksum + +.2 jsr DRV.SSCGet + + eor DRV.CmdBuf.Sum + sta DRV.CmdBuf.Sum + dey + bpl .2 + + tay Last EOR was with Checksum, must be 0 + bne DRV.DO.CMD.ERR + +* Y=0 from TAY + +* stz DRV.CmdBuf.Sum + + sec + .HS 90 BCC +.3 clc + +.4 jsr DRV.SSCGet + jsr $200 + eor DRV.CmdBuf.Sum + sta DRV.CmdBuf.Sum + iny + bne .4 + + inc DRV.BUFF+1 + bcs .3 + + dec DRV.BUFF+1 + dec DRV.BUFF+1 + + jsr DRV.SSCGet + eor DRV.CmdBuf.Sum + beq DRV.DO.CMD.OK +*-------------------------------------- +DRV.DO.CMD.ERR jsr DRV.SSCClose + jmp DRV.START.IO +*-------------------------------------- +* Write Block +*-------------------------------------- +DRV.DO.CMD.W lda #$B1 lda (),y + + sta $203 + + ldy #0 + + stz DRV.CmdBuf.Sum + + sec + .HS 90 BCC +DRV.SSCWrite.1 clc + +DRV.SSCWrite.2 jsr $200 + + tax + +DRV.SSCWrite.S lda SSC.STATUS SELF MODIFIED + and #SSC.STATUS.TDRE Outgoing char? + beq DRV.SSCWrite.S + +DRV.SSCWrite.D stx SSC.DATA SELF MODIFIED + + txa + + eor DRV.CmdBuf.Sum + sta DRV.CmdBuf.Sum + iny + bne DRV.SSCWrite.2 + + inc DRV.BUFF+1 + bcs DRV.SSCWrite.1 + + dec DRV.BUFF+1 + dec DRV.BUFF+1 + +* A = DRV.CmdBuf.Sum + + jsr DRV.SSCSend + +* read back CMD + ldy #4 Read 5 bytes (echo from server) + +.3 jsr DRV.SSCGet + eor DRV.CmdBuf.Sum,y Check 5 bytes (including block Sum) + bne DRV.DO.CMD.ERR + + dey + bpl .3 +*-------------------------------------- +DRV.DO.CMD.OK +*-------------------------------------- +DRV.SSCClose +* lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.TE +DRV.SSCClose.C dec SSC.CMD SELF MODIFIED +DRV.SSCClose.S bit SSC.STATUS SELF MODIFIED + bmi DRV.SSCClose.S + + plp + clc + rts +*-------------------------------------- +DRV.SSCSend tax + +DRV.SSCSend.S lda SSC.STATUS SELF MODIFIED + and #SSC.STATUS.TDRE Outgoing char? + beq DRV.SSCSend.S + +DRV.SSCSend.D stx SSC.DATA SELF MODIFIED + + txa Restore A for checksumming + + rts +*-------------------------------------- +DRV.SSCGet +DRV.SSCGet.S lda SSC.STATUS SELF MODIFIED + and #SSC.STATUS.RDRF incoming char? + beq DRV.SSCGet + +DRV.SSCGet.D lda SSC.DATA SELF MODIFIED + rts +*-------------------------------------- +DRV.200 bit RRAMWRAMBNK1 + sta (DRV.BUFF),y + bit RRAMWRAMBNK2 + rts +DRV.200.LEN .EQ *-DRV.200 +*-------------------------------------- + .EP +*-------------------------------------- + .LIST ON +DRV.SIZE .EQ *-DRV + .LIST OFF +*-------------------------------------- +* CONTROL SECTION : +*-------------------------------------- + .DO DRV.SIZE>255 +* ERROR:DRV.SIZE too big + .FIN +*-------------------------------------- +MAN +SAVE usr/src/sys/pm.vsdrive.s +ASM