mirror of
https://github.com/A2osX/A2osX.git
synced 2025-01-12 17:30:23 +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…
x
Reference in New Issue
Block a user