refactored LOAD routine so that it's parts are reuseable

This commit is contained in:
FeralChild64 committed 2019-07-19 17:23:11 +02:00
1 parent 66047996bb
commit da4cc3a89b
12 files changed
+269 -231

No files matched your search

+39 -130
View File
@@ -19,7 +19,7 @@
;; Searching through Compute's Mapping the 64, we find the following
;; things are used:
;; $93 = kernal_load_or_verify_flag
;; $93 = VERCK
;; $AC = current pointer for loading/verifying
;; $C1 = similar to the above.
@@ -30,11 +30,11 @@
load:
;; Are we loading or verifying?
sta kernal_load_or_verify_flag
sta VERCK
;; Store start address of LOAD
stx load_save_start_ptr+0
sty load_save_start_ptr+1
stx STAL+0
sty STAL+1
;; Reset status
jsr kernalstatus_reset
@@ -43,21 +43,8 @@ load:
jsr install_ram_routines
;; Display SEARCHING FOR + filename
lda MSGFLG
bpl +
jsr printf
.byte $0D,"SEARCHING FOR ",0
ldy #$00
print_filename_loop:
jsr lvs_display_searching_for
cpy current_filename_length
beq +
ldx #<current_filename_ptr
jsr peek_under_roms
jsr JCHROUT
iny
jmp print_filename_loop
*
;; http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf
;; p13, 16; also p16 tells us this routine doesn't mess with the file table
;; in the C64, only in the drive.
@@ -65,21 +52,21 @@ print_filename_loop:
;; Call device to LISTEN (p16)
lda current_device_number
jsr listen
bcs load_device_not_found_error
bcs lvs_device_not_found_error
;; Open channel #0 (p16)
lda #$00
jsr tksa
bcs load_error
bcs lvs_load_verify_error
;; Send filename (p16)
ldy #0
send_filename:
load_send_filename:
cpy FNLEN
beq load_filename_sent
cpy current_filename_length
beq sent_filename
ldx #<current_filename_ptr
jsr peek_under_roms
iny
@@ -90,7 +77,7 @@ send_filename:
pha
;; Set Carry flag on the last file name character, to mark EOI
cmp current_filename_length
cmp FNLEN
clc
bne +
sec
@@ -100,108 +87,66 @@ send_filename:
pla
tay
jmp send_filename
jmp load_send_filename
sent_filename:
load_filename_sent:
;; Command device to unlisten to indicate end of file name. (p16)
jsr unlsn
bcs load_error
bcs lvs_load_verify_error
jsr iec_set_idle ;; XXX is it needed?
;; Now command device to talk (p16)
lda current_device_number
jsr talk
bcs load_error
bcs lvs_load_verify_error
lda #$60 ; open channel / data (p3) , required according to p13
jsr iec_tx_command
bcs load_error
bcs lvs_load_verify_error
;; We are currently talker, so do the IEC turn around so that we
;; are the listener (p16)
jsr iec_turnaround_to_listen
bcs load_error
bcs lvs_load_verify_error
;; Get load address and store it if secondary address is zero
jsr iec_rx_byte
bcs load_file_not_found_error
bcs lvs_file_not_found_error
ldx current_secondary_address
beq +
sta load_save_start_ptr+0
sta STAL+0
*
jsr iec_rx_byte
bcs load_file_not_found_error
bcs lvs_file_not_found_error
ldx current_secondary_address
beq +
sta load_save_start_ptr+1
sta STAL+1
*
;; Display LOADING / VERIFYING and start address
lda MSGFLG
bpl load_loop
lda kernal_load_or_verify_flag
beq +
jsr printf
.byte $0D, "VERIFYING", 0
jmp load_print_start_addr
*
jsr printf
.byte $0D, "LOADING", 0
load_print_start_addr:
jsr printf
.byte " FROM $",0
lda load_save_start_ptr+1
jsr printf_printhexbyte
lda load_save_start_ptr+0
jsr printf_printhexbyte
;; Display start address
jsr lvs_display_loading_verifying
load_loop:
;; We are now ready to receive bytes
jsr iec_rx_byte
bcs load_error
bcs lvs_load_verify_error
;; Save it and advance pointer.
;; As with our BASIC, we want to enable LOADing
;; anywhere in memory, including over the IO space.
;; Thus we have to use a helper routine in low memory
;; to do the memory access
;; Handle the byte (store in memory / verify)
jsr lvs_handle_byte_load_verify
bcs lvs_load_verify_error
;; Advance pointer to data
jsr lvs_advance_pointer
bcs lvs_wrap_around_error
;; Save byte under ROMs and IO if required
php
sei
ldx #$33
stx $01
ldy #0
sta (load_save_start_ptr),y
ldx #$37
stx $01
plp
;; Advance pointer
inc load_save_start_ptr
bne +
inc load_save_start_ptr+1
;; If we wrap around to $0000, then this is bad.
beq load_wrap_around_error
*
;; Check for EOI - if so, this was the last byte
lda IOSTATUS
and #K_STS_EOI
beq load_loop
load_done:
;; Display end address
lda MSGFLG
bpl +
jsr printf
.byte " TO $",0
lda load_save_start_ptr+1
jsr printf_printhexbyte
lda load_save_start_ptr+0
jsr printf_printhexbyte
lda #$0D
jsr JCHROUT
*
jsr lvs_display_done
;; Close file on drive
;; Command drive to stop talking and to close the file
@@ -214,7 +159,7 @@ load_done:
lda current_device_number
jsr listen
lda #$e0
lda #$E0
jsr iec_tx_command
;; Tell drive to unlisten
@@ -223,41 +168,5 @@ load_done:
;; Set IEC status back to idle
jsr iec_set_idle
;; Return last address - Compute's Mapping the 64 says without the '+1',
;; checked (short test program) on original ROMs that this is really the case
ldx load_save_start_ptr+0
ldy load_save_start_ptr+1
clc
rts
load_wrap_around_error:
;; This error is probably not even detected by C64 Kernal;
;; report BASIC error code that looks the most sane
lda #B_ERR_OVERFLOW
sec
rts
load_device_not_found_error:
jsr kernalstatus_DEVICE_NOT_FOUND
jmp kernalerror_DEVICE_NOT_FOUND
load_file_not_found_error:
jmp kernalerror_FILE_NOT_FOUND
load_error:
;; XXX should we really return BASIC error code here?
lda kernal_load_or_verify_flag
beq load_verify_error
lda #B_ERR_LOAD
bne +
load_verify_error:
lda #B_ERR_VERIFY
*
sec
rts
;; Return last address
jmp lvs_return_last_address