more work towards tape error correction
This commit is contained in:
1 parent
136cb528f7
commit
28a96a7ffc
4 files changed
+91
-61
No files matched your search
@@ -62,16 +62,15 @@ load_tape_normal_header:
|
||||
|
||||
// Try to load header into tape buffer (we will restore MEMUSS later)
|
||||
|
||||
lda TAPE1+1
|
||||
sta MEMUSS+1
|
||||
lda TAPE1+0
|
||||
sta MEMUSS+0
|
||||
|
||||
// Retrieve the header
|
||||
|
||||
jsr tape_normal_get_pilot_header
|
||||
jsr tape_normal_get_data
|
||||
bcs load_tape_normal_header // unable to read block, try again XXX restore MEMUSS and jump to turbo detection
|
||||
|
||||
jsr load_tape_normal_buf_MEMUSS
|
||||
jsr tape_normal_get_data_1
|
||||
bcs load_tape_normal_header // unable to read block, try again XXX jump to turbo detection
|
||||
|
||||
jsr load_tape_normal_buf_MEMUSS
|
||||
jsr tape_normal_get_data_2
|
||||
bcs load_tape_normal_header // block load error, try again XXX jump to turbo detection
|
||||
|
||||
// Check header type
|
||||
|
||||
@@ -103,13 +102,27 @@ load_tape_normal_payload:
|
||||
|
||||
jsr tape_normal_get_pilot_data
|
||||
ldy #$00 // no data size limit
|
||||
jsr tape_normal_get_data
|
||||
jsr tape_normal_get_data_1
|
||||
bcs_16 tape_load_error
|
||||
|
||||
jsr lvs_check_EAL
|
||||
bne_16 tape_load_error // amount of data read does not match header info
|
||||
|
||||
// XXX setup MEMUSS once again
|
||||
jsr tape_normal_get_data_2
|
||||
bcs_16 tape_load_error
|
||||
|
||||
jmp tape_load_success
|
||||
|
||||
|
||||
load_tape_normal_buf_MEMUSS: // set MEMUSS (start address) as tape buffer
|
||||
|
||||
lda TAPE1+1
|
||||
sta MEMUSS+1
|
||||
lda TAPE1+0
|
||||
sta MEMUSS+0
|
||||
|
||||
rts
|
||||
|
||||
|
||||
#endif
|
||||
@@ -160,7 +160,7 @@ tape_handle_header:
|
||||
sbc STAL+1
|
||||
sta EAL+1
|
||||
|
||||
// STAL = MEMUSS
|
||||
// STAL = MEMUSS XXX is it needed?
|
||||
|
||||
lda MEMUSS+0
|
||||
sta STAL+0
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
//
|
||||
// Tape (normal) helper routine - data block reading
|
||||
// Tape (normal) helper routine - data block (primary) reading
|
||||
//
|
||||
// Stores data starting from MEMUSS, Carry set means error, on 0 bit .A is 0 too
|
||||
// .Y not equal to 0 - returns error if data block is longer (length includes checksum)
|
||||
@@ -15,7 +15,7 @@
|
||||
#if CONFIG_TAPE_NORMAL
|
||||
|
||||
|
||||
tape_normal_get_data:
|
||||
tape_normal_get_data_1:
|
||||
|
||||
// Initialize checksum (RIPRTY, see http://sta.c64.org/cbm64mem.html)
|
||||
// and pointers for error log and correction mechanism
|
||||
@@ -26,7 +26,7 @@ tape_normal_get_data:
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_get_data_block_1:
|
||||
tape_normal_get_data_1_block:
|
||||
|
||||
//
|
||||
// Read the 1st copy of the block
|
||||
@@ -35,19 +35,19 @@ tape_normal_get_data_block_1:
|
||||
// Read sync of the block
|
||||
ldy #$89
|
||||
jsr tape_normal_sync
|
||||
bcs tape_normal_get_data_fail
|
||||
bcs tape_normal_get_data_1_fail
|
||||
jsr tape_normal_get_marker
|
||||
|
||||
tape_normal_get_data_loop_1:
|
||||
tape_normal_get_data_1_loop:
|
||||
|
||||
jsr tape_normal_get_byte
|
||||
bcc tape_normal_get_data_loop_1_byte_OK
|
||||
bcc tape_normal_get_data_1_loop_byte_OK
|
||||
|
||||
// Problem reading a byte, try to add it to the error log
|
||||
|
||||
tsx
|
||||
cpx #$20 // just to be on a safe side
|
||||
bcc tape_normal_get_data_fail // branch if no more space in error log
|
||||
bcc tape_normal_get_data_1_fail // branch if no more space in error log
|
||||
|
||||
ldx PTR1
|
||||
lda MEMUSS+0
|
||||
@@ -60,18 +60,17 @@ tape_normal_get_data_loop_1:
|
||||
|
||||
// Addres added to error log, check if this was a checksum
|
||||
jsr tape_normal_get_marker
|
||||
bcc tape_normal_get_data_loop_1_advance
|
||||
bcs tape_normal_get_data_block_2
|
||||
bcc tape_normal_get_data_1_loop_advance
|
||||
bcs tape_normal_get_data_1_success
|
||||
|
||||
|
||||
tape_normal_get_data_loop_1_byte_OK:
|
||||
tape_normal_get_data_1_loop_byte_OK:
|
||||
|
||||
jsr tape_normal_get_marker
|
||||
bcc !+
|
||||
|
||||
// End of the block
|
||||
jsr tape_normal_update_checksum
|
||||
jmp tape_normal_get_data_block_2
|
||||
jmp tape_normal_get_data_1_success
|
||||
|
||||
!:
|
||||
// Store byte, calculate checksum
|
||||
@@ -82,7 +81,7 @@ tape_normal_get_data_loop_1_byte_OK:
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_get_data_loop_1_advance:
|
||||
tape_normal_get_data_1_loop_advance:
|
||||
|
||||
// Advance pointer
|
||||
#if !HAS_OPCODES_65CE02
|
||||
@@ -91,48 +90,15 @@ tape_normal_get_data_loop_1_advance:
|
||||
inw MEMUSS+0
|
||||
#endif
|
||||
|
||||
jmp tape_normal_get_data_loop_1
|
||||
jmp tape_normal_get_data_1_loop
|
||||
|
||||
|
||||
tape_normal_get_data_block_2:
|
||||
|
||||
//
|
||||
// Read the 2nd copy of the block
|
||||
//
|
||||
|
||||
// First check if there is a need to read anything
|
||||
|
||||
// XXX
|
||||
|
||||
// Read sync of the block
|
||||
ldy #$09
|
||||
jsr tape_normal_sync
|
||||
bcs tape_normal_get_data_fail
|
||||
jsr tape_normal_get_marker
|
||||
|
||||
// XXX implement the second pass
|
||||
|
||||
|
||||
lda PTR1
|
||||
beq tape_normal_get_data_checksum
|
||||
|
||||
jmp tape_normal_get_data_fail
|
||||
|
||||
|
||||
|
||||
|
||||
tape_normal_get_data_checksum:
|
||||
|
||||
lda RIPRTY
|
||||
cmp #$01 // sets Carry if checksum verification fails
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_get_data_done:
|
||||
tape_normal_get_data_1_success:
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
tape_normal_get_data_fail:
|
||||
tape_normal_get_data_1_fail:
|
||||
|
||||
sec
|
||||
rts
|
||||
@@ -0,0 +1,51 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# * KERNAL_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
//
|
||||
// Tape (normal) helper routine - data block (backup) reading
|
||||
//
|
||||
|
||||
|
||||
#if CONFIG_TAPE_NORMAL
|
||||
|
||||
|
||||
tape_normal_get_data_2:
|
||||
|
||||
// First check if there is a need to read anything
|
||||
|
||||
lda PTR1
|
||||
beq tape_normal_get_data_2_checksum
|
||||
|
||||
// Read sync of the block
|
||||
|
||||
ldy #$09
|
||||
jsr tape_normal_sync
|
||||
bcs tape_normal_get_data_2_done // Carry already set, will indicate error
|
||||
jsr tape_normal_get_marker
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_get_data_2_loop:
|
||||
|
||||
// XXX read missing bytes
|
||||
|
||||
sec
|
||||
rts
|
||||
|
||||
|
||||
tape_normal_get_data_2_checksum:
|
||||
|
||||
// Validate checksum
|
||||
|
||||
lda RIPRTY
|
||||
cmp #$01 // sets Carry if checksum verification fails
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
tape_normal_get_data_2_done:
|
||||
|
||||
rts
|
||||
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user