diff --git a/c64/kernal/tape/load_tape_normal.s b/c64/kernal/tape/load_tape_normal.s index 383de31a..dc5742e5 100644 --- a/c64/kernal/tape/load_tape_normal.s +++ b/c64/kernal/tape/load_tape_normal.s @@ -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 diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index e2461a05..136d1408 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -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 diff --git a/c64/kernal/tape/tape_normal_get_data.s b/c64/kernal/tape/tape_normal_get_data_1.s similarity index 56% rename from c64/kernal/tape/tape_normal_get_data.s rename to c64/kernal/tape/tape_normal_get_data_1.s index 34e16f9d..09ab2c7c 100644 --- a/c64/kernal/tape/tape_normal_get_data.s +++ b/c64/kernal/tape/tape_normal_get_data_1.s @@ -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 diff --git a/c64/kernal/tape/tape_normal_get_data_2.s b/c64/kernal/tape/tape_normal_get_data_2.s new file mode 100644 index 00000000..32eee5a6 --- /dev/null +++ b/c64/kernal/tape/tape_normal_get_data_2.s @@ -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