better floppy control

This commit is contained in:
Peter Ferrie 2020-12-30 21:31:51 -08:00
parent caf39d5b83
commit d773b8d2ee
1 changed files with 174 additions and 177 deletions

View File

@ -37,6 +37,7 @@ ver_02 = 1
might_exist = 0 ;set to 1 if file is not known to always exist already
;makes use of status to indicate success or failure
many_files = 0 ;set to 1 to support more than 256 files in a directory
detect_wp = 0 ;detect write-protected floppy during writes
allow_aux = 0 ;set to 1 to allow read/write directly to/from aux memory
;requires load_high to be set for arbitrary memory access
;else driver must be running from same memory target
@ -205,6 +206,7 @@ ver_02 = 1
SETVID = $fe93
DEVNUM = $bf30
PHASEOFF = $c080
PHASEON = $c081
MOTOROFF = $c088
MOTORON = $c089
DRV0EN = $c08a
@ -258,26 +260,17 @@ init jsr SETKBD
ora #<MOTOROFF
!if allow_multi = 1 {
sta unrdrvoff1 + 1
sta unrdrvoff5 + 1
} ;allow_multi = 1
!if (might_exist + poll_drive) > 0 {
sta unrdrvoff2 + 1
} ;might_exist = 1 or poll_drive = 1
!if (aligned_read + allow_aux) = 0 {
sta unrdrvoff3 + 1
} ;aligned_read = 0 and allow_aux = 0
sta unrdrvoff4 + 1
tax
inx ;MOTORON
stx unrdrvon1 + 1
!if allow_multi = 1 {
stx unrdrvon5 + 1
stx unrdrvon1 + 1
} ;allow_multi = 1
stx unrdrvon2 + 1
!if aligned_read = 0 {
stx unrdrvon3 + 1
} ;aligned_read = 0
stx unrdrvon4 + 1
inx ;DRV0EN
!if allow_multi = 1 {
stx unrdrvsel2 + 1
@ -288,10 +281,8 @@ init jsr SETKBD
} ;allow_multi = 1
inx ;Q6L
stx unrread1 + 1
!if (poll_drive + allow_multi) > 0 {
stx unrread2 + 1
stx unrread3 + 1
} ;poll_drive = 1 or allow_multi = 1
stx unrread4 + 1
stx unrread5 + 1
!if check_chksum = 1 {
@ -418,11 +409,11 @@ adjpath tya
lsr
tay
ldx DEVADR01HI, y
cpx #$c1
bcc +
cpx #$c8
bcc set_slot1
!if use_smartport = 1 {
php
} ;use_smartport = 1
bcc set_slot
+
!if enable_floppy = 1 {
;check if current device is floppy
@ -450,12 +441,11 @@ adjpath tya
lda (scratchlo), y
beq set_slot
not_floppy
not_floppy inx
} ;enable_floppy = 1
;find SmartPort device for basic MicroDrive support
ldx #$c8
- dex
stx scratchhi
ldy #0
@ -477,11 +467,7 @@ not_floppy
lda (scratchlo), y
beq -
set_slot
!if use_smartport = 1 {
plp
} ;use_smartport = 1
set_slot1 stx slot + 2
set_slot stx slot + 2
stx unrentry + 2
slot ldx $cfff
stx unrentry + 1
@ -534,11 +520,13 @@ slot ldx $cfff
} ;rwts_mode = 0 and aligned_read = 0 and enable_write = 1
sty unrbloklo1
;;lda #>pblock
;;pblock_enabled=1
sta unrbloklo1 + 2
!if (rwts_mode + write_sparse) > 1 {
sta unrbloklo2 + 2
} ;rwts_mode = 1 and write_sparse = 1
;;lda #>(pblock + 1)
;;pblock1_enabled=1
sta unrblokhi1 + 2
!if (rwts_mode + write_sparse) > 1 {
sta unrblokhi2 + 2
@ -592,8 +580,7 @@ slot ldx $cfff
sta hackstar
iterunit inc unrunit2
jsr unrentry
bcs iterunit
jsr unrentrysei
+ ldy #$10
- lda readbuff + 3, y
@ -639,7 +626,14 @@ reladr sta reloc, y
dex
bne -
plp
!if swap_scrn = 1 {
beq +
jsr saveslot
lda #$91
sta initpatch
} ;swap_scrn = 1
bne ++
+
;build 6-and-2 denibbilisation table
@ -674,20 +668,20 @@ unrdrvon1 lda MOTORON
sta trackd1
!if allow_multi = 1 {
unrdrvoff5 lda MOTOROFF
jsr spinup ;or down
unrdrvon5 lda MOTORON
unrdrvsel1 lda DRV0EN + 1
jsr spinup
jsr poll
bcs +
beq +
lda #$c8 ;iny
sta twodrives
inc driveind + 1
lda #0
sta phase
ldx #$22
jsr seek
jsr readadr
lda curtrk
sta trackd2
+
+ inc driveind + 1
} ;allow_multi = 1
unrdrvoff1 lda MOTOROFF
++
@ -726,12 +720,13 @@ multicopy
dex
bne multicopy
} ;three_pages = 1
} ;enable_floppy = 1
!if swap_scrn = 1 {
!if swap_scrn = 1 {
jsr saveslot
lda #$91
sta initpatch
} ;swap_scrn = 1
} ;swap_scrn = 1
} ;enable_floppy = 1
!if rwts_mode = 1 {
;read volume directory key block
@ -860,7 +855,7 @@ addr !byte 0, $b6
sta CLRAUXWR + (load_banked * 4) ;CLRAUXWR or CLRAUXZP
} ;load_aux = 1
!if load_banked = 1 {
ROMIN = $c081
lda ROMIN
} ;load_banked = 1
rts
} ;rwts_mode = 1
@ -892,10 +887,14 @@ opendir
pha
} ;detect_err = 1
plp
unrdrvoff2 = unrelocdsk + (* - reloc)
lda MOTOROFF
rts
+
} ;no_interrupts = 1
jsr prepdrive
;read volume directory key block
;self-modified by init code
@ -976,10 +975,11 @@ nextent ldy #0
} ;many_files = 1
} ;might_exist = 1
!if (might_exist + poll_drive) > 0 {
nodisk
unrdrvoff2 = unrelocdsk + (* - reloc)
nodisk inc status
!if no_interrupts = 0 {
unrdrvoff3 = unrelocdsk + (* - reloc)
lda MOTOROFF
inc status
} ;no_interrupts = 0
rts
} ;might_exist = 1 or poll_drive = 1
@ -1142,7 +1142,7 @@ foundname iny
sta treeblkhi
} ;allow_trees = 1 and fast_trees = 0
!if (allow_saplings + allow_sparse) > 1 {
!if (allow_saplings + write_sparse) > 1 {
;clear dirbuf in case sparse sapling becomes seedling
pha
@ -1153,7 +1153,7 @@ foundname iny
iny
bne -
pla
} ;allow_saplings = 1 and allow_sparse = 1
} ;allow_saplings = 1 and write_sparse = 1
!if always_trees = 0 {
plp
@ -1193,8 +1193,6 @@ foundname iny
jmp rdwrfilei
rdwrfile
unrdrvon2 = unrelocdsk + (* - reloc)
lda MOTORON
!if allow_subdir = 1 {
clc
} ;allow_subdir = 1
@ -1213,10 +1211,17 @@ unrdrvon2 = unrelocdsk + (* - reloc)
pha
} ;detect_err = 1
plp
unrdrvoff3 = unrelocdsk + (* - reloc)
lda MOTOROFF
rts
+
} ;no_interrupts = 1
!if allow_multi = 1 {
ldy driveind + 1
} ;allow_multi = 1
jsr prepdrivei
rdwrfilei
!if (override_adr + allow_subdir + allow_saplings + allow_trees + (aligned_read xor 1)) > 0 {
;restore load offset
@ -1314,8 +1319,6 @@ copyblock
ldy sizehi
} ;enable_seek = 1
jsr copycache
unrdrvon3 = unrelocdsk + (* - reloc)
lda MOTORON ;copycache turns it off
;align to next block and resume read
@ -1344,11 +1347,9 @@ unrdrvon3 = unrelocdsk + (* - reloc)
bne rdwrfilei
} ;allow_subdir = 1
!if allow_aux = 0 {
unrdrvoff3 = unrelocdsk + (* - reloc)
lda MOTOROFF
rts
} else { ;allow_aux = 1
beq rdwrdonedrv
beq rdwrdone
} ;allow_aux = 0
} ;one_shot = 0
} else { ;aligned_read = 1
@ -1550,9 +1551,6 @@ resparse
dec sizehi
bne rdwrloop
rdwrdonedrv
unrdrvoff4 = unrelocdsk + (* - reloc)
lda MOTOROFF
!if aligned_read = 0 {
lda sizelo
bne rdwrloop
@ -1645,18 +1643,44 @@ copycache
} ;one_shot = 0
} ;aligned_read = 0
spinup ldy #6
- jsr delay
dey
bpl -
prepdrive
!if allow_multi = 1 {
ldy #0
} ;allow_multi = 1
prepdrivei
jsr poll
php
delay
-- ldx #$11
- dex
bne -
sec
sbc #1
bne --
unrdrvon2 = unrelocdsk + (* - reloc)
lda MOTORON
!if allow_multi = 1 {
asl reqcmd
bcc seldrive
twodrives nop ;replace with INY if drive exists
seldrive lsr reqcmd
unrdrvsel2 = unrelocdsk + (* - reloc)
lda DRV0EN, y
cpy driveind + 1
beq nodelay
sty driveind + 1
plp
ldy #0
php
nodelay
} ;allow_multi = 1
plp
bne +
jsr spinup
+
!if poll_drive = 1 {
jsr poll
bne +
pla
pla
jmp nodisk
+
} ;poll_drive = 1
rts
;no tricks here, just the regular stuff
@ -1666,26 +1690,19 @@ seek ldy #0
asl phase
txa
asl
copy_cur tax
sta tmptrk
copy_cur lda tmptrk
sta tmpsec
sec
sbc phase
beq +++
bcs +
!if ver_02 = 1 {
eor #$ff
} else { ;ver_02 = 0
inc
} ;ver_02 = 1
inx
inc tmptrk
bcc ++
+
!if ver_02 = 1 {
sbc #1
} else { ;ver_02 = 0
dec
} ;ver_02 = 1
dex
+ sbc #1
dec tmptrk
++ cmp step
bcc +
lda step
@ -1693,37 +1710,43 @@ copy_cur tax
bcs +
tay
sec
+
!if ver_02 = 1 {
txa
pha
} else { ;ver_02 = 0
phx
} ;ver_02 = 1
ldx step1, y
+++ php
bne +
--- clc
lda tmptrk
ldx step2, y
+ stx tmpsec
and #3
rol
tax
lsr
unrseek = unrelocdsk + (* - reloc)
lda PHASEOFF, x
-- ldx #$12
- dex
bpl -
dec tmpsec
bne --
bcs ---
plp
beq seekret
pla
+ jsr ++++
lda step1, y
jsr delay
lda tmpsec
clc
jsr +++++
lda step2, y
jsr delay
inc step
bne copy_cur
+++ jsr delay
clc
++++ lda tmptrk
+++++ and #3
rol
tax
unrseek = unrelocdsk + (* - reloc)
lda PHASEOFF, x
rts
spinup ldy #6
- jsr delay
dey
bpl -
delay
-- ldx #$11
- dex
bne -
inc tmpsec
bne +
inc reqsec
+ sec
sbc #1
bne --
rts
step1 !byte 1, $30, $28, $24, $20, $1e, $1d, $1c
step2 !byte $70, $2c, $26, $22, $1f, $1e, $1d, $1c
@ -1758,35 +1781,20 @@ unrread1 = unrelocdsk + (* - reloc)
bpl -
rts
!if (poll_drive + allow_multi) > 0 {
poll ldy #0
poll ldx #0
unrread2 = unrelocdsk + (* - reloc)
- lda Q6L
jsr seekret
pha
pla
unrread3 = unrelocdsk + (* - reloc)
cmp Q6L
clc
eor Q6L
bne +
dey
dex
bne -
sec
+ rts
} ;poll_drive = 1 or allow_multi = 1
readdirsel
!if ver_02 = 1 {
pha
txa
pha
} else { ;ver_02
pha
phx
} ;ver_02 = 1
unrdrvon4 = unrelocdsk + (* - reloc)
lda MOTORON
!if (ver_02 + allow_multi) > 0 {
ldy #0
sty adrlo
@ -1799,38 +1807,6 @@ unrdrvon4 = unrelocdsk + (* - reloc)
stz status
} ;poll_drive = 1
} ;ver_02 = 1 or allow_multi = 1
!if allow_multi = 1 {
asl reqcmd
bcc seldrive
twodrives nop ;replace with INY if drive exists
seldrive lsr reqcmd
unrdrvsel2 = unrelocdsk + (* - reloc)
lda DRV0EN, y
cpy driveind + 1
sty driveind + 1
beq nodelay
jsr spinup
nodelay
} ;allow_multi = 1
!if poll_drive = 1 {
jsr poll
bcc +
pla
pla
pla
pla
jmp nodisk
+
} ;poll_drive = 1
!if ver_02 = 1 {
pla
tax
pla
} else { ;ver_02
plx
pla
} ;ver_02 = 1
readdirsec
!if allow_trees = 0 {
@ -1964,9 +1940,8 @@ cmpsecwr jsr readadr
;skip tail #$DE #$AA #$EB some #$FFs ...
ldy #6
- jsr readnib
dey
ldy #$24
- dey
bpl -
;write sector data
@ -1975,12 +1950,13 @@ unrslot1 = unrelocdsk + (* - reloc)
ldx #$d1
lda Q6H, x ;prime drive
lda Q7L, x ;required by Unidisk
!if detect_wp = 1 {
asl
ror status
} ;detect_wp = 1
tya
sta Q7H, x
ora Q6L, x
pha ;3 cycles
pla ;4 cycles
nop ;2 cycles
;40 cycles
@ -2495,6 +2471,13 @@ seek1 sta blkidx
!if (enable_readseq + allow_subdir) > 0 {
hddrdwrpart jmp hddrdwrfile
} ;enable_readseq = 1 or allow_subdir = 1
!if enable_floppy = 1 {
!if (* - reloc) < (unrblocklo - unrelocdsk) {
;essential padding to match offset with floppy version
!fill (unrblocklo - unrelocdsk) - (* - reloc), $ea
}
} ;enable_floppy = 1
;read volume directory key block
;self-modified by init code
@ -2505,13 +2488,6 @@ unrhddblockhi = unrelochdd + (* - reloc)
lda #0
jsr hddreaddirsel
!if enable_floppy = 1 {
!if (* - hddopendir) < (readdir - opendir) {
;essential padding to match offset with floppy version
!fill (readdir - opendir) - (* - hddopendir), $ea
}
} ;enable_floppy = 1
hddreaddir
!if might_exist = 1 {
lda hdddirbuf + FILE_COUNT ;assuming only 256 files per subdirectory
@ -2744,7 +2720,7 @@ hddfoundname iny
sta treeblkhi
} ;allow_trees = 1 and fast_trees = 0
!if (allow_saplings + allow_sparse) > 1 {
!if (allow_saplings + write_sparse) > 1 {
;clear dirbuf in case sparse sapling becomes seedling
pha
@ -2755,7 +2731,7 @@ hddfoundname iny
iny
bne -
pla
} ;allow_saplings = 1 and allow_sparse = 1
} ;allow_saplings = 1 and write_sparse = 1
!if always_trees = 0 {
plp
@ -2922,6 +2898,9 @@ hddcopyblock
} else { ;allow_subdir = 0
bne hddrdwrfilei
} ;allow_subdir = 1
!if no_interrupts = 1 {
clc
} ;no_interrupts = 1
!if allow_aux = 0 {
rts
} else { ;allow_aux = 1
@ -2956,7 +2935,7 @@ hddrdwrloop
!if read_scrn = 1 {
clv
bcc redirect
cpx #0
txa
beq +
ldy ldrhi
cpy #8
@ -3367,6 +3346,8 @@ copyhalf
ldx scratchhi
inx
stx adrhi
lda scratchlo
sta adrlo
bvs resumescrn
} ;read_scrn = 1
++
@ -3468,21 +3449,22 @@ hddwriteimm lda adrhi ;for Trackstar support
jsr saveslot
} ;swap_scrn = 1
unrentrysei = unrelochdd + (* - reloc)
!if no_interrupts = 1 {
php
sei
} ;no_interrupts = 1
unrentry = unrelochdd + (* - reloc)
jsr $d1d1
!if no_interrupts = 1 {
plp
} ;no_interrupts = 1
!if use_smartport = 1 {
unrpcommand = unrelochdd + (* - reloc)
pcommand !byte $2c ;hide packet in non-SmartPort mode
unrppacket = unrelochdd + (* - reloc)
!word unrelochdd + (packet - reloc)
} ;use_smartport = 1
!if no_interrupts = 1 {
plp
} ;no_interrupts = 1
hackstar = unrelochdd + (* - reloc)
pla
sta adrhi ;Trackstar does not preserve adrhi
@ -3524,11 +3506,26 @@ unrunit2 = unrelochdd + (* - reloc)
!byte 0
paddr !word readbuff + $200
pblock !byte 2, 0, 0
!if >paddr != >pblock {
!warn "uncomment ';;lda #>pblock'"
}
!if >pblock != >(pblock + 1) {
!warn "uncomment ';;lda #>(pblock + 1)'"
!if >pcommand != >(pblock + 1) {
!if >pcommand != >pblock {
!ifdef pblock_enabled {
} else {
!ifdef PASS2 {
!warn "uncomment ';;lda #>pblock'"
!warn "uncomment ';;pblock_enabled=1'"
!warn "uncomment ';;lda #>paddr'"
}
}
} else {
!ifdef pblock1_enabled {
} else {
!ifdef PASS2 {
!warn "uncomment ';;lda #>(pblock + 1)'"
!warn "uncomment ';;pblock1_enabled=1'"
!warn "uncomment ';;lda #>paddr'"
}
}
}
}
} ;use_smartport = 1