KMs & PMs Cleanup #2

This commit is contained in:
burniouf 2022-03-13 13:58:15 +01:00
parent cec2764d5c
commit 402c85d065
10 changed files with 4380 additions and 0 deletions

181
SYS/PM.APPLETALK.S.txt Normal file
View File

@ -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

323
SYS/PM.NSC.S.txt Normal file
View File

@ -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

796
SYS/PM.RAMWORKS.S.txt Normal file
View File

@ -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

379
SYS/PM.VEDRIVE.S.CF.txt Normal file
View File

@ -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

17
SYS/PM.VEDRIVE.S.GS.txt Normal file
View File

@ -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

529
SYS/PM.VEDRIVE.S.IP.txt Normal file
View File

@ -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

245
SYS/PM.VEDRIVE.S.U1.txt Normal file
View File

@ -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

431
SYS/PM.VEDRIVE.S.U2.txt Normal file
View File

@ -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

857
SYS/PM.VEDRIVE.S.txt Normal file
View File

@ -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

622
SYS/PM.VSDRIVE.S.txt Normal file
View File

@ -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