A2osX/SYS/KM.VSDRIVE.S.txt

594 lines
11 KiB
Plaintext
Raw Normal View History

NEW
2020-08-31 15:29:32 +00:00
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
2020-08-31 15:29:32 +00:00
.TF sys/km.vsdrive
*--------------------------------------
2020-07-23 10:18:11 +00:00
.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
*--------------------------------------
2018-07-12 15:20:39 +00:00
VSDRIVE.Init >LDYAI VSDRIVE.MSG0
jsr PrintFYA
jsr VSDRIVE.Check
bcs .90
2021-02-17 16:15:43 +00:00
2021-03-11 21:40:55 +00:00
stz TmpPtr1
lda #$C1
sta TmpPtr1+1
.2 jsr SSC.Detect
bcs .99
2021-03-11 21:40:55 +00:00
lda TmpPtr1+1 Slot Cn
and #$0F
pha slot n
2018-07-12 15:20:39 +00:00
>LDYAI VSDRIVE.SSCOK
jsr PrintFYA
jsr VSDRIVE.Ping
bcs .92
2018-07-12 15:20:39 +00:00
>LDYAI VSDRIVE.SRVOK
jsr PrintFYA
jsr VSDRIVE.SetSlot
bcs .91
2021-02-11 22:08:22 +00:00
pha Push slot
pha 2 times
2018-07-12 15:20:39 +00:00
>LDYAI VSDRIVE.DEVOK
jsr PrintFYA
jsr VSDRIVE.Install
2018-07-12 15:20:39 +00:00
>LDYAI VSDRIVE.OK
jsr PrintFYA
rts
2021-02-11 22:08:22 +00:00
2018-07-12 15:20:39 +00:00
.90 >LDYAI VSDRIVE.DRVKO
jsr PrintFYA
rts
2021-02-11 22:08:22 +00:00
2018-07-12 15:20:39 +00:00
.91 >LDYAI VSDRIVE.NOSLOT
jsr PrintFYA
rts
2021-02-11 22:08:22 +00:00
.92 pha Push EC
2018-07-12 15:20:39 +00:00
>LDYAI VSDRIVE.SRVKO
jsr PrintFYA
2021-03-11 21:40:55 +00:00
inc TmpPtr1+1
lda TmpPtr1+1
cmp #$C8
bne .2 Go try next SSC....
2018-07-12 15:20:39 +00:00
.99 >LDYAI VSDRIVE.SSCKO
jsr PrintFYA
rts
*--------------------------------------
2021-03-11 21:40:55 +00:00
VSDRIVE.Check ldx #COPYRIGHT.LEN
sec
2021-02-11 22:08:22 +00:00
.1 lda DRV.EntryPoint-1,x
2021-03-11 21:40:55 +00:00
eor COPYRIGHT-1,x
2021-02-11 22:08:22 +00:00
bne .9
dex
bne .1
clc
2021-02-17 16:15:43 +00:00
2021-02-11 22:08:22 +00:00
.9 rts
*--------------------------------------
2021-03-11 21:40:55 +00:00
SSC.Detect
.1 ldx #DEVSIG.Value-DEVSIG.Offset-1
.2 ldy DEVSIG.Offset,x
lda (TmpPtr1),y
cmp DEVSIG.Value,x
bne .3
2021-02-11 22:08:22 +00:00
dex
bpl .2
2021-02-11 22:08:22 +00:00
2021-03-11 21:40:55 +00:00
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
2021-02-11 22:08:22 +00:00
clc
adc #$8F
tax X=SlotN0
2021-03-11 21:40:55 +00:00
php
sei
2021-03-11 21:40:55 +00:00
stz SSC.RESET-$8F,x
2021-02-11 22:08:22 +00:00
2021-03-11 21:40:55 +00:00
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
2021-02-11 22:08:22 +00:00
2021-03-11 21:40:55 +00:00
lda SSC.DATA-$8F,x discard any garbage byte
lda SSC.STATUS-$8F,x clear any IRQ pending
2021-02-17 16:15:43 +00:00
stz VSDRIVE.Ping.TO
stz VSDRIVE.Ping.TO+1
2021-03-11 21:40:55 +00:00
.10 jsr VSDRIVE.IncTimer Wait.......
bne .10
2021-02-11 22:08:22 +00:00
ldy #10
2021-02-11 22:08:22 +00:00
.1 lda SSC.STATUS-$8F,x
2021-03-11 21:40:55 +00:00
and #SSC.STATUS.nDCD Ready for transmit?
beq .20
2021-02-17 16:15:43 +00:00
jsr VSDRIVE.IncTimer Wait.......
bne .1
2021-02-11 22:08:22 +00:00
dey
bne .1
2021-02-11 22:08:22 +00:00
lda #1
2021-03-11 21:40:55 +00:00
bra .9 Time Out.....
2021-02-11 22:08:22 +00:00
2021-03-11 21:40:55 +00:00
.20 ldy #5 5 bytes to send
.2 lda VSDRIVE.CMDS-1,y
2021-02-11 22:08:22 +00:00
sta SSC.DATA-$8F,x
.3 lda SSC.STATUS-$8F,x
and #SSC.STATUS.TDRE char transmitted?
bne .4
jsr VSDRIVE.IncTimer
bne .3
2021-02-11 22:08:22 +00:00
lda #2
2021-03-11 21:40:55 +00:00
bra .9
2021-02-11 22:08:22 +00:00
.4 dey
bne .2 next byte
2021-02-11 22:08:22 +00:00
2021-03-11 21:40:55 +00:00
lda #521^$ffff 522 bytes to receive
sta VSDRIVE.Ping.BC
lda /521^$ffff
sta VSDRIVE.Ping.BC+1
2021-03-11 21:40:55 +00:00
stz VSDRIVE.Ping.TO
stz VSDRIVE.Ping.TO+1
2021-03-11 21:40:55 +00:00
ldy #3 EC=3 if no byte received
2021-02-11 22:08:22 +00:00
.5 lda SSC.STATUS-$8F,x
and #SSC.STATUS.RDRF incoming char?
bne .6
2021-02-11 22:08:22 +00:00
jsr VSDRIVE.IncTimer
bne .5
2021-02-11 22:08:22 +00:00
tya
2021-03-11 21:40:55 +00:00
.9 stz SSC.RESET-$8F,x
plp
sec
rts
2021-02-11 22:08:22 +00:00
.6 ldy #4 EC=4 if recieved only partial reply
2021-02-11 22:08:22 +00:00
lda SSC.DATA-$8F,x
inc VSDRIVE.Ping.BC
bne .5
2021-02-11 22:08:22 +00:00
inc VSDRIVE.Ping.BC+1
bne .5
2021-02-11 22:08:22 +00:00
2021-03-11 21:40:55 +00:00
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
2021-02-11 22:08:22 +00:00
inc VSDRIVE.Ping.TO+1
.8 rts
*--------------------------------------
VSDRIVE.CMDS .HS C6.00.00.03
.DA #ADT.CMD.VSD
2019-10-03 06:25:27 +00:00
* C6=C5 eor 03 eor 00 eor 00
VSDRIVE.Ping.TO .BS 2
2021-02-17 16:15:43 +00:00
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
2021-02-11 22:08:22 +00:00
lda DEVPTRS+1,x
cmp DEVPTRS+1
bne .2
2021-02-11 22:08:22 +00:00
lda DEVPTRS+16,x Drive2
cmp DEVPTRS
bne .2
2021-02-11 22:08:22 +00:00
lda DEVPTRS+17,x
cmp DEVPTRS+1
bne .2
2021-02-11 22:08:22 +00:00
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
2021-02-11 22:08:22 +00:00
.2 inx
inx
cpx #16
bne .1
2021-02-11 22:08:22 +00:00
rts sec from CPX
*--------------------------------------
2021-03-11 21:40:55 +00:00
VSDRIVE.Install ldx #PATCH.LEN
.1 lda PATCH-1,x
sta DRV.EntryPoint-1,x
dex
bne .1
2021-02-11 22:08:22 +00:00
bit RRAMWRAMBNK2
bit RRAMWRAMBNK2
2021-02-11 22:08:22 +00:00
ldx #DRV.SIZE
2021-02-11 22:08:22 +00:00
.2 lda DRV-1,x
sta $D000,x
dex
bne .2
2021-02-11 22:08:22 +00:00
2021-03-11 21:40:55 +00:00
lda TmpPtr1+1 A=SlotCN
asl
asl
asl
asl
ora #SSC.DATA
sta DRV.SSCSend.D+1
sta DRV.SSCGet.D+1
inc #SSC.STATUS
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
2021-02-11 22:08:22 +00:00
clc
rts
*--------------------------------------
2020-07-23 10:18:11 +00:00
.INB usr/src/shared/x.printf.s
*--------------------------------------
DEVSIG.Offset .HS 05070B0C
DEVSIG.Value .HS 38180131
VSDRIVE.MSG0 .AZ "VSDRIVE (ADTPro Vitual 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)
*--------------------------------------
2021-03-11 21:40:55 +00:00
COPYRIGHT .AS "(C)APPLE "
COPYRIGHT.LEN .EQ *-COPYRIGHT
PATCH .PH DRV.EntryPoint
2021-02-26 20:13:48 +00:00
bit RRAMWRAMBNK2
2021-03-11 21:40:55 +00:00
jsr $D002
2021-02-26 20:13:48 +00:00
bit RRAMWRAMBNK1
rts
.EP
2021-03-11 21:40:55 +00:00
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
2021-02-17 16:15:43 +00:00
* DO NOT trash DRV.COMMAND...DRV.BLKNUM as ProDOS
* reuses them after Block operation
2021-03-11 21:40:55 +00:00
* PC,A1,A2 are used by Disk II Driver,
* so we use it safely as Tmp Ptr
*--------------------------------------
2021-03-11 21:40:55 +00:00
DRV.PCL .EQ $3A
DRV.PCH .EQ $3B
DRV.A1L .EQ $3C
DRV.A1H .EQ $3D
DRV.A2L .EQ $3E
DRV.A2H .EQ $3F
DRV.COMMAND .EQ $42
DRV.UNITNUM .EQ $43
2021-02-17 16:15:43 +00:00
DRV.BUFF .EQ $44
DRV.BLKNUM .EQ $46
*--------------------------------------
2021-02-11 22:08:22 +00:00
DRV .PH $D001 Main LC Bnk 2 $D001->$DFFF
2020-08-31 15:29:32 +00:00
2021-03-11 21:40:55 +00:00
DRV.START .BS 1 SELF MODIFIED slot 0n
lda DRV.COMMAND S=0,R=1,W=2,F=3
bne .1
2020-08-31 15:29:32 +00:00
ldx #$ff return Status
ldy #$ff
2021-02-11 22:08:22 +00:00
2019-10-03 06:25:27 +00:00
.8 lda #0
clc
rts
2020-08-31 15:29:32 +00:00
.1 cmp #3
beq .8 Format ....
2021-03-11 21:40:55 +00:00
bcc DRV.START.OK
DRV.START.IO lda #MLI.E.IO
sec
rts
2021-02-17 16:15:43 +00:00
2021-03-11 21:40:55 +00:00
DRV.START.OK tax
ora #2 W=2,R=3
2020-08-31 15:29:32 +00:00
2021-02-17 16:15:43 +00:00
ldy DRV.UNITNUM
bpl .2
2020-08-31 15:29:32 +00:00
adc #2 CC from bcs
2020-08-31 15:29:32 +00:00
.2 sta DRV.CmdBuf.Cmd store cmd
eor #ADT.CMD.VSD
eor DRV.BLKNUM
eor DRV.BLKNUM+1
sta DRV.CmdBuf.Sum Compute & store CheckSum
2021-03-11 21:40:55 +00:00
lda DRV.BLKNUM
sta DRV.CmdBuf.BlkL
lda DRV.BLKNUM+1
sta DRV.CmdBuf.BlkH
2021-02-17 16:15:43 +00:00
*--------------------------------------
* send CMD+CS
2021-02-17 16:15:43 +00:00
*--------------------------------------
php
sei
2021-03-11 21:40:55 +00:00
* lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.TE+SSC.CMD.DTR
DRV.INIT.C inc SSC.CMD SELF MODIFIED
2021-02-17 16:15:43 +00:00
ldy #4 Send 5 bytes including Sum
2020-08-31 15:29:32 +00:00
.3 lda DRV.CmdBuf.Sum,y
jsr DRV.SSCSend
dey
bpl .3
2020-08-31 15:29:32 +00:00
2021-02-26 20:13:48 +00:00
ldy #DRV.102.LEN-1
2021-02-26 20:13:48 +00:00
.5 lda DRV.102,y
2021-02-22 20:43:53 +00:00
sta $102,y
dey
bpl .5
*--------------------------------------
2021-03-11 21:40:55 +00:00
dex 1-1=0 if read
bne DRV.DO.CMD.W go write
*--------------------------------------
* Read block
*--------------------------------------
DRV.DO.CMD.R ldy #3 Read Back and check 4 bytes
2020-08-31 15:29:32 +00:00
.1 jsr DRV.SSCGet
eor DRV.CmdBuf.BlkH,y
bne DRV.DO.CMD.ERR
2021-03-11 21:40:55 +00:00
dey
bpl .1
2020-08-31 15:29:32 +00:00
ldy #4 Read 4 bytes DATE/TIME + 1 Byte Checksum
2020-08-31 15:29:32 +00:00
.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
2020-08-31 15:29:32 +00:00
* Y=0 from TAY
2021-03-11 21:40:55 +00:00
* stz DRV.CmdBuf.Sum
2020-08-31 15:29:32 +00:00
sec
2021-03-11 21:40:55 +00:00
.HS 90 BCC
.3 clc
.4 jsr DRV.SSCGet
2021-02-22 20:43:53 +00:00
jsr $102
eor DRV.CmdBuf.Sum
sta DRV.CmdBuf.Sum
iny
2021-03-11 21:40:55 +00:00
bne .4
2020-08-31 15:29:32 +00:00
inc DRV.BUFF+1
2021-03-11 21:40:55 +00:00
bcs .3
dec DRV.BUFF+1
dec DRV.BUFF+1
jsr DRV.SSCGet
eor DRV.CmdBuf.Sum
2021-03-11 21:40:55 +00:00
beq DRV.DO.CMD.OK
*--------------------------------------
2021-03-11 21:40:55 +00:00
DRV.DO.CMD.ERR jsr DRV.SSCClose
jmp DRV.START.IO
*--------------------------------------
2019-10-03 06:25:27 +00:00
* Write Block
*--------------------------------------
DRV.DO.CMD.W lda #$B1 lda (),y
2021-02-22 20:43:53 +00:00
sta $105
2020-08-31 15:29:32 +00:00
ldy #0
stz DRV.CmdBuf.Sum
sec
2021-03-11 21:40:55 +00:00
.HS 90 BCC
.1 clc
2020-08-31 15:29:32 +00:00
2021-03-11 21:40:55 +00:00
.2 jsr $102
jsr DRV.SSCSend
eor DRV.CmdBuf.Sum
sta DRV.CmdBuf.Sum
iny
2021-03-11 21:40:55 +00:00
bne .2
2020-08-31 15:29:32 +00:00
inc DRV.BUFF+1
2021-03-11 21:40:55 +00:00
bcs .1
dec DRV.BUFF+1
dec DRV.BUFF+1
2020-08-31 15:29:32 +00:00
* A = DRV.CmdBuf.Sum
jsr DRV.SSCSend
2019-10-03 06:25:27 +00:00
* read back CMD
ldy #4 Read 5 bytes (echo from server)
2020-08-31 15:29:32 +00:00
.3 jsr DRV.SSCGet
eor DRV.CmdBuf.Sum,y Check 5 bytes (including block Sum)
bne DRV.DO.CMD.ERR
2020-08-31 15:29:32 +00:00
dey
bpl .3
2021-03-11 21:40:55 +00:00
*--------------------------------------
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
2021-02-17 16:15:43 +00:00
plp
clc
2021-03-11 21:40:55 +00:00
rts
*--------------------------------------
2021-02-17 16:15:43 +00:00
DRV.SSCSend pha
2020-08-31 15:29:32 +00:00
2021-03-11 21:40:55 +00:00
DRV.SSCSend.S lda SSC.STATUS SELF MODIFIED
and #SSC.STATUS.TDRE Outgoing char?
2021-03-11 21:40:55 +00:00
beq DRV.SSCSend.S
2020-08-31 15:29:32 +00:00
2021-02-17 16:15:43 +00:00
pla
2021-03-11 21:40:55 +00:00
DRV.SSCSend.D sta SSC.DATA SELF MODIFIED
rts
*--------------------------------------
2021-03-11 21:40:55 +00:00
DRV.SSCGet
DRV.SSCGet.S lda SSC.STATUS SELF MODIFIED
and #SSC.STATUS.RDRF incoming char?
beq DRV.SSCGet
2020-08-31 15:29:32 +00:00
2021-03-11 21:40:55 +00:00
DRV.SSCGet.D lda SSC.DATA SELF MODIFIED
rts
*--------------------------------------
2021-02-26 20:13:48 +00:00
DRV.102 bit RRAMWRAMBNK1
sta (DRV.BUFF),y
bit RRAMWRAMBNK2
2021-03-11 21:40:55 +00:00
rts
2021-02-26 20:13:48 +00:00
DRV.102.LEN .EQ *-DRV.102
*--------------------------------------
2021-02-17 16:15:43 +00:00
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 .DA #ADT.CMD.VSD
*--------------------------------------
.EP
*--------------------------------------
.LIST ON
DRV.SIZE .EQ *-DRV
.LIST OFF
*--------------------------------------
* CONTROL SECTION :
*--------------------------------------
.DO DRV.SIZE>255
* ERROR:DRV.SIZE too big
.FIN
*--------------------------------------
MAN
2020-07-23 10:18:11 +00:00
SAVE usr/src/sys/km.vsdrive.s
ASM