various tape loading fixes
This commit is contained in:
1 parent
c497e3b03c
commit
8c8e18bb80
15 files changed
+127
-131
No files matched your search
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -136,7 +136,7 @@
|
||||
.label FA = $BA // current device number
|
||||
.label FNADDR = $BB // $BB-$BC current file name pointer
|
||||
.label ROPRTY = $BD // -- NOT IMPLEMENTED -- tape / RS-232 temporary storage
|
||||
.label FSBLK = $BE // -- NOT IMPLEMENTED --
|
||||
.label FSBLK = $BE // -- NOT IMPLEMENTED -- tape / RS-232 temporary storage
|
||||
.label MYCH = $BF // -- NOT IMPLEMENTED --
|
||||
.label CAS1 = $C0 // tape motor interlock
|
||||
.label STAL = $C1 // $C1-$C2 LOAD/SAVE start address
|
||||
|
||||
@@ -85,7 +85,12 @@ iec_save_loop:
|
||||
#endif
|
||||
|
||||
// Next iteration
|
||||
jsr lvs_advance_MEMUSS_check_EAL
|
||||
#if !HAS_OPCODES_65CE02
|
||||
jsr lvs_advance_MEMUSS
|
||||
#else
|
||||
inw MEMUSS+0
|
||||
#endif
|
||||
jsr lvs_check_EAL
|
||||
bne iec_save_loop
|
||||
|
||||
iec_save_loop_end:
|
||||
|
||||
@@ -87,25 +87,22 @@ lvs_setup_MEMUSS:
|
||||
|
||||
#endif
|
||||
|
||||
#if CONFIG_TAPE_TURBO || CONFIG_IEC
|
||||
#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO || CONFIG_IEC
|
||||
|
||||
lvs_advance_MEMUSS_check_EAL:
|
||||
#if !HAS_OPCODES_65CE02
|
||||
|
||||
lvs_advance_MEMUSS:
|
||||
|
||||
// Advance pointer
|
||||
#if !HAS_OPCODES_65CE02
|
||||
|
||||
inc MEMUSS+0
|
||||
bne !+
|
||||
inc MEMUSS+1
|
||||
!:
|
||||
#else
|
||||
inw MEMUSS+0
|
||||
rts
|
||||
|
||||
#endif
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO || CONFIG_IEC
|
||||
|
||||
lvs_check_EAL:
|
||||
|
||||
lda MEMUSS+1
|
||||
@@ -116,7 +113,6 @@ lvs_check_EAL:
|
||||
!:
|
||||
rts
|
||||
|
||||
#endif
|
||||
|
||||
lvs_display_searching_for:
|
||||
|
||||
|
||||
@@ -56,15 +56,21 @@ load_tape_normal:
|
||||
ldx #%00010001 // start timer, force latch reload
|
||||
stx CIA2_CRA // $DD0E
|
||||
|
||||
// Temporarily store MEMUSS in EAL
|
||||
|
||||
lda MEMUSS+1
|
||||
sta EAL+1
|
||||
lda MEMUSS+0
|
||||
sta EAL+0
|
||||
|
||||
// Start playing
|
||||
|
||||
jsr tape_ask_play
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
load_tape_normal_header:
|
||||
|
||||
/* XXX try to reuse block retrieeval rooutine, like this:
|
||||
|
||||
// Try to load header into tape buffer
|
||||
|
||||
lda TAPE1+1
|
||||
@@ -72,66 +78,36 @@ load_tape_normal_header:
|
||||
lda TAPE1+0
|
||||
sta MEMUSS+0
|
||||
|
||||
// Initialize checksum (RIPRTY, see http://sta.c64.org/cbm64mem.html)
|
||||
|
||||
lda #$00
|
||||
sta RIPRTY
|
||||
// Retrieve the header
|
||||
|
||||
// Retrieve the header XXX limit it to 192 bytes
|
||||
|
||||
jsr tape_normal_get_block
|
||||
jsr tape_normal_pilot_header
|
||||
jsr tape_normal_get_data // XXX limit it to 192 bytes
|
||||
bcs load_tape_normal_header // unable to read block, try again
|
||||
|
||||
// Handle the header
|
||||
// Check header type
|
||||
|
||||
jsr tape_handle_header
|
||||
bcs load_tape_normal_header // if name does not match, look for other header
|
||||
*/
|
||||
|
||||
// Read pilot and sync of the first header
|
||||
|
||||
jsr tape_normal_pilot
|
||||
ldy #$89
|
||||
jsr tape_normal_sync
|
||||
bcs load_tape_normal_header
|
||||
|
||||
ldy #$00
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
load_tape_normal_header_loop:
|
||||
|
||||
// Read the header
|
||||
|
||||
jsr tape_normal_get_marker // XXX handle result
|
||||
jsr tape_normal_get_byte // XXX handle errors
|
||||
sta (TAPE1), y
|
||||
iny
|
||||
cpy #$15
|
||||
bne load_tape_normal_header_loop
|
||||
|
||||
// Read pilot and sync of the second header
|
||||
|
||||
jsr tape_normal_pilot
|
||||
ldy #$09
|
||||
jsr tape_normal_sync
|
||||
bcs load_tape_normal_header
|
||||
|
||||
// XXX do not skip second header, use it to correct data
|
||||
ldy #$15
|
||||
!:
|
||||
jsr tape_normal_get_marker
|
||||
jsr tape_normal_get_byte
|
||||
dey
|
||||
bne !-
|
||||
|
||||
// For now only one type of header is supported
|
||||
|
||||
ldy #$00
|
||||
ldy #$00 // XXX probably can be optimized for 65C02
|
||||
lda (TAPE1),y
|
||||
|
||||
cmp #$05
|
||||
beq_far tape_load_error // end of tape mark, nothing to load
|
||||
|
||||
cmp #$01
|
||||
bne load_tape_normal_header // XXX also handle other header types, see Mapping the C64 page 77
|
||||
beq !+
|
||||
cmp #$03
|
||||
bne load_tape_normal_header // header types 1 and 3 are loadable, see Mapping the C64, page 77
|
||||
|
||||
// XXX handle non-relocatable program, header type 3
|
||||
|
||||
!:
|
||||
// Handle the header
|
||||
|
||||
// Restore MEMUSS
|
||||
|
||||
lda EAL+1
|
||||
sta MEMUSS+1
|
||||
lda EAL+0
|
||||
sta MEMUSS+0
|
||||
|
||||
// Handle the header
|
||||
|
||||
@@ -142,28 +118,14 @@ load_tape_normal_header_loop:
|
||||
|
||||
load_tape_normal_payload:
|
||||
|
||||
// Initialize checksum (RIPRTY, see http://sta.c64.org/cbm64mem.html)
|
||||
|
||||
lda #$00
|
||||
sta RIPRTY
|
||||
|
||||
// Retrieve data
|
||||
|
||||
jsr tape_normal_pilot_data
|
||||
jsr tape_normal_get_data
|
||||
bcs_far tape_load_error
|
||||
|
||||
// Advance MEMUSS (see Mapping the C64, page 36), check if end
|
||||
|
||||
tya
|
||||
clc
|
||||
adc MEMUSS+0
|
||||
sta MEMUSS+0
|
||||
bcc !+
|
||||
inc MEMUSS+1
|
||||
!:
|
||||
// XXX check below does not work - why?
|
||||
// jsr lvs_check_EAL
|
||||
// bne_far tape_load_error // amount of data read does not match header info
|
||||
jsr lvs_check_EAL
|
||||
bne_far tape_load_error // amount of data read does not match header info
|
||||
|
||||
jmp tape_load_success
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ load_tape_turbo_header_loop:
|
||||
// Handle the header
|
||||
|
||||
jsr tape_clean_sid
|
||||
jsr tape_handle_header
|
||||
jsr tape_handle_header // XXX handle non-relocatable programs - any non-0 even header type
|
||||
bcs load_tape_turbo_header // if name does not match, look for other header
|
||||
|
||||
// FALLTROUGH
|
||||
@@ -91,7 +91,12 @@ load_tape_turbo_loop:
|
||||
sta PRTY
|
||||
|
||||
// Advance MEMUSS (see Mapping the C64, page 36)
|
||||
jsr lvs_advance_MEMUSS_check_EAL
|
||||
#if !HAS_OPCODES_65CE02
|
||||
jsr lvs_advance_MEMUSS
|
||||
#else
|
||||
inw MEMUSS+0
|
||||
#endif
|
||||
jsr lvs_check_EAL
|
||||
bne load_tape_turbo_loop
|
||||
|
||||
// Get the checksum
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//
|
||||
// Tape (normal) helper routine - byte reading
|
||||
//
|
||||
// Returns byte in .A, Carry flag set = error
|
||||
// Returns byte in .A (also sotred in INBIT), Carry flag set = error
|
||||
//
|
||||
|
||||
|
||||
|
||||
@@ -14,61 +14,46 @@
|
||||
|
||||
tape_normal_get_data:
|
||||
|
||||
// Initialize checksum (RIPRTY, see http://sta.c64.org/cbm64mem.html)
|
||||
|
||||
lda #$00
|
||||
sta RIPRTY
|
||||
|
||||
// Read the pilot and sync of the block
|
||||
|
||||
jsr tape_normal_pilot
|
||||
ldy #$89
|
||||
jsr tape_normal_sync
|
||||
bcs tape_normal_get_block_done // XXX make it more erroor resistant
|
||||
|
||||
// Initialize byte counter
|
||||
ldy #$00
|
||||
jsr tape_normal_get_marker
|
||||
|
||||
tape_normal_get_data_loop:
|
||||
|
||||
jsr tape_normal_get_marker
|
||||
bcs tape_normal_get_data_2nd_copy // end of data for the block
|
||||
jsr tape_normal_get_byte
|
||||
|
||||
bcs tape_normal_get_block_done // error reading byte - fatal for now
|
||||
jsr tape_normal_get_marker
|
||||
bcs tape_normal_get_checksum // end of data for the block
|
||||
|
||||
// Store byte, calculate checksum
|
||||
lda INBIT
|
||||
ldy #$00 // XXX probably can be optimized for 65C02
|
||||
sta (MEMUSS), y
|
||||
eor RIPRTY
|
||||
sta RIPRTY
|
||||
|
||||
iny
|
||||
bne tape_normal_get_data_loop
|
||||
// Advance pointer
|
||||
#if !HAS_OPCODES_65CE02
|
||||
jsr lvs_advance_MEMUSS
|
||||
#else
|
||||
inw MEMUSS+0
|
||||
#endif
|
||||
|
||||
// 256 bytes read
|
||||
|
||||
inc MEMUSS+1
|
||||
jmp tape_normal_get_data_loop
|
||||
|
||||
tape_normal_get_data_2nd_copy:
|
||||
tape_normal_get_checksum: // XXX handle second copy, with pilot starting from $09
|
||||
|
||||
// Read the pilot and sync of the block
|
||||
|
||||
jsr tape_normal_pilot
|
||||
ldy #$09
|
||||
jsr tape_normal_sync
|
||||
bcs tape_normal_get_block_done // XXX make it more error resistant
|
||||
|
||||
// For now skip the error correction data
|
||||
!:
|
||||
jsr tape_normal_get_marker
|
||||
bcs tape_normal_get_checksum
|
||||
jsr tape_normal_get_byte
|
||||
tay
|
||||
jmp !-
|
||||
|
||||
tape_normal_get_checksum:
|
||||
|
||||
tya
|
||||
lda INBIT
|
||||
eor RIPRTY
|
||||
cmp #$01 // sets Carry if checksum verification failed
|
||||
|
||||
clc // XXX checksum calculation fails - why?
|
||||
cmp #$01 // sets Carry if checksum verification fails
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
|
||||
@@ -3,27 +3,70 @@
|
||||
// Tape (turbo) helper routine - handling the pilot
|
||||
//
|
||||
|
||||
// Injest the pilot - series of short pulses. According to http://sidpreservation.6581.org/tape-format/
|
||||
// it consist of the following number of pulses:
|
||||
// - $6A00 for header
|
||||
// - $1A00 for data and seq block header
|
||||
// - $4F for repeated header/data
|
||||
|
||||
|
||||
#if CONFIG_TAPE_NORMAL
|
||||
|
||||
|
||||
tape_normal_pilot:
|
||||
|
||||
// Injest the pilot - series of short pulses. According to http://sidpreservation.6581.org/tape-format/
|
||||
// it consist of the foollowing number of pulses:
|
||||
// - $6A00 for header
|
||||
// - $1A00 for data and seq block header
|
||||
// - $4F for repeated header/data
|
||||
tape_normal_pilot_short: // require 1x $40 pulses
|
||||
|
||||
lda #$01
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_pilot_common:
|
||||
|
||||
sta FSBLK
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_pilot_common_restart:
|
||||
|
||||
lda FSBLK
|
||||
sta ROPRTY
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_pilot_common_loop_outer:
|
||||
|
||||
ldy #$40
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_pilot_common_loop_inner:
|
||||
|
||||
ldy #$05 // this should be enough
|
||||
!:
|
||||
jsr tape_normal_get_pulse
|
||||
bcc tape_normal_pilot // not a pilot - try again
|
||||
bcc tape_normal_pilot_common_restart // not a pilot - try again
|
||||
|
||||
dey
|
||||
bne !-
|
||||
bne tape_normal_pilot_common_loop_inner
|
||||
|
||||
dec ROPRTY
|
||||
bne tape_normal_pilot_common_loop_outer
|
||||
|
||||
rts
|
||||
|
||||
|
||||
|
||||
tape_normal_pilot_data: // require 4x $40 pulses
|
||||
|
||||
lda #$04
|
||||
|
||||
skip_2_bytes_trash_nvz
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_pilot_header: // require 128x $40 pulses
|
||||
|
||||
lda #$80
|
||||
|
||||
jmp tape_normal_pilot_common // XXX calibrate tape speeed afterwards
|
||||
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user