mirror of
https://github.com/A2osX/A2osX.git
synced 2024-05-31 16:41:30 +00:00
KMs & PMs Cleanup #2
This commit is contained in:
parent
cec2764d5c
commit
402c85d065
181
SYS/PM.APPLETALK.S.txt
Normal file
181
SYS/PM.APPLETALK.S.txt
Normal 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
323
SYS/PM.NSC.S.txt
Normal 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
796
SYS/PM.RAMWORKS.S.txt
Normal 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
379
SYS/PM.VEDRIVE.S.CF.txt
Normal 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
17
SYS/PM.VEDRIVE.S.GS.txt
Normal 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
529
SYS/PM.VEDRIVE.S.IP.txt
Normal 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
245
SYS/PM.VEDRIVE.S.U1.txt
Normal 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
431
SYS/PM.VEDRIVE.S.U2.txt
Normal 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
857
SYS/PM.VEDRIVE.S.txt
Normal 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
622
SYS/PM.VSDRIVE.S.txt
Normal 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
|
Loading…
Reference in New Issue
Block a user