mirror of
https://github.com/A2osX/A2osX.git
synced 2024-09-28 18:55:10 +00:00
704a72cee7
Finally FIX the KM.APPLTALK module crashing at startup, Fix in SYS Driver messing with MOUSE IRQ, fix VSDRIVE timout
526 lines
10 KiB
Plaintext
526 lines
10 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.BUILD
|
||
NEW
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
.OP 65C02
|
||
.OR $2000
|
||
.TF /A2OSX.BUILD/SYS/KM.VSDRIVE
|
||
*--------------------------------------
|
||
.INB /A2OSX.BUILD/INC/MACROS.I
|
||
.INB /A2OSX.BUILD/INC/IO.I
|
||
.INB /A2OSX.BUILD/INC/MONITOR.I
|
||
.INB /A2OSX.BUILD/INC/PRODOS.I
|
||
.INB /A2OSX.BUILD/INC/MLI.ERR.I
|
||
.INB /A2OSX.BUILD/INC/COM.6551.I
|
||
*--------------------------------------
|
||
TmpPtr1 .EQ $0
|
||
VS.CMD .EQ $C5 "E": Virtual Drive Command Envelope
|
||
DRV.EntryPoint .EQ $BF41
|
||
*--------------------------------------
|
||
VSDRIVE.Init >LDAXI VSDRIVE.MSG0
|
||
jsr PrintFAX
|
||
|
||
jsr VSDRIVE.Check
|
||
bcs .90
|
||
|
||
.1 lda #$C1 Self Modified
|
||
|
||
.2 jsr SSC.Detect
|
||
bcs .99
|
||
|
||
stx DRV+2 DRV.Slotn0
|
||
sta .1+1 SlotCn
|
||
|
||
and #$0F
|
||
pha slot n
|
||
|
||
>LDAXI VSDRIVE.SSCOK
|
||
jsr PrintFAX
|
||
|
||
jsr VSDRIVE.Ping
|
||
bcs .92
|
||
|
||
>LDAXI VSDRIVE.SRVOK
|
||
jsr PrintFAX
|
||
|
||
jsr VSDRIVE.SetSlot
|
||
bcs .91
|
||
|
||
pha save slot
|
||
pha 2 times
|
||
>LDAXI VSDRIVE.DEVOK
|
||
jsr PrintFAX
|
||
|
||
jsr VSDRIVE.Install
|
||
|
||
>LDAXI VSDRIVE.OK
|
||
jsr PrintFAX
|
||
rts
|
||
|
||
.90 >LDAXI VSDRIVE.DRVKO
|
||
jsr PrintFAX
|
||
rts
|
||
|
||
.91 >LDAXI VSDRIVE.NOSLOT
|
||
jsr PrintFAX
|
||
rts
|
||
|
||
.92 >LDAXI VSDRIVE.SRVKO
|
||
jsr PrintFAX
|
||
|
||
inc .1+1
|
||
lda .1+1
|
||
cmp #$C8
|
||
bne .2 Go try next SSC....
|
||
|
||
.99 >LDAXI VSDRIVE.SSCKO
|
||
jsr PrintFAX
|
||
rts
|
||
*--------------------------------------
|
||
VSDRIVE.Check bit RRAMWRAMBNK2
|
||
bit RRAMWRAMBNK2
|
||
|
||
clc
|
||
lda $D001
|
||
eor DRV
|
||
bne .8
|
||
lda $D002
|
||
eor DRV+1
|
||
bne .8
|
||
sec
|
||
|
||
.8 bit RROMBNK1
|
||
rts
|
||
*--------------------------------------
|
||
SSC.Detect stz TmpPtr1
|
||
sta TmpPtr1+1
|
||
|
||
.1 ldx #DEVSIG.Value-DEVSIG.Offset-1
|
||
|
||
.2 ldy DEVSIG.Offset,x
|
||
lda (TmpPtr1),y
|
||
cmp DEVSIG.Value,x
|
||
bne .3
|
||
|
||
dex
|
||
bpl .2
|
||
|
||
lda TmpPtr1+1 A=SlotCN
|
||
asl
|
||
asl
|
||
asl
|
||
asl
|
||
tax X=SlotN0
|
||
|
||
stz SSC.RESET,x
|
||
|
||
pha zzzzzzz...
|
||
pla
|
||
|
||
lda #SSC.CTL.CLKEXT+SSC.CTL.B115200+SSC.CTL.8D+SSC.CTL.1S+SSC.CMD.NOP
|
||
sta SSC.CTL,x
|
||
|
||
lda #SSC.CMD.RIRQDIS+SSC.CMD.TE+SSC.CMD.DTR
|
||
sta SSC.CMD,x
|
||
lda TmpPtr1+1
|
||
|
||
clc
|
||
rts X=SlotN0, A=SlotCN
|
||
|
||
.3 inc TmpPtr1+1 no match, try next slot....
|
||
lda TmpPtr1+1
|
||
cmp #$C8
|
||
bne .1
|
||
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
VSDRIVE.Ping ldx DRV+2 DRV.Slotn0
|
||
|
||
stz VSDRIVE.Ping.TO
|
||
stz VSDRIVE.Ping.TO+1
|
||
|
||
ldy #10
|
||
|
||
.1 lda SSC.STATUS,x
|
||
bit #SSC.STATUS.TDRE Ready for transmit?
|
||
bne .2
|
||
|
||
inc VSDRIVE.Ping.TO Wait.......
|
||
bne .1
|
||
inc VSDRIVE.Ping.TO+1
|
||
bne .1
|
||
dey
|
||
bne .1
|
||
|
||
sec
|
||
rts
|
||
|
||
ldy #10 10 retries...
|
||
|
||
.2 lda #$C4 Send "D" (DIR)
|
||
sta SSC.DATA,x
|
||
|
||
stz VSDRIVE.Ping.TO
|
||
stz VSDRIVE.Ping.TO+1
|
||
|
||
.3 inc VSDRIVE.Ping.TO
|
||
bne .4
|
||
inc VSDRIVE.Ping.TO+1
|
||
bne .4
|
||
|
||
dey
|
||
bne .2
|
||
|
||
sec
|
||
rts Time Out.....
|
||
|
||
.4 lda SSC.STATUS,x
|
||
and #SSC.STATUS.RDRF incoming char?
|
||
bne .5
|
||
|
||
inc VSDRIVE.Ping.TO
|
||
bne .4
|
||
inc VSDRIVE.Ping.TO+1
|
||
bne .4
|
||
|
||
.5 lda SSC.DATA,x
|
||
bne .4 end of string ?
|
||
|
||
.6 lda SSC.STATUS,x
|
||
and #SSC.STATUS.RDRF incoming char?
|
||
bne .7
|
||
|
||
inc VSDRIVE.Ping.TO
|
||
bne .6
|
||
inc VSDRIVE.Ping.TO+1
|
||
bne .6
|
||
|
||
.7 lda SSC.DATA,x
|
||
bne .4 end of list ?
|
||
|
||
clc
|
||
rts
|
||
|
||
VSDRIVE.Ping.TO .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.SIZE
|
||
|
||
.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
|
||
|
||
bit RROMBNK1
|
||
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
.INB /A2OSX.SRC/X.PRINTF.S
|
||
*--------------------------------------
|
||
DEVSIG.Offset .HS 05070B0C
|
||
DEVSIG.Value .HS 38180131
|
||
VSDRIVE.MSG0 >CSTR "VSDRIVE (ADTPro Vitual Serial HD) Driver For A2osX\n"
|
||
VSDRIVE.DRVKO >CSTR "VSDRIVE (Or other custom Driver) Already Installed.\n"
|
||
VSDRIVE.SSCKO >CSTR "SSC Not Detected.\n"
|
||
VSDRIVE.SSCOK >CSTR "SSC Found At Slot %d.\nContacting ADTPro Server..."
|
||
VSDRIVE.SRVKO >CSTR "No Response From ADTPro Server.\n"
|
||
VSDRIVE.SRVOK >CSTR "ADTPro Server Is Online.\n"
|
||
VSDRIVE.NOSLOT >CSTR "No ProDOS device slot available.\n"
|
||
VSDRIVE.DEVOK >CSTR "VSDRIVE Installed 2 devices at S%d,D1 & S%d,D2.\n"
|
||
VSDRIVE.OK >CSTR "VSDRIVE Driver Successfully Installed.\n"
|
||
*--------------------------------------
|
||
* ProDOS $BE41->$BE4B Patch for switching to BANK2 (10 bytes)
|
||
*--------------------------------------
|
||
PATCH .PH DRV.EntryPoint
|
||
bit RRAMWRAMBNK2
|
||
jsr $D001
|
||
bit RRAMWRAMBNK1
|
||
rts
|
||
.EP
|
||
PATCH.SIZE .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
|
||
* 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 .EQ *
|
||
.PH $D001 Main LC Bnk 2 $D001->$DFFF
|
||
cld
|
||
DRV.Slotn0 ldx #$ff Self Modified
|
||
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.CmdBuf.Cmd store cmd
|
||
eor #VS.CMD
|
||
eor DRV.BLKNUM
|
||
eor DRV.BLKNUM+1
|
||
sta DRV.CmdBuf.Sum Compute & store CheckSum
|
||
|
||
lda DRV.BLKNUM
|
||
sta DRV.CmdBuf.BlkLo
|
||
|
||
lda DRV.BLKNUM+1
|
||
sta DRV.CmdBuf.BlkHi
|
||
|
||
* send CMD+CS
|
||
ldy #4 Send 5 bytes including Sum
|
||
|
||
.3 lda DRV.CmdBuf.Sum,y
|
||
jsr DRV.SSCSend
|
||
dey
|
||
bpl .3
|
||
|
||
ldy #8
|
||
|
||
.5 lda DRV.READWRITE,y
|
||
sta $100,y
|
||
dey
|
||
bpl .5
|
||
|
||
*--------------------------------------
|
||
lda DRV.COMMAND
|
||
dec 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
|
||
|
||
.1 jsr DRV.SSCGet
|
||
eor DRV.CmdBuf.BlkHi,y
|
||
bne DRV.DO.CMD.ERR
|
||
dey
|
||
bpl .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
|
||
|
||
.3 jsr DRV.SSCGet
|
||
jsr $100
|
||
eor DRV.CmdBuf.Sum
|
||
sta DRV.CmdBuf.Sum
|
||
iny
|
||
bne .3
|
||
|
||
bcc .4
|
||
inc DRV.BUFF+1
|
||
clc
|
||
bcc .3
|
||
|
||
.4 dec DRV.BUFF+1
|
||
|
||
jsr DRV.SSCGet
|
||
|
||
eor DRV.CmdBuf.Sum
|
||
bne DRV.DO.CMD.ERR
|
||
rts A=0,CC from bcc .4
|
||
*--------------------------------------
|
||
DRV.DO.CMD.ERR1 pla
|
||
pla
|
||
|
||
DRV.DO.CMD.ERR lda #MLI.E.IO
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
* Write Block
|
||
*--------------------------------------
|
||
DRV.DO.CMD.W lda #$B1 lda (),y
|
||
|
||
sta $103
|
||
|
||
ldy #0
|
||
|
||
stz DRV.CmdBuf.Sum
|
||
|
||
sec
|
||
|
||
.1 jsr $100
|
||
jsr DRV.SSCSend
|
||
eor DRV.CmdBuf.Sum
|
||
sta DRV.CmdBuf.Sum
|
||
iny
|
||
bne .1
|
||
|
||
bcc .2
|
||
|
||
inc DRV.BUFF+1
|
||
clc
|
||
bcc .1
|
||
|
||
.2 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
|
||
rts
|
||
*--------------------------------------
|
||
DRV.SSCSend sta .2+1
|
||
|
||
.1 lda SSC.STATUS,x
|
||
* bit #SSC.STATUS.DCD+SSC.STATUS.DSR
|
||
* beq DRV.DO.CMD.ERR1
|
||
|
||
and #SSC.STATUS.TDRE Outgoing char?
|
||
beq .1
|
||
|
||
.2 lda #$ff
|
||
sta SSC.DATA,x
|
||
|
||
rts
|
||
*--------------------------------------
|
||
DRV.SSCGet lda SSC.STATUS,x
|
||
* bit #SSC.STATUS.DCD+SSC.STATUS.DSR
|
||
* beq DRV.DO.CMD.ERR1
|
||
|
||
and #SSC.STATUS.RDRF incoming char?
|
||
beq DRV.SSCGet
|
||
|
||
lda SSC.DATA,x
|
||
rts
|
||
*--------------------------------------
|
||
DRV.READWRITE bit RRAMWRAMBNK1
|
||
sta (DRV.BUFF),y
|
||
bit RRAMWRAMBNK2
|
||
rts
|
||
*--------------------------------------
|
||
DRV.CmdBuf.Sum .BS 1 Reverse order for dey
|
||
DRV.CmdBuf.BlkHi .BS 1
|
||
DRV.CmdBuf.BlkLo .BS 1
|
||
DRV.CmdBuf.Cmd .BS 1
|
||
DRV.CmdBuf.Env .DA #VS.CMD
|
||
*--------------------------------------
|
||
.EP
|
||
*--------------------------------------
|
||
.LIST ON
|
||
DRV.SIZE .EQ *-DRV
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
* CONTROL SECTION :
|
||
*--------------------------------------
|
||
.DO DRV.SIZE>255
|
||
* ERROR:DRV.SIZE too big
|
||
.FIN
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE /A2OSX.SRC/SYS/KM.VSDRIVE.S
|
||
ASM
|