refactored LOAD routine so that it's parts are reuseable
This commit is contained in:
1 parent
66047996bb
commit
da4cc3a89b
12 files changed
+269
-231
No files matched your search
@@ -3,30 +3,18 @@
|
||||
; (And only those for now that we feel the need to implement initially)
|
||||
; (https://www.c64-wiki.com/wiki/Zeropage)
|
||||
|
||||
.alias TXTTAB $2B
|
||||
.alias IOSTATUS $90
|
||||
; Keys down clears bits. STOP=bit 7, C= bit 6, SPACE bit 4, CTRL bit 2
|
||||
.alias BUCKYSTATUS $91
|
||||
.alias kernal_load_or_verify_flag $93
|
||||
.alias C3PO $94 ; flag - is BSOUR content valid
|
||||
.alias BSOUR $95 ; serial bus buffered output byte
|
||||
.alias current_file_num $98
|
||||
.alias LDTND $98 ; number of entries in LAT / FAT / SAT tables
|
||||
.alias DFLTN $99
|
||||
.alias input_device_number DFLTN
|
||||
.alias MSGFLG $9D ; bit 6 = error messages, bit 7 = control message
|
||||
.alias jiffy_clock_24bits $a0
|
||||
.alias cassette_buffer_bytes_used $A6
|
||||
.alias load_or_scroll_temp_pointer $AC
|
||||
;; We also use the following for temp colour pointer when scrolling
|
||||
.alias load_save_verify_end_address $AE
|
||||
.alias cassette_buffer_ptr $B2
|
||||
.alias current_filename_length $B7
|
||||
.alias current_logical_filenum $B8
|
||||
.alias current_secondary_address $B9
|
||||
.alias current_device_number $BA
|
||||
.alias current_filename_ptr $BB
|
||||
.alias load_save_start_ptr $C1
|
||||
.alias load_save_end_ptr $C3
|
||||
.alias last_key_matrix_position $C5
|
||||
.alias keys_in_key_buffer $C6
|
||||
@@ -53,25 +41,11 @@
|
||||
.alias keyboard_decoding_table_ptr $F5
|
||||
.alias rs232_rx_buffer_ptr $F7
|
||||
.alias rs232_tx_buffer_ptr $F9
|
||||
|
||||
;; 2-byte location below seems to be a good place for temporary storage,
|
||||
;; it seems used for timing during tape reads only - see:
|
||||
;; - 'C64 Programmer's Reference Guide', page 314
|
||||
;; - 'Compute's Mapping the Commodore 64', page 32
|
||||
.alias CMP0 $B0 ;; $B0-$B1
|
||||
|
||||
;; Kernal tables for opened files, 10 entries each
|
||||
.alias LAT $0259 ; logical file numbers
|
||||
.alias FAT $0263 ; device numbers
|
||||
.alias SAT $026D ; secondary addresses
|
||||
|
||||
; "Compute's Mapping the 64" book
|
||||
.alias keyboard_buffer $0277
|
||||
.alias MEMSTR $0281
|
||||
.alias MEMSIZ $0283 ; NOTE: Mapping the 64 erroniously has the hex as $282, while the DEC is correct
|
||||
.alias text_colour $0286 ; p55
|
||||
.alias colour_under_cursor $0287 ; p56
|
||||
.alias HIBASE $0288 ; p56 (high byte of start of screen)
|
||||
.alias key_buffer_size $0289 ; p57
|
||||
|
||||
;; 0 = cursor keys, insert, delete and space repeat, but nothing else
|
||||
@@ -87,8 +61,6 @@
|
||||
.alias keyboard_decoding_ptr $028F
|
||||
.alias enable_case_switch $0291
|
||||
.alias screen_scroll_disable $0292
|
||||
.alias RSSTAT $0297 ; RS-232 status
|
||||
.alias pal_or_ntsc $02A6
|
||||
|
||||
;; Under-ROM routines
|
||||
;; (BASIC also includes them. XXX - We should de-duplicate them in a safe manner)
|
||||
|
||||
+39
-130
@@ -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
|
||||
@@ -0,0 +1,128 @@
|
||||
|
||||
;;
|
||||
;; Helper functions for various LOAD/VERIVY/SAVE routine variants (IEC / U64 / etc.)
|
||||
;;
|
||||
|
||||
lvs_handle_byte_load_verify:
|
||||
|
||||
;; 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
|
||||
|
||||
;; Save byte under ROMs and IO if required
|
||||
php
|
||||
sei
|
||||
;; XXX behavior should depend on address
|
||||
ldx #$33
|
||||
stx $01
|
||||
ldy #0
|
||||
sta (STAL),y
|
||||
ldx #$37
|
||||
stx $01
|
||||
plp
|
||||
rts
|
||||
|
||||
lvs_advance_pointer:
|
||||
;; Advance pointer
|
||||
inc STAL
|
||||
bne lvs_success_end
|
||||
inc STAL+1
|
||||
;; If we wrap around to $0000, then this is bad.
|
||||
beq lvs_error_end
|
||||
*
|
||||
clc
|
||||
rts
|
||||
|
||||
lvs_display_searching_for:
|
||||
lda MSGFLG
|
||||
bpl lvs_display_end
|
||||
jsr printf
|
||||
.byte $0D,"SEARCHING FOR ",0
|
||||
ldy #$00
|
||||
*
|
||||
cpy FNLEN
|
||||
beq lvs_display_end
|
||||
ldx #<current_filename_ptr
|
||||
jsr peek_under_roms
|
||||
jsr JCHROUT
|
||||
iny
|
||||
jmp -
|
||||
|
||||
lvs_display_end:
|
||||
rts
|
||||
|
||||
lvs_display_loading_verifying:
|
||||
;; Display LOADING / VERIFYING and start address
|
||||
lda MSGFLG
|
||||
bpl lvs_display_end
|
||||
lda VERCK
|
||||
beq +
|
||||
jsr printf
|
||||
.byte $0D,"VERIFYING",0
|
||||
jmp lvs_display_start_addr
|
||||
*
|
||||
jsr printf
|
||||
.byte $0D,"LOADING",0
|
||||
;; FALLTHROUGH
|
||||
|
||||
lvs_display_start_addr:
|
||||
jsr printf
|
||||
.byte " FROM $",0
|
||||
lda STAL+1
|
||||
jsr printf_printhexbyte
|
||||
lda STAL+0
|
||||
jmp printf_printhexbyte
|
||||
|
||||
lvs_display_done:
|
||||
;; Display end address
|
||||
lda MSGFLG
|
||||
bpl lvs_display_end
|
||||
jsr printf
|
||||
.byte " TO $",0
|
||||
lda STAL+1
|
||||
jsr printf_printhexbyte
|
||||
lda STAL+0
|
||||
jsr printf_printhexbyte
|
||||
lda #$0D
|
||||
jmp JCHROUT
|
||||
|
||||
lvs_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
|
||||
lvs_error_end:
|
||||
sec
|
||||
rts
|
||||
|
||||
lvs_return_last_address:
|
||||
;; 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 STAL+0
|
||||
ldy STAL+1
|
||||
;; FALLTHROUGH
|
||||
|
||||
lvs_success_end:
|
||||
clc
|
||||
rts
|
||||
|
||||
lvs_device_not_found_error:
|
||||
|
||||
jsr kernalstatus_DEVICE_NOT_FOUND
|
||||
jmp kernalerror_DEVICE_NOT_FOUND
|
||||
|
||||
.alias lvs_file_not_found_error kernalerror_FILE_NOT_FOUND
|
||||
|
||||
lvs_load_verify_error:
|
||||
;; XXX should we really return BASIC error code here?
|
||||
lda VERCK
|
||||
beq lvs_verify_error
|
||||
lda #B_ERR_LOAD
|
||||
bne lvs_error_end
|
||||
;; FALLTHROUGH
|
||||
|
||||
lvs_verify_error:
|
||||
lda #B_ERR_VERIFY
|
||||
sec
|
||||
rts
|
||||
@@ -334,7 +334,7 @@ next_row:
|
||||
;; so that RUN/STOP etc can be checked easily
|
||||
;; (Compute's Mapping the 64, p27)
|
||||
lda ScanResult+0
|
||||
sta BUCKYSTATUS
|
||||
sta STKEY
|
||||
|
||||
;; Store de-bounce data for bucky keys
|
||||
;; (Compute's Mapping the 64, p58-59)
|
||||
|
||||
+3
-3
@@ -13,8 +13,8 @@ setnam:
|
||||
;; There are 6 sane ways to implement this routine,
|
||||
;; I hope this one won't cause similarity to CBM code
|
||||
|
||||
sta current_filename_length
|
||||
sty current_filename_ptr + 1
|
||||
stx current_filename_ptr + 0
|
||||
sta FNLEN
|
||||
sty STAL + 1
|
||||
stx STAL + 0
|
||||
|
||||
rts
|
||||
+2
-2
@@ -9,11 +9,11 @@
|
||||
;;
|
||||
|
||||
stop:
|
||||
;; Bit 7 of BUCKYSTATUS contains the state of the STOP key
|
||||
;; Bit 7 of STKEY contains the state of the STOP key
|
||||
;; (Compute's Mapping the 64, p27)
|
||||
|
||||
;; BASIC checks carry flag to indicate STOP or not
|
||||
lda BUCKYSTATUS
|
||||
lda STKEY
|
||||
and #$80
|
||||
beq stop_pressed
|
||||
|
||||
|
||||
Reference in new issue
Block a user