peasant: trying to add drive2 support

currently broken, something goes wrong after switching to drive2
This commit is contained in:
Vince Weaver 2022-01-06 08:34:27 -05:00
parent 28128c4820
commit ebbdf0a216
8 changed files with 170 additions and 64 deletions

View File

@ -110,6 +110,20 @@ generate_all_symbols.o: generate_all_symbols.c
####
qboot.inc: generate_common QBOOT
./generate_common -a 0x000 -s seek qboot_sector.lst > qboot.inc
./generate_common -a 0x000 -s curtrk_smc qboot_sector.lst >> qboot.inc
./generate_common -a 0x000 -s phase_smc qboot_sector.lst >> qboot.inc
./generate_common -a 0x000 -s driveon qboot_sector.lst >> qboot.inc
./generate_common -a 0x000 -s driveoff qboot_sector.lst >> qboot.inc
./generate_common -a 0x000 -s load_new qboot_sector.lst >> qboot.inc
./generate_common -a 0x000 -s load_address qboot_sector.lst >> qboot.inc
echo "load_track=load_address+1" >> qboot.inc
echo "load_sector=load_address+2" >> qboot.inc
echo "load_length=load_address+3" >> qboot.inc
####
qload.inc: generate_common QLOAD
./generate_common -a 0xb00 -s load_file qload.lst > qload.inc
./generate_common -a 0xb00 -s sector_write qload.lst >> qload.inc

View File

@ -1,8 +1,40 @@
; based on anti-m/anti-m.a
; 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
; FIXME: patch these
switch_drive1:
lda curtrk_smc+1
sta DRIVE2_TRACK ; save track location
lda $C0EA ; drive 1 select
lda #1
sta CURRENT_DRIVE
lda DRIVE1_TRACK ; restore saved track location
sta curtrk_smc+1
rts
switch_drive2:
lda curtrk_smc+1
sta DRIVE1_TRACK ; save track location
lda $C0EB ; drive 2 select
lda #2
sta CURRENT_DRIVE
lda DRIVE2_TRACK ; restore saved track location
sta curtrk_smc+1
rts
check_floppy_in_drive2:
lda $C0EB ; drive 2 select
jsr switch_drive2
jsr driveon
@ -10,7 +42,16 @@ check_floppy_in_drive2:
; jsr spinup ; spin up drive
jsr seek ; seek to where?
; jsr seek_track0 ; seek to track0
; seek to track 0
lda #(35*2) ; worst case scenario(?)
sta curtrk_smc+1
lda #0 ; seek to track0
sta phase_smc+1
jsr seek
;=====================================
@ -59,3 +100,5 @@ check_if_96:
done_check:
jmp driveoff

View File

@ -1,9 +1,10 @@
; made by hand?
seek = $a26
driveon = $a9D
driveoff = $a22
load_new = $aAB
load_address=$aC4
seek =$0a26
curtrk_smc =$0a2b
phase_smc =$0a31
driveon =$0a9d
driveoff =$0a22
load_new =$0aab
load_address =$0ac4
load_track=load_address+1
load_sector=load_address+2
load_length=load_address+3

View File

@ -221,7 +221,7 @@ preread:
; pha
lda #<(firsttrk*2)
sta phase+1
sta phase_smc+1
ldx #sectors
lda #address
ldy #firstsec

View File

@ -232,8 +232,8 @@ sector:
total:
ldx #$d1
beq driveoff
inc phase+1
inc phase+1 ; update current track
inc phase_smc+1
inc phase_smc+1 ; update current track
jmp inittrk
driveoff:
@ -247,11 +247,11 @@ seek:
ldx #0
stx step+1
copy_cur:
curtrk:
curtrk_smc:
lda #0
sta tmpval+1
sec
phase:
phase_smc: ; track*2 to seek to
sbc #$d1
beq seekret
@ -259,12 +259,12 @@ phase:
bcs sback
eor #$ff
inc curtrk+1
inc curtrk_smc+1
bcc ssback
sback:
adc #$fe
dec curtrk+1
dec curtrk_smc+1
ssback:
cmp step+1
bcc loop10
@ -276,7 +276,7 @@ loop10:
tay
sec
loop11:
lda curtrk+1
lda curtrk_smc+1
ldx step1, Y
bne loop12
loopmmm:
@ -338,7 +338,7 @@ load_new:
lda load_track
asl ; track to start*2
sta phase+1
sta phase_smc+1
lda load_sector
tay ; sector to start

View File

@ -1,39 +1,39 @@
load_file =$0b20
sector_write =$0c63
load_file =$0b28
sector_write =$0c90
requested_sector =$0d17
decompress_lzsa2_fast =$0de6
getsrc_smc =$0edc
hgr2 =$17e2
hgr_make_tables =$1556
hgr_put_string =$0ee9
restore_bg_1x28 =$1421
hgr_draw_sprite_1x28 =$13ba
input_buffer =$152e
hgr_text_box =$15cc
hgr_text_box_nosave =$1663
hgr_partial_restore =$14a4
clear_bottom =$17b7
hgr_input =$14d4
draw_box =$126b
disp_put_string =$1607
disp_one_line =$161b
invert_smc1 =$0f61
disp_put_string_cursor =$1617
hgr_put_char_cursor =$0f15
vgi_simple_rectangle =$12ec
peasant_text =$1f16
save_menu =$1895
load_menu =$188a
location_names_l =$1bc2
location_names_h =$1be1
wait_until_keypress =$1e01
random16 =$1e0a
score_points =$1e8f
print_score =$1e3f
update_score =$1e4a
speaker_beep =$1efd
speaker_duration =$1f14
speaker_frequency =$1f15
decompress_lzsa2_fast =$0e46
getsrc_smc =$0f3c
hgr2 =$1842
hgr_make_tables =$15b6
hgr_put_string =$0f49
restore_bg_1x28 =$1481
hgr_draw_sprite_1x28 =$141a
input_buffer =$158e
hgr_text_box =$162c
hgr_text_box_nosave =$16c3
hgr_partial_restore =$1504
clear_bottom =$1817
hgr_input =$1534
draw_box =$12cb
disp_put_string =$1667
disp_one_line =$167b
invert_smc1 =$0fc1
disp_put_string_cursor =$1677
hgr_put_char_cursor =$0f75
vgi_simple_rectangle =$134c
peasant_text =$1f76
save_menu =$18f5
load_menu =$18ea
location_names_l =$1c22
location_names_h =$1c41
wait_until_keypress =$1e61
random16 =$1e6a
score_points =$1eef
print_score =$1e9f
update_score =$1eaa
speaker_beep =$1f5d
speaker_duration =$1f74
speaker_frequency =$1f75
hposn_high = $BA00
hposn_low = $BB00
driveoff = $A22

View File

@ -31,12 +31,17 @@ qload_start:
lda #1
sta CURRENT_DISK ; current disk number
sta DRIVE1_DISK ; it's in drive1
sta CURRENT_DRIVE ; and currently using drive 1
jsr load_file
lda #0
sta DRIVE2_DISK ; don't know if disk there yet
jsr $6000
jsr load_file ; actually load intro
lda #LOAD_TITLE ; load title
jsr $6000 ; run intro
lda #LOAD_TITLE ; next load title
sta WHICH_LOAD
main_game_loop:
@ -60,9 +65,9 @@ start_title:
load_file:
ldx WHICH_LOAD
lda which_disk_array,X
cmp CURRENT_DISK
bne change_disk
lda which_disk_array,X ; get disk# for file to load
cmp CURRENT_DISK ; if not currently using
bne change_disk ; need to change disk
load_file_no_diskcheck:
lda load_address_array,X
@ -86,12 +91,45 @@ load_file_no_diskcheck:
; change disk
;===================================================
;===================================================
; WHICH_LOAD is still in X?
change_disk:
; turn off disk drive light
; see if disk we want is in drive1
check_drive1:
lda which_disk_array,X
cmp DRIVE1_DISK
bne check_drive2
jsr switch_drive1 ; switch to drive1
jmp update_disk
check_drive2:
cmp DRIVE2_DISK
bne disk_not_found
jsr switch_drive2 ; switch to drive2
jmp update_disk
disk_not_found:
; check if disk in drive2
; carry clear if not
jsr check_floppy_in_drive2
bcc nothing_in_drive2
; a disk is in drive2, try to use it
bcs verify_disk
nothing_in_drive2:
; switch back to drive1
jsr switch_drive1
jsr driveoff
;==============================
; print "insert disk" message
@ -132,7 +170,7 @@ fnf_keypress:
;==============================================
; actually verify proper disk is there
; read T0:S0 and verify proper disk
verify_disk:
lda WHICH_LOAD
pha
@ -177,11 +215,16 @@ disk_compare:
;==============================================
; all good, retry original load
update_disk:
ldx CURRENT_DRIVE
sta DRIVE1_DISK-1,X ; indexed from 1
ldx WHICH_LOAD
lda which_disk_array,X
sta CURRENT_DISK
jmp load_file
; offset for disk number is 27
@ -239,13 +282,14 @@ length_array:
.include "qkumba_popwr.s"
.include "drive2.s"
.include "decompress_fast_v2.s"
.include "hgr_font.s"
.include "draw_box.s"
.include "hgr_rectangle.s"
.include "hgr_1x28_sprite_mask.s"
;.include "hgr_1x5_sprite.s"
.include "hgr_partial_save.s"
.include "hgr_input.s"
.include "hgr_tables.s"

View File

@ -10,7 +10,11 @@ MOCKINGBOARD_SLOT = $06
DISP_PAGE = $07 ; only in videlectrix intro?
DRAW_PAGE = $08
NIBCOUNT = $09
DISK_TRY = $0A
CURRENT_DRIVE = $0A
DRIVE1_DISK = $0B
DRIVE2_DISK = $0C
DRIVE1_TRACK = $0D
DRIVE2_TRACK = $0E
TEMP0 = $10
TEMP1 = $11