A2osX/SYS/PM.VEDRIVE.S.BK.txt

411 lines
7.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
*--------------------------------------
* 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.BLK .PH DRV.BLK.START Main LC Bnk 2 $D400->$DFFF
DRV.BLK.Slot0n .BS 1
lda DRV.COMMAND S=0,R=1,W=2,F=3
bne .1
bit DRV.UNITNUM return Status
bmi .3
ldx DRV.D1TotalBlks
ldy DRV.D1TotalBlks+1
bra .8
.3 ldx DRV.D2TotalBlks
ldy DRV.D2TotalBlks+1
.8 lda #0
clc
rts
.1 cmp #3
beq .8 Format ....
bcs DRV.BLK.CMD.ERR more....IO error
ora #2 W=2,R=3
ldy DRV.UNITNUM
bpl .2
adc #2 CC from bcs
.2 sta DRV.UDPBuf.Cmd store cmd
eor #ADT.CMD.VSD
eor DRV.BLKNUM
eor DRV.BLKNUM+1
sta DRV.UDPBuf.Sum Compute & store CheckSum
lda DRV.BLKNUM
sta DRV.UDPBuf.BlkL
lda DRV.BLKNUM+1
sta DRV.UDPBuf.BlkH
*--------------------------------------
lda DRV.COMMAND
dec 1-1=0 if read
bne DRV.BLK.CMD.W go write
*--------------------------------------
* Read block
*--------------------------------------
DRV.BLK.CMD.R >LDYAI S.UDP+5
jsr DRV.NIC.SendUDP
bcs DRV.BLK.CMD.ERR
jsr DRV.BLK.GetFrame
bcs .9
ldy #DRV.R200.L
.6 lda DRV.R200-1,y
sta $200-1,y
dey
bne .6
inc DRV.BUFF+1
jsr $200
dec DRV.R200.DEC
dec DRV.BUFF+1
jsr $200
clc
.9 rts
DRV.BLK.CMD.ERR lda #MLI.E.IO
sec
rts
*--------------------------------------
* Write Block
*--------------------------------------
DRV.BLK.CMD.W ldy #DRV.W200.L
.1 lda DRV.W200-1,y
sta $200-1,y
dey
bne .1
inc DRV.BUFF+1
stz DRV.UDPBuf.Data+512
jsr $200
dec DRV.W200.DEC
dec DRV.BUFF+1
jsr $200
>LDYAI S.UDP+5+512+1
jsr DRV.NIC.SendUDP
bcs DRV.BLK.CMD.ERR
jsr DRV.BLK.GetFrame
bcs .9
clc
.9 rts
*--------------------------------------
DRV.BLK.GetFrame
stz DRV.TimeOut
.1 lda VBL
.2 pha
jsr DRV.NIC.Rcvd
pla
bcc .3
eor VBL
bpl .2
dec DRV.TimeOut
bne .1
lda #MLI.E.IO
* sec
rts
.3 jsr DRV.BLK.CheckFrame
bcs .1
rts
*--------------------------------------
DRV.BLK.CheckFrame
lda DRV.InBuf+S.ETH.EII.TYPE
cmp /S.ETH.EII.TYPE.IP
bne .9
lda DRV.InBuf+S.ETH.EII.TYPE+1
cmp #S.ETH.EII.TYPE.IP
beq .4
cmp #S.ETH.EII.TYPE.ARP
bne .9
lda DRV.InBuf+S.ARP.OPERATION+1
cmp #S.ARP.OPERATION.REQ
bne .9
ldx #3
.1 lda DRV.InBuf+S.ARP.SPA,x
cmp DRV.UDPBuf+S.IP.DST,x
bne .9
dex
bpl .1
jsr DRV.NIC.SendARP
.9 sec
rts
.4 lda DRV.InBuf+S.IP.PROTOCOL
cmp #S.IP.PROTOCOL.UDP
bne .9
ldx #3
.5 lda DRV.InBuf+S.IP.SRC,x
cmp DRV.UDPBuf+S.IP.DST,x
bne .9
lda DRV.InBuf+S.IP.DST,x
cmp DRV.UDPBuf+S.IP.SRC,x
bne .9
dex
bpl .5
lda DRV.InBuf+S.TCPUDP.SRCPORT
cmp DRV.UDPBuf+S.TCPUDP.DSTPORT
bne .9
lda DRV.InBuf+S.TCPUDP.SRCPORT+1
cmp DRV.UDPBuf+S.TCPUDP.DSTPORT+1
bne .9
clc
rts
*--------------------------------------
DRV.BLK.IPUDPCheksum
stz DRV.UDPBuf+S.IP.HDR.CHECKSUM
stz DRV.UDPBuf+S.IP.HDR.CHECKSUM+1
stz DRV.CheckSum
stz DRV.CheckSum+1
lda DRV.FrameSize
sec
sbc #S.ETH.EII
sta DRV.UDPBuf+S.IP.TOTAL.LENGTH+1
lda DRV.FrameSize+1
sbc /S.ETH.EII
sta DRV.UDPBuf+S.IP.TOTAL.LENGTH
clc
ldy #S.IP.V.IHL
ldx #10 10 words for IP Header
.1 lda DRV.UDPBuf,y
adc DRV.CheckSum
sta DRV.CheckSum
iny
lda DRV.UDPBuf,y
adc DRV.CheckSum+1
sta DRV.CheckSum+1
iny
dex
bne .1
lda DRV.CheckSum
adc #0
eor #$FF
sta DRV.UDPBuf+S.IP.HDR.CHECKSUM
lda DRV.CheckSum+1
adc #0
eor #$FF
sta DRV.UDPBuf+S.IP.HDR.CHECKSUM+1
*--------------------------------------
stz DRV.UDPBuf+S.UDP.CHECKSUM
stz DRV.UDPBuf+S.UDP.CHECKSUM+1
lda DRV.FrameSize
sec
sbc #S.IP
sta DRV.UDPBuf+S.UDP.LENGTH+1
pha
eor #$ff
sta DRV.nCnt
lda DRV.FrameSize+1
sbc /S.IP
sta DRV.UDPBuf+S.UDP.LENGTH
tax
eor #$ff
sta DRV.nCnt+1
clc
pla A,X = UDP Len
adc #S.IP.PROTOCOL.UDP
sta DRV.CheckSum+1
txa
adc /S.IP.PROTOCOL.UDP (all zero)
sta DRV.CheckSum
ldy #S.IP.SRC
ldx #4 4 words for SRC & DST IP
.2 lda DRV.UDPBuf,y
adc DRV.CheckSum
sta DRV.CheckSum
iny
lda DRV.UDPBuf,y
adc DRV.CheckSum+1
sta DRV.CheckSum+1
iny
dex
bne .2
>LDYAI DRV.UDPBuf
>STYA DRV.A1L
ldy #S.IP
.3 inc DRV.nCnt
bne .4
inc DRV.nCnt+1
beq .8
.4 lda (DRV.A1L),y
adc DRV.CheckSum
sta DRV.CheckSum
iny
bne .5
inc DRV.A1H
.5 inc DRV.nCnt
bne .6
inc DRV.nCnt+1
beq .7
.6 lda (DRV.A1L),y
adc DRV.CheckSum+1
sta DRV.CheckSum+1
iny
bne .3
inc DRV.A1H
bra .3
.7 lda #0
adc DRV.CheckSum+1
sta DRV.CheckSum+1
.8 lda DRV.CheckSum
adc #0 Don't forget to add last carry!!!
eor #$FF
sta DRV.UDPBuf+S.UDP.CHECKSUM
lda DRV.CheckSum+1
adc #0 Don't forget to add last carry!!!
eor #$FF
sta DRV.UDPBuf+S.UDP.CHECKSUM+1
rts
*--------------------------------------
DRV.R200 lda DRV.InBuf+S.UDP+10+256,y
DRV.R200.DEC .EQ *-DRV.R200+$1ff
bit RRAMWRAMBNK1
sta (DRV.BUFF),y
bit RRAMWRAMBNK2
iny
bne DRV.R200
rts
DRV.R200.L .EQ *-DRV.R200
*--------------------------------------
DRV.W200 bit RRAMWRAMBNK1
lda (DRV.BUFF),y
bit RRAMWRAMBNK2
sta DRV.UDPBuf.Data+256,y
DRV.W200.DEC .EQ *-DRV.W200+$1ff
eor DRV.UDPBuf.Data+512
sta DRV.UDPBuf.Data+512
iny
bne DRV.W200
rts
DRV.W200.L .EQ *-DRV.W200
*--------------------------------------
DRV.D1TotalBlks .BS 2
DRV.D2TotalBlks .BS 2
DRV.BLK.Slotn0 .BS 1 SELF MODIFIED slot n0
DRV.TimeOut .BS 1
DRV.FrameSize .BS 2
DRV.nCnt .BS 2
DRV.CheckSum .BS 2
*--------------------------------------
.EP
*--------------------------------------
.LIST ON
DRV.BLK.SIZE .EQ *-DRV.BLK
.LIST OFF
*--------------------------------------
MAN
SAVE usr/src/sys/pm.vedrive.s.bk
LOAD usr/src/sys/pm.vedrive.s
ASM