dos33fsprogs/games/peasant/drive2.s
Vince Weaver e7f1907f38 peasant: finally get qboot working across 2 disks
using PRORWTS seek now
also fixed subtle bug in qboot when loading partial tracks

also a bunch of movement in the demo stuff by accident, oops but it's
2am and I'm too lazy to back that out
2022-01-16 02:05:43 -05:00

222 lines
3.3 KiB
ArmAsm

; roughly based on anti-m/anti-m.a
; Notes from qkumba/4am
; Drive with no disk and no motor, will return same value in range $00..$7f
; Drive with no disk but motor running will return random $00..$FF
; Some cards will return random even with no drive connected
; so the best way to detect if disk is there is to try seeking/reading
; and seeing if you get valid data
; Note: should attempt to not have drive1/drive on at same time
; even when you turn off drive a 555 timer keeps it running
; for 1s or so
; assume slot 6
; C0E8 = motor off
; C0E9 = motor on
; C0EA = select drive1
; C0EB = select drive2
;=================================
; check floppy in drive2
;=================================
; switches to drive2
; turns drive on
; seeks to track0
; attempts to read a sector
; if fails, returns C=0
; if succeeds, returns C=1
; turns drive off
; switches back to drive1
check_floppy_in_drive2:
; anti-m does E9,EB, spinup (motor on, then select d2?)
; then delays, then seeks
; at end, driveoff E8
jsr switch_drive2
jsr driveon ; turn drive on
; seems counter-intuitive but you're
; supposed to do this before
; switching to drive2?
; the driveon code does this internally
; jsr wait_1s
; seek to track 0
lda #$46 ; 70 = 35 tracks; worst case scenario(?)
sta curtrk_smc+1
lda #$0 ; seek to track0
sta phase_smc+1
; jsr antim_seek_track0
jsr seek
;=====================================
; try 768 times to find valid sector
; does this by looking for $D5 $AA $96 sector address header
ldx #2
ldy #0
check_drive2_loop:
iny
bne keep_trying
;========================
; didn't find it in time
clc ; clear Carry for failure
dex
bmi done_check_failed ; actually done after 3*256
keep_trying:
get_valid_byte:
jsr readnib ; read byte
bpl get_valid_byte ; keep trying if high bit not set
check_if_d5:
cmp #$D5 ; see if D5 (start of ... )
bne check_drive2_loop ; if not, try again
check_if_aa:
jsr readnib ; read byte
bpl check_if_aa ; keep trying until valid
cmp #$AA ; see if aa
bne get_valid_byte ; if not try again
check_if_96:
jsr readnib ; read byte
bpl check_if_96 ; keep trying until valid
cmp #$96 ; see if 96
bne check_if_d5 ; if not try again
; if we make it here, carry is set
; because result was greater or equal to #$96
done_check:
; brk
jsr driveoff
jsr wait_1s
jsr switch_drive1
sec
rts
done_check_failed:
jsr driveoff
jsr wait_1s
jsr switch_drive1
clc
rts
.if 0
step=$fd
phase=$fe
tmptrk=$ff
tmpsec2=$3c
; $3d also modified?
antim_seek_track0:
ldy #0
sty step
sty phase
lda #$44
sta tmptrk
copy_cur:
lda tmptrk
sta tmpsec2
sec
sbc phase
beq lPPP1
bcs lP1
eor #$ff
inc tmptrk
bcc lPP1
lP1:
sbc #1
dec tmptrk
lPP1:
cmp step
bcc lP2
lda step
lP2:
cmp #8
bcs lP3
tay
sec
lP3:
jsr lPPPP1
lda step1, y
jsr adelay
lda tmpsec2
clc
jsr lPPPPP1
lda step2, y
jsr adelay
inc step
bne copy_cur
lPPP1:
jsr adelay
clc
lPPPP1:
lda tmptrk
lPPPPP1:
and #3
rol
tax
lda $C0E0, x
rts
step1:
.byte $01, $30, $28, $24, $20, $1e, $1d, $1c
step2:
.byte $70, $2c, $26, $22, $1f, $1e, $1d, $1c
adelay:
adelay_loop:
ldx #$11
adelay_inner:
dex
bne adelay_inner
inc tmpsec2
bne adelay_skip
inc tmpsec2+1
adelay_skip:
sec
sbc #1
bne adelay_loop
knownret:
rts
.endif