From e1d21e287fd68738ed8d37387e4e5066e2d5c81b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 22 Jun 2020 21:25:23 +0200 Subject: [PATCH] more I/O work in BASIC --- c64/basic/basic_commands/cmd_load_verify.s | 21 +++----- c64/basic/basic_commands/cmd_save.s | 20 ++++--- .../basic_commands/helper_load_fetch_devnum.s | 20 +++++++ .../helper_load_fetch_secondary.s | 20 +++++++ .../basic_commands/helper_load_init_param.s | 4 ++ .../basic_commands/helper_load_setnam_any.s | 15 ++++++ c64/basic/basic_commands_CC/cmd_bsave.s | 51 +++++++++++++++++- c64/basic/basic_commands_CC/cmd_merge.s | 5 +- c64/basic/engine/fetch_uint8.s | 3 +- testsuite/testdisk.d64 | Bin 174848 -> 174848 bytes 10 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 c64/basic/basic_commands/helper_load_fetch_devnum.s create mode 100644 c64/basic/basic_commands/helper_load_fetch_secondary.s create mode 100644 c64/basic/basic_commands/helper_load_setnam_any.s diff --git a/c64/basic/basic_commands/cmd_load_verify.s b/c64/basic/basic_commands/cmd_load_verify.s index 3dba753d..6e3c0541 100644 --- a/c64/basic/basic_commands/cmd_load_verify.s +++ b/c64/basic/basic_commands/cmd_load_verify.s @@ -16,26 +16,19 @@ cmd_load: lda #$00 // mark operation as LOAD jsr helper_load_init_params + jsr helper_load_setnam_any // if no file name found, use "*" // Fetch the file name jsr helper_load_fetch_filename - bcs cmd_load_no_filename + bcs !+ - // Try to fetch device and secondary address - - jsr fetch_device_secondary - jmp cmd_load_got_params - -cmd_load_no_filename: - - // If no file name is supplied, try to load first file from disc - - lda #$01 // name length - ldx #filename_any - jsr JSETNAM + // Try to fetch device number and secondary address + jsr helper_load_fetch_devnum + bcs !+ + jsr helper_load_fetch_secondary +!: // FALLTROUGH cmd_load_got_params: // input for tape wedge diff --git a/c64/basic/basic_commands/cmd_save.s b/c64/basic/basic_commands/cmd_save.s index f4d4bf9f..5ced4b27 100644 --- a/c64/basic/basic_commands/cmd_save.s +++ b/c64/basic/basic_commands/cmd_save.s @@ -5,22 +5,22 @@ cmd_save: - // Set default device and secondary address; channel is not important now + // Set default device and secondary address - jsr select_device - ldy #$00 - jsr JSETFLS + jsr helper_load_init_params_no_VERCKB // Fetch the file name jsr helper_load_fetch_filename bcs_16 do_MISSING_FILENAME_error - // Try to fetch device + // Try to fetch device number and secondary address - jsr fetch_device_secondary - - // Setup the start and end addresses + jsr helper_load_fetch_devnum + bcs !+ + jsr helper_load_fetch_secondary +!: + // Setup the start address lda #TXTTAB @@ -29,6 +29,10 @@ cmd_save: ldx VARTAB+0 ldy VARTAB+1 + // FALLTROUGH + +cmd_save_do: // entry point for BSAVE + // Perform saving jsr JSAVE diff --git a/c64/basic/basic_commands/helper_load_fetch_devnum.s b/c64/basic/basic_commands/helper_load_fetch_devnum.s new file mode 100644 index 00000000..5b6f66e4 --- /dev/null +++ b/c64/basic/basic_commands/helper_load_fetch_devnum.s @@ -0,0 +1,20 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// +// Tries to fetch device number - sets Carry if failure +// + + +helper_load_fetch_devnum: + + // Fetch the device number + + jsr fetch_coma_uint8 + bcs !+ + + sta FA +!: + rts diff --git a/c64/basic/basic_commands/helper_load_fetch_secondary.s b/c64/basic/basic_commands/helper_load_fetch_secondary.s new file mode 100644 index 00000000..89212e12 --- /dev/null +++ b/c64/basic/basic_commands/helper_load_fetch_secondary.s @@ -0,0 +1,20 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// +// Tries to fetch secondary address - sets Carry if failure +// + + +helper_load_fetch_secondary: + + // Fetch the device number + + jsr fetch_coma_uint8 + bcs !+ + + sta SA +!: + rts diff --git a/c64/basic/basic_commands/helper_load_init_param.s b/c64/basic/basic_commands/helper_load_init_param.s index b9c29be2..3e48bbdb 100644 --- a/c64/basic/basic_commands/helper_load_init_param.s +++ b/c64/basic/basic_commands/helper_load_init_param.s @@ -16,6 +16,10 @@ helper_load_init_params: sta VERCKB + // FALLTROUGH + +helper_load_init_params_no_VERCKB: + // Set default device, set secondary address to 0 jsr select_device diff --git a/c64/basic/basic_commands/helper_load_setnam_any.s b/c64/basic/basic_commands/helper_load_setnam_any.s new file mode 100644 index 00000000..b702ed98 --- /dev/null +++ b/c64/basic/basic_commands/helper_load_setnam_any.s @@ -0,0 +1,15 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Set '*' as file name +// + + +helper_load_setnam_any: + + lda #$01 // name length + ldx #filename_any + jmp JSETNAM diff --git a/c64/basic/basic_commands_CC/cmd_bsave.s b/c64/basic/basic_commands_CC/cmd_bsave.s index 3849a57d..11bbf0f1 100644 --- a/c64/basic/basic_commands_CC/cmd_bsave.s +++ b/c64/basic/basic_commands_CC/cmd_bsave.s @@ -5,4 +5,53 @@ cmd_bsave: - jmp do_NOT_IMPLEMENTED_error // XXX implement the command + // Set default device and secondary address + + jsr helper_load_init_params_no_VERCKB + + // Fetch the file name + + jsr helper_load_fetch_filename + bcs_16 do_MISSING_FILENAME_error + + // Fetch device number + + jsr injest_comma + bcs_16 do_SYNTAX_error + jsr helper_load_fetch_devnum + bcs_16 do_SYNTAX_error + + // Fetch memory area start address + + jsr injest_comma + bcs_16 do_SYNTAX_error + + jsr basic_parse_line_number // XXX detect errors here + + lda LINNUM+0 + pha + lda LINNUM+1 + pha + + // Fetch memory area end address + + jsr injest_comma + bcs_16 do_SYNTAX_error + + jsr basic_parse_line_number // XXX detect errors here + + // Setup start/end addresses + + ldx LINNUM+0 + ldy LINNUM+1 + + pla + sta LINNUM+1 + pla + sta LINNUM+0 + + lda #LINNUM + + // Perform SAVE - reuse regular command + + jmp cmd_save_do diff --git a/c64/basic/basic_commands_CC/cmd_merge.s b/c64/basic/basic_commands_CC/cmd_merge.s index e7e5af3f..375c61f9 100644 --- a/c64/basic/basic_commands_CC/cmd_merge.s +++ b/c64/basic/basic_commands_CC/cmd_merge.s @@ -24,11 +24,8 @@ cmd_merge: !: // Fetch device number - jsr fetch_coma_uint8 - bcs !+ + jsr helper_load_fetch_devnum - sta FA -!: // Perform loading - just for a different address sec diff --git a/c64/basic/engine/fetch_uint8.s b/c64/basic/engine/fetch_uint8.s index 30776d84..1637b056 100644 --- a/c64/basic/engine/fetch_uint8.s +++ b/c64/basic/engine/fetch_uint8.s @@ -17,8 +17,7 @@ fetch_coma_uint8: fetch_uint8: jsr injest_spaces - jsr basic_parse_line_number - // XXX this should also detect errors + jsr basic_parse_line_number // XXX detect errors here lda LINNUM+1 bne_16 do_ILLEGAL_QUANTITY_error lda LINNUM+0 diff --git a/testsuite/testdisk.d64 b/testsuite/testdisk.d64 index a455d2ee8fc3863fbc0022af6383ad7b1d85193c..5401b7138613bda840dcae3bc5d9772765475c78 100644 GIT binary patch delta 87 zcmZp;#?=5sTNoJwdH5MQxH-5OW-@GL2-(Q^nPXcNqYF2i;Gf_8f`6v_r80_5Pe^4v YB-VE2TpXq+7jAGLhQW+05vTS8xyypS{ei{&Q