From 1005ee49524448938a3ca96dbc0d2d6cea273fa1 Mon Sep 17 00:00:00 2001 From: Paul Gardner-Stephen Date: Sun, 5 May 2019 02:02:01 +0930 Subject: [PATCH] fix detection and reporting of FILE NOT FOUND error --- c64/basic/cmd_load.s | 2 +- c64/kernal/iec_rx_byte.s | 14 ++++++++++---- c64/kernal/iec_turnaround_to_listen.s | 23 +++++++++++------------ c64/kernal/load.s | 20 +++++++++++++------- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/c64/basic/cmd_load.s b/c64/basic/cmd_load.s index 23288871..000743fd 100644 --- a/c64/basic/cmd_load.s +++ b/c64/basic/cmd_load.s @@ -64,7 +64,7 @@ got_filename: ;; error code to X, decrement, and handle normally tax dex - jmp do_LOAD_error + jmp do_basic_error * ;; $YYXX is the last loaded address, so store it diff --git a/c64/kernal/iec_rx_byte.s b/c64/kernal/iec_rx_byte.s index 9d168597..9c7f6768 100644 --- a/c64/kernal/iec_rx_byte.s +++ b/c64/kernal/iec_rx_byte.s @@ -23,27 +23,33 @@ iec_rx_clk_wait: rol bpl not_eoi dex + cpx #$21 + bne not_rx_timeout + ;; Time out waiting for CLK to assert again. + ;; = error + sec + rts +not_rx_timeout: + cpx #$00 bpl iec_rx_clk_wait ;; Remember EOI condition lda IOSTATUS ora #$40 sta IOSTATUS - + ;; EOI timeout: So pulse DATA line for 60 usec jsr iec_assert_data jsr iec_wait60us jsr iec_release_clk_and_data - ;; Assert some kind of flag so that we know if it was EOI = the last byte on offer - ;; And still wait for CLK to be asserted ;; XXX - This will cause periodic EOI pulses if the sender takes too long. ;; That is probably ok. ldx #$7f jmp iec_rx_clk_wait -not_eoi: +not_eoi: ;; CLK is now low. Latch input bits in on rising edge ;; of CLK, eight times for eight bits. ldx #7 diff --git a/c64/kernal/iec_turnaround_to_listen.s b/c64/kernal/iec_turnaround_to_listen.s index db021689..25220abf 100644 --- a/c64/kernal/iec_turnaround_to_listen.s +++ b/c64/kernal/iec_turnaround_to_listen.s @@ -18,23 +18,22 @@ iec_turnaround_to_listen: ;; page 8 tells us we should not do anything here after waiting for ;; the clock line to assert. -;; ldx #$ff -;; * lda $dd00 -;; and #$40 -;; bne + -;; dex -;; bne - + ldx #$ff + * lda $dd00 + and #$40 + bne + + dex + bne - - ;; jsr printf - ;; .byte "TURNAROUND FAILED - FILE NOT FOUND?",$0d,$00 + jsr printf + .byte "TURNAROUND FAILED - FILE NOT FOUND?",$0d,$00 ;; ;; Timeout = file not found error ;; ;; (https://www.pagetable.com/?p=1023) - ;; lda #4 - ;; sec - ;; rts + lda #4 + sec + rts * - ;; ATN turn around successful clc rts diff --git a/c64/kernal/load.s b/c64/kernal/load.s index 699781bb..059245e4 100644 --- a/c64/kernal/load.s +++ b/c64/kernal/load.s @@ -126,24 +126,23 @@ sent_filename: jsr iec_turnaround_to_listen bcs load_error - jsr printf - .byte "LOADING",$0d,0 - - ;; Get load address and store it if secondary address is zero jsr iec_rx_byte - bcs load_error + bcs file_not_found_error ldx current_secondary_address beq + sta load_save_start_ptr+0 * jsr iec_rx_byte - bcs load_error + bcs file_not_found_error ldx current_secondary_address beq + sta load_save_start_ptr+1 * + jsr printf + .byte "LOADING",$0d,0 + load_loop: ;; We are now ready to receive bytes jsr iec_rx_byte @@ -206,10 +205,17 @@ load_error: ;; XXX - Indicate KERNAL (not BASIC) LOAD error condtion sec - lda #$02 + lda #28 ;; Re-enable interrupts and return cli ;; (iec_tx_byte will have set/cleared C flag and put result code ;; in A if it was an error). rts + +file_not_found_error: + ;; Indicate KERNAL error condition for file not found + sec + lda #$04 + cli + rts