From 15c71dcdebb4ad0c81f4584bd9c781fb5db3d31f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 26 Oct 2019 13:05:55 +0200 Subject: [PATCH 001/105] C128 keyboard fixes, initial C65 keyboard support --- CONFIG.md | 6 ++- STATUS.md | 2 +- c64/,,config_generic.s | 4 +- c64/,,config_mega65.s | 8 ++-- c64/,,config_testing.s | 4 +- c64/,,config_ultimate64.s | 4 +- c64/aliases/,aliases_config.s | 7 ++- c64/aliases/,aliases_cpu.s | 11 +++++ c64/aliases/,aliases_petscii_codes.s | 35 ++++++++++----- c64/kernal/init/fda3.ioinit.s | 7 +++ c64/kernal/interrupts/udtim.s | 34 ++++++++------ c64/kernal/keyboard/kb_matrix_128.s | 2 +- c64/kernal/keyboard/kb_matrix_65.s | 21 +++++++++ c64/kernal/keyboard/kb_matrix_bucky.s | 26 +++++++++-- c64/kernal/keyboard/scnkey.s | 61 ++++++++++++++++++++++--- c64/kernal/keyboard/scnkey_128.s | 8 +--- c64/kernal/keyboard/scnkey_65.s | 65 +++++++++++++++++++++++++++ 17 files changed, 252 insertions(+), 53 deletions(-) create mode 100644 c64/kernal/keyboard/kb_matrix_65.s create mode 100644 c64/kernal/keyboard/scnkey_65.s diff --git a/CONFIG.md b/CONFIG.md index 463a7307..d4c08ca6 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -125,7 +125,7 @@ Needs 30-250 more space in KERNAL segment (depending on the features enabled for ### `CONFIG_KEYBOARD_C128` -Allows to use additional keys found on the C128 keyboard. NOTE: might be buggy, on VICE emulator I can't get all the keys working. +Allows to use additional keys found on the C128 keyboard. Needs about 130 bytes more space in KERNAL segment. If unsure - disable. @@ -135,6 +135,10 @@ Allows to use CAPS LOCK key on the C128 keyboard, this is independent from `CONF Needs about 50 bytes more space in KERNAL segment. If unsure - disable. +### `CONFIG_KEYBOARD_C65`, `CONFIG_KEYBOARD_C65_CAPS_LOCK` + +Similar, but for C65 keyboard. Please note - the C65 keyboard support is (as of yet) completely untested! + ### `CONFIG_KEY_REPEAT_DEFAULT` Enables key repetition by default during the startup (sets `RPTFLG`). diff --git a/STATUS.md b/STATUS.md index a036e81e..ab66ccc9 100644 --- a/STATUS.md +++ b/STATUS.md @@ -3,7 +3,7 @@ Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md)): -* improved keyboard scanning, supports anti-ghosting and is resistant to joystick interference (one variant even supports multi-keyy rollover) +* improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-keyy rollover), supports additional C128 keys * joystick can be used to move text cursor * uses RAM under ROM and I/O: 61438 bytes free * cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 8965f1dd..4192b0d5 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -52,8 +52,10 @@ // Keyboard settings // #define CONFIG_LEGACY_SCNKEY -#define CONFIG_KEYBOARD_C128 // incomplete +#define CONFIG_KEYBOARD_C128 #define CONFIG_KEYBOARD_C128_CAPS_LOCK +// #define CONFIG_KEYBOARD_C65 // untested +// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 65169f8d..8a63e29b 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -42,10 +42,10 @@ // Multiple SID support #define CONFIG_SID_2ND -.const CONFIG_SID_2ND_ADDRESS = $D420 +.const CONFIG_SID_2ND_ADDRESS = $D440 // #define CONFIG_SID_3RD -.const CONFIG_SID_3RD_ADDRESS = $D440 +.const CONFIG_SID_3RD_ADDRESS = $D420 // #define CONFIG_SID_D4XX // #define CONFIG_SID_D5XX @@ -54,8 +54,10 @@ // Keyboard settings // #define CONFIG_LEGACY_SCNKEY -// #define CONFIG_KEYBOARD_C128 // incomplete +// #define CONFIG_KEYBOARD_C128 // #define CONFIG_KEYBOARD_C128_CAPS_LOCK +#define CONFIG_KEYBOARD_C65 // untested +#define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 877a5005..743ee70e 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -53,8 +53,10 @@ // Keyboard settings #define CONFIG_LEGACY_SCNKEY -// #define CONFIG_KEYBOARD_C128 // incomplete +// #define CONFIG_KEYBOARD_C128 // #define CONFIG_KEYBOARD_C128_CAPS_LOCK +// #define CONFIG_KEYBOARD_C65 // untested +// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 1eda8501..c3407fd9 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -52,8 +52,10 @@ // Keyboard settings // #define CONFIG_LEGACY_SCNKEY -// #define CONFIG_KEYBOARD_C128 // incomplete +// #define CONFIG_KEYBOARD_C128 // #define CONFIG_KEYBOARD_C128_CAPS_LOCK +// #define CONFIG_KEYBOARD_C65 // untested +// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index ac668e61..54c5d87e 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -145,13 +145,16 @@ // Check if keyboard options are correct { -#if CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK) - .error "CONFIG_LEGACY_SCNKEY and CONFIG_KEYBOARD_C128* are mutually exclusive" +#if CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK) + .error "CONFIG_LEGACY_SCNKEY and CONFIG_KEYBOARD_C128* / CONFIG_KEYBOARD_C65* are mutually exclusive" #endif #if (CONFIG_MB_MEGA_65 || CONFIG_MB_ULTIMATE_64) && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK) .error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C128*" #endif +#if CONFIG_MB_ULTIMATE_64 && (CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK) + .error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C65*" +#endif } diff --git a/c64/aliases/,aliases_cpu.s b/c64/aliases/,aliases_cpu.s index 01b980b6..79caf2d8 100644 --- a/c64/aliases/,aliases_cpu.s +++ b/c64/aliases/,aliases_cpu.s @@ -17,6 +17,17 @@ } +// +// Trick to skip a 2-byte instruction +// + + +.pseudocommand skip_2_bytes_trash_nvz +{ + .byte $2C +} + + // // Stack manipulation - some CPUs will leave .A unchanged, some will use it as temporary storage, so consider .A trashed // diff --git a/c64/aliases/,aliases_petscii_codes.s b/c64/aliases/,aliases_petscii_codes.s index d62bf4ec..d3da738f 100644 --- a/c64/aliases/,aliases_petscii_codes.s +++ b/c64/aliases/,aliases_petscii_codes.s @@ -16,10 +16,14 @@ .const KEY_FLAG_SHIFT = %00000001 .const KEY_FLAG_VENDOR = %00000010 .const KEY_FLAG_CTRL = %00000100 -.const KEY_FLAG_ALT = %00001000 // C65 / C128 -.const KEY_CAPS_LOCK = %00010000 // C65 / C128 -.const KEY_FLAG_NO_SCRL = %00100000 // C65 / C128, Open ROMs unofficial +#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 +.const KEY_FLAG_ALT = %00001000 +#if CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65_CAPS_LOCK +.const KEY_CAPS_LOCK = %00010000 +#endif +.const KEY_FLAG_NO_SCRL = %00100000 // Open ROMs unofficial +#endif // Note - the following PETSCII codes are currently unassigned, can be used for further extensions: // @@ -38,8 +42,10 @@ // PETSCII codes for certain C128 and C65 functionalities XXX implement these -.const KEY_BELL = $07 // C65 / C128, no key -.const KEY_ESC = $1B // C65 / C128 +#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 +.const KEY_BELL = $07 // no key, originally CTRL+G +.const KEY_ESC = $1B +#endif // PETSCII codes for programmable keys @@ -56,14 +62,18 @@ .const KEY_F7 = $8B .const KEY_F8 = $8C -.const KEY_F9 = $10 // C65 -.const KEY_F10 = $15 // C65 -.const KEY_F11 = $16 // C65 -.const KEY_F12 = $17 // C65 -.const KEY_F13 = $19 // C65 -.const KEY_F14 = $1A // C65 +#if CONFIG_KEYBOARD_C65 +.const KEY_F9 = $10 +.const KEY_F10 = $15 +.const KEY_F11 = $16 +.const KEY_F12 = $17 +.const KEY_F13 = $19 +.const KEY_F14 = $1A +#endif -.const KEY_HELP = $84 // C65, also used for our C128 support +#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 +.const KEY_HELP = $84 // normally C65 only, also used for our C128 support +#endif // PETSCII codes for cursor keys @@ -151,4 +161,5 @@ .const KEY_GT = $3E .const KEY_QUESTION = $3F + // XXX finish this: $4x, $5x, $6x, $7x, $Ax, $Bx, $Cx, $Dx, $Ex, $Fx diff --git a/c64/kernal/init/fda3.ioinit.s b/c64/kernal/init/fda3.ioinit.s index 0337ec11..1339ab78 100644 --- a/c64/kernal/init/fda3.ioinit.s +++ b/c64/kernal/init/fda3.ioinit.s @@ -96,6 +96,13 @@ IOINIT: // Value checked on original ROM stx CIA2_DDRA +#if CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK + + lda #$02 + sta C65_EXTKEYS_DDR // output for most keys, input for CAPS LOCK bit + +#endif + // Set DDR on CIA2 for IEC bus, VIC-II banking lda #$3F sta CIA2_DDRA diff --git a/c64/kernal/interrupts/udtim.s b/c64/kernal/interrupts/udtim.s index 769ab0e4..369b907f 100644 --- a/c64/kernal/interrupts/udtim.s +++ b/c64/kernal/interrupts/udtim.s @@ -14,7 +14,7 @@ UDTIM: // after this time we have to reset the clock. inc TIME+0 - bne udtim_update_stkey // done with clock + bne udtim_update_stkey // done with clock inc TIME+1 bne udtim_clock_rollover inc TIME+2 @@ -31,25 +31,33 @@ udtim_update_stkey: // entry to be used when interrupts are disabled // but I hope the mechanism below will be compatible enough. lda #$80 - sta CIA1_PRA // select all the rows except the last one + sta CIA1_PRA // select all the rows except the last one #if CONFIG_KEYBOARD_C128 ldx #$00 - stx VIC_XSCAN // connect all the extra C128 keys + stx VIC_XSCAN // connect all the extra C128 keys +#endif +#if CONFIG_KEYBOARD_C65 + ldx #$00 + stx C65_EXTKEYS_PR // connect all the extra C65 keys #endif - lda CIA1_PRB // read the keys + lda CIA1_PRB // read the keys eor #$FF - sta STKEY // store reversed state - to filter out anything vulnerable to ghosting + sta STKEY // store reversed state - to filter out anything vulnerable to ghosting #if CONFIG_KEYBOARD_C128 - dex // puts $FF - stx VIC_XSCAN // disconnect the extra C128 keys + dex // puts $FF + stx VIC_XSCAN // disconnect the extra C128 keys +#endif +#if CONFIG_KEYBOARD_C65 + dex // puts $FF + stx C65_EXTKEYS_PR // disconnect the extra C65 keys #endif lda #$7F - sta CIA1_PRA // select the last row (bit to 0) + sta CIA1_PRA // select the last row (bit to 0) - lda CIA1_PRB // read the row - ora STKEY // filter out what might be the reason of ghosting + lda CIA1_PRB // read the row + ora STKEY // filter out what might be the reason of ghosting sta STKEY // Leave the CIA configured this way. It would be far better to disconnect @@ -63,11 +71,11 @@ udtim_clock_rollover: // At this point TIME+0 contains 0 lda TIME+1 cmp #$1A - bne udtim_update_stkey // done with clock + bne udtim_update_stkey // done with clock lda TIME+2 cmp #$4F - bne udtim_update_stkey // done with clock + bne udtim_update_stkey // done with clock lda #$00 sta TIME+2 sta TIME+1 - beq udtim_update_stkey // done with clock - will always jump + beq udtim_update_stkey // done with clock - will always jump diff --git a/c64/kernal/keyboard/kb_matrix_128.s b/c64/kernal/keyboard/kb_matrix_128.s index 2c0d4b9e..85d09b7b 100644 --- a/c64/kernal/keyboard/kb_matrix_128.s +++ b/c64/kernal/keyboard/kb_matrix_128.s @@ -12,7 +12,7 @@ kb_matrix_128: - .byte KEY_HELP,$38,$38,KEY_TAB_FW,$32,$34,$37,$31 + .byte KEY_HELP,$38,$35,KEY_TAB_FW,$32,$34,$37,$31 .byte KEY_ESC,$2B,$2D,$8D,$0D,$36,$39,$33 .byte $00,$30,$2E,$91,$11,$9D,$1D,$00 diff --git a/c64/kernal/keyboard/kb_matrix_65.s b/c64/kernal/keyboard/kb_matrix_65.s new file mode 100644 index 00000000..58986d02 --- /dev/null +++ b/c64/kernal/keyboard/kb_matrix_65.s @@ -0,0 +1,21 @@ + +// +// Extended keyboard matrix for Commodore 65 keyboards, based on +// +// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt +// + + +#if CONFIG_KEYBOARD_C65 && !CONFIG_LEGACY_SCNKEY + + +kb_matrix_65: + + .byte $00, KEY_TAB_FW, $00, KEY_HELP, KEY_F9, KEY_F11, KEY_F13, KEY_ESC + +kb_matrix_65_shifted: + + .byte $00, KEY_TAB_BW, $00, KEY_HELP, KEY_F10, KEY_F12, KEY_F14, KEY_ESC + + +#endif // CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY diff --git a/c64/kernal/keyboard/kb_matrix_bucky.s b/c64/kernal/keyboard/kb_matrix_bucky.s index 4b685e0d..2d67f574 100644 --- a/c64/kernal/keyboard/kb_matrix_bucky.s +++ b/c64/kernal/keyboard/kb_matrix_bucky.s @@ -5,6 +5,7 @@ // Values based on: // - [CM64] Compute's Mapping the Commodore 64 - pages 58 (SHFLAG), 173 (matrix) // - [CM128] Compute's Mapping the Commodore 128 - pages 212 (SHFLAG), 290 (matrix) +// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt // #if !CONFIG_LEGACY_SCNKEY @@ -16,12 +17,11 @@ kb_matrix_bucky_confmask: // values to be written to CIA1_PRA .byte %10111111 // SHIFT (right) .byte %01111111 // VENDOR .byte %01111111 // CTRL -#if CONFIG_KEYBOARD_C128 - .byte %11111111 // C128 extra keys +#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 + .byte %11111111 // C128 / C65 extra keys .byte %11111111 #endif - __kb_matrix_bucky_confmask_end: @@ -39,6 +39,20 @@ kb_matrix_bucky_confmask_c128: // values to be written to VIC_XSCAN #endif +#if CONFIG_KEYBOARD_C65 + +kb_matrix_bucky_confmask_c65: // values to be written to C65_EXTKEYS_PR + + .byte %11111111 + .byte %11111111 + .byte %11111111 + .byte %11111111 + + .byte %11111101 // ALT + .byte %11111101 // NO_SCRL + +#endif + kb_matrix_bucky_testmask: // for AND with CIA1_PRB value @@ -50,6 +64,10 @@ kb_matrix_bucky_testmask: // for AND with CIA1_PRB value .byte %10000000 // ALT .byte %00000001 // NO_SCRL #endif +#if CONFIG_KEYBOARD_C65 + .byte %00000100 // ALT + .byte %00000001 // NO_SCRL +#endif kb_matrix_bucky_shflag: // mask to be ORed to SHFLAG to mark key status @@ -58,7 +76,7 @@ kb_matrix_bucky_shflag: // mask to be ORed to SHFLAG to mark key status .byte KEY_FLAG_SHIFT .byte KEY_FLAG_VENDOR .byte KEY_FLAG_CTRL -#if CONFIG_KEYBOARD_C128 +#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 .byte KEY_FLAG_ALT .byte KEY_FLAG_NO_SCRL #endif diff --git a/c64/kernal/keyboard/scnkey.s b/c64/kernal/keyboard/scnkey.s index b1ed3a5f..3b08df9d 100644 --- a/c64/kernal/keyboard/scnkey.s +++ b/c64/kernal/keyboard/scnkey.s @@ -76,6 +76,23 @@ SCNKEY: stx VIC_XSCAN // disconnect C128 keys if no C128 keyboard is supported #endif +#endif + +#if CONFIG_KEYBOARD_C65_CAPS_LOCK + + lda C65_EXTKEYS_PR + and #$01 + bne !+ // branch if no CAPS LOCK + + lda #KEY_CAPS_LOCK + sta SHFLAG +!: + +#if !CONFIG_KEYBOARD_C65 + ldx #$FF + stx C65_EXTKEYS_PR // disconnect C128 keys if no C128 keyboard is supported +#endif + #endif ldy #(__kb_matrix_bucky_confmask_end - kb_matrix_bucky_confmask - 1) @@ -85,6 +102,10 @@ scnkey_bucky_loop: #if CONFIG_KEYBOARD_C128 lda kb_matrix_bucky_confmask_c128, y sta VIC_XSCAN +#endif +#if CONFIG_KEYBOARD_C65 + lda kb_matrix_bucky_confmask_c65, y + sta C65_EXTKEYS_PR #endif lda kb_matrix_bucky_testmask, y and CIA1_PRB @@ -123,6 +144,9 @@ scnkey_bucky_loop: stx CIA1_PRA // connect all the rows #if CONFIG_KEYBOARD_C128 stx VIC_XSCAN +#endif +#if CONFIG_KEYBOARD_C65 + stx C65_EXTKEYS_PR #endif dex // puts $FF cpx CIA1_PRB @@ -153,6 +177,9 @@ scnkey_bucky_loop: ldy #$FF // offset in key matrix table, $FF for not found yet #if CONFIG_KEYBOARD_C128 jsr scnkey_128 +#endif +#if CONFIG_KEYBOARD_C65 + jsr scnkey_65 #endif ldx #$07 scnkey_matrix_loop: @@ -280,17 +307,37 @@ scnkey_output_key: // Retrieve the PETSCII code -#if CONFIG_KEYBOARD_C128 +#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 cpy #$40 bcc !+ +#if CONFIG_KEYBOARD_C128 lda kb_matrix_128 - $41, y // retrieve key code from C128 extended matrix +#elif CONFIG_KEYBOARD_C65 + + // Select key matrix (normal or shifted) for extended C65 keys + + lda SHFLAG + and #%00000111 // KEY_FLAG_SHIFT + KEY_FLAG_VENDOR + KEY_FLAG_CTRL + beq scnkey_output_65_no_shift + cmp #KEY_FLAG_SHIFT + // XXX how to behave on VENDOR/CTRL key? Harmonize this with claasic keys behavior + bne scnkey_no_keys // no scanning for this bucky key combination + + lda kb_matrix_65_shifted - $41, y + jmp scnkey_got_petscii + +scnkey_output_65_no_shift: + + lda kb_matrix_65 - $41, y + +#endif jmp scnkey_got_petscii !: lda (KEYTAB), y // retrieve key code from standard matrix - // XXX this will be needed for extended screen editor + // XXX this will be needed for extended screen editor and C128 keyboard // cmp KEY_TAB_FW // special handling for SHIFT+TAB // bne scnkey_got_petscii // XXX or to scnkey_handle_caps_lock @@ -302,16 +349,16 @@ scnkey_output_key: // !: // lda KEY_TAB_BW // bne scnkey_got_petscii if CAPS LOCK is handled -#endif // CONFIG_KEYBOARD_C128_CAPS_LOCK +#endif // CONFIG_KEYBOARD_C128 or CONFIG_KEYBOARD_C65 -#if CONFIG_KEYBOARD_C128_CAPS_LOCK +#if CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65_CAPS_LOCK // Check if we need special handling for a CAPS LOCK key // This is shorter than a separate set of tables scnkey_handle_caps_lock: -#if !CONFIG_KEYBOARD_C128 +#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C65 lda (KEYTAB), y #endif tax @@ -332,9 +379,9 @@ scnkey_handle_caps_lock: !: txa -#endif // CONFIG_KEYBOARD_C128_CAPS_LOCK +#endif // CONFIG_KEYBOARD_C128_CAPS_LOCK or CONFIG_KEYBOARD_C65_CAPS_LOCK -#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C128_CAPS_LOCK +#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C128_CAPS_LOCK && !CONFIG_KEYBOARD_C65 && !CONFIG_KEYBOARD_C65_CAPS_LOCK lda (KEYTAB), y diff --git a/c64/kernal/keyboard/scnkey_128.s b/c64/kernal/keyboard/scnkey_128.s index 7fc8ddf5..dbbeecdf 100644 --- a/c64/kernal/keyboard/scnkey_128.s +++ b/c64/kernal/keyboard/scnkey_128.s @@ -48,15 +48,11 @@ scnkey_matrix_128_loop_next: dex bpl scnkey_matrix_128_loop - // Scanning the C128 keyboard part complete - check if we got a key - - cpy #$FF - beq scnkey_128_done - - // Continue with C64 keyboard scanning + // Scanning the C128 keyboard part complete scnkey_128_done: + stx VIC_XSCAN // $FF, disconnects C128 keys rts diff --git a/c64/kernal/keyboard/scnkey_65.s b/c64/kernal/keyboard/scnkey_65.s new file mode 100644 index 00000000..5d3f5b58 --- /dev/null +++ b/c64/kernal/keyboard/scnkey_65.s @@ -0,0 +1,65 @@ + +// +// Keyboard scanning routine extension for C65 keyboards +// +// - [CM128] Compute's Mapping the Commodore 128 - pages 212 (SHFLAG) +// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt (matrix) +// + + +#if CONFIG_KEYBOARD_C65 && !CONFIG_LEGACY_SCNKEY + + +// Inlining this within SCNKEY would both overcomplicate the implementation +// and disrupt a lot of branches (they would cross the 127 bytes distance limit) + +// .Y is now $FF - try to put there a key code from extended keyboard + +scnkey_65: + + sty CIA1_PRA // disconnect classic keys + + lda #$00 + sta C65_EXTKEYS_PR // connect C65 keys + + lda #%00000101 // filter out bucky keys: ALT, NO_SCRL + ora CIA1_PRB + + cmp #$FF + beq scnkey_65_done // skip if no key pressed from this row + + // At least one key is pressed - decode it + ldy #$07 +scnkey_matrix_65_loop: + cmp kb_matrix_row_keys, y + bne !+ // not this particular key + tya // now .A contains key offset within a row + clc + adc kb_matrix_row_offsets, x // now .A contains key offset from the matrix start + adc #$41 // now .A contains offset after the standard matrix + tay + jmp scnkey_65_done +!: + dey + bpl scnkey_matrix_65_loop + + // FALLTROUGH, multiple keys must have been pressed + +scnkey_65_no_keys: + + pla // get rid of return address from the stack + pla + + jmp scnkey_no_keys // pass controll to original routine + + +scnkey_65_done: + + ldx #$FF + stx C65_EXTKEYS_PR // connect C65 keys + + rts + + + +#endif // CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY From 15362c29b4c37345757d4b796e8990261716e3aa Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 27 Oct 2019 11:35:05 +0100 Subject: [PATCH 002/105] small visual improvements --- c64/basic/init/initmsg_real.s | 4 ++-- c64/basic/wedge_dos.s | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/c64/basic/init/initmsg_real.s b/c64/basic/init/initmsg_real.s index 169a8cd3..bd9494c5 100644 --- a/c64/basic/init/initmsg_real.s +++ b/c64/basic/init/initmsg_real.s @@ -38,7 +38,7 @@ initmsg_real: ldy #>rainbow_logo jsr STROUT - ldx #$01 + ldx #$00 ldy #$0A jsr plot_set @@ -46,7 +46,7 @@ initmsg_real: ldy #>startup_banner jsr STROUT - ldx #$03 + ldx #$02 ldy #$0A jsr plot_set diff --git a/c64/basic/wedge_dos.s b/c64/basic/wedge_dos.s index 39e55ce9..c50db59b 100644 --- a/c64/basic/wedge_dos.s +++ b/c64/basic/wedge_dos.s @@ -178,6 +178,9 @@ wedge_dos_directory: jsr JCHRIN bcs wedge_dos_basic_error + // Print new line + jsr print_return + wedge_dos_directory_line: // Load a single line, reuse BASIC input buffer From d0ac49b2b6278468f74c9f9cd84684f7dcbec4a3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 27 Oct 2019 17:59:53 +0100 Subject: [PATCH 003/105] function keys, RUN and HELP are now programmable at compile time --- CONFIG.md | 8 +- STATUS.md | 1 + bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/,,config_generic.s | 23 +++++ c64/,,config_mega65.s | 25 ++++- c64/,,config_testing.s | 25 ++++- c64/,,config_ultimate64.s | 24 ++++- c64/aliases/,aliases_config.s | 48 +++++++-- c64/aliases/,aliases_petscii_codes.s | 12 +-- c64/basic/init/startup_banner.s | 2 + c64/basic/wedge_dos.s | 2 + c64/kernal/assets/kernal_messages.s | 3 + c64/kernal/chrin_real.s | 43 +++++++- c64/kernal/f1ca.chrout.s | 1 + c64/kernal/keyboard/programmable_keys.s | 125 ++++++++++++++++++++++++ 22 files changed, 320 insertions(+), 22 deletions(-) create mode 100644 c64/kernal/keyboard/programmable_keys.s diff --git a/CONFIG.md b/CONFIG.md index d4c08ca6..aace455b 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -161,7 +161,13 @@ Needs 13 bytes more space in KERNAL segment. Only disable if you are running out Joystick movement also moves the cursor. -Needs about 65 bytes of ROM space to handle both joysticks. +Needs about 65 bytes of ROM space in KERNAL segment to handle both joysticks. + +### `CONFIG_PROGRAMMABLE_KEYS` + +Allows to assign command to any function key, `RUN` key and `HELP` key (if selected keybaord has one) - just fill-in appropriate `CONFIG_KEYCMD_*` variable(s). Keys not present on the selected keyboard are ignored. + +Needs 25 bytes more space in KERNAL segment for the code. In addition, each configured key takes 3 bytes + length of the command. ## Eye candy diff --git a/STATUS.md b/STATUS.md index ab66ccc9..c1790516 100644 --- a/STATUS.md +++ b/STATUS.md @@ -5,6 +5,7 @@ Here are the features of the Open ROMs not found in the original ROMs from the 8 * improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-keyy rollover), supports additional C128 keys * joystick can be used to move text cursor +* pre-defined function keys * uses RAM under ROM and I/O: 61438 bytes free * cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses * wark start due to BRK prints out the instruction address diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index a1e9f2ef200d36b7de03b125b40723d57fa07889..bfdb0f185d5df6108c2a285df214bae784f19fd9 100644 GIT binary patch delta 225 zcmZp0XmHq2!NwH)cXAb58b8AVE(M;aD|r?yP>@@_h-vbBHfhGJ&D`ws7=bD_ujY_q z2B|#G?E~V9@^~^b{+S%lE2dnyPGRqVg#-U5F#DvhQ+WPgVe{Ix3`{2tF2t;51W}i7BO@faPDPb zQn>X0#f2|EaqCtxEZempL1EW_1)zNg{%?p{!~isGLoiVL20swt3Dh`QnlE*88{Z89 KM)S$>@(TfcY++IW delta 219 zcmZp0XmHq2!N!#SbaEA28b9L#E(M;aD|r?yP>@@_hLR*Tg0z$45DlS!-0SgA`098U*K0b4-uNlz;wdr%-RH?_C*XG2Aq2tm=rGk ze{tc9PsF;F49j*cNKn}IUjb;@f&UxA7cl@$+7JNLyTKboxJ_2%OWoYScTa%PbaK4> FLI5A0UTOdU diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index 2d95059dd1eb7f836d29cec3993ca15e6f59061c..39165f095feb27ce69d6bb4a8b771fdf2bb0408d 100644 GIT binary patch delta 1736 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 diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index efbebfcd46f8d65523fecc88de0db137c5d62131..7597c51570b2ee9bb77924afca29effd9d6aaee8 100644 GIT binary patch delta 110 zcmZp0XmHq2$HJ8UbaDfW6Oh_`ghiSeL_cKL7Sl|By3$_Z(*KNA3a$?on4T|E1ky{b zPX7PEvq&DyTxO|YzFGmO+f?ol6Vvm_Kjp&t)1UeWeQL)0MXuJXVlfy@+Y@dp2n%`RAK?*n`;^|4vTe6;m!+r?B_G z!h!!2n0+$VDLntLux0I92Bwn+7h={jf~ZiR_{lSQ)si#TE#g-=22r+v;XuF#5rysl zFYqgzhX~DNU^?M*c5Q+}`ct3@ix@f#IQKFzDO~#h;=&i7_;o88mhD=Qps?$|0?@t# m|2IS}VgMSpAsDEAgCB_S1Ztct!L)0MXuJXVlfy@+}8dp2pN%5 jix_|=Z3qDB-QW!(+$JmWr7$vVZsfZwz-T%-UVb3}g^yLE diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 3833498b8ba3a685af33e9f0c9e9224c07810087..6b99eb9fc05130ec458dae383e988cf88ec817ec 100644 GIT binary patch delta 2085 zcmY*ae^4986+Ycr62cY;BEwM|SOOjp23xURTWx7eTsM}Tb?galM@jzRJefLDhxFGU z4(+5xNfE|OAtFl~ptU1kbsmlh8F?~oM|5ax@L)@0H)rE8;K*^DTF9sq`z!$`OojRm zY)`wR+1t1KwEOM*zW3H$@2(I0lhHdfLI624`#t`E4!y15FJ}N3+Pk1G?Oh0)?l}02ia0AQrK~D!+>+wzXg!4vE2vTN zGI$|jK-iS#LZ(%N!?n-FkSzw*!-PTh_|buAfWbEu)k7EJWZK5DD`=Y0jl{}nQ9cjO zs5a$>B?Xlw0SCZBr$|y;lk>LX^!S|v&OyP?Iyl1XE7ZUX{w%j@dqz_lTuBpzJkL08V*xbR(7tr5NQ_B`xz9^;NQf@Mz7eczoQ~NJ(8yY z@{x-vqb3r{$Q#aOq!OQgI!}?-_Oib=D6VG*@Gs)+rmw8}u<2UYR*7>u@r!pq_^2gY z(wXkfLois5!Y?d9%&beKG4D-HBZ=gd=NwkV#>e4qNDyOwc}wLC>PZi@pG{usPPU)D zdI{8UVM4k;Go=axADzX%c~zNN&1lE+3enXjJ&;fZL{|aR;=elIp~YyYmlidiE1t`| zrmKzSv%5~vJk`}r<2_LnRsy?&uhO7}z(&wS@O3)GNjj91!ovye+AkjAK{pgKoPSLB zT8hHa6xsRIf&CyJn&psA70Nzn|9{pf`m4H3 z3f7l>9{}H;%`vXk>-98!r0hu9Luin*Imr(7j@#glA&qPe(Q-}jC3RT)=+;KWqysF> zAu&nbT))``-k+~}N5Fe3M9H^dRgOII*Tn*(s()cDFbtEPeipaRH*I5{B+VDNHpclh z&A~V5zGL*I%O_}QZhYLq374h%@hhe};S*^SXqlJ_b{UNs27a8-C+DF?Qew7z?NDk) zg228O6~^VyhTfn%yiK3O@i3{G)}D z&GEsJ+_*dlGk2wVp&J68VL6*fag>{aW~u<5#qR<}D$B&8DywZdy`K@uW}Zpx zNP{vhN+)%b<1<}UM3pe>a(ijl$GBEAOTJyWb1Nj*aEO)|F~bR74*U%W{4Mv@KS4^~ z9l5w@QYfu(2?i5%mRrzqgJ}6d2Z&HyRjR5}3tQ0uH4tjk z2apIYsn7;*Zm8ay6M7}UxZGUG9bi~jJ=berIbS7mEQ4Js=K$KC#5qX_LXTRnfP#I> zV*?aUe$KKDt+ubfvu($&XEtoE?KJNE#&*iOr91CrF+}yPEJy2wwlQC+S06Mp-D3gm z*|9z|({4&t0l8{=F#uKQUma=Go%=+_)6bD9_Bg#mAxDbph+Y5kN4Ja4)9adfsLI0T~nSpj(CgrYxa@Pic2>1C{DT1&eJ{`t&2MCP%WJyjilwDM?J(`Qc?JX z(^WOtS6)Ftbg*Re4}IC~@M<(q*@sxhSj5O{oJ}m_#Cw-JK(K4!de=Quo{LbmLuQG= zt&75S?Uc;m9ZE;2TgnzDY_nBR)L)$qYlPLc8UA+7NYZR=DVJ3}_kzi?g1r^5= hcbcl0rfR0ChQahA&P(9zs4v1pLQwAIFaHy{^IyQY%{>4B delta 1974 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 aS$E;eMVn`6de}QCApxPglOzAuMgIez>p_VC delta 1810 zcmY*Zdu&rx7{B-2tzGL19gOX6W7`=r*ye!x02g0O4P(&*nFExEkE5b=8vij-h8n3z z4X={PF~W#qy=jpRt8079MSivKRTk?i%h_9Bp>xu3+w|qpzv83RbJg`hNV}0PfOpx85d@4Ffo) z<3N9aLy9A^F2Ea0Gihe~(7Y!$3`o;)coOF2x|`H|d|Z!A$GwwV?HoEq!u=GEOWY2J zrHe!OoPISjLYfC;?r^7<;!fQN)~yF0lQ{4cY=X1FhmBtYD-rHTt5WPqVFB}6O>DPN zcju~Xcv~8DyFh9Z_+d>X-wsk4vzF|QwrSl|FBxt#;pI_SG1Bl)*Cn&x_mJBc zG-2N`=^unZ_-WlRJ+1fHudJ1HBZZuvNWx*{L2!b4i=-;rX8LR!`ur`lXB*o47NXS1 zr(R7`X<^sm*oQ|@k6n|Gc+$FzJi1P=eS+$9_OeAq)nc31$xpd`cttcQkh%mVkB>nY&rnt{!a_4Pn{pByxe{edX09l?Hrj@uR4$&mEq@4Sr85#PkFi5D zTT#O(6Z7{Y(2nL8p{z7JlRvkrE&-T*Be*OHt7YtPNJZ}N{->S5YrxFJS#$Cs1J{WA ztL>q8Iw>S3FD28`Y~?IgSY$-X8?*cd8&t^(qB^RS2gg}r*4lggoeGKwvQGVN6gXEo zwhKdnw?TmluR0W@)`r#@;)1D?ZCFSJMcBg^qHIsWEj57tWfI*7=nD#`UIwe$_aB~% z2TvIIo7v@pip9o_*sFhq>!6MP_tdO9e0~Es7B1fk zq!bNO0s{e_;eN(X_20%ZFW(y4jM`sCr_Ss|k&$qCE$x6Y*aZ!jCoctW(Qv~k^`D94 z`FkTaxX`oiUVJej^X{{mfy-&dy-|byg)w}uRt0gClD6qeecLo;Lr_@M;-ZQxD2Off z&?w&l)w;u|>ZDGr3Fi@f`!K0ANb(+Vs{`&?WEJAf{L)lrd}{3Go(OoXNq|?@D4t$m z40x*%2*NEHmhzyY8vAqr;kq%HLl{f2NM@O91Q2r<-Isel>H8sck+Tc zXnbs3<~$x0;QOitg^y%QX1s75XkeB2y&g2F393Lm69yz#$pQ#6AUQW6hDJQ>pW+&D zIlpA>@``aOC-5jz1q_lsux3gU1FNSb99T6aRRx--BuC(pDXA{dl#y7tq#QgBmMkth zHqjW^jT|U)Q=^>a*^Qh|;+t@iV-xIM>(!fDCC*b2xzKYEFJgbqF09H-Kd>C$!Fsok ztcZ%xal6S4nz^G>j51PJ|R`8Y4?b2_0hH?N_TGOmhI%`o^$@k zcmDr;|M}exwcJllZ2i4{j61>dKw?j zT4GoAZSYY7b`sd~P&8AkDlRvq5V#-?4-@!CirOF7FQIFv;By{x_WOOdX5M#G8fGY5 z{&c|IGt9t(X}qIgw~Nmlw|usZVtIA&j~P0{Y86G)`+aK#Ur8lEAfBx}?dQCE^*4fIR~j@s3!cB*hT^@Ke5?W{|z8#oH0KwOSa5Y@=g2Hmq_ zo{Cb%>1p^C6s3ZC;PI?iaJ9Z=!GH&NIzWK&ct9U31>zoNR2qmc)r=}eswzAg$9ltx zQfq|D2Q|c`8I{w~!gFcG-lre7MigVWZTFEle%nxPkw{d#pG)%6c_Pe6mxz#%2JzR1 zZQzp#W{n#xi^hC6&b{W%4lu$Ev@Hy$Qg8)!8jHb54DT}*KYN1oF&BS~8c+TNucv=T z$0m6HVeW~T>&G-9D?CBO3i`t#4xTHeMVH;t+UI~~l^ak?{G)`6x3ZZYrCl;KhHMzClMFUzxUEF(b{ z4ikSb%&bOYG})d2EA;YT3hn#$qxCP>FRWU~IGESpY+A*rTgG8$7(;fh1+Jb6u8}?f zs%H_bC(?Ex^NJ2a+@Dutpn||lXv-wNm)8V7PvT|sHmofpUSQ*)OlbItm|ueLsEH(E zaQg(>7iSEd4OZ0Drp~%tZVqZS8ld&x;PNlu;+}&wy-FR>B<-Se$~i_&&7QpWB?Y z@y>o*z{FFvsJ*=-7M&a7k}&j;8ljI8gNI`MgP+Et{Zulp%;2d4dmeo>mBho`=G*r6 zwI310W*!$>SIoadXmP0bY~*RI{xdRA*g%^1dwIOaT7{^W5mK+p2dXPA<(fUrMY&YbJ4V@h@81roP7yir>}j#7!kFn)^6VQVwWq zR7x(EZz5&LL;b+la@*X?Qrc~Ih+RFeVxl)M@7{aP zx#xH8@0@deO}?h+cUsLldRgnOd}{%hRYJQa>y$d9j#sT;I0P&9sXku zX6#~kdtTOuLtCU!REKej+)LsihT{oU6;F%{zjn$671%JYEVxy4vL!8ULVB*~4(!&b zcB&Ap>X@Iqqb`gX7IpX4ooRc^^Dn>9MyYoTV z`8f?UX(r=^jN?K4 zO;X<2ZrM2>x^dy9Kxu@NZje0*Jd?+@wA<)J&1rhj=zQvAF34RvlQEte#n%hpljGB3 zcu068FAdWSk}L4ZoLmb(I&R$To%J62Bg4kJCp=<2q!YrCsLz8V8*;cc7i~w4vPPbg(FoM_G6f7gx<`fEbAI(x8Z? zEEP+u9C*`Qv^n-BQVl90s@Pr>7Zn{YrzgtY2F@VZajmDpV$eLODsipdfVo0g!2nQk2xW!esD-Dt5rg3iy=4|#@EQ6$P|F^q{zgE@M zW?il+r;XNiWx#_8^ZBSD^o&V*1?=sGGhG6z|weApe(*4%J24xabJ|T?`{$wvq4rR zBff!K9A2HI8+7~VjLl_O%s*oHe>v}^D=OAETwrmbNVQP}tnk@5Qus(g3eJH5#O)?^M*g%S=o3dObp(Mo;5I7;5dkE`{*cM3g7H(jx33`~Nt` zM99r%KmErzcu=I}Me1WBBbu0c(!{(_rbwB_5gc+ms*22l0M7 zQ(58oPdH6dh-^*RgL&CaIu@wY`GXeTpl|4X=T6Ojx~-~9bBac)Y7j7{R9&iRXQYLZ wnnm(#jwDlLc$Ty#$Zu0*l#%8%xxxsaC$G_1^$Ikcqd!+y>V9YU{@RuQ8;ZD#9RL6T diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 4192b0d5..d2b302e4 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -1,5 +1,6 @@ .const CONFIG_ID = $00 // should be 1 byte, different for each config file! +.encoding "petscii_upper" // // Please read CONFIG.md before modifying this file! @@ -62,6 +63,28 @@ #define CONFIG_JOY1_CURSOR #define CONFIG_JOY2_CURSOR +#define CONFIG_PROGRAMMABLE_KEYS + +.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" + +.const CONFIG_KEYCMD_F1 = @"@" +.const CONFIG_KEYCMD_F2 = @"" +.const CONFIG_KEYCMD_F3 = @"RUN:" +.const CONFIG_KEYCMD_F4 = @"" +.const CONFIG_KEYCMD_F5 = @"LOAD" +.const CONFIG_KEYCMD_F6 = @"" +.const CONFIG_KEYCMD_F7 = @"@$" +.const CONFIG_KEYCMD_F8 = @"" + +.const CONFIG_KEYCMD_HELP = @"LIST" + +.const CONFIG_KEYCMD_F9 = @"" +.const CONFIG_KEYCMD_F10 = @"" +.const CONFIG_KEYCMD_F11 = @"" +.const CONFIG_KEYCMD_F12 = @"" +.const CONFIG_KEYCMD_F13 = @"" +.const CONFIG_KEYCMD_F14 = @"" + // Eye candy diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 8a63e29b..12e3d146 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -1,5 +1,6 @@ .const CONFIG_ID = $01 // should be 1 byte, different for each config file! +.encoding "petscii_upper" // // Please read CONFIG.md before modifying this file! @@ -33,7 +34,7 @@ // #define CONFIG_CPU_WDC_65816 -// Memory model configuration +// Memory model #define CONFIG_MEMORY_MODEL_38K // #define CONFIG_MEMORY_MODEL_60K @@ -64,6 +65,28 @@ #define CONFIG_JOY1_CURSOR #define CONFIG_JOY2_CURSOR +#define CONFIG_PROGRAMMABLE_KEYS + +.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" + +.const CONFIG_KEYCMD_F1 = @"@" +.const CONFIG_KEYCMD_F2 = @"" +.const CONFIG_KEYCMD_F3 = @"RUN:" +.const CONFIG_KEYCMD_F4 = @"" +.const CONFIG_KEYCMD_F5 = @"LOAD" +.const CONFIG_KEYCMD_F6 = @"" +.const CONFIG_KEYCMD_F7 = @"@$" +.const CONFIG_KEYCMD_F8 = @"" + +.const CONFIG_KEYCMD_HELP = @"LIST" + +.const CONFIG_KEYCMD_F9 = @"" +.const CONFIG_KEYCMD_F10 = @"" +.const CONFIG_KEYCMD_F11 = @"" +.const CONFIG_KEYCMD_F12 = @"" +.const CONFIG_KEYCMD_F13 = @"" +.const CONFIG_KEYCMD_F14 = @"" + // Eye candy diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 743ee70e..7f5c679a 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -1,5 +1,6 @@ .const CONFIG_ID = $F0 // should be 1 byte, different for each config file! +.encoding "petscii_upper" // // Please read CONFIG.md before modifying this file! @@ -32,7 +33,7 @@ // #define CONFIG_CPU_WDC_65816 -// Memory model configuration +// Memory model // #define CONFIG_MEMORY_MODEL_38K #define CONFIG_MEMORY_MODEL_60K @@ -63,6 +64,28 @@ #define CONFIG_JOY1_CURSOR #define CONFIG_JOY2_CURSOR +#define CONFIG_PROGRAMMABLE_KEYS + +.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" + +.const CONFIG_KEYCMD_F1 = @"@" +.const CONFIG_KEYCMD_F2 = @"" +.const CONFIG_KEYCMD_F3 = @"RUN:" +.const CONFIG_KEYCMD_F4 = @"" +.const CONFIG_KEYCMD_F5 = @"LOAD" +.const CONFIG_KEYCMD_F6 = @"" +.const CONFIG_KEYCMD_F7 = @"@$" +.const CONFIG_KEYCMD_F8 = @"" + +.const CONFIG_KEYCMD_HELP = @"LIST" + +.const CONFIG_KEYCMD_F9 = @"" +.const CONFIG_KEYCMD_F10 = @"" +.const CONFIG_KEYCMD_F11 = @"" +.const CONFIG_KEYCMD_F12 = @"" +.const CONFIG_KEYCMD_F13 = @"" +.const CONFIG_KEYCMD_F14 = @"" + // Eye candy diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index c3407fd9..549c531d 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -1,5 +1,6 @@ .const CONFIG_ID = $02 // should be 1 byte, different for each config file! +.encoding "petscii_upper" // // Please read CONFIG.md before modifying this file! @@ -31,7 +32,7 @@ // #define CONFIG_CPU_WDC_65816 -// Memory model configuration +// Memory model #define CONFIG_MEMORY_MODEL_38K // #define CONFIG_MEMORY_MODEL_60K @@ -62,6 +63,27 @@ #define CONFIG_JOY1_CURSOR #define CONFIG_JOY2_CURSOR +#define CONFIG_PROGRAMMABLE_KEYS + +.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" + +.const CONFIG_KEYCMD_F1 = @"@" +.const CONFIG_KEYCMD_F2 = @"" +.const CONFIG_KEYCMD_F3 = @"RUN:" +.const CONFIG_KEYCMD_F4 = @"" +.const CONFIG_KEYCMD_F5 = @"LOAD" +.const CONFIG_KEYCMD_F6 = @"" +.const CONFIG_KEYCMD_F7 = @"@$" +.const CONFIG_KEYCMD_F8 = @"" + +.const CONFIG_KEYCMD_HELP = @"LIST" + +.const CONFIG_KEYCMD_F9 = @"" +.const CONFIG_KEYCMD_F10 = @"" +.const CONFIG_KEYCMD_F11 = @"" +.const CONFIG_KEYCMD_F12 = @"" +.const CONFIG_KEYCMD_F13 = @"" +.const CONFIG_KEYCMD_F14 = @"" // Eye candy diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index 54c5d87e..b6868d3a 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -6,7 +6,6 @@ // Check that platform configuration is correct - { .var selected = 0; @@ -20,7 +19,6 @@ // Check that motherboard extras configuration is correct - { .var selected = 0; @@ -44,7 +42,6 @@ // Check that brand configuration is correct - { .var selected = 0; @@ -74,7 +71,6 @@ // Check that processor configuration is correct - { .var selected = 0; @@ -97,7 +93,6 @@ // Check that memory model configuration is correct - { .var selected = 0; @@ -114,7 +109,6 @@ // Check that startup banner configuration is correct - { .var selected = 0; @@ -143,7 +137,11 @@ // Check if keyboard options are correct - +.function CHECK_KEYCMD(keycmd) +{ + .if (keycmd.size() > 0) .return 1 + .return 0 +} { #if CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK) .error "CONFIG_LEGACY_SCNKEY and CONFIG_KEYBOARD_C128* / CONFIG_KEYBOARD_C65* are mutually exclusive" @@ -155,6 +153,42 @@ #if CONFIG_MB_ULTIMATE_64 && (CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK) .error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C65*" #endif + + .var num_pkeys_base = 0 + .var num_pkeys_ext1 = 0 + .var num_pkeys_ext2 = 0 + + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_RUN) + + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F1) + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F2) + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F3) + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F4) + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F5) + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F6) + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F7) + .eval num_pkeys_base += CHECK_KEYCMD(CONFIG_KEYCMD_F8) + + .eval num_pkeys_ext1 += CHECK_KEYCMD(CONFIG_KEYCMD_HELP) + + .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F9) + .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F10) + .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F11) + .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F12) + .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F13) + .eval num_pkeys_ext2 += CHECK_KEYCMD(CONFIG_KEYCMD_F14) + + .var num_pkeys = num_pkeys_base +#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) + .eval num_pkeys += num_pkeys_ext1 +#endif +#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 + .eval num_pkeys += num_pkeys_ext2 +#endif + +#if CONFIG_PROGRAMMABLE_KEYS + .if (num_pkeys == 0) .error "CONFIG_PROGRAMMABLE_KEYS requires at least one defined key" +#endif } diff --git a/c64/aliases/,aliases_petscii_codes.s b/c64/aliases/,aliases_petscii_codes.s index d3da738f..e0343a00 100644 --- a/c64/aliases/,aliases_petscii_codes.s +++ b/c64/aliases/,aliases_petscii_codes.s @@ -54,12 +54,12 @@ .const KEY_RUN = $83 .const KEY_F1 = $85 -.const KEY_F2 = $86 -.const KEY_F3 = $87 -.const KEY_F4 = $88 -.const KEY_F5 = $89 -.const KEY_F6 = $8A -.const KEY_F7 = $8B +.const KEY_F2 = $89 +.const KEY_F3 = $86 +.const KEY_F4 = $8A +.const KEY_F5 = $87 +.const KEY_F6 = $8B +.const KEY_F7 = $88 .const KEY_F8 = $8C #if CONFIG_KEYBOARD_C65 diff --git a/c64/basic/init/startup_banner.s b/c64/basic/init/startup_banner.s index 0fbc4049..6c3aaf37 100644 --- a/c64/basic/init/startup_banner.s +++ b/c64/basic/init/startup_banner.s @@ -3,6 +3,8 @@ // Startup banner, to be displayed during cold start // +.encoding "petscii_upper" + .macro BANNER_TEXT() { diff --git a/c64/basic/wedge_dos.s b/c64/basic/wedge_dos.s index c50db59b..930fa36b 100644 --- a/c64/basic/wedge_dos.s +++ b/c64/basic/wedge_dos.s @@ -133,6 +133,8 @@ wedge_dos_x1: rts wedge_dos_status: + + jsr print_return jsr wedge_dos_status_get // FALLTROUGH diff --git a/c64/kernal/assets/kernal_messages.s b/c64/kernal/assets/kernal_messages.s index 0e8b6abe..eb9723d9 100644 --- a/c64/kernal/assets/kernal_messages.s +++ b/c64/kernal/assets/kernal_messages.s @@ -3,6 +3,9 @@ // Messages to be prined out by Kernal // +.encoding "petscii_upper" + + // Double underscore prevents labels from being passed to VICE (would confuse monitor) .label __MSG_KERNAL_SEARCHING_FOR = __msg_kernalsearching_for - __msg_kernal_first diff --git a/c64/kernal/chrin_real.s b/c64/kernal/chrin_real.s index 87b5ee8a..efd96051 100644 --- a/c64/kernal/chrin_real.s +++ b/c64/kernal/chrin_real.s @@ -91,10 +91,10 @@ read_from_keyboard: cmp #$0D bne not_enter +chrin_enter: + jsr cursor_disable - jsr pop_keyboard_buffer - jsr cursor_hide_if_visible // It was enter. @@ -140,12 +140,45 @@ empty_line: not_enter: - // Print character lda KEYD - // XXX add support for SHIFT + RUN/STOP ($84) and function keys (should be configurable) - jsr CHROUT +#if CONFIG_PROGRAMMABLE_KEYS + + ldx #(__programmable_keys_codes_end - programmable_keys_codes - 1) + +chrin_programmable_loop: + + cmp programmable_keys_codes, x + beq chrin_programmable_key + dex + bpl chrin_programmable_loop + + // FALLTROUGH + +#endif // CONFIG_PROGRAMMABLE_KEYS + +chrin_print_character: + + jsr CHROUT jsr pop_keyboard_buffer // Keep looking for input from keyboard until carriage return jmp chrin_repeat + +#if CONFIG_PROGRAMMABLE_KEYS + +chrin_programmable_key: + + // .X contains index of the key code, we need offset to key string instead + lda programmable_keys_offsets, x + tax + + // Print all the characters assigned to key +!: + lda programmable_keys_strings, x + beq chrin_enter + jsr CHROUT // our implementation preserves .X too + inx + bne !- // jumps always + +#endif // CONFIG_PROGRAMMABLE_KEYS diff --git a/c64/kernal/f1ca.chrout.s b/c64/kernal/f1ca.chrout.s index 6e51ea2b..8119ea4e 100644 --- a/c64/kernal/f1ca.chrout.s +++ b/c64/kernal/f1ca.chrout.s @@ -6,6 +6,7 @@ // - [CM64] Compute's Mapping the Commodore 64 - page 228 // // CPU registers that has to be preserved (see [RG64]): .Y +// Additionally we have to preserve .X for out CHRIN implementation // CHROUT: diff --git a/c64/kernal/keyboard/programmable_keys.s b/c64/kernal/keyboard/programmable_keys.s new file mode 100644 index 00000000..1f31d204 --- /dev/null +++ b/c64/kernal/keyboard/programmable_keys.s @@ -0,0 +1,125 @@ + +// +// Command string definitions for programmable keys +// + + +#if CONFIG_PROGRAMMABLE_KEYS + + +.macro PROGRAMMABLE_KEY_CODE(STR, CODE) +{ + .if (STR.size() > 0) + { + .byte CODE + } +} + +.macro PROGRAMMABLE_KEY_STRING(STR) +{ + .if (STR.size() > 0) + { + .text STR + .byte $00 + } +} + +.macro PROGRAMMABLE_KEY_OFFSET(STR, LABEL) +{ + .if (STR.size() > 0) + { + .byte LABEL - programmable_keys_strings + } +} + + +programmable_keys_codes: + + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_RUN, KEY_RUN) + + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F1, KEY_F1) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F2, KEY_F2) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F3, KEY_F3) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F4, KEY_F4) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F5, KEY_F5) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F6, KEY_F6) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F7, KEY_F7) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F8, KEY_F8) + +#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_HELP, KEY_HELP) +#endif + +#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F9, KEY_F9) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F10, KEY_F10) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F11, KEY_F11) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F12, KEY_F12) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F13, KEY_F13) + PROGRAMMABLE_KEY_CODE(CONFIG_KEYCMD_F14, KEY_F14) +#endif + +__programmable_keys_codes_end: + + +programmable_keys_strings: + +__str_offset_RUN: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_RUN) + +__str_offset_F1: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F1) +__str_offset_F2: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F2) +__str_offset_F3: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F3) +__str_offset_F4: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F4) +__str_offset_F5: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F5) +__str_offset_F6: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F6) +__str_offset_F7: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F7) +__str_offset_F8: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F8) + +#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) +__str_offset_HELP: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_HELP) +#endif + +#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 +__str_offset_F9: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F9) +__str_offset_F10: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F10) +__str_offset_F11: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F11) +__str_offset_F12: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F12) +__str_offset_F13: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F13) +__str_offset_F14: PROGRAMMABLE_KEY_STRING(CONFIG_KEYCMD_F14) +#endif + +__programmable_keys_strings_end: +{ + .var offset = __programmable_keys_strings_end - programmable_keys_strings + .if (offset >= 255) .error "Programmable keys took too much space" +} + + +programmable_keys_offsets: + + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_RUN, __str_offset_RUN) + + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F1, __str_offset_F1) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F2, __str_offset_F2) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F3, __str_offset_F3) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F4, __str_offset_F4) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F5, __str_offset_F5) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F6, __str_offset_F6) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F7, __str_offset_F7) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F8, __str_offset_F8) + +#if !CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_HELP, __str_offset_HELP) +#endif + +#if !CONFIG_LEGACY_SCNKEY && CONFIG_KEYBOARD_C65 + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F9, __str_offset_F9) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F10, __str_offset_F10) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F11, __str_offset_F11) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F12, __str_offset_F12) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F13, __str_offset_F13) + PROGRAMMABLE_KEY_OFFSET(CONFIG_KEYCMD_F14, __str_offset_F14) +#endif + + +#endif // CONFIG_PROGRAMMABLE_KEYS From 05253c3e92f8d398878f3bba0f1d1f3b2b95fc6f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 27 Oct 2019 18:36:57 +0100 Subject: [PATCH 004/105] improved VECTOR/RESTOR compatibility, small DOS wedge improvements --- c64/basic/wedge_dos.s | 6 +++--- c64/kernal/init/fce2.hw_entry_reset.s | 4 ++-- c64/kernal/vector_real.s | 13 ++++++------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/c64/basic/wedge_dos.s b/c64/basic/wedge_dos.s index 930fa36b..b7292c5d 100644 --- a/c64/basic/wedge_dos.s +++ b/c64/basic/wedge_dos.s @@ -66,6 +66,7 @@ wedge_dos_command: !: // Retrieve status, print it if not OK jsr JCLALL + jsr print_return jsr wedge_dos_status_get lda BUF+0 cmp #$30 // '0' @@ -92,6 +93,7 @@ wedge_dos_change_drive: jmp do_ILLEGAL_DEVICE_NUMBER_error !: sta FA + jsr print_return jmp basic_end_of_line wedge_dos_status_get: @@ -134,8 +136,8 @@ wedge_dos_x1: wedge_dos_status: - jsr print_return jsr wedge_dos_status_get + jsr print_return // FALLTROUGH wedge_dos_status_print: @@ -230,8 +232,6 @@ wedge_dos_directory_display: wedge_dos_clean_exit: jsr JCLALL - // Print new line - jsr print_return jmp basic_main_loop wedge_dos_basic_error: diff --git a/c64/kernal/init/fce2.hw_entry_reset.s b/c64/kernal/init/fce2.hw_entry_reset.s index e0a3793e..14014a02 100644 --- a/c64/kernal/init/fce2.hw_entry_reset.s +++ b/c64/kernal/init/fce2.hw_entry_reset.s @@ -30,11 +30,11 @@ hw_entry_reset: !: // Initialising IO is obviously required. Also indicated by c64 prg p269. jsr JIOINIT - + // Setting up the screen and testing ram is obviously required // also affirmed by p269 of c64 prg jsr JRAMTAS // called RANTAM on Codebase64 wiki - + // Resetting IO vectors is obviously required, if we want interrupts to run // also affirmed by c64 prg p269 jsr JRESTOR diff --git a/c64/kernal/vector_real.s b/c64/kernal/vector_real.s index b3540f9c..299d2c8a 100644 --- a/c64/kernal/vector_real.s +++ b/c64/kernal/vector_real.s @@ -1,4 +1,5 @@ + vector_real: // Use MEMUSS as temporary storage location - checked on real C64 that this is the @@ -8,11 +9,11 @@ vector_real: // According to 'Compute's Mapping the Commodore 64' page 237, // the CBM implementation does not disable IRQs - yet, the // 'C64 Programmers Reference Guide' does not contain such - // warning and does not mention any preparations needed, so... - // better safe than sorry, disable the IRQ for the duration - // of vector manipulation - php - cli + // warning and does not mention any preparations needed. + + // Initial idea was to do php, cli, ..., plp to make the routine safer, + // but it seems it might cause problem with initialization sequence, + // as the stack might be uninitialized when this routine is called // Prepare the user data pointer - strange order to reduce risk // of potential similarity to the original routine @@ -38,6 +39,4 @@ vector_end_loop: dey bpl vector_restore - // Restore status register (IRQ) before return - plp rts From 3d9e713f0799ae97a8772a5585862f5086efccf6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 28 Oct 2019 21:27:26 +0100 Subject: [PATCH 005/105] small LOAD cleanup --- c64/kernal/chkinout_real.s | 4 +- c64/kernal/chrin_real.s | 2 +- c64/kernal/clrchn_real.s | 4 +- c64/kernal/f1ca.chrout.s | 2 +- c64/kernal/f291.close.s | 2 +- c64/kernal/f34a.open.s | 2 +- c64/kernal/f49e.load_int.s | 13 ----- c64/kernal/iec/iec_check_devnum.s | 21 +++++--- c64/kernal/iec/listen.s | 5 +- c64/kernal/{f4a5.load.s => iec/load_iec.s} | 57 +++------------------- c64/kernal/iec/talk.s | 4 +- c64/kernal/{ => iostack}/f49e.interop | 0 c64/kernal/iostack/f49e.load_int.s | 12 +++++ c64/kernal/{ => iostack}/f4a5.interop | 0 c64/kernal/iostack/f4a5.load.s | 54 ++++++++++++++++++++ c64/kernal/{ => iostack}/f5dd.interop | 0 c64/kernal/{ => iostack}/f5dd.save_int.s | 0 c64/kernal/{ => iostack}/f5ed.interop | 0 c64/kernal/{ => iostack}/f5ed.save.s | 0 c64/kernal/{ => iostack}/f6ed.interop | 0 20 files changed, 98 insertions(+), 84 deletions(-) delete mode 100644 c64/kernal/f49e.load_int.s rename c64/kernal/{f4a5.load.s => iec/load_iec.s} (57%) rename c64/kernal/{ => iostack}/f49e.interop (100%) create mode 100644 c64/kernal/iostack/f49e.load_int.s rename c64/kernal/{ => iostack}/f4a5.interop (100%) create mode 100644 c64/kernal/iostack/f4a5.load.s rename c64/kernal/{ => iostack}/f5dd.interop (100%) rename c64/kernal/{ => iostack}/f5dd.save_int.s (100%) rename c64/kernal/{ => iostack}/f5ed.interop (100%) rename c64/kernal/{ => iostack}/f5ed.save.s (100%) rename c64/kernal/{ => iostack}/f6ed.interop (100%) diff --git a/c64/kernal/chkinout_real.s b/c64/kernal/chkinout_real.s index 18bc6bc7..15a986a1 100644 --- a/c64/kernal/chkinout_real.s +++ b/c64/kernal/chkinout_real.s @@ -41,7 +41,7 @@ chkin_real: // For IEC devices, send TALK + TKSA first lda FAT,Y - jsr iec_check_devnum + jsr iec_check_devnum_oc bcs chkin_set_device jsr TALK @@ -123,7 +123,7 @@ ckout_real: // For IEC devices, send LISTEN + SECOND first lda FAT,Y - jsr iec_check_devnum + jsr iec_check_devnum_oc bcs chkout_set_device jsr LISTEN diff --git a/c64/kernal/chrin_real.s b/c64/kernal/chrin_real.s index efd96051..684e5060 100644 --- a/c64/kernal/chrin_real.s +++ b/c64/kernal/chrin_real.s @@ -23,7 +23,7 @@ chrin_real: beq chrin_keyboard // #$00 - keyboard // XXX add screen support - jsr iec_check_devnum + jsr iec_check_devnum_oc bcc chrin_iec jmp lvs_device_not_found_error // not a supported device diff --git a/c64/kernal/clrchn_real.s b/c64/kernal/clrchn_real.s index 6c97cc4d..845e2cb6 100644 --- a/c64/kernal/clrchn_real.s +++ b/c64/kernal/clrchn_real.s @@ -13,14 +13,14 @@ clrchn_real: // Handle IEC input device lda DFLTN - jsr iec_check_devnum + jsr iec_check_devnum_oc bcs !+ // Previous device was IEC one - send UNTALK first jsr UNTLK !: // Restore output device to default lda DFLTO - jsr iec_check_devnum + jsr iec_check_devnum_oc bcs !+ // Handle IEC output device jsr UNLSN diff --git a/c64/kernal/f1ca.chrout.s b/c64/kernal/f1ca.chrout.s index 8119ea4e..9ebbe75d 100644 --- a/c64/kernal/f1ca.chrout.s +++ b/c64/kernal/f1ca.chrout.s @@ -30,7 +30,7 @@ CHROUT: bne !+ jmp chrout_screen !: - jsr iec_check_devnum + jsr iec_check_devnum_oc bcs chrout_done_unknown_device // not a supported device chrout_iec: diff --git a/c64/kernal/f291.close.s b/c64/kernal/f291.close.s index ca60794b..d89ce4fe 100644 --- a/c64/kernal/f291.close.s +++ b/c64/kernal/f291.close.s @@ -20,7 +20,7 @@ CLOSE: // We have the entry index in Y - check whether this is IEC device lda FAT, y - jsr iec_check_devnum + jsr iec_check_devnum_oc bcs close_remove_from_table // IEC device diff --git a/c64/kernal/f34a.open.s b/c64/kernal/f34a.open.s index 02ce3ac9..9907cbf6 100644 --- a/c64/kernal/f34a.open.s +++ b/c64/kernal/f34a.open.s @@ -59,7 +59,7 @@ open_has_space: // Check for IEC device lda FA - jsr iec_check_devnum + jsr iec_check_devnum_oc bcc open_iec // FALLTROUGH diff --git a/c64/kernal/f49e.load_int.s b/c64/kernal/f49e.load_int.s deleted file mode 100644 index 837d896c..00000000 --- a/c64/kernal/f49e.load_int.s +++ /dev/null @@ -1,13 +0,0 @@ - -// -// XXX Note: something unusual was done with LOAD routine - although the vector at $330 points to $F4A5, -// the Kernal jump table points to $F49E (see also Mapping the C64, page 76). By experimenting -// I have already discovered that $F4A5 performs indirect jump via ($0330) vector, but it must -// be doing a little bit more - not sure yet, what. Something similar is done with SAVE. -// -// This has to be clarified. -// - -LOAD_INT: - jmp (ILOAD) - diff --git a/c64/kernal/iec/iec_check_devnum.s b/c64/kernal/iec/iec_check_devnum.s index 0071392b..ff08bdc5 100644 --- a/c64/kernal/iec/iec_check_devnum.s +++ b/c64/kernal/iec/iec_check_devnum.s @@ -5,18 +5,27 @@ // Preserves .A, .X and .Y // -iec_check_devnum: - // 0, 1, 2, or 3 are illegal - reserved for non-IEC devices on Commodore - cmp #$04 + +iec_check_devnum_lvs: // for load/verify/save + + cmp #$08 // below 8 are illegal for load/save bcs !+ + // FALLTROUGH + +iec_check_devnum_oc: // for open/close + + cmp #$04 // below 4 are illegal, reserved for non-IEC devices on Commodore + bcs !+ + + // FALLTROUGH + iec_check_devnum_failed: sec // indicate non-IEC device rts + !: // 31 and above are illegal too, due to IEC command encoding scheme, // see https://www.pagetable.com/?p=1031 - cmp #$1F - bcs iec_check_devnum_failed - // Carry is clear here - indicates IEC device + cmp #$1F // sets carry for 31 or above rts diff --git a/c64/kernal/iec/listen.s b/c64/kernal/iec/listen.s index edb72e87..ec433768 100644 --- a/c64/kernal/iec/listen.s +++ b/c64/kernal/iec/listen.s @@ -17,7 +17,7 @@ LISTEN: jsr iec_tx_flush // Check whether device number is correct - jsr iec_check_devnum + jsr iec_check_devnum_oc bcc !+ jmp kernalerror_DEVICE_NOT_FOUND !: @@ -25,6 +25,3 @@ LISTEN: ora #$20 jmp common_talk_listen - - - diff --git a/c64/kernal/f4a5.load.s b/c64/kernal/iec/load_iec.s similarity index 57% rename from c64/kernal/f4a5.load.s rename to c64/kernal/iec/load_iec.s index 76307dc6..5c88d9e5 100644 --- a/c64/kernal/f4a5.load.s +++ b/c64/kernal/iec/load_iec.s @@ -1,60 +1,17 @@ + // -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmer's Reference Guide - page 286 -// - [CM64] Compute's Mapping the Commodore 64 - page 231 -// - IEC reference at http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf -// -// CPU registers that has to be preserved (see [RG64]): none +// IEC part of the LOAD routine // - // Expects that SETLFS and SETNAM are called before hand. - // $YYXX = load address. - // (ignored if SETLFS channel = 1, i.e., like ,8,1) - // If A=1 then VERIFY instead of LOAD. - // On exit, $YYXX is the highest address into which data - // will have been placed. - - // XXX honor MSGFLG bit 6 - // XXX add VERIFY support - -LOAD: - - // Are we loading or verifying? - sta VERCKK - - // Store start address of LOAD - stx STAL+0 - sty STAL+1 - - // Reset status - jsr kernalstatus_reset - -#if CONFIG_MEMORY_MODEL_60K - // We need our helpers to get to filenames under ROMs or IO area - jsr install_ram_routines -#endif - - // Check whether we support the requested device - lda FA - and #$FC - bne !+ - jmp lvs_illegal_device_number // device number below 4, not an IEC device -!: - // Device numbers above 30 are also illegal (see https://www.pagetable.com/?p=1031), - // as the protocol combines device number with command code int one byte, - // above 30 it is no longer possible (UNLISTEN and UNTALK codes prevent using - // number 31), yet original ROMs show ILLEGAL DEVICE NUMBER error only - // for devices 0-3; in our implementation LISTEN / TALK will cause device - // not present detected for numbers above 30 +load_iec: // Display SEARCHING FOR + filename jsr lvs_display_searching_for // 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. + // p13, 16; also p16 tells us this routine does not mess with the file + // table in the C64, only in the drive. // Call device to LISTEN (p16) lda FA @@ -111,7 +68,7 @@ LOAD: // Display start address jsr lvs_display_loading_verifying -load_loop: +iec_load_loop: // We are now ready to receive bytes jsr iec_rx_byte bcc !+ @@ -130,7 +87,7 @@ load_loop: // Check for EOI - if so, this was the last byte lda IOSTATUS and #K_STS_EOI - beq load_loop + beq iec_load_loop // Display end address jsr lvs_display_done diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index f895e4fb..ec57c592 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -17,7 +17,7 @@ TALK: jsr iec_tx_flush // Check whether device number is correct - jsr iec_check_devnum + jsr iec_check_devnum_oc bcc !+ jmp kernalerror_DEVICE_NOT_FOUND !: @@ -28,5 +28,3 @@ common_talk_listen: // common part of TALK and LISTEN sta TBTCNT jmp iec_tx_command - - diff --git a/c64/kernal/f49e.interop b/c64/kernal/iostack/f49e.interop similarity index 100% rename from c64/kernal/f49e.interop rename to c64/kernal/iostack/f49e.interop diff --git a/c64/kernal/iostack/f49e.load_int.s b/c64/kernal/iostack/f49e.load_int.s new file mode 100644 index 00000000..ca8fca9c --- /dev/null +++ b/c64/kernal/iostack/f49e.load_int.s @@ -0,0 +1,12 @@ + +// +// Note: Although the vector at $330 points to $F4A5, the Kernal jump table points to $F49E +// (see also Mapping the C64, page 76). By experimenting I have discovered that $F49E performs +// indirect jump via ($0330) vector, after setting MEMUSS. +// + +LOAD_INT: + + sty MEMUSS+1 + stx MEMUSS+0 + jmp (ILOAD) diff --git a/c64/kernal/f4a5.interop b/c64/kernal/iostack/f4a5.interop similarity index 100% rename from c64/kernal/f4a5.interop rename to c64/kernal/iostack/f4a5.interop diff --git a/c64/kernal/iostack/f4a5.load.s b/c64/kernal/iostack/f4a5.load.s new file mode 100644 index 00000000..223aac93 --- /dev/null +++ b/c64/kernal/iostack/f4a5.load.s @@ -0,0 +1,54 @@ +// +// Official Kernal routine, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 286 +// - [CM64] Compute's Mapping the Commodore 64 - page 231 +// - IEC reference at http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf +// +// CPU registers that has to be preserved (see [RG64]): none +// + + + // Expects that SETLFS and SETNAM are called before hand. + // $YYXX = load address. + // (ignored if SETLFS channel = 1, i.e., like ,8,1) + // If A=1 then VERIFY instead of LOAD. + // On exit, $YYXX is the highest address into which data + // will have been placed. + + // XXX add VERIFY support + +LOAD: + + // Are we loading or verifying? + sta VERCKK + + // Store start address of LOAD + lda MEMUSS+0 + sta STAL+0 + lda MEMUSS+1 + sty STAL+1 + + // Reset status + jsr kernalstatus_reset + +#if CONFIG_MEMORY_MODEL_60K + // We need our helpers to get to filenames under ROMs or IO area + jsr install_ram_routines +#endif + + // Check whether we support the requested device + lda FA + + // Try IEC - legal device numbers for LOAD are 8-30 + // Device numbers above 30 can not be used as IEC (see https://www.pagetable.com/?p=1031), + // as the protocol combines device number with command code in one byte, above 30 it is + // no longer possible. Original ROMs show ILLEGAL DEVICE NUMBER error only for devices + // 0-3; our implementation is more strict here + + cmp #$1F + bcs !+ // >= 31 + cmp #$08 + bcs_far load_iec // >= 8 +!: + jmp lvs_illegal_device_number diff --git a/c64/kernal/f5dd.interop b/c64/kernal/iostack/f5dd.interop similarity index 100% rename from c64/kernal/f5dd.interop rename to c64/kernal/iostack/f5dd.interop diff --git a/c64/kernal/f5dd.save_int.s b/c64/kernal/iostack/f5dd.save_int.s similarity index 100% rename from c64/kernal/f5dd.save_int.s rename to c64/kernal/iostack/f5dd.save_int.s diff --git a/c64/kernal/f5ed.interop b/c64/kernal/iostack/f5ed.interop similarity index 100% rename from c64/kernal/f5ed.interop rename to c64/kernal/iostack/f5ed.interop diff --git a/c64/kernal/f5ed.save.s b/c64/kernal/iostack/f5ed.save.s similarity index 100% rename from c64/kernal/f5ed.save.s rename to c64/kernal/iostack/f5ed.save.s diff --git a/c64/kernal/f6ed.interop b/c64/kernal/iostack/f6ed.interop similarity index 100% rename from c64/kernal/f6ed.interop rename to c64/kernal/iostack/f6ed.interop From 966658eae085d5c9991494eb86f81b9f3af9a04f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 28 Oct 2019 21:38:37 +0100 Subject: [PATCH 006/105] over 20 bytes saved in IEC LOAD code --- c64/kernal/iec/load_iec.s | 65 +++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 5c88d9e5..33bb0a65 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -4,6 +4,16 @@ // +load_iec_dev_not_found: + jmp lvs_device_not_found_error + +load_iec_file_not_found: + jmp kernalerror_FILE_NOT_FOUND + +load_iec_error: + jmp lvs_load_verify_error + + load_iec: // Display SEARCHING FOR + filename @@ -16,51 +26,43 @@ load_iec: // Call device to LISTEN (p16) lda FA jsr LISTEN - bcc !+ - jmp lvs_device_not_found_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_dev_not_found + // Open channel 0 (reserved for file reading) lda #$00 jsr iec_cmd_open - bcc !+ - jmp lvs_device_not_found_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_dev_not_found + // Send file name jsr lvs_send_file_name - bcc !+ - jmp lvs_load_verify_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_error + // Now command device to talk (p16) lda FA jsr TALK - bcc !+ - jmp lvs_load_verify_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_error + lda #$60 // open channel / data (p3) , required according to p13 sta TBTCNT jsr iec_tx_command - bcc !+ - jmp lvs_load_verify_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_error + // We are currently talker, so do the IEC turn around so that we // are the listener (p16) jsr iec_turnaround_to_listen - bcc !+ - jmp lvs_load_verify_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_error + // Get load address and store it if secondary address is zero jsr iec_rx_byte - bcc !+ - jmp kernalerror_FILE_NOT_FOUND // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_file_not_found + ldx SA beq !+ sta STAL+0 !: jsr iec_rx_byte - bcc !+ - jmp kernalerror_FILE_NOT_FOUND // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_file_not_found + ldx SA beq !+ sta STAL+1 @@ -71,19 +73,16 @@ load_iec: iec_load_loop: // We are now ready to receive bytes jsr iec_rx_byte - bcc !+ - jmp lvs_load_verify_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_error + // Handle the byte (store in memory / verify) jsr lvs_handle_byte_load_verify - bcc !+ - jmp lvs_load_verify_error // XXX deduplicate with other jumps in this routine -!: + bcs load_iec_error + // Advance pointer to data jsr lvs_advance_pointer - bcc !+ - jmp lvs_wrap_around_error -!: + bcs_far lvs_wrap_around_error + // Check for EOI - if so, this was the last byte lda IOSTATUS and #K_STS_EOI From 6fa2c5b570277c3bb1247a6324a21cafb1511491 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 28 Oct 2019 22:36:53 +0100 Subject: [PATCH 007/105] some work towards I/O stack modularization --- c64/,,config_generic.s | 7 ++++ c64/,,config_mega65.s | 7 ++++ c64/,,config_testing.s | 7 ++++ c64/,,config_ultimate64.s | 7 ++++ c64/kernal/chkinout_real.s | 8 +++++ c64/kernal/chrin_real.s | 4 +++ c64/kernal/iec/acptr.s | 6 ++++ c64/kernal/iec/close_iec.s | 35 +++++++++++++++++++ c64/kernal/iec/iec_check_devnum.s | 20 ++++++----- .../{close_load.s => iec/iec_close_load.s} | 10 ++++-- c64/kernal/iec/iec_cmd_close.s | 7 ++++ c64/kernal/iec/iec_cmd_open.s | 6 ++++ .../iec/iec_pull_atn_clk_release_data.s | 7 ++++ c64/kernal/iec/iec_pull_clk_release_data.s | 6 ++++ .../iec/iec_pull_clk_release_data_oneshot.s | 7 ++++ .../iec/iec_pull_data_release_atn_clk.s | 7 ++++ c64/kernal/iec/iec_release_atn.s | 6 ++++ c64/kernal/iec/iec_release_atn_clk_data.s | 6 ++++ c64/kernal/iec/iec_release_clk_data.s | 7 ++++ c64/kernal/iec/iec_release_clk_pull_data.s | 7 ++++ c64/kernal/iec/iec_return.s | 7 ++++ c64/kernal/iec/iec_rx_byte.s | 6 ++++ c64/kernal/iec/iec_set_idle.s | 7 ++++ c64/kernal/iec/iec_turnaround_to_listen.s | 5 +++ c64/kernal/iec/iec_turnaround_to_talk.s | 6 ++++ c64/kernal/iec/iec_tx_byte.s | 5 +++ c64/kernal/iec/iec_tx_command.s | 5 +++ c64/kernal/iec/iec_tx_command_finalize.s | 6 ++++ c64/kernal/iec/iec_tx_flush.s | 7 ++++ c64/kernal/iec/iec_wait1ms.s | 6 ++++ c64/kernal/iec/iec_wait20us.s | 6 ++++ c64/kernal/iec/iec_wait60us.s | 6 ++++ c64/kernal/iec/iec_wait_for_clk_release.s | 7 ++++ c64/kernal/iec/iec_wait_for_data_pull.s | 7 ++++ c64/kernal/iec/iec_wait_for_data_release.s | 6 ++++ c64/kernal/iec/listen.s | 8 +++++ c64/kernal/iec/load_iec.s | 8 ++++- c64/kernal/iec/open_iec.s | 34 ++++++++++++++++++ c64/kernal/iec/second.s | 6 ++++ c64/kernal/iec/talk.s | 8 +++++ c64/kernal/iec/tksa.s | 5 +++ c64/kernal/iec/unlsn.s | 5 +++ c64/kernal/iec/untlk.s | 8 +++++ c64/kernal/{ => init}/fffc.interop | 0 c64/kernal/{ => init}/fffc.vector_reset.s | 0 c64/kernal/{ => interrupts}/fffa.interop | 0 c64/kernal/{ => interrupts}/fffa.vector_nmi.s | 0 c64/kernal/{ => interrupts}/fffe.interop | 0 c64/kernal/{ => interrupts}/fffe.vector_irq.s | 0 c64/kernal/{ => iostack}/f291.close.s | 30 +++++----------- c64/kernal/{ => iostack}/f291.interop | 0 c64/kernal/{ => iostack}/f34a.interop | 0 c64/kernal/{ => iostack}/f34a.open.s | 27 ++------------ c64/kernal/iostack/f4a5.load.s | 14 +++----- c64/kernal/{ => keyboard}/f6ed.stop.s | 0 c64/kernal/vector_real.s | 4 +-- 56 files changed, 357 insertions(+), 69 deletions(-) create mode 100644 c64/kernal/iec/close_iec.s rename c64/kernal/{close_load.s => iec/iec_close_load.s} (67%) create mode 100644 c64/kernal/iec/open_iec.s rename c64/kernal/{ => init}/fffc.interop (100%) rename c64/kernal/{ => init}/fffc.vector_reset.s (100%) rename c64/kernal/{ => interrupts}/fffa.interop (100%) rename c64/kernal/{ => interrupts}/fffa.vector_nmi.s (100%) rename c64/kernal/{ => interrupts}/fffe.interop (100%) rename c64/kernal/{ => interrupts}/fffe.vector_irq.s (100%) rename c64/kernal/{ => iostack}/f291.close.s (58%) rename c64/kernal/{ => iostack}/f291.interop (100%) rename c64/kernal/{ => iostack}/f34a.interop (100%) rename c64/kernal/{ => iostack}/f34a.open.s (71%) rename c64/kernal/{ => keyboard}/f6ed.stop.s (100%) diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index d2b302e4..62588e3f 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -38,6 +38,13 @@ // #define CONFIG_MEMORY_MODEL_60K +// I/O devices + +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE // please keep disabled for now +// #define CONFIG_RS_232 // please keep disabled for now + + // Multiple SID support // #define CONFIG_SID_2ND diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 12e3d146..57c09be7 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -40,6 +40,13 @@ // #define CONFIG_MEMORY_MODEL_60K +// I/O devices + +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE // please keep disabled for now +// #define CONFIG_RS_232 // please keep disabled for now + + // Multiple SID support #define CONFIG_SID_2ND diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 7f5c679a..8393da38 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -39,6 +39,13 @@ #define CONFIG_MEMORY_MODEL_60K +// I/O devices + +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE // please keep disabled for now +// #define CONFIG_RS_232 // please keep disabled for now + + // Multiple SID support #define CONFIG_SID_2ND diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 549c531d..d36e6723 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -38,6 +38,13 @@ // #define CONFIG_MEMORY_MODEL_60K +// I/O devices + +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE // please keep disabled for now +// #define CONFIG_RS_232 // please keep disabled for now + + // Multiple SID support // #define CONFIG_SID_2ND diff --git a/c64/kernal/chkinout_real.s b/c64/kernal/chkinout_real.s index 15a986a1..427d1c63 100644 --- a/c64/kernal/chkinout_real.s +++ b/c64/kernal/chkinout_real.s @@ -39,6 +39,8 @@ chkin_real: cmp #$01 beq chkinout_file_not_input +#if CONFIG_IEC + // For IEC devices, send TALK + TKSA first lda FAT,Y jsr iec_check_devnum_oc @@ -51,6 +53,8 @@ chkin_real: jsr TKSA bcs chkinout_device_not_present +#endif // CONFIG_IEC + chkin_set_device: lda FAT,Y sta DFLTN @@ -121,6 +125,8 @@ ckout_real: lda LAT, Y beq chkinout_file_not_output +#if CONFIG_IEC + // For IEC devices, send LISTEN + SECOND first lda FAT,Y jsr iec_check_devnum_oc @@ -133,6 +139,8 @@ ckout_real: jsr SECOND bcs chkinout_device_not_present +#endif // CONFIG_IEC + chkout_set_device: lda FAT,Y sta DFLTO diff --git a/c64/kernal/chrin_real.s b/c64/kernal/chrin_real.s index 684e5060..f744920c 100644 --- a/c64/kernal/chrin_real.s +++ b/c64/kernal/chrin_real.s @@ -23,6 +23,8 @@ chrin_real: beq chrin_keyboard // #$00 - keyboard // XXX add screen support +#if CONFIG_IEC + jsr iec_check_devnum_oc bcc chrin_iec jmp lvs_device_not_found_error // not a supported device @@ -33,6 +35,8 @@ chrin_iec: bcs chrin_done_fail // FALLTROUGH +#endif // CONFIG_IEC + chrin_done: clc // indicate success rts diff --git a/c64/kernal/iec/acptr.s b/c64/kernal/iec/acptr.s index b7ee27ce..4c9756e4 100644 --- a/c64/kernal/iec/acptr.s +++ b/c64/kernal/iec/acptr.s @@ -10,5 +10,11 @@ ACPTR: + jsr kernalstatus_reset + +#if CONFIG_IEC jmp iec_rx_byte +#else + jmp kernalerror_ILLEGAL_DEVICE_NUMBER +#endif diff --git a/c64/kernal/iec/close_iec.s b/c64/kernal/iec/close_iec.s new file mode 100644 index 00000000..0cdc2801 --- /dev/null +++ b/c64/kernal/iec/close_iec.s @@ -0,0 +1,35 @@ + +// +// IEC part of the CLOSE routine +// + + +#if CONFIG_IEC + + +// .Y contains LAT/FAT/SAT table index, it should stay this way + +close_iec: + + jsr iec_tx_flush // make sure no byte is awaiting + lda SAT, y // get secondary address + cmp #$60 + bne !+ + + // workaround for using CLOSE on reading executable - XXX is this a proper way? + jsr iec_close_load + jmp close_remove_from_table + +!: + ora $E0 // CLOSE command + sta TBTCNT + jsr iec_tx_command + bcs close_iec_end + jsr iec_tx_command_finalize + +close_iec_end: + + jmp close_remove_from_table + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_check_devnum.s b/c64/kernal/iec/iec_check_devnum.s index ff08bdc5..e6ac9c08 100644 --- a/c64/kernal/iec/iec_check_devnum.s +++ b/c64/kernal/iec/iec_check_devnum.s @@ -6,26 +6,28 @@ // +#if CONFIG_IEC + iec_check_devnum_lvs: // for load/verify/save cmp #$08 // below 8 are illegal for load/save - bcs !+ + bcc iec_check_devnum_failed // FALLTROUGH iec_check_devnum_oc: // for open/close cmp #$04 // below 4 are illegal, reserved for non-IEC devices on Commodore - bcs !+ + bcc iec_check_devnum_failed - // FALLTROUGH - -iec_check_devnum_failed: - sec // indicate non-IEC device - rts - -!: // 31 and above are illegal too, due to IEC command encoding scheme, // see https://www.pagetable.com/?p=1031 cmp #$1F // sets carry for 31 or above rts + +iec_check_devnum_failed: + + sec // indicate non-IEC device + rts + +#endif // CONFIG_IEC diff --git a/c64/kernal/close_load.s b/c64/kernal/iec/iec_close_load.s similarity index 67% rename from c64/kernal/close_load.s rename to c64/kernal/iec/iec_close_load.s index efb0b013..180d6c6f 100644 --- a/c64/kernal/close_load.s +++ b/c64/kernal/iec/iec_close_load.s @@ -1,8 +1,12 @@ +// +// Common part of CLOSE and LOAD routines for IEC +// + -// Common ppart of CLOSE and LOAD routines +#if CONFIG_IEC -close_load: +iec_close_load: tax @@ -21,3 +25,5 @@ close_load: jsr UNLSN rts + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_cmd_close.s b/c64/kernal/iec/iec_cmd_close.s index 114cf0e4..126cb04e 100644 --- a/c64/kernal/iec/iec_cmd_close.s +++ b/c64/kernal/iec/iec_cmd_close.s @@ -5,6 +5,10 @@ // - https://www.pagetable.com/?p=1031, https://github.com/mist64/cbmbus_doc // + +#if CONFIG_IEC + + iec_cmd_close: jsr iec_check_channel_openclose @@ -14,3 +18,6 @@ iec_cmd_close: ora #$E0 jmp common_open_close_unlsn_second + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_cmd_open.s b/c64/kernal/iec/iec_cmd_open.s index 5cc86ccb..48fceb28 100644 --- a/c64/kernal/iec/iec_cmd_open.s +++ b/c64/kernal/iec/iec_cmd_open.s @@ -6,6 +6,9 @@ // +#if CONFIG_IEC + + iec_cmd_open: // similar to TKSA, but without turnaround jsr iec_check_channel_openclose @@ -40,3 +43,6 @@ iec_check_channel_openclose: !: clc // mark suitable channel number rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_atn_clk_release_data.s b/c64/kernal/iec/iec_pull_atn_clk_release_data.s index 62da6f12..1b8ba0d9 100644 --- a/c64/kernal/iec/iec_pull_atn_clk_release_data.s +++ b/c64/kernal/iec/iec_pull_atn_clk_release_data.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_pull_atn_clk_release_data: // Pulled CLK = DATA considered invalid; for extra robustness on non-emulated @@ -13,3 +17,6 @@ iec_pull_atn_clk_release_data: and #$FF - BIT_CIA2_PRA_DAT_OUT // release sta CIA2_PRA rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_clk_release_data.s b/c64/kernal/iec/iec_pull_clk_release_data.s index 2b1a58f8..18ffda0a 100644 --- a/c64/kernal/iec/iec_pull_clk_release_data.s +++ b/c64/kernal/iec/iec_pull_clk_release_data.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_pull_clk_release_data: // Pulled CLK = DATA considered invalid; for extra robustness on non-emulated @@ -11,3 +15,5 @@ iec_pull_clk_release_data: and #$FF - BIT_CIA2_PRA_DAT_OUT // release sta CIA2_PRA rts + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_clk_release_data_oneshot.s b/c64/kernal/iec/iec_pull_clk_release_data_oneshot.s index b2a80988..f3d7696b 100644 --- a/c64/kernal/iec/iec_pull_clk_release_data_oneshot.s +++ b/c64/kernal/iec/iec_pull_clk_release_data_oneshot.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_pull_clk_release_data_oneshot: lda CIA2_PRA @@ -6,3 +10,6 @@ iec_pull_clk_release_data_oneshot: and #$FF - BIT_CIA2_PRA_DAT_OUT // release sta CIA2_PRA rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_data_release_atn_clk.s b/c64/kernal/iec/iec_pull_data_release_atn_clk.s index f7c71da4..58d3ca1f 100644 --- a/c64/kernal/iec/iec_pull_data_release_atn_clk.s +++ b/c64/kernal/iec/iec_pull_data_release_atn_clk.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_pull_data_release_atn_clk: // Released CLK = DATA considered valid; for extra robustness on non-emulated @@ -13,3 +17,6 @@ iec_pull_data_release_atn_clk: and #$FF - BIT_CIA2_PRA_ATN_OUT // release sta CIA2_PRA rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_atn.s b/c64/kernal/iec/iec_release_atn.s index d7493aa0..c9d49478 100644 --- a/c64/kernal/iec/iec_release_atn.s +++ b/c64/kernal/iec/iec_release_atn.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_release_atn: lda CIA2_PRA @@ -6,3 +10,5 @@ iec_release_atn: sta CIA2_PRA rts + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_atn_clk_data.s b/c64/kernal/iec/iec_release_atn_clk_data.s index 07f5c4da..b572dfc3 100644 --- a/c64/kernal/iec/iec_release_atn_clk_data.s +++ b/c64/kernal/iec/iec_release_atn_clk_data.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_release_atn_clk_data: // Released CLK = DATA considered valid; for extra robustness on non-emulated @@ -14,3 +18,5 @@ iec_release_atn_clk_data: sta CIA2_PRA rts + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_clk_data.s b/c64/kernal/iec/iec_release_clk_data.s index 83af42aa..35deb964 100644 --- a/c64/kernal/iec/iec_release_clk_data.s +++ b/c64/kernal/iec/iec_release_clk_data.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_release_clk_data: // Released CLK = DATA considered valid; for extra robustness on non-emulated @@ -11,3 +15,6 @@ iec_release_clk_data: and #$FF - BIT_CIA2_PRA_CLK_OUT // release sta CIA2_PRA rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_clk_pull_data.s b/c64/kernal/iec/iec_release_clk_pull_data.s index 359c02f3..ad98c987 100644 --- a/c64/kernal/iec/iec_release_clk_pull_data.s +++ b/c64/kernal/iec/iec_release_clk_pull_data.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_release_clk_pull_data: // Released CLK = DATA considered valid; for extra robustness on non-emulated @@ -11,3 +15,6 @@ iec_release_clk_pull_data: and #$FF - BIT_CIA2_PRA_CLK_OUT // release sta CIA2_PRA rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_return.s b/c64/kernal/iec/iec_return.s index de3f8b01..b73a8d1f 100644 --- a/c64/kernal/iec/iec_return.s +++ b/c64/kernal/iec/iec_return.s @@ -8,6 +8,10 @@ // take care about .A and IOSTATUS // + +#if CONFIG_IEC + + iec_return_success: // BSOUR is certainly not valid anymore @@ -32,3 +36,6 @@ iec_return_DEVICE_NOT_FOUND: plx_trash_a // Report error jmp kernalerror_DEVICE_NOT_FOUND + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_rx_byte.s b/c64/kernal/iec/iec_rx_byte.s index 2f859cf7..cd86f951 100644 --- a/c64/kernal/iec/iec_rx_byte.s +++ b/c64/kernal/iec/iec_rx_byte.s @@ -4,6 +4,10 @@ // // Preserves .X and .Y registers + +#if CONFIG_IEC + + iec_rx_byte: // Store .X and .Y on the stack - preserve them @@ -143,3 +147,5 @@ iec_rx_clk_wait2: cli rts + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_set_idle.s b/c64/kernal/iec/iec_set_idle.s index 9b0015d0..4833eba6 100644 --- a/c64/kernal/iec/iec_set_idle.s +++ b/c64/kernal/iec/iec_set_idle.s @@ -1,7 +1,14 @@ + +#if CONFIG_IEC + + iec_set_idle: lda CIA2_PRA ora #BIT_CIA2_PRA_CLK_OUT // pull and #$FF - BIT_CIA2_PRA_DAT_OUT - BIT_CIA2_PRA_ATN_OUT // release sta CIA2_PRA rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_turnaround_to_listen.s b/c64/kernal/iec/iec_turnaround_to_listen.s index be31bf02..f77a5a54 100644 --- a/c64/kernal/iec/iec_turnaround_to_listen.s +++ b/c64/kernal/iec/iec_turnaround_to_listen.s @@ -2,6 +2,10 @@ // pages 7--8. // See also https://www.pagetable.com/?p=1135, https://github.com/mist64/cbmbus_doc + +#if CONFIG_IEC + + iec_turnaround_to_listen: // Store .X and .Y on the stack - preserve them @@ -34,3 +38,4 @@ iec_turnaround_to_listen: jmp iec_return_success +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_turnaround_to_talk.s b/c64/kernal/iec/iec_turnaround_to_talk.s index 3612460c..624c648d 100644 --- a/c64/kernal/iec/iec_turnaround_to_talk.s +++ b/c64/kernal/iec/iec_turnaround_to_talk.s @@ -2,6 +2,10 @@ // pages 7--8. // See also https://www.pagetable.com/?p=1135, https://github.com/mist64/cbmbus_doc + +#if CONFIG_IEC + + iec_turnaround_to_talk: // Store .X and .Y on the stack - preserve them @@ -25,3 +29,5 @@ iec_turnaround_to_talk: plp jmp iec_return_success + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index 3866cff0..d9b49629 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -7,6 +7,8 @@ // Preserves .X and .Y registers +#if CONFIG_IEC + iec_tx_byte: // Store .X and .Y on the stack - preserve them @@ -94,3 +96,6 @@ iec_tx_common_bit_is_sent: jmp iec_return_DEVICE_NOT_FOUND !: jmp iec_return_success + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_tx_command.s b/c64/kernal/iec/iec_tx_command.s index 0f126d47..04c8a0ca 100644 --- a/c64/kernal/iec/iec_tx_command.s +++ b/c64/kernal/iec/iec_tx_command.s @@ -7,6 +7,9 @@ // Preserves .X and .Y registers +#if CONFIG_IEC + + iec_tx_command: // Store .X and .Y on the stack - preserve them @@ -36,3 +39,5 @@ iec_tx_command: clc // Carry flag set is used for EOI mark jmp iec_tx_common + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_tx_command_finalize.s b/c64/kernal/iec/iec_tx_command_finalize.s index dc2a9c26..976fdb93 100644 --- a/c64/kernal/iec/iec_tx_command_finalize.s +++ b/c64/kernal/iec/iec_tx_command_finalize.s @@ -3,6 +3,9 @@ // Implemented based on https://www.pagetable.com/?p=1135, https://github.com/mist64/cbmbus_doc +#if CONFIG_IEC + + iec_tx_command_finalize: // Store .X and .Y on the stack - preserve them @@ -16,3 +19,6 @@ iec_tx_command_finalize: jsr iec_wait20us jmp iec_return_success + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_tx_flush.s b/c64/kernal/iec/iec_tx_flush.s index d6db894f..fdef1d2a 100644 --- a/c64/kernal/iec/iec_tx_flush.s +++ b/c64/kernal/iec/iec_tx_flush.s @@ -3,6 +3,10 @@ // // Preserves .X, .Y and .A registers + +#if CONFIG_IEC + + iec_tx_flush: pha @@ -13,3 +17,6 @@ iec_tx_flush: !: pla rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_wait1ms.s b/c64/kernal/iec/iec_wait1ms.s index 24ac3025..d6a57218 100644 --- a/c64/kernal/iec/iec_wait1ms.s +++ b/c64/kernal/iec/iec_wait1ms.s @@ -8,6 +8,9 @@ // 63 cycles, we need at least 17 full rasters to be 100% sure we wait enough +#if CONFIG_IEC + + iec_wait1ms: ldx #18 // we probably won't start with the beginning of raster lda VIC_RASTER @@ -19,3 +22,6 @@ iec_wait1ms: bne !- rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_wait20us.s b/c64/kernal/iec/iec_wait20us.s index 550de20c..21c5caa5 100644 --- a/c64/kernal/iec/iec_wait20us.s +++ b/c64/kernal/iec/iec_wait20us.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_wait20us: // Wait 20usec @@ -20,3 +24,5 @@ iec_wait20us: // 1 cycle to fetch next instruction // --- // 21 cycles + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_wait60us.s b/c64/kernal/iec/iec_wait60us.s index e5c7ad84..f748ea28 100644 --- a/c64/kernal/iec/iec_wait60us.s +++ b/c64/kernal/iec/iec_wait60us.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_wait60us: // Wait 60usec @@ -21,3 +25,5 @@ iec_wait60us: // --- // 64 cycles + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_wait_for_clk_release.s b/c64/kernal/iec/iec_wait_for_clk_release.s index 22edfdfa..2464cd16 100644 --- a/c64/kernal/iec/iec_wait_for_clk_release.s +++ b/c64/kernal/iec/iec_wait_for_clk_release.s @@ -1,7 +1,14 @@ + +#if CONFIG_IEC + + iec_wait_for_clk_release: lda CIA2_PRA and #BIT_CIA2_PRA_CLK_IN beq iec_wait_for_clk_release rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_wait_for_data_pull.s b/c64/kernal/iec/iec_wait_for_data_pull.s index 9fcaa9fb..e4842c61 100644 --- a/c64/kernal/iec/iec_wait_for_data_pull.s +++ b/c64/kernal/iec/iec_wait_for_data_pull.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_wait_for_data_pull: lda CIA2_PRA @@ -6,3 +10,6 @@ iec_wait_for_data_pull: // (highest bit set = negative value) bmi iec_wait_for_data_pull rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_wait_for_data_release.s b/c64/kernal/iec/iec_wait_for_data_release.s index 93b4a518..e75c2ef2 100644 --- a/c64/kernal/iec/iec_wait_for_data_release.s +++ b/c64/kernal/iec/iec_wait_for_data_release.s @@ -1,4 +1,8 @@ + +#if CONFIG_IEC + + iec_wait_for_data_release: lda CIA2_PRA @@ -6,3 +10,5 @@ iec_wait_for_data_release: // (highest bit set = negative value) bpl iec_wait_for_data_release rts + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/listen.s b/c64/kernal/iec/listen.s index ec433768..f7e59c8c 100644 --- a/c64/kernal/iec/listen.s +++ b/c64/kernal/iec/listen.s @@ -13,6 +13,8 @@ LISTEN: +#if CONFIG_IEC + // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush @@ -25,3 +27,9 @@ LISTEN: ora #$20 jmp common_talk_listen + +#else + + jmp kernalerror_ILLEGAL_DEVICE_NUMBER + +#endif diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 33bb0a65..eb37bcf0 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -4,6 +4,9 @@ // +#if CONFIG_IEC + + load_iec_dev_not_found: jmp lvs_device_not_found_error @@ -94,7 +97,10 @@ iec_load_loop: // Close file on drive lda FA - jsr close_load + jsr iec_close_load // Return last address jmp lvs_return_last_address + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/open_iec.s b/c64/kernal/iec/open_iec.s new file mode 100644 index 00000000..33269eb9 --- /dev/null +++ b/c64/kernal/iec/open_iec.s @@ -0,0 +1,34 @@ + +// +// IEC part of the OPEN routine +// + + +#if CONFIG_IEC + + +open_iec: + + // We have a command to send to IEC device + jsr LISTEN + bcc !+ + jmp kernalerror_DEVICE_NOT_FOUND +!: + lda SA + jsr iec_cmd_open + bcc !+ + jmp kernalerror_DEVICE_NOT_FOUND +!: + +#if CONFIG_MEMORY_MODEL_60K + // We need our helpers to get to filenames under ROMs or IO area + jsr install_ram_routines +#endif + + // Send command ('file name') + jsr lvs_send_file_name + + jmp open_done_success + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/second.s b/c64/kernal/iec/second.s index 9072536d..12d49f44 100644 --- a/c64/kernal/iec/second.s +++ b/c64/kernal/iec/second.s @@ -12,6 +12,8 @@ SECOND: +#if CONFIG_IEC + // Due to OPEN/CLOSE/TKSA/SECOND command encoding (see https://www.pagetable.com/?p=1031), // allowed channels are 0-15; report error if out of range cmp #$10 @@ -22,4 +24,8 @@ SECOND: jmp common_open_close_unlsn_second +#else + jmp kernalerror_ILLEGAL_DEVICE_NUMBER + +#endif diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index ec57c592..4cd64cfe 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -13,6 +13,8 @@ TALK: +#if CONFIG_IEC + // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush @@ -28,3 +30,9 @@ common_talk_listen: // common part of TALK and LISTEN sta TBTCNT jmp iec_tx_command + +#else + + jmp kernalerror_ILLEGAL_DEVICE_NUMBER + +#endif diff --git a/c64/kernal/iec/tksa.s b/c64/kernal/iec/tksa.s index cd905edb..63215256 100644 --- a/c64/kernal/iec/tksa.s +++ b/c64/kernal/iec/tksa.s @@ -12,6 +12,8 @@ TKSA: +#if CONFIG_IEC + // Due to OPEN/CLOSE/TKSA/SECOND command encoding (see https://www.pagetable.com/?p=1031), // allowed channels are 0-15; report error if out of range cmp #$10 @@ -22,5 +24,8 @@ TKSA: jmp common_untlk_tksa +#else + jmp kernalerror_ILLEGAL_DEVICE_NUMBER +#endif diff --git a/c64/kernal/iec/unlsn.s b/c64/kernal/iec/unlsn.s index b37f7c26..55fb5fd4 100644 --- a/c64/kernal/iec/unlsn.s +++ b/c64/kernal/iec/unlsn.s @@ -13,6 +13,8 @@ UNLSN: +#if CONFIG_IEC + // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush @@ -21,5 +23,8 @@ UNLSN: jmp common_open_close_unlsn_second +#else + jmp kernalerror_ILLEGAL_DEVICE_NUMBER +#endif diff --git a/c64/kernal/iec/untlk.s b/c64/kernal/iec/untlk.s index 758d36ef..1e7f542a 100644 --- a/c64/kernal/iec/untlk.s +++ b/c64/kernal/iec/untlk.s @@ -13,6 +13,8 @@ UNTLK: +#if CONFIG_IEC + // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush @@ -31,3 +33,9 @@ common_untlk_tksa: // common part of UNTLK and TKSA jmp iec_turnaround_to_listen !: rts + +#else + + jmp kernalerror_ILLEGAL_DEVICE_NUMBER + +#endif diff --git a/c64/kernal/fffc.interop b/c64/kernal/init/fffc.interop similarity index 100% rename from c64/kernal/fffc.interop rename to c64/kernal/init/fffc.interop diff --git a/c64/kernal/fffc.vector_reset.s b/c64/kernal/init/fffc.vector_reset.s similarity index 100% rename from c64/kernal/fffc.vector_reset.s rename to c64/kernal/init/fffc.vector_reset.s diff --git a/c64/kernal/fffa.interop b/c64/kernal/interrupts/fffa.interop similarity index 100% rename from c64/kernal/fffa.interop rename to c64/kernal/interrupts/fffa.interop diff --git a/c64/kernal/fffa.vector_nmi.s b/c64/kernal/interrupts/fffa.vector_nmi.s similarity index 100% rename from c64/kernal/fffa.vector_nmi.s rename to c64/kernal/interrupts/fffa.vector_nmi.s diff --git a/c64/kernal/fffe.interop b/c64/kernal/interrupts/fffe.interop similarity index 100% rename from c64/kernal/fffe.interop rename to c64/kernal/interrupts/fffe.interop diff --git a/c64/kernal/fffe.vector_irq.s b/c64/kernal/interrupts/fffe.vector_irq.s similarity index 100% rename from c64/kernal/fffe.vector_irq.s rename to c64/kernal/interrupts/fffe.vector_irq.s diff --git a/c64/kernal/f291.close.s b/c64/kernal/iostack/f291.close.s similarity index 58% rename from c64/kernal/f291.close.s rename to c64/kernal/iostack/f291.close.s index d89ce4fe..c2f3c4ae 100644 --- a/c64/kernal/f291.close.s +++ b/c64/kernal/iostack/f291.close.s @@ -16,30 +16,21 @@ CLOSE: // Find the LAT / SAT / FAT entry which LAT corresponds to A jsr find_fls - bcs close_error_not_found // XXX can we report error in IOSTATUS here? + bcs close_end // XXX can we report error in IOSTATUS here? - // We have the entry index in Y - check whether this is IEC device +#if CONFIG_IEC + + // We have the entry index in .Y - check whether this is IEC device lda FAT, y jsr iec_check_devnum_oc - bcs close_remove_from_table + bcc_far close_iec - // IEC device +#endif // CONFIG_IEC - jsr iec_tx_flush // make sure no byte is awaiting - lda SAT, y // get secondary address - cmp #$60 - bne !+ - // workaround for using CLOSE on reading executable - XXX is this a proper way? - jsr close_load - jmp close_remove_from_table -!: - ora $E0 // CLOSE command - sta TBTCNT - jsr iec_tx_command - bcs close_remove_from_table - jsr iec_tx_command_finalize + // FALLTROUGH close_remove_from_table: + // Remove channel from the table iny cpy #$0A @@ -56,9 +47,6 @@ close_remove_from_table: dec LDTND clc // report success - not sure if original CLOSE does this, but it's nevertheless a good practice - rts -close_error_not_found: - - sec // report success - not sure if original CLOSE does this, but it's nevertheless a good practice +close_end: rts diff --git a/c64/kernal/f291.interop b/c64/kernal/iostack/f291.interop similarity index 100% rename from c64/kernal/f291.interop rename to c64/kernal/iostack/f291.interop diff --git a/c64/kernal/f34a.interop b/c64/kernal/iostack/f34a.interop similarity index 100% rename from c64/kernal/f34a.interop rename to c64/kernal/iostack/f34a.interop diff --git a/c64/kernal/f34a.open.s b/c64/kernal/iostack/f34a.open.s similarity index 71% rename from c64/kernal/f34a.open.s rename to c64/kernal/iostack/f34a.open.s index 9907cbf6..ddadebea 100644 --- a/c64/kernal/f34a.open.s +++ b/c64/kernal/iostack/f34a.open.s @@ -23,6 +23,7 @@ OPEN: cmp LA bne open_not_yet_open jmp kernalerror_FILE_ALREADY_OPEN + open_not_yet_open: cpy #$00 jmp !- @@ -60,33 +61,11 @@ open_has_space: // Check for IEC device lda FA jsr iec_check_devnum_oc - bcc open_iec + bcc_far open_iec // FALLTROUGH + open_done_success: clc rts - -open_iec: - - // We have a command to send to IEC device - jsr LISTEN - bcc !+ - jmp kernalerror_DEVICE_NOT_FOUND -!: - lda SA - jsr iec_cmd_open - bcc !+ - jmp kernalerror_DEVICE_NOT_FOUND -!: - -#if CONFIG_MEMORY_MODEL_60K - // We need our helpers to get to filenames under ROMs or IO area - jsr install_ram_routines -#endif - - // Send command ('file name') - jsr lvs_send_file_name - - jmp open_done_success diff --git a/c64/kernal/iostack/f4a5.load.s b/c64/kernal/iostack/f4a5.load.s index 223aac93..0f1b0e36 100644 --- a/c64/kernal/iostack/f4a5.load.s +++ b/c64/kernal/iostack/f4a5.load.s @@ -40,15 +40,9 @@ LOAD: // Check whether we support the requested device lda FA - // Try IEC - legal device numbers for LOAD are 8-30 - // Device numbers above 30 can not be used as IEC (see https://www.pagetable.com/?p=1031), - // as the protocol combines device number with command code in one byte, above 30 it is - // no longer possible. Original ROMs show ILLEGAL DEVICE NUMBER error only for devices - // 0-3; our implementation is more strict here +#if CONFIG_IEC + jsr iec_check_devnum_lvs + bcc_far load_iec +#endif // CONFIG_IEC - cmp #$1F - bcs !+ // >= 31 - cmp #$08 - bcs_far load_iec // >= 8 -!: jmp lvs_illegal_device_number diff --git a/c64/kernal/f6ed.stop.s b/c64/kernal/keyboard/f6ed.stop.s similarity index 100% rename from c64/kernal/f6ed.stop.s rename to c64/kernal/keyboard/f6ed.stop.s diff --git a/c64/kernal/vector_real.s b/c64/kernal/vector_real.s index 299d2c8a..5b3e4eff 100644 --- a/c64/kernal/vector_real.s +++ b/c64/kernal/vector_real.s @@ -12,8 +12,8 @@ vector_real: // warning and does not mention any preparations needed. // Initial idea was to do php, cli, ..., plp to make the routine safer, - // but it seems it might cause problem with initialization sequence, - // as the stack might be uninitialized when this routine is called + // but it seems it might cause problem with initialization on XEMU emulator + // XXX find out, why // Prepare the user data pointer - strange order to reduce risk // of potential similarity to the original routine From e9140607bc569b9affe3796719bdd5baa7d5aedd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 17:03:13 +0100 Subject: [PATCH 008/105] further IO stack refactoring --- Makefile | 16 +++++--- c64/,,config_generic.s | 11 ++--- c64/,,config_mega65.s | 13 +++--- c64/,,config_testing.s | 13 +++--- c64/,,config_ultimate64.s | 12 +++--- .../{stubs => ,stubs}/e566.home_cursor.s | 0 c64/kernal/{stubs => ,stubs}/e566.interop | 0 .../{stubs => ,stubs}/e6b6.advance_cursor.s | 0 c64/kernal/{stubs => ,stubs}/e6b6.interop | 0 c64/kernal/{stubs => ,stubs}/e701.interop | 0 .../{stubs => ,stubs}/e701.previous_line.s | 0 .../{stubs => ,stubs}/e716.chrout_screen.s | 0 c64/kernal/{stubs => ,stubs}/e716.interop | 0 c64/kernal/{stubs => ,stubs}/e8ea.interop | 0 .../{stubs => ,stubs}/e8ea.scroll_line.s | 0 .../e96c.insert_line_at_top.s | 0 c64/kernal/{stubs => ,stubs}/e96c.interop | 0 .../{stubs => ,stubs}/e9ff.clear_line.s | 0 c64/kernal/{stubs => ,stubs}/e9ff.interop | 0 c64/kernal/{stubs => ,stubs}/f646.iec_close.s | 0 c64/kernal/{stubs => ,stubs}/f646.interop | 0 c64/kernal/{stubs => ,stubs}/fd90.interop | 0 c64/kernal/{stubs => ,stubs}/fd90.unknown.s | 0 c64/kernal/f333.clrchn.jmp.s | 6 --- c64/kernal/{ => iec}/ciout.s | 8 ++++ c64/kernal/iec/clrchn_iec.s | 30 ++++++++++++++ .../{clrchn_real.s => iostack/f333.clrchn.s} | 26 +++++------- c64/kernal/{ => iostack}/f333.interop | 0 .../udtim.s => keyboard/udtim_keyboard.s} | 37 ++--------------- c64/kernal/{ => memory}/fd15.interop | 0 c64/kernal/{ => memory}/fd15.restor.s | 0 c64/kernal/{ => memory}/fe25.interop | 0 c64/kernal/{ => memory}/fe25.memtop.s | 0 c64/kernal/{ => memory}/membot.s | 0 c64/kernal/{ => memory}/under_rom_routines.s | 0 c64/kernal/{ => memory}/vector_real.s | 0 c64/kernal/{ => rom_revision}/ff80.interop | 0 .../{ => rom_revision}/ff80.kernal_revision.s | 0 c64/kernal/{ => time}/rdtim.s | 0 c64/kernal/{ => time}/settim.s | 0 c64/kernal/time/udtim.s | 41 +++++++++++++++++++ 41 files changed, 131 insertions(+), 82 deletions(-) rename c64/kernal/{stubs => ,stubs}/e566.home_cursor.s (100%) rename c64/kernal/{stubs => ,stubs}/e566.interop (100%) rename c64/kernal/{stubs => ,stubs}/e6b6.advance_cursor.s (100%) rename c64/kernal/{stubs => ,stubs}/e6b6.interop (100%) rename c64/kernal/{stubs => ,stubs}/e701.interop (100%) rename c64/kernal/{stubs => ,stubs}/e701.previous_line.s (100%) rename c64/kernal/{stubs => ,stubs}/e716.chrout_screen.s (100%) rename c64/kernal/{stubs => ,stubs}/e716.interop (100%) rename c64/kernal/{stubs => ,stubs}/e8ea.interop (100%) rename c64/kernal/{stubs => ,stubs}/e8ea.scroll_line.s (100%) rename c64/kernal/{stubs => ,stubs}/e96c.insert_line_at_top.s (100%) rename c64/kernal/{stubs => ,stubs}/e96c.interop (100%) rename c64/kernal/{stubs => ,stubs}/e9ff.clear_line.s (100%) rename c64/kernal/{stubs => ,stubs}/e9ff.interop (100%) rename c64/kernal/{stubs => ,stubs}/f646.iec_close.s (100%) rename c64/kernal/{stubs => ,stubs}/f646.interop (100%) rename c64/kernal/{stubs => ,stubs}/fd90.interop (100%) rename c64/kernal/{stubs => ,stubs}/fd90.unknown.s (100%) delete mode 100644 c64/kernal/f333.clrchn.jmp.s rename c64/kernal/{ => iec}/ciout.s (91%) create mode 100644 c64/kernal/iec/clrchn_iec.s rename c64/kernal/{clrchn_real.s => iostack/f333.clrchn.s} (59%) rename c64/kernal/{ => iostack}/f333.interop (100%) rename c64/kernal/{interrupts/udtim.s => keyboard/udtim_keyboard.s} (61%) rename c64/kernal/{ => memory}/fd15.interop (100%) rename c64/kernal/{ => memory}/fd15.restor.s (100%) rename c64/kernal/{ => memory}/fe25.interop (100%) rename c64/kernal/{ => memory}/fe25.memtop.s (100%) rename c64/kernal/{ => memory}/membot.s (100%) rename c64/kernal/{ => memory}/under_rom_routines.s (100%) rename c64/kernal/{ => memory}/vector_real.s (100%) rename c64/kernal/{ => rom_revision}/ff80.interop (100%) rename c64/kernal/{ => rom_revision}/ff80.kernal_revision.s (100%) rename c64/kernal/{ => time}/rdtim.s (100%) rename c64/kernal/{ => time}/settim.s (100%) create mode 100644 c64/kernal/time/udtim.s diff --git a/Makefile b/Makefile index 931d9c24..5e0b8662 100644 --- a/Makefile +++ b/Makefile @@ -11,16 +11,20 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ c64/kernal \ + c64/kernal/,stubs \ c64/kernal/assets \ - c64/kernal/jumptable \ c64/kernal/iec \ c64/kernal/init \ c64/kernal/interrupts \ c64/kernal/iostack \ + c64/kernal/jumptable \ c64/kernal/keyboard \ + c64/kernal/memory \ c64/kernal/print \ + c64/kernal/rom_revision \ c64/kernal/screen \ - c64/kernal/stubs + c64/kernal/time + SRC_TOOLS = $(wildcard src/tools/*.c,src/tools/*.cc) @@ -65,14 +69,16 @@ GIT_COMMIT:= $(shell git log -1 --pretty='%h' | tr '[:lower:]' '[:upper:]') .PHONY: all clean updatebin -all: $(STD_TARGET_LIST) $(EXT_TARGET_LIST) +all: + $(MAKE) -j64 --output-sync=target $(STD_TARGET_LIST) $(EXT_TARGET_LIST) clean: @rm -rf build -updatebin: $(STD_TARGET_LIST) $(TOOL_RELEASE) +updatebin: + $(MAKE) -j64 --output-sync=target $(STD_TARGET_LIST) $(TOOL_RELEASE) $(TOOL_RELEASE) -i ./build -o ./bin basic_generic.rom kernal_generic.rom basic_testing.rom kernal_testing.rom basic_mega65.rom kernal_mega65.rom basic_ultimate64.rom kernal_ultimate64.rom - cp build/chargen.rom bin/chargen.rom + cp build/chargen.rom bin/chargen.rom # Rules - tools diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 62588e3f..e5920bef 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -40,9 +40,10 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE // please keep disabled for now -// #define CONFIG_RS_232 // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_USERPORT // please keep disabled for now // Multiple SID support @@ -62,8 +63,8 @@ // #define CONFIG_LEGACY_SCNKEY #define CONFIG_KEYBOARD_C128 #define CONFIG_KEYBOARD_C128_CAPS_LOCK -// #define CONFIG_KEYBOARD_C65 // untested -// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested +// #define CONFIG_KEYBOARD_C65 // untested +// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 57c09be7..441f6b48 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -42,9 +42,10 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE // please keep disabled for now -// #define CONFIG_RS_232 // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_USERPORT // please keep disabled for now // Multiple SID support @@ -53,7 +54,7 @@ .const CONFIG_SID_2ND_ADDRESS = $D440 // #define CONFIG_SID_3RD -.const CONFIG_SID_3RD_ADDRESS = $D420 +.const CONFIG_SID_3RD_ADDRESS = $D480 // #define CONFIG_SID_D4XX // #define CONFIG_SID_D5XX @@ -64,8 +65,8 @@ // #define CONFIG_LEGACY_SCNKEY // #define CONFIG_KEYBOARD_C128 // #define CONFIG_KEYBOARD_C128_CAPS_LOCK -#define CONFIG_KEYBOARD_C65 // untested -#define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested +#define CONFIG_KEYBOARD_C65 // untested +#define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 8393da38..50130b12 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -41,9 +41,10 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE // please keep disabled for now -// #define CONFIG_RS_232 // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_USERPORT // please keep disabled for now // Multiple SID support @@ -51,7 +52,7 @@ #define CONFIG_SID_2ND .const CONFIG_SID_2ND_ADDRESS = $D420 -// #define CONFIG_SID_3RD +#define CONFIG_SID_3RD .const CONFIG_SID_3RD_ADDRESS = $D440 // #define CONFIG_SID_D4XX @@ -63,8 +64,8 @@ #define CONFIG_LEGACY_SCNKEY // #define CONFIG_KEYBOARD_C128 // #define CONFIG_KEYBOARD_C128_CAPS_LOCK -// #define CONFIG_KEYBOARD_C65 // untested -// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested +// #define CONFIG_KEYBOARD_C65 // untested +// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index d36e6723..5d9d4a07 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -40,9 +40,10 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE // please keep disabled for now -// #define CONFIG_RS_232 // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_USERPORT // please keep disabled for now // Multiple SID support @@ -62,8 +63,8 @@ // #define CONFIG_LEGACY_SCNKEY // #define CONFIG_KEYBOARD_C128 // #define CONFIG_KEYBOARD_C128_CAPS_LOCK -// #define CONFIG_KEYBOARD_C65 // untested -// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested +// #define CONFIG_KEYBOARD_C65 // untested +// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested // #define CONFIG_KEY_REPEAT_DEFAULT // #define CONFIG_KEY_REPEAT_ALWAYS #define CONFIG_KEY_FAST_SCAN @@ -92,6 +93,7 @@ .const CONFIG_KEYCMD_F13 = @"" .const CONFIG_KEYCMD_F14 = @"" + // Eye candy #define CONFIG_COLORS_BRAND diff --git a/c64/kernal/stubs/e566.home_cursor.s b/c64/kernal/,stubs/e566.home_cursor.s similarity index 100% rename from c64/kernal/stubs/e566.home_cursor.s rename to c64/kernal/,stubs/e566.home_cursor.s diff --git a/c64/kernal/stubs/e566.interop b/c64/kernal/,stubs/e566.interop similarity index 100% rename from c64/kernal/stubs/e566.interop rename to c64/kernal/,stubs/e566.interop diff --git a/c64/kernal/stubs/e6b6.advance_cursor.s b/c64/kernal/,stubs/e6b6.advance_cursor.s similarity index 100% rename from c64/kernal/stubs/e6b6.advance_cursor.s rename to c64/kernal/,stubs/e6b6.advance_cursor.s diff --git a/c64/kernal/stubs/e6b6.interop b/c64/kernal/,stubs/e6b6.interop similarity index 100% rename from c64/kernal/stubs/e6b6.interop rename to c64/kernal/,stubs/e6b6.interop diff --git a/c64/kernal/stubs/e701.interop b/c64/kernal/,stubs/e701.interop similarity index 100% rename from c64/kernal/stubs/e701.interop rename to c64/kernal/,stubs/e701.interop diff --git a/c64/kernal/stubs/e701.previous_line.s b/c64/kernal/,stubs/e701.previous_line.s similarity index 100% rename from c64/kernal/stubs/e701.previous_line.s rename to c64/kernal/,stubs/e701.previous_line.s diff --git a/c64/kernal/stubs/e716.chrout_screen.s b/c64/kernal/,stubs/e716.chrout_screen.s similarity index 100% rename from c64/kernal/stubs/e716.chrout_screen.s rename to c64/kernal/,stubs/e716.chrout_screen.s diff --git a/c64/kernal/stubs/e716.interop b/c64/kernal/,stubs/e716.interop similarity index 100% rename from c64/kernal/stubs/e716.interop rename to c64/kernal/,stubs/e716.interop diff --git a/c64/kernal/stubs/e8ea.interop b/c64/kernal/,stubs/e8ea.interop similarity index 100% rename from c64/kernal/stubs/e8ea.interop rename to c64/kernal/,stubs/e8ea.interop diff --git a/c64/kernal/stubs/e8ea.scroll_line.s b/c64/kernal/,stubs/e8ea.scroll_line.s similarity index 100% rename from c64/kernal/stubs/e8ea.scroll_line.s rename to c64/kernal/,stubs/e8ea.scroll_line.s diff --git a/c64/kernal/stubs/e96c.insert_line_at_top.s b/c64/kernal/,stubs/e96c.insert_line_at_top.s similarity index 100% rename from c64/kernal/stubs/e96c.insert_line_at_top.s rename to c64/kernal/,stubs/e96c.insert_line_at_top.s diff --git a/c64/kernal/stubs/e96c.interop b/c64/kernal/,stubs/e96c.interop similarity index 100% rename from c64/kernal/stubs/e96c.interop rename to c64/kernal/,stubs/e96c.interop diff --git a/c64/kernal/stubs/e9ff.clear_line.s b/c64/kernal/,stubs/e9ff.clear_line.s similarity index 100% rename from c64/kernal/stubs/e9ff.clear_line.s rename to c64/kernal/,stubs/e9ff.clear_line.s diff --git a/c64/kernal/stubs/e9ff.interop b/c64/kernal/,stubs/e9ff.interop similarity index 100% rename from c64/kernal/stubs/e9ff.interop rename to c64/kernal/,stubs/e9ff.interop diff --git a/c64/kernal/stubs/f646.iec_close.s b/c64/kernal/,stubs/f646.iec_close.s similarity index 100% rename from c64/kernal/stubs/f646.iec_close.s rename to c64/kernal/,stubs/f646.iec_close.s diff --git a/c64/kernal/stubs/f646.interop b/c64/kernal/,stubs/f646.interop similarity index 100% rename from c64/kernal/stubs/f646.interop rename to c64/kernal/,stubs/f646.interop diff --git a/c64/kernal/stubs/fd90.interop b/c64/kernal/,stubs/fd90.interop similarity index 100% rename from c64/kernal/stubs/fd90.interop rename to c64/kernal/,stubs/fd90.interop diff --git a/c64/kernal/stubs/fd90.unknown.s b/c64/kernal/,stubs/fd90.unknown.s similarity index 100% rename from c64/kernal/stubs/fd90.unknown.s rename to c64/kernal/,stubs/fd90.unknown.s diff --git a/c64/kernal/f333.clrchn.jmp.s b/c64/kernal/f333.clrchn.jmp.s deleted file mode 100644 index 7c56fe28..00000000 --- a/c64/kernal/f333.clrchn.jmp.s +++ /dev/null @@ -1,6 +0,0 @@ - -// Our implementation is longer than the original one, -// placing it here would cause a collision with OPEN - -CLRCHN: - jmp clrchn_real diff --git a/c64/kernal/ciout.s b/c64/kernal/iec/ciout.s similarity index 91% rename from c64/kernal/ciout.s rename to c64/kernal/iec/ciout.s index 3d84170c..9250c55c 100644 --- a/c64/kernal/ciout.s +++ b/c64/kernal/iec/ciout.s @@ -11,6 +11,8 @@ CIOUT: +#if CONFIG_IEC + pha lda C3PO bne ciout_send_byte @@ -35,3 +37,9 @@ ciout_send_byte: inc C3PO // iec_tx_byte sets it to 0, but we still have something to send jmp ciout_store_in_buffer +#else + + sec // indicate failure + rts + +#endif diff --git a/c64/kernal/iec/clrchn_iec.s b/c64/kernal/iec/clrchn_iec.s new file mode 100644 index 00000000..84993a0c --- /dev/null +++ b/c64/kernal/iec/clrchn_iec.s @@ -0,0 +1,30 @@ + +// +// IEC part of the CLRCHN routine +// + + +#if CONFIG_IEC + + +clrchn_iec: + + // Check input device + lda DFLTN + jsr iec_check_devnum_oc + bcs !+ + + // It was IEC device - send UNTALK first + jsr UNTLK +!: + // Check output device + lda DFLTO + jsr iec_check_devnum_oc + + // If it was IEC device - send UNLSN first + bcc_far UNLSN + + rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/clrchn_real.s b/c64/kernal/iostack/f333.clrchn.s similarity index 59% rename from c64/kernal/clrchn_real.s rename to c64/kernal/iostack/f333.clrchn.s index 845e2cb6..ab94909f 100644 --- a/c64/kernal/clrchn_real.s +++ b/c64/kernal/iostack/f333.clrchn.s @@ -9,26 +9,22 @@ // -clrchn_real: +CLRCHN: + +#if CONFIG_IEC + jsr clrchn_iec +#else + nop // just to prevent double label +#endif + + // FALLTROUGH - // Handle IEC input device - lda DFLTN - jsr iec_check_devnum_oc - bcs !+ - // Previous device was IEC one - send UNTALK first - jsr UNTLK -!: - // Restore output device to default - lda DFLTO - jsr iec_check_devnum_oc - bcs !+ - // Handle IEC output device - jsr UNLSN -!: clrchn_reset: // entry needed by setup_vicii + // Set input device number to keyboard lda #$00 sta DFLTN + // Set output device number to screen lda #$03 sta DFLTO diff --git a/c64/kernal/f333.interop b/c64/kernal/iostack/f333.interop similarity index 100% rename from c64/kernal/f333.interop rename to c64/kernal/iostack/f333.interop diff --git a/c64/kernal/interrupts/udtim.s b/c64/kernal/keyboard/udtim_keyboard.s similarity index 61% rename from c64/kernal/interrupts/udtim.s rename to c64/kernal/keyboard/udtim_keyboard.s index 369b907f..d35f86f6 100644 --- a/c64/kernal/interrupts/udtim.s +++ b/c64/kernal/keyboard/udtim_keyboard.s @@ -1,29 +1,12 @@ // -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmer's Reference Guide - page 303 -// - [CM64] Compute's Mapping the Commodore 64 - pages 27, 232 -// -// CPU registers that has to be preserved (see [RG64]): .Y +// Keyboard part of the UDTIM routine, has to preserve .Y // -UDTIM: - // Update jiffy clock. The whole day is $4F1A00 jiffies (24 hours * 60 minutes * 60 seconds * 60 jiffies), - // after this time we have to reset the clock. +udtim_keyboard: - inc TIME+0 - bne udtim_update_stkey // done with clock - inc TIME+1 - bne udtim_clock_rollover - inc TIME+2 - - // FALLTROUGH - -udtim_update_stkey: // entry to be used when interrupts are disabled - - // According to [CM64], page 27, another action we have to perform is to copy + // According to [CM64], page 27, the action we have to perform is to copy // the last row of keyboard to RAM, so that various routines can detect the STOP // key press. But something as simple as this would have created warm restart // with M+N+SPACE+RESTORE due to ghosting - so the original ROM has to provide @@ -65,17 +48,3 @@ udtim_update_stkey: // entry to be used when interrupts are disabled // unable to, for example, read the space bar status. rts - -udtim_clock_rollover: - - // At this point TIME+0 contains 0 - lda TIME+1 - cmp #$1A - bne udtim_update_stkey // done with clock - lda TIME+2 - cmp #$4F - bne udtim_update_stkey // done with clock - lda #$00 - sta TIME+2 - sta TIME+1 - beq udtim_update_stkey // done with clock - will always jump diff --git a/c64/kernal/fd15.interop b/c64/kernal/memory/fd15.interop similarity index 100% rename from c64/kernal/fd15.interop rename to c64/kernal/memory/fd15.interop diff --git a/c64/kernal/fd15.restor.s b/c64/kernal/memory/fd15.restor.s similarity index 100% rename from c64/kernal/fd15.restor.s rename to c64/kernal/memory/fd15.restor.s diff --git a/c64/kernal/fe25.interop b/c64/kernal/memory/fe25.interop similarity index 100% rename from c64/kernal/fe25.interop rename to c64/kernal/memory/fe25.interop diff --git a/c64/kernal/fe25.memtop.s b/c64/kernal/memory/fe25.memtop.s similarity index 100% rename from c64/kernal/fe25.memtop.s rename to c64/kernal/memory/fe25.memtop.s diff --git a/c64/kernal/membot.s b/c64/kernal/memory/membot.s similarity index 100% rename from c64/kernal/membot.s rename to c64/kernal/memory/membot.s diff --git a/c64/kernal/under_rom_routines.s b/c64/kernal/memory/under_rom_routines.s similarity index 100% rename from c64/kernal/under_rom_routines.s rename to c64/kernal/memory/under_rom_routines.s diff --git a/c64/kernal/vector_real.s b/c64/kernal/memory/vector_real.s similarity index 100% rename from c64/kernal/vector_real.s rename to c64/kernal/memory/vector_real.s diff --git a/c64/kernal/ff80.interop b/c64/kernal/rom_revision/ff80.interop similarity index 100% rename from c64/kernal/ff80.interop rename to c64/kernal/rom_revision/ff80.interop diff --git a/c64/kernal/ff80.kernal_revision.s b/c64/kernal/rom_revision/ff80.kernal_revision.s similarity index 100% rename from c64/kernal/ff80.kernal_revision.s rename to c64/kernal/rom_revision/ff80.kernal_revision.s diff --git a/c64/kernal/rdtim.s b/c64/kernal/time/rdtim.s similarity index 100% rename from c64/kernal/rdtim.s rename to c64/kernal/time/rdtim.s diff --git a/c64/kernal/settim.s b/c64/kernal/time/settim.s similarity index 100% rename from c64/kernal/settim.s rename to c64/kernal/time/settim.s diff --git a/c64/kernal/time/udtim.s b/c64/kernal/time/udtim.s new file mode 100644 index 00000000..65dc6aaf --- /dev/null +++ b/c64/kernal/time/udtim.s @@ -0,0 +1,41 @@ + +// +// Official Kernal routine, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 303 +// - [CM64] Compute's Mapping the Commodore 64 - pages 27, 232 +// +// CPU registers that has to be preserved (see [RG64]): .Y +// + +UDTIM: + + // Update jiffy clock. The whole day is $4F1A00 jiffies + // (24 hours * 60 minutes * 60 seconds * 60 jiffies), + // after this time we have to reset the clock. + + inc TIME+0 + bne udtim_time_done // done with clock + inc TIME+1 + bne udtim_clock_rollover + inc TIME+2 + + // FALLTROUGH + +udtim_time_done: + + jmp udtim_keyboard + +udtim_clock_rollover: + + // At this point TIME+0 contains 0 + lda TIME+1 + cmp #$1A + bne udtim_time_done // done with clock + lda TIME+2 + cmp #$4F + bne udtim_time_done // done with clock + lda #$00 + sta TIME+2 + sta TIME+1 + beq udtim_time_done // done with clock - will always jump From 9f4c399158aab9caf1dbd89b3d4d7602f9987ce3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 17:10:00 +0100 Subject: [PATCH 009/105] one more IEC size optimization, 37 bytes saved --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes .../iec/iec_pull_atn_clk_release_data.s | 22 ----- c64/kernal/iec/iec_pull_clk_release_data.s | 19 ---- .../iec/iec_pull_clk_release_data_oneshot.s | 15 ---- .../iec/iec_pull_data_release_atn_clk.s | 22 ----- c64/kernal/iec/iec_pull_release.s | 85 ++++++++++++++++++ c64/kernal/iec/iec_release_atn.s | 14 --- c64/kernal/iec/iec_release_atn_clk_data.s | 22 ----- c64/kernal/iec/iec_release_clk_data.s | 20 ----- c64/kernal/iec/iec_release_clk_pull_data.s | 20 ----- 17 files changed, 85 insertions(+), 154 deletions(-) delete mode 100644 c64/kernal/iec/iec_pull_atn_clk_release_data.s delete mode 100644 c64/kernal/iec/iec_pull_clk_release_data.s delete mode 100644 c64/kernal/iec/iec_pull_clk_release_data_oneshot.s delete mode 100644 c64/kernal/iec/iec_pull_data_release_atn_clk.s create mode 100644 c64/kernal/iec/iec_pull_release.s delete mode 100644 c64/kernal/iec/iec_release_atn.s delete mode 100644 c64/kernal/iec/iec_release_atn_clk_data.s delete mode 100644 c64/kernal/iec/iec_release_clk_data.s delete mode 100644 c64/kernal/iec/iec_release_clk_pull_data.s diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index bfdb0f185d5df6108c2a285df214bae784f19fd9..4df641d467182d1f4fd54639442bc34d8e2c16c9 100644 GIT binary patch delta 409 zcmZp0XmHq2$HJ8UbaDfW6Oh_`gk?FSRQl7E_6nE&XRK0aU7;ZOX^|p`PJaqSlUvzZ z8N)Yov(IB>68yAzH3u)VCN|Yetxo>`z_UmmsBx*)GE0TbH6YCoxs8CjCX4a}fo#m= zc~}2>?Mamj%sx!(P8v)QIBB(k=fuXU5Bet+K4|+StW_vkr?B_G!h!!2n0>O=DLnrV za>LHGYZ;hM8eE89%Lt+(d{Wjaa4uOY`hnSJ^6I4`CpiRIH!%CmSlzk{sM_bw%9RXA zW-Q`YI0i9o0mFfS43jVu!H3u)VCN|Yetxo>`z_UmmsBx*)GE0TbH6YCoxs8CjCX4a}fo#m= zc~}2*?Mamj%szkCo-~*saMEf6&xwsyA9PMCe9-VoSgTODPGRqVg#-U5F#DvhQ+WPg zVe{Ix3`{2tF2t;51W}BM789m18N0$HV!ozHQY>l?%*1b61@-m>_V{Y6H)Sja47?Pbz%S z_W8Y1fq%8a-v0^*{!d``VO_28{6EOFkX36Lm`)m8h+oSHq9T0$uTltkvQ+c~v(Kj0 zOGQp{2(WHo_SwF=br(>zkK@{v3`k}y;#W8ZF>L|Efq)MpkqX=YU*K0b4-uQmz;wbV zcU1z=4xrve3>^lXdl{I3UV3ri3(%UC49j*cNKn}IALOnB|2Kp$VgQ=9Apod-gExq9 z1L|7v{{)C>J^2Wi#pM57GLz-FcWPn_nWa`I|9{|FBo7RvrB=%<6*$%ab#LN{6K1rW I9525R0QMNFod5s; delta 389 zcmZp0XmHq2$HHXxd2$1b6Oh_`gvF2%M1N;J%P3{`d8NI=rT-bL6rQb62>!cB5k#AP z2BOLL*bSM2|4tU<2m)zNh@o+w?Z&-Cwl@^M_dk^xEgB7TKq5OWqV90>RzqOkq{1%8F#^ANF_3`{3{(pM#b zoa?u05krRo=UxUTpl4oO_yV+JCBw2^3lbD|{Rg?|!2btRL6Oh_`ghiN{i{;1C4GJtj6oCAP?Al_Q!Jk&zD_r`Yu}Z=9 zp+fNAMT$UrsnyBEtT52}}v!H}kO1Wdw3JujY_u1___w_5pFlc$^sP->f~Ua)H^0 zdEH5a2?8grHt?L-SoJ~wq{0VnpTxBarRx;-{#Q8ge*&{l_Bw^<{}s}oD(qUjmVxP{ z!G-v>Ktl~KMEInxQ{Y^(RP+P0&y>|mMNV=Eux?=XnYp@k7f`j&os}yYkjz-buW$@v z+5(0H0Utyn6}JDsz^`x~A~utO>4eYawFy8wfO;1(bQo~%Wnfac^#8?$FFRRys1c+%pS&Pp?-lt`W2hiCWt4{fBTMd-i oSasp|jAd0zs(tqUXJAO!Jdw|ae_{gH=CiUB85u1n$ICAS0MUz<3;+NC delta 279 zcmZp0XmHq2!N$b!YH}6Z1Sa|Cn|avhG6K1qS93@+gM?3T`+&G&JWh;`&(@w)xxno6 zckM}o2?8grHt?L-SoJ~Yq{0UcpTxBaMe7vy{#Q8ge*&{l#yW-P{}r~ZUCY39(%?eO zT1F5R>JvYC4zEPL&z+Sk8IY7N;#W8Z(X@c!K)?qPh3)?@@GG2$2+d?*I^lD6ZGuAj zQ=oZ^7&;6%_cAakT>Agw!WWv$-koQot{mJR;Bo!#VN7>! z_I=;mci(;Q^FE)?ck3$ZD!gA(=E0cgMT0T)PJkb$9vZgsL&mpA6yl3g*00|>hp^^5 zK+3F=imWkwYC7dM=Rxl+dMPxdL6?;>@RbB#lTv1w;{TfRiuv0SA<;-oG?pp+o$M-m zYb7!U8_;K(ce8IVDH~LaOsboFZ|h+xjG+E$Zw8{`UIxa{M-eX#gPe;wZR==YZ5{Yt zz}A6^g7_Vi9ox~)aHmt-f z6#hdDAC9q3j${EK*hCWrOH4idt@F)*lpw|-E{bsi(dp-V?e?~j*Dl=F{dZ$(q8Z*79-(=6mK6Z~M>%Z%vK&y_-p zPsFxlgbOqlmCo~2`VVueW<8_5Z#J2AoN!G5RmahC-j-fyDBzEz7wvXxZerk!n%?y} zx{~nYjxZ}8rx%1wkyl9}4>>iV7;a)8P*yyT;dY#!6w2_0u#{}(o3&rd)VnQHwsLGV?!-*xRRsvK-OHeJ-q55>6Ih<-QjN3YF z3`^juC=P}3{Q!=H(ebc&4gtF!N(7pXd4uRc*c*Z&pz&>qUDC&Ov}f9T1)ZGt4!8SM zk~^=5J;|^SeHPYx|3Z$i_Y>p{19>LHVpBq*8ca*u8!!L{+o!ti#b2@i#{t zT_gVH5y!x&@;Epyq2>{ohz|vIQKZ!(OEk&y4YX-k(TaiP#XxhZ4k!hTEmMFX-%s!> z^IzPqE4uiZ(kQ$u;O{llD?n?mY7$0WzaqgjTs0&(#84~4%4tm|+1NzMt63|*FYDI_ z@o!=T`tN<9fJ>sdHWrkXPM2JF5|b?Wg{M`e9guABEbRMspqIeABc9e?GvG845YM{a zCdG5Ey`<=K9U%Snt>PKg44~X26YKmvboVnK1F-j8x~kL7*Yt zn)<%IW;2D%bMP89kbWB{V)~ouh2&<^U@Oo|r=cymrEE{e$}BV`AW;2L$t`G09^)NR z=%k}$N6G#sh5_g#XR|DKrv8f~pR=M%&4PWx8$)3v@;}RcX-8Eor~u>l#Kj@?X6L)4 zoS|$*CG)5-4tf(uI9a^H4eQ76cUYJtA2ffxAN)vh6SmV`GOFTxatp}9IDa#@$ll*~ z$!Y;y@X7g%1O-2qJ6rENa*ieH2)O9A;C50uY?Vl(8B}bsF2)zM$G3XyL`7YqH<8dS z5@-}Q9fP!cleC_@#{2SKwu3{LN5G+hr!QnIGnq^zIdx*{ zL(CW!xDT*oB!q~WvSq4@VY{3alyr^V}mz50Q;wA1fBIb3kP8JE! z!)sB!3T)TV(^*{!r@_%0K>5;A5rh(GMBr@vo6I`IHBQ5^lt;eq z02Sjsb~``>*TO;_jf`~$gMl=rAxM~{s^|kZNk(8OxFHg&d;>1oyx#&S*h(_>XdF<` ziR@n8Wb)-u&Hdh#u6|bz<=6>+{hW;I*Y+@^>ENcytV&v0h7G!v)Zi&4B`Dy7)8Z+) zK+!}2OydcxQs7RhVSYz`#anry_HmWMJGAyuh4zf8uMCX=fy8TI*L%Ydc}54WsRa&y z*NCHe#NQQhG)Mdc*ObRP%XCK>8U;_0PH?kQgo{G4Dlwhz-mLL6DX;Q|+@1V|{GXKS zc2le43g|wX6|#Uf8|X~%9F!M?>I=mfo(Lw1sDw%UZ%r#!9Y@A2$ ziyo$${j}K}Ff6YX2xqP`KHP?Wuknvom?Ql_dgRGAe;aI delta 2619 zcmYjTaZnWJ72n&1JMI)%2*M(QpT-2xC>U+T(Kf`IdZu5Zog@v3opBvI@#tXlUqU<6 z-086Pq+*UPor+V_V{_}UPUswyY4u2{NEO+u)I|hQp-FA-@Mxp!t#^As;QIE?nC#r# zzPI0d-}m;t-}}9F)w*i^|DFl}WToXyZ->SY6>rG%jRkHJu-lS{lB@kDfeQJ(OWt>;4=bH-L_0zr zGkWU*+|l=R^veaoBKlt9e10=Jtm8Xj2m$Sg8%sOlLHdh2A!!7c6;u+{MugazV7HPM z0==fAy}F0O@u(GHdY+Z(w8G-GQ>bPNl-a0N<$UPnke|X0w{*k8EVC+E!!oI88quw2 z>a>uM2WPCNbAyVGR%j3hgas>tMI!8Alv>KIZ?Xdwk zMsPz2)y<<-yu(^*GVw>OWxLvRFLCj#YVH0MT}uw)&Il`>qUVHMkylBf2({@#1^kKq zfJ*TKhQCwvq)>$~N2J^u_Vfi`Kf|I54eDw9n>AjuKEKfvM}JJB=_G!C`tSWiHPy$6 z34t_HRi*S^PNY*+0;wuXr)rUrs!!gwMa)I_Vo(i+CGab8s9E(K%bjZq9O>czk^j>t zxEluYv&54!rBIlN0Fd~}yp_(^bZPI`fO$2_VjS}p3l%JCo0oSfw$AQh8L1S0JK`-* zi>N#dYn|?HZLn2ycMlJ?4!bXoDEGtT5^5a=L+p*EPHIFO7g9K0OX zV>BKK)iN7h7LSSn^kiB>2P62`8d2*?_9c_aR7WD{PZd*9afDtnFh*wpc*aon!$%|m z62Hf?gJ#8t@@-{C)Z{+Z207(N3x45jsHR#tlI8d#7n=GZRgD1E#TsLpP5!h{#6_Uq^iQ`oY z%hbC(Wc_)(HUeu_y7Dt)H7(vSMBpJcqXr1b!O9taU~GB0f0h+Ccbz7IOg3WRk)9W1 zQlX?ID|%9%2>dGV8_qyKcY80-(0Zj4Fb}(?wok8tW~B{F<3wI8dfExIW~VW0pdW?& zu6$)EUs31aZVWiXItvWHabeG(g$K=mJt^IL(0RzDv*HycPrRyR!z&MQSCJ`hG<0gn zWHq9dx-n&7)_e?|?@Y)go?N-slOyl(Q}r(XCrr^B^$CE(1`X$EutA$KMxaVN^{*A^ zvH9~(C$tn?b8{{lWw=Zx6Pb~PnrgoD!Lu7TtuI-#wk7+y%^Qg7b**`)N}(=?vg-Ir zrl_(45MZze1%Znv(~`;9x?Q5UlWf?ln8O{)s<6PnlfSY+?2wl#0I|9|6fXa&c5$>K^PKcDD`>c5CidZSdl# za^FCc!G;4Pz=!;cOW*qF!zWCi{ML5Cw75|qS_+l%;7K$Z;_odhT=T7wUd#FL%OS=) zFI3}T0_uynnQ}`ij;|t1AiBadr_(?<6p87a~z;>0bdEIMs!xu*5xV?*^ zvWqD-!_mM{4!mQb89HbYJOcZkiFVXQq?YEVn8)aik_vk;;>tr(}yG zOg(7uS#-4wn|kyR9o2VUPEGNd+T1{X#V6T)R7?rhUvk9^7|>@UG3+v=+U z-j2##LmG#d=UvMSo++Bbl7^pJz*{sdOyQ1)_-Y9M_by&|fK56!Phn~vzpG>R0p6G7 c`R})|SA8PabrT_o{ diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index 1c091b9312a1d3e614fc59d2590db77dced52bc4..939e42e961388c56418393d53e52372224502160 100644 GIT binary patch delta 2669 zcmYjT4^R~672n$hjyokRgg=W4d{(W8f9h$RiixS1G2_*Kl~$XIsZF<~jYo^kbUGT+ z8FOe@a$&?Au4y=o0cN{Ica&mhd9@n==V!FfZ z_rCXiynBCs@AtN{sItg?ozgG!i*B^cj}DCSL)6_=|4i|2&Gr|6{=M~^*Bdu%=DQPq zlrkB04xAlikz)++pWyQnSFRimBdmB1l3rFyLi#Xnno7LKInjZbn?gx`*s`t^d^5(E zC$7`n;Xg=Ro%;Qt3xS3xs*JVAVln<+da%{8pK8E=W0o6+G2-VQ4^sV^M)*5;jgnwu-JNVPuMa+S4 zEivLb7_QY0dj1?H4jU9nSI-Q+w%K?J+qS#ZAb|Tt!?L+o~BUNOe%dpDJ>K zl@7C>ZiSon^eSA))1fq9?UHv_b-A)?kCS3|-#et+%pXq9)V`-+_qeB)KbgFq3`F^^ z^vmY_s=4HP`7j^ z#JM0IXW6!9yn4b)Pnykm+qe)rp#@Y6Gw8z@nuy^yC%6k$|Em6kt-4y>>BzTfJsDJ8 zr#ta{r#*vGBX_;R|0x}P{HDG?$&wp2H=7xjz`H`&AHYQs91Nf{0r3(7WKFsV^nTdw zLk9zHKd1o0_gw6JgWN`YrrbBtk%+tZtVbrfE2?-oE_R@Q2Grd@kTu}`JE{!;Rz?G& zt)NIAN4Hel&}v@#auZ@IF!sGi)J?SNI^! z*I0Ba>MfS^&FA~QNT%?s0msUD5$&3Wvu5l0U{77pdcMD>uHSlfKziUCa-q6@xQO5I zsU4AAfsCOz#8=VUUP&yvS0%toARvtZk{|M3CgWMPn+;!g8HIO@^|b5hOz1Ov z2?<*JZ%AMbdpQXd(Ou85-ejBBn_#27`D`KoYT9otcvF}_d!pdB-9>Q?EOeEQF1TGw zjIzKL5Fl*@V_g>^?!rhrfs2FA`gT3!X=6mZXx~SQm+Yma=&>Ipd#dWi3$h-P1}s8h z3uFY08E2ogpp5^fWTfO;x$3vmp4q!?2=t@^{tpmm4XL7dyEt;?=4S_+>D2 zSv6Do5KjgidMh2}Gcv4C12fJyC+>RWsL_llChLIoAf@dFX^Ji1 zK%tMq;HfF1y9eE`dPC2~15AeSV5g&DEx0Q^8<(YNSPGzT)uV#DuogVPFN9#DL-CE2 z{;doO*u-zMEO&8Xm8bd=E868W6&f#P8J3{1PlC=!n-aU_&s$$7y(!Wr^zRvz8$~yG zd)5jIg8Z0U7*`4lr$XYWIVvygrNgNAA>6^g3$@imTiX5@m0LhFE=`MdKu<9MnTudM zJNgQZjvT?DmIxn-q{JxrQzHZ5&af~kTw5VvBAI58!B{vKomC#(y=+k#fE&b<(F&*I ztffg5N?4|>(ngkD#%lv6@sylUh%Wfdta!;wN|Yi1D_; zFG@vEHVLGIL<`5vCZJ)nS0g0~MJhEDCy+EwM};I< zCnTAl$^7vvDt}a{nSuP=pBB;p7OUt~AQALh1ZF9WRyYx~F2V$t;)fCQ?@f-JxcHPc ze$T9Crm%$Vr9X#%F>_9JFFKhL_TxIemRwjN5Vcv-P;Ub&Rrvc$vR40JZHqW3J`iIZ zQNf6}PdGFcp4UnHVY27iJEZieySs#6m;0TpYg3{<&J$2Kv05L@+_<>plhHl7eHxlaYNi^Fde-a5``Df zh_@2s^-*fPb&_5jC=3{2c$NmdX;O+fz?8ubc;`kQ)|}v%8-t-ojLd(RJeo$w<{-_q`o#i8VDP6tzA`^!O|~DO4B{1Y*rMRmeoXo? zrQrXJ<3=P%u?lpCn>RaE&J3SSK4xe(TmIbblb1hH}M J%f};M{SQ*&5#0a) delta 2665 zcmY*be^3 z5C&6TG*`x5BkiLEIRp5}oKT=&zkW6*CeBb3gp$k$ zwnJ8@B}uMmOv>489k$NWO5$ffhfi$0OWR8>u9CP$z2g*EkUj6NbBt3cXI{*8Qhx1F z=O4Nz9L|2VwleN4?`oi%!*0}kv$3y8o+C>h)GgM4N%mCq&pBApvzjrYL2|voyF96I z5xzU6S-mH!vGzp$?AMiILi0GyFULwWx3MEecG3n4y{w{dB6bFwqeg_;IHAhw5`Bq8 z0=(a1O{+m`R812^p-nA9{taRMZc+ zbDB=m(%|q(+G7)rrez!2RqUDeUJ%|*+e*_xVIXa%E-28(itP1Mu93c<+D+j92(AvG z$~f8?6RM1PI-Ss9EGR#zI;m?H6=U}&=vHC~cZ7&^o_#2$OM*g+xmrAm;3f4#jHD|V zUgz0KaSQ%5LP(&~ET%G0j&!`tGZaECxI;BIq|WkoAnHQQ=)^ zU%RO^tvL{!+cSp-1?8=C4-rpJ^qM zCbjw)nZZ;D@E}ZPtgZ!2xnKLA)|ci8#u2AQge%X+edV&Lqx+^0DGYu+uBr_4>gAyyKfEw+OLhs_ov1*;DaD`Mv_<6p!|3e$QxJ#6k-toSp%i}Xwy5id!flr zyLJ4qaLANZj4rF5=e-AL4WoHrkoPd{BXTPGUJUol>F+$U4&6|NwoGnC&)i@OM@k8l zNXbJYjOxp4u`NO2?+4vxd@Es3{o`BoN5|>YZ_#It(*&)Hx>^*r(Yv1>xCEZ-qJ0!D z54&3WOm+sxBhn?uep>2r9H1qy<1jr`-y&U93{nr+Vy7XesX-7kMk5nBh=M{ONTMF5)&*x>BwV+Edn zfv``fO!#PJ%tt9-f(~WkQP$1ixTjy!`iAQ1(X_U5xIR+7jd=|HJNTe^hWJuE0C-=a z=K&E)R_#kC<^%&jA~}={4brdV6y;UKrew(6!GJWVeBO18_L=1!=&J>^GKPYJBWK-< z6)}$3IytwQ09Vvc#^cIzKN~~-S&+fMj`kKVcJ?xhN++C5%Mqy=QknqBxhV~F5U~ZK zmCY`Ea7IA6xsX-u7+T#Vsc|{m+a$4)a8-47y6Q51Dg-+HsT~y1xA+Ezb`QR+3Jb zG^Zew?xm82f<-!&NY~{I>4t2Esu<>PK-){!eIdtH#H=sC<11DUoke{K7a_mS$1g#}o!XEv&XY%O?1Udx4L__$oGZ_T~nKBbG8g zL+H<8LCJqI^YyrNlMhR`O7At&T-6vqPXv4Z&$IU?|KL0%qP~}@o7_1gGZ1v)V1Dri zXlC{FM{m=o>*+IZ(@FfKL7I*1<6K*{UaOf`Ua;{Ms8#F>XxPxe_!uCQ9#%@5cQO=SvE-{rJ*92jt4@%4B0G=a8(9lAufOm0{q4LzczeATC7R5X{CHMfe$61BWw@jby1Wyl35mUW^souok X?ikLP!=`|9LZk>Z-`L%6C%*nKwI&1# diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 1947d6809187aaecf6f2e29e4b1c1de7e7bedd3e..9b10448d4dc2d30ee771615e7deae446dc85d910 100644 GIT binary patch delta 2976 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 delta 3016 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 delta 2580 zcmYjT4^R}>8QsnINAwKO}Qk`($r~2Ydd|_CY~LfF{Yi8 zblSs|#TzR2=#mylt;d#iSfVU zX5aVT_wDa{-~Vfg_o zQH0>IOhx=^Zlp{7YDAP9TBvZJDg0cTZJ7s;eSPhSIke)71P22^GeV5xFJ@LZq5P| zegB470KzNT{E(`nr3rLEM;lYX5iK(10-+4^miwnJe@TX1;LXUn-97H!s!b%sUV=~D ze7CWey17lH`$BMx0_6**<%W(i3N4xzi~Ur{I5dUMoD|;3d)1S<=;L$spx&2@zL?UJKLO!|s2ku;xN<%)zQY zE6r-_{AtlLSR4hQL6dGbg_X2cGL%-A`z>R|QPtYc{i-X`gI}KXvezr~D?{x0p|qBl z1<)RltNBv|^1zwzXU2lMmg8lUBzRosXM(46el|ELJXcgf(^28|q6bTeOKMXskv7iF zzePB7Bob-EiAnUcsK8iXT(~0AJu>tipAE8R1lLWVYbo?(QrKZFr7y;Xz1Fgwhjl-7 z@`z^be-C|>K7)H=L^{CU7V{+myjP44>!Jf*(lBJQbR5I$06Q*z4Zk0g^Q*|A8TjT`UWge0gra+!KnF0CR&M);#Nx1+&F?>L4ZiOCg0fok5mUXx&WUncz0s5G_UP z_25ogA!;r{NjwlYe|E<1fAhS{mrsMoYnt zo%ET;cIk*_kp|#4J{qE@=pZ&5mxAbrhPNS-J7aing34n#MEHQo+iA|bi8pGt|bjPzk~~2i=hKC(3epZjmcD2 zQ8WgMKw-k*F{unClZ-PmGp1fCE3GT0Ou*!1xZX z*WJ@h+&%bf*z4ZPJZ!ef4kkgg7Nqx8fP?scbB7)OWw)U{@){0#s?WfWF3AYQX(5;wM zv-pBhnbdxyPO>R67uG3NBla`{KO%K#1rS`}dy5=pTaytLVq6fHPHUI?enBgC^(nL~ zipo+(hv;0i+_M#Y;qK*RI{~(sGrlXX%@46j6uJRI_~qHbeevGGpU1UcIGI#uq*jQ2 z8r&yS#)ZMfHwo21!NV@6svFWn>9oAqo>!wsDq|Rh9 z0p%WShHzfLs{|Rm%nq8|?>5y7OL89SPjkfqpm)Vv6nDfj=PRy+_+}053I@qg;v(knlZE&Iz=<2 zft;;%sC0BOPNWai0_mX-RXbGES^h&*6O~Q;S#oDw73jtcgju}@W>u@;;2v7`%OvFB zV+p(<0bjHka~DFpM!&lOp9x;B+PXP)XjEgcc}h6PeVyIS&&W6VS(sx^OYfjn7nYPf z_LuP@)4RX7?V{(^i&V=Zbu`q8UK6gB7IXL6U(I*p4HKL{C062RgwnDn3bxySEF<768{e2N|Wv29N!nc>KdPz*fxXi@sUQDv7 z(hQk74}j0}qx}0Ysgxp>!Jj9k^X9BA%}T3klSZmy4j5$HVoHH(mqxf9u!H{@g1Y1d zdhUi$R_<84IR!mh5um-UpD?I4^(I~vN8AKnGQl5d{Abg9Bun!64Jp9V;rba zNC%;zylB-H9oOpk!8yD(fg@4eHH~W~@aL0wOve}FSkW<)!rOIBZr~rMg`x7&<%@MZ iJyYjk>Q*v!s~9|T6+fB4wh4b&qzFab(yx5EHT8exu;wNJ diff --git a/c64/kernal/iec/iec_pull_atn_clk_release_data.s b/c64/kernal/iec/iec_pull_atn_clk_release_data.s deleted file mode 100644 index 1b8ba0d9..00000000 --- a/c64/kernal/iec/iec_pull_atn_clk_release_data.s +++ /dev/null @@ -1,22 +0,0 @@ - - -#if CONFIG_IEC - - -iec_pull_atn_clk_release_data: - - // Pulled CLK = DATA considered invalid; for extra robustness on non-emulated - // hardware give some lines few more cycles to stabilize; see page 10 of - // http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf - - lda CIA2_PRA - ora #BIT_CIA2_PRA_ATN_OUT // pull - sta CIA2_PRA - ora #BIT_CIA2_PRA_CLK_OUT // pull - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release - sta CIA2_PRA - rts - - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_clk_release_data.s b/c64/kernal/iec/iec_pull_clk_release_data.s deleted file mode 100644 index 18ffda0a..00000000 --- a/c64/kernal/iec/iec_pull_clk_release_data.s +++ /dev/null @@ -1,19 +0,0 @@ - - -#if CONFIG_IEC - - -iec_pull_clk_release_data: - - // Pulled CLK = DATA considered invalid; for extra robustness on non-emulated - // hardware give some lines few more cycles to stabilize; see page 10 of - // http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf - - lda CIA2_PRA - ora #BIT_CIA2_PRA_CLK_OUT // pull - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release - sta CIA2_PRA - rts - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_clk_release_data_oneshot.s b/c64/kernal/iec/iec_pull_clk_release_data_oneshot.s deleted file mode 100644 index f3d7696b..00000000 --- a/c64/kernal/iec/iec_pull_clk_release_data_oneshot.s +++ /dev/null @@ -1,15 +0,0 @@ - - -#if CONFIG_IEC - - -iec_pull_clk_release_data_oneshot: - - lda CIA2_PRA - ora #BIT_CIA2_PRA_CLK_OUT // pull - and #$FF - BIT_CIA2_PRA_DAT_OUT // release - sta CIA2_PRA - rts - - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_data_release_atn_clk.s b/c64/kernal/iec/iec_pull_data_release_atn_clk.s deleted file mode 100644 index 58d3ca1f..00000000 --- a/c64/kernal/iec/iec_pull_data_release_atn_clk.s +++ /dev/null @@ -1,22 +0,0 @@ - - -#if CONFIG_IEC - - -iec_pull_data_release_atn_clk: - - // Released CLK = DATA considered valid; for extra robustness on non-emulated - // hardware give some lines few more cycles to stabilize; see page 10 of - // http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf - - lda CIA2_PRA - ora #BIT_CIA2_PRA_DAT_OUT // pull - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_CLK_OUT // release - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_ATN_OUT // release - sta CIA2_PRA - rts - - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_pull_release.s b/c64/kernal/iec/iec_pull_release.s new file mode 100644 index 00000000..8be0e851 --- /dev/null +++ b/c64/kernal/iec/iec_pull_release.s @@ -0,0 +1,85 @@ + +// +// Helper IEC routines to pull/release certain lines +// +// Order of operation is set for extra robustness, on non-emulated hardware +// lines might need few cycles to stabilize (released CLK = DATA considered valid), +// see page 10 of http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf +// + + + +#if CONFIG_IEC + + +iec_pull_atn_clk_release_data: + + lda CIA2_PRA + ora #BIT_CIA2_PRA_ATN_OUT // pull + sta CIA2_PRA + + // FALLTROUGH + +iec_pull_clk_release_data: + + lda CIA2_PRA + ora #BIT_CIA2_PRA_CLK_OUT // pull + sta CIA2_PRA +!: + and #$FF - BIT_CIA2_PRA_DAT_OUT // release + bne iec_pull_release_end // branch always + +iec_pull_clk_release_data_oneshot: + + lda CIA2_PRA + ora #BIT_CIA2_PRA_CLK_OUT // pull + bne !- // branch always + +iec_release_atn_clk_data: + + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_ATN_OUT // release + sta CIA2_PRA + + // FALLTROUGH + +iec_release_clk_data: + + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_DAT_OUT // release + sta CIA2_PRA + and #$FF - BIT_CIA2_PRA_CLK_OUT // release + jmp iec_pull_release_end + +iec_release_clk_pull_data: + + lda CIA2_PRA + ora #BIT_CIA2_PRA_DAT_OUT // pull + sta CIA2_PRA + and #$FF - BIT_CIA2_PRA_CLK_OUT // release + bne iec_pull_release_end // branch always + +iec_pull_data_release_atn_clk: + + lda CIA2_PRA + ora #BIT_CIA2_PRA_DAT_OUT // pull + sta CIA2_PRA + and #$FF - BIT_CIA2_PRA_CLK_OUT // release + sta CIA2_PRA + + // FALLTROUGH + +iec_release_atn: + + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_ATN_OUT // release + + // FALLTROUGH + +iec_pull_release_end: + + sta CIA2_PRA + rts + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_atn.s b/c64/kernal/iec/iec_release_atn.s deleted file mode 100644 index c9d49478..00000000 --- a/c64/kernal/iec/iec_release_atn.s +++ /dev/null @@ -1,14 +0,0 @@ - - -#if CONFIG_IEC - - -iec_release_atn: - - lda CIA2_PRA - and #$FF - BIT_CIA2_PRA_ATN_OUT // release - sta CIA2_PRA - rts - - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_atn_clk_data.s b/c64/kernal/iec/iec_release_atn_clk_data.s deleted file mode 100644 index b572dfc3..00000000 --- a/c64/kernal/iec/iec_release_atn_clk_data.s +++ /dev/null @@ -1,22 +0,0 @@ - - -#if CONFIG_IEC - - -iec_release_atn_clk_data: - - // Released CLK = DATA considered valid; for extra robustness on non-emulated - // hardware give some lines few more cycles to stabilize; see page 10 of - // http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf - - lda CIA2_PRA - and #$FF - BIT_CIA2_PRA_ATN_OUT // release - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_CLK_OUT // release - sta CIA2_PRA - rts - - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_clk_data.s b/c64/kernal/iec/iec_release_clk_data.s deleted file mode 100644 index 35deb964..00000000 --- a/c64/kernal/iec/iec_release_clk_data.s +++ /dev/null @@ -1,20 +0,0 @@ - - -#if CONFIG_IEC - - -iec_release_clk_data: - - // Released CLK = DATA considered valid; for extra robustness on non-emulated - // hardware give some lines few more cycles to stabilize; see page 10 of - // http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf - - lda CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_CLK_OUT // release - sta CIA2_PRA - rts - - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_release_clk_pull_data.s b/c64/kernal/iec/iec_release_clk_pull_data.s deleted file mode 100644 index ad98c987..00000000 --- a/c64/kernal/iec/iec_release_clk_pull_data.s +++ /dev/null @@ -1,20 +0,0 @@ - - -#if CONFIG_IEC - - -iec_release_clk_pull_data: - - // Released CLK = DATA considered valid; for extra robustness on non-emulated - // hardware give some lines few more cycles to stabilize; see page 10 of - // http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf - - lda CIA2_PRA - ora #BIT_CIA2_PRA_DAT_OUT // pull - sta CIA2_PRA - and #$FF - BIT_CIA2_PRA_CLK_OUT // release - sta CIA2_PRA - rts - - -#endif // CONFIG_IEC From 83d25112214c9e5a83f954b6abeee05a3e61f1e9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 17:42:48 +0100 Subject: [PATCH 010/105] started work on RS-232 implementation --- Makefile | 1 + c64/,,config_generic.s | 9 +++--- c64/,,config_mega65.s | 9 +++--- c64/,,config_testing.s | 9 +++--- c64/,,config_ultimate64.s | 9 +++--- c64/aliases/,aliases_config.s | 20 +++++++++++++ c64/kernal/chkinout_real.s | 53 ++++++++++++++++----------------- c64/kernal/rs232/chkin_rs232.s | 14 +++++++++ c64/kernal/rs232/chrin_rs232.s | 14 +++++++++ c64/kernal/rs232/chrout_rs232.s | 14 +++++++++ c64/kernal/rs232/ckout_rs232.s | 14 +++++++++ c64/kernal/rs232/close_rs232.s | 14 +++++++++ c64/kernal/rs232/getin_rs232.s | 14 +++++++++ c64/kernal/rs232/open_rs232.s | 14 +++++++++ 14 files changed, 165 insertions(+), 43 deletions(-) create mode 100644 c64/kernal/rs232/chkin_rs232.s create mode 100644 c64/kernal/rs232/chrin_rs232.s create mode 100644 c64/kernal/rs232/chrout_rs232.s create mode 100644 c64/kernal/rs232/ckout_rs232.s create mode 100644 c64/kernal/rs232/close_rs232.s create mode 100644 c64/kernal/rs232/getin_rs232.s create mode 100644 c64/kernal/rs232/open_rs232.s diff --git a/Makefile b/Makefile index 5e0b8662..30c6b004 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ c64/kernal/memory \ c64/kernal/print \ c64/kernal/rom_revision \ + c64/kernal/rs232 \ c64/kernal/screen \ c64/kernal/time diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index e5920bef..9fdebcbd 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -40,10 +40,11 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now -// #define CONFIG_RS232_USERPORT // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_UP2400 // please keep disabled for now +// #define CONFIG_RS232_UP9600 // please keep disabled for now // Multiple SID support diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 441f6b48..1f003c0b 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -42,10 +42,11 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now -// #define CONFIG_RS232_USERPORT // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_UP2400 // please keep disabled for now +// #define CONFIG_RS232_UP9600 // please keep disabled for now // Multiple SID support diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 50130b12..b8364118 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -41,10 +41,11 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now -// #define CONFIG_RS232_USERPORT // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_UP2400 // please keep disabled for now +// #define CONFIG_RS232_UP9600 // please keep disabled for now // Multiple SID support diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 5d9d4a07..a1209988 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -40,10 +40,11 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now -// #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now -// #define CONFIG_RS232_USERPORT // please keep disabled for now +#define CONFIG_IEC // please keep enabled for now +// #define CONFIG_TAPE_NORMAL // please keep disabled for now +// #define CONFIG_TAPE_TURBO // please keep disabled for now +// #define CONFIG_RS232_UP2400 // please keep disabled for now +// #define CONFIG_RS232_UP9600 // please keep disabled for now // Multiple SID support diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index b6868d3a..3a231e52 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -107,6 +107,20 @@ } +// Check that I/O configuration is correct +{ + .var selected_rs232 = 0; + +#if CONFIG_RS232_UP2400 + .eval selected_rs232++ +#endif +#if CONFIG_RS232_UP9600 + .eval selected_rs232++ +#endif + + .if (selected_rs232 > 1) .error "Please select at most one CONFIG_RS232_* option" +} + // Check that startup banner configuration is correct { @@ -207,6 +221,12 @@ #endif +// Handle I/O configuration + +#if CONFIG_RS232_UP2400 || CONFIG_RS232_UP9600 +#define HAS_RS232 +#endif + // Handle configuration of various features diff --git a/c64/kernal/chkinout_real.s b/c64/kernal/chkinout_real.s index 427d1c63..69b4be9d 100644 --- a/c64/kernal/chkinout_real.s +++ b/c64/kernal/chkinout_real.s @@ -5,7 +5,7 @@ // - [RG64] C64 Programmer's Reference Guide - page 275 (CHKIN) / 276 (CKOUT) // - [CM64] Compute's Mapping the Commodore 64 - page 229 // -// CPU registers that has to be preserved (see [RG64]): .Y, possibly .A (XXX - see [CM64], page 213) +// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) // @@ -13,7 +13,8 @@ chkin_real: - // Store Y for preservation + // Store registers for preservation + pha phy_trash_a // Reset status @@ -37,7 +38,7 @@ chkin_real: lda LAT, Y cmp #$01 - beq chkinout_file_not_input + beq chkin_file_not_input #if CONFIG_IEC @@ -58,47 +59,41 @@ chkin_real: chkin_set_device: lda FAT,Y sta DFLTN - clc // for success + // FALLTROUGH // Common part for booth CHKIN and CKOUT -// XXX add CPU-dependent optimizations here chkinout_end: - tax + ply_trash_a pla - tay - txa + clc // indicate success rts +chkin_file_not_input: // XXX move this out of common section + ply_trash_a + pla + jmp kernalerror_FILE_NOT_INPUT + chkinout_file_not_open: + ply_trash_a pla - tay jmp kernalerror_FILE_NOT_OPEN chkinout_device_not_present: + ply_trash_a pla - tay jsr kernalstatus_DEVICE_NOT_FOUND jmp kernalerror_DEVICE_NOT_FOUND -chkinout_file_not_input: - pla - tay - jmp kernalerror_FILE_NOT_INPUT - -chkinout_file_not_output: - pla - tay - jmp kernalerror_FILE_NOT_OUTPUT // CKOUT implementation ckout_real: - // Store Y for preservation - tya + // Store registers for preservation pha + phy_trash_a // Reset status jsr kernalstatus_reset @@ -118,19 +113,19 @@ ckout_real: beq chkinout_device_not_present // RS-232 not implemented cmp #$00 - beq chkinout_file_not_output // cannot output to keyboard - XXX check real ROM behaviour + beq ckout_file_not_output // cannot output to keyboard - XXX check real ROM behaviour // Fail if the file is open for reading (secondary address 0) lda LAT, Y - beq chkinout_file_not_output + beq ckout_file_not_output #if CONFIG_IEC // For IEC devices, send LISTEN + SECOND first lda FAT,Y jsr iec_check_devnum_oc - bcs chkout_set_device + bcs ckout_set_device jsr LISTEN bcs chkinout_device_not_present // don't set DFLTO in case of failure @@ -141,9 +136,13 @@ ckout_real: #endif // CONFIG_IEC -chkout_set_device: +ckout_set_device: lda FAT,Y sta DFLTO - clc // for success - jmp chkinout_end + +ckout_file_not_output: + ply_trash_a + pla + jmp kernalerror_FILE_NOT_OUTPUT + diff --git a/c64/kernal/rs232/chkin_rs232.s b/c64/kernal/rs232/chkin_rs232.s new file mode 100644 index 00000000..6cc6d002 --- /dev/null +++ b/c64/kernal/rs232/chkin_rs232.s @@ -0,0 +1,14 @@ + +// +// RS-232 part of the CHKIN routine +// + + +#if HAS_RS232 + + +chkin_rs232: + STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + +#endif // HAS_RS232 diff --git a/c64/kernal/rs232/chrin_rs232.s b/c64/kernal/rs232/chrin_rs232.s new file mode 100644 index 00000000..7c39d342 --- /dev/null +++ b/c64/kernal/rs232/chrin_rs232.s @@ -0,0 +1,14 @@ + +// +// RS-232 part of the CHKRIN routine +// + + +#if HAS_RS232 + + +chrin_rs232: + STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + +#endif // HAS_RS232 diff --git a/c64/kernal/rs232/chrout_rs232.s b/c64/kernal/rs232/chrout_rs232.s new file mode 100644 index 00000000..9c3af02f --- /dev/null +++ b/c64/kernal/rs232/chrout_rs232.s @@ -0,0 +1,14 @@ + +// +// RS-232 part of the CHROUT routine +// + + +#if HAS_RS232 + + +chrout_rs232: + STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + +#endif // HAS_RS232 diff --git a/c64/kernal/rs232/ckout_rs232.s b/c64/kernal/rs232/ckout_rs232.s new file mode 100644 index 00000000..66d4b3e7 --- /dev/null +++ b/c64/kernal/rs232/ckout_rs232.s @@ -0,0 +1,14 @@ + +// +// RS-232 part of the CKOUT routine +// + + +#if HAS_RS232 + + +ckout_rs232: + STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + +#endif // HAS_RS232 diff --git a/c64/kernal/rs232/close_rs232.s b/c64/kernal/rs232/close_rs232.s new file mode 100644 index 00000000..3871fe04 --- /dev/null +++ b/c64/kernal/rs232/close_rs232.s @@ -0,0 +1,14 @@ + +// +// RS-232 part of the CLOSE routine +// + + +#if HAS_RS232 + + +close_rs232: + STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + +#endif // HAS_RS232 diff --git a/c64/kernal/rs232/getin_rs232.s b/c64/kernal/rs232/getin_rs232.s new file mode 100644 index 00000000..17215ead --- /dev/null +++ b/c64/kernal/rs232/getin_rs232.s @@ -0,0 +1,14 @@ + +// +// RS-232 part of the GETIN routine +// + + +#if HAS_RS232 + + +getin_rs232: + STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + +#endif // HAS_RS232 diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s new file mode 100644 index 00000000..c347ec70 --- /dev/null +++ b/c64/kernal/rs232/open_rs232.s @@ -0,0 +1,14 @@ + +// +// RS-232 part of the OPEN routine +// + + +#if HAS_RS232 + + +open_rs232: + STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + +#endif // HAS_RS232 From f5a19bb1ab27d86393120d4bf31e09377de82075 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 18:06:27 +0100 Subject: [PATCH 011/105] reworked CHRIN --- c64/kernal/f157.chrin.jmp.s | 6 --- c64/kernal/iec/chrin_iec.s | 10 ++++ c64/kernal/iostack/f157.chrin.s | 48 +++++++++++++++++++ c64/kernal/{ => iostack}/f157.interop | 0 .../chrin_keyboard.s} | 43 +---------------- c64/kernal/rs232/chkin_rs232.s | 2 + c64/kernal/rs232/chrout_rs232.s | 2 + c64/kernal/rs232/ckout_rs232.s | 2 + c64/kernal/rs232/close_rs232.s | 2 + c64/kernal/rs232/getin_rs232.s | 2 + c64/kernal/rs232/open_rs232.s | 2 + 11 files changed, 71 insertions(+), 48 deletions(-) delete mode 100644 c64/kernal/f157.chrin.jmp.s create mode 100644 c64/kernal/iec/chrin_iec.s create mode 100644 c64/kernal/iostack/f157.chrin.s rename c64/kernal/{ => iostack}/f157.interop (100%) rename c64/kernal/{chrin_real.s => keyboard/chrin_keyboard.s} (71%) diff --git a/c64/kernal/f157.chrin.jmp.s b/c64/kernal/f157.chrin.jmp.s deleted file mode 100644 index b1b7c234..00000000 --- a/c64/kernal/f157.chrin.jmp.s +++ /dev/null @@ -1,6 +0,0 @@ - -// Our implementation is longer than the original one, -// placing it here would cause a collision with CHROUT - -CHRIN: - jmp chrin_real diff --git a/c64/kernal/iec/chrin_iec.s b/c64/kernal/iec/chrin_iec.s new file mode 100644 index 00000000..f293fa0c --- /dev/null +++ b/c64/kernal/iec/chrin_iec.s @@ -0,0 +1,10 @@ + +// +// IEC part of the CHRIN routine +// + + +chrin_iec: + + // XXX is this really all? + jmp JACPTR // carry will be set accordingly diff --git a/c64/kernal/iostack/f157.chrin.s b/c64/kernal/iostack/f157.chrin.s new file mode 100644 index 00000000..6ab21bfa --- /dev/null +++ b/c64/kernal/iostack/f157.chrin.s @@ -0,0 +1,48 @@ + +// +// Official Kernal routine, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 277/278 +// - [CM64] Compute's Mapping the Commodore 64 - page 228 +// +// CPU registers that has to be preserved (see [RG64]): .Y +// + +// XXX keyboard part currently does not preserve register Y, to be fixed! + +// Reads a byte of input, unless from keyboard. +// If from keyboard, then it gets a whole line of input, and returns the first char. +// Repeated calls after that read out the successive bytes of the line of input. + + +CHRIN: + + // Determine the device number + lda DFLTN + + // Try $00 - keyboard + beq_far chrin_keyboard + + // XXX Try $03 - screen + // cmp #$03 + // beq_far chrin_screen + +#if HAS_RS232 + + // Try $02 - RS-232 + cmp #$02 + beq_far chrin_rs232 + +#endif // HAS_RS232 + +#if CONFIG_IEC + + // Try IEC devices + jsr iec_check_devnum_oc + bcc_far chrin_iec + +#endif // CONFIG_IEC + + // Not a supported device + + jmp lvs_device_not_found_error diff --git a/c64/kernal/f157.interop b/c64/kernal/iostack/f157.interop similarity index 100% rename from c64/kernal/f157.interop rename to c64/kernal/iostack/f157.interop diff --git a/c64/kernal/chrin_real.s b/c64/kernal/keyboard/chrin_keyboard.s similarity index 71% rename from c64/kernal/chrin_real.s rename to c64/kernal/keyboard/chrin_keyboard.s index f744920c..b91245a7 100644 --- a/c64/kernal/chrin_real.s +++ b/c64/kernal/keyboard/chrin_keyboard.s @@ -1,49 +1,8 @@ // -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmer's Reference Guide - page 277/278 -// - [CM64] Compute's Mapping the Commodore 64 - page 228 -// -// CPU registers that has to be preserved (see [RG64]): .Y +// Keyboard part of the CHRIN routine // -// XXX keyboard part currently does not preserve register Y, to be fixed! -// XXX try to make chrin_real unnecessary (try to fit this into original location) - -// Reads a byte of input, unless from keyboard. -// If from keyboard, then it gets a whole line of input, and returns the first char. -// Repeated calls after that read out the successive bytes of the line of input. - -chrin_real: - - // Determine the device number - lda DFLTN - - beq chrin_keyboard // #$00 - keyboard - // XXX add screen support - -#if CONFIG_IEC - - jsr iec_check_devnum_oc - bcc chrin_iec - jmp lvs_device_not_found_error // not a supported device - -chrin_iec: - - jsr JACPTR - bcs chrin_done_fail - // FALLTROUGH - -#endif // CONFIG_IEC - -chrin_done: - clc // indicate success - rts - -chrin_done_fail: - sec // indicate failure - rts chrin_keyboard: diff --git a/c64/kernal/rs232/chkin_rs232.s b/c64/kernal/rs232/chkin_rs232.s index 6cc6d002..b2cc4086 100644 --- a/c64/kernal/rs232/chkin_rs232.s +++ b/c64/kernal/rs232/chkin_rs232.s @@ -3,6 +3,8 @@ // RS-232 part of the CHKIN routine // +// XXX connect to I/O stack + #if HAS_RS232 diff --git a/c64/kernal/rs232/chrout_rs232.s b/c64/kernal/rs232/chrout_rs232.s index 9c3af02f..4617bc1a 100644 --- a/c64/kernal/rs232/chrout_rs232.s +++ b/c64/kernal/rs232/chrout_rs232.s @@ -3,6 +3,8 @@ // RS-232 part of the CHROUT routine // +// XXX connect to I/O stack + #if HAS_RS232 diff --git a/c64/kernal/rs232/ckout_rs232.s b/c64/kernal/rs232/ckout_rs232.s index 66d4b3e7..cefe35a7 100644 --- a/c64/kernal/rs232/ckout_rs232.s +++ b/c64/kernal/rs232/ckout_rs232.s @@ -3,6 +3,8 @@ // RS-232 part of the CKOUT routine // +// XXX connect to I/O stack + #if HAS_RS232 diff --git a/c64/kernal/rs232/close_rs232.s b/c64/kernal/rs232/close_rs232.s index 3871fe04..95e5959e 100644 --- a/c64/kernal/rs232/close_rs232.s +++ b/c64/kernal/rs232/close_rs232.s @@ -3,6 +3,8 @@ // RS-232 part of the CLOSE routine // +// XXX connect to I/O stack + #if HAS_RS232 diff --git a/c64/kernal/rs232/getin_rs232.s b/c64/kernal/rs232/getin_rs232.s index 17215ead..fd062e3a 100644 --- a/c64/kernal/rs232/getin_rs232.s +++ b/c64/kernal/rs232/getin_rs232.s @@ -3,6 +3,8 @@ // RS-232 part of the GETIN routine // +// XXX connect to I/O stack + #if HAS_RS232 diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s index c347ec70..b864cdc0 100644 --- a/c64/kernal/rs232/open_rs232.s +++ b/c64/kernal/rs232/open_rs232.s @@ -3,6 +3,8 @@ // RS-232 part of the OPEN routine // +// XXX connect to I/O stack + #if HAS_RS232 From e00bda35486e34d8a8682f821315977661c314c1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 20:32:24 +0100 Subject: [PATCH 012/105] work towards CCGMS compatibility --- STATUS.md | 2 ++ c64/basic/ad9e.frmevl.s | 5 +++++ c64/basic/ad9e.interop | 3 +++ c64/kernal/assets/{colour_codes.s => e8da.colour_codes.s} | 0 c64/kernal/assets/e8da.interop | 6 ++++++ 5 files changed, 16 insertions(+) create mode 100644 c64/basic/ad9e.frmevl.s create mode 100644 c64/basic/ad9e.interop rename c64/kernal/assets/{colour_codes.s => e8da.colour_codes.s} (100%) create mode 100644 c64/kernal/assets/e8da.interop diff --git a/STATUS.md b/STATUS.md index c1790516..448fefa5 100644 --- a/STATUS.md +++ b/STATUS.md @@ -85,6 +85,7 @@ Not all of them - only these we want to have implemented. | `$A68E` | RUNC | DONE | | | `$A7AE` | NEWSTT | PARTIAL | redirected to RUN command | | `$AB1E` | STROUT | DONE | | +| `$AD9E` | FRMEVL | NOT DONE | | | `$BDCD` | LINPRT | DONE | temporary implementation | | `$E3BF` | INIT | NOT DONE | | | `$E422` | INITMSG | DONE | | @@ -167,6 +168,7 @@ Not all of them - only these we want to have implemented. | `$E6B6` | advance cursor | NOT DONE | | | `$E701` | previous line | NOT DONE | | | `$E716` | screen CHROUT | NOT DONE | | +| `$E8DA` | color code table | DONE | | | `$E8EA` | scroll line | NOT DONE | | | `$E96C` | insert line on top | NOT DONE | | | `$E9FF` | clear line | NOT DONE | | diff --git a/c64/basic/ad9e.frmevl.s b/c64/basic/ad9e.frmevl.s new file mode 100644 index 00000000..2b41983e --- /dev/null +++ b/c64/basic/ad9e.frmevl.s @@ -0,0 +1,5 @@ + +// XXX provide documentation and implementation + +FRMEVL: + STUB_IMPLEMENTATION() diff --git a/c64/basic/ad9e.interop b/c64/basic/ad9e.interop new file mode 100644 index 00000000..96b13dfd --- /dev/null +++ b/c64/basic/ad9e.interop @@ -0,0 +1,3 @@ + +This routine is desribed in Mapping the C64, page 102, and used at least by CCGMS terminal software - see here: +- https://raw.githubusercontent.com/spathiwa/ccgmsterm/master/original/5a.gs diff --git a/c64/kernal/assets/colour_codes.s b/c64/kernal/assets/e8da.colour_codes.s similarity index 100% rename from c64/kernal/assets/colour_codes.s rename to c64/kernal/assets/e8da.colour_codes.s diff --git a/c64/kernal/assets/e8da.interop b/c64/kernal/assets/e8da.interop new file mode 100644 index 00000000..2aa8069b --- /dev/null +++ b/c64/kernal/assets/e8da.interop @@ -0,0 +1,6 @@ + +A color code table, see here: +- https://csdb.dk/forums/index.php?roomid=7&topicid=487 + +CCGMS termina program expects it to be under original location, see here: +- https://raw.githubusercontent.com/spathiwa/ccgmsterm/master/original/5a.gs From 7eca8ea05bacb8f93b2e3ecc5a92b8f139a8c99e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 21:24:25 +0100 Subject: [PATCH 013/105] CHKIN and CKOUT refactoring --- c64/kernal/chkinout_real.s | 148 -------------------------- c64/kernal/f20e.chkin.jmp.s | 6 -- c64/kernal/f250.ckout.jmp.s | 6 -- c64/kernal/iec/chkin_iec.s | 30 ++++++ c64/kernal/iec/ckout_iec.s | 30 ++++++ c64/kernal/iostack/chkinout.s | 18 ++++ c64/kernal/iostack/f20e.chkin.s | 69 ++++++++++++ c64/kernal/{ => iostack}/f20e.interop | 0 c64/kernal/iostack/f250.ckout.s | 76 +++++++++++++ c64/kernal/{ => iostack}/f250.interop | 0 c64/kernal/rs232/chkin_rs232.s | 2 - c64/kernal/rs232/ckout_rs232.s | 2 - 12 files changed, 223 insertions(+), 164 deletions(-) delete mode 100644 c64/kernal/chkinout_real.s delete mode 100644 c64/kernal/f20e.chkin.jmp.s delete mode 100644 c64/kernal/f250.ckout.jmp.s create mode 100644 c64/kernal/iec/chkin_iec.s create mode 100644 c64/kernal/iec/ckout_iec.s create mode 100644 c64/kernal/iostack/chkinout.s create mode 100644 c64/kernal/iostack/f20e.chkin.s rename c64/kernal/{ => iostack}/f20e.interop (100%) create mode 100644 c64/kernal/iostack/f250.ckout.s rename c64/kernal/{ => iostack}/f250.interop (100%) diff --git a/c64/kernal/chkinout_real.s b/c64/kernal/chkinout_real.s deleted file mode 100644 index 69b4be9d..00000000 --- a/c64/kernal/chkinout_real.s +++ /dev/null @@ -1,148 +0,0 @@ - -// -// Official Kernal routines, described in: -// -// - [RG64] C64 Programmer's Reference Guide - page 275 (CHKIN) / 276 (CKOUT) -// - [CM64] Compute's Mapping the Commodore 64 - page 229 -// -// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) -// - - -// CHKIN implementation - -chkin_real: - - // Store registers for preservation - pha - phy_trash_a - - // Reset status - jsr kernalstatus_reset - - // First retrieve the FAT/LAT/SAT table index (and check if file is open) - - txa - jsr find_fls - bcs chkinout_file_not_open - - // Now we have table index in Y - first filter out unsuitable devices - - lda FAT,Y - cmp #$01 - beq chkinout_device_not_present // tape not implemented - cmp #$02 - beq chkinout_device_not_present // RS-232 not implemented - - // Fail if the file is open for writing (secondary address 1) - - lda LAT, Y - cmp #$01 - beq chkin_file_not_input - -#if CONFIG_IEC - - // For IEC devices, send TALK + TKSA first - lda FAT,Y - jsr iec_check_devnum_oc - bcs chkin_set_device - - jsr TALK - bcs chkinout_device_not_present // don't set DFLTN in case of failure - - lda LAT, Y - jsr TKSA - bcs chkinout_device_not_present - -#endif // CONFIG_IEC - -chkin_set_device: - lda FAT,Y - sta DFLTN - - // FALLTROUGH - -// Common part for booth CHKIN and CKOUT - -chkinout_end: - ply_trash_a - pla - clc // indicate success - rts - -chkin_file_not_input: // XXX move this out of common section - ply_trash_a - pla - jmp kernalerror_FILE_NOT_INPUT - -chkinout_file_not_open: - ply_trash_a - pla - jmp kernalerror_FILE_NOT_OPEN - -chkinout_device_not_present: - ply_trash_a - pla - jsr kernalstatus_DEVICE_NOT_FOUND - jmp kernalerror_DEVICE_NOT_FOUND - - -// CKOUT implementation - -ckout_real: - - // Store registers for preservation - pha - phy_trash_a - - // Reset status - jsr kernalstatus_reset - - // First retrieve the FAT/LAT/SAT table index (and check if file is open) - - txa - jsr find_fls - bcs chkinout_file_not_open - - // Now we have table index in Y - first filter out unsuitable devices - - lda FAT,Y - cmp #$01 - beq chkinout_device_not_present // tape not implemented - cmp #$02 - beq chkinout_device_not_present // RS-232 not implemented - - cmp #$00 - beq ckout_file_not_output // cannot output to keyboard - XXX check real ROM behaviour - - // Fail if the file is open for reading (secondary address 0) - - lda LAT, Y - beq ckout_file_not_output - -#if CONFIG_IEC - - // For IEC devices, send LISTEN + SECOND first - lda FAT,Y - jsr iec_check_devnum_oc - bcs ckout_set_device - - jsr LISTEN - bcs chkinout_device_not_present // don't set DFLTO in case of failure - - lda LAT, Y - jsr SECOND - bcs chkinout_device_not_present - -#endif // CONFIG_IEC - -ckout_set_device: - lda FAT,Y - sta DFLTO - jmp chkinout_end - -ckout_file_not_output: - ply_trash_a - pla - jmp kernalerror_FILE_NOT_OUTPUT - diff --git a/c64/kernal/f20e.chkin.jmp.s b/c64/kernal/f20e.chkin.jmp.s deleted file mode 100644 index ba38979d..00000000 --- a/c64/kernal/f20e.chkin.jmp.s +++ /dev/null @@ -1,6 +0,0 @@ - -// In our implementation CHKIN and CKOUT are closely tied, -// placing it here would cause a collision - -CHKIN: - jmp chkin_real diff --git a/c64/kernal/f250.ckout.jmp.s b/c64/kernal/f250.ckout.jmp.s deleted file mode 100644 index 18cfbffc..00000000 --- a/c64/kernal/f250.ckout.jmp.s +++ /dev/null @@ -1,6 +0,0 @@ - -// In our implementation CHKIN and CKOUT are closely tied, -// placing it here would cause a collision - -CKOUT: - jmp ckout_real diff --git a/c64/kernal/iec/chkin_iec.s b/c64/kernal/iec/chkin_iec.s new file mode 100644 index 00000000..584e40f6 --- /dev/null +++ b/c64/kernal/iec/chkin_iec.s @@ -0,0 +1,30 @@ + +// +// IEC part of the CHKIN routine +// + + +#if CONFIG_IEC + + +chkin_iec: + + // Fail if the file is open for writing (secondary address 1) + + lda LAT, Y + cmp #$01 + beq_far chkin_file_not_input + + // Send TALK + TKSA first + lda FAT,Y + + jsr TALK + bcs_far chkinout_device_not_present + + lda LAT, Y + jsr TKSA + bcs_far chkinout_device_not_present + + jmp chkin_set_device + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/ckout_iec.s b/c64/kernal/iec/ckout_iec.s new file mode 100644 index 00000000..4a504f9c --- /dev/null +++ b/c64/kernal/iec/ckout_iec.s @@ -0,0 +1,30 @@ + +// +// IEC part of the CKOUT routine +// + + +#if CONFIG_IEC + + +ckout_iec: + + // Fail if the file is open for reading (secondary address 0) + + lda LAT, Y + beq_far ckout_file_not_output + + // Send LISTEN + SECOND first + lda FAT,Y + + jsr LISTEN + bcs_far chkinout_device_not_present + + lda LAT, Y + jsr SECOND + bcs_far chkinout_device_not_present + + jmp ckout_set_device + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iostack/chkinout.s b/c64/kernal/iostack/chkinout.s new file mode 100644 index 00000000..c8d3bda8 --- /dev/null +++ b/c64/kernal/iostack/chkinout.s @@ -0,0 +1,18 @@ + +// +// Common part of CHKIN and CKOUT +// + + +chkinout_device_not_present: + + ply_trash_a + pla + jsr kernalstatus_DEVICE_NOT_FOUND + jmp kernalerror_DEVICE_NOT_FOUND + +chkinout_file_not_open: + + ply_trash_a + pla + jmp kernalerror_FILE_NOT_OPEN diff --git a/c64/kernal/iostack/f20e.chkin.s b/c64/kernal/iostack/f20e.chkin.s new file mode 100644 index 00000000..bd86226c --- /dev/null +++ b/c64/kernal/iostack/f20e.chkin.s @@ -0,0 +1,69 @@ + +// +// Official Kernal routines, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 275 +// - [CM64] Compute's Mapping the Commodore 64 - page 229 +// +// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) +// + + +CHKIN: + + // Store registers for preservation + pha + phy_trash_a + + // Reset status + jsr kernalstatus_reset + + // First retrieve the FAT/LAT/SAT table index (and check if file is open) + + txa + jsr find_fls + bcs_far chkinout_file_not_open + + // Now we have table index in Y + + lda FAT,Y + + // Handle all the devices + + beq chkin_set_device // 0 - keyboard + + // Tape not supported here + +#if HAS_RS232 + + cmp #$02 + beq_far chkin_rs232 + +#endif // HAS_RS232 + +#if CONFIG_IEC + + jsr iec_check_devnum_oc + bcc_far chkin_iec + +#endif // CONFIG_IEC + + cmp #$03 // screen - only legal one left + bne_far chkinout_device_not_present + +chkin_set_device: + lda FAT,Y + sta DFLTN + + // FALLTROUGH + +chkinout_end: + ply_trash_a + pla + clc // indicate success + rts + +chkin_file_not_input: + ply_trash_a + pla + jmp kernalerror_FILE_NOT_INPUT diff --git a/c64/kernal/f20e.interop b/c64/kernal/iostack/f20e.interop similarity index 100% rename from c64/kernal/f20e.interop rename to c64/kernal/iostack/f20e.interop diff --git a/c64/kernal/iostack/f250.ckout.s b/c64/kernal/iostack/f250.ckout.s new file mode 100644 index 00000000..49a4d6a7 --- /dev/null +++ b/c64/kernal/iostack/f250.ckout.s @@ -0,0 +1,76 @@ + +// +// Official Kernal routines, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 276 +// - [CM64] Compute's Mapping the Commodore 64 - page 229 +// +// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213) +// + + +CKOUT: + + // Store registers for preservation + pha + phy_trash_a + + // Reset status + jsr kernalstatus_reset + + // First retrieve the FAT/LAT/SAT table index (and check if file is open) + + txa + jsr find_fls + bcs_far chkinout_file_not_open + + // Now we have table index in Y + + lda FAT,Y + + // Handle all the devices + + beq ckout_file_not_output // 0 - keyboard + + // Tape not supported here + +#if HAS_RS232 + + cmp #$02 + beq_far ckout_rs232 + +#endif // HAS_RS232 + +#if CONFIG_IEC + + jsr iec_check_devnum_oc + bcc_far ckout_iec + +#endif // CONFIG_IEC + + cmp #$03 // screen - only legal one left + bne_far chkinout_device_not_present + +ckout_set_device: + lda FAT,Y + sta DFLTO + jmp chkinout_end + +ckout_file_not_output: + ply_trash_a + pla + jmp kernalerror_FILE_NOT_OUTPUT + + + + + + + + + + + + + + diff --git a/c64/kernal/f250.interop b/c64/kernal/iostack/f250.interop similarity index 100% rename from c64/kernal/f250.interop rename to c64/kernal/iostack/f250.interop diff --git a/c64/kernal/rs232/chkin_rs232.s b/c64/kernal/rs232/chkin_rs232.s index b2cc4086..6cc6d002 100644 --- a/c64/kernal/rs232/chkin_rs232.s +++ b/c64/kernal/rs232/chkin_rs232.s @@ -3,8 +3,6 @@ // RS-232 part of the CHKIN routine // -// XXX connect to I/O stack - #if HAS_RS232 diff --git a/c64/kernal/rs232/ckout_rs232.s b/c64/kernal/rs232/ckout_rs232.s index cefe35a7..66d4b3e7 100644 --- a/c64/kernal/rs232/ckout_rs232.s +++ b/c64/kernal/rs232/ckout_rs232.s @@ -3,8 +3,6 @@ // RS-232 part of the CKOUT routine // -// XXX connect to I/O stack - #if HAS_RS232 From 73f1e24e3c1d38db44d23ceab45b62de33df2428 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 22:15:44 +0100 Subject: [PATCH 014/105] LOAD/SAVE preparation routines should be OK now --- STATUS.md | 8 ++--- .../{f49e.load_int.s => f49e.load_prep.s} | 13 ++++++++- c64/kernal/iostack/f5dd.save_int.s | 12 -------- c64/kernal/iostack/f5dd.save_prep.s | 29 +++++++++++++++++++ c64/kernal/jumptable/ffd5.jload.s | 2 +- c64/kernal/jumptable/ffd8.jsave.s | 2 +- 6 files changed, 47 insertions(+), 19 deletions(-) rename c64/kernal/iostack/{f49e.load_int.s => f49e.load_prep.s} (58%) delete mode 100644 c64/kernal/iostack/f5dd.save_int.s create mode 100644 c64/kernal/iostack/f5dd.save_prep.s diff --git a/STATUS.md b/STATUS.md index 448fefa5..d754ca4f 100644 --- a/STATUS.md +++ b/STATUS.md @@ -128,13 +128,13 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFC0` | `$F34A` | `OPEN` | DONE | | | `$FFC3` | `$F291` | `CLOSE` | DONE | | | `$FFC6` | `$F20E` | `CHKIN` | DONE | | -| `$FFC9` | `$F250` | `CKOUT` | PARTIAL | | +| `$FFC9` | `$F250` | `CKOUT` | DONE | | | `$FFCC` | `$F333` | `CLRCHN` | DONE | | | `$FFCF` | `$F157` | `CHRIN` | PARTIAL | | | `$FFD2` | `$F1CA` | `CHROUT` | PARTIAL | | -| `$FFD5` | `$F49E` | `LOAD` | PARTIAL | not yet clear what's this entry doing | -| `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support, no STOP key, check $F49E addr | -| `$FFD8` | `$F5DD` | `SAVE` | NOT DONE | | +| `$FFD5` | `$F49E` | `LOAD` | DONE | | +| `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support, no STOP key support | +| `$FFD8` | `$F5DD` | `SAVE` | DONE | only this preparation routine part is done | | `($0332)` | `$F5ED` | `SAVE` | NOT DONE | | | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | diff --git a/c64/kernal/iostack/f49e.load_int.s b/c64/kernal/iostack/f49e.load_prep.s similarity index 58% rename from c64/kernal/iostack/f49e.load_int.s rename to c64/kernal/iostack/f49e.load_prep.s index ca8fca9c..cc045026 100644 --- a/c64/kernal/iostack/f49e.load_int.s +++ b/c64/kernal/iostack/f49e.load_prep.s @@ -1,11 +1,22 @@ +// +// LOAD preparation routine +// + +// +// Input (according to http://sta.c64.org/cbm64krnfunc.html) +// .A - 0 for load, non-0 for verify +// .X and .Y - load address (if secondary address is 0) +// + // // Note: Although the vector at $330 points to $F4A5, the Kernal jump table points to $F49E // (see also Mapping the C64, page 76). By experimenting I have discovered that $F49E performs // indirect jump via ($0330) vector, after setting MEMUSS. // -LOAD_INT: + +LOAD_PREP: sty MEMUSS+1 stx MEMUSS+0 diff --git a/c64/kernal/iostack/f5dd.save_int.s b/c64/kernal/iostack/f5dd.save_int.s deleted file mode 100644 index 7ef54a41..00000000 --- a/c64/kernal/iostack/f5dd.save_int.s +++ /dev/null @@ -1,12 +0,0 @@ - -// -// XXX Note: something unusual was done with LOAD routine - although the vector at $330 points to $F4A5, -// the Kernal jump table points to $F49E (see also Mapping the C64, page 76). By experimenting -// I have already discovered that $F4A5 performs indirect jump via ($0330) vector, but it must -// be doing a little bit more - not sure yet, what. Something similar is done with SAVE. -// -// This has to be clarified. -// - -SAVE_INT: - jmp (ISAVE) diff --git a/c64/kernal/iostack/f5dd.save_prep.s b/c64/kernal/iostack/f5dd.save_prep.s new file mode 100644 index 00000000..d7cf3f86 --- /dev/null +++ b/c64/kernal/iostack/f5dd.save_prep.s @@ -0,0 +1,29 @@ + +// +// SAVE preparation routine +// + +// +// Input (according to http://sta.c64.org/cbm64krnfunc.html) +// .A - address of zero page register holding start address of memory area to save +// .X and .Y - end address of memory area plus 1 +// + +// +// Note: Experimenting can easily confirm that SAVE preparation routine does similar +// actions as LOAD preparation routine. +// + +SAVE_PREP: + + sty EAL+1 + stx EAL+0 + + tax + + lda $01, x + sta STAL+1 + lda $00, x + sta STAL+0 + + jmp (ISAVE) diff --git a/c64/kernal/jumptable/ffd5.jload.s b/c64/kernal/jumptable/ffd5.jload.s index ef66f320..002e01fd 100644 --- a/c64/kernal/jumptable/ffd5.jload.s +++ b/c64/kernal/jumptable/ffd5.jload.s @@ -1,4 +1,4 @@ // load RAM from a device // C64 Programmer's Reference Guide Page 272 - jmp LOAD_INT + jmp LOAD_PREP diff --git a/c64/kernal/jumptable/ffd8.jsave.s b/c64/kernal/jumptable/ffd8.jsave.s index 1213f478..25f3fbec 100644 --- a/c64/kernal/jumptable/ffd8.jsave.s +++ b/c64/kernal/jumptable/ffd8.jsave.s @@ -1,4 +1,4 @@ // SAVE RAM to device // C64 Programmer's Reference Guide Page 273 - jmp SAVE_INT + jmp SAVE_PREP From c3383b9e8fadee15fcbeae2c9b726ac5ee8fa12d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 29 Oct 2019 22:31:25 +0100 Subject: [PATCH 015/105] RS-232 OPEN/CLOSE connected to I/O stack --- c64/kernal/iec/open_iec.s | 6 ++++++ c64/kernal/iostack/f291.close.s | 17 +++++++++++------ c64/kernal/iostack/f34a.open.s | 17 ++++++++++++----- c64/kernal/rs232/close_rs232.s | 7 ++++--- c64/kernal/rs232/open_rs232.s | 7 ++++--- 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/c64/kernal/iec/open_iec.s b/c64/kernal/iec/open_iec.s index 33269eb9..f2269c0b 100644 --- a/c64/kernal/iec/open_iec.s +++ b/c64/kernal/iec/open_iec.s @@ -9,6 +9,10 @@ open_iec: + // Check for command to send + ldy FNLEN + beq open_iec_done + // We have a command to send to IEC device jsr LISTEN bcc !+ @@ -28,6 +32,8 @@ open_iec: // Send command ('file name') jsr lvs_send_file_name +open_iec_done: + jmp open_done_success diff --git a/c64/kernal/iostack/f291.close.s b/c64/kernal/iostack/f291.close.s index c2f3c4ae..c4930447 100644 --- a/c64/kernal/iostack/f291.close.s +++ b/c64/kernal/iostack/f291.close.s @@ -11,21 +11,26 @@ CLOSE: - // XXX this needs more testing (opening 10 files at once, closing in various orders, etc) once the code is more mature - // Find the LAT / SAT / FAT entry which LAT corresponds to A jsr find_fls bcs close_end // XXX can we report error in IOSTATUS here? -#if CONFIG_IEC + // We have the entry index in .Y - // We have the entry index in .Y - check whether this is IEC device lda FAT, y + + // Perform device-specific actions + +#if HAS_RS232 + cmp #$02 + beq_far close_rs232 +#endif + +#if CONFIG_IEC jsr iec_check_devnum_oc bcc_far close_iec - -#endif // CONFIG_IEC +#endif // FALLTROUGH diff --git a/c64/kernal/iostack/f34a.open.s b/c64/kernal/iostack/f34a.open.s index ddadebea..3dc0e134 100644 --- a/c64/kernal/iostack/f34a.open.s +++ b/c64/kernal/iostack/f34a.open.s @@ -54,15 +54,22 @@ open_has_space: iny sty LDTND - // Check for command to send - lda FNLEN - beq open_done_success - - // Check for IEC device lda FA + +#if HAS_RS232 + + cmp #$02 + beq_far open_rs232 + +#endif + +#if CONFIG_IEC + jsr iec_check_devnum_oc bcc_far open_iec +#endif + // FALLTROUGH open_done_success: diff --git a/c64/kernal/rs232/close_rs232.s b/c64/kernal/rs232/close_rs232.s index 95e5959e..a2d6457e 100644 --- a/c64/kernal/rs232/close_rs232.s +++ b/c64/kernal/rs232/close_rs232.s @@ -3,14 +3,15 @@ // RS-232 part of the CLOSE routine // -// XXX connect to I/O stack - #if HAS_RS232 close_rs232: - STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + // XXX provide implementation for both UP2400 and UP960 + + jmp close_remove_from_table #endif // HAS_RS232 diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s index b864cdc0..82d64230 100644 --- a/c64/kernal/rs232/open_rs232.s +++ b/c64/kernal/rs232/open_rs232.s @@ -3,14 +3,15 @@ // RS-232 part of the OPEN routine // -// XXX connect to I/O stack - #if HAS_RS232 open_rs232: - STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 + + // XXX provide implementation for both UP2400 and UP9600 + + jmp open_done_success #endif // HAS_RS232 From ec9886161320fccab363343d3e20a8026ff7af23 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 18:12:04 +0100 Subject: [PATCH 016/105] screen editor is now easier to extend --- CONFIG.md | 36 ++-- c64/,,config_generic.s | 18 +- c64/,,config_mega65.s | 18 +- c64/,,config_testing.s | 18 +- c64/,,config_ultimate64.s | 18 +- c64/aliases/,aliases_config.s | 4 + c64/aliases/,aliases_ram_lowmem.s | 12 +- c64/kernal/screen/chrout_screen_clr.s | 9 + c64/kernal/screen/chrout_screen_control.s | 160 ++++-------------- c64/kernal/screen/chrout_screen_crsr.s | 40 +++++ c64/kernal/screen/chrout_screen_del.s | 2 +- c64/kernal/screen/chrout_screen_gfxtxt.s | 19 +++ c64/kernal/screen/chrout_screen_home.s | 10 ++ c64/kernal/screen/chrout_screen_ins.s | 2 +- .../screen/chrout_screen_jumptable_codes.s | 55 ++++++ c64/kernal/screen/chrout_screen_rvs.s | 17 ++ c64/kernal/screen/chrout_screen_shift_onoff.s | 16 ++ 17 files changed, 280 insertions(+), 174 deletions(-) create mode 100644 c64/kernal/screen/chrout_screen_clr.s create mode 100644 c64/kernal/screen/chrout_screen_crsr.s create mode 100644 c64/kernal/screen/chrout_screen_gfxtxt.s create mode 100644 c64/kernal/screen/chrout_screen_home.s create mode 100644 c64/kernal/screen/chrout_screen_jumptable_codes.s create mode 100644 c64/kernal/screen/chrout_screen_rvs.s create mode 100644 c64/kernal/screen/chrout_screen_shift_onoff.s diff --git a/CONFIG.md b/CONFIG.md index aace455b..edb75812 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -169,23 +169,13 @@ Allows to assign command to any function key, `RUN` key and `HELP` key (if selec Needs 25 bytes more space in KERNAL segment for the code. In addition, each configured key takes 3 bytes + length of the command. -## Eye candy +## Screen editor -### `CONFIG_COLORS_BRAND` +### `CONFIG_EDIT_STOPQUOTE` -Tries to adjust the color scheme to the selected brand. Some brands might not support this. +If enabled, STOP key terminates insert/quote mode (like on BlackBox cartridge). -### `CONFIG_BANNER_SIMPLE`, `CONFIG_BANNER_FANCY`, `CONFIG_BANNER_BRAND` - -Select startup banner - either a simple one, or with some colorful elements. `CONFIG_BANNER_BRAND` heavily depends on the selected brand, not all the brands support it. - -Richer banners need more BASIC segment, varies between brands. - -### `CONFIG_BANNER_PAL_NTSC` - -If enabled, prints video system on startup banner. Eye candy only. - -Feature needs some bytes in BASIC (depending on banner type) and about 25 bytes in KERNAL segment. +Feature needs 10 bytes in KERNAL segment. If unsure - enable. ## Software features @@ -207,6 +197,24 @@ On the most widespread CPUs the D flag is not cleared upon entering interrupts. Feature needs 2 bytes in KERNAL segmment (for CPUs needing the patch), but at the same time allows optimizations allowing to gain some more bytes. If unsure - enable. +## Eye candy + +### `CONFIG_COLORS_BRAND` + +Tries to adjust the color scheme to the selected brand. Some brands might not support this. + +### `CONFIG_BANNER_SIMPLE`, `CONFIG_BANNER_FANCY`, `CONFIG_BANNER_BRAND` + +Select startup banner - either a simple one, or with some colorful elements. `CONFIG_BANNER_BRAND` heavily depends on the selected brand, not all the brands support it. + +Richer banners need more BASIC segment, varies between brands. + +### `CONFIG_BANNER_PAL_NTSC` + +If enabled, prints video system on startup banner. Eye candy only. + +Feature needs some bytes in BASIC (depending on banner type) and about 25 bytes in KERNAL segment. + ## Debug options Options in this section are for debug purposes only. If unsure - disable. diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 9fdebcbd..f6e34b61 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -41,6 +41,7 @@ // I/O devices #define CONFIG_IEC // please keep enabled for now +// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now // #define CONFIG_RS232_UP2400 // please keep disabled for now @@ -95,13 +96,9 @@ .const CONFIG_KEYCMD_F14 = @"" -// Eye candy +// Screen editor -#define CONFIG_COLORS_BRAND -// #define CONFIG_BANNER_SIMPLE -#define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND -#define CONFIG_SHOW_PAL_NTSC +#define CONFIG_EDIT_STOPQUOTE // Software features @@ -111,6 +108,15 @@ #define CONFIG_BCD_SAFE_INTERRUPTS +// Eye candy + +#define CONFIG_COLORS_BRAND +// #define CONFIG_BANNER_SIMPLE +#define CONFIG_BANNER_FANCY +// #define CONFIG_BANNER_BRAND +#define CONFIG_SHOW_PAL_NTSC + + // Debug options // #define CONFIG_DBG_STUBS_BRK diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 1f003c0b..6e9b9c84 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -43,6 +43,7 @@ // I/O devices #define CONFIG_IEC // please keep enabled for now +// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now // #define CONFIG_RS232_UP2400 // please keep disabled for now @@ -97,13 +98,9 @@ .const CONFIG_KEYCMD_F14 = @"" -// Eye candy +// Screen editor -#define CONFIG_COLORS_BRAND -// #define CONFIG_BANNER_SIMPLE -// #define CONFIG_BANNER_FANCY -#define CONFIG_BANNER_BRAND -// #define CONFIG_SHOW_PAL_NTSC +#define CONFIG_EDIT_STOPQUOTE // Software features @@ -113,6 +110,15 @@ #define CONFIG_BCD_SAFE_INTERRUPTS +// Eye candy + +#define CONFIG_COLORS_BRAND +// #define CONFIG_BANNER_SIMPLE +// #define CONFIG_BANNER_FANCY +#define CONFIG_BANNER_BRAND +// #define CONFIG_SHOW_PAL_NTSC + + // Debug options // #define CONFIG_DBG_STUBS_BRK diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index b8364118..01b3142b 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -42,6 +42,7 @@ // I/O devices #define CONFIG_IEC // please keep enabled for now +// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now // #define CONFIG_RS232_UP2400 // please keep disabled for now @@ -96,13 +97,9 @@ .const CONFIG_KEYCMD_F14 = @"" -// Eye candy +// Screen editor -// #define CONFIG_COLORS_BRAND -// #define CONFIG_BANNER_SIMPLE -#define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND -// #define CONFIG_SHOW_PAL_NTSC +#define CONFIG_EDIT_STOPQUOTE // Software features @@ -112,6 +109,15 @@ #define CONFIG_BCD_SAFE_INTERRUPTS +// Eye candy + +// #define CONFIG_COLORS_BRAND +// #define CONFIG_BANNER_SIMPLE +#define CONFIG_BANNER_FANCY +// #define CONFIG_BANNER_BRAND +// #define CONFIG_SHOW_PAL_NTSC + + // Debug options // #define CONFIG_DBG_STUBS_BRK diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index a1209988..3c829b77 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -41,6 +41,7 @@ // I/O devices #define CONFIG_IEC // please keep enabled for now +// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now // #define CONFIG_RS232_UP2400 // please keep disabled for now @@ -95,13 +96,9 @@ .const CONFIG_KEYCMD_F14 = @"" -// Eye candy +// Screen editor -#define CONFIG_COLORS_BRAND -// #define CONFIG_BANNER_SIMPLE -#define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND -#define CONFIG_SHOW_PAL_NTSC +#define CONFIG_EDIT_STOPQUOTE // Software features @@ -111,6 +108,15 @@ #define CONFIG_BCD_SAFE_INTERRUPTS +// Eye candy + +#define CONFIG_COLORS_BRAND +// #define CONFIG_BANNER_SIMPLE +#define CONFIG_BANNER_FANCY +// #define CONFIG_BANNER_BRAND +#define CONFIG_SHOW_PAL_NTSC + + // Debug options // #define CONFIG_DBG_STUBS_BRK diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index 3a231e52..23f5d173 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -109,6 +109,10 @@ // Check that I/O configuration is correct { +#if CONFIG_IEC_JIFFYDOS && !CONFIG_IEC + .error "CONFIG_IEC_JIFFYDOS requires CONFIG_IEC" +#endif + .var selected_rs232 = 0; #if CONFIG_RS232_UP2400 diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 905446dc..10852ad2 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -154,8 +154,8 @@ .label LDTBL = $D9 // $D9-$F2 screen line link table, [!] our usage is different XXX give more details .label USER = $F3 // $F3-$F4 pointer to current color RAM location .label KEYTAB = $F5 // $F5-$F6 pointer to keyboard lookup table - .label RIBUF = $F7 // $F7-$F8 -- NOT IMPLEMENTED -- - .label ROBUF = $F9 // $F9-$FA -- NOT IMPLEMENTED -- + .label RIBUF = $F7 // $F7-$F8 -- NOT IMPLEMENTED -- XXX WIP + .label ROBUF = $F9 // $F9-$FA -- NOT IMPLEMENTED -- XXX WIP // $FB $FB-$FE -- UNUSED -- free for user software .label BASZPT = $FF // -- NOT IMPLEMENTED -- @@ -202,10 +202,10 @@ .label BITNUM = $298 // -- NOT IMPLEMENTED -- .label BAUDOF = $299 // $299-$29A -- NOT IMPLEMENTED -- #endif - .label RIDBE = $29B // -- NOT IMPLEMENTED -- - .label RIDBS = $29C // -- NOT IMPLEMENTED -- - .label RODBS = $29D // -- NOT IMPLEMENTED -- - .label RODBE = $29E // -- NOT IMPLEMENTED -- + .label RIDBE = $29B // -- NOT IMPLEMENTED -- XXX WIP + .label RIDBS = $29C // -- NOT IMPLEMENTED -- XXX WIP + .label RODBS = $29D // -- NOT IMPLEMENTED -- XXX WIP + .label RODBE = $29E // -- NOT IMPLEMENTED -- XXX WIP .label IRQTMP = $29F // $29F-$2A0 -- NOT IMPLEMENTED -- .label ENABL = $2A1 // -- NOT IMPLEMENTED -- .label TODSNS = $2A2 // -- NOT IMPLEMENTED -- diff --git a/c64/kernal/screen/chrout_screen_clr.s b/c64/kernal/screen/chrout_screen_clr.s new file mode 100644 index 00000000..ab9469dd --- /dev/null +++ b/c64/kernal/screen/chrout_screen_clr.s @@ -0,0 +1,9 @@ + +// +// CLR key handling within CHROUT +// + +chrout_screen_CLR: + + jsr clear_screen + jmp chrout_screen_done diff --git a/c64/kernal/screen/chrout_screen_control.s b/c64/kernal/screen/chrout_screen_control.s index ff4f5706..61fa2f4e 100644 --- a/c64/kernal/screen/chrout_screen_control.s +++ b/c64/kernal/screen/chrout_screen_control.s @@ -15,7 +15,7 @@ chrout_screen_control: chrout_try_RETURN: - cmp #$0D + cmp #KEY_RETURN bne !+ // RETURN clears quote and insert modes, it also clears reverse flag @@ -27,156 +27,60 @@ chrout_try_RETURN: !: chrout_try_DEL: - cmp #$14 + cmp #KEY_DEL bne !+ - jmp chrout_screen_del + jmp chrout_screen_DEL !: +#if CONFIG_EDIT_STOPQUOTE +chrout_try_STOP: + + cmp #KEY_STOP + bne !+ + + lda #$00 + sta QTSW + sta INSRT + // Let it run, we are saving 3 bytes on JMP this way + // and the performance hit is not going to be visible nevertheless +!: +#endif chrout_try_quote: lda QTSW ora INSRT beq !+ + txa jmp chrout_screen_quote !: txa -chrout_try_CRSR_UP: +chrout_try_jumptable: - cmp #$91 + ldx #(__chrout_screen_jumptable_codes_end - chrout_screen_jumptable_codes - 1) +chrout_try_jumptable_loop: + cmp chrout_screen_jumptable_codes, x bne !+ - - lda PNTR - sec - sbc #40 - sta PNTR - jmp chrout_screen_calc_lptr_done + // Found, perform a jump to subroutine + lda chrout_screen_jumptable_hi, x + pha + lda chrout_screen_jumptable_lo, x + pha + rts !: -chrout_try_CRSR_DOWN: + dex + bpl chrout_try_jumptable_loop - cmp #$11 - bne !+ - - lda PNTR - clc - adc #40 - sta PNTR - // We need to advance the pointer manually, as normalising - // now will break things. The pointer update is required - // so that we can tell if we really are on the bottom phys - // screen line or not - jsr screen_scroll_up_if_on_last_line - jmp chrout_screen_calc_lptr_done -!: -chrout_try_CRSR_LEFT: - - cmp #$9D - bne !+ - - lda TBLX - ora PNTR - beq crsr_l1 // recalculating pointer is not really necessary, but this is a very rare case nevertheless - dec PNTR -crsr_l1: - jmp chrout_screen_calc_lptr_done -!: -chrout_try_CRSR_RIGHT: - - cmp #$1D - bne !+ - - inc PNTR - jmp chrout_screen_calc_lptr_done -!: -chrout_try_RVS_ON: - - cmp #$12 - bne !+ - - lda #$80 - bne rvs_l1 -!: -chrout_try_RVS_OFF: - - cmp #$92 - bne !+ - - lda #$00 -rvs_l1: - sta RVS - jmp chrout_screen_done -!: -chrout_try_MODE_GFX: - - cmp #$8E - bne !+ - - lda VIC_YMCSB - and #$02 // to upper case -mode_l1: - sta VIC_YMCSB - jmp chrout_screen_done -!: -chrout_try_MODE_TXT: - - cmp #$0E - bne !+ - - lda VIC_YMCSB - ora #$02 // to lower case - bne mode_l1 // branch always -!: chrout_try_COLOR: ldx #$0F -colour_check_loop: +chrout_try_color_loop: cmp colour_codes,x bne !+ stx COLOR jmp chrout_screen_done !: dex - bpl colour_check_loop - -chrout_try_SHIFT_ENABLE: - - cmp #$09 - bne !+ - - lda #$00 // enable SHIFT+VENDOR combination - sta MODE + bpl chrout_try_color_loop + // Unknown code, or key not requiring any handling jmp chrout_screen_done -!: -chrout_try_SHIFT_DISABLE: - - cmp #$08 - bne !+ - - lda #$80 // disable SHIFT+VENDOR combination - sta MODE - - jmp chrout_screen_done -!: -chrout_try_HOME: - - cmp #$13 - bne !+ - - jsr cursor_home - jmp chrout_screen_done -!: -chrout_try_CLR: - - cmp #$93 - bne !+ - - jsr clear_screen -clr_l1: - jmp chrout_screen_done -!: -chrout_try_INS: - - cmp #$94 - bne clr_l1 // unknown code or key does not need handling - - jmp chrout_screen_ins diff --git a/c64/kernal/screen/chrout_screen_crsr.s b/c64/kernal/screen/chrout_screen_crsr.s new file mode 100644 index 00000000..7f6cbffb --- /dev/null +++ b/c64/kernal/screen/chrout_screen_crsr.s @@ -0,0 +1,40 @@ + +// +// Cursor keys handling within CHROUT +// + + +chrout_screen_CRSR_UP: + + lda PNTR + sec + sbc #40 + sta PNTR + jmp chrout_screen_calc_lptr_done + +chrout_screen_CRSR_DOWN: + + lda PNTR + clc + adc #40 + sta PNTR + // We need to advance the pointer manually, as normalising + // now will break things. The pointer update is required + // so that we can tell if we really are on the bottom phys + // screen line or not + jsr screen_scroll_up_if_on_last_line + jmp chrout_screen_calc_lptr_done + +chrout_screen_CRSR_LEFT: + + lda TBLX + ora PNTR + beq !+ // recalculating pointer is not really necessary, but this is a very rare case nevertheless + dec PNTR +!: + jmp chrout_screen_calc_lptr_done + +chrout_screen_CRSR_RIGHT: + + inc PNTR + jmp chrout_screen_calc_lptr_done diff --git a/c64/kernal/screen/chrout_screen_del.s b/c64/kernal/screen/chrout_screen_del.s index 135f4777..88a403b2 100644 --- a/c64/kernal/screen/chrout_screen_del.s +++ b/c64/kernal/screen/chrout_screen_del.s @@ -3,7 +3,7 @@ // CHROUT routine - screen support, DEL key handling // -chrout_screen_del: +chrout_screen_DEL: // In insert mode it embeds control character ldx INSRT diff --git a/c64/kernal/screen/chrout_screen_gfxtxt.s b/c64/kernal/screen/chrout_screen_gfxtxt.s new file mode 100644 index 00000000..e523e03b --- /dev/null +++ b/c64/kernal/screen/chrout_screen_gfxtxt.s @@ -0,0 +1,19 @@ + +// +// GFX/TXT mode switch handling within CHROUT +// + + +chrout_screen_GFX: + + lda VIC_YMCSB + and #$02 // to upper case +!: + sta VIC_YMCSB + jmp chrout_screen_done + +chrout_screen_TXT: + + lda VIC_YMCSB + ora #$02 // to lower case + bne !- // branch always diff --git a/c64/kernal/screen/chrout_screen_home.s b/c64/kernal/screen/chrout_screen_home.s new file mode 100644 index 00000000..77976bd0 --- /dev/null +++ b/c64/kernal/screen/chrout_screen_home.s @@ -0,0 +1,10 @@ + +// +// HOME key handling within CHROUT +// + + +chrout_screen_HOME: + + jsr cursor_home + jmp chrout_screen_done diff --git a/c64/kernal/screen/chrout_screen_ins.s b/c64/kernal/screen/chrout_screen_ins.s index 8e0e7f63..3082012a 100644 --- a/c64/kernal/screen/chrout_screen_ins.s +++ b/c64/kernal/screen/chrout_screen_ins.s @@ -3,7 +3,7 @@ // CHROUT routine - screen support, INS key handling // -chrout_screen_ins: +chrout_screen_INS: // Insert (shift-DELETE) diff --git a/c64/kernal/screen/chrout_screen_jumptable_codes.s b/c64/kernal/screen/chrout_screen_jumptable_codes.s new file mode 100644 index 00000000..28bef1cf --- /dev/null +++ b/c64/kernal/screen/chrout_screen_jumptable_codes.s @@ -0,0 +1,55 @@ + +// +// Jumptable for screen control coldes support. To improve performance, should be sorted +// starting from the least probable routine +// + +chrout_screen_jumptable_codes: + + .byte KEY_INS + .byte KEY_CLR + .byte KEY_HOME + .byte KEY_SHIFT_OFF + .byte KEY_SHIFT_ON + .byte KEY_TXT + .byte KEY_GFX + .byte KEY_RVS_OFF + .byte KEY_RVS_ON + .byte KEY_CRSR_RIGHT + .byte KEY_CRSR_LEFT + .byte KEY_CRSR_DOWN + .byte KEY_CRSR_UP + +__chrout_screen_jumptable_codes_end: + +chrout_screen_jumptable_lo: + + .byte <(chrout_screen_INS - 1) + .byte <(chrout_screen_CLR - 1) + .byte <(chrout_screen_HOME - 1) + .byte <(chrout_screen_SHIFT_OFF - 1) + .byte <(chrout_screen_SHIFT_ON - 1) + .byte <(chrout_screen_TXT - 1) + .byte <(chrout_screen_GFX - 1) + .byte <(chrout_screen_RVS_OFF - 1) + .byte <(chrout_screen_RVS_ON - 1) + .byte <(chrout_screen_CRSR_RIGHT - 1) + .byte <(chrout_screen_CRSR_LEFT - 1) + .byte <(chrout_screen_CRSR_DOWN - 1) + .byte <(chrout_screen_CRSR_UP - 1) + +chrout_screen_jumptable_hi: + + .byte >(chrout_screen_INS - 1) + .byte >(chrout_screen_CLR - 1) + .byte >(chrout_screen_HOME - 1) + .byte >(chrout_screen_SHIFT_OFF - 1) + .byte >(chrout_screen_SHIFT_ON - 1) + .byte >(chrout_screen_TXT - 1) + .byte >(chrout_screen_GFX - 1) + .byte >(chrout_screen_RVS_OFF - 1) + .byte >(chrout_screen_RVS_ON - 1) + .byte >(chrout_screen_CRSR_RIGHT - 1) + .byte >(chrout_screen_CRSR_LEFT - 1) + .byte >(chrout_screen_CRSR_DOWN - 1) + .byte >(chrout_screen_CRSR_UP - 1) diff --git a/c64/kernal/screen/chrout_screen_rvs.s b/c64/kernal/screen/chrout_screen_rvs.s new file mode 100644 index 00000000..b1f68b76 --- /dev/null +++ b/c64/kernal/screen/chrout_screen_rvs.s @@ -0,0 +1,17 @@ + +// +// RVS ON/OFF handling within CHROUT +// + + +chrout_screen_RVS_ON: + + lda #$80 + bne !+ // branch always + +chrout_screen_RVS_OFF: + + lda #$00 +!: + sta RVS + jmp chrout_screen_done diff --git a/c64/kernal/screen/chrout_screen_shift_onoff.s b/c64/kernal/screen/chrout_screen_shift_onoff.s new file mode 100644 index 00000000..8f16587d --- /dev/null +++ b/c64/kernal/screen/chrout_screen_shift_onoff.s @@ -0,0 +1,16 @@ + +// +// SHIFT ON/OFF handling within CHROUT +// + +chrout_screen_SHIFT_ON: + + lda #$00 // enable SHIFT+VENDOR combination +!: + sta MODE + jmp chrout_screen_done + +chrout_screen_SHIFT_OFF: + + lda #$80 // disable SHIFT+VENDOR combination + bne !- // branch always From ec3e78de88c1674569e67b8511ed1c7f3be3fa5c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 18:59:35 +0100 Subject: [PATCH 017/105] I/O stack refactoring completed --- Makefile | 1 + STATUS.md | 6 ++--- c64/kernal/f13e.getin.s | 18 ++++++++++++--- c64/kernal/iec/chrout_iec.s | 12 ++++++++++ c64/kernal/iostack/f157.chrin.s | 2 ++ c64/kernal/{ => iostack}/f1ca.chrout.s | 22 +++++++++---------- c64/kernal/{ => iostack}/f1ca.interop | 0 c64/kernal/iostack/f4a5.load.s | 12 +++++++++- ...42.read_kb_buf.s => f142.getin_keyboard.s} | 2 +- c64/kernal/rs232/chrout_rs232.s | 2 -- c64/kernal/rs232/getin_rs232.s | 2 -- c64/kernal/tape/load_tape_normal.s | 14 ++++++++++++ c64/kernal/tape/load_tape_turbo.s | 14 ++++++++++++ 13 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 c64/kernal/iec/chrout_iec.s rename c64/kernal/{ => iostack}/f1ca.chrout.s (80%) rename c64/kernal/{ => iostack}/f1ca.interop (100%) rename c64/kernal/keyboard/{f142.read_kb_buf.s => f142.getin_keyboard.s} (80%) create mode 100644 c64/kernal/tape/load_tape_normal.s create mode 100644 c64/kernal/tape/load_tape_turbo.s diff --git a/Makefile b/Makefile index 30c6b004..f375c2b6 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ c64/kernal/rom_revision \ c64/kernal/rs232 \ c64/kernal/screen \ + c64/kernal/tape \ c64/kernal/time diff --git a/STATUS.md b/STATUS.md index d754ca4f..7c0e8663 100644 --- a/STATUS.md +++ b/STATUS.md @@ -130,8 +130,8 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFC6` | `$F20E` | `CHKIN` | DONE | | | `$FFC9` | `$F250` | `CKOUT` | DONE | | | `$FFCC` | `$F333` | `CLRCHN` | DONE | | -| `$FFCF` | `$F157` | `CHRIN` | PARTIAL | | -| `$FFD2` | `$F1CA` | `CHROUT` | PARTIAL | | +| `$FFCF` | `$F157` | `CHRIN` | PARTIAL | no screen support, keyboard does not preserve .Y | +| `$FFD2` | `$F1CA` | `CHROUT` | DONE | | | `$FFD5` | `$F49E` | `LOAD` | DONE | | | `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support, no STOP key support | | `$FFD8` | `$F5DD` | `SAVE` | DONE | only this preparation routine part is done | @@ -139,7 +139,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | | `$FFE1` | `$F6ED` | `STOP` | DONE | | -| `$FFE4` | `$F13E` | `GETIN` | PARTIAL | only keyboard supported | +| `$FFE4` | `$F13E` | `GETIN` | PARTIAL | no screen device support | | `$FFE7` | `$F32F` | `CLALL` | DONE | | | `$FFEA` | | `UDTIM` | DONE | | | `$FFED` | | `SCREEN` | DONE | | diff --git a/c64/kernal/f13e.getin.s b/c64/kernal/f13e.getin.s index be8e3faa..0291988d 100644 --- a/c64/kernal/f13e.getin.s +++ b/c64/kernal/f13e.getin.s @@ -5,12 +5,24 @@ // - [RG64] C64 Programmer's Reference Guide - page 283 // - [CM64] Compute's Mapping the Commodore 64 - page 227/228 // -// CPU registers that has to be preserved (see [RG64]): .X, .Y +// CPU registers that has to be preserved (see [RG64]): for RS-232: .X, .Y // GETIN: - // XXX this should be a dispatcher for several different devices! + // Determine the device number + lda DFLTN - jmp read_kb_buf + // Try $00 - keyboard + beq_far getin_keyboard + +#if HAS_RS232 + + // Try $02 - RS-232 + cmp #$02 + beq_far getin_rs232 + +#endif // HAS_RS232 + + jmp chrin_getin diff --git a/c64/kernal/iec/chrout_iec.s b/c64/kernal/iec/chrout_iec.s new file mode 100644 index 00000000..38924b76 --- /dev/null +++ b/c64/kernal/iec/chrout_iec.s @@ -0,0 +1,12 @@ + +// +// IEC part of the CHROUT routine +// + + +chrout_iec: + + lda SCHAR + jsr JCIOUT + bcc_far chrout_done_success + jmp chrout_done_fail diff --git a/c64/kernal/iostack/f157.chrin.s b/c64/kernal/iostack/f157.chrin.s index 6ab21bfa..32da72d0 100644 --- a/c64/kernal/iostack/f157.chrin.s +++ b/c64/kernal/iostack/f157.chrin.s @@ -35,6 +35,8 @@ CHRIN: #endif // HAS_RS232 +chrin_getin: // jump entry for GETIN + #if CONFIG_IEC // Try IEC devices diff --git a/c64/kernal/f1ca.chrout.s b/c64/kernal/iostack/f1ca.chrout.s similarity index 80% rename from c64/kernal/f1ca.chrout.s rename to c64/kernal/iostack/f1ca.chrout.s index 9ebbe75d..b0103b59 100644 --- a/c64/kernal/f1ca.chrout.s +++ b/c64/kernal/iostack/f1ca.chrout.s @@ -6,7 +6,7 @@ // - [CM64] Compute's Mapping the Commodore 64 - page 228 // // CPU registers that has to be preserved (see [RG64]): .Y -// Additionally we have to preserve .X for out CHRIN implementation +// Additionally we have to preserve .X for out CHRIN and implementation // CHROUT: @@ -27,17 +27,17 @@ CHROUT: lda DFLTO cmp #$03 // screen - bne !+ - jmp chrout_screen -!: + beq_far chrout_screen + +#if HAS_RS232 + cmp #$02 + beq_far chrout_rs232 +#endif + +#if CONFIG_IEC jsr iec_check_devnum_oc - bcs chrout_done_unknown_device // not a supported device - -chrout_iec: - - lda SCHAR - jsr JCIOUT - bcc chrout_done_success + bcc_far chrout_iec +#if CONFIG_IEC // FALLTROUGH diff --git a/c64/kernal/f1ca.interop b/c64/kernal/iostack/f1ca.interop similarity index 100% rename from c64/kernal/f1ca.interop rename to c64/kernal/iostack/f1ca.interop diff --git a/c64/kernal/iostack/f4a5.load.s b/c64/kernal/iostack/f4a5.load.s index 0f1b0e36..53d31e53 100644 --- a/c64/kernal/iostack/f4a5.load.s +++ b/c64/kernal/iostack/f4a5.load.s @@ -40,9 +40,19 @@ LOAD: // Check whether we support the requested device lda FA +#if CONFIG_TAPE_NORMAL + cmp #$01 + beq_far load_tape_normal +#endif + +#if CONFIG_TAPE_TURBO + cmp #$07 + beq_far load_tape_turbo +#endif + #if CONFIG_IEC jsr iec_check_devnum_lvs bcc_far load_iec -#endif // CONFIG_IEC +#endif jmp lvs_illegal_device_number diff --git a/c64/kernal/keyboard/f142.read_kb_buf.s b/c64/kernal/keyboard/f142.getin_keyboard.s similarity index 80% rename from c64/kernal/keyboard/f142.read_kb_buf.s rename to c64/kernal/keyboard/f142.getin_keyboard.s index 8b72b9e2..3e3da159 100644 --- a/c64/kernal/keyboard/f142.read_kb_buf.s +++ b/c64/kernal/keyboard/f142.getin_keyboard.s @@ -6,7 +6,7 @@ // -read_kb_buf: +getin_keyboard: // XXX confirm that here is really a part of GETIN! // Check for a key lda NDX diff --git a/c64/kernal/rs232/chrout_rs232.s b/c64/kernal/rs232/chrout_rs232.s index 4617bc1a..9c3af02f 100644 --- a/c64/kernal/rs232/chrout_rs232.s +++ b/c64/kernal/rs232/chrout_rs232.s @@ -3,8 +3,6 @@ // RS-232 part of the CHROUT routine // -// XXX connect to I/O stack - #if HAS_RS232 diff --git a/c64/kernal/rs232/getin_rs232.s b/c64/kernal/rs232/getin_rs232.s index fd062e3a..17215ead 100644 --- a/c64/kernal/rs232/getin_rs232.s +++ b/c64/kernal/rs232/getin_rs232.s @@ -3,8 +3,6 @@ // RS-232 part of the GETIN routine // -// XXX connect to I/O stack - #if HAS_RS232 diff --git a/c64/kernal/tape/load_tape_normal.s b/c64/kernal/tape/load_tape_normal.s new file mode 100644 index 00000000..f480922e --- /dev/null +++ b/c64/kernal/tape/load_tape_normal.s @@ -0,0 +1,14 @@ + +// +// Tape (normal) part of the LOAD routine +// + + +#if CONFIG_TAPE_NORMAL + + +load_tape_normal: + STUB_IMPLEMENTATION() + + +#endif diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s new file mode 100644 index 00000000..a6d7b1b1 --- /dev/null +++ b/c64/kernal/tape/load_tape_turbo.s @@ -0,0 +1,14 @@ + +// +// Tape (turbo) part of the LOAD routine +// + + +#if CONFIG_TAPE_TURBO + + +load_tape_turbo: + STUB_IMPLEMENTATION() + + +#endif From 49b7c728c596ca56d1dcd6064a6659aca075c95b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 19:12:32 +0100 Subject: [PATCH 018/105] compilation fix --- c64/kernal/iostack/f13e.getin.s | 13 +++++++++++++ c64/kernal/{ => iostack}/f13e.interop | 0 c64/kernal/{f13e.getin.s => iostack/getin_real.s} | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 c64/kernal/iostack/f13e.getin.s rename c64/kernal/{ => iostack}/f13e.interop (100%) rename c64/kernal/{f13e.getin.s => iostack/getin_real.s} (97%) diff --git a/c64/kernal/iostack/f13e.getin.s b/c64/kernal/iostack/f13e.getin.s new file mode 100644 index 00000000..02d68bc3 --- /dev/null +++ b/c64/kernal/iostack/f13e.getin.s @@ -0,0 +1,13 @@ + +// +// Official Kernal routine, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 283 +// - [CM64] Compute's Mapping the Commodore 64 - page 227/228 +// +// CPU registers that has to be preserved (see [RG64]): for RS-232: .X, .Y +// + + +GETIN: + jmp getin_real diff --git a/c64/kernal/f13e.interop b/c64/kernal/iostack/f13e.interop similarity index 100% rename from c64/kernal/f13e.interop rename to c64/kernal/iostack/f13e.interop diff --git a/c64/kernal/f13e.getin.s b/c64/kernal/iostack/getin_real.s similarity index 97% rename from c64/kernal/f13e.getin.s rename to c64/kernal/iostack/getin_real.s index 0291988d..681e2a17 100644 --- a/c64/kernal/f13e.getin.s +++ b/c64/kernal/iostack/getin_real.s @@ -9,7 +9,7 @@ // -GETIN: +getin_real: // Determine the device number lda DFLTN From 8ec6b02ca967be80963c1ff3df9173c43774a17b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 19:34:38 +0100 Subject: [PATCH 019/105] fix for screen corruption in 'Operacja Proboszcz' game --- c64/kernal/init/fda3.ioinit.s | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/c64/kernal/init/fda3.ioinit.s b/c64/kernal/init/fda3.ioinit.s index 1339ab78..02362586 100644 --- a/c64/kernal/init/fda3.ioinit.s +++ b/c64/kernal/init/fda3.ioinit.s @@ -107,5 +107,11 @@ IOINIT: lda #$3F sta CIA2_DDRA + // Set VIC-II bank - needed at least for 'Operacja Proboszcz' game + lda #%00000011 + sta CIA2_PRA + + rts + // Set IEC bus to its initial idle state jmp iec_set_idle From 18dc9d9b6145a04e5e49a6a2846a9f9004a8d3dd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 20:18:22 +0100 Subject: [PATCH 020/105] fix for INS key regression --- Makefile | 2 +- c64/kernal/screen/chrout_screen_control.s | 6 ++++++ c64/kernal/screen/chrout_screen_jumptable_codes.s | 3 --- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index f375c2b6..2988e675 100644 --- a/Makefile +++ b/Makefile @@ -238,7 +238,7 @@ test_mega65: build/kernal_mega65.rom build/basic_mega65.rom build/symbols_mega65 x64 -kernal build/kernal_mega65.rom -basic build/basic_mega65.rom -moncommands build/symbols_mega65.vs -8 empty.d64 test_mega65_xemu: build/newc65.rom - ../xemu/build/bin/xc65.native -dmarev 2 -rom build/newc65.rom + ../xemu/build/bin/xmega65.native -dmarev 2 -forcerom -loadrom build/newc65.rom test_ultimate64: build/kernal_ultimate64.rom build/basic_ultimate64.rom build/symbols_ultimate64.vs x64 -kernal build/kernal_ultimate64.rom -basic build/basic_ultimate64.rom -moncommands build/symbols_ultimate64.vs -8 empty.d64 diff --git a/c64/kernal/screen/chrout_screen_control.s b/c64/kernal/screen/chrout_screen_control.s index 61fa2f4e..dda912c7 100644 --- a/c64/kernal/screen/chrout_screen_control.s +++ b/c64/kernal/screen/chrout_screen_control.s @@ -31,6 +31,12 @@ chrout_try_DEL: bne !+ jmp chrout_screen_DEL !: +chrout_try_INS: + + cmp #KEY_INS + bne !+ + jmp chrout_screen_INS +!: #if CONFIG_EDIT_STOPQUOTE chrout_try_STOP: diff --git a/c64/kernal/screen/chrout_screen_jumptable_codes.s b/c64/kernal/screen/chrout_screen_jumptable_codes.s index 28bef1cf..b12dbb7a 100644 --- a/c64/kernal/screen/chrout_screen_jumptable_codes.s +++ b/c64/kernal/screen/chrout_screen_jumptable_codes.s @@ -6,7 +6,6 @@ chrout_screen_jumptable_codes: - .byte KEY_INS .byte KEY_CLR .byte KEY_HOME .byte KEY_SHIFT_OFF @@ -24,7 +23,6 @@ __chrout_screen_jumptable_codes_end: chrout_screen_jumptable_lo: - .byte <(chrout_screen_INS - 1) .byte <(chrout_screen_CLR - 1) .byte <(chrout_screen_HOME - 1) .byte <(chrout_screen_SHIFT_OFF - 1) @@ -40,7 +38,6 @@ chrout_screen_jumptable_lo: chrout_screen_jumptable_hi: - .byte >(chrout_screen_INS - 1) .byte >(chrout_screen_CLR - 1) .byte >(chrout_screen_HOME - 1) .byte >(chrout_screen_SHIFT_OFF - 1) From 106593053980bf9ced16fd4bef4db6a074e83d2f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 21:26:26 +0100 Subject: [PATCH 021/105] STOP key now terminates loading, some cleanups --- STATUS.md | 3 +-- c64/basic/commands/cmd_load.s | 10 +++++---- c64/kernal/iec/load_iec.s | 21 ++++++++++++++++++- c64/kernal/screen/chrout_screen_control.s | 15 ++++++------- .../screen/chrout_screen_jumptable_codes.s | 3 +++ 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/STATUS.md b/STATUS.md index 7c0e8663..b2121aa4 100644 --- a/STATUS.md +++ b/STATUS.md @@ -29,7 +29,6 @@ The following ROM features are currently missing: * floating point routines * tape support * RS-232 support -* breaking Kernal routines with RUN/STOP key * NMI handling is incomplete @@ -133,7 +132,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFCF` | `$F157` | `CHRIN` | PARTIAL | no screen support, keyboard does not preserve .Y | | `$FFD2` | `$F1CA` | `CHROUT` | DONE | | | `$FFD5` | `$F49E` | `LOAD` | DONE | | -| `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support, no STOP key support | +| `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support | | `$FFD8` | `$F5DD` | `SAVE` | DONE | only this preparation routine part is done | | `($0332)` | `$F5ED` | `SAVE` | NOT DONE | | | `$FFDB` | | `SETTIM` | DONE | | diff --git a/c64/basic/commands/cmd_load.s b/c64/basic/commands/cmd_load.s index 9dfe60f0..e7dc76f1 100644 --- a/c64/basic/commands/cmd_load.s +++ b/c64/basic/commands/cmd_load.s @@ -97,16 +97,18 @@ got_loadaddress: jsr print_return pla plp - bcc !+ + bcc load_no_error // A = KERNAL error code, which also almost match - // basic ERROR codes, so we can just copy the - // error code to X, decrement, and handle normally + // basic ERROR codes tax dex + bpl !+ + ldx #B_ERR_BREAK +!: jmp do_basic_error -!: +load_no_error: // $YYXX is the last loaded address, so store it stx VARTAB+0 sty VARTAB+1 diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index eb37bcf0..bbca2af8 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -14,8 +14,16 @@ load_iec_file_not_found: jmp kernalerror_FILE_NOT_FOUND load_iec_error: + lda FA + jsr iec_close_load jmp lvs_load_verify_error +load_break_error: + pla + lda FA + jsr iec_close_load + jmp kernalerror_ROUTINE_TERMINATED + load_iec: @@ -85,7 +93,18 @@ iec_load_loop: // Advance pointer to data jsr lvs_advance_pointer bcs_far lvs_wrap_around_error - + + // Handle STOP key; it is probably an overkill to do it + // with every byte, once per 32 bytes should be enough + lda STAL + and #$1F + bne !+ + phx_trash_a + jsr udtim_keyboard + jsr STOP + bcs load_break_error + plx_trash_a +!: // Check for EOI - if so, this was the last byte lda IOSTATUS and #K_STS_EOI diff --git a/c64/kernal/screen/chrout_screen_control.s b/c64/kernal/screen/chrout_screen_control.s index dda912c7..89b2390a 100644 --- a/c64/kernal/screen/chrout_screen_control.s +++ b/c64/kernal/screen/chrout_screen_control.s @@ -8,10 +8,9 @@ chrout_screen_control: txa // Order here is not random - // 1. First handle the ones that do not depend on quoote mode + // 1. First handle the ones that do not depend on quote mode // 2. Handle remaining control codes starting from the most commonly used - // in situations when speed might matter, we want to be - // as snappy as possible + // We want to be as snappy as possible chrout_try_RETURN: @@ -28,15 +27,13 @@ chrout_try_RETURN: chrout_try_DEL: cmp #KEY_DEL - bne !+ - jmp chrout_screen_DEL -!: + beq_far chrout_screen_DEL + chrout_try_INS: cmp #KEY_INS - bne !+ - jmp chrout_screen_INS -!: + beq_far chrout_screen_INS + #if CONFIG_EDIT_STOPQUOTE chrout_try_STOP: diff --git a/c64/kernal/screen/chrout_screen_jumptable_codes.s b/c64/kernal/screen/chrout_screen_jumptable_codes.s index b12dbb7a..5ee6b9fc 100644 --- a/c64/kernal/screen/chrout_screen_jumptable_codes.s +++ b/c64/kernal/screen/chrout_screen_jumptable_codes.s @@ -4,6 +4,7 @@ // starting from the least probable routine // + chrout_screen_jumptable_codes: .byte KEY_CLR @@ -21,6 +22,7 @@ chrout_screen_jumptable_codes: __chrout_screen_jumptable_codes_end: + chrout_screen_jumptable_lo: .byte <(chrout_screen_CLR - 1) @@ -36,6 +38,7 @@ chrout_screen_jumptable_lo: .byte <(chrout_screen_CRSR_DOWN - 1) .byte <(chrout_screen_CRSR_UP - 1) + chrout_screen_jumptable_hi: .byte >(chrout_screen_CLR - 1) From 1682587d1292d0055fcedd4e38b651c1e6f0f1d2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 21:56:14 +0100 Subject: [PATCH 022/105] LOAD can now do verify on standard memory model --- STATUS.md | 4 ++-- c64/kernal/iostack/lvs_helpers.s | 34 +++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/STATUS.md b/STATUS.md index b2121aa4..36c679a5 100644 --- a/STATUS.md +++ b/STATUS.md @@ -132,8 +132,8 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFCF` | `$F157` | `CHRIN` | PARTIAL | no screen support, keyboard does not preserve .Y | | `$FFD2` | `$F1CA` | `CHROUT` | DONE | | | `$FFD5` | `$F49E` | `LOAD` | DONE | | -| `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support | -| `$FFD8` | `$F5DD` | `SAVE` | DONE | only this preparation routine part is done | +| `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support for memory model 60k | +| `$FFD8` | `$F5DD` | `SAVE` | DONE | main routine not done yet | | `($0332)` | `$F5ED` | `SAVE` | NOT DONE | | | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | diff --git a/c64/kernal/iostack/lvs_helpers.s b/c64/kernal/iostack/lvs_helpers.s index 948de153..60157491 100644 --- a/c64/kernal/iostack/lvs_helpers.s +++ b/c64/kernal/iostack/lvs_helpers.s @@ -33,19 +33,19 @@ lvs_send_file_name_done: lvs_handle_byte_load_verify: - // XXX add VERIFY support + ldy VERCKK + bne lvs_handle_byte_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 #if CONFIG_MEMORY_MODEL_60K + // Save byte under ROMs and IO if required php sei - // XXX behavior should depend on address ldx #$33 stx $01 ldy #0 @@ -53,14 +53,42 @@ lvs_handle_byte_load_verify: ldx #$37 stx $01 plp + #else + ldy #0 sta (STAL),y + #endif + // FALLTROUGH + +lvs_handle_byte_load_verify_end: + + clc rts + +lvs_handle_byte_verify: + +#if CONFIG_MEMORY_MODEL_60K + + // XXX implement this part + +#else + + ldy #0 + cmp (STAL),y + beq lvs_handle_byte_load_verify_end + +#endif + + sec + rts + + lvs_advance_pointer: + // Advance pointer inc STAL beq !+ From 01024278f4252703508d0d5ec6b127f7e3d7698e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 30 Oct 2019 23:10:48 +0100 Subject: [PATCH 023/105] all screen control codes are now handled via jumptable --- STATUS.md | 1 - c64/kernal/screen/chrout_screen_control.s | 74 ++++++------------- .../screen/chrout_screen_jumptable_codes.s | 24 +++++- c64/kernal/screen/chrout_screen_return.s | 14 ++++ c64/kernal/screen/chrout_screen_stop.s | 18 +++++ 5 files changed, 77 insertions(+), 54 deletions(-) create mode 100644 c64/kernal/screen/chrout_screen_return.s create mode 100644 c64/kernal/screen/chrout_screen_stop.s diff --git a/STATUS.md b/STATUS.md index 36c679a5..3dfdd712 100644 --- a/STATUS.md +++ b/STATUS.md @@ -178,7 +178,6 @@ Not all of them - only these we want to have implemented. | `$F646` | IEC close | NOT DONE | | | `$FD30` | default vectors | DONE | | | `$FD90` | (unknown) | NOT DONE | | -| `$FD90` | (unknown) | NOT DONE | | | `$FE2D` | memtop set part | DONE | | | `$FE47` | default NMI | PARTIAL | | | `$FE66` | default BRK | DONE | | diff --git a/c64/kernal/screen/chrout_screen_control.s b/c64/kernal/screen/chrout_screen_control.s index 89b2390a..83686dde 100644 --- a/c64/kernal/screen/chrout_screen_control.s +++ b/c64/kernal/screen/chrout_screen_control.s @@ -7,62 +7,32 @@ chrout_screen_control: txa - // Order here is not random - // 1. First handle the ones that do not depend on quote mode - // 2. Handle remaining control codes starting from the most commonly used - // We want to be as snappy as possible - -chrout_try_RETURN: - - cmp #KEY_RETURN - bne !+ - - // RETURN clears quote and insert modes, it also clears reverse flag - lda #$00 - sta QTSW - sta INSRT - sta RVS - jmp chrout_screen_advance_to_next_line -!: -chrout_try_DEL: - - cmp #KEY_DEL - beq_far chrout_screen_DEL - -chrout_try_INS: - - cmp #KEY_INS - beq_far chrout_screen_INS - -#if CONFIG_EDIT_STOPQUOTE -chrout_try_STOP: - - cmp #KEY_STOP - bne !+ - - lda #$00 - sta QTSW - sta INSRT - // Let it run, we are saving 3 bytes on JMP this way - // and the performance hit is not going to be visible nevertheless -!: -#endif -chrout_try_quote: - - lda QTSW - ora INSRT - beq !+ - txa - jmp chrout_screen_quote -!: - txa - chrout_try_jumptable: ldx #(__chrout_screen_jumptable_codes_end - chrout_screen_jumptable_codes - 1) + chrout_try_jumptable_loop: + + cpx #(__chrout_screen_jumptable_quote_guard - chrout_screen_jumptable_codes - 1) + bne chrout_try_jumptable_loop_noquote + + // Is this insert/quote mode? + tay + lda QTSW + ora INSRT + beq !+ + tya + jmp chrout_screen_quote +!: + tya + + // FALLTROUGH + +chrout_try_jumptable_loop_noquote: + cmp chrout_screen_jumptable_codes, x bne !+ + // Found, perform a jump to subroutine lda chrout_screen_jumptable_hi, x pha @@ -76,7 +46,9 @@ chrout_try_jumptable_loop: chrout_try_COLOR: ldx #$0F -chrout_try_color_loop: + +chrout_try_color_loop: + cmp colour_codes,x bne !+ stx COLOR diff --git a/c64/kernal/screen/chrout_screen_jumptable_codes.s b/c64/kernal/screen/chrout_screen_jumptable_codes.s index 5ee6b9fc..f1d589b1 100644 --- a/c64/kernal/screen/chrout_screen_jumptable_codes.s +++ b/c64/kernal/screen/chrout_screen_jumptable_codes.s @@ -1,7 +1,7 @@ // // Jumptable for screen control coldes support. To improve performance, should be sorted -// starting from the least probable routine +// starting from the least probable routine. // @@ -20,6 +20,15 @@ chrout_screen_jumptable_codes: .byte KEY_CRSR_DOWN .byte KEY_CRSR_UP +__chrout_screen_jumptable_quote_guard: + +#if CONFIG_EDIT_STOPQUOTE + .byte KEY_STOP +#endif + .byte KEY_INS + .byte KEY_DEL + .byte KEY_RETURN + __chrout_screen_jumptable_codes_end: @@ -37,7 +46,12 @@ chrout_screen_jumptable_lo: .byte <(chrout_screen_CRSR_LEFT - 1) .byte <(chrout_screen_CRSR_DOWN - 1) .byte <(chrout_screen_CRSR_UP - 1) - +#if CONFIG_EDIT_STOPQUOTE + .byte <(chrout_screen_STOP - 1) +#endif + .byte <(chrout_screen_INS - 1) + .byte <(chrout_screen_DEL - 1) + .byte <(chrout_screen_RETURN - 1) chrout_screen_jumptable_hi: @@ -53,3 +67,9 @@ chrout_screen_jumptable_hi: .byte >(chrout_screen_CRSR_LEFT - 1) .byte >(chrout_screen_CRSR_DOWN - 1) .byte >(chrout_screen_CRSR_UP - 1) +#if CONFIG_EDIT_STOPQUOTE + .byte >(chrout_screen_STOP - 1) +#endif + .byte >(chrout_screen_INS - 1) + .byte >(chrout_screen_DEL - 1) + .byte >(chrout_screen_RETURN - 1) diff --git a/c64/kernal/screen/chrout_screen_return.s b/c64/kernal/screen/chrout_screen_return.s new file mode 100644 index 00000000..521c5323 --- /dev/null +++ b/c64/kernal/screen/chrout_screen_return.s @@ -0,0 +1,14 @@ + +// +// RETURN key handling within CHROUT +// + + +chrout_screen_RETURN: + + // RETURN clears quote and insert modes, it also clears reverse flag + lda #$00 + sta QTSW + sta INSRT + sta RVS + jmp chrout_screen_advance_to_next_line diff --git a/c64/kernal/screen/chrout_screen_stop.s b/c64/kernal/screen/chrout_screen_stop.s new file mode 100644 index 00000000..179c217f --- /dev/null +++ b/c64/kernal/screen/chrout_screen_stop.s @@ -0,0 +1,18 @@ + +// +// STOP key handling within CHROUT +// + + +#if CONFIG_EDIT_STOPQUOTE + + +chrout_screen_STOP: + + lda #$00 + sta QTSW + sta INSRT + jmp chrout_screen_done + + +#endif From bdcebb554fd769e58536207f9ed873186b2ba1f9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 31 Oct 2019 17:10:03 +0100 Subject: [PATCH 024/105] screen editor now supports tabulators --- CONFIG.md | 8 ++++- c64/,,config_generic.s | 1 + c64/,,config_mega65.s | 1 + c64/,,config_testing.s | 1 + c64/,,config_ultimate64.s | 1 + c64/aliases/,aliases_petscii_codes.s | 9 +++-- c64/kernal/keyboard/kb_matrix.s | 4 +++ c64/kernal/keyboard/scnkey.s | 28 +++++++++------- c64/kernal/screen/chrout_screen_crsr.s | 5 ++- .../screen/chrout_screen_jumptable_codes.s | 12 +++++++ c64/kernal/screen/chrout_screen_tab.s | 33 +++++++++++++++++++ 11 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 c64/kernal/screen/chrout_screen_tab.s diff --git a/CONFIG.md b/CONFIG.md index edb75812..238193df 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -175,7 +175,13 @@ Needs 25 bytes more space in KERNAL segment for the code. In addition, each conf If enabled, STOP key terminates insert/quote mode (like on BlackBox cartridge). -Feature needs 10 bytes in KERNAL segment. If unsure - enable. +Feature needs 12 bytes in KERNAL segment. If unsure - enable. + +### `CONFIG_EDIT_TABULATORS` + +If enabled, allows use of TAB (or CTRL+>) and SHIFT+TAB (or CTRL+<) to switch between predefined tabulator positions. + +Feature needs 35-45 bytes in KERNAL segment. If unsure - enable. ## Software features diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index f6e34b61..133318f8 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -99,6 +99,7 @@ // Screen editor #define CONFIG_EDIT_STOPQUOTE +#define CONFIG_EDIT_TABULATORS // Software features diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 6e9b9c84..146e5bb4 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -101,6 +101,7 @@ // Screen editor #define CONFIG_EDIT_STOPQUOTE +#define CONFIG_EDIT_TABULATORS // Software features diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 01b3142b..14953bc8 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -100,6 +100,7 @@ // Screen editor #define CONFIG_EDIT_STOPQUOTE +#define CONFIG_EDIT_TABULATORS // Software features diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 3c829b77..11c5a174 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -99,6 +99,7 @@ // Screen editor #define CONFIG_EDIT_STOPQUOTE +#define CONFIG_EDIT_TABULATORS // Software features diff --git a/c64/aliases/,aliases_petscii_codes.s b/c64/aliases/,aliases_petscii_codes.s index e0343a00..0156cfff 100644 --- a/c64/aliases/,aliases_petscii_codes.s +++ b/c64/aliases/,aliases_petscii_codes.s @@ -27,23 +27,22 @@ // Note - the following PETSCII codes are currently unassigned, can be used for further extensions: // -// $01, $04, $06, $0A, $0B, $0C, $0F, $18, $82 +// $01, $02, $04, $06, $0A, $0B, $0C, $0F, $18, $82 .const KEY_NA = $00 // to indicate that no key is presed -// PETSCII codes for our extended screen editor XXX implement these +// PETSCII codes for our extended screen editor -.const KEY_BOTTOM = $02 // CTRL+B - Open ROMs unofficial, DolphinDOS compatible .const KEY_TAB_FW = $8F // CTRL+>, TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII .const KEY_TAB_BW = $80 // CTRL+<, SHIFT+TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII -// PETSCII codes for certain C128 and C65 functionalities XXX implement these +// PETSCII codes for certain C128 and C65 functionalities #if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 -.const KEY_BELL = $07 // no key, originally CTRL+G +.const KEY_BELL = $07 // no key, originally CTRL+G // XXX implement BELL .const KEY_ESC = $1B #endif diff --git a/c64/kernal/keyboard/kb_matrix.s b/c64/kernal/keyboard/kb_matrix.s index e681f9f3..b56631a5 100644 --- a/c64/kernal/keyboard/kb_matrix.s +++ b/c64/kernal/keyboard/kb_matrix.s @@ -51,6 +51,10 @@ __kb_matrix_ctrl: .byte $9C,$12,$04,$1E,$03,$06,$14,$18 .byte $1F,$19,$07,$9E,$02,$08,$15,$16 .byte $12,$09,$0A,$92,$0D,$0B,$0F,$0E +#if CONFIG_EDIT_TABULATORS + .byte $00,$10,$0C,$00,KEY_TAB_FW,$1B,$00,KEY_TAB_BW +#else .byte $00,$10,$0C,$00,$00,$1B,$00,$00 +#endif .byte $1C,$00,$1D,$00,$00,$1F,$1E,$00 .byte $90,$06,$00,$05,$00,$00,$11,$00 diff --git a/c64/kernal/keyboard/scnkey.s b/c64/kernal/keyboard/scnkey.s index 3b08df9d..01a448c4 100644 --- a/c64/kernal/keyboard/scnkey.s +++ b/c64/kernal/keyboard/scnkey.s @@ -337,18 +337,6 @@ scnkey_output_65_no_shift: !: lda (KEYTAB), y // retrieve key code from standard matrix - // XXX this will be needed for extended screen editor and C128 keyboard - - // cmp KEY_TAB_FW // special handling for SHIFT+TAB - // bne scnkey_got_petscii // XXX or to scnkey_handle_caps_lock - // lda SHFLAG // special handling for SHIFT+TAB - // and #KEY_FLAG_SHIFT - // bne !+ - // lda KEY_TAB_FW - // bne scnkey_got_petscii // branch alWAYS - // !: - // lda KEY_TAB_BW // bne scnkey_got_petscii if CAPS LOCK is handled - #endif // CONFIG_KEYBOARD_C128 or CONFIG_KEYBOARD_C65 #if CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65_CAPS_LOCK @@ -391,6 +379,22 @@ scnkey_handle_caps_lock: scnkey_got_petscii: +#if CONFIG_KEYBOARD_C128 && CONFIG_EDIT_TABULATORS + + // Special handling for SHIFT+TAB; it is easier than creating new matrix + + tax + cmp #KEY_TAB_FW + bne !+ + lda SHFLAG + and #KEY_FLAG_SHIFT + beq !+ + ldx #KEY_TAB_BW +!: + txa + +#endif // CONFIG_KEYBOARD_C128 and CONFIG_EDIT_TABULATORS + beq scnkey_no_keys // branch if we have no PETSCII code for this key ldy NDX sta KEYD, y diff --git a/c64/kernal/screen/chrout_screen_crsr.s b/c64/kernal/screen/chrout_screen_crsr.s index 7f6cbffb..ed174568 100644 --- a/c64/kernal/screen/chrout_screen_crsr.s +++ b/c64/kernal/screen/chrout_screen_crsr.s @@ -12,6 +12,7 @@ chrout_screen_CRSR_UP: sta PNTR jmp chrout_screen_calc_lptr_done + chrout_screen_CRSR_DOWN: lda PNTR @@ -25,15 +26,17 @@ chrout_screen_CRSR_DOWN: jsr screen_scroll_up_if_on_last_line jmp chrout_screen_calc_lptr_done + chrout_screen_CRSR_LEFT: lda TBLX ora PNTR - beq !+ // recalculating pointer is not really necessary, but this is a very rare case nevertheless + beq !+ // top-left corner, recalculating pointer is not necessary, but this is a very rare case nevertheless dec PNTR !: jmp chrout_screen_calc_lptr_done + chrout_screen_CRSR_RIGHT: inc PNTR diff --git a/c64/kernal/screen/chrout_screen_jumptable_codes.s b/c64/kernal/screen/chrout_screen_jumptable_codes.s index f1d589b1..448c3f96 100644 --- a/c64/kernal/screen/chrout_screen_jumptable_codes.s +++ b/c64/kernal/screen/chrout_screen_jumptable_codes.s @@ -24,6 +24,10 @@ __chrout_screen_jumptable_quote_guard: #if CONFIG_EDIT_STOPQUOTE .byte KEY_STOP +#endif +#if CONFIG_EDIT_TABULATORS + .byte KEY_TAB_BW + .byte KEY_TAB_FW #endif .byte KEY_INS .byte KEY_DEL @@ -48,6 +52,10 @@ chrout_screen_jumptable_lo: .byte <(chrout_screen_CRSR_UP - 1) #if CONFIG_EDIT_STOPQUOTE .byte <(chrout_screen_STOP - 1) +#endif +#if CONFIG_EDIT_TABULATORS + .byte <(chrout_screen_TAB_BW - 1) + .byte <(chrout_screen_TAB_FW - 1) #endif .byte <(chrout_screen_INS - 1) .byte <(chrout_screen_DEL - 1) @@ -69,6 +77,10 @@ chrout_screen_jumptable_hi: .byte >(chrout_screen_CRSR_UP - 1) #if CONFIG_EDIT_STOPQUOTE .byte >(chrout_screen_STOP - 1) +#endif +#if CONFIG_EDIT_TABULATORS + .byte >(chrout_screen_TAB_BW - 1) + .byte >(chrout_screen_TAB_FW - 1) #endif .byte >(chrout_screen_INS - 1) .byte >(chrout_screen_DEL - 1) diff --git a/c64/kernal/screen/chrout_screen_tab.s b/c64/kernal/screen/chrout_screen_tab.s new file mode 100644 index 00000000..ac48295c --- /dev/null +++ b/c64/kernal/screen/chrout_screen_tab.s @@ -0,0 +1,33 @@ + +// +// Tabulation keys handling within CHROUT +// + + +#if CONFIG_EDIT_TABULATORS + + +chrout_screen_TAB_FW: + + lda PNTR + ora #%00000111 + sta PNTR + inc PNTR + jmp chrout_screen_calc_lptr_done + + +chrout_screen_TAB_BW: + + lda TBLX + ora PNTR + beq !+ // top-left corner, recalculating pointer is not necessary, but this is a very rare case nevertheless + + dec PNTR + lda PNTR + and #%11111000 + sta PNTR +!: + jmp chrout_screen_calc_lptr_done + + +#endif // CONFIG_EDIT_TABULATORS From c03c7abf457de73a78aff4b9d3f908b6a16b00a9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 31 Oct 2019 17:16:32 +0100 Subject: [PATCH 025/105] various I/O updates --- STATUS.md | 2 +- c64/aliases/,aliases_ram_lowmem.s | 16 +++-- c64/kernal/iec/iec_jiffydos.s | 93 +++++++++++++++++++++++++ c64/kernal/iec/save_iec.s | 37 ++++++++++ c64/kernal/iostack/f4a5.load.s | 1 - c64/kernal/iostack/f5ed.save.s | 19 ++++- c64/kernal/iostack/findfls.s | 1 - c64/kernal/iostack/lvs_helpers.s | 20 +++++- c64/kernal/rs232/close_rs232.s | 26 ++++++- c64/kernal/rs232/open_rs232.s | 35 +++++++++- c64/kernal/rs232/rs232_count_channels.s | 28 ++++++++ 11 files changed, 263 insertions(+), 15 deletions(-) create mode 100644 c64/kernal/iec/iec_jiffydos.s create mode 100644 c64/kernal/iec/save_iec.s create mode 100644 c64/kernal/rs232/rs232_count_channels.s diff --git a/STATUS.md b/STATUS.md index 3dfdd712..7eb547c7 100644 --- a/STATUS.md +++ b/STATUS.md @@ -132,7 +132,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFCF` | `$F157` | `CHRIN` | PARTIAL | no screen support, keyboard does not preserve .Y | | `$FFD2` | `$F1CA` | `CHROUT` | DONE | | | `$FFD5` | `$F49E` | `LOAD` | DONE | | -| `($0330)` | `$F4A5` | `LOAD` | PARTIAL | no VERIFY support for memory model 60k | +| `($0330)` | `$F4A5` | `LOAD` | DONE | | | `$FFD8` | `$F5DD` | `SAVE` | DONE | main routine not done yet | | `($0332)` | `$F5ED` | `SAVE` | NOT DONE | | | `$FFDB` | | `SETTIM` | DONE | | diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 10852ad2..68b92f40 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -99,7 +99,11 @@ .label PTR1 = $9E // -- NOT IMPLEMENTED -- .label PTR2 = $9F // -- NOT IMPLEMENTED -- .label TIME = $A0 // $A0-$A2 jiffy clock +#if !CONFIG_IEC_JIFFYDOS .label TSFCNT = $A3 // temporary variable for tape and IEC, [!] our usage probably differs in details +#else + .label IECPROTO = $A3 // [!] (WIP) 0 = normal, 1 = JiffyDOS, 0xFF = unknown +#endif .label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details .label CNTDN = $A5 // -- NOT IMPLEMENTED -- .label BUFPNT = $A6 // -- NOT IMPLEMENTED -- @@ -154,8 +158,8 @@ .label LDTBL = $D9 // $D9-$F2 screen line link table, [!] our usage is different XXX give more details .label USER = $F3 // $F3-$F4 pointer to current color RAM location .label KEYTAB = $F5 // $F5-$F6 pointer to keyboard lookup table - .label RIBUF = $F7 // $F7-$F8 -- NOT IMPLEMENTED -- XXX WIP - .label ROBUF = $F9 // $F9-$FA -- NOT IMPLEMENTED -- XXX WIP + .label RIBUF = $F7 // $F7-$F8 -- NOT IMPLEMENTED -- (WIP) + .label ROBUF = $F9 // $F9-$FA -- NOT IMPLEMENTED -- (WIP) // $FB $FB-$FE -- UNUSED -- free for user software .label BASZPT = $FF // -- NOT IMPLEMENTED -- @@ -202,10 +206,10 @@ .label BITNUM = $298 // -- NOT IMPLEMENTED -- .label BAUDOF = $299 // $299-$29A -- NOT IMPLEMENTED -- #endif - .label RIDBE = $29B // -- NOT IMPLEMENTED -- XXX WIP - .label RIDBS = $29C // -- NOT IMPLEMENTED -- XXX WIP - .label RODBS = $29D // -- NOT IMPLEMENTED -- XXX WIP - .label RODBE = $29E // -- NOT IMPLEMENTED -- XXX WIP + .label RIDBE = $29B // -- NOT IMPLEMENTED -- (WIP) + .label RIDBS = $29C // -- NOT IMPLEMENTED -- (WIP) + .label RODBS = $29D // -- NOT IMPLEMENTED -- (WIP) + .label RODBE = $29E // -- NOT IMPLEMENTED -- (WIP) .label IRQTMP = $29F // $29F-$2A0 -- NOT IMPLEMENTED -- .label ENABL = $2A1 // -- NOT IMPLEMENTED -- .label TODSNS = $2A2 // -- NOT IMPLEMENTED -- diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s new file mode 100644 index 00000000..db093cdf --- /dev/null +++ b/c64/kernal/iec/iec_jiffydos.s @@ -0,0 +1,93 @@ + +// +// JiffyDOS protocol support for IEC +// + +// XXX finish this + + + +#if CONFIG_IEC_JIFFYDOS + + +iec_tx_byte_jiffydos: + + // JiffyDOS timing regime is very strict - before transmitting anything + // we need to disable sprites and (if screen is not disabled) wait for + // appropriate moment, so that no badline interruption can happen + + jsr jiffydos_hide_sprites + jsr jiffydos_wait_line + +__jd_check1: + + // XXX send byte + + // Re-enable sprites + jsr jiffydos_restore_sprites + + rts + + +iec_rx_byte_jiffydos: + + // JiffyDOS timing regime is very strict - before transmitting anything + // we need to disable sprites and (if screen is not disabled) wait for + // appropriate moment, so that no badline interruption can happen + + jsr jiffydos_hide_sprites + jsr jiffydos_wait_line + + // XXX retrieve byte + + // Re-enable sprites + jsr jiffydos_restore_sprites + + rts + + +jiffydos_wait_line: + + // XXX if screen not disabled, wait for badline to pass + + rts + + +__jd_check2: + + +jiffydos_hide_sprites: + + // XXX implement + + rts + + +jiffydos_restore_sprites: + + // XXX implement + + rts + + +.function SAME_PAGE_CHECK(label_1, label_2) +{ +#if !PASS_SIZETEST + return (label_1 - label_1 % 256) == (label_2 - label_2 % 256) +#else + return true +#endif +} + +.if (!SAME_PAGE_CHECK(__jd_check1, __jd_check2)) +{ + // To meet the strict JiffyDOS timing, we need to make sure + // it does not span across multiple pages, as this would add + // 1 cycle to some jump instructions - maybe this wont cause + // problems, but better safe than sorry. + + .error "JiffyDOS code can't span across multiple pages" +} + + +#endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s new file mode 100644 index 00000000..843dc076 --- /dev/null +++ b/c64/kernal/iec/save_iec.s @@ -0,0 +1,37 @@ + +// +// IEC part of the SAVE routine +// + + +#if CONFIG_IEC + + +save_iec: + +/* + // Display SAVING + // XXX jsr lvs_display_saving + + // Call device to LISTEN + lda FA + jsr LISTEN + bcs save_iec_dev_not_found // XXX redirecto to load + + // Open channel XXX (reserved for file writing) + lda #XXX + jsr iec_cmd_open + bcs // XXX error + + // Send file name + jsr lvs_send_file_name + bcs load_iec_error + + // XXX finish the implementation + + rts +*/ + + STUB_IMPLEMENTATION() + +#endif // CONFIG_IEC diff --git a/c64/kernal/iostack/f4a5.load.s b/c64/kernal/iostack/f4a5.load.s index 53d31e53..2f173766 100644 --- a/c64/kernal/iostack/f4a5.load.s +++ b/c64/kernal/iostack/f4a5.load.s @@ -16,7 +16,6 @@ // On exit, $YYXX is the highest address into which data // will have been placed. - // XXX add VERIFY support LOAD: diff --git a/c64/kernal/iostack/f5ed.save.s b/c64/kernal/iostack/f5ed.save.s index 79ea33d6..d8d053bf 100644 --- a/c64/kernal/iostack/f5ed.save.s +++ b/c64/kernal/iostack/f5ed.save.s @@ -10,4 +10,21 @@ // SAVE: - STUB_IMPLEMENTATION() + + // Reset status + jsr kernalstatus_reset + +#if CONFIG_MEMORY_MODEL_60K + // We need our helpers to get to filenames under ROMs or IO area + jsr install_ram_routines +#endif + + // Check whether we support the requested device + lda FA + +#if CONFIG_IEC + jsr iec_check_devnum_lvs + bcc_far save_iec +#endif + + jmp lvs_illegal_device_number diff --git a/c64/kernal/iostack/findfls.s b/c64/kernal/iostack/findfls.s index 874fad51..9da38026 100644 --- a/c64/kernal/iostack/findfls.s +++ b/c64/kernal/iostack/findfls.s @@ -7,7 +7,6 @@ find_fls: ldy LDTND - beq find_fls_not_found // table empty !: dey bmi find_fls_not_found // no more entries diff --git a/c64/kernal/iostack/lvs_helpers.s b/c64/kernal/iostack/lvs_helpers.s index 60157491..8eef1932 100644 --- a/c64/kernal/iostack/lvs_helpers.s +++ b/c64/kernal/iostack/lvs_helpers.s @@ -73,16 +73,32 @@ lvs_handle_byte_verify: #if CONFIG_MEMORY_MODEL_60K - // XXX implement this part + // Store byte for comparing + sta TBTCNT + + // Retrieve byte from under ROMs and IO if required + php + sei + ldx #$33 + stx $01 + ldy #0 + lda (STAL),y + ldx #$37 + stx $01 + plp + + // Compare with stored byte + cmp TBTCNT #else ldy #0 cmp (STAL),y - beq lvs_handle_byte_load_verify_end #endif + beq lvs_handle_byte_load_verify_end + sec rts diff --git a/c64/kernal/rs232/close_rs232.s b/c64/kernal/rs232/close_rs232.s index a2d6457e..3362daaa 100644 --- a/c64/kernal/rs232/close_rs232.s +++ b/c64/kernal/rs232/close_rs232.s @@ -7,9 +7,33 @@ #if HAS_RS232 +#if CONFIG_MEMORY_MODEL_60K + .error "CONFIG_MEMORY_MODEL_60K is not compatible with RS-232 memory allocation code" +#endif + + close_rs232: - // XXX provide implementation for both UP2400 and UP960 + // First check how many RS-232 channels are currently allocated. + // If more than one, skip deallocation (other channels still uses the buffer). + + jsr rs232_count_channels + bcs close_rs232_end + + // Deallocate buffer + + inc MEMSIZK+1 + inc MEMSIZK+1 + + // XXX is this needed? check with original ROM what it actually does + + lda #$00 + sta ROBUF+0 + sta ROBUF+1 + sta RIBUF+0 + sta RIBUF+1 + +close_rs232_end: jmp close_remove_from_table diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s index 82d64230..a052d9a5 100644 --- a/c64/kernal/rs232/open_rs232.s +++ b/c64/kernal/rs232/open_rs232.s @@ -7,9 +7,40 @@ #if HAS_RS232 +#if CONFIG_MEMORY_MODEL_60K + .error "CONFIG_MEMORY_MODEL_60K is not compatible with RS-232 memory allocation code" +#endif + + open_rs232: - - // XXX provide implementation for both UP2400 and UP9600 + + // First check how many RS-232 channels are currently allocated. + // If more than one, skip allocation (already allocated). + + jsr rs232_count_channels + bcs open_rs232_end + + // Allocate buffer + + lda MEMSIZK+0 + sta ROBUF+0 + sta RIBUF+0 + + dec MEMSIZK+1 + lda MEMSIZK+1 + sta ROBUF+1 // XXX RIBUF or ROBUF? + + dec MEMSIZK+1 + lda MEMSIZK+1 + sta RIBUF+1 // XXX RIBUF or ROBUF? + + lda #$00 + sta RIDBE + sta RIDBS + sta RODBS + sta RODBE + +open_rs232_end: jmp open_done_success diff --git a/c64/kernal/rs232/rs232_count_channels.s b/c64/kernal/rs232/rs232_count_channels.s new file mode 100644 index 00000000..e0169451 --- /dev/null +++ b/c64/kernal/rs232/rs232_count_channels.s @@ -0,0 +1,28 @@ + +// +// Sets .X to number of open RS-232 channels +// Sets Carry if more than one is open + + +#if HAS_RS232 + + +rs232_count_channels: + + ldx #$00 + ldy LDTND +!: + dey + bmi close_rs232_search_done + lda FAT, y + cmp #$02 + bne !- + inx + bpl !- // branch always + + cpx #$02 + + rts + + +#endif From 65c27f4dd492e310050cbdfc17ad969a7a8bdeb2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 31 Oct 2019 17:33:30 +0100 Subject: [PATCH 026/105] IEC support is now optional --- CONFIG.md | 8 ++++++ c64/,,config_generic.s | 2 +- c64/,,config_mega65.s | 2 +- c64/,,config_testing.s | 2 +- c64/,,config_ultimate64.s | 2 +- c64/kernal/iec/iec_send_file_name.s | 41 +++++++++++++++++++++++++++++ c64/kernal/iec/load_iec.s | 2 +- c64/kernal/iec/open_iec.s | 2 +- c64/kernal/iec/save_iec.s | 2 +- c64/kernal/init/fda3.ioinit.s | 8 +++++- c64/kernal/iostack/f1ca.chrout.s | 2 +- c64/kernal/iostack/lvs_helpers.s | 27 ------------------- 12 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 c64/kernal/iec/iec_send_file_name.s diff --git a/CONFIG.md b/CONFIG.md index 238193df..dc56c121 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -95,6 +95,14 @@ Uses RAM under BASIC, I/O and KERNAL, takes over `$C000`-`$CFFF` area requires s Comparing to standard memoryy model, it needs about 180 bytes in BASIC segment and 80 bytes in KERNAL segment - at the moment of doing the test, these values are expected to change often. +## I/O devices + +### `CONFIG_IEC` + +Adds support for the IEEC bus - for serial printers, disk drives, etc. + +Needs over 1000 bytes in KERNAL segment. If unsure - enable. + ## Multiple SID support The SID is a sound chip - original machine had one installed. However, mods exists to add more of them for improved sound capabilitiee. Emulators and FPGA machines typically allow to simulate more than one too. Unfortunately, there is no standard regarding how these additional chips are visible in the processor address space, and there is no sane way to detect it - thus, it has to be configurable. diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 133318f8..a860d7b5 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -40,7 +40,7 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now +#define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 146e5bb4..07e095b3 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -42,7 +42,7 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now +#define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 14953bc8..b3180033 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -41,7 +41,7 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now +#define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 11c5a174..c10abe2f 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -40,7 +40,7 @@ // I/O devices -#define CONFIG_IEC // please keep enabled for now +#define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // please keep disabled for now diff --git a/c64/kernal/iec/iec_send_file_name.s b/c64/kernal/iec/iec_send_file_name.s new file mode 100644 index 00000000..b0adc685 --- /dev/null +++ b/c64/kernal/iec/iec_send_file_name.s @@ -0,0 +1,41 @@ + +// +// Sends file (stream) name to IEC device +// + + +#if CONFIG_IEC + + +iec_send_file_name: + ldy #0 + +iec_send_file_name_loop: + cpy FNLEN + beq iec_send_file_name_done + +#if CONFIG_MEMORY_MODEL_60K + ldx # Date: Thu, 31 Oct 2019 19:09:17 +0100 Subject: [PATCH 027/105] show the most important compiled-in features on startup screen --- CONFIG.md | 8 +++- c64/,,config_generic.s | 1 + c64/,,config_mega65.s | 1 + c64/,,config_testing.s | 7 +-- c64/,,config_ultimate64.s | 1 + c64/aliases/,aliases_config.s | 71 ++++++++++++++++++++++++++++- c64/basic/,imports.s | 4 ++ c64/basic/init/initmsg_real.s | 53 +++++++++++++++------ c64/basic/init/startup_banner.s | 2 +- c64/kernal/assets/kernal_messages.s | 21 +++++++-- c64/kernal/iec/iec_jiffydos.s | 6 +-- c64/kernal/print/print_features.s | 14 ++++++ 12 files changed, 161 insertions(+), 28 deletions(-) create mode 100644 c64/kernal/print/print_features.s diff --git a/CONFIG.md b/CONFIG.md index dc56c121..b1bee070 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -223,11 +223,17 @@ Select startup banner - either a simple one, or with some colorful elements. `CO Richer banners need more BASIC segment, varies between brands. +### `CONFIG_SHOW_FEATURES` + +If enabled, shows the most important compiled-in features on the startup screen. + +It is recommended to keep it enabled for informational purposes. + ### `CONFIG_BANNER_PAL_NTSC` If enabled, prints video system on startup banner. Eye candy only. -Feature needs some bytes in BASIC (depending on banner type) and about 25 bytes in KERNAL segment. +Feature needs few bytes in BASIC and about 25 bytes in KERNAL segment. ## Debug options diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index a860d7b5..6e208cbf 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -115,6 +115,7 @@ // #define CONFIG_BANNER_SIMPLE #define CONFIG_BANNER_FANCY // #define CONFIG_BANNER_BRAND +#define CONFIG_SHOW_FEATURES #define CONFIG_SHOW_PAL_NTSC diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 07e095b3..e416562c 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -117,6 +117,7 @@ // #define CONFIG_BANNER_SIMPLE // #define CONFIG_BANNER_FANCY #define CONFIG_BANNER_BRAND +#define CONFIG_SHOW_FEATURES // #define CONFIG_SHOW_PAL_NTSC diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index b3180033..92e982eb 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -113,10 +113,11 @@ // Eye candy // #define CONFIG_COLORS_BRAND -// #define CONFIG_BANNER_SIMPLE -#define CONFIG_BANNER_FANCY +#define CONFIG_BANNER_SIMPLE +// #define CONFIG_BANNER_FANCY // #define CONFIG_BANNER_BRAND -// #define CONFIG_SHOW_PAL_NTSC +#define CONFIG_SHOW_FEATURES +#define CONFIG_SHOW_PAL_NTSC // Debug options diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index c10abe2f..2b80c95e 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -115,6 +115,7 @@ // #define CONFIG_BANNER_SIMPLE #define CONFIG_BANNER_FANCY // #define CONFIG_BANNER_BRAND +#define CONFIG_SHOW_FEATURES #define CONFIG_SHOW_PAL_NTSC diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index 23f5d173..2725bc9e 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -3,6 +3,8 @@ // Various configuration dependent aliases/macros/checks // +.encoding "petscii_upper" + // Check that platform configuration is correct @@ -146,8 +148,8 @@ .error "CONFIG_BANNER_BRAND is not supported for your CONFIG_BRAND_*" #endif -#if CONFIG_BANNER_BRAND && CONFIG_BRAND_MEGA_65 && CONFIG_SHOW_PAL_NTSC - .error "MEGA65 brand banner does not support showing PAL/NTSC" +#if CONFIG_MB_MEGA_65 && CONFIG_SHOW_PAL_NTSC + .error "MEGA65 can switch PAL/NTSC during run-time, CONFIG_SHOW_PAL_NTSC makes no sense" #endif } @@ -261,3 +263,68 @@ STUB_IMPLEMENTATION_RTS() #endif } + + +// Function for printing out build features + +.var feature_new_line = false + +.function ADD_FEATURE(current_features, new_feature) +{ + .var features_str = current_features + + .if (!feature_new_line && features_str.size() > 0) + { + .eval features_str = features_str + ", " + } + + .if (feature_new_line) + { + .eval feature_new_line = false + .eval features_str = features_str + @"\r" + } + + .return features_str + new_feature +} + +.function BUILD_FEATURES_STR() +{ + .var features_str = "" + +#if CONFIG_TAPE_NORMAL + .eval features_str = ADD_FEATURE(features_str, "TAPE NORMAL") +#elif CONFIG_TAPE_TURBO + .eval features_str = ADD_FEATURE(features_str, "TAPE TURBO") +#elif CONFIG_TAPE_NORMAL && CONFIG_TAPE_TURBO + .eval features_str = ADD_FEATURE(features_str, "TAPE NORMAL+TURBO") +#endif + + .eval feature_new_line = true + +#if CONFIG_IEC + .eval features_str = ADD_FEATURE(features_str, "IEC") +#endif +#if CONFIG_IEC_JIFFYDOS + .eval features_str = ADD_FEATURE(features_str, "JIFFY") +#endif + + .eval feature_new_line = true + +#if CONFIG_RS232_UP2400 + .eval features_str = ADD_FEATURE(features_str, "UP2400") +#endif + +#if CONFIG_RS232_UP2400 + .eval features_str = ADD_FEATURE(features_str, "UP9600") +#endif + +#if CONFIG_KEYBOARD_C128 + .eval features_str = ADD_FEATURE(features_str, "KBD 128") +#endif + +#if CONFIG_KEYBOARD_C65 + .eval features_str = ADD_FEATURE(features_str, "KBD 65") +#endif + + .return features_str +} diff --git a/c64/basic/,imports.s b/c64/basic/,imports.s index bc90a4cd..525459f4 100644 --- a/c64/basic/,imports.s +++ b/c64/basic/,imports.s @@ -19,6 +19,10 @@ .label print_return = KERNAL.print_return .label print_space = KERNAL.print_space +#if CONFIG_SHOW_FEATURES +.label print_features = KERNAL.print_features +#endif + #if CONFIG_SHOW_PAL_NTSC .label print_pal_ntsc = KERNAL.print_pal_ntsc #endif diff --git a/c64/basic/init/initmsg_real.s b/c64/basic/init/initmsg_real.s index bd9494c5..ffe6c2b9 100644 --- a/c64/basic/init/initmsg_real.s +++ b/c64/basic/init/initmsg_real.s @@ -11,7 +11,7 @@ initmsg_real: jsr STROUT ldx #$02 - ldy #$02 + ldy #$04 jsr plot_set lda #rom_revision_basic_string jsr STROUT - ldx #$05 - ldy #$00 + ldx #$04 + ldy #$0A jsr plot_set -#if CONFIG_SHOW_PAL_NTSC - jsr print_pal_ntsc -#endif - jsr initmsg_bytes_free - ldx #$07 + ldx #$05 ldy #$00 +#if CONFIG_SHOW_PAL_NTSC && CONFIG_SHOW_FEATURES + jsr plot_set + jsr print_features + jmp print_pal_ntsc +#elif CONFIG_SHOW_PAL_NTSC + jsr plot_set + jmp print_pal_ntsc +#elif CONFIG_SHOW_FEATURES + jsr plot_set + jmp print_features +#else jmp plot_set +#endif #elif CONFIG_BANNER_BRAND && CONFIG_BRAND_MEGA_65 @@ -88,8 +104,17 @@ initmsg_real: jsr initmsg_bytes_free +#if CONFIG_SHOW_FEATURES + ldx #$04 + ldy #$00 + jsr plot_set + jsr print_features + jmp print_return +#else ldx #$05 ldy #$00 jmp plot_set +#endif + #endif diff --git a/c64/basic/init/startup_banner.s b/c64/basic/init/startup_banner.s index 6c3aaf37..8736df64 100644 --- a/c64/basic/init/startup_banner.s +++ b/c64/basic/init/startup_banner.s @@ -24,7 +24,7 @@ startup_banner: #if CONFIG_BANNER_SIMPLE - .text " " + .text " " BANNER_TEXT() .byte $00 diff --git a/c64/kernal/assets/kernal_messages.s b/c64/kernal/assets/kernal_messages.s index eb9723d9..91d2ab11 100644 --- a/c64/kernal/assets/kernal_messages.s +++ b/c64/kernal/assets/kernal_messages.s @@ -25,6 +25,9 @@ .label __MSG_KERNAL_PANIC_ROM_MISMATCH = __msg_kernalpanic_rom_mismatch - __msg_kernal_first #endif +#if CONFIG_SHOW_FEATURES +.label __MSG_KERNAL_FEATURES = __msg_kernalfeatures - __msg_kernal_first +#endif __msg_kernal_first: @@ -59,12 +62,14 @@ __msg_kernalto_hex: #if CONFIG_SHOW_PAL_NTSC __msg_kernalpal: - .text "PAL," - .byte $80 + $20 // end of string mark + space + .text "PAL" + .byte $0D + .byte $80 + $0D // end of string mark + return __msg_kernalntsc: - .text "NTSC," - .byte $80 + $20 // end of string mark + space + .text "NTSC" + .byte $0D + .byte $80 + $0D // end of string mark + return #endif // CONFIG_SHOW_PAL_NTSC @@ -79,3 +84,11 @@ __msg_kernalpanic_rom_mismatch: .byte $80 + $48 // end of string mark + 'H' #endif // CONFIG_PANIC_SCREEN + +#if CONFIG_SHOW_FEATURES + +__msg_kernalfeatures: + .text BUILD_FEATURES_STR() + .byte $80 + $0D // end of string mark + return + +#endif // CONFIG_SHOW_FEATURES diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s index db093cdf..a17ff764 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -72,10 +72,10 @@ jiffydos_restore_sprites: .function SAME_PAGE_CHECK(label_1, label_2) { -#if !PASS_SIZETEST - return (label_1 - label_1 % 256) == (label_2 - label_2 % 256) +#if PASS_SIZETEST + .return (label_1 - label_1 % 256) == (label_2 - label_2 % 256) #else - return true + .return true #endif } diff --git a/c64/kernal/print/print_features.s b/c64/kernal/print/print_features.s new file mode 100644 index 00000000..8c958a53 --- /dev/null +++ b/c64/kernal/print/print_features.s @@ -0,0 +1,14 @@ + +// +// Print configured features on startup banner +// + +#if CONFIG_SHOW_FEATURES + +print_features: + + ldx #__MSG_KERNAL_FEATURES +!: + jmp print_kernal_message + +#endif // CONFIG_SHOW_FEATURES From a43a5955d52c1dd63bd8e47e5a78ccada1398af2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 31 Oct 2019 20:50:54 +0100 Subject: [PATCH 028/105] initial import of turbo tape routine --- c64/aliases/,aliases_ram_lowmem.s | 4 +- c64/basic/init/initmsg_real.s | 4 +- c64/kernal/tape/load_tape_turbo.s | 149 +++++++++++++++++++++++++++++- 3 files changed, 151 insertions(+), 6 deletions(-) diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 68b92f40..c7e03e0c 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -93,7 +93,7 @@ .label LDTND = $98 // number of entries in LAT / FAT / SAT tables .label DFLTN = $99 // default input device .label DFLTO = $9A // default output device - .label PRTY = $9B // -- NOT IMPLEMENTED -- + .label PRTY = $9B // tape storage for parity/checksum .label DPSW = $9C // -- NOT IMPLEMENTED -- .label MSGFLG = $9D // bit 6 = error messages, bit 7 = control message .label PTR1 = $9E // -- NOT IMPLEMENTED -- @@ -131,7 +131,7 @@ .label SA = $B9 // current secondary address .label FA = $BA // current device number .label FNADDR = $BB // $BB-$BC current file name pointer - .label ROPRTY = $BD // -- NOT IMPLEMENTED -- + .label ROPRTY = $BD // tape / RS-232 temporary storage .label FSBLK = $BE // -- NOT IMPLEMENTED -- .label MYCH = $BF // -- NOT IMPLEMENTED -- .label CAS1 = $C0 // -- NOT IMPLEMENTED -- diff --git a/c64/basic/init/initmsg_real.s b/c64/basic/init/initmsg_real.s index ffe6c2b9..a0ffda23 100644 --- a/c64/basic/init/initmsg_real.s +++ b/c64/basic/init/initmsg_real.s @@ -24,7 +24,7 @@ initmsg_real: jsr initmsg_bytes_free - ldx #$06 + ldx #$07 ldy #$00 #if CONFIG_SHOW_PAL_NTSC && CONFIG_SHOW_FEATURES jsr plot_set @@ -72,8 +72,8 @@ initmsg_real: jsr initmsg_bytes_free - ldx #$05 ldy #$00 + ldx #$07 #if CONFIG_SHOW_PAL_NTSC && CONFIG_SHOW_FEATURES jsr plot_set jsr print_features diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index a6d7b1b1..89463a45 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -3,12 +3,157 @@ // Tape (turbo) part of the LOAD routine // +// Based on routine by enthusi/Onslaught, found here: +// - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source + #if CONFIG_TAPE_TURBO + + +tape_ask_play: + + sei // timing is critical for tape loading + + lda #$1D + sta CPU_R6510 // motor on XXX make it more system friendly + + ror VIC_SCROLY // screen blanked to VIC_EXTCOL color XXX make it more system friendly + + // XXX finish the implementation + + rts + +tape_load_success: + + rol VIC_SCROLY // screen back on + lda #$37 // default setting + sta CPU_R6510 + + // XXX finish this routine + + rts + +tape_load_error: + + // XXX finish this routine + + rts + + load_tape_turbo: - STUB_IMPLEMENTATION() + + // XXX if VERIFY asked - error + + ldy #$00 + sty PRTY // initial checksum value + + jsr tape_ask_play + + sty CIA2_TIMAHI // .Y still 0 + lda #$FE // timer threshold for TurboTape + sta CIA2_TIMALO + + // Read file header + + jsr tape_turbo_sync // .X gets set to 0 + + stx STAL+0 // instead of a later lda, sta + jsr tape_turbo_get_byte // important trick - save time/bytes by using y-indexing + tay +!: + jsr tape_turbo_get_byte + sta STAL+1,x // .X still 0 + inx + cpx #$03 + bne !- + + // Read file payload + + jsr tape_turbo_sync // .X gets set to 0 + + // FALLTROUGH + +load_tape_turbo_loop: + + jsr tape_turbo_get_byte + + dec CPU_R6510 // to load below i/o area! + + sta (STAL),y + eor PRTY + sta PRTY + + inc CPU_R6510 + + iny + bne !+ + inc STAL+1 +!: + cpy MEMUSS+0 + lda STAL+1 + sbc MEMUSS+1 + bcc load_tape_turbo_loop + + // Verify the checksum + + jsr tape_turbo_get_byte + cmp PRTY + beq_far tape_load_success + jmp tape_load_error -#endif +tape_turbo_get_byte: + + lda #$01 + sta ROPRTY // init the to-be-read byte with 1 +!: + jsr tape_turbo_get_bit + rol ROPRTY + bcc !- // is the initial 1 shifted into carry already? + lda ROPRTY // much nicer than ldx #8: dex: loop + + rts + + +tape_turbo_get_bit: + + lda #$10 +!: + bit CIA2_ICR + beq !- // busy loop to detect signal + lda CIA2_ICR + pha + lda #$19 + sta CIA2_CRA + pla + sta VIC_EXTCOL // use bitvalue as d020 effect (I love that one) + lsr + + rts + + +tape_turbo_sync: + + jsr tape_turbo_get_bit + rol ROPRTY + lda ROPRTY + cmp #$02 + bne tape_turbo_sync + ldx #$09 // 9,8,... is real turboTape +!: // I sometimes used 8,7,6... to avoid it being listed in vice :) + jsr tape_turbo_get_byte + cmp #$02 + beq !- +!: + cpx ROPRTY + bne tape_turbo_sync + jsr tape_turbo_get_byte + dex + bne !- + + rts + + +#endif // CONFIG_TAPE_TURBO From 46aacc4ef0926856e320271fa46f776b748dd2fd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 31 Oct 2019 21:25:14 +0100 Subject: [PATCH 029/105] added test files for disk/tape load --- Makefile | 17 +++++++++++------ testsuite/testdisk.d64 | Bin 0 -> 174848 bytes testsuite/testtape-normal.tap | Bin 0 -> 69418 bytes testsuite/testtape-turbo.tap | Bin 0 -> 23571 bytes 4 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 testsuite/testdisk.d64 create mode 100644 testsuite/testtape-normal.tap create mode 100644 testsuite/testtape-turbo.tap diff --git a/Makefile b/Makefile index 2988e675..8d4f2da4 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,9 @@ +# Test files + +TESTDISK = testsuite/testdisk.d64 +TESTTAPE = testsuite/testtape-turbo.tap + # Source files SRCDIR_COMMON = c64/aliases @@ -226,28 +231,28 @@ build/newc65.rom: build/kernal_mega65.rom build/basic_mega65.rom build/chargen.r test: test_generic test_generic: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs - x64 -kernal build/kernal_generic.rom -basic build/basic_generic.rom -moncommands build/symbols_generic.vs -8 empty.d64 + x64 -kernal build/kernal_generic.rom -basic build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_generic_x128: build/kernal_generic.rom build/basic_generic.rom build/symbols_generic.vs - x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -8 empty.d64 + x128 -go64 -kernal64 build/kernal_generic.rom -basic64 build/basic_generic.rom -moncommands build/symbols_generic.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_testing: build/kernal_testing.rom build/basic_testing.rom build/symbols_testing.vs - x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -8 empty.d64 + x64 -kernal build/kernal_testing.rom -basic build/basic_testing.rom -moncommands build/symbols_testing.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_mega65: build/kernal_mega65.rom build/basic_mega65.rom build/symbols_mega65.vs - x64 -kernal build/kernal_mega65.rom -basic build/basic_mega65.rom -moncommands build/symbols_mega65.vs -8 empty.d64 + x64 -kernal build/kernal_mega65.rom -basic build/basic_mega65.rom -moncommands build/symbols_mega65.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_mega65_xemu: build/newc65.rom ../xemu/build/bin/xmega65.native -dmarev 2 -forcerom -loadrom build/newc65.rom test_ultimate64: build/kernal_ultimate64.rom build/basic_ultimate64.rom build/symbols_ultimate64.vs - x64 -kernal build/kernal_ultimate64.rom -basic build/basic_ultimate64.rom -moncommands build/symbols_ultimate64.vs -8 empty.d64 + x64 -kernal build/kernal_ultimate64.rom -basic build/basic_ultimate64.rom -moncommands build/symbols_ultimate64.vs -1 $(TESTTAPE) -8 $(TESTDISK) test_hybrid: build/kernal_hybrid.rom build/symbols_hybrid.vs @echo @echo $(HYBRID_WARNING) @echo - x64 -kernal build/kernal_hybrid.rom -moncommands build/symbols_hybrid.vs -8 empty.d64 + x64 -kernal build/kernal_hybrid.rom -moncommands build/symbols_hybrid.vs -1 $(TESTTAPE) -8 $(TESTDISK) @echo @echo $(HYBRID_WARNING) @echo diff --git a/testsuite/testdisk.d64 b/testsuite/testdisk.d64 new file mode 100644 index 0000000000000000000000000000000000000000..a455d2ee8fc3863fbc0022af6383ad7b1d85193c GIT binary patch literal 174848 zcmeI$yN(=16b9h3EX2%kF}t=|?k*CXj4ca^$N}n|uGwyOw%h89NBaT}2zUq}A>tK` z2zUkpLc~ju@Elx*+TL9R$PvhvgKwk`rca-$>Tf3abwcnVK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7csfoCDGx41Gp zm@UHBaoD!8YR5iR?WXLP;iK70`EHDd?NG&HQy-^TH?gdbntC`5$FrAnHQ!hlbr&C| zu5F5C_;mKl)U&Npm*O_XO>r9Av5WmGH7R^Kdo`EWU3(IXW>u$Vh)3O69;NWj?ArNe zT`G>_(8eZh`l+_Y^OexB`3O((^1>f?E(Dw?v7W3$?% zqPZJ>pY31nxNf`rB14t(k%wXvH*MYY&w|(<1PBlyK!5;&=SpDj#=-phl%m@8Svcy` z6a?38>cjo{ja(_>gR_X2%l%MvcUE27_qWR&pK|Ey!!W-&bq_g%o%QD@H}yK*51-9n z&xLK(<`qxsz9=8&xHopG3}4L;rj`fwkaFIPXA2Eg*KYgp?fi{gD%-fN&$C)yu1v*H zg`ehcPEChncY3kUgQCkz-tP0cy1eDx@XP$I{LGZ_Qqir)O+Iq5@&IkhP^-4dQeZ4@$NtK z(_h)E%kgR%9xdL>^=(zJs%1PJhl_-^s_IRdLt4&gsVSG?i^Z*JnWi0&sv)l0aZ|=F zo#X_#4BstcF4lc)+U<0Ji-Ba9yN9k=uj^I#Ve$UuIi{)NkaxeImHzwuZ~saWZtixs z{?E1l$FJA+e%rlxefQ*Rf495(q-$@tyYlaANd1t9to`xh%g?=gk3THVzC4|O!|wCF zkO#7FjA$0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 Y2oNAZfB*pk1PBlyK!5-N0v7^*0vd%FmH+?% literal 0 HcmV?d00001 diff --git a/testsuite/testtape-normal.tap b/testsuite/testtape-normal.tap new file mode 100644 index 0000000000000000000000000000000000000000..be831cac8e0aa7865c45f6daf0d035ee291d7c87 GIT binary patch literal 69418 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 N7zIXwQQ$wXz+aUBL8brz literal 0 HcmV?d00001 From c32fbadc7c8823669b00a4abfe42255751f47ac1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 31 Oct 2019 22:42:44 +0100 Subject: [PATCH 030/105] more work on tape support --- c64/kernal/assets/kernal_messages.s | 13 +++++ c64/kernal/init/fda3.ioinit.s | 5 +- c64/kernal/iostack/lvs_helpers.s | 11 ++++ c64/kernal/screen/screen_blank.s | 28 ++++++++++ c64/kernal/tape/load_tape_turbo.s | 42 ++------------ c64/kernal/tape/tape_common.s | 86 +++++++++++++++++++++++++++++ 6 files changed, 147 insertions(+), 38 deletions(-) create mode 100644 c64/kernal/screen/screen_blank.s create mode 100644 c64/kernal/tape/tape_common.s diff --git a/c64/kernal/assets/kernal_messages.s b/c64/kernal/assets/kernal_messages.s index 91d2ab11..642ee2bd 100644 --- a/c64/kernal/assets/kernal_messages.s +++ b/c64/kernal/assets/kernal_messages.s @@ -15,6 +15,10 @@ .label __MSG_KERNAL_FROM_HEX = __msg_kernalfrom_hex - __msg_kernal_first .label __MSG_KERNAL_TO_HEX = __msg_kernalto_hex - __msg_kernal_first +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +.label __MSG_KERNAL_PRESS_PLAY = __msg_kernalplay - __msg_kernal_first +#endif + #if CONFIG_SHOW_PAL_NTSC .label __MSG_KERNAL_PAL = __msg_kernalpal - __msg_kernal_first .label __MSG_KERNAL_NTSC = __msg_kernalntsc - __msg_kernal_first @@ -59,6 +63,15 @@ __msg_kernalto_hex: .text " TO " .byte $80 + $24 // end of string mark + '$' +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + +__msg_kernalplay: + .byte $0D + .text "PRESS PLAY ON TAPE" + .byte $80 + $0D // end of string mark + return + +#endif + #if CONFIG_SHOW_PAL_NTSC __msg_kernalpal: diff --git a/c64/kernal/init/fda3.ioinit.s b/c64/kernal/init/fda3.ioinit.s index 594c9d07..23687e37 100644 --- a/c64/kernal/init/fda3.ioinit.s +++ b/c64/kernal/init/fda3.ioinit.s @@ -16,10 +16,11 @@ IOINIT: // (https://www.c64-wiki.com/wiki/Zeropage) // Work around for VICE bug: Writing $00 before $01 results in rubbish in $01 // after. https://sourceforge.net/p/vice-emu/bugs/1057/ + lda #$27 - ldx #$2F + ldx #$EF sta CPU_R6510 - stx CPU_D6510 + stx CPU_D6510 // [CM64] page 4 // Silence the SID chips, depending on the configuration diff --git a/c64/kernal/iostack/lvs_helpers.s b/c64/kernal/iostack/lvs_helpers.s index 58cf3d16..9298b6e3 100644 --- a/c64/kernal/iostack/lvs_helpers.s +++ b/c64/kernal/iostack/lvs_helpers.s @@ -91,7 +91,9 @@ lvs_advance_pointer: clc rts + lvs_display_searching_for: + lda MSGFLG bpl lvs_display_end @@ -117,7 +119,9 @@ lvs_display_searching_for: lvs_display_end: rts + lvs_display_loading_verifying: + // Display LOADING / VERIFYING and start address lda MSGFLG bpl lvs_display_end @@ -132,6 +136,7 @@ lvs_display_loading_verifying: // FALLTHROUGH lvs_display_start_addr: + ldx #__MSG_KERNAL_FROM_HEX !: jsr print_kernal_message @@ -142,6 +147,7 @@ lvs_display_start_addr: jmp print_hex_byte lvs_display_done: + // Display end address lda MSGFLG bpl lvs_display_end @@ -150,14 +156,18 @@ lvs_display_done: jmp !- 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 @@ -165,6 +175,7 @@ lvs_return_last_address: // FALLTHROUGH lvs_success_end: + clc rts diff --git a/c64/kernal/screen/screen_blank.s b/c64/kernal/screen/screen_blank.s new file mode 100644 index 00000000..a0c89883 --- /dev/null +++ b/c64/kernal/screen/screen_blank.s @@ -0,0 +1,28 @@ + +// +// Helper routines to blank/show screen +// + + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + +screen_blank: + + lda VIC_SCROLY + and #($FF - $10) + sta VIC_SCROLY + + rts + + +screen_show: + + lda VIC_SCROLY + ora #$10 + sta VIC_SCROLY + + rts + + +#endif diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 89463a45..1e9fe9b9 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -10,53 +10,23 @@ #if CONFIG_TAPE_TURBO - - -tape_ask_play: - - sei // timing is critical for tape loading - - lda #$1D - sta CPU_R6510 // motor on XXX make it more system friendly - - ror VIC_SCROLY // screen blanked to VIC_EXTCOL color XXX make it more system friendly - - // XXX finish the implementation - - rts - -tape_load_success: - - rol VIC_SCROLY // screen back on - lda #$37 // default setting - sta CPU_R6510 - - // XXX finish this routine - - rts - -tape_load_error: - - // XXX finish this routine - - rts - - load_tape_turbo: - // XXX if VERIFY asked - error + jsr tape_ditch_verify // only LOAD is supported, no VERIFY ldy #$00 sty PRTY // initial checksum value - jsr tape_ask_play - - sty CIA2_TIMAHI // .Y still 0 + sty CIA2_TIMAHI lda #$FE // timer threshold for TurboTape sta CIA2_TIMALO + jsr tape_ask_play + // Read file header + ldy #$00 + jsr tape_turbo_sync // .X gets set to 0 stx STAL+0 // instead of a later lda, sta diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s new file mode 100644 index 00000000..935915aa --- /dev/null +++ b/c64/kernal/tape/tape_common.s @@ -0,0 +1,86 @@ + +// +// Common routines for tape support +// + + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + +tape_ditch_verify: + + lda VERCKK + bne !+ + rts +!: + pla + pla + jmp lvs_device_not_found_error + + +tape_motor_off: + + lda CPU_R6510 + ora #$20 + sta CPU_R6510 + + rts + + +tape_motor_on: + + lda CPU_R6510 + and #($FF - $20) + sta CPU_R6510 + + rts + + +tape_ask_play: + + sei // timing is critical for tape loading + + jsr tape_motor_off + + ldx #__MSG_KERNAL_PRESS_PLAY + jsr print_kernal_message + +tape_wait_button_loop: + + jsr udtim_keyboard + jsr STOP + bcc !+ + + // Stop key pressed + pla + pla + cli + jmp kernalerror_ROUTINE_TERMINATED +!: + lda CPU_R6510 + and #$10 // check for pressed button + bne tape_wait_button_loop + + jsr screen_blank + jsr tape_motor_on + + rts + + +tape_load_success: + + jsr screen_show + jsr tape_motor_off + + jmp lvs_success_end + + +tape_load_error: + + jsr screen_show + jsr tape_motor_off + + jmp lvs_load_verify_error + + +#endif From e145bb6c86998a6bdc616822e00b7ba60c4cecd4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 1 Nov 2019 09:54:32 +0100 Subject: [PATCH 031/105] one more init rework, turbo tape starts working --- CONFIG.md | 10 +- STATUS.md | 11 +- c64/,,config_generic.s | 2 +- c64/,,config_mega65.s | 2 +- c64/,,config_testing.s | 2 +- c64/,,config_ultimate64.s | 2 +- c64/aliases/,aliases_config.s | 2 - c64/kernal/init/fce2.hw_entry_reset.s | 9 +- c64/kernal/init/fd50.ramtas.jmp.s | 6 - .../init/{ramtas_real.s => fd50.ramtas.s} | 84 +++++------ c64/kernal/init/fda3.ioinit.s | 139 +++++++++++------- c64/kernal/init/setup_pal_ntsc.s | 8 +- c64/kernal/tape/load_tape_turbo.s | 16 +- c64/kernal/tape/tape_common.s | 6 +- 14 files changed, 168 insertions(+), 131 deletions(-) delete mode 100644 c64/kernal/init/fd50.ramtas.jmp.s rename c64/kernal/init/{ramtas_real.s => fd50.ramtas.s} (55%) diff --git a/CONFIG.md b/CONFIG.md index b1bee070..ffef262c 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -103,6 +103,12 @@ Adds support for the IEEC bus - for serial printers, disk drives, etc. Needs over 1000 bytes in KERNAL segment. If unsure - enable. +### `CONFIG_TAPE_TURBO` + +Adds a minimal turbo tape support - just LOAD command (device 7, like on _Action Replay_ and _Final_ cartridges) + +Needs about 350 bytes in KERNAL segment. If unsure - enable. + ## Multiple SID support The SID is a sound chip - original machine had one installed. However, mods exists to add more of them for improved sound capabilitiee. Emulators and FPGA machines typically allow to simulate more than one too. Unfortunately, there is no standard regarding how these additional chips are visible in the processor address space, and there is no sane way to detect it - thus, it has to be configurable. @@ -113,7 +119,7 @@ The SID support in the ROM is very limited - it only disables the sound during s Each of them add support for one additional SID - addresses should be given in `CONFIG_SID_2ND_ADDRESS` and `CONFIG_SID_3RD_ADDRESS`, respectively. -Each of these options needs 8 bytes in KERNAL segment. +Each of these options needs 3 bytes in KERNAL segment. ### `CONFIG_SID_D4XX` and `CONFIG_SID_D5XX` @@ -181,7 +187,7 @@ Needs 25 bytes more space in KERNAL segment for the code. In addition, each conf ### `CONFIG_EDIT_STOPQUOTE` -If enabled, STOP key terminates insert/quote mode (like on BlackBox cartridge). +If enabled, STOP key terminates insert/quote mode (like on some _Black Box_ cartridges). Feature needs 12 bytes in KERNAL segment. If unsure - enable. diff --git a/STATUS.md b/STATUS.md index 7eb547c7..0c59df05 100644 --- a/STATUS.md +++ b/STATUS.md @@ -20,6 +20,10 @@ NOTE: extra features and their syntax can change in the future! # Features missing +The following ROM features are currently missing and are not planned due to space considerations: + +* full tape support - VERIFY, SAVE, sequential files; tape is considered a legacy medium, so it's support is going to be limited +* mock 6551 emulation - this inly slows down the RS-232 support for original ROMs, probably noone needs it The following ROM features are currently missing: @@ -27,7 +31,8 @@ The following ROM features are currently missing: * BASIC variables * BASIC expression parsing * floating point routines -* tape support +* tape (normal mode) support +* IEC support for SAVE * RS-232 support * NMI handling is incomplete @@ -104,8 +109,8 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | :-------: | :--------: | :---------- | :------: | :--------------------------------------------------: | | `($028F)` | | `KEYLOG` | DONE | | | `$FF81` | `$FF5B` | `CINT` | DONE | | -| `$FF84` | `$FDA3` | `IOINIT` | PARTIAL | CIA initialization might be incomplete | -| `$FF87` | `$FD50` | `RAMTAS` | PARTIAL | probably shouldn't touch VIC and CIA's | +| `$FF84` | `$FDA3` | `IOINIT` | PARTIAL | CIA initialization incomplete | +| `$FF87` | `$FD50` | `RAMTAS` | DONE | | | `$FF8A` | `$FD15` | `RESTOR` | DONE | | | `$FF8D` | `$FD1A` | `VECTOR` | DONE | | | `$FF90` | | `SETMSG` | DONE | | diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 6e208cbf..e997bf79 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -43,7 +43,7 @@ #define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now +#define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now // #define CONFIG_RS232_UP9600 // please keep disabled for now diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index e416562c..220d86f7 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -45,7 +45,7 @@ #define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now +#define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now // #define CONFIG_RS232_UP9600 // please keep disabled for now diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 92e982eb..d0550369 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -44,7 +44,7 @@ #define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now +#define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now // #define CONFIG_RS232_UP9600 // please keep disabled for now diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 2b80c95e..db0e9eeb 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -43,7 +43,7 @@ #define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now -// #define CONFIG_TAPE_TURBO // please keep disabled for now +#define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now // #define CONFIG_RS232_UP9600 // please keep disabled for now diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index 2725bc9e..dbc3a540 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -299,8 +299,6 @@ .eval features_str = ADD_FEATURE(features_str, "TAPE NORMAL+TURBO") #endif - .eval feature_new_line = true - #if CONFIG_IEC .eval features_str = ADD_FEATURE(features_str, "IEC") #endif diff --git a/c64/kernal/init/fce2.hw_entry_reset.s b/c64/kernal/init/fce2.hw_entry_reset.s index 14014a02..29348a67 100644 --- a/c64/kernal/init/fce2.hw_entry_reset.s +++ b/c64/kernal/init/fce2.hw_entry_reset.s @@ -10,12 +10,9 @@ hw_entry_reset: sei // disable the interrupts, as fast as possible - they are disabled in case of HW reset, // but this routine can be also called manually - ldx #$00 - sta VIC_SCROLX // turn the display off - we want as little screen artifacts as possible - cld // required for all CPUs - due to possibility of manual call - dex // $FF - to initialize stack pointer + ldx #$FF txs // The following routine is based on reading the public KERNAL jumptable routine @@ -28,6 +25,10 @@ hw_entry_reset: bne !+ jmp (ICART_COLD_START) !: + // Disable the screen (and set 40 columns) to prevent visual glitches later + ldx #$28 + stx VIC_SCROLX + // Initialising IO is obviously required. Also indicated by c64 prg p269. jsr JIOINIT diff --git a/c64/kernal/init/fd50.ramtas.jmp.s b/c64/kernal/init/fd50.ramtas.jmp.s deleted file mode 100644 index b20ed77e..00000000 --- a/c64/kernal/init/fd50.ramtas.jmp.s +++ /dev/null @@ -1,6 +0,0 @@ - -// Our implementation is longer than the original one, -// placing it here would cause a collision with OPEN - -RAMTAS: - jmp ramtas_real diff --git a/c64/kernal/init/ramtas_real.s b/c64/kernal/init/fd50.ramtas.s similarity index 55% rename from c64/kernal/init/ramtas_real.s rename to c64/kernal/init/fd50.ramtas.s index 3838b2d2..70cb41c7 100644 --- a/c64/kernal/init/ramtas_real.s +++ b/c64/kernal/init/fd50.ramtas.s @@ -8,52 +8,33 @@ // CPU registers that has to be preserved (see [RG64]): none // -ramtas_real: +RAMTAS: + // C64 Programmer's Reference guide p291: // Clear $0000-$0101, $0200-$03ff // PGS: $0000, $0001 are CPU IO ports, so shouldn't get written to - ldy #$02 - lda #$00 -!: - sta $00,y - iny - bne !- -!: // How many ways are there to efficiently erase these two pages // of RAM? We would like to avoid any unnecessary byte similarity // with the C64 KERNAL. Thus we do $0300 before $0200, even though // with the longer sequence of identicale bytes we see no basis for // it being copyrightable. Again, we just want to redue the attack // surface for any misguided suit. + + ldy #$00 + lda #$00 +!: sta $0300,Y sta $0200,Y + sta $0002,Y // that's why we don't use .X for index, we do not want zeropage addressing here! iny bne !- // Allocate cassette buffer - // "Mapping the C64", p237 - lda #<$033C - sta TAPE1+0 - lda #>$033C - sta TAPE1+1 - - // set screen address to $0400 - // https://www.c64-wiki.com/wiki/Screen_RAM - // Since we are setting $D018, we also make sure we are using the - // ROM character set (C64 Programmer's Reference Guide p322) - lda #$14 - sta VIC_YMCSB - - // Make sure we have the correct VIC-II memory bank for the screen to really be at $0400 - // and not $4400, $8400 or $C400 - // https://www.c64-wiki.com/wiki/VIC_bank#Selecting_VIC_banks - lda CIA2_DDRA - ora #$03 - sta CIA2_DDRA - lda CIA2_PRA - ora #$03 - sta CIA2_PRA + ldx #<$033C + stx TAPE1+0 + ldx #>$033C + stx TAPE1+1 // Set screen address pointer ("Compute's Mapping the 64" p238) // This is obvious boiler plate containing no creative input, but to avoid @@ -62,30 +43,41 @@ ramtas_real: ldx #>$0400 stx HIBASE - // Work out RAM size and put in MEMSTR and MEMSIZK - // "Compute's Mapping the 64", p54 - // http://unusedino.de/ec64/technical/project64/mapping_c64.html + // Set BASIC start text pointer + // (remember, that low memory is 0 initialized at this moment) + ldx #>$0800 stx MEMSTR+1 - ldx #$00 - stx MEMSTR+0 - stx MEMSIZK+0 + + // Work out RAM size and put in MEMSIZK // Try to modify $8000, if it fails then RAM ends at $7FFF, else $9FFF + ldx $8000 inx stx $8000 cpx $8000 - bne ramtas_32K_RAM + bne ramtas_32k + + // FALLTROUGH + +ramtas_40k: + + // 40K RAM - restore memory content, set MEMSIZK + + ldy #$A0 +!: + sty MEMSIZK+1 + + // Always restore memory, cartridge might have RAM under ROM + dex stx $8000 - ldx #$A0 - stx MEMSIZK+1 - bne !+ // always non-zero, saves one byte -ramtas_32K_RAM: - dex - stx $8000 // case there is RAM under the ROM - ldx #$80 - stx MEMSIZK+1 -!: rts + +ramtas_32k: + + // 32K RAM - restore memory content, set MEMSIZK + + ldy #$80 + bne !- // branch always diff --git a/c64/kernal/init/fda3.ioinit.s b/c64/kernal/init/fda3.ioinit.s index 23687e37..59fa824d 100644 --- a/c64/kernal/init/fda3.ioinit.s +++ b/c64/kernal/init/fda3.ioinit.s @@ -11,39 +11,71 @@ IOINIT: - // Set $00/$01 port mode and value + // + // First initialize the CPU port, to make sure we have correct memory map + // + // We want BASIC and KERNAL ROMs mapped, and datasette motor off // (https://www.c64-wiki.com/wiki/Zeropage) // Work around for VICE bug: Writing $00 before $01 results in rubbish in $01 // after. https://sourceforge.net/p/vice-emu/bugs/1057/ - lda #$27 + ldx #$27 + stx CPU_R6510 ldx #$EF - sta CPU_R6510 stx CPU_D6510 // [CM64] page 4 - // Silence the SID chips, depending on the configuration + // + // Now prevent the CIAs from generating interrupts, who knows what damage they can do + // + + // Disable IRQ generation for both CIAs - see [CM64], page 149 + + ldx #$7F + stx CIA1_ICR // $DC0D + stx CIA2_ICR // $DD0D + + // See discussion here: + // https://www.lemon64.com/forum/viewtopic.php?t=41744&sid=e294c254db2ba671cde643f100aae341 + // It seems that initializing this register to $7F is the best idea - UDTIM key scanning + // also leaves this at $7F + + stx CIA1_PRA // $DC00 + + // + // Now silence the SID chip(s), depending on the configuration - we want them silent ASAP + // + + // First the standard chip (skip if it is covered by whole $D4XX range) + + lda #$00 #if !CONFIG_SID_D4XX - lda SID_SIGVOL - and #$F0 sta SID_SIGVOL #endif // !CONFIG_SID_D4XX + // Silence manually configured 2nd and 3rd SIDs + +#if CONFIG_SID_2ND + sta SID_SIGVOL - __SID_BASE + CONFIG_SID_2ND_ADDRESS +#endif // CONFIG_SID_2ND + +#if CONFIG_SID_3RD + sta SID_SIGVOL - __SID_BASE + CONFIG_SID_3RD_ADDRESS +#endif // CONFIG_SID_3RD + + // Silence whole D4XX and D5XX ranges (if configured) + #if CONFIG_SID_D4XX || CONFIG_SID_D5XX + ldy #$00 !: #if CONFIG_SID_D4XX - lda SID_SIGVOL, Y - and #$F0 - sta SID_SIGVOL, Y + sta SID_SIGVOL + $000, Y #endif // CONFIG_SID_D4XX #if CONFIG_SID_D5XX - // SIDs under $D5xx - lda SID_SIGVOL + $100, Y - and #$F0 sta SID_SIGVOL + $100, Y #endif // CONFIG_SID_D4XX @@ -52,50 +84,20 @@ IOINIT: adc #$20 tay bne !- + #endif // CONFIG_SID_D4XX || CONFIG_SID_D5XX -#if CONFIG_SID_2ND - lda SID_SIGVOL - __SID_BASE + CONFIG_SID_2ND_ADDRESS - and #$F0 - sta SID_SIGVOL - __SID_BASE + CONFIG_SID_2ND_ADDRESS -#endif // CONFIG_SID_2ND + // + // Now continue the CIAs initialization + // -#if CONFIG_SID_3RD - lda SID_SIGVOL - __SID_BASE + CONFIG_SID_3RD_ADDRESS - and #$F0 - sta SID_SIGVOL - __SID_BASE + CONFIG_SID_3RD_ADDRESS -#endif // CONFIG_SID_3RD - - // Initialize CIAs - - // XXX: calibrate TOD for both CIA's, see here: https://codebase64.org/doku.php?id=base:efficient_tod_initialisation - - // Enable CIA1 IRQ and ~50Hz timer (https://csdb.dk/forums/?roomid=11&topicid=69037) - - // First disable IRQ generation for both CIA's - lda #$7F - sta CIA2_ICR - sta CIA1_ICR - - // Enable timer interrupt - lda #$81 - sta CIA1_ICR - - // Enable timer A to run continuously (http://codebase64.org/doku.php?id=base:timerinterrupts) - lda #$11 - sta CIA1_CRA - lda CIA1_ICR - - // Setup the CIA1 for reading the keyboard - 'POKE 56322, 0' on original ROMs proves this - // is done during initialization, not during the interrupt + // For CIA #1 we need port A as output and port B as input to scan the keyboard ldx #$FF - stx CIA1_DDRA // output - inx // $00 - stx CIA1_DDRB // input - - // Value checked on original ROM - stx CIA2_DDRA + stx CIA1_DDRA // $DC02 + inx + stx CIA1_DDRB // $DC03 + stx CIA2_DDRB // $DD03 // XXX this port is used for RS-232, value here is most likely wrong! #if CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK @@ -104,13 +106,38 @@ IOINIT: #endif - // Set DDR on CIA2 for IEC bus, VIC-II banking + // Set DDR on CIA2 for IEC bus, VIC-II banking (see [CM64], $DDOO description on page 193) lda #$3F - sta CIA2_DDRA + sta CIA2_DDRA // $DD02 - // Set VIC-II bank - needed at least for 'Operacja Proboszcz' game - lda #%00000011 - sta CIA2_PRA + // XXX detect TOD clock, see https://codebase64.org/doku.php?id=base:efficient_tod_initialisation + + // XXX how to initialize these timers??? + // stx CIA1_CRB // $DC0F + // stx CIA2_CRA // $DD0E + // stx CIA2_CRB // $DD0F + + // Set VIC-II bank - at least the 'Operacja Proboszcz' game needs this within IOINIT + // Checked on original ROMs, that it sets bit #2 (RS-232 output) high + + ldx #%00000111 // XXX adapt this to IEC idle state, JMP at the end won't be needed + stx CIA2_PRA // $DD00 + + // + + ldy #<16421 + ldx #>16421 + + sty CIA1_TIMALO // $DC04 + stx CIA1_TIMAHI // $DC05 + + // Enable timer A to run continuously (http://codebase64.org/doku.php?id=base:timerinterrupts) + ldx #$11 + stx CIA1_CRA // $DC0E + + // Enable timer interrupt + ldx #$81 + stx CIA1_ICR // $DC0D #if CONFIG_IEC diff --git a/c64/kernal/init/setup_pal_ntsc.s b/c64/kernal/init/setup_pal_ntsc.s index 0b5ae619..99668527 100644 --- a/c64/kernal/init/setup_pal_ntsc.s +++ b/c64/kernal/init/setup_pal_ntsc.s @@ -32,7 +32,7 @@ setup_pal: // ldx #>16380 // PAL C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), - // is clocked at 0.985248 MHz, so that 1/60s is 16421 CPU cycles + // is clocked at 0.985248 MHz, so that 1/60s is 16421 ($4025) CPU cycles ldy #<16421 ldx #>16421 @@ -43,8 +43,8 @@ setup_pal: setup_pal_ntsc_end: - sty CIA1_TIMALO - stx CIA1_TIMAHI + sty CIA1_TIMALO // $DC04 + stx CIA1_TIMAHI // $DC05 sta TVSFLG @@ -55,7 +55,7 @@ setup_ntsc: // Set timer interval to ~1/60th of a second // NTSC C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), - // is clocked at 1.022727 MHz, so that 1/60s is 17045 CPU cycles + // is clocked at 1.022727 MHz, so that 1/60s is 17045 ($4295) CPU cycles ldy #<17045 ldx #>17045 diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 1e9fe9b9..bf1cb7e0 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -12,6 +12,8 @@ load_tape_turbo: + // XXX prepare SID, store screen color somewhere, read header + jsr tape_ditch_verify // only LOAD is supported, no VERIFY ldy #$00 @@ -91,16 +93,24 @@ tape_turbo_get_bit: lda #$10 !: - bit CIA2_ICR + bit CIA1_ICR beq !- // busy loop to detect signal lda CIA2_ICR pha lda #$19 sta CIA2_CRA pla - sta VIC_EXTCOL // use bitvalue as d020 effect (I love that one) - lsr + + pha // audio/video effects + asl + sta SID_SIGVOL + beq !+ + lda #$06 +!: + sta VIC_EXTCOL + pla + lsr rts diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 935915aa..9e130f44 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -45,6 +45,8 @@ tape_ask_play: ldx #__MSG_KERNAL_PRESS_PLAY jsr print_kernal_message + // FALLTROUGH + tape_wait_button_loop: jsr udtim_keyboard @@ -71,7 +73,8 @@ tape_load_success: jsr screen_show jsr tape_motor_off - + + cli jmp lvs_success_end @@ -80,6 +83,7 @@ tape_load_error: jsr screen_show jsr tape_motor_off + cli jmp lvs_load_verify_error From 982b287e92536f0f333ad785005d8ecfb300699d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 1 Nov 2019 13:10:39 +0100 Subject: [PATCH 032/105] various LOAD improvements --- STATUS.md | 1 + c64/aliases/,aliases_ram_lowmem.s | 6 +- c64/kernal/assets/kernal_messages.s | 6 + c64/kernal/iec/iec_wait1ms.s | 12 +- c64/kernal/iec/load_iec.s | 4 +- c64/kernal/iostack/lvs_helpers.s | 16 +-- c64/kernal/tape/load_tape_turbo.s | 70 ++++++----- c64/kernal/tape/tape_common.s | 181 +++++++++++++++++++++++++--- 8 files changed, 232 insertions(+), 64 deletions(-) diff --git a/STATUS.md b/STATUS.md index 0c59df05..0d0b61d3 100644 --- a/STATUS.md +++ b/STATUS.md @@ -32,6 +32,7 @@ The following ROM features are currently missing: * BASIC expression parsing * floating point routines * tape (normal mode) support +* tape loading ignores secondary address * IEC support for SAVE * RS-232 support * NMI handling is incomplete diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index c7e03e0c..82341539 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -94,7 +94,11 @@ .label DFLTN = $99 // default input device .label DFLTO = $9A // default output device .label PRTY = $9B // tape storage for parity/checksum +#if !CONFIG_TAPE_NORMAL && !CONFIG_TAPE_TURBO .label DPSW = $9C // -- NOT IMPLEMENTED -- +#else + .label COLSTORE = $9C // [!] screen border storage for tape routines +#endif .label MSGFLG = $9D // bit 6 = error messages, bit 7 = control message .label PTR1 = $9E // -- NOT IMPLEMENTED -- .label PTR2 = $9F // -- NOT IMPLEMENTED -- @@ -277,6 +281,6 @@ // $314 $334-$33B -- UNUSED -- free for user software - .label TBUFFR = $33C // $33C-$3FB, -- NOT IMPLEMENTED --, tape buffer + .label TBUFFR = $33C // $33C-$3FB [!] tape buffer, our usage details differ // $3FC $3FC-$3FF -- UNUSED -- free for user software diff --git a/c64/kernal/assets/kernal_messages.s b/c64/kernal/assets/kernal_messages.s index 642ee2bd..3dd5d54e 100644 --- a/c64/kernal/assets/kernal_messages.s +++ b/c64/kernal/assets/kernal_messages.s @@ -17,6 +17,7 @@ #if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO .label __MSG_KERNAL_PRESS_PLAY = __msg_kernalplay - __msg_kernal_first +.label __MSG_KERNAL_FOUND = __msg_kernalfound - __msg_kernal_first #endif #if CONFIG_SHOW_PAL_NTSC @@ -70,6 +71,11 @@ __msg_kernalplay: .text "PRESS PLAY ON TAPE" .byte $80 + $0D // end of string mark + return +__msg_kernalfound: + .byte $0D + .text "FOUND" + .byte $80 + $20 // end of string mark + space + #endif #if CONFIG_SHOW_PAL_NTSC diff --git a/c64/kernal/iec/iec_wait1ms.s b/c64/kernal/iec/iec_wait1ms.s index d6a57218..464619c4 100644 --- a/c64/kernal/iec/iec_wait1ms.s +++ b/c64/kernal/iec/iec_wait1ms.s @@ -4,7 +4,7 @@ // // On NTSC this means 1023 cycles (slightly less on PAL, but we have to be sure). // We can't count on badlines, as the screen might be disabled. -// Delay here is implemeented using VIC-II raster register. Since one raster is +// Delay here is implemented using VIC-II raster register. Since one raster is // 63 cycles, we need at least 17 full rasters to be 100% sure we wait enough @@ -12,7 +12,15 @@ iec_wait1ms: + ldx #18 // we probably won't start with the beginning of raster + +#endif // CONFIG_IEC +#if CONFIG_IEC || CONFIG_TAPE_TURBO || CONFIG_TAPE_NORMAL + +wait_x_bars: // additional entry point for tape support + // has to preserve .Y and put .X to 0 + lda VIC_RASTER !: cmp VIC_RASTER @@ -24,4 +32,4 @@ iec_wait1ms: rts -#endif // CONFIG_IEC +#endif // CONFIG_IEC || CONFIG_TAPE_TURBO || CONFIG_TAPE_NORMAL diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 340892ec..07bd6c26 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -90,9 +90,9 @@ iec_load_loop: jsr lvs_handle_byte_load_verify bcs load_iec_error - // Advance pointer to data + // Advance pointer to data; it is OK if it advances past $FFFF, + // one autostart technique does exactly this jsr lvs_advance_pointer - bcs_far lvs_wrap_around_error // Handle STOP key; it is probably an overkill to do it // with every byte, once per 32 bytes should be enough diff --git a/c64/kernal/iostack/lvs_helpers.s b/c64/kernal/iostack/lvs_helpers.s index 9298b6e3..ae19c7a9 100644 --- a/c64/kernal/iostack/lvs_helpers.s +++ b/c64/kernal/iostack/lvs_helpers.s @@ -79,16 +79,10 @@ lvs_handle_byte_verify: lvs_advance_pointer: // Advance pointer - inc STAL - beq !+ - jmp lvs_success_end -!: - inc STAL+1 - // If we wrap around to $0000, then this is bad. + inc STAL+0 bne !+ - jmp lvs_error_end + inc STAL+1 !: - clc rts @@ -155,12 +149,6 @@ lvs_display_done: ldx #__MSG_KERNAL_TO_HEX jmp !- -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 diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index bf1cb7e0..e3ebfebf 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -7,66 +7,75 @@ // - https://codebase64.pokefinder.org/doku.php?id=base:turbotape_loader_source +// XXX use calibration bits to improve reading +// XXX handle load address from Kernal API +// XXX add name matching + + #if CONFIG_TAPE_TURBO load_tape_turbo: - // XXX prepare SID, store screen color somewhere, read header - jsr tape_ditch_verify // only LOAD is supported, no VERIFY - ldy #$00 - sty PRTY // initial checksum value - - sty CIA2_TIMAHI + lda #$00 + sta CIA2_TIMAHI lda #$FE // timer threshold for TurboTape sta CIA2_TIMALO jsr tape_ask_play + // FALLTROUGH + +load_tape_turbo_header: + // Read file header - ldy #$00 + jsr tape_turbo_sync - jsr tape_turbo_sync // .X gets set to 0 - - stx STAL+0 // instead of a later lda, sta - jsr tape_turbo_get_byte // important trick - save time/bytes by using y-indexing - tay + ldy #$15 !: - jsr tape_turbo_get_byte - sta STAL+1,x // .X still 0 - inx - cpx #$03 - bne !- + jsr tape_turbo_get_byte + sta (TAPE1), y + dey + bpl !- + + jsr tape_handle_header + bcs load_tape_turbo_header // if name does not match, look for other header + + // FALLTROUGH + +load_tape_turbo_payload: // Read file payload jsr tape_turbo_sync // .X gets set to 0 + ldy #$00 + sty PRTY // initial checksum value + // FALLTROUGH load_tape_turbo_loop: jsr tape_turbo_get_byte - dec CPU_R6510 // to load below i/o area! - - sta (STAL),y - eor PRTY - sta PRTY - + dec CPU_R6510 // to load below I/O area + sta (STAL),y inc CPU_R6510 - iny - bne !+ - inc STAL+1 -!: - cpy MEMUSS+0 + eor PRTY // handle checksum + sta PRTY + + jsr lvs_advance_pointer + lda STAL+1 - sbc MEMUSS+1 - bcc load_tape_turbo_loop + cmp EAL+1 + bne load_tape_turbo_loop + lda STAL+0 + cmp EAL+0 + bne load_tape_turbo_loop // Verify the checksum @@ -75,7 +84,6 @@ load_tape_turbo_loop: beq_far tape_load_success jmp tape_load_error - tape_turbo_get_byte: lda #$01 diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 9e130f44..0a8f97e0 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -7,6 +7,10 @@ #if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +// +// Check if VERIFY asked - if yes, terminate loading +// + tape_ditch_verify: lda VERCKK @@ -18,24 +22,52 @@ tape_ditch_verify: jmp lvs_device_not_found_error +// +// Handle tape deck motor +// + tape_motor_off: lda CPU_R6510 ora #$20 - sta CPU_R6510 - - rts - + bne !+ // branch always tape_motor_on: lda CPU_R6510 and #($FF - $20) +!: sta CPU_R6510 - rts +// +// Handle screen (visible/blanked) + tape deck motor (on/off), +// store/restore screen color +// + +tape_screen_show_motor_off: + + jsr tape_motor_off + + lda COLSTORE + sta VIC_EXTCOL + + jmp screen_show + +tape_screen_hide_motor_on: + lda VIC_EXTCOL + sta COLSTORE + + jsr screen_blank + jmp tape_motor_on + + +// +// Ask user to press PLAY on tape deck, +// Unless user cancelled loading, blank screen and start motor +// + tape_ask_play: sei // timing is critical for tape loading @@ -45,9 +77,18 @@ tape_ask_play: ldx #__MSG_KERNAL_PRESS_PLAY jsr print_kernal_message + // Clean the SID registers, we need it for sound effects + + lda #$00 + ldy #$1C +!: + sta __SID_BASE, y + dey + bpl !- + // FALLTROUGH -tape_wait_button_loop: +tape_wait_play_loop: jsr udtim_keyboard jsr STOP @@ -61,27 +102,139 @@ tape_wait_button_loop: !: lda CPU_R6510 and #$10 // check for pressed button - bne tape_wait_button_loop + bne tape_wait_play_loop - jsr screen_blank - jsr tape_motor_on + jmp tape_screen_hide_motor_on + +// +// Handle file header - display it, decide whether load the file or not, etc. +// + +tape_handle_header: + + jsr tape_screen_show_motor_off + + // Header structure described here: + // - https://www.luigidifraia.com/c64/docs/tapeloaders.html#turbotape64 + // + // 1 byte - file type (0 = data, odd value = relocatable, even value = non-relocatable) + // 2 bytes - start address + // 2 bytes - end address + 1 + // 1 byte - if $0B (tape timing) contained at the time of saving XXX handle this + // 16 bytes - filename, padded with 0x20 + // + // Out tape buffer contains header in reversed order + + // Print FOUND + file name + + ldx #__MSG_KERNAL_FOUND + jsr print_kernal_message + + ldy #$10 +!: + lda (TAPE1), y + jsr JCHROUT + dey + bpl !- + jsr print_return + + // Header, wait for user decision + + jsr tape_header_get_decision + bcs tape_handle_header_skip + + // XXX Perform filename matching + + // Setup STAL and EAL + + ldy #$15 + lda (TAPE1), y + sta STAL+0 + + dey + lda (TAPE1), y + sta STAL+1 + + dey + lda (TAPE1), y + sta EAL+0 + + dey + lda (TAPE1), y + sta EAL+1 + + // Print LOADING + + jsr lvs_display_loading_verifying + + // Load the file + + jsr tape_screen_hide_motor_on + + clc + rts + +tape_handle_header_skip: + + // Skip this file + + jsr tape_screen_hide_motor_on + + sec rts +// +// Get user decision whether to load the file or not +// + +tape_header_get_decision: + + ldy #$00 +!: + jsr udtim_keyboard + lda STKEY + bpl tape_header_wait_stop // STOP pressed + and #$10 + beq tape_header_wait_space // space pressed + + ldx #$80 + jsr wait_x_bars // sets .X to 0 + dex + jsr wait_x_bars + + dey + bne !- + + // FALLTROUGH - timeout + +tape_header_wait_space: + + clc + rts + +tape_header_wait_stop: + + sec + rts + + +// +// Report that file loading succeeded (or not) +// + tape_load_success: - jsr screen_show - jsr tape_motor_off + jsr tape_screen_show_motor_off + jsr lvs_display_done cli jmp lvs_success_end - tape_load_error: - jsr screen_show - jsr tape_motor_off + jsr tape_screen_show_motor_off cli jmp lvs_load_verify_error From ae80e9a596f10368d3bba871cc66c5bc5eb70147 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 1 Nov 2019 15:50:41 +0100 Subject: [PATCH 033/105] various turbo tape improvements --- CONFIG.md | 8 ++- STATUS.md | 3 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/,,config_generic.s | 3 +- c64/,,config_mega65.s | 3 +- c64/,,config_testing.s | 3 +- c64/,,config_ultimate64.s | 3 +- c64/aliases/,aliases_config.s | 9 +++ c64/basic/basic_main_loop.s | 22 ++++--- c64/basic/wedge_tape.s | 36 +++++++++++ c64/kernal/tape/load_tape_turbo.s | 49 ++++++++++----- c64/kernal/tape/tape_common.s | 98 +++++++++++++++++++++++------- 19 files changed, 187 insertions(+), 50 deletions(-) create mode 100644 c64/basic/wedge_tape.s diff --git a/CONFIG.md b/CONFIG.md index ffef262c..5d2aad10 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -107,7 +107,7 @@ Needs over 1000 bytes in KERNAL segment. If unsure - enable. Adds a minimal turbo tape support - just LOAD command (device 7, like on _Action Replay_ and _Final_ cartridges) -Needs about 350 bytes in KERNAL segment. If unsure - enable. +Needs about 400 bytes in KERNAL segment. If unsure - enable. ## Multiple SID support @@ -211,6 +211,12 @@ If enabled, a simple DOS wedge is available from the direct mode - supports `@`, `@`, `@$`, `@$`, `@` NOTE: extra features and their syntax can change in the future! @@ -32,7 +33,7 @@ The following ROM features are currently missing: * BASIC expression parsing * floating point routines * tape (normal mode) support -* tape loading ignores secondary address +* tape loading ignores secondary address and has no pattern matching * IEC support for SAVE * RS-232 support * NMI handling is incomplete diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 4df641d467182d1f4fd54639442bc34d8e2c16c9..92d9c9310b555727adfa63938f990a5ff5d64df0 100644 GIT binary patch delta 2020 zcmb_deQaCR6@T`#NU9urAgW}O+WI{P`4>ls1Xl|s+;%_AFq`Pu7>u< zr2XT7Ttr`0A)&>3R5A$4ljZB=+Hn^PRZ#=M(YjTB)&>uh{jmv&(OXdxSd{T_h#LeGX-p_hG+HysIvPE{+@05mLd=Vyw7+Z?o>DZ2RZn6jA>f0k~tMP<57+e|6sofDPWvbKQIN{%t%J2o;w za&6t3AuK&&w~dl{#|n}U*VkSb+!aNeQSl6(8sYq)e^GE_;_B9ycnlMA3x-M-9P~>M z1U4gG^q#;-ve%$f_EmHbGa17np06rq*>Erv>%Zw-B0H%pI*3WaBvuniF=d!>T+J~X zSum=8O>izihS}T${KXze)&`pMi#J(pvCd+srD9TK)Z31FqLMFjLys^NP9|yz%UzpP zX<{A1Ne-dP$!awU=zw+~9n%gHwnC%cLya{b z6Z{l5!{1lJ&<!!QmDN%whw+<$hBoR zS)OcvZYQ$zua3kkHQqbr&sRh4Ob3$a+^(|&WFN(*z}w7OPuK8<*>gT#0L0pmaUnb3 za$NOQpLOe+&#I#~_1S;SH3Y^H=(TCH6NhKZ`m$#vIZ~Jt$(uRq`;%mg0#BRZy2JX~nxkpu8k~Ep~KUu_xj#1fauT!7tvPI_fv%6IiDe~P&Q8`u2N>>Dz zKlr-fs!6EWP{R#>ab3exMVVw3gNzi_tb}5fvyy6t=C);JOK!%ev1mzIsaWscefi2@O}6&~O1e;NJq*tNRPfyY;#r@kd5luk*e-QyS_EnnBx-RthTl^(FpOp1D*>$4WyD0hLRH zPY3epnDWpi^_^7UU@)aNi^>G(*4DnR6tCn2Ho?DO6Ex`wyM+dM{gP@{iN25j`j(C^ zPlS?`ez@aT^5QI&%+Qp`FNVtbhz`>2X`7-aOO5+Xjn>Sq8tQQ>4Oyni!-b-?)J|%l~ WLk{o%q3h%a??wdtW3G+&%l`o!f0*$A delta 1929 zcmcgtd2AF_7=JT6vqyJrixz1;+Sg*ZsRg8z!a@N{7a31LKn11=clO(oHiR^QODm}CG=dXS{~;PH?IIx25f7p!tlv{+PZo3=PjAawu`j~_vCgvm|M7kXTU}Ylbr0$5e^;LB7xqj#IZ>(JW0%lq+8*$-&e_Pf$L+-OS^6Bg7LI@Ij9$)!E!=>jrHF!fj=JKlRItJz<}+9 zc-QptdDdtn&$=nm78uC0a!{l*^^c$U%Y&jprb~7Em1=eNWbVx?rs(L|MuVD8dQz9R z=yq_7YKt$Ft7L6=g+tm9wE=XC-nr23ST#l{oSTzKl_UbG;zR&f$rvdwt{a2v9MV3p z1vRr>o>ICqs?AhpY1PVXst;;@agOQ0$e>%h-tV+~?3AY{)U1c1l`sRUU?x<` zm@#zM&>WZxH82lO53P^RhXt^{=WeKlg-{0pSOoXL1sE7y3`>S2xEJn&vxE1;1Mna` z1WRBkEQ5z(Ijn${@CZB#kHIQf4QoJ#dRPmO!#Y?G8=wJ#un{(eU^8riC*VnV3Z8~% zU@JTe&%yKX0=x(>{SUWbZ^DYbMYWgy^Ci6kYCV9!%wYtk#4KO*07 zgz$t2gt!UkBo3Z91&(*)r066>**<~%&-bhrfv?{d0z(#|fp%0l0E z7hmzV&$}fas<)R7di&-ZyAw1`pK{~mGnMf6;#pgteHnY8=l)w z__TDUL&iO9k|Zq^o)qEH<_qRexQ$L?M^u>}$)aBDL-#1YA;ZqPXN(t)>S0<0 zun8vmq(gwD)zxVJ-WF?&Zj(}3g`jnVwidbfhUnC&ebB gw?EIi?XxF1E-YSmMDygG<#d{c#e@DqH~e}10XT|$QUCw| diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index fc64445fcea63f9deba76828b70bf512b50c2085..13b667d028927f0d798b58924efbcc08a501d39e 100644 GIT binary patch delta 2305 zcma)7e{2)i9l!I%_BrRoh9=+;NM0D@#}cw+D8Xcyg-uOU@v5<{5*yOgqlMPlAC)Tc zSG?9p;mM-H`2xdO`?wF&iOd2^-}n!0Vg1O;yjs$G@#)_jsRZxA9B%muVYASzEgjR21y}GyQ9dc`*upp$C{x&c#AHRK zCLb{v%TqR2@%f^B$h{>VqhW3DVtYmlFLt1#N^&bcpB2#@(NBRJNe2DZ&fPcatl+}o zggdzb&!xs0*E0UOHsZ}PE(4kCl5Bx-joa)p^_q9Dc+F+hw4!;fKc}i2`b`ewDWesJ zxe0Xmk|WfW=r{J|_G?~=*W--jg?NT_mlT6wwPDGd@`6Ip%q^RrjCdg_?ZXcdjq65-7O42drfLWuge&{aE{ zLFco`SWLD#W77)U$+h3&7d81^Ph0aVMNJsYpuLk(NzitO7X@jz)(QGML!#W|J;Dyj zFL-;OJDSQ}1+VaNRcn_bT8DH1s!-}%aDnZ~VwQCoxH^MKXB0N+MRT^=k!nZp*kDKe z99s@vw6k3tE)m40kx#|T6AA}~H=2)Rq5!O1&+m@Mq#pf-)cf+Tct)|&^=vd9HGXBf zKip9x{jF>k^p_x}vUw3Z2%4@iWK`lM0pLJ8bb~R!rwL}$vgS2di_`56eXW8nr=72t z)3{Do`B{eb1i#5Dp-Ms4PZ6xSOw)*ypWz3(wbm#OFSqp>rB-Jfce^c3udrX zpX177VyQXjK0X#2B4WAJY%W1BIdlMJ=0O*9JOJTY9;454g~YJbtn#C?32E!^-24YPPB;ofaw6FFbL4D zLKO)O)j+u&7=m(BTtE){9ENa;_!_xR=E-~H?_`0zPi_!Go>iYwDOn^-HVQqVlryveWgJL8bPcSB;8C8e1MygprYntW>&0icgRXff%J z4^{$DvL0xAe0y?f249;*U!@~+=+RWJ-eHayvDwOPDvD%GGi znl(RNKnXyb>Od$C zuQ~1Pln~T_J8Nu%VRIHpFlhAU{AH-DuR|TR0!Ddzs!EyW zQw|fvyUZWrm$DDLZ}35Pj>FlaGzZ)9YdSdle9Tn%syBdnF{8)jX5ZIb*R%3tzCG-`9P@47JHOx%ZaUwyD_{gHA1Ij=(eu;JA3rr+ z9vjT}R5ysuj?hqjW^522nigL@TfaZ>3R}xz;6QWBuC@z$wehE23M7uSy4U5F)-EfnINa9 z&#dG0;+gdv+Dh>ZkuL}>a!&BbMIp53i%uG?&#*0jvK0;;tuM6?*d2fX+^;%E0>k_d D^(HIU delta 2168 zcmcgteQX(Y{TYx1U9zm^Y@m8NM{cPZ0~r@cr;R4P;&T#>d|lRz4b zk0m7zYc7~>*=*l7+R${KcX!VD?9J|oLbACH5>&oO9k;4T18Kt4kGoVwaEw8PChd4$ zJLN;#-@HEG`@WB!-}C)EH!(ah9DcF9Q2ydWUpV;rgI~UHW<4QcjgWRSLvZ1S7ZQK9 zeSPf|ZYN~swc5fXA+9)sG8kJ`SUmX_V@FsfnXH|vbmVXQA0#S#_`#Vc5E~C`_^xs# z;}_P@Z{H?W1(S1C?3&V^>SAh{L2J-|Z#7A`mA=e??eTT%TyMsF?R;1uEue8EYLg=} zc{h{uk|RLQs!^W4q0_Hr6W+yq>I}z6nr|iQ77M8}Jcmb(PB-(~`RO}&O`l%RldV7( z%ABBdi2Cctx3-p{q9+jt-$U|z*$Bf>9i1WJAA}*mhi;Ub-C7W)f zEz%o`+9Ge*Zq~`&Y8R&Hx3(vUfeY=7y3#B3sy@{-*-LgSXg$VK>UZqz6qwd-tHB`F z-%;zJ&?<18kl^xxU@?#WhQxprs^9M8l&--W4slfJzQKuO(#E>Z&D$X79IUcVbB-!= zmUD;!Dy!1_^&RA_u6ToK^4MHR^eR1r6|dN%^dh*IX}~3Iavybsq$k}2BPi(#5^00{ zZ26>oLfM>x)YR+mz-2ha%-0?uSL{$4Yk?S*WCzh+W@SYH{E0wo-{XG?(AA%WriWe(TQk>0rrkHKNG+ zLP`3PuccvL6Ue+qRZaSqZ(}&FX&lx&`M}0<(EJHMS+X_E2CHROk(jShlc!T@;~v~* z(^&V-#!#-Qm>;!1i>d9RA8W*~lY&i_?I=%OIunIKJd&<dlX4J^4pr+I>FDss zr`1t;j23LE&AVwMHbjU#r6=9<-+1ZhO7lPQjE_{RyW1PluOC;AH~*F9b;<48A;sGF z_kUVhed^RfkFVHRTCrny_s24`PDf;=`EMcmxlAMyX|hO}NMB>R zFqsV&PG*CM5-^Wm#BE0$8yif}&5ShLKnT|TKJk8KNZe1fvJ!9|z#^EGt5u8H!%ly{ zVN>{KCM-V*--hqNQ}A8*9(*5u0AAT6KMkWW1}EShcuf8wjKc{f3={Apcm__wB!~d1 zQh5sWi$8`4`~-eqJ_XOhb1)6h!wV3F7{oz>7vUv%8GZ_<;S9{c&)_V~!Z~;a67VV{ z;Wdx}g{qK(InW>tI%FUVufrRVgFKvvH~$Ym4^x6;N5F5`e!n#AXyhr51ar%-j_zzV zIepQ~*fWN5+-g$%*w#GRtJA;*d`p|#I$RMJacQ{i2`^VtJVtYrXXAdp?W;S-ubGwA z;-x0@L)E*2J$&a%Vf-4lwwLY3Cz!2U7ZMYNacQ7^dt={y`+5&O*xQc-aI)^uw%X@l rUS}5k?xTz59hiH*Xnv?Qi7lE(+<;abfmnZs?`Fo%4D1;|57_z_#e(%@ diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index c5f9a87d19f6041b1f66a89c8a04b35adb74e922..4f7b7003b39782bf0e3cf7757e7b5288279a75e5 100644 GIT binary patch delta 1852 zcmZ`)eQXp}5Z{lsyX~I6L%yz5t`9KLLaD8!<$xBUQaRx94Ppr5QUh%HgJ_6R!FWVj ztj5HHwWLTI*7e@Cd%Yuf5adG-szJQH#JCVlB%*08cT^&h;fp0isu#>AJ~_c8OE zc{B57=6289J+={tkId2KU(Rw1ba1xEfybB)!okCq|=pdgMtNc1sQCq9bVC|Q(|)H z0mF*uM`e4_V;l5W)d=$SXpCBbTv>gsde%M_I46|s(m0g@I%*xlO_r!qS|f@vfiz6= zTuE*eH6J=0C$o*b<31UTjpGZsG=2j8}vpxN%LyE25bZJukaeD!J3>F*(?8LBsvdu_p8##MU62ESD{2 zvZ%QWWMEc=qDdPMbO8|GB%n*<+c#xA59L=xN<{bijVi0yK-L{p_^V&^f^~m82GJ_9 zeS;Nj@QVn>@)ga?(5mH2SEDt}tJf@Awh%R~U4$1X9~R9SO&SAaZh-LqEaz=43`EhM zu(E@j6Lj1a!PeP*3_Qv8RGelE?Cij?6DqB7=yX0@6`6*9$U_i-D4};C*vDJi*JV8S zVGlo*)hO@rmeC}$Aaj&P2U8T&nWqP@ za^{`$oH+G zk13)szA6;!1fWBiA8WHmNpCRpv&N=q+9(ORhAGQ@V%IQD=0tD zL2jOl5y4_}JZMhqlw$(a#pOfYrl+?w!KORJ-tt6YhqrY=O!t?#k?5R8{|4&m+MC)E0T31ttykO zGloqjleYDwK~I0K9$$%fcsJL{b)>$PawGsmS<9f?ErDjSq|&mQK;AMeYelkdF^p(O zAoWT2D!54Mwl!N*47W8JsC{m$1Pm<#?mtXm6~je6BHDh${_smj(j9?hodXbUac^rW z$l@hO#AEwP8{GTp5*FX;Q7%lJqTHTXR=YK;KVyTVP&nYGHtGL5BD~v0yV{jT-%4hE zL<#w7WvJA--$uyICZ?Y7$nQ&h6s>w_WXzVE4^ zAA%T_>p!RrM%6sJ5|_Fq<0G^1<`V_-rL=ice;Y1Ln+d!%yL^?kp!xag+F7-=HMP~x zJzHH%QBX;cV<%91e~865Qg&mU40&)p1x5D-*(HBDLb3ltil9~E&a=4__`S1e2ibcX zHAfPq6YK&V3nJH2WQ=?ol%2BaV}PuDRWWh$)~xhos5qMOFq#h+pV>QoPc@oBz*+Fn HNge7>!mle% delta 1765 zcmcIkZERCz6u!N;UAwhgySd?jt$P_N47RcX+q#dIZ7`^C`P@Vtn3O135@JmJLF}TP z!kxp2cDb5pNRy`N+q2uPqzgY#qywXa-6i715F`H3;Z_(%@n!@gAyCilATcri^xowC zJRk2l=Q&SbTVLCjkEYK|Z|&UF-qGH*I?O~|WP}yW6WVB{W@p+Zn5i}G#*OtBBQq+; zUrAB3Cr(^rKD?@Nrp-bPb=+bEN2z#Jf6~xBlbrCL9xN#5^1Y-a${&l8jwpXb5|102 z0}OuNM_xQxCvKnM@BNDrb7%n%YP8oz6V5Hs@C zzmPpc;yP1V+u<1X3&xlcRZy3kRsQTZ;$z91G|3T5m>S1TDo4D)zaNzt!7s5wFU~H( zEoFpeEu=Mu%>lYnaM5bP9p}Y{)5lNxM={9v zqFG*iYGXi9(%VBri`SVzt>`AItTKZW%IPQhR_T*cuT#qA-H#AK+~sKH>XERwa^z+W0ZuO+ ztmXKFQEU`V21}6KmR$!>fl=4XfnY&iJXI0*r0j7Is(Z1fX1u9F16r{(i$@SDS@j!! zg}u@1rGDovo#3av*s8e0W>YxqF4`ot&}N~PbVsSn;Le_f84a)5TUY5JJu0~mp;DL) z%+o_t7QI>r1fq*zF_b|$*r5UlEP=+EwKJ8l6rO^o;quIZ=rgbk4xC>ORj>k9LN(NY z1IEV+qO0IytQP8EHJGAnU@g=`12lpYnxGk4pcP!;hIP;e?a%@1VFPr+M%WYp4?GK- zVGHoE6}G{4*a16X7j!{4JO{hsdDsIlKo9JNegDf}^l!7G-Mmoz!(3K(VK~I<1}1HH zeEdtp0|Ntj7Xrbbec@$TtP)Q|Uy8tao8^GN3Su-IxTXM@AyUdxN8PnwRhdaX5( zI9shE(dBV`Aqn?YqTO#QO#970%6{XdRM+oWzID-#Ej+d!D>b`_GcjSh8RdvI{Lim76JA sESyDSpKIsEcr1QdQC`_K=UW~$#3%XOvHqH44zh+~pqPLx(PW3e0h7)0?*IS* diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index d6c333b7e72d5afd692186bf329f3a208d9a8efd..7466b691b6179c32f08a92dbd463a434ef1ff446 100644 GIT binary patch delta 2007 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 IGXC)T2erIdl>h($ diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index dc594837987a9d256e0c994a4e379e4942936d11..7134217e564acab52adb81158ace005cadf15516 100644 GIT binary patch delta 4343 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 diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index 939e42e961388c56418393d53e52372224502160..cba79c6aaf308612aa26b8418504f34dbc309db0 100644 GIT binary patch delta 4232 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 TappKbB2a{)9$EP7r)vD~OT3v%rUjnV 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 diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 9b10448d4dc2d30ee771615e7deae446dc85d910..622723fe01c34ffb1c54a8f29b961561ad8cb1c8 100644 GIT binary patch delta 5040 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 PjCh2eoV@vc@9qBss?aNF diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index e53f8efefb8b94cb4f197a6527181cf62f38b5d5..9eab09ccac08eb4253f6b60ed4a702e84bd95d20 100644 GIT binary patch delta 4198 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 G$NvZOMHc7) delta 3477 zcmYjTeN-IP6@NPe?6NEDfFxN$fTxlMVm?TW4QaK(7#q}A6OC>0MD43NHA}@~kN=3C zqq|WCk-BtoqCzxvGu`1ZSnOhYj2lZsNP^6sL?@7tq**H3?80JVCVUMTm+hS;+V0si z@4k<@b3cCf_pZC#UG9?1DpN*f#9Me<7h-VFu!7VFC7YT%Dw!3N#>$Bm@>~c%K5Xnh zK1|w%{gxmyrQ2JODQbZildr)B8J>S5B?MZpUlb>)eg@yG2cKpXs;1$%PWF$d4)cDzD-mGvhsKo38A4U++SIQ{ z$j+GHOD(a>nDi$cRcTlQcQH9AYQ*X&7Z=lD98)!E zfLqWz$fW?D2XSb`KNviZI2I&fGb(~VE#fUtM=dMb7lM*S^DSl~II@?}CRh9^I z4a#sJUFr6wmbi>$u356dwPVyj(7nxT1)By)bp%j@M|3iE6##$ipqAD7N#C)94%Ji! zI5`+4&%`k3^r5CBGy#6xNxSIjAdj7=7vmP%aoA{Ib3DMM8$B5R(*BFR=6GJvf@Po7Xy#yXhke9}g z8^Mn&sy$YB)K};=2Xok_qrx?Z?I!%}7$jDMyk4&c@}X`dJ58Y)@Roxfc*%Ms&9&(& zl6nmy>v)ba@RlEUwmBUXkq4&9NQ{g|$V3e9i%Ewtp!717_hVy$D1JH?7=a}yhhdq{ z>pzRP#{>OXn+=3ogBrshF~q}3u?K$?GiHCs^|8R;uqOtF4aFpHNx4=ziccHLp>V&9 z@n;RlTco`T3-L!WBj1_QS=^TJ+Ka)g_A;6rz_8>forSR8tINOn-ox#2N|pk1@h7NI zn49Z*g|BCWy@N3$0H(54wYGJhQn1F7 zCu6>4^CI3c3VUt!ofCac6ZM^^`T&>52GlFja|T4=pg|bL*9(~?TOxhkR&D{5a!Vx> z+$nsJo#j$2UbB+oWtBo&MtzJyy{J$9wgs^*i0M;x`40X=ndJ}2IUa}F!3?Fd9%cv% z7)CTCrZm`I|Ma9t=GGF@$(H(hc#L@Hcl`Atm96^l{50jC81FCnE)0o@V-L zo27%A71CprAo;@#gu6d6+V$2fr$e#zCptWgrx9H8co-iWd|3COaIjKeX$q_9u$B9$ z?(qm+Hx{{mo45pP_ej&)9lnHU?pke}?7DL-!xUB$T5fkjE%KSquh!M{X2*-m^fr<^ zS+hx`x(40lg_Hp6)ob@YHqTtS9!=0U1$>kUXr}P?~skje*inXc~ z{BxGr4e1>CCk*9Wx)tRiv;^fNR9Jw#X($z;EL6Rg{h_{w$*wUY$lNt5)MTwOKJi)3P9b5Z{p)mJ$KR0XPu0Sr)rWW}+%YG;3Vy)hPsC-JnDV5eZUH;4>{XA60ScncW+YhnQ~u-HVBI0Z z9VpJ(WOZ!>|B!`q;NsGquc@t64E~a*|?xC4!l?|y=)SJ5Gy>|-= z|GfLnx881U+4~M4)>>a`KK}@#g1=?+*CO0^8z^L>gAk0q{2cJ`Uz++U`I5|r~(cpH@|iM zzQUKA6f^6S=bTA0uB0LE0=(kn{l;AKJ1XgcChH#Nr!^w-EL6{h_TpMyWvh`J*Cz0* z3EYstyAzew$oK!fNICB(yAlpxTr4H`j0ySqx4FoP@#{G#olbT$%Q-VxSPb2ak%_2J zO^fbVQ==kTI40)bzJFpKaSZ(SiT2p zEsoPc#~EWh11&FZQ)9BrlQHDU2+O-YH^DQ@lNs*F2#bkECOq26h8vk7c_T100oXk| zA`~yaCHq<&igZHiFS}gNII7O^lT=t*P|Vco!q$RYU8vlh=uRXOVs=NidNNzpuEA*F zy8-Il29}=Y&+(r^ccSE|ED6m>r&H%M-=H+9R%xItR-8<_lBH%y1CA<~;Q^zCRraYi zX)tv_V*mg!&4)lFg=}al+-jQgh6>qpf$k?`N~3D)aHu5=+%3j5Q#Hdhol&od_Mta) zH4StyaKbax~Trg2iO6HX^vriJdpB}D@lNx5EK%vLXFt5>k(nK+r7Cf0~AEFy}~y1B2u H3t#*%wQY+Q diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index e997bf79..09774f1b 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -75,7 +75,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -106,6 +106,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 220d86f7..b5e6855b 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -77,7 +77,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -108,6 +108,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index d0550369..cdba7f9d 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -76,7 +76,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -107,6 +107,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index db0e9eeb..091f1974 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -75,7 +75,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" +.const CONFIG_KEYCMD_RUN = @"\$5FL" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -106,6 +106,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE +#define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index dbc3a540..c994c313 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -213,6 +213,15 @@ +// Check that features are configured correctly +{ +#if CONFIG_TAPE_WEDGE && !CONFIG_TAPE_TURBO + .error "CONFIG_TAPE_WEDGE requires CONFIG_TAPE_TURBO" +#endif +} + + + // Handle processor configuration #if CONFIG_CPU_WDC_65C02 || CONFIG_CPU_CSG_65CE02 || CONFIG_CPU_WDC_65816 diff --git a/c64/basic/basic_main_loop.s b/c64/basic/basic_main_loop.s index 0c93e2a8..55ea6dce 100644 --- a/c64/basic/basic_main_loop.s +++ b/c64/basic/basic_main_loop.s @@ -62,17 +62,25 @@ rsl_l1: lda __tokenise_work1 beq basic_read_next_line -#if CONFIG_DOS_WEDGE + // Check if a wedge should take over + +#if CONFIG_DOS_WEDGE || CONFIG_TAPE_WEDGE + + ldx __tokenise_work1 // here is the size of input // Check if DOS wedge should take over lda BUF - cmp #$40 // '@' - bne !+ - ldx __tokenise_work1 // here is the size of input - jmp wedge_dos -!: -#endif // CONFIG_DOS_WEDGE +#if CONFIG_DOS_WEDGE + cmp #$40 // '@' + beq_far wedge_dos +#endif +#if CONFIG_TAPE_WEDGE + cmp #$1F // left arrow + beq_far wedge_tape +#endif + +#endif // Else, tokenise the line jsr tokenise_line diff --git a/c64/basic/wedge_tape.s b/c64/basic/wedge_tape.s new file mode 100644 index 00000000..9eaffab5 --- /dev/null +++ b/c64/basic/wedge_tape.s @@ -0,0 +1,36 @@ + +#if CONFIG_TAPE_WEDGE + + +// .X has to contain size of the buffer + +wedge_tape: + + lda #$FF + sta CURLIN+1 // in case of error do not print line number + + cpx #$02 + bne_far do_SYNTAX_error + + lda BUF+1 + cmp #$4C // 'L' + bne_far do_SYNTAX_error + + // Execute 'arrow + L' + + lda #$00 + sta FNLEN + + ldy #$01 + ldx #$07 // turbo tape device + jsr JSETFLS + + ldy TXTTAB+1 + ldx TXTTAB+0 + + jsr JLOAD + + jmp basic_main_loop + + +#endif // CONFIG_TAPE_WEDGE diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index e3ebfebf..496d6f61 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -9,7 +9,7 @@ // XXX use calibration bits to improve reading // XXX handle load address from Kernal API -// XXX add name matching +// XXX finish pattern matching #if CONFIG_TAPE_TURBO @@ -32,14 +32,15 @@ load_tape_turbo_header: // Read file header - jsr tape_turbo_sync + jsr tape_turbo_sync_header - ldy #$15 + ldy #$00 !: jsr tape_turbo_get_byte sta (TAPE1), y - dey - bpl !- + iny + cpy #$15 + bne !- jsr tape_handle_header bcs load_tape_turbo_header // if name does not match, look for other header @@ -50,7 +51,7 @@ load_tape_turbo_payload: // Read file payload - jsr tape_turbo_sync // .X gets set to 0 + jsr tape_turbo_sync_payload ldy #$00 sty PRTY // initial checksum value @@ -121,23 +122,43 @@ tape_turbo_get_bit: lsr rts - -tape_turbo_sync: +tape_turbo_sync_common: jsr tape_turbo_get_bit - rol ROPRTY - lda ROPRTY - cmp #$02 - bne tape_turbo_sync + rol ROPRTY + lda ROPRTY + cmp #$02 + bne tape_turbo_sync_common + rts + +tape_turbo_sync_header: + + ldx #$FF +!: + ldy #$03 +!: + jsr tape_turbo_sync_common + dey + bne !- + dex + bne !-- + + // FALLTROUGH + +tape_turbo_sync_payload: + + jsr tape_turbo_sync_common +!: ldx #$09 // 9,8,... is real turboTape !: // I sometimes used 8,7,6... to avoid it being listed in vice :) jsr tape_turbo_get_byte cmp #$02 beq !- + ldy #$00 !: cpx ROPRTY - bne tape_turbo_sync - jsr tape_turbo_get_byte + bne tape_turbo_sync_payload + jsr tape_turbo_get_byte dex bne !- diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 0a8f97e0..95ccc478 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -22,6 +22,18 @@ tape_ditch_verify: jmp lvs_device_not_found_error +// +// Loading terminated by user +// + +tape_break_error: + + pla + pla + cli + jmp kernalerror_ROUTINE_TERMINATED + + // // Handle tape deck motor // @@ -92,13 +104,8 @@ tape_wait_play_loop: jsr udtim_keyboard jsr STOP - bcc !+ + bcs tape_break_error - // Stop key pressed - pla - pla - cli - jmp kernalerror_ROUTINE_TERMINATED !: lda CPU_R6510 and #$10 // check for pressed button @@ -118,49 +125,52 @@ tape_handle_header: // Header structure described here: // - https://www.luigidifraia.com/c64/docs/tapeloaders.html#turbotape64 // - // 1 byte - file type (0 = data, odd value = relocatable, even value = non-relocatable) - // 2 bytes - start address - // 2 bytes - end address + 1 - // 1 byte - if $0B (tape timing) contained at the time of saving XXX handle this - // 16 bytes - filename, padded with 0x20 - // - // Out tape buffer contains header in reversed order + // 1 byte (skipped) - file type (0 = data, odd value = relocatable, even value = non-relocatable) + // 2 bytes - start address + // 2 bytes - end address + 1 + // 1 byte - if $0B (tape timing) contained at the time of saving + // 16 bytes - filename, padded with 0x20 // Print FOUND + file name ldx #__MSG_KERNAL_FOUND jsr print_kernal_message - ldy #$10 + ldy #$05 !: lda (TAPE1), y jsr JCHROUT - dey - bpl !- + iny + cpy #$15 + bne !- jsr print_return // Header, wait for user decision jsr tape_header_get_decision + bcs tape_break_error + + // Check if file name matches + +/* XXX does not work yet + jsr tape_match_filename bcs tape_handle_header_skip - - // XXX Perform filename matching - +*/ // Setup STAL and EAL - ldy #$15 + ldy #$00 lda (TAPE1), y sta STAL+0 - dey + iny lda (TAPE1), y sta STAL+1 - dey + iny lda (TAPE1), y sta EAL+0 - dey + iny lda (TAPE1), y sta EAL+1 @@ -172,6 +182,10 @@ tape_handle_header: jsr tape_screen_hide_motor_on + // FALLTROUGH + +tape_return_ok: + clc rts @@ -181,10 +195,47 @@ tape_handle_header_skip: jsr tape_screen_hide_motor_on + // FALLTROUGH + +tape_return_not_ok: + sec rts +// +// Check whether file name matches the pattern +// +/* XXX does not work yet +tape_match_filename: + + lda FNLEN + beq tape_return_ok // no pattern to match + + ldy $00 + +tape_match_loop: + + lda #$20 // default byte, for padding + cpy FNLEN + beq !+ // end of pattern + lda (FNADDR), y // byte from pattern +!: + .break + cmp #KEY_ASTERISK + beq tape_return_ok + + cmp (TAPE1 + 5),y + bne tape_return_not_ok + + iny + cpy #$10 + bne tape_match_loop + + clc + rts +*/ + // // Get user decision whether to load the file or not // @@ -228,6 +279,7 @@ tape_load_success: jsr tape_screen_show_motor_off jsr lvs_display_done + jsr print_return cli jmp lvs_success_end From bc8da8c07e0793888d37abd7c42e6721e885b56e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 1 Nov 2019 20:38:11 +0100 Subject: [PATCH 034/105] JiffyDOS protocol detection added --- c64/aliases/,aliases_config.s | 5 ++- c64/aliases/,aliases_ram_lowmem.s | 2 +- .../{iec_jiffydos.s => f000.iec_jiffydos.s} | 8 +++- c64/kernal/iec/f000.interop | 1 + c64/kernal/iec/iec_tx_byte.s | 41 ++++++++++++++++++- c64/kernal/iec/iec_tx_command.s | 9 ++++ 6 files changed, 60 insertions(+), 6 deletions(-) rename c64/kernal/iec/{iec_jiffydos.s => f000.iec_jiffydos.s} (84%) create mode 100644 c64/kernal/iec/f000.interop diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index c994c313..f01d3da0 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -309,10 +309,11 @@ #endif #if CONFIG_IEC +#if !CONFIG_IEC_JIFFYDOS .eval features_str = ADD_FEATURE(features_str, "IEC") +#else + .eval features_str = ADD_FEATURE(features_str, "IEC+JD") #endif -#if CONFIG_IEC_JIFFYDOS - .eval features_str = ADD_FEATURE(features_str, "JIFFY") #endif .eval feature_new_line = true diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 82341539..211b19e9 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -106,7 +106,7 @@ #if !CONFIG_IEC_JIFFYDOS .label TSFCNT = $A3 // temporary variable for tape and IEC, [!] our usage probably differs in details #else - .label IECPROTO = $A3 // [!] (WIP) 0 = normal, 1 = JiffyDOS, 0xFF = unknown + .label IECPROTO = $A3 // [!] 0 = normal, 1 = JiffyDOS, >= $80 for unknown #endif .label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details .label CNTDN = $A5 // -- NOT IMPLEMENTED -- diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s similarity index 84% rename from c64/kernal/iec/iec_jiffydos.s rename to c64/kernal/iec/f000.iec_jiffydos.s index a17ff764..1b7aec4d 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -48,8 +48,14 @@ iec_rx_byte_jiffydos: jiffydos_wait_line: - // XXX if screen not disabled, wait for badline to pass + lda VIC_SCROLY + and #$10 + beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines + // XXX wait for badline to pass + + +jiffydos_wait_line_done: rts diff --git a/c64/kernal/iec/f000.interop b/c64/kernal/iec/f000.interop new file mode 100644 index 00000000..9a37ffff --- /dev/null +++ b/c64/kernal/iec/f000.interop @@ -0,0 +1 @@ +This is not really for interoperabilityy - we need a fixed memory address to be sure no branches will cross page border (timing is critical) diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index d9b49629..060d5afc 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -39,7 +39,7 @@ iec_tx_common: // At this point a delay 256 usec or more is considered EOI, // receiver should now acknowledge it by pulling data for at least 60 usec // Keep the implementation as simple as possible: data should be released now - // so wait until it's pushed and released again + // so wait until it is pushed and released again jsr iec_wait_for_data_pull jsr iec_wait_for_data_release @@ -54,6 +54,42 @@ iec_tx_common: ldx #7 iec_tx_common_sendbit: + +#if CONFIG_IEC_JIFFYDOS + + // Here is the place we can detect JiffyDOS protocol, by inserting a long delay + // (above 400us?) during sending command last bit, see: + // - https://sites.google.com/site/h2obsession/CBM/C128/JiffySoft128 + // - https://github.com/rkrajnc/sd2iec/blob/master/src/iec.c + // The 'iec.s' suggests, that the drive should respond by pulling data + + lda IECPROTO + bpl !+ // branch if protocol is known + cpx #$00 + bne !+ // branch if not sending the last bit + + ldy #$1B // 400us is nearly 410 cycles on NTSC + // loop iteration below is 15 cycles, + // and several cycles were already used +iec_jiffydos_detect_loop: + lda CIA2_PRA // 4 cycles + bpl iec_jiffydos_detected // 2 cycles + dey // 2 cycles + bne iec_jiffydos_detect_loop // 2 cyycles + + lda #$00 // 2 cycles + beq iec_jiffydos_store_proto // 3 cycles, branch always + +iec_jiffydos_detected: + + panic #$FF // WHOAAAA! He wants to speak jiffy, but I do not know this language yet! + +iec_jiffydos_store_proto: + sta IECPROTO + +!: +#endif // CONFIG_IEC_JIFFYDOS + // Is next bit 0 or 1? lda TBTCNT lsr @@ -86,7 +122,8 @@ iec_tx_common_bit_is_sent: // Give device time to tell if they are busy by pulling DATA // They should do it within 1ms ldx #$FF -!: lda CIA2_PRA +!: + lda CIA2_PRA // BPL here is checking that bit 7 clears, // i.e, that the DATA line is pulled by drive bpl !+ diff --git a/c64/kernal/iec/iec_tx_command.s b/c64/kernal/iec/iec_tx_command.s index 04c8a0ca..9a43b02c 100644 --- a/c64/kernal/iec/iec_tx_command.s +++ b/c64/kernal/iec/iec_tx_command.s @@ -16,6 +16,15 @@ iec_tx_command: phx_trash_a phy_trash_a +#if CONFIG_IEC_JIFFYDOS + + // With each and every command, check whether device wants to talk JiffyDOS protocol + + lda #$FF // unknown protocol + sta IECPROTO + +#endif // CONFIG_IEC_JIFFYDOS + // Notify all devices that we are going to send a byte // and it is going to be a command (pulled ATN) jsr iec_pull_atn_clk_release_data From b076e3ccd047fc44e441f40b94c96f2ccd2e5b35 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 1 Nov 2019 22:08:06 +0100 Subject: [PATCH 035/105] imported CHRIN from UP9600 driver --- c64/aliases/,aliases_ram_lowmem.s | 21 +++++---- .../{chrin_rs232.s => chrin_rs232_up2400.s} | 6 +-- c64/kernal/rs232/chrin_rs232_up9600.s | 43 +++++++++++++++++++ 3 files changed, 58 insertions(+), 12 deletions(-) rename c64/kernal/rs232/{chrin_rs232.s => chrin_rs232_up2400.s} (54%) create mode 100644 c64/kernal/rs232/chrin_rs232_up9600.s diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 211b19e9..d821ffaf 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -104,9 +104,9 @@ .label PTR2 = $9F // -- NOT IMPLEMENTED -- .label TIME = $A0 // $A0-$A2 jiffy clock #if !CONFIG_IEC_JIFFYDOS - .label TSFCNT = $A3 // temporary variable for tape and IEC, [!] our usage probably differs in details + .label TSFCNT = $A3 // temporary variable for tape and IEC, [!] our usage differs #else - .label IECPROTO = $A3 // [!] 0 = normal, 1 = JiffyDOS, >= $80 for unknown + .label IECPROTO = $A3 // -- WIP -- [!] 0 = normal, 1 = JiffyDOS, >= $80 for unknown #endif .label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details .label CNTDN = $A5 // -- NOT IMPLEMENTED -- @@ -162,8 +162,8 @@ .label LDTBL = $D9 // $D9-$F2 screen line link table, [!] our usage is different XXX give more details .label USER = $F3 // $F3-$F4 pointer to current color RAM location .label KEYTAB = $F5 // $F5-$F6 pointer to keyboard lookup table - .label RIBUF = $F7 // $F7-$F8 -- NOT IMPLEMENTED -- (WIP) - .label ROBUF = $F9 // $F9-$FA -- NOT IMPLEMENTED -- (WIP) + .label RIBUF = $F7 // $F7-$F8 -- WIP -- RS-232 receive buffer pointer + .label ROBUF = $F9 // $F9-$FA -- WIP -- RS-232 send buffer pointer // $FB $FB-$FE -- UNUSED -- free for user software .label BASZPT = $FF // -- NOT IMPLEMENTED -- @@ -206,14 +206,14 @@ .label M51CRT = $293 // -- NOT IMPLEMENTED -- mock 6551 .label M51CDR = $294 // -- NOT IMPLEMENTED -- mock 6551 .label M51AJB = $295 // $295-$296 -- NOT IMPLEMENTED -- mock 6551 - .label RSSTAT = $297 // -- NOT IMPLEMENTED -- mock 6551, RS-232 status + .label RSSTAT = $297 // -- WIP -- mock 6551, RS-232 status .label BITNUM = $298 // -- NOT IMPLEMENTED -- .label BAUDOF = $299 // $299-$29A -- NOT IMPLEMENTED -- #endif - .label RIDBE = $29B // -- NOT IMPLEMENTED -- (WIP) - .label RIDBS = $29C // -- NOT IMPLEMENTED -- (WIP) - .label RODBS = $29D // -- NOT IMPLEMENTED -- (WIP) - .label RODBE = $29E // -- NOT IMPLEMENTED -- (WIP) + .label RIDBE = $29B // -- WIP -- write pointer into RS-232 receive buffer + .label RIDBS = $29C // -- WIP -- read pointer into RS-232 receive buffer + .label RODBS = $29D // -- WIP -- read pointer into RS-232 send buffer + .label RODBE = $29E // -- WIP -- write pointer into RS-232 send buffer .label IRQTMP = $29F // $29F-$2A0 -- NOT IMPLEMENTED -- .label ENABL = $2A1 // -- NOT IMPLEMENTED -- .label TODSNS = $2A2 // -- NOT IMPLEMENTED -- @@ -282,5 +282,8 @@ // $314 $334-$33B -- UNUSED -- free for user software .label TBUFFR = $33C // $33C-$3FB [!] tape buffer, our usage details differ +#if CONFIG_RS232_UP9600 + .label REVTAB = $37C // $37C-$3FB -- WIP -- [!] RS-232 precalculated data +#endif // $3FC $3FC-$3FF -- UNUSED -- free for user software diff --git a/c64/kernal/rs232/chrin_rs232.s b/c64/kernal/rs232/chrin_rs232_up2400.s similarity index 54% rename from c64/kernal/rs232/chrin_rs232.s rename to c64/kernal/rs232/chrin_rs232_up2400.s index 7c39d342..252cf2db 100644 --- a/c64/kernal/rs232/chrin_rs232.s +++ b/c64/kernal/rs232/chrin_rs232_up2400.s @@ -1,14 +1,14 @@ // -// RS-232 part of the CHKRIN routine +// RS-232 part of the CHRIN routine // -#if HAS_RS232 +#if CONFIG_RS232_UP2400 chrin_rs232: STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 -#endif // HAS_RS232 +#endif // CONFIG_RS232_UP2400 diff --git a/c64/kernal/rs232/chrin_rs232_up9600.s b/c64/kernal/rs232/chrin_rs232_up9600.s new file mode 100644 index 00000000..eb39f003 --- /dev/null +++ b/c64/kernal/rs232/chrin_rs232_up9600.s @@ -0,0 +1,43 @@ + +// +// RS-232 part of the CHRIN routine +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +chrin_rs232: + + phy_trash_a + phx_trash_a + + lda #$00 + sta XXX_SAVBYTE + sta RSSTAT + jsr XXX_RSIN + bcc !+ + plx_trash_a + ply_trash_a + + lda #$08 // XXX don't we have some routine for this? + sta RSSTAT + lda #$00 + clc + rts +!: + sta XXX_SAVBYTE + +XXX_DOGET4: + + plx_trash_a + ply_trash_a + + lda XXX_SAVBYTE + clc + rts + + +#endif // CONFIG_RS232_UP9600 From 4a1351de4c096c75f878c541cdb9ea828ab4663b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 2 Nov 2019 22:37:48 +0100 Subject: [PATCH 036/105] fixed tape filename pattern matching --- c64/aliases/,aliases_config.s | 3 +++ c64/aliases/,aliases_ram_lowmem.s | 2 +- c64/kernal/tape/load_tape_turbo.s | 23 ++++++++++++++++++----- c64/kernal/tape/tape_common.s | 29 +++++++++-------------------- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index f01d3da0..1ea8ba6f 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -163,6 +163,9 @@ .return 0 } { +#if CONFIG_LEGACY_SCNKEY && CONFIG_RS232_UP9600 + .error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP9600" +#endif #if CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK) .error "CONFIG_LEGACY_SCNKEY and CONFIG_KEYBOARD_C128* / CONFIG_KEYBOARD_C65* are mutually exclusive" #endif diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index d821ffaf..4766472e 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -206,7 +206,7 @@ .label M51CRT = $293 // -- NOT IMPLEMENTED -- mock 6551 .label M51CDR = $294 // -- NOT IMPLEMENTED -- mock 6551 .label M51AJB = $295 // $295-$296 -- NOT IMPLEMENTED -- mock 6551 - .label RSSTAT = $297 // -- WIP -- mock 6551, RS-232 status + .label RSSTAT = $297 // -- WIP -- (UP9600 only) mock 6551, RS-232 status .label BITNUM = $298 // -- NOT IMPLEMENTED -- .label BAUDOF = $299 // $299-$29A -- NOT IMPLEMENTED -- #endif diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 496d6f61..138ce3f1 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -9,7 +9,6 @@ // XXX use calibration bits to improve reading // XXX handle load address from Kernal API -// XXX finish pattern matching #if CONFIG_TAPE_TURBO @@ -30,17 +29,31 @@ load_tape_turbo: load_tape_turbo_header: - // Read file header + // Read file header; structure described here: + // - https://www.luigidifraia.com/c64/docs/tapeloaders.html#turbotape64 + // + // 1 byte (skipped) - file type (0 = data, odd value = relocatable, even value = non-relocatable) + // 2 bytes - start address + // 2 bytes - end address + 1 + // 1 byte - if $0B (tape timing) contained at the time of saving + // 16 bytes - filename, padded with 0x20 jsr tape_turbo_sync_header + ldy #$10 + + // FALLTROUGH + +load_tape_turbo_header_loop: // this strange loop puts metadata after file name - ldy #$00 -!: jsr tape_turbo_get_byte sta (TAPE1), y iny cpy #$15 - bne !- + bne !+ + ldy #$00 +!: + cpy #$10 + bne load_tape_turbo_header_loop jsr tape_handle_header bcs load_tape_turbo_header // if name does not match, look for other header diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 95ccc478..f9d21c02 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -122,26 +122,17 @@ tape_handle_header: jsr tape_screen_show_motor_off - // Header structure described here: - // - https://www.luigidifraia.com/c64/docs/tapeloaders.html#turbotape64 - // - // 1 byte (skipped) - file type (0 = data, odd value = relocatable, even value = non-relocatable) - // 2 bytes - start address - // 2 bytes - end address + 1 - // 1 byte - if $0B (tape timing) contained at the time of saving - // 16 bytes - filename, padded with 0x20 - // Print FOUND + file name ldx #__MSG_KERNAL_FOUND jsr print_kernal_message - ldy #$05 + ldy #$00 !: lda (TAPE1), y jsr JCHROUT iny - cpy #$15 + cpy #$10 bne !- jsr print_return @@ -152,13 +143,12 @@ tape_handle_header: // Check if file name matches -/* XXX does not work yet jsr tape_match_filename bcs tape_handle_header_skip -*/ + // Setup STAL and EAL - ldy #$00 + ldy #$10 lda (TAPE1), y sta STAL+0 @@ -206,26 +196,25 @@ tape_return_not_ok: // // Check whether file name matches the pattern // -/* XXX does not work yet + tape_match_filename: lda FNLEN beq tape_return_ok // no pattern to match - ldy $00 + ldy #$00 tape_match_loop: lda #$20 // default byte, for padding cpy FNLEN - beq !+ // end of pattern + bcs !+ // end of pattern lda (FNADDR), y // byte from pattern !: - .break cmp #KEY_ASTERISK beq tape_return_ok - cmp (TAPE1 + 5),y + cmp (TAPE1), y bne tape_return_not_ok iny @@ -234,7 +223,7 @@ tape_match_loop: clc rts -*/ + // // Get user decision whether to load the file or not From c1104e0738d5d99d337202d797326c6330b9d5af Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 2 Nov 2019 23:32:40 +0100 Subject: [PATCH 037/105] tape load now handles secondary address --- STATUS.md | 1 - c64/kernal/tape/load_tape_turbo.s | 1 - c64/kernal/tape/tape_common.s | 36 +++++++++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/STATUS.md b/STATUS.md index 73d59193..f849504d 100644 --- a/STATUS.md +++ b/STATUS.md @@ -33,7 +33,6 @@ The following ROM features are currently missing: * BASIC expression parsing * floating point routines * tape (normal mode) support -* tape loading ignores secondary address and has no pattern matching * IEC support for SAVE * RS-232 support * NMI handling is incomplete diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 138ce3f1..e1cfe6b7 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -8,7 +8,6 @@ // XXX use calibration bits to improve reading -// XXX handle load address from Kernal API #if CONFIG_TAPE_TURBO diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index f9d21c02..2875973a 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -164,6 +164,38 @@ tape_handle_header: lda (TAPE1), y sta EAL+1 + // Handle the secondary address, 0 means loading to location from MEMUSS + + lda SA + bne !+ + + // EAL = EAL - STAL + + sec + lda EAL+0 + sbc STAL+0 + sta EAL+0 + lda EAL+1 + sbc STAL+1 + sta EAL+1 + + // STAL = MEMUSS + + lda MEMUSS+0 + sta STAL+0 + lda MEMUSS+1 + sta STAL+1 + + // EAL = EAL + STAL + + clc + lda EAL+0 + adc STAL+0 + sta EAL+0 + lda EAL+1 + adc STAL+1 + sta EAL+1 +!: // Print LOADING jsr lvs_display_loading_verifying @@ -269,9 +301,9 @@ tape_load_success: jsr tape_screen_show_motor_off jsr lvs_display_done jsr print_return - +!: cli - jmp lvs_success_end + jmp lvs_return_last_address tape_load_error: From 79f8fedf8bb1cb020d1401dec8a431e50375aba1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 2 Nov 2019 23:51:13 +0100 Subject: [PATCH 038/105] tape loading visual tweaks --- c64/kernal/assets/kernal_messages.s | 1 - c64/kernal/tape/tape_common.s | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/c64/kernal/assets/kernal_messages.s b/c64/kernal/assets/kernal_messages.s index 3dd5d54e..ed113935 100644 --- a/c64/kernal/assets/kernal_messages.s +++ b/c64/kernal/assets/kernal_messages.s @@ -72,7 +72,6 @@ __msg_kernalplay: .byte $80 + $0D // end of string mark + return __msg_kernalfound: - .byte $0D .text "FOUND" .byte $80 + $20 // end of string mark + space diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 2875973a..24acc279 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -106,11 +106,11 @@ tape_wait_play_loop: jsr STOP bcs tape_break_error -!: lda CPU_R6510 and #$10 // check for pressed button bne tape_wait_play_loop + jsr print_return jmp tape_screen_hide_motor_on @@ -134,7 +134,6 @@ tape_handle_header: iny cpy #$10 bne !- - jsr print_return // Header, wait for user decision @@ -215,6 +214,7 @@ tape_handle_header_skip: // Skip this file + jsr print_return jsr tape_screen_hide_motor_on // FALLTROUGH @@ -300,7 +300,6 @@ tape_load_success: jsr tape_screen_show_motor_off jsr lvs_display_done - jsr print_return !: cli jmp lvs_return_last_address From 176fc9749e67bc55e242c3e5e7f81ca951fab8cf Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 3 Nov 2019 09:54:48 +0100 Subject: [PATCH 039/105] various tape related fixes --- CONFIG.md | 2 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/,,config_mega65.s | 6 +++--- c64/basic/commands/cmd_load.s | 6 +++--- c64/basic/wedge_tape.s | 4 +--- c64/kernal/tape/load_tape_turbo.s | 7 ++++--- c64/kernal/tape/tape_common.s | 2 +- 14 files changed, 13 insertions(+), 14 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 5d2aad10..1d200f10 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -215,7 +215,7 @@ Feature needs about 330 bytes in BASIC segment. If unsure - enable. If enabled, a simple DOS wedge is available from the direct mode for turbo tape loading - supports `←L` only -Feature needs about 30 bytes in BASIC segment. If unsure - enable. +Feature needs about 5 bytes in BASIC segment. If unsure - enable. ### `CONFIG_BCD_SAFE_INTERRUPTS` diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 92d9c9310b555727adfa63938f990a5ff5d64df0..c31a9ff71c4eef411ba53e3c91ec4b8acdc232c7 100644 GIT binary patch delta 1648 zcmcgs|8G-O6u;G7_14vK&d9`TV7MuM6sO$4nm@kbLjY$xtP zMJAnBWjH3++SB&6E3QtQ49cd)xwk}llKp~-v9eVMk?;ik5{x`=R}=mK6W>eTx##9{ z&bjaNIrp@$Z(r|xYjSXMYxCv}8#lD9AYBzzWT3)R+!M#se=7)IFr-{;psVDFKy0RB zzKW80rsbBZ&RK#&$rjU!yJvt5;{}fh>qM|M=B(wFf7x_v`tmcjUU6ed# zUb?j>9Xm(wCjpfE>&!DnI>R+M3Fk(0+cc~psaJYka7uPUx{$CSV%dA8tfJ%zhd+?tZE=B zYa_8b7xUL*WT|tRUF=gUG(p-iMV@x94jhm63%G3xtY6x60e3{Ct1$)1tqL!0M(MTZlgOA=@ zz?jN2h}*kX>1Clan5%hA0rh<#EMz!NEebhrBd+msQ7^|yH{;{(D-@kZoMs*yF=@ZE zmA#&I!`O&fyWvHMLx@Mngpdt!79{YL3(~WZJc3EkzbU`a*R$U!DN1DKCB)3! zgvi3YOmGK_t7dU|nev(Zffz40%GSlujn26Iz{W=rv5G>V()WD*mo#YRLj? z7s*-g32-TO3CmxeQtLx*wW;4Z#uUAu>9YqDANV0ibAPsbDR4GsfNl!3@uG4Y);+D5q9CxLNadg z==`+J1!Nm`#P#f yy~95ZN(YDWQ;`EhxH;Niaz`3+&M}|AFib8wD$1Jaf%`h@@Je7E#<-iI2>k=B=M)Id()pZ+;WT!DY5`54XPHDHciHQ@VArWOfvwe`iz?tOU zd(OG%>vzsQmxeD5_g-I_UpYDY(#Wxq(>>(XnC8j`O;+MkdZe3`&c{frM&67|qNcIg zVCZT#m>4IcpvuCwx(~JZ1GCGptyUvEy(bZhhGw{VG54*!`m%Q)HwrU5 zrBBo9Htx83*E>~ljT#-6&mh*HB&wb&>ko4&hGF#fz=lhi&^tC5Wm49dY)}yjxQMzC zDB@Wci$h3=8;rqNtQ5)X0y?~_kE5tFP!yC-y$e;l>Sg+|rjzF645O8kiX#1BlX7oT zcS;m}P0Kr1JPuRkIni_GF(a$y*<{h4W~C-dez6e}^3GhEaU0#{*|f{qUYE8~;*059Fy7g`UT5&t-V7_H z^2&k(V4PCs85=VqxwmOeV;0A(x&WECO_6-R$-BY03z9M?qYu=bVXk)ja*UhYx7W=- z&<$nc3z|$8Y>Z27sT}KR)%0oWYm5u)6vAyhu_PIJ&Bh$eC(-ysY*NbEi1LI%%rX+8 zQlI*suc5n-W{x{tYZ$wssyva~prPD44dD$LGZzs1J;ng$lgK+tW9ou$2f;QwtQ^q? zltDsQ^q_ahbXreiNOl&}Teb5da&Z7 zgL<=U;N;OHsavItGEe&GG%Ka^1mDHZ60-V)@`XOBe7VUH4F)R|rBWifHZNUIk~6U@ z3uH8&srs+C)U3b3{V=J1>-URB{z~Um7dfco9B{xday#5LDV68jeZ^VBkF`0UR|on2 zaDOtxlACdz`-ZnzG8L1=6vi__-O42HL1l>A%78RRbxc(-IR*p&Y*w)8u1(1LH!mE}XCx!E9dR(MC+L#Ah8yf2SO;X#5_B_!%i(u-G*o z4Hqa=3IWH-PgToi^Hq#@gAX?>U ztSnc#{Q0S>i=rE6t=ZJ(il~1zy@>14=C_4hO6QGgtUON1+s$vZCLfu_^}@Xh^Y^&0 zgvzx`x#T0XDLA|F6cc;=m3AqYRQvp`JqNmuztDAnVVnwq8)b>SGjgQT2?3wiTr(U_ ggIGtro&4y`fJlu$LcEdg!RpfVM(FQ5Y#hA*0&E}7F#rGn diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index 13b667d028927f0d798b58924efbcc08a501d39e..b3d156e94fe36d3c3997ffd6634e3c3c48fa06a4 100644 GIT binary patch delta 1899 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 diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index 4f7b7003b39782bf0e3cf7757e7b5288279a75e5..af98c3657c7ca0b5e31604e3006ec9f343b48d3d 100644 GIT binary patch delta 980 zcmYjPZ)jUp6uvB3Im2RB%pGaW!Amg80Er z*p$5yghIl#vJGk<*}Dl@^F~UM;<_aJvauJOybprlK%cEGezAQ+6hyF|w0`jMIPY+O zzu$T1{O-9pbaBY@`O4zTOC!gJpBo-~ify>}#HW=REMyw~-_tayWHOl@cP?aqN-Kx- z3)#SE-qv14!bh4igZ|^Zsjz;}UVK(zr#)vDa^8gKOOfw6f7^c6K5mILXtJQK7jJB^ zG20V6Jqmeem97?3B&))QR8{(rW$b;sN=QxP zPMiskayX{HaZu)+)8h^Q-|}P%p%fv@dc<<+#QK9o z*(t|_BRJJ6mP}T2bYP>(esB!ONNGh8@&lxdb!3Pz6wk#(I-!#OBDu3dLq$adY%~Mm zMw)mO_Gc)Jzbvv~xUU;+KlGVjz>g&FUhTTUldBP6<@eE9jZD>f#XfJfEN$uyXNcWme zQ}$UR?J)T{d5NEwZ*QOYV15UQF4Mm9+9EwrCLi$2x5!AL;w3JX2S5S4FdyEHC(G=c zaM;&lUOsXuN)j9#1lw|+{!vNO4`+|)v8<%`Rzxak{5vCb(=TYPf-I5uYuu^(p$D%? zdbDiEx2=M48_;r_P(}DE!s~6qx?iBhaxUA6A!K)OMZ%gBgj+HImTKDyTLUlDuS}>a5K6gf(Ww} z+R1LliJ11;F_qHu$V*6aC+*5sonE^?M7*#+!q{La)YRHk0$Xp0j!js6*9rQkkK^6% z{oeOIe(!tVZ=`3WNBU%GcIiO;>E3<4{g0z_(i5Q})!LfgW<}Dx)jj2cLn^*jZu`F*4#DXGa#4KMGv1t8NcEN@(P+#LC z?K7%6V#W&A{WASShu5OWuR_^u3EJv8zZ}a`^7P_8#w&vx7{9_D;Rb9MTrp7#+s*8= zQ9t{bXSE1kU53j!8I?CqiqyXYg}Kelf{FUMts?jU69~A7;d%5iyQ|X*m%Z3))osQv zlLEaklJ(1AM>bzqyec(4XcfymiI0N&i|8iTBE)k90pd9%xi@V&n3lpX$j1QE2 ze<^Rulnm}HS|QtG0s9ZYp+5If_sU1>TzM1Cxi>JUGU!KlZx1=MyTXt=)J%hBEVvet z0%lcOX?wi}z@&kv!QDUc6q(Qh|D3eHVg<=F1ad%9 z(Ox0SUBrN@ptprB^!b_3gb4qc3h`68h+gm)B#y%)}hQ1w}L|1`HbL zWLxw0X2V%D8&Ebf!q*h-@qS9tRe|8vP-KHOe#5*)JI0WWQl27Ubfqn_nKd$^?fowa z-qD?t2;qC4sQaCcg2Aqt&l|gZ!>h&W{}?q~O>~SX)no%#>liNJ8d=oNB#6oKd%@Lu zvOu&1_ik&O98J54g(NMw7G`%6;T;%7VB`hyZsi!>qZ~hz@E_T&yoS+-;vj0}{VgkV z;PMi*=2REZnM8_Ag(RV(XZaxW%se{I?>cm_&)y$@J{;W{jYgv3r=AQ)DT=t)aS9k; zOuOJs)3ICont$-1@(mtRzI~8!n#c{fU*N=ibr!xq58lG3FM)V=>LK9C;3mQ#{c})y cn7KNSUYCMRp1IT8PK7}i2KgmY^@INT8`s~#9{>OV diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 7466b691b6179c32f08a92dbd463a434ef1ff446..c8caf81cf6e4fa5ec035f053f9c9afe5bcfd93c3 100644 GIT binary patch delta 1736 zcmcgs{ZA8T9DnYvue8uQK|m%vfFcMYzClH*_<|nu+??oq*^5o4v&()r5w@0Wt7B$n zCAS}Nj(8!xetU%)8nO{_6_#zRM>4$`mTXIwF{PWD887N);u5>>!4m&~CF?c!eeTKU z`|^Cg&-c^a+TH5>=*H-c-EBL!Y~9kaM(i!C6i3R6Sv4bGDXYjm7o%!MA@o{S$iPT% z-iMrMGv%_Cl2~Y}vs9j0z$ud0Zd#K+2SkjIh9hWbDk22L4^1c73Q4q@x3Y^RahG{T z$+_4-g>XLMlfAsWiI;7jjJ4=>Gasj;gJRhH+5St4TBqAps{ctR6_2mTM~F`%NiUyH zdPAH1A+PT=Z&b7yEAq$b`2;Jl3r8`(%y z{K3)^oO~dRJS4u`|M@34C3;i|b3&Db1$O=z18qUFQ|Hp!J;fQyS8SmIjidI6BAjt^ zay~L87o2%&F_&<0{7@cuA(u-yxoYa>gn*JAYFytaCafOO>MUpPg1Ew2QmkfVtNvBg znjoy&s&N88q?V!CH!Hs4Yzlr79p-4)tZe<-rgQWyS-1lV33V!Ls0%G}rDQ|R7@9xL zD?~D%B}|X|kzXoQgW&>xfGtX~%*mxnKg;w?x$pahZ(=@GpL8`8>u{lp@T@ z7Ns9u=P-8+%slGn-~g9m7&RyCd`uY6t(<;_5gx>*+_xoikuaJ$Jz>)R!j-)N884G7Kajey1Ggwxs zW})MXaI{@fiEdGwb+*Xo@yWdnobX!2KwwXXcNh!36_1gZ6HgV!`P8B~k8VD^R}S>6 zLO-K#Mx=oFfxVn&K;97AC^v^%sB%O0nl~ZQ8ITA~!mzOtzqJlsFvLo}@SKrzi=> zQ9DA@k}2uccd8YdL!NHWhNhJY;lf~aTB}#HdNp>bD$e)uN}%`E<%aB(SbN2cby<)} zs7o|lq*y@C5ziLM9;fu`&G?q%+y3yyX*1w@pIq0gMMddoj;b= z{_rdLnAsOs-WI2GkCe^K7-ASpuCH0-~tL~Th8 zGcG<_vK`->OW$yi8QG?~kwDbuPfHI~2d-C2H*W3(+gocE+d;$=s1(^b delta 1712 zcmcgt+i%lm6nEmJcIviC*D_i<+OOqS=!H;d8%om)TUi)JDr3?v(u7}NLEFpru!oi@ zATVN+*b2e4Tb4>}Rh);-LrmJ9IHgV3N|R1Y{dbPfkDMRry|y&FbbRdP(Zi!Bd&p~Y)Ry(@G|!}zh?nNi$fP|=-iq_?Xq3+S z16Q*CM39VuByd~mFGl0{^={2H+O<%4XCg2aP?OT9+%EgVdiKIOT4Ej5_UXK|+0j`s zeYKWW^U_gAPyHB>g>|$qkg$w|>7>~%5>Ju6SiV~s}hFHk@#i5|+7d{D~BXyYE zGlL0oD^1=h#ab=8u#R`^>F4O2q9~=qw`LP3l+HCuoGe=qIm?7w;d~{($SLm95WcwA zD2*~`K9W~B4B~E`5=2>-uf&O6N;m3uHwepz%$s4F->Q<|O)JFrX3~^h^XjM4HjBK$ zZ&ry*RyJV_(|M&{V?E9c&8PC>9G>Rms!Ba$BjzRx8`h%K{J2qng3Ow_oBXuFyH42) zyf`DE533T?6|XBt*|AQm`Z~H%srXz}AakY_*Swi|Jw~Cm%s8rNj#-Z*s3rNU`+M4> zO4zuI0b?lxNP>wXujQjACZ|7{iciRse9pwCOlU-}AQ6@CliqhVdi&JO5sPb#AZ}_Z z6S*}tkXuy)ctXIEa9HS_+5je+$XiO|(wwW6ARrHlhm-+vkf=+F-#MgPAdONaJB@W< zQqmJwV`y9r$>swJY+wf(9N>fs=wCjt%m526sDvMvPsUPip2Gr5hCk$A^{Oo?NmJUAHl_K~X_>u4 z*<9}Hlx>AY#j+X-ThR=C6pnkTbe=5($SuQF3-Www#Bp;+OL znj)t+udrxC<_!0<4)}jkmRB^sz+nBgl)@SG3X6sdDpd{vch7G%i@ImNCPNpdg!!h7 zbE;wV?2=HJZ_-y(N)S{NM++#U=1%XTX6m-$ys7``6Q%;?cY`B8TT3oDQ_%kis`WU} zLPGsgx?g>&rFzlYf-~9P-EL!><~HgQQvq-rm1wLYSH1Yvt2O7`cHHXv*4?&<^!L`6 z@HyQ4E|*IwtmX;RJTB$i&2P3RAL^ym!a|k)SDY)Na$PZ(e26wVi)v3XvB%#<&*zd- zUrT$>zV0J0cJHGot3zN%St4)kGQRu|3qBjQ#TZ;O7L*W32$o1~ON2Nh-Uj@FL|$q0 Ols^^NfP0n@clE#hN(it3 diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 7134217e564acab52adb81158ace005cadf15516..8be831054d9ef93a89a42566488e1c06b0ac14b4 100644 GIT binary patch delta 3108 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 Yc>NTfj^K=d?Xt`W3{xh zQ-jK58CJT%S1Xj#rf>2Xf|UDR@epmjeRjqwEG$ujOTsaEX*!ly}#iC`gY0T@4Ubx`y_rvEYg$|y|9Sxp6h>x@$y8A zOc8u^Rx>U*&~U`Xq9O6Onmd{M=S91w%M4P$%?u+(|WS#+>oyv@tXiN49{SLXQMmj*krFkp=Wk-1QCW0A77NaEIv@ zPk`RmF0>;}P#!#cjLgWMv%O>j_Rh9v5fd;C{a5#;U?d~!bcW(zRBEbMq;QI`4yWMT~go|y%|DR6-g&M zejzwqTGSQ7Uj2!AJI)luL)bR?Ye48qsK zJmllF`?(+&F16y%66$reC?ljE=U1d`IAlGSKtj=@oUpi2e=oB+F211OYuy@kh(v3rT0BPHPM!BC5fdNq5GF9l%N<;< zM4?qvc53K^V(2@iLKEi))s2{xC5s9p<-@jA0+T!l2$MY+rVegQD#MjQ6W{4^3>tYf z5`#Qb=gycck~C)#nQ#`Gc-~0~%qP6~yunOoil+=OZMrLljwH}b0>3&Vy@*#$y-8h` z7}dZs;(jZhGH?|bxH@Iv4M_w4@>KdwTG5_EagE9o+CbUJt0x?ciCdQE-1k2^`6-?J|JFH(D`!=W!!bx!=Wl)l zH;zSkxXo1p$D$)*`|=I?D~GQfo`WHtTmHE9!3c#iBjEBjCo3G}&GLRF&4f+_EIjzh z(W-Eb{f{zdKOih_iVaYB$DE^eARWHFAtry&_9!EtYoGGR;t zP+yBYNk{-N>Ov&|rrgY;Mxo)4*|+{`%Wb=UxsBQ+ewV9QhZ@f8DQ5*yJ|lSKq546% zSw892!JP~MRCQdY#P94&b+tEw#*c)@*C)Ip|w-44?Fu6 zM)0U)Uy>X|YlG^l6U|M#j;dA9Q@Vy^G?~$%DEfB6b->bHBHJMIzC`z^H^J=>2J4SC z^me~b3xn@df@jYyY|<&HUA&%Gym}WP%cA5%1GY0LW71*hzb+$@y;NeJ*k(4scMxuU( zkr)^<2RTY~f&E5{@HTIR@CWu|Dk8Tfa}T{XD<4c{A!LO73CWhvkxVe-Q{f!COFW;S zvw1jzhQeyTw3;Em)7AV&XA*d4#L|Usox{B`klqhK>V^`vJ^a%GN|ku4vAXKn2vl+- z{wN^(4LZS}?0?CAs2}#r{?bUYTdGz;^8YoIY$xkE9dv>cXeR&xkuEUa{-TQhnh<_| z_CF3$e!}ZeSoNRQ%PWkDH}U~H(FTqZO+dnj#GM5z=&1Nq!OpzV)CuahpPNh_RxvBS zzWS#7#2me0*}k`y7jD6c&6f-m&s#27aDcSye=bJ1+vWFx=@Uoa2I0F?<2!<$oq^6$e(X z%Yl42EX+ISgaznHrMhl+VMvUwtQD_l9uUv1>dt#6C=V-N_PoS+Gs*2}cMRPYM^B6U z3OB907F9BQTm<<-z{9(KaL1$F?y0EK4V-B*UwctX97J7Wu<#bTS1c^@G26r9bkXnV zF7d(D8^mMALaRt<-eOTJucaEl9+PPUB55*RdR3r#B**1L&4}QGOFf7PhfvEBem7nV zZ0R;Y3Os2G+o(}^(*B6V4?&M3v)CO+$K#S2MC_WrfkJ8puW2`9=e-11UR$&l)hcF70-jU;H~O+1_pK!?++@k2pa zR70^r#!0+-Qt03vCzL#>H4xJSF}WYgO_G9&Bko<3zv0C&J~xTi#&IHq-67-$5(Q7` LqNT5XU}ydf!ea}m diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index cba79c6aaf308612aa26b8418504f34dbc309db0..10db46b38c21e704d8ca74cf9d9523116434c9fc 100644 GIT binary patch delta 2682 zcmZ8j4Ny~87JhjzAqkZdP#}W9t*aKOMf_(Rr-Hv}z3TMGDY`rL&AKxUj?TE#?Z{Ny z;FgCB7R9}G3p#3eo5vCyO4yD+(4_*k)-YAy8W;btx{e8iw&Mc~?*%t6dtOp^JNqVc z@3}wc-1GCDb5dDSS<>-+8%>;v-;;yP40?MraWivGW2ccx##JuzFXj~@G5X(N?ldlZ z)ZF#J-IWZP|j)hX6FT%c*dEErufmj0^Mr2%TyZI*_Ue z9vI?+(cVWO9<@BebDU(a{IdMvhaKms*(l_98x#8Xp zzi940|q^y7yl+mN?) za1yN;@7zUuSup`Q72Gstc)+<(Vc5f2!lp{>#;iJ=%=H&|~ z$~GK4uw&aBwr#JkU6s90hEGvsc@jQ393FW}P8kZyP`iq+`D<+rwhFXFMk_-oRpwLL zsCxyLTO1REijU zOTkwab~$aNz!&JgT+iUoR5QXSBdi*EDnGt|!SOLyeW0caZz^3qvtTAwLcOthTybdD)6 z>jp(L+?lSBZezh3tNbHu*n|mbg)@q%5#HFHF$DL!Uy+k^gWjk#y(cQpavE=E42k9j z>xa97EqLZ|jpcDsa=+z9PgF7?t4!vaHW>{Hb`Ez&$RADRCa}i60=I_AooUFCrZ}mK z=OlB-m*{%*GR_FH!U@Y$K3O0V&1axAh0lXQ=+nU1i(xonxyR4LOM=C0bFZt<$|A1{ zZqdfSssa)9?riaqdqy$KQYMQPFR`VNxIv%hxR6kOA!-7*%4$6k=nFHIk`j9lzxkX`bS|C?+JF74z+gA9+FyNXILbv zIlUBYe=cTwd1(uNX{5&TliiNz5A)GOMnLqPC+JiZjYRQBBi#9_&gw1}m5zBgiHR*8 z|L`J-fgB*46JMlnhQ9bH@sk8d>qRtvkCdd$nEHMYg6?7PyMFvuFe%EwkBpcWlV#?t z1+T7Im9&24YP4i=9d}bhn@Kq4Wkd%5J``sfmh)oBWMdNuAfqWS%xhO`5u*T*@|4c) zw3HmbJ7?0%fF`-x9@hwLRu%?)TqUKcQ`h|;Pez=_5&i|wF}!3<<2a>ivEBA_qT=mg z7GCq@fmn2(98dk!aaN(w`wGON(amtjSetNE(ifw10XqvB>1vQHHJw}NZ_a}q2h|?H z@wls@ClS;=pbF<3x6ndY<91r;Y}`d(u4)jv;+p&}YK`TasRG$UT0%iWzZlAc+?ke? zT>}Y{vheNFMO)uoLoNQIeX34Z+^z!aUCpyYD&885;V-4*%gYzfSw&qjD1R=1d!L{m zhFRe|vEPKK+j6H{mqJ zorJGP-3SJ)mONzvh}0kpbkS4RnOI|qu;>F7V24)wVTAqs5-H45l@xrISyV}7v?m&k zR#Z8wn>fCVt#CP;n*<=>g&W*0V6m20*3;z|z)YbLZ2#@bQT)zm{FM6^@1As5iZm?0 zjY~IM@^98r_kg|bh*tOEbVBIz(jw!IvO+!UwLpBKuCY)Np3xGn9z$osaBy5TKftY| zE8_)+G9fbkVu*D$)D#(SZ=prS$`-RwHHN!)k6L8#`}HV*FkTNdG#*xCWfniC~g`W zc&cx*fZzo{zeXGzMlPo+I&l5;GagbPqerOr1_TyptcJCjEN(W%sE<7J(9RzXRNrz zM~|Tp3C>tRr-w;)_8(Gz*-}e57cLBwzhtl15%M_u9bJfQ%$aKjBYfNdc1@Dcvo<)O zgkqv)E&Ll{gZ4P_v5KYyflL_k+;>yR8TQ;l7oK=-!`6|A=enDXd(Mlthdme3HNWTY z&7Bg>^=f2CjO;_RgW9SYjSqX8kRd4a=I4r2YHdhAiGG^!{Mp_r)I)|A-bJglm*Dk{ zL1gvg96xu0b)A#a;=%h&6*}R4a4|H)3s1<0xf!$1%D7L)vsD}&#RrG*ClT!RV^+cY z$M6rsIAI7Mi9l|3=KgBdMj5{?@62O%7BD;KGPpO4Cr5Fj-#N%rEJZC+AO2g8{0AT5 BELQ*k delta 3315 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 jKH7$#O+ZbuI%ksRIVNq)O;R&UY9^Vqlh|hL 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 diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index b5e6855b..6b179612 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -45,7 +45,7 @@ #define CONFIG_IEC // #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now -#define CONFIG_TAPE_TURBO +// #define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now // #define CONFIG_RS232_UP9600 // please keep disabled for now @@ -77,7 +77,7 @@ #define CONFIG_PROGRAMMABLE_KEYS -.const CONFIG_KEYCMD_RUN = @"\$5FL" +.const CONFIG_KEYCMD_RUN = @"LOAD\"*\"" .const CONFIG_KEYCMD_F1 = @"@" .const CONFIG_KEYCMD_F2 = @"" @@ -108,7 +108,7 @@ #define CONFIG_PANIC_SCREEN #define CONFIG_DOS_WEDGE -#define CONFIG_TAPE_WEDGE +// #define CONFIG_TAPE_WEDGE #define CONFIG_BCD_SAFE_INTERRUPTS diff --git a/c64/basic/commands/cmd_load.s b/c64/basic/commands/cmd_load.s index e7dc76f1..20e2a501 100644 --- a/c64/basic/commands/cmd_load.s +++ b/c64/basic/commands/cmd_load.s @@ -69,13 +69,13 @@ got_devicenumber: lda #$00 sta SA jsr injest_comma - bcs got_secondaryaddress + bcs cmd_load_got_secondaryaddress jsr basic_parse_line_number lda LINNUM+1 bne !+ lda LINNUM+0 sta SA - jmp got_secondaryaddress + jmp cmd_load_got_secondaryaddress !: // Second parameter is above 255, this can't be a secondary address // Use it as load address instead @@ -85,7 +85,7 @@ got_devicenumber: ldy LINNUM+1 bne got_loadaddress -got_secondaryaddress: +cmd_load_got_secondaryaddress: // input for tape wedge ldy TXTTAB+1 ldx TXTTAB+0 diff --git a/c64/basic/wedge_tape.s b/c64/basic/wedge_tape.s index 9eaffab5..4edbe8e8 100644 --- a/c64/basic/wedge_tape.s +++ b/c64/basic/wedge_tape.s @@ -28,9 +28,7 @@ wedge_tape: ldy TXTTAB+1 ldx TXTTAB+0 - jsr JLOAD - - jmp basic_main_loop + jmp cmd_load_got_secondaryaddress #endif // CONFIG_TAPE_WEDGE diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index e1cfe6b7..6b9ef138 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -73,10 +73,7 @@ load_tape_turbo_payload: load_tape_turbo_loop: jsr tape_turbo_get_byte - - dec CPU_R6510 // to load below I/O area sta (STAL),y - inc CPU_R6510 eor PRTY // handle checksum sta PRTY @@ -126,7 +123,11 @@ tape_turbo_get_bit: asl sta SID_SIGVOL beq !+ +#if CONFIG_COLORS_BRAND && CONFIG_BRAND_ULTIMATE_64 + lda #$0B +#else lda #$06 +#endif !: sta VIC_EXTCOL pla diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 24acc279..e6bb200e 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -300,7 +300,7 @@ tape_load_success: jsr tape_screen_show_motor_off jsr lvs_display_done -!: + cli jmp lvs_return_last_address From c2375f7ce4bb9b1ed7b33b857efc22860e702ca0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 3 Nov 2019 11:08:17 +0100 Subject: [PATCH 040/105] initial badline synchronization for JiffyDOS --- c64/kernal/iec/f000.iec_jiffydos.s | 67 ++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index 1b7aec4d..2448e2f4 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -12,36 +12,76 @@ iec_tx_byte_jiffydos: + // XXX disable screen - temporary, just for testing + tay + lda VIC_SCROLY + and #($FF - $10) + sta VIC_SCROLY + lda VIC_RASTER +!: + cmp VIC_RASTER + beq !- + tya + // JiffyDOS timing regime is very strict - before transmitting anything // we need to disable sprites and (if screen is not disabled) wait for // appropriate moment, so that no badline interruption can happen jsr jiffydos_hide_sprites + pha // store previous sprite status on stack jsr jiffydos_wait_line __jd_check1: + // XXX send byte + // Re-enable sprites - jsr jiffydos_restore_sprites + pla + lda VIC_SPENA + + // XXX reenable screen - temporary, just for testing + lda VIC_SCROLY + ora #$10 + sta VIC_SCROLY rts iec_rx_byte_jiffydos: + // XXX disable screen - temporary, just for testing + lda VIC_SCROLY + and #($FF - $10) + sta VIC_SCROLY + lda VIC_RASTER +!: + cmp VIC_RASTER + beq !- + // JiffyDOS timing regime is very strict - before transmitting anything // we need to disable sprites and (if screen is not disabled) wait for // appropriate moment, so that no badline interruption can happen jsr jiffydos_hide_sprites + pha // store previous sprite status on stack jsr jiffydos_wait_line + // XXX retrieve byte + // Re-enable sprites - jsr jiffydos_restore_sprites + pla + lda VIC_SPENA + + // XXX reenable screen - temporary, just for testing + tay + lda VIC_SCROLY + ora #$10 + sta VIC_SCROLY + tya rts @@ -52,11 +92,19 @@ jiffydos_wait_line: and #$10 beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines - // XXX wait for badline to pass + // To give the transfer routine as much time as possible, + // wait till a badline + // XXX this has to be carefully tested! +!: + sec + lda VIC_SCROLY + sbc VIC_RASTER + and #$07 // we want 8 lowest bits + bne !- jiffydos_wait_line_done: - rts + rts // XXX 6 cycles... we might be forced to inline this routine __jd_check2: @@ -64,14 +112,9 @@ __jd_check2: jiffydos_hide_sprites: - // XXX implement - - rts - - -jiffydos_restore_sprites: - - // XXX implement + lda VIC_SPENA + ldx #$00 + stx VIC_SPENA rts From 6f3906491628c248e4de6b94d13142385d262d0c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 4 Nov 2019 20:09:19 +0100 Subject: [PATCH 041/105] Mega65 keyboard support improvements --- c64/aliases/,aliases_hardware.s | 9 ++++++++- c64/kernal/keyboard/scnkey.s | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/c64/aliases/,aliases_hardware.s b/c64/aliases/,aliases_hardware.s index 63790da6..e7a7a51c 100644 --- a/c64/aliases/,aliases_hardware.s +++ b/c64/aliases/,aliases_hardware.s @@ -70,6 +70,13 @@ .label VIC_XSCAN = $D02F // C128 only .label VIC_CLKRATE = $D030 // C128 only +#endif + +#if CONFIG_MB_MEGA_65 + + .label VIC_KEY = $D02F + .label VIC_XPOS = $D050 + #endif // SID registers @@ -165,7 +172,7 @@ .const BIT_CIA2_PRA_CLK_IN = $40 // 0 - low (pulled), 1 - high (released) .const BIT_CIA2_PRA_DAT_IN = $80 // 0 - low (pulled), 1 - high (released) -#if CONFIG_MB_MEGA_65 +#if CONFIG_MB_MEGA_65 .const C65_EXTKEYS_PR = $D607 .const C65_EXTKEYS_DDR = $D608 diff --git a/c64/kernal/keyboard/scnkey.s b/c64/kernal/keyboard/scnkey.s index 01a448c4..0aadfd93 100644 --- a/c64/kernal/keyboard/scnkey.s +++ b/c64/kernal/keyboard/scnkey.s @@ -30,6 +30,34 @@ SCNKEY: +#if CONFIG_KEYBOARD_C65 && CONFIG_MB_MEGA_65 + + // Idea by Paul Gardner-Stephen + + lda VIC_XPOS // check raster X position + cmp VIC_XPOS // if it changes, we are on a MEGA65 with VIC-IV registers already visible + bne scnkey_viciv_mode + + // We are on machine that is not in VIC-IV IO mode, so try enabling it (harmless on C64/C65) + // If we are on a C65 (or MEGA65 with C65 VIC-III IO mode selected), the above test would + // have failed, but we could already be in C65 IO mode. In that case, this will disable C65 IO + // mode when done. This is not ideal, but as MEGA65s start C65 mode with VIC-IV IO mode + // selected anyway, it should not be a big problem in practice. + + lda #$A5 + sta VIC_KEY + lda #$96 + sta VIC_KEY + + jsr scnkey_viciv_mode + + sta VIC_KEY + rts + +scnkey_viciv_mode: + +#endif + // Prepare for SHFLAG update lda SHFLAG From b860322a09adba694a353bb53a5820a8e3c2a532 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 5 Nov 2019 17:09:57 +0100 Subject: [PATCH 042/105] initial SAVE implementation --- STATUS.md | 2 +- c64/kernal/assets/kernal_messages.s | 4 +- c64/kernal/iec/iec_close_load.s | 29 ------- c64/kernal/iec/iec_close_load_save.s | 41 ++++++++++ c64/kernal/iec/save_iec.s | 79 ++++++++++++++++--- .../{lvs_helpers.s => load_save_common.s} | 25 +++++- 6 files changed, 135 insertions(+), 45 deletions(-) delete mode 100644 c64/kernal/iec/iec_close_load.s create mode 100644 c64/kernal/iec/iec_close_load_save.s rename c64/kernal/iostack/{lvs_helpers.s => load_save_common.s} (88%) diff --git a/STATUS.md b/STATUS.md index f849504d..36031357 100644 --- a/STATUS.md +++ b/STATUS.md @@ -140,7 +140,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFD5` | `$F49E` | `LOAD` | DONE | | | `($0330)` | `$F4A5` | `LOAD` | DONE | | | `$FFD8` | `$F5DD` | `SAVE` | DONE | main routine not done yet | -| `($0332)` | `$F5ED` | `SAVE` | NOT DONE | | +| `($0332)` | `$F5ED` | `SAVE` | NOT DONE | work in progress, not tested yet | | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | | `$FFE1` | `$F6ED` | `STOP` | DONE | | diff --git a/c64/kernal/assets/kernal_messages.s b/c64/kernal/assets/kernal_messages.s index ed113935..a14954c1 100644 --- a/c64/kernal/assets/kernal_messages.s +++ b/c64/kernal/assets/kernal_messages.s @@ -53,8 +53,8 @@ __msg_kernalverifying: __msg_kernalsaving: .byte $0D - .text "SAVIN" - .byte $80 + $47 // end of string mark + 'G' + .text "SAVING" + .byte $80 + $20 // end of string mark + space __msg_kernalfrom_hex: .text " FROM " diff --git a/c64/kernal/iec/iec_close_load.s b/c64/kernal/iec/iec_close_load.s deleted file mode 100644 index 180d6c6f..00000000 --- a/c64/kernal/iec/iec_close_load.s +++ /dev/null @@ -1,29 +0,0 @@ - -// -// Common part of CLOSE and LOAD routines for IEC -// - - -#if CONFIG_IEC - -iec_close_load: - - tax - - // Command drive to stop talking and to close the file - jsr UNTLK - - txa - jsr LISTEN - - lda #$E0 // CLOSE command - sta TBTCNT - jsr iec_tx_command - jsr iec_tx_command_finalize - - // Tell drive to unlisten - jsr UNLSN - - rts - -#endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_close_load_save.s b/c64/kernal/iec/iec_close_load_save.s new file mode 100644 index 00000000..445379e0 --- /dev/null +++ b/c64/kernal/iec/iec_close_load_save.s @@ -0,0 +1,41 @@ + +// +// Common part of CLOSE and LOAD/SAVE routines for IEC +// + + +#if CONFIG_IEC + + +iec_close_load: + + tax + + // Command drive to stop talking before closing the file + jsr UNTLK +!: + txa + jsr LISTEN + + lda #$E0 // CLOSE command + sta TBTCNT + jsr iec_tx_command + jsr iec_tx_command_finalize + + // Tell drive to unlisten + jsr UNLSN + + rts + + +iec_close_save: + + tax + + // Command drive to stop listening before closing the file + jsr UNLSN + + bne !- // branch alwayys + + +#endif // CONFIG_IEC diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index 0f846c9d..e565f713 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -4,34 +4,89 @@ // +// XXX this is untested! + + #if CONFIG_IEC -save_iec: +save_iec_dev_not_found: + jmp lvs_device_not_found_error + +save_iec_error: + jmp lvs_device_not_found_error // XXX find a better error + + +save_iec: // XXX finish the implementation -/* // Display SAVING - // XXX jsr lvs_display_saving + jsr lvs_display_saving // Call device to LISTEN lda FA jsr LISTEN - bcs save_iec_dev_not_found // XXX redirecto to load + bcs save_iec_dev_not_found - // Open channel XXX (reserved for file writing) - lda #XXX + // Open channel 1 (reserved for file writing) + lda #$01 jsr iec_cmd_open - bcs // XXX error + bcs save_iec_dev_not_found // Send file name jsr iec_send_file_name - bcs load_iec_error + bcs save_iec_error - // XXX finish the implementation - + // Call device to LISTEN once again + lda FA + jsr LISTEN + bcs save_iec_dev_not_found + + lda #$60 // open channel / data (p3) , required according to p13 + sta TBTCNT + jsr iec_tx_command + bcs save_iec_error + + ldy #$00 +iec_save_loop: + + // Retrieve byte to send +#if CONFIG_MEMORY_MODEL_60K + ldx # Date: Tue, 5 Nov 2019 17:51:50 +0100 Subject: [PATCH 043/105] tape interlock support, don't display PRESS PLAY if already pressed --- STATUS.md | 4 ++-- c64/aliases/,aliases_ram_lowmem.s | 2 +- .../interrupts/ea31.default_irq_handler.s | 23 ++++++++++++++++++- c64/kernal/tape/tape_common.s | 10 ++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/STATUS.md b/STATUS.md index 36031357..bec0c131 100644 --- a/STATUS.md +++ b/STATUS.md @@ -151,8 +151,8 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFF0` | `$E50A` | `PLOT` | DONE | | | `$FFF3` | | `IOBASE` | DONE | | | `($FFFA)` | | NMI vec | PARTIAL | | -| `($FFFC)` | `$FCE2` | RESET vec | PARTIAL | | -| `($FFFE)` | | IRQ/BRK vec | PARTIAL | | +| `($FFFC)` | `$FCE2` | RESET vec | PARTIAL | see IOINIT status | +| `($FFFE)` | | IRQ/BRK vec | DONE | |
diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 4766472e..34f5c632 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -138,7 +138,7 @@ .label ROPRTY = $BD // tape / RS-232 temporary storage .label FSBLK = $BE // -- NOT IMPLEMENTED -- .label MYCH = $BF // -- NOT IMPLEMENTED -- - .label CAS1 = $C0 // -- NOT IMPLEMENTED -- + .label CAS1 = $C0 // tape motor interlock .label STAL = $C1 // $C1-$C2 LOAD/SAVE start address .label MEMUSS = $C3 // $C3-$C4 temporary address for tape LOAD/SAVE .label LSTX = $C5 // last keyy matrix position [!] our usage probably differs in details diff --git a/c64/kernal/interrupts/ea31.default_irq_handler.s b/c64/kernal/interrupts/ea31.default_irq_handler.s index 304fa343..472256b4 100644 --- a/c64/kernal/interrupts/ea31.default_irq_handler.s +++ b/c64/kernal/interrupts/ea31.default_irq_handler.s @@ -5,6 +5,27 @@ default_irq_handler: jsr JSCNKEY jsr JUDTIM // update jiffy clock +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + // Turn tape motor on/off depending on the button state + // For CAS1 (tape motor interlock) variable description, see Mapping the C64, page 7 + + lda CPU_R6510 + and #$10 + beq !+ // branch if tape button pressed + + jsr tape_motor_off + lda #$00 + sta CAS1 + beq default_irq_handler_end_tape // branch always +!: + lda CAS1 + bne default_irq_handler_end_tape + jsr tape_motor_on + +default_irq_handler_end_tape: + +#endif + // Acknowledge CIA interrupt and return jmp clear_cia1_interrupt_flag_and_return_from_interrupt - diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index e6bb200e..bb6fa3af 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -84,6 +84,14 @@ tape_ask_play: sei // timing is critical for tape loading + // First check whether the button is already pressed + + lda CPU_R6510 + and #$10 + beq tape_wait_play_done + + // Turn off the motor, display message + jsr tape_motor_off ldx #__MSG_KERNAL_PRESS_PLAY @@ -110,6 +118,8 @@ tape_wait_play_loop: and #$10 // check for pressed button bne tape_wait_play_loop +tape_wait_play_done: + jsr print_return jmp tape_screen_hide_motor_on From 35fca60d73c67fa339d3e1b0743a740fbf02bacb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 5 Nov 2019 17:56:30 +0100 Subject: [PATCH 044/105] small 'press play' routine optimization --- c64/kernal/tape/tape_common.s | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index bb6fa3af..57b61ae6 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -90,9 +90,7 @@ tape_ask_play: and #$10 beq tape_wait_play_done - // Turn off the motor, display message - - jsr tape_motor_off + // Display message ldx #__MSG_KERNAL_PRESS_PLAY jsr print_kernal_message From fc9a95116f665f03293d37b7e8a7e741e6480d49 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 5 Nov 2019 18:15:40 +0100 Subject: [PATCH 045/105] fix for tape interlock handling --- c64/kernal/tape/tape_common.s | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 57b61ae6..13d2415b 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -118,6 +118,11 @@ tape_wait_play_loop: tape_wait_play_done: + // Prepare for reading + + lda #$01 + sta CAS1 // set the interlock + jsr print_return jmp tape_screen_hide_motor_on From 86e8bcbe7fccc59cd6d5542a5275828563aa8cf7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 6 Nov 2019 17:29:27 +0100 Subject: [PATCH 046/105] more work on SAVE routine --- ...iec_close_load_save.s => iec_close_load.s} | 12 +------ c64/kernal/iec/iec_tx_byte.s | 2 +- c64/kernal/iec/save_iec.s | 33 ++++++++++++++++--- 3 files changed, 31 insertions(+), 16 deletions(-) rename c64/kernal/iec/{iec_close_load_save.s => iec_close_load.s} (69%) diff --git a/c64/kernal/iec/iec_close_load_save.s b/c64/kernal/iec/iec_close_load.s similarity index 69% rename from c64/kernal/iec/iec_close_load_save.s rename to c64/kernal/iec/iec_close_load.s index 445379e0..5cc8e76a 100644 --- a/c64/kernal/iec/iec_close_load_save.s +++ b/c64/kernal/iec/iec_close_load.s @@ -13,7 +13,7 @@ iec_close_load: // Command drive to stop talking before closing the file jsr UNTLK -!: + txa jsr LISTEN @@ -28,14 +28,4 @@ iec_close_load: rts -iec_close_save: - - tax - - // Command drive to stop listening before closing the file - jsr UNLSN - - bne !- // branch alwayys - - #endif // CONFIG_IEC diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index 060d5afc..a58a1689 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -28,7 +28,7 @@ iec_tx_common: // Timing is critical here - execute on disabled IRQs // The best practice would be to do PHP first, but it seems this is not // what the original ROM does; furthermore, pushing additional bytes to - // stack can wreck autostart softwaree loading at $0100 + // stack can wreck autostart software loading at $0100 sei // Wait till all receivers are ready, they should all release DATA diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index e565f713..d77fac45 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -5,6 +5,8 @@ // XXX this is untested! +// test EAL/STAL - LOAD (tape, disk), SAVE - Open ROMs vs hybrid vs original + #if CONFIG_IEC @@ -46,6 +48,17 @@ save_iec: // XXX finish the implementation jsr iec_tx_command bcs save_iec_error + // Save start address XXX optimize this + lda STAL+0 + sta TBTCNT + clc + jsr iec_tx_byte + + lda STAL+1 + sta TBTCNT + clc + jsr iec_tx_byte + ldy #$00 iec_save_loop: @@ -76,13 +89,25 @@ iec_save_loop_end: // Send last byte sta TBTCNT - sec // mark end of stream + clc // XXX really? jsr iec_tx_byte - - // Close file on drive + // Close file on drive // XXX does not work properly lda FA - jsr iec_close_save + jsr UNLSN + + lda FA + jsr LISTEN + + lda #$E1 // CLOSE command + sta TBTCNT + jsr iec_tx_command + jsr iec_tx_command_finalize + + // Tell drive to unlisten + lda FA + jsr UNLSN + // Return success clc From fa360622bdf173955417df21e13a4a0550f55945 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 6 Nov 2019 19:55:44 +0100 Subject: [PATCH 047/105] more UP9600 integration work --- c64/kernal/iec/save_iec.s | 4 +- .../{chkin_rs232.s => chkin_rs232_up2400.s} | 4 +- c64/kernal/rs232/chkin_rs232_up9600.s | 48 +++++++++++++ c64/kernal/rs232/chrin_rs232_up9600.s | 2 +- c64/kernal/rs232/up9600_nmi.s | 71 +++++++++++++++++++ c64/kernal/rs232/up9600_rsin.s | 43 +++++++++++ c64/kernal/rs232/up9600_rsout.s | 56 +++++++++++++++ 7 files changed, 224 insertions(+), 4 deletions(-) rename c64/kernal/rs232/{chkin_rs232.s => chkin_rs232_up2400.s} (72%) create mode 100644 c64/kernal/rs232/chkin_rs232_up9600.s create mode 100644 c64/kernal/rs232/up9600_nmi.s create mode 100644 c64/kernal/rs232/up9600_rsin.s create mode 100644 c64/kernal/rs232/up9600_rsout.s diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index d77fac45..bb0afa8a 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -19,7 +19,9 @@ save_iec_error: jmp lvs_device_not_found_error // XXX find a better error -save_iec: // XXX finish the implementation +save_iec: + + // XXX report error on empty file name // Display SAVING jsr lvs_display_saving diff --git a/c64/kernal/rs232/chkin_rs232.s b/c64/kernal/rs232/chkin_rs232_up2400.s similarity index 72% rename from c64/kernal/rs232/chkin_rs232.s rename to c64/kernal/rs232/chkin_rs232_up2400.s index 6cc6d002..0fb045b5 100644 --- a/c64/kernal/rs232/chkin_rs232.s +++ b/c64/kernal/rs232/chkin_rs232_up2400.s @@ -4,11 +4,11 @@ // -#if HAS_RS232 +#if CONFIG_RS232_UP2400 chkin_rs232: STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 -#endif // HAS_RS232 +#endif // CONFIG_RS232_UP2400 diff --git a/c64/kernal/rs232/chkin_rs232_up9600.s b/c64/kernal/rs232/chkin_rs232_up9600.s new file mode 100644 index 00000000..40d4e2ac --- /dev/null +++ b/c64/kernal/rs232/chkin_rs232_up9600.s @@ -0,0 +1,48 @@ + +// +// RS-232 part of the CHKIN routine +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +// XXX get rid of the ENABLE/DISABLE mechanism + + +chkin_rs232: + + pha + lda XXX_UPFLAG + bne !+ + pla + jmp $F20E // XXX + +!: + pla + jsr $F30F // XXX + beq !+ + jmp $F701 // XXX + +!: + jsr $F31F // XXX + lda FA + cmp #$02 + beq !+ + cmp #$04 + bcc chkin_rs232_nochkin + jsr XXX_DISABLE + jmp chkin_rs232_nochkin +!: + sta $99 + jsr XXX_ENABLE + clc + rts + +chkin_rs232_nochkin + jmp $F219 // XXX + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/chrin_rs232_up9600.s b/c64/kernal/rs232/chrin_rs232_up9600.s index eb39f003..0945111d 100644 --- a/c64/kernal/rs232/chrin_rs232_up9600.s +++ b/c64/kernal/rs232/chrin_rs232_up9600.s @@ -17,7 +17,7 @@ chrin_rs232: lda #$00 sta XXX_SAVBYTE sta RSSTAT - jsr XXX_RSIN + jsr up9600_rsin bcc !+ plx_trash_a ply_trash_a diff --git a/c64/kernal/rs232/up9600_nmi.s b/c64/kernal/rs232/up9600_nmi.s new file mode 100644 index 00000000..853ff100 --- /dev/null +++ b/c64/kernal/rs232/up9600_nmi.s @@ -0,0 +1,71 @@ + +// +// RS-232 NMI handler part +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +// XXX integrate with NMI handler + + +#if CONFIG_RS232_UP9600 + + +up9600_nmi: + // XXX integrate this + + +NMIDOBIT + pha + bit CIA2_ICR // $DD0D; CHECK BIT 7 (STARTBIT PRINT) + bpl NMIDOBI2; NO STARTBIT RECEIVED, THEN SKIP + lda #$13 + sta CIA2_CRB // $DD0F; START TIMER B (FORCED RELOAD, SIGNAL AT PB7) + sta CIA2_ICR // $DD0D; DISABLE TIMER AND FLAG INTERRUPTS + lda #NMIBYTRY + sta NMIVECT+1 +NMIDOBI2 + pla; IGNORE, IF NMI WAS TRIGGERED BY RESTORE-KEY + rti + ; +NMIBYTRY + pha + bit CIA2_ICR // $DD0D; CHECK BIT 7 (SDR FULL PRINT) + bpl NMIDOBI2; SDR NOT FULL, THEN SKIP (EG. RESTORE-KEY) + lda #$92 + sta CIA2_CRB // $DD0F; STOP TIMER B (KEEP SIGNALLING AT PB7!) + sta CIA2_ICR // $DD0D; ENABLE FLAG (AND TIMER) INTERRUPTS + lda #NMIDOBIT + sta NMIVECT+1 + phx_trash_a + phy_trash_a + lda CIA2_SDR // $DD0C; READ SDR (BIT0=DATABIT7,...,BIT7=DATABIT0) + cmp #128; MOVE BIT7 INTO CARRY-FLAG + and #127 + tax + lda REVTAB,X; READ DATABITS 1-7 FROM LOOKUP TABLE + adc #0; ADD DATABIT0 + ldy RIDBE; AND WRITE IT INTO THE RECEIVE BUFFER + sta (RIBUF),Y + iny + sty RIDBE + sec;;START BUFFER FULL CHK + tya + sbc RIDBS + cmp #200 + bcc NMIBYTR2 + lda CIA2_PRB // $DD01;; MORE THAN 200 BYTES IN THE RECEIVE BUFFER + and #$FD;; THEN DISABLE RTS + sta CIA2_PRB // $DD01 +NMIBYTR2 + ply_trash_a + plx_trash_a + pla + rti + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_rsin.s b/c64/kernal/rs232/up9600_rsin.s new file mode 100644 index 00000000..39009f0c --- /dev/null +++ b/c64/kernal/rs232/up9600_rsin.s @@ -0,0 +1,43 @@ + +// +// Get byte from serial interface +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_rsin: + + ldy RIDBS + cpy RIDBE + beq up9600_rsin_end; // skip (empty buffer, return with carry set) + + lda (RIBUF),Y + iny + sty RIDBS + pha // begin buffer emptying chk + tya + sec + sbc RIDBE + cmp #206 // 256-50 + bcc !+ + lda #$02 + ora CIA2_PR // $DD01 + sta CIA2_PR // enable RTS + clc + + // FALLTROUGH + +!: + pla + + // FALLTROUGH + +up9600_rsin_end: + + rts + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_rsout.s b/c64/kernal/rs232/up9600_rsout.s new file mode 100644 index 00000000..fd4e607d --- /dev/null +++ b/c64/kernal/rs232/up9600_rsout.s @@ -0,0 +1,56 @@ + +// +// Put byte to serial interface +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_rsout: + + pha + sta $9E // XXX synchronize with aliases + cmp #$80 + and #$7F + stx $A8 // XXX synchronize with aliases + sty $A7 // XXX synchronize with aliases + tax + jsr up9600_rsout_time + + lda REVTAB, x + adc #$00 + lsr + sei + sta CIA1_SDR // $DC0C + lda #$02 + STA XXX_OUTSTAT + ror + ora #$7F + sta CIA1_SDR // $DC0C + cli + ldx $A8 // XXX synchronize with aliases + ldy $A7 // XXX synchronize with aliases + pla + rts + +up9600_rsout_time: + + cli + lda #$FD + sta TIME+2 // XXX check if this is the lowest byte + +rs232_rsout_wait: + + lda XXX_OUTSTAT + beq !+ + bit TIME+2 + bmi up9600_rsout_wait + +!: + jmp $F490 // XXX + + +#endif // CONFIG_RS232_UP9600 From 9288298283cc0e86fdad930c10e47a4005e8b5f0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 6 Nov 2019 21:47:52 +0100 Subject: [PATCH 048/105] IEC LOAD/SAVE return error on missing file name --- c64/kernal/iec/load_iec.s | 6 ++++++ c64/kernal/iec/save_iec.s | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 07bd6c26..0e91c125 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -24,9 +24,15 @@ load_break_error: jsr iec_close_load jmp kernalerror_ROUTINE_TERMINATED +load_save_no_file_name: + load_iec: + // Check file name + lda FNLEN + beq_far kernalerror_FILE_NAME_MISSING + // Display SEARCHING FOR + filename jsr lvs_display_searching_for diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index bb0afa8a..e580a167 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -21,7 +21,9 @@ save_iec_error: save_iec: - // XXX report error on empty file name + // Check file name + lda FNLEN + beq_far kernalerror_FILE_NAME_MISSING // Display SAVING jsr lvs_display_saving From 7453771219ebc3b2c82a5d4fef757c6dfa4e1895 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 17:09:53 +0100 Subject: [PATCH 049/105] better statisticcs reporting in build segment tool --- src/build_segment.cc | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/build_segment.cc b/src/build_segment.cc index 97614123..a55a1b96 100644 --- a/src/build_segment.cc +++ b/src/build_segment.cc @@ -109,6 +109,10 @@ public: std::map fixedRoutines; // routines with location already fixed std::map gaps; // gaps by address std::vector floatingRoutines; // routines not allocated to any address yet; always keep them sorted! + + int statSize; + int statFree; + int statWasted; }; class Solver @@ -620,6 +624,12 @@ BinningProblem::BinningProblem(int loAddress, int hiAddress) // Create one large gap (initial) to represent the assembly gaps[loAddress] = hiAddress - loAddress + 1; + + // Initial value of statistics + + statSize = gaps[loAddress]; + statFree = gaps[loAddress]; + statWasted = 0; } bool BinningProblem::isSolved() const @@ -657,6 +667,7 @@ void BinningProblem::addToProblem(SourceFile *routine) // Put the routine into the gap, possibly removing it or splitting into two fixedRoutines[routine->startAddr] = routine; + statFree -= routine->codeLength; // Calculate possible new gap after the routine @@ -702,7 +713,8 @@ void BinningProblem::fillGap(DualStream &logOutput, int gapAddress, const std::l routine->fileName << spacing << "size: " << routine->codeLength << "\n"; fixedRoutines[targetAddr] = routine; - offset += routine->codeLength; + offset += routine->codeLength; + statFree -= routine->codeLength; if (offset > gaps[gapAddress]) ERROR(std::string("internal error line ") + std::to_string(__LINE__)); @@ -718,6 +730,8 @@ void BinningProblem::fillGap(DualStream &logOutput, int gapAddress, const std::l else if (!isSolved()) { logOutput << "filled in - dropped bytes: " << gaps[gapAddress] - offset << "\n"; + statFree -= gaps[gapAddress] - offset; + statWasted += gaps[gapAddress] - offset; } else { @@ -759,6 +773,7 @@ void BinningProblem::performObviousSteps(DualStream &logOutput) gaps[gapAddress] -= routineSize; int targetAddr = gapAddress + gaps[gapAddress]; fixedRoutines[targetAddr] = floatingRoutines.back(); + statFree -= routineSize; logOutput << "forced reducing gap $" << std::hex << gapAddress << std::dec << " to size " << gaps[gapAddress] << "\n"; @@ -792,6 +807,7 @@ void BinningProblem::removeUselessGaps(DualStream &logOutput) if (gap.second < minUsefulSize) { logOutput << "dropping gap: $" << std::hex << gap.first << std::dec << " (size: " << gap.second << ")" << "\n"; + statWasted += gap.second; gaps.erase(gap.first); repeat = true; break; @@ -847,6 +863,11 @@ void Solver::run() if (problem.isSolved()) { logOutput << "\n" << "all the routines sucessfully placed" << "\n\n"; + + logOutput << "segment statistics:" << "\n"; + // logOutput << " - total size: " << problem.statSize << "\n"; - for BASIC contains filling gap too + logOutput << " - wasted bytes: " << problem.statWasted << "\n"; + logOutput << " - still free: " << problem.statFree << "\n\n"; } // Close the log file From 2e9a0b16107a0164ea1ddc6f409edc0b5dbd84a3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 17:23:27 +0100 Subject: [PATCH 050/105] SECOND/TKSA compatibility fix --- c64/kernal/iec/chkin_iec.s | 1 + c64/kernal/iec/ckout_iec.s | 1 + c64/kernal/iec/save_iec.s | 2 +- c64/kernal/iec/second.s | 13 ++++++------- c64/kernal/iec/tksa.s | 13 ++++++------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/c64/kernal/iec/chkin_iec.s b/c64/kernal/iec/chkin_iec.s index 584e40f6..b86dee9c 100644 --- a/c64/kernal/iec/chkin_iec.s +++ b/c64/kernal/iec/chkin_iec.s @@ -22,6 +22,7 @@ chkin_iec: bcs_far chkinout_device_not_present lda LAT, Y + ora #$60 jsr TKSA bcs_far chkinout_device_not_present diff --git a/c64/kernal/iec/ckout_iec.s b/c64/kernal/iec/ckout_iec.s index 4a504f9c..662f4840 100644 --- a/c64/kernal/iec/ckout_iec.s +++ b/c64/kernal/iec/ckout_iec.s @@ -21,6 +21,7 @@ ckout_iec: bcs_far chkinout_device_not_present lda LAT, Y + ora #$60 jsr SECOND bcs_far chkinout_device_not_present diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index e580a167..5c1d3e81 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -47,7 +47,7 @@ save_iec: jsr LISTEN bcs save_iec_dev_not_found - lda #$60 // open channel / data (p3) , required according to p13 + lda #$61 // open channel / data (p3) , required according to p13 sta TBTCNT jsr iec_tx_command bcs save_iec_error diff --git a/c64/kernal/iec/second.s b/c64/kernal/iec/second.s index 12d49f44..d1931234 100644 --- a/c64/kernal/iec/second.s +++ b/c64/kernal/iec/second.s @@ -14,13 +14,12 @@ SECOND: #if CONFIG_IEC - // Due to OPEN/CLOSE/TKSA/SECOND command encoding (see https://www.pagetable.com/?p=1031), - // allowed channels are 0-15; report error if out of range - cmp #$10 - bcc !+ - jmp kernalerror_DEVICE_NOT_FOUND // XXX find a better error message for wrong channel (create new one?) -!: - ora #$60 + // Due to OPEN/CLOSE/TKSA/SECOND command encoding, allowed channels are 0-15; it is the caller + // responsibility, hovewer, to provide value ORed with $60 + // - https://www.lemon64.com/forum/viewtopic.php?t=57694&sid=531ba3592bcffadef2ac8b9162f2e529 + // - https://www.pagetable.com/?p=1031 (Kernal API description) + + // XXX consider checking whether value is in range (contrary to original ROM implementation) jmp common_open_close_unlsn_second diff --git a/c64/kernal/iec/tksa.s b/c64/kernal/iec/tksa.s index 63215256..9794a7b9 100644 --- a/c64/kernal/iec/tksa.s +++ b/c64/kernal/iec/tksa.s @@ -14,13 +14,12 @@ TKSA: #if CONFIG_IEC - // Due to OPEN/CLOSE/TKSA/SECOND command encoding (see https://www.pagetable.com/?p=1031), - // allowed channels are 0-15; report error if out of range - cmp #$10 - bcc !+ - jmp kernalerror_DEVICE_NOT_FOUND // XXX find a better error message for wrong channel (create new one?) -!: - ora #$F0 + // Due to OPEN/CLOSE/TKSA/SECOND command encoding, allowed channels are 0-15; it is the caller + // responsibility, hovewer, to provide value ORed with $60 + // - https://www.lemon64.com/forum/viewtopic.php?t=57694&sid=531ba3592bcffadef2ac8b9162f2e529 + // - https://www.pagetable.com/?p=1031 (Kernal API description) + + ora #$90 jmp common_untlk_tksa From ce68834035c6e1967f4ae746a868da3809a9aed5 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 19:00:09 +0100 Subject: [PATCH 051/105] more compatible STAL/EAL/MEMUSS handling --- c64/kernal/iec/load_iec.s | 23 ++++++++++++--------- c64/kernal/iec/save_iec.s | 2 +- c64/kernal/iostack/load_save_common.s | 20 +++++++++--------- c64/kernal/tape/load_tape_turbo.s | 29 ++++++++++++++++++--------- c64/kernal/tape/tape_common.s | 24 ++++++++++++++++++++-- 5 files changed, 65 insertions(+), 33 deletions(-) diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 0e91c125..56787e90 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -69,20 +69,23 @@ load_iec: jsr iec_turnaround_to_listen bcs load_iec_error - // Get load address and store it if secondary address is zero + // Get load address + jsr iec_rx_byte bcs load_iec_file_not_found - - ldx SA - beq !+ - sta STAL+0 -!: + sta EAL+0 jsr iec_rx_byte bcs load_iec_file_not_found + sta EAL+1 - ldx SA - beq !+ - sta STAL+1 + // If secondary address is 0, override EAL with STAL + + lda SA + bne !+ + lda STAL+0 + sta EAL+0 + lda STAL+1 + sta EAL+1 !: // Display start address jsr lvs_display_loading_verifying @@ -102,7 +105,7 @@ iec_load_loop: // Handle STOP key; it is probably an overkill to do it // with every byte, once per 32 bytes should be enough - lda STAL + lda EAL and #$1F bne !+ phx_trash_a diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index 5c1d3e81..e2fffbc8 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -5,7 +5,7 @@ // XXX this is untested! -// test EAL/STAL - LOAD (tape, disk), SAVE - Open ROMs vs hybrid vs original +// also test STAL/EAL - Open ROMs vs hybrid vs original diff --git a/c64/kernal/iostack/load_save_common.s b/c64/kernal/iostack/load_save_common.s index e852f624..b139d849 100644 --- a/c64/kernal/iostack/load_save_common.s +++ b/c64/kernal/iostack/load_save_common.s @@ -22,7 +22,7 @@ lvs_handle_byte_load_verify: ldx #$33 stx $01 ldy #0 - sta (STAL),y + sta (EAL),y ldx #$37 stx $01 plp @@ -30,7 +30,7 @@ lvs_handle_byte_load_verify: #else ldy #0 - sta (STAL),y + sta (EAL),y #endif @@ -55,7 +55,7 @@ lvs_handle_byte_verify: ldx #$33 stx $01 ldy #0 - lda (STAL),y + lda (EAL),y ldx #$37 stx $01 plp @@ -66,7 +66,7 @@ lvs_handle_byte_verify: #else ldy #0 - cmp (STAL),y + cmp (EAL),y #endif @@ -79,9 +79,9 @@ lvs_handle_byte_verify: lvs_advance_pointer: // Advance pointer - inc STAL+0 + inc EAL+0 bne !+ - inc STAL+1 + inc EAL+1 !: rts @@ -135,9 +135,9 @@ lvs_display_start_addr: !: jsr print_kernal_message - lda STAL+1 + lda EAL+1 jsr print_hex_byte - lda STAL+0 + lda EAL+0 jmp print_hex_byte lvs_display_done: @@ -181,8 +181,8 @@ 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 + ldx EAL+0 + ldy EAL+1 // FALLTHROUGH lvs_success_end: diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 6b9ef138..4f50c732 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -61,36 +61,45 @@ load_tape_turbo_header_loop: // this strange loop puts metadata after load_tape_turbo_payload: + // Initial checksum value + + lda #$00 + sta PRTY + // Read file payload jsr tape_turbo_sync_payload - ldy #$00 - sty PRTY // initial checksum value - // FALLTROUGH load_tape_turbo_loop: jsr tape_turbo_get_byte - sta (STAL),y + sta (MEMUSS),y eor PRTY // handle checksum sta PRTY - jsr lvs_advance_pointer - - lda STAL+1 + // Advance MEMUSS (see Mapping the C64, page 36) + inc MEMUSS+0 + bne !+ + inc MEMUSS+1 +!: + lda MEMUSS+1 cmp EAL+1 bne load_tape_turbo_loop - lda STAL+0 + lda MEMUSS+0 cmp EAL+0 bne load_tape_turbo_loop - // Verify the checksum + // Get the checksum jsr tape_turbo_get_byte - cmp PRTY + tax + + // Verify the checksum + + cpx PRTY beq_far tape_load_success jmp tape_load_error diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 13d2415b..2acd0110 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -208,9 +208,29 @@ tape_handle_header: adc STAL+1 sta EAL+1 !: - // Print LOADING + // Setup MEMUSS (see Mapping the C64, page 36) - jsr lvs_display_loading_verifying + lda STAL+0 + sta MEMUSS+0 + lda STAL+1 + sta MEMUSS+1 + + // Print LOADING and start address + + lda MSGFLG + bpl tape_handle_header_displayed + + ldx #__MSG_KERNAL_LOADING + jsr print_kernal_message + ldx #__MSG_KERNAL_FROM_HEX + jsr print_kernal_message + + lda STAL+1 + jsr print_hex_byte + lda STAL+0 + jsr print_hex_byte + +tape_handle_header_displayed: // Load the file From dd09e2432ec2b72b744b50d4a21838747ccbb0d3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 19:34:31 +0100 Subject: [PATCH 052/105] some fixes and refactoring for IEC SAVE --- STATUS.md | 4 +- c64/kernal/iec/load_iec.s | 2 +- c64/kernal/iec/save_iec.s | 10 +---- c64/kernal/iostack/load_save_common.s | 64 +++++++++++++++++++++++++-- c64/kernal/tape/load_tape_turbo.s | 10 +---- c64/kernal/tape/tape_common.s | 13 +----- 6 files changed, 67 insertions(+), 36 deletions(-) diff --git a/STATUS.md b/STATUS.md index bec0c131..41e83c98 100644 --- a/STATUS.md +++ b/STATUS.md @@ -139,8 +139,8 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFD2` | `$F1CA` | `CHROUT` | DONE | | | `$FFD5` | `$F49E` | `LOAD` | DONE | | | `($0330)` | `$F4A5` | `LOAD` | DONE | | -| `$FFD8` | `$F5DD` | `SAVE` | DONE | main routine not done yet | -| `($0332)` | `$F5ED` | `SAVE` | NOT DONE | work in progress, not tested yet | +| `$FFD8` | `$F5DD` | `SAVE` | DONE | | +| `($0332)` | `$F5ED` | `SAVE` | PARTIAL | not fully tested yet | | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | | `$FFE1` | `$F6ED` | `STOP` | DONE | | diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 56787e90..df68986b 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -101,7 +101,7 @@ iec_load_loop: // Advance pointer to data; it is OK if it advances past $FFFF, // one autostart technique does exactly this - jsr lvs_advance_pointer + jsr lvs_advance_EAL // Handle STOP key; it is probably an overkill to do it // with every byte, once per 32 bytes should be enough diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index e2fffbc8..f90c5f86 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -86,17 +86,12 @@ iec_save_loop: sta TBTCNT clc jsr iec_tx_byte - jsr lvs_advance_pointer + jsr lvs_advance_STAL jmp iec_save_loop iec_save_loop_end: - // Send last byte - sta TBTCNT - clc // XXX really? - jsr iec_tx_byte - - // Close file on drive // XXX does not work properly + // Close file on drive lda FA jsr UNLSN @@ -112,7 +107,6 @@ iec_save_loop_end: lda FA jsr UNLSN - // Return success clc rts diff --git a/c64/kernal/iostack/load_save_common.s b/c64/kernal/iostack/load_save_common.s index b139d849..908f5d58 100644 --- a/c64/kernal/iostack/load_save_common.s +++ b/c64/kernal/iostack/load_save_common.s @@ -75,8 +75,19 @@ lvs_handle_byte_verify: sec rts +#if CONFIG_IEC -lvs_advance_pointer: +lvs_advance_STAL: + + // Advance pointer + inc STAL+0 + bne !+ + inc STAL+1 +!: + rts + + +lvs_advance_EAL: // Advance pointer inc EAL+0 @@ -85,6 +96,26 @@ lvs_advance_pointer: !: rts +#endif + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + +lvs_advance_MEMUSS_check_EAL: + + // Advance pointer + inc MEMUSS+0 + bne !+ + inc MEMUSS+1 +!: + lda MEMUSS+1 + cmp EAL+1 + bne !+ + lda MEMUSS+0 + cmp EAL+0 +!: + rts + +#endif lvs_display_searching_for: @@ -132,14 +163,39 @@ lvs_display_loading_verifying: lvs_display_start_addr: ldx #__MSG_KERNAL_FROM_HEX -!: jsr print_kernal_message +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + lda FA + +#if CONFIG_TAPE_NORMAL + cmp #$01 + beq lvs_display_addr_STAL +#endif +#if CONFIG_TAPE_TURBO + cmp #$07 + beq lvs_display_addr_STAL +#endif + +#endif + + // FALLTROUGH + +lvs_display_addr_EAL: + lda EAL+1 jsr print_hex_byte lda EAL+0 jmp print_hex_byte +lvs_display_addr_STAL: + + lda STAL+1 + jsr print_hex_byte + lda STAL+0 + jmp print_hex_byte + lvs_display_done: // Display end address @@ -147,8 +203,8 @@ lvs_display_done: bpl lvs_display_end ldx #__MSG_KERNAL_TO_HEX - jmp !- - + jsr print_kernal_message + jmp lvs_display_addr_EAL lvs_display_saving: diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 4f50c732..80169211 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -81,15 +81,7 @@ load_tape_turbo_loop: sta PRTY // Advance MEMUSS (see Mapping the C64, page 36) - inc MEMUSS+0 - bne !+ - inc MEMUSS+1 -!: - lda MEMUSS+1 - cmp EAL+1 - bne load_tape_turbo_loop - lda MEMUSS+0 - cmp EAL+0 + jsr lvs_advance_MEMUSS_check_EAL bne load_tape_turbo_loop // Get the checksum diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 2acd0110..52460328 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -217,18 +217,7 @@ tape_handle_header: // Print LOADING and start address - lda MSGFLG - bpl tape_handle_header_displayed - - ldx #__MSG_KERNAL_LOADING - jsr print_kernal_message - ldx #__MSG_KERNAL_FROM_HEX - jsr print_kernal_message - - lda STAL+1 - jsr print_hex_byte - lda STAL+0 - jsr print_hex_byte + jsr lvs_display_loading_verifying tape_handle_header_displayed: From 0e28f898062e263623028c691cd8888c9f033e51 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 20:09:37 +0100 Subject: [PATCH 053/105] Kernal SAVE routine now works --- README.md | 5 +++- STATUS.md | 13 ++++------ bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/kernal/iec/save_iec.s | 35 ++++++++------------------ c64/kernal/iostack/load_save_common.s | 21 +++++++--------- c64/kernal/tape/tape_common.s | 5 +--- 13 files changed, 30 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 86dc2978..fd201623 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # open-roms -A project to create unencumbered open-source ROMs for use on selected retro computers. For the current status check [this document](STATUS.md) +A project to create unencumbered open-source ROMs for use on selected retro computers. Besides this manifest, the following documents are available: + +* [implementation status](STATUS.md) of various APIs and functionalities +* [configuration options](CONFIG.md) for those willing to compile their own, customized build # Problem Statement and Motivation diff --git a/STATUS.md b/STATUS.md index 41e83c98..c2864db9 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,13 +1,13 @@ # New features -Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md)): +Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md) during compilation): * improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-keyy rollover), supports additional C128 keys * joystick can be used to move text cursor * pre-defined function keys * uses RAM under ROM and I/O: 61438 bytes free -* cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses +* cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses, configured addresses * wark start due to BRK prints out the instruction address * extended `LOAD` command * start/end addresses are displayed, in the Final cartridge style @@ -24,7 +24,7 @@ NOTE: extra features and their syntax can change in the future! The following ROM features are currently missing and are not planned due to space considerations: * full tape support - VERIFY, SAVE, sequential files; tape is considered a legacy medium, so it's support is going to be limited -* mock 6551 emulation - this inly slows down the RS-232 support for original ROMs, probably noone needs it +* mock 6551 emulation - this only complicates the RS-232 support for original ROMs, probably noone needs it The following ROM features are currently missing: @@ -33,7 +33,6 @@ The following ROM features are currently missing: * BASIC expression parsing * floating point routines * tape (normal mode) support -* IEC support for SAVE * RS-232 support * NMI handling is incomplete @@ -54,8 +53,6 @@ For the current status of the low memory location implementation andd usage chec ### Official BASIC routines -Note: vectors at `$0300` are not supported yet - for now only the locations below can be used! -
| Entry | Unofficial | Name | Status | Remarks | @@ -140,7 +137,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFD5` | `$F49E` | `LOAD` | DONE | | | `($0330)` | `$F4A5` | `LOAD` | DONE | | | `$FFD8` | `$F5DD` | `SAVE` | DONE | | -| `($0332)` | `$F5ED` | `SAVE` | PARTIAL | not fully tested yet | +| `($0332)` | `$F5ED` | `SAVE` | DONE | | | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | | `$FFE1` | `$F6ED` | `STOP` | DONE | | @@ -169,7 +166,7 @@ Not all of them - only these we want to have implemented. | `$E544` | clear screen | DONE | | | `$E50C` | set cursor position | PARTIAL | | | `$E566` | home cursor | NOT DONE | | -| `$E5A0` | setup VIC II & IO | DONE | | +| `$E5A0` | setup VIC II & I/O | DONE | | | `$E6B6` | advance cursor | NOT DONE | | | `$E701` | previous line | NOT DONE | | | `$E716` | screen CHROUT | NOT DONE | | diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index c31a9ff71c4eef411ba53e3c91ec4b8acdc232c7..2760d0579cf44efdd014a89a5454bbba28c2a51c 100644 GIT binary patch delta 173 zcmZp0XmFU|q51RMN_&M%|1(x8%wMaJ`*M*YkX~wa^8W{(Me<!_1WXa&j_v5Rf~0JNHu% oHIGLJM4jQW1X1j~CLqd|w+*Or^HJWJf{f;qS*-B`%W z!t~Z$35c@gZ3C*@e3W;lAfxf*c=>ve-~)LD0EAajHUIzs diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index b3d156e94fe36d3c3997ffd6634e3c3c48fa06a4..7ed322bc82b7c5891c9aa0635c1b252fd78fe130 100644 GIT binary patch delta 13 UcmZp0XmHpNC(md;IbMDt03hcCm;e9( delta 13 UcmZp0XmHpNC(md+IbMDt03g!@lmGw# diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index af98c3657c7ca0b5e31604e3006ec9f343b48d3d..89d34c309db3b3b338903a8c31013f2b420e0454 100644 GIT binary patch delta 83 zcmZp0XmHrz$HKDUosaV5AQl~_rSCR3u$*CHTJ>(SAA2~EJ9#;~0hh~%r5hAnJ}3aW h580hSic~qmSwM6hk1Hck@#dqvGX)vVC&$Y#1OSqyA_M>c delta 83 zcmZp0XmHrz$HJ2N(dYf-AQl~_^rxE}Sk5pp{rWiBk3Ag7oxGggfQ#?r(hUlH9~FSy hhwM%uMXDU(EFij$$CVMNc=J)-nSzYQljG$V0sx9&A#nfz diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index c8caf81cf6e4fa5ec035f053f9c9afe5bcfd93c3..05bf4fc70e56ebf4a2d6d064475342e1e1818528 100644 GIT binary patch delta 182 zcmZp0XmFU|p*j1*N_&M%|1(x8%wMap;KL$CAidP;u(6Pr zg=zMO%?&KC8Kto40;&O`$*pYt?9)E@D1K*1n5@WdGueQhZE`I8F_2bO4jX2s1s^6S ya|Z#rlecp}1yS>ObU@S@9!n6#&T9gqY{#9whicUI73%i%}E+ delta 182 zcmZp0XmFU|p?UJ@N_&M%|1(x8%wMaJ{&bNdkX~wa^8W{(Me<DcQeQx^wqN2{XN zu!&hj8gS`LBP1qWpZiiCQ(*BgA$G@2K$_j==Mqvv3@AEbAxz@Fg}^RLc3;nXD>F{t z?B09s|GDRU=R4O{W-D`_=F)bAB{$j;Msu^m5O;O+eRn>({?645LkK=6GxcKT=nZsH zt8~sVq$D@vrP}F{CUhm{QNg!#>iI_G^MeY#g-XAKLw@RxND$x5M7PA z1`Z7pE7}*_4I+CO#~JFi@>Ku!eevOg43|72CbX& zZKP?fUHv|!aG;6vwuFctpMkN~x~}OHP1AK<{U@6G>v{)hFfb&erhb@+{PQx?U>K3( z4ap-YHjf+uCy#y|X!_`cH;1xL#>-O$t-S6I$c%kIIuOvtdN%9_`HMK6f>zt5{TYvEFagSG_(c4<+~w!p0($>U?`3=vf)hjs<(Xw*+l zoh78+(riIOs2U9h9Vv(gp+>tyXgDYuCD+gGE_VuQ4dL$sXnzPz=tC1hKYyu0RNI*m zKGjbnB^=%o#+$vI-ot}fnKr_ZxmTdi%S6@Z6}u*7P2X>G}6 zt{}o&#^t${;Ra^7`w!uURkZu%@Eu9R)YRU<=DraYyvE{3HYr!2$0E%tYn>`WbE46c zqrd`>K}k;<_Nhv)SEb9H#tS(LH8q>xEKpkU@`*Y=Sd!uA&v{iP6>SpkNZr7?!or_Y zt7{$^1Bber>q?9lHnTKhCZz>WV(8OXn@D3VMU>$FO$F37Xg6vKC_V!8G&7emrS>@M;MG$fZ%s(K# z5qX+lR%4kF)kbExaTO)zN}GeN`~qjpNG+i4!y){1$Rh1gl1ss4R&9F|UwpoS86mQb zvY_O@K@$kCCXFJXYgYVK`yp0g#f_l3bQEHPlT{))h;$ycs%{R40Nx>As>A3@c5uF> z;6PNfIsyjR88wZ9LhWW+%r=-QYzLx=rPJ-1v^dz1NeKuhUK2neY7Fc#TkU@%nkxf) za7svOfk*(d*)b*U(e=;Hc$FEMaRQd*50CPqMf!gDy+-8 z$?|_|7AMw-ksqzuhwq)zR@6o{zy9tA-o@Kg0;jo)G{p5P!uwe(Q@=j=^}%WQgfm&s z)Z8Ct&`lw*O^eLg_Yn}z*@wWRS0bROt6Aae0H9wUp`dQm%ixXEu4ZoazRy;k?yc>qD&g#c)MGy;_3k9+kQw zx^)Qx9M?{xUq+?#ZN&uE3|y-Bjk--fufqTYm@y;VWxRjI<1?-S?-PzRxZi+wx2rK! z6apZ+2D>jXJckcQWn0Sy1|5kCfBeatXjf-#N86`K_T!&2_G49dak@qcRoKg*iV(}m zt9c6Lja!w)7Lj$bXwjI}0*TfN0d5d~49wXb<O;F?^ zRchjsWffReW{8{)L?;?NoNdG#q#UF*(gwj*4|>U?PcHBxFeUNjIWl}@jvIYj++3xN z_-t;@TvL|N^0MLG*BD?2X2@_3w)t00KI&c_;^Q(k0=n+W)g7Hl)wkn5D>8~ zB5cadN%^+nT~?kGs&dQ90VQwf9IT^hfrFnN13*=V@JmzDKM+Q@EZSY)-dwu*XU;Y3=?gS56Jk=Aa|(^}=aR{X?V9e=gN=;zOB zOl!5`H50C6g-pl<0n*^-G#ft!iNRxjjt)rT(O7$6gZXfp)Ld`(-DX zvggYVA|2qfMMgJ5?_tH%^|@vUd@-&K%!?V40BLlw#wNv3Xr!p5Nu9tmQU`|OxF#Lb zqyzjZaa#$@!JG<>W8zO2_DoIeNw0x@4t2OX!IXL~)5^vucsW@vpqJ!)u%3AgFB!8R zSm5qYLi&?)1#g7cVi7z!H3k=KOS5l(b__>DxG;{@5PoYM?~dUoCvjZCJEkDv;*@dR z6vO{ea4?8xgMxQy{_;B%e6Lbf#8s`}s&41-LlHa?!)asAVUZyWb9el^>)ho30DW+A A7ytkO delta 2995 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 diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index 10db46b38c21e704d8ca74cf9d9523116434c9fc..1808816e645a5005d7ca132e40b27bc5eade07e2 100644 GIT binary patch delta 2795 zcmZ8j3s6+o8NPcj`y!$Xf?Qs5sw9AUsCgKs%>!#vH}wQ<)27-^&1uq^EQ$6xX=syl zG2x;yVwN7vfY#}9-RrQ7!a5nNm=N(rT&$C0)}S;pF`4WFS|__G-n%St``^3T$#iGu zydVF6{_p$#TVGvY9eO^)c2!eC=qmMO{BrHX_x)hSeM>ox5d6BI+bU;YzJtx`P|jN~ z#xq*+n`-OuOHt9@k6^xW=Ij*&8B_gNRNBB6|l3 z@<(x)mRKuRpP59DU+>w-hY7QxKWVsq+yZ_?O;QFz2`HYF5nJp~7!^nzmRUxn?OKVh^?0rnlvRn%5 z@q#{`mHF*MH7awqif=rt(gMfxj@dV{f3(MTlfLEfc>M)(1@UxvQ0WvH1q~cc;T5`a zhzU5ELJM`}2(pcY{u8vI&B;&{J(vt#P7e(Qf0d38Q;tai5gm#t$I~_XaK_IaIB~0U zYKC2h9UI5YZNV?iO%PIZtXw1n9wqoVZcc7>D=c1k>NLv?auV}&ioq<>;psdOM%y&n z?40Z9O`(!$bSy>pIm^noX(CCl+5ajpTZbQ>jL#ZyX=oq;i}0&sz3V1Bdmo*os;F4zIo*Xzj}cdxulX;kI?Wa-{7AUg>Gu$e(U# z1&o<7__Z#YRCd&%`6gE(48ze1pk;1W$rh<`bM^y2TmInBpLvpd=>6`w7Rx;A6l`Ti z_^DXM1tOH+q{5IHgq?3bsn@x#}9JSu?_bN;M47!_%XPNPUjVQA3{^AC!X(? zc|VV4MLlkGRr7=`%qlO38JXLT*r;n-wn2S`#R>N=*Wj90P{h@94SD&6MF!r+QgAHD z=xW`QZVaVvb9!(FMu5{7gPg(Xa|WkBg`qMnbS6k3FwcVM9!D=HL%nE2B6LvdGO8}A zTj^mA;CdJEyc>NpV~p-XduBrKp@TC@S7j-iwbhOKZ=h>8L+=18eU;Vm&r!aiAYjO& zI=wb8KVuD^QmG?GXWG|o#G;fT6`e{Z`2Q(|qskFPz7^CnCZem{ZNC(^5=k0Bhv zdd5TdW9&7rb-F4qG;zalU{kY^qG0-_ashSd5cos_f0YP3eD-jLPY9QiDuVu=1e_&O z&dWe&+1e}A4{JA>Fu*1V`cxn7%^z{8fP+uyv(XiR)M_p>OqqCNAB2RVd}f?TtBT6`nhCnn{={quRdxSa*CPLSW+SFX%~xcIq~hvLoy9{`|F<1c57iIhA?p>f_T z=NsZv35C)Pf~0g|D2^MgV@7MYDD*bWf~4g>5Xd8Y@J=V2J=^$$_WOSVxS`Dtsq&WzrP8Dj@ z!5m5)P-ueFo3056>b&`7aa0;J#81*?BpD4j8smX!ehLu?VLPTnwG$k_r1SI6vtg_D zWZieK&pr2?bI*6a^J+?KN_w@qsA*j=b(#>1f!bxE+8pbHGfCmKJVUvNCL ziK{u%yf9;Vv3R_4)8T_Vx4&M#eanXR1$$%g$TDr#KKC^0Qt(xOeR)fHHCh`(FGtb* zn2>pr8DD0aHzdW-fPyNbXo)JJO_>Gx1B%t!VePb3g6}s$WVO50wdmq234J5$pv^T) z)YH(qXf+(=(4i+|@J6fELj=9(de!do=s*$Q4XDytV z zn?<+et*3|exqLuwU~YB)OK#8)cTdXCYHmr!lMQT+Ondb|EzAyru=mAShUS(x5zgsL zNK2ghvFxB^Y~lCq4$&OLI|i+cofF;h7(HOH+Q1L@OSp5!MJ1h+Y3k>RleyL(mMtXE zFR_6EA|5v_6d05xJDH2;!p2iyqU(vvI6I^Yz8B_+G|URwAQsFphyw_4(~n^|ZWe`vkAgVBh9`{JDsgyE z2omh!@NfP2jZj8{gCAX_H)}4@QvE8MeMAM6K|Jc^VDImusl5|1a}tOo`2xMNm^Qy!FeU zG0&auTAia#cu8Xc=g$Rj|3mcc1QGusl@4Apy&ztd zmLeAw@}8$(YfISOQL5D~&IOE#Bb~(ry!G9y_ulasy?qXCu??S~Y}Pu)56#H)^_esLw1-68d0Kc3K6_lBps4N45_XKr?#94)Px>C8>5f+uKB#K%6)1qoBf9)i~Iy3;0AdiSU;r zcv~bTv|oaYaMwsIEH9-FH=2q^8klj=ZfH{507$28Vvm=VICp}G4&pUI{(=4o(9h#} z7}rgrGczDKrWo(20)s>EO>=PGLSiA}2tMTA?4? z%1Sa18-b%Hdf$zhVvw`z2>@`4eXKTs@)0FT<-pN21{@7&VvaDirbRh12by`S{S(3iiUQ5pDvPa2n4M7i%fO0c9-3hEoV~-bb zRn*6CvK2;AT3qcZYCD0d;PKxAqR*(e`vN|EBPtGSePP3(PxKYb0M8rIB+pc%x1-5U zw9KT34rm5dwT{5D#Npphs&%Xj!mR^ifHP;+##AWd_x_iQ@Z-{dzC>0tr}L695Fbwh zPDvMNle7T=r_G9O-drgr3c#K!Fa&#BION{gaD;USsg#pP2Ny1W6$}8}IsB8P)u#A= ztqwf0x^hzVSwiNd^P-Qhf*IiZacJzI8dNe=x;=M!+6Iu&k8_JOf1y3OTk=0p+DF42 ze3Z2NB$I16ymD|D*j)TtJ&hLS6|p1H(@p97HTvpNA#oH%X()e{W)aOV*fal!ExFY0 z!X-2GPX(`ODE+Qrn{)E8d6v7XllaK zhO{BEzqnAETVIaSX3>Lb&mZB-!~vySaucmrErIpTA;kOflYaYg;yM@3O6BrXMeGLq zaKF%ZFFd6C3bUU&8^Z%Jyi~!72tFLdAH}iPkBN-;PvUPUur7$3;A diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 118d094c5e8a68f615748df4385929b4a8784ab5..2c45f902c768db3baf09483f9d2ec0b1419ad92d 100644 GIT binary patch delta 3087 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 V5x{9~$LA79IBs3^t8av<{{U)n^LzjR delta 2878 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 Date: Thu, 7 Nov 2019 22:05:49 +0100 Subject: [PATCH 054/105] fix for EAL corruption --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/kernal/screen/screen_grow_logical_line.s | 14 +++++++++++++- .../screen/screen_scroll_up_if_on_last_line.s | 13 +++++++++++++ 10 files changed, 26 insertions(+), 1 deletion(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 2760d0579cf44efdd014a89a5454bbba28c2a51c..075bec045f52902291b01cb5d79d0a585ba77da9 100644 GIT binary patch delta 125 zcmZp0XmFU|!L;N3L@!k!xv`L!1xRgfV0q0bwd4ItdxcB?Ggc|gU#pP&a*-m4-tiuY zCbzQnvuu9vQ@&Y(otqJ)L6u_yGmxIVo%<<>n#ZF9qR#MGf+%)g6CkzOmRC)P(P(mt Ld=*IWfxH3$?Tj|Z delta 125 zcmZp0XmFU|!SwUnL@!k!xv`L!1xRgfV0q0b_4C_GdxcB?Ggc|gU#pP&a*-m4{`n1v zCbzQnvz&hKGkdcHJ2xXpgDS@aW*|LzJNHu%HIGLJM4jQW1X1j~CO~SlEw7poqv7Nf L`6`g$19=4i;OIK4 diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index 7ed322bc82b7c5891c9aa0635c1b252fd78fe130..31f6c4df7248f6e41126940a2371d17dce745201 100644 GIT binary patch delta 140 zcmZp0XmHqYh=pnYm(535elkk!|FY6v;nM$%RSNUhDx7?}ND)Nu{{lptud~fzWIFkD zaw$g;Ncl+)BSs)S`7fsqh|=b=1W{>RCLqZMZ PjV7naSAjG>kXHZzz6wH> delta 140 zcmZp0XmHqYh=qyc`{pAoKN+PszOS@bxb#0`mBReB3cTMJDS~K@??ANqI@=sZCf@Ip zOF4o-%1?3_F#_qye>rtPls1hb2cC4ohQg> OI5|bW3Z(IYyaE88;WvB$ diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index 89d34c309db3b3b338903a8c31013f2b420e0454..eeeba8125060c0162b25a3076549287740696821 100644 GIT binary patch delta 76 zcmZp0XmHrz$HLO_&WB}k5Q`3D@8)`zvrLSWCi}8SF!oMf#%{=|@L}l&1%(d^y^|lX fI|CJ{a73^GsahU4M#f2-kMPbHWHg$bB0mQJ{(%}) delta 76 zcmZp0XmHrz$HKDUosaV5AQm0QrJL(n&N4Bsn(WIS!MJqtGIm2wmk&!fD7bu3SUULu fyE9OM3P%JBkgDZzV`N;l`3UcPK}N&LDe`jwE@m5g diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 05bf4fc70e56ebf4a2d6d064475342e1e1818528..025ea811a31f6306a9774d5d19d6ce69e04550ac 100644 GIT binary patch delta 170 zcmZp0XmFU|q0#(drM<$X{~4W|9ykV5YrbnUqgF^G<7PblObsv2GePc+NtjKON*?^sGaxD8XphguATV}?N$w}P7 wjLnm`aX$l+b9r=u4`?L=}ir*O$CM&YrOg3O=n;gr245(3s!?F xV8+>#w{brMl5=@dvS?VnHe#DzA!m<}tgi&{pjPf&kA7>a*#8(xj)@_-1L``m!uO^Pt zgl1euo5v4Ms;1uhNqg_HNxL{CeCkdezcHmI)z@&iY<@_XfzfL??yng^UoLt4XGTQi zn#6lZZesp3yYHcWwC6DA6V)VS3E|T-i4&3sy%P5FXn?|0#Mu$D+-Uk*{Ts`2Pgxpy z=j%;rDbtZ72mk5cx&6lQ#qJHaKKZC|^V9-`Z($(<9}Sb%#HUiq=3Q&wx#B~VM|&2? z7l}5uj2M%;clQSyl2C6D^#{>wA><3X4YFsa?z_fY_XPw>zJ{g9pSo-YR?bDkFjH_siTg|+DpzG)@?1JcR^v77w8sO z6s6sB8+z{tVSn%4U=$ghmYAZ}{RT=P2(JsOqIp`<(By9$ehh<6gX!`_Lw>bkOD2cE1q<)G`Kcvo!wf1Jao*t3H2)XF6ss&t~RRxZLXyVjayWFH20!>zj z^rmPMIb?NaI){Hi zN-egWzi5zVFOQjN{B+dO=0F||AJIU-2g!?;{id69@%7iqXO^N3wOTC-P3f!%^&H@6 zYJ9C?+Q(BKSL!;c1U!b>Mb5Uxt2(g%1Vf@(ESGZjwsRB-Qit2}-|>tk^F ztf#rp47dHMCU>_~aPqm91DxE`a+texycu#H3w$nYjiGM*4Z0B0Ne)zZhVlXXw3OTv zQq3PN#m|&I@sqvVm?z&oyPRdW)oSuNp8^7S<&7E}Wx?x%gbV$Xud-?zKL3~~7N7`|LWixh`KkO}+?@S=B& z@~9&&Jg3QBU9a8Rx+2qiLD^t$gq7&ajG2L>I0yiXQbyk zBk=giMa9{2ok5!x-I*?CNLR8$mj*`Exe12uFMM9^w99Ahq$+)HwL?1VkUAk8S9wPb z*Ep-7#w#cK^3@qpZWI!fs8uXc7!l=Boz)h#AXsNnMG#DaE;QRAlV&}Ws6UFAhaGLG zcox@caGxe%NxM~q>UcN-t}dOgu8zjO#YLxp5}f3v%pI$W!;niW{(Hd140KV;JAb=0 z&}CKG5`d>GfIVR-_QJ-vBe9!d05(PjO+Lx_{Ww)b?RnkT0x-8+YjouQ6k8PVa;p)!u92cqhz(PPii82_K1d!pgEXyp`9> z^`1QI>!W7yXZ`uCFVOJ$;K)}5P_uU>#R))G9e;nApDoQB`4u4OGbu&A3 zbs9QDIa(O>p$x3uVJ@%ZWuuMf^#FIAv9qknT77I>4lA7Cl}MSrJOM&t7-Zi!th?Rv z$CK~-JkR&{=lglw4!6U9Su{5!6+dc7qPq)ZRGi&c#c{HXuc=(K*E(?zy|-7nrW<9e zy71GiYy9~sY8q~xat^;T<&;CxO|NDAvuUbtZ4|IG5t3$M^&3uv8zbn;C13bVL`FSR z_=luaSAO6JchONcbVLZsRFCdW;?uLb36Bq*P5MQ&X8}HCydgz$ji&or-&|e#jPRCgGmx3QlkyE-ybDW8u2hLs%A||4m1o@}V z&O3=wKe#s%YtthdLy;JIBaX&mUW4L$+~f1>QEwdIilVpUXgYf|9ScdHKjqEzbK{aR zL{pU_K9t0DN%=d1frGfwCDtb5V?;8PY*>nEdXbpd3b!{(mJm%MH4PTQ0i1XZD(6H? zq|Q*ltHfofw$&$FxUr$1CR?`9p zhVvQRAJ(xPek_<_MS%=m-($F*�-(_M1}Hi`P##NwG>xNV*otFe9oXn~l49ANjfQ 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 delta 2325 zcmZ8jdr(x@8NUzqg*025ZT(LN0o`ce7Xb3cpAhPTUbdB)H9mIZ;t;^s0;WFAi-&@1@c}b6ct>Vr(-GtMF zY+)aZ(zPa!#TZ#@G^MosAuanIODkLdc3XP#_JXT_J?rwgi#AzPe|e~4Pts}9qI)h$ z?DI1c>y7cEizolkeU;uwR&*QlJtMtil$pifU-Z^@j8W*oqLAsPhO|z4=+4a%X<>qr z4-{6B`gK)x5Tm>DTqDyu??tV5n+EcwIi5dhZ?_{kSc}pWmmcLP@I_NWl&1&=(eoXr z$EQcS5dJ)b)F8UHpbcGH7&8C+pb$Gpjhl@_l3K{(TPnVy^50|(6xOt?A+H4r<{Y>3PKafo4ni*@5^c%Lkz$srqhh1Ef zce`VVnidTG6$;Gn-=!qe5BxFNIuMic+=j6VMKZN>Cw`!G;|-Hd=KmC?4w;7sVzLo& zWUFz%F=Yw6CwuivB6Cx0=0Wz#8@<5y>#dz}$<<6mEvlZMPH8k&VU`1Ps&L(4t=&yyun z4u)H;iQnp2c{koV-DI9|IB?OV5Nk02vDzZ&-58pV;onX>FE{iy_VK8E&R;1dc3-&b zM=}dkbZ=g*qRk<~C$6U}E}lrdp{GxgGE44}Va3Pdqd`bP{08mzT2!KFsHQ1`1+d&= zP92gI#6n<5j!c8n31_#pgL7r#+^h4!fcQHPgxp5g6co19RJE`=OC z(nUS(vbm}E5OeFY#NvmM0SZ^nd)fyQA>8qZc)8;cBldN?!ic>cHO!rccA!A~WxRP`eDwTtK1()2oA6qZU_Qhu?7_r{WA zEc|%#(7J&EhJ2cyNoSCy^lubx4tW9t`&}BN0{F->Xch4)o}J~z1^<01EYAA}- zQqW-s<8%0FNhg$}s3K4;NSZXS2zvNVOEOQrO*NR;S#4B3)sT^yWz)zq6@k6Lzba#n z)yi1psfI?LKo4kW)Jtg^x~pmE9(3iYz7M^89GC>(4fGoMxxOT8Z~@IM`QCE$h^~S% z`98|j1PJ>+A0spCtc6jLx@Ge#Ch%*MgF(;l`zk3rL3+W8UR1Cu~1 zkG!i71UL@(4ez(PQvGGF6#tKXEa~E`8${L7jdspsT@;qLY3k#6i0WwrT#h{C3dzlM zt}gECp9E3Dik3^wph3?Zz8Z2&kyu?X#DPVLdgiFHOd1An1a0WsFyl+t) z(FJ7VU_cBMs6fYki`srbc}pm6`&-Ngu!?-xRUy|?3Aax`^j}H+6T%58nXDgIZdy5noEEq9AZp7TAqzJaM7F?D4oiWpDzZuV^D+l z?P+w(pca=FEvd*lm{0=)q$g`L-AV3ceRus)rE64X;R){wNM_H7Tr@ZW+7Um|HY2-j zo6`X5KRFk@^UfuBehLgd{of|FwsM+W?6c+5#Kmxi+EF2P22GQx^*b0gOtQ02&=urt zb`|rULgeh9(9@(MXB({}$8%n$qvX?^ob4c}0#KEBUi*vjK8E6kR=cj%-Z2M+LKwts z4C=RqXHb-E&9$zHKTZhBl?bWK%}tq!h`pdC$iPel6_ew++bkt2eq#>TOkw>aoTp-c rko4tl$UCgy-ze4jZ1onl`dJothw?q@oX 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 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index a2b05e35494b987e7cec93cba939b7a219cedf6f..1d79fd746ad105ff1016c31f80bb9ebc9ace6510 100644 GIT binary patch delta 2082 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 diff --git a/c64/kernal/screen/screen_grow_logical_line.s b/c64/kernal/screen/screen_grow_logical_line.s index d2995b3c..b90f36de 100644 --- a/c64/kernal/screen/screen_grow_logical_line.s +++ b/c64/kernal/screen/screen_grow_logical_line.s @@ -36,7 +36,13 @@ count_rows_loop: cpx #0 beq no_copy_down bmi no_copy_down - + + // Preserve EAL + lda EAL+0 + pha + lda EAL+1 + pha + // Set pointers to end of screen line, and one line // above. (It is always one physical line, because // this can only happen when expanding a line from 40 to @@ -105,6 +111,12 @@ cl_inner: dex bne copy_line_down_loop + // Restore EAL + pla + sta EAL+1 + pla + sta EAL+0 + no_copy_down: jsr screen_calculate_line_pointer diff --git a/c64/kernal/screen/screen_scroll_up_if_on_last_line.s b/c64/kernal/screen/screen_scroll_up_if_on_last_line.s index 8f8281b9..1ad713cc 100644 --- a/c64/kernal/screen/screen_scroll_up_if_on_last_line.s +++ b/c64/kernal/screen/screen_scroll_up_if_on_last_line.s @@ -28,6 +28,13 @@ is_last_line: // FALLTHROUGH scroll_screen_up: + + // Preserve EAL + lda EAL+0 + pha + lda EAL+1 + pha + // Now scroll the whole screen up either one or two lines // based on whether the first screen line is linked or not. @@ -88,6 +95,12 @@ scroll_copy_loop2: dex bne scroll_copy_loop2 + // Restore EAL + pla + sta EAL+1 + pla + sta EAL+0 + // Fill in scrolled up area ldx SAL+0 scroll_copy_loop3: From 2398616bee2c1c52ffced6318c6f571d2f689a17 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 22:25:15 +0100 Subject: [PATCH 055/105] small CHRIN optimization --- c64/kernal/keyboard/chrin_keyboard.s | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/c64/kernal/keyboard/chrin_keyboard.s b/c64/kernal/keyboard/chrin_keyboard.s index b91245a7..2c814539 100644 --- a/c64/kernal/keyboard/chrin_keyboard.s +++ b/c64/kernal/keyboard/chrin_keyboard.s @@ -33,12 +33,15 @@ chrin_repeat: rts not_end_of_input: - // Return next byte of waiting input and advance index + // Advance index + inc CRSW + + // Return next byte of waiting tay +chrin_keyboard_return_byte: plx_trash_a lda (LXSP),y jsr screen_code_to_petscii - inc CRSW clc rts @@ -84,13 +87,10 @@ chrin_enter: sty INDX lda #$01 sta CRSW + // Return first char of line ldy #$00 - plx_trash_a - lda (LXSP),y - jsr screen_code_to_petscii - clc - rts + beq chrin_keyboard_return_byte // branch always empty_line: // For an empty line, just return the carriage return From 671a3bc3bfb29114d2d7f398125990b9d95c4948 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 22:29:20 +0100 Subject: [PATCH 056/105] saved few more bytes in CHRIN keyboard --- c64/kernal/keyboard/chrin_keyboard.s | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/c64/kernal/keyboard/chrin_keyboard.s b/c64/kernal/keyboard/chrin_keyboard.s index 2c814539..dcefc146 100644 --- a/c64/kernal/keyboard/chrin_keyboard.s +++ b/c64/kernal/keyboard/chrin_keyboard.s @@ -6,7 +6,7 @@ chrin_keyboard: - // Save X + // Save .X phx_trash_a chrin_repeat: @@ -27,6 +27,14 @@ chrin_repeat: // Return carriage return and clear pending input flag lda #$00 sta CRSW + + // FALLTROUGH + +empty_line: + // For an empty line, just return the carriage return + // (and don't forget to actually print the carriage return, so that + // the cursor advances and screen scrolls as required) + plx_trash_a clc lda #$0d @@ -92,15 +100,6 @@ chrin_enter: ldy #$00 beq chrin_keyboard_return_byte // branch always -empty_line: - // For an empty line, just return the carriage return - // (and don't forget to actually print the carriage return, so that - // the cursor advances and screen scrolls as required) - plx_trash_a - clc - lda #$0d - rts - not_enter: lda KEYD From 8cd2eac996b679601c3475a5238e4501e6bb37ca Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 7 Nov 2019 22:40:03 +0100 Subject: [PATCH 057/105] keyboard part of CHRIN now preserves .Y --- STATUS.md | 2 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/aliases/,aliases_ram_lowmem.s | 2 +- c64/kernal/iostack/f157.chrin.s | 2 -- c64/kernal/keyboard/chrin_keyboard.s | 13 ++++++++++--- 12 files changed, 12 insertions(+), 7 deletions(-) diff --git a/STATUS.md b/STATUS.md index c2864db9..821d2fc9 100644 --- a/STATUS.md +++ b/STATUS.md @@ -132,7 +132,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFC6` | `$F20E` | `CHKIN` | DONE | | | `$FFC9` | `$F250` | `CKOUT` | DONE | | | `$FFCC` | `$F333` | `CLRCHN` | DONE | | -| `$FFCF` | `$F157` | `CHRIN` | PARTIAL | no screen support, keyboard does not preserve .Y | +| `$FFCF` | `$F157` | `CHRIN` | PARTIAL | no screen device support | | `$FFD2` | `$F1CA` | `CHROUT` | DONE | | | `$FFD5` | `$F49E` | `LOAD` | DONE | | | `($0330)` | `$F4A5` | `LOAD` | DONE | | diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 075bec045f52902291b01cb5d79d0a585ba77da9..a31fe15d746e46110270dec69edf6803cd4c5f8b 100644 GIT binary patch delta 114 zcmZp0XmFU|!MJy#ryAqljRkxxjC(iNv%F!H-1~l|y~3sc8LJfLuT{u>xkwR2?|rYZ zcXA8c1eP7|eQGvKuyZp4m8)<}WMz88yrw{D8(wuGM&rpT L@>M{g`|^qamB=i^ delta 114 zcmZp0XmFU|!MJ0hryApqjRkxxj5{{hv%F!H-0^;;y~3sc8LJfLuT{u>xkwR2?|84U zV{!}I1eVS3eabgWuyZp4m8)<}WMz88yrw{D8(wuGMx)6o L@>M{g`|^qag*PmB diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index 31f6c4df7248f6e41126940a2371d17dce745201..99e680052db0785dd9257def1adc819aec51125d 100644 GIT binary patch delta 13 UcmZp0XmHq&EYD~>IYoXB03ihgnE(I) delta 13 UcmZp0XmHq&EYD~(IYoXB03iSbm;e9( diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index eeeba8125060c0162b25a3076549287740696821..cdefb4d70704133289b05a186f39d298351ee3f3 100644 GIT binary patch delta 68 zcmZp0XmHrz$HLP4&PQ-^5Q`4uq|Nm#XPFqMPxfVxV4O608M`Hre8BDulu+S_U;$FK VJZ_AP(>EXCoiE5}JUK;v4geq@7S#X% delta 68 zcmZp0XmHrz$HLO_&WB}k5Q`3D@8)`zvrLSWCi}8SF!oMf#%>8DAFw+EB~&;fSb$V5 Vj~gT7q|HZo=L<3#O-_-Y0{|DZ7M}nB diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 025ea811a31f6306a9774d5d19d6ce69e04550ac..e809611de914ae319d6e0940bce0d3182174ccc6 100644 GIT binary patch delta 170 zcmZp0XmFU|q0#YSrM<$X{~4t<8 delta 170 zcmZp0XmFU|q0#(drM<$X{~4W|9ykV5YrbnUqgF^G<7PblObsv2GePc+NtjKON*?^sGaxD8XphguATV}?N$w}P7 wjLnm`aX$l+b9r=u zgbjgR9K|0AG(6Wwf~#Rh&@_UJj>o264a-n5qLU)brMIBI@;2yB+qo?J=jGmW@A>Yz z-}%1#Dy@}P_jTS_s)%k>svr;fm7kbhsL==l?w2&xPV>+VI@2Zg>jqeq1Fs^FqKde8 zNro<`c*`W(#=3TEWr6BZjvu#->xS&D=&0i6k<4H!;H&^ih&IkT`gMH9DRVtvS=*2p zI~J(e^V`7MRrmXU^c0Q^UjL?}Mpwvf?Df^@(Pba%^`Wo)=(^8o5L?&UTitr(^5chI zbi$AN!%O|XKGUPE&S1Odo+-MI1`2pwq~Lr-ctdN@Kt)Jobv&*hCPUiXQC}#p*XK0D z?mSamA61Z31w=RiR-6V&Q;bH*+lFM$Nou8o5h-q`ejAgP;VhD1YCM=104@%w z#vy2hQ|I9;@3s3V-$$Pb)y0nD5Tm;oe1X1p3(eKmSSVip42DK6ooF}HTwjfu3NSF5 zLW5$lff~FG7MuN;U_s}--Uh7mi$7Ddc!S1D8v8Z-4V0-$oc)^6h7OHaqj>#@6ww3} zjm%8I8;RANp5|7eOKu)(#_)=u&1FN9iYrtY;60?myi*@uY#T46g}_P2pr9Q9K@j0rJo~axZZ^hGPDhLh*j=_XB%)F93w>w;^bY40fpEdB6jC z(P@Z)yapsqNM1KX^120~`YHEMk`R_xRnqH=_5 z&a|E5?3d4J>^-cn{2 z9K}FcOo%e{Ll9dOn+p|A;93=w(g5VQSp-nuiwQW^no`0Qk>e>DQIZ1szL>J&oeEX# zg3^KF3KgoyM<&nh!X}v_*nN@HSJuw}tAwPP{)Lw#c)oB0A*_)DI^) z?JaCnx#W>nb5);iM8W59zYd>xmHpCQp_OB49$KxU zj48BE6>r*Q@s_<0EgyIFRu%M|y(uH6^d9a7>(FKmyGTrFi8H=eJ&n_Cp2}%j9B@l)20sQo1Roe?!{c0#0^U9ihU#{sY#-t{o88nbn)V-kr8(eWGm)cBQ;Fp| zxJ5!26BH)c+1KpSKkK1`IxMAJP4f#19bA>M_AaPzeG1!oyV^AU^XA-h@A=(x ze&=`Yt0}1|@tooHR!Q_AtAx7AMSdbv~6NI#Ust@)S|a} zle&LL6Z9lf#$Cx2Az1e@Iu=yq2O_Kq=HdK8v8BbKq*2^!(x$B66xtd9i3S0N(d}RnZ~V=a;anC{0lzAif;l@zc((jzgU7_#u_; zSk-(USb(h-ayMlGXC=?24wmIIMI=U=AE+}@0SvuCF`6vER-D2X>I>r}sltVdC$L=x zsWbxb9VP+9_GAIWxirnn6_fAN%rQ<0q}-df`0Z+0^g`CaZnX@Fv!PIA+g<;K_$`QTS>?X&iu3sKlKh zKtTt5Xjafqp{}lgc#2)^+^Y5^&==4vGBQu1GFd!p^NHtd1E_S|)n8j^I&jv9nAE?c zA7+NOsU8D>iX(u;keNKKQ|{S2)zMQk#X88mO!qU;S5A*;jL7BxY2yTR<)PS8hbY!b zorv06Q20KPGc%H+-SomK104tSUU%?^r>;NZ$Nm8deI>2{ diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index d05ad7ccd5242d0f8f76f49dfdf575d73775ac99..7295e4f1f54a6888783500a1d78729d481c5b52c 100644 GIT binary patch delta 1448 zcmZ8hYfKbZ6rS1H2hc@#dAPHHaMh|PY)hpz*fa$ziPYSvP5Pq-6Gv&V8vj|+N$HDgz9SW0YYk<5y6?+9ogPtOVjkv&ADgh zJLkLK`R=W)sI3U?Fk7coAq1unYu=GlN)QYK_xOo=-Z}D;WDg3rEW@(76&^y5%pQ9n z)_F59!~p*&>_rPLh40>rf%0eJou&vQS;0OPc1&7ExK3c#LKH|hwhR;!C^IE>UgOsp z3)`JXsM@cZv(lFqoDCgo5{1e&#fv}NP`<994K-T6c}I^6y+)Ny2{su#i3>dv1?@T* zn!y?CNa(2mzKODJO>|UkAfn+1YJ+VkJg$1ksFZr5!Q}o6 z_1Vtb9x2d29*&{|DZ9#6=@`ZaS*XV0y2KpEB}O02@rg(p97hd~Bgxe7;&y{0Do!oj zSFOzE#QU?Xu}pYdt$bpOI<@A?=DTV+sGrR!kIV! ziwP`Ph=L!F;xoeo=u>AdS%eNbm*e%6v)DTOF@o+pUweht>p{X0R~rx4nB@6M;EWcb zWD3egj`LypXvWacj4Cp+*8dOUNkP?VJVS8(-c=NCIQ#!p_Oje*g_T`Zyvc6@_EEM9OsQ;ylq~#O zFpb_=AdmrcXF*Zkv~q&D>xeUaqLGL)I4+4Z{7wbau_0$1Au_XxFe5l5MP+X1SvbjTISdhU-YnNPA!P8M1o*(lQ13j|y^tr)-9$F&H@GN`A;Bw8V zR_QLq_p}gS)PFC8JU8of)Z}*4QBCNGa`MaSNX7kSD|%)bHL*dQe8rkL360 zM$UUFUL`P$9d`&7QgjQP7CXrN?1RBaHEWCC6Vw$B+SxDH@fgA7R1w+ISxoW9Jmyy0}3 zr_KHaQ+KKyAu=8wVd)w}98`e~n@7%HKG;T0{`5GM)uIN?D<7^_BjS80}2HIm_ zWRYY{4}+tA3Vf;t2f;cuI7Cv#O7JH?O0>KID)2j|O<9vFc=R}Uf(;0bYfI%Z;E3zh z@HeK{UBe0#74)jXOcCB-DALG4W6T0z3C=V(IwzHr)OhHja?(5!dZZN60rAwtPt0*|TnWr8GU-yD#V{S+s$0jJ-JI@v&v2wIhC$%(+? zW8nvR>_Uw}v`U-7Z&Bb`0C%IpASVh#+%2$uu5;jck+Ww|1af4+JK(1|$wxgY;9QLo z6$zX--YeJSlv_3h+?pjtU`_by2U_6jo0=TJs%0yEzIS7Cikbc#m)dhuKMoVYf((3j zikul9!|&PMbP+ygUqjYzdx2@`V?Um>Z+OuYs|QI65m%iF9W= z5wFG1aIL6JXp)n*fJ@UX0-jh$vurya+Gn_VSt9(R*C|*&-_d+MnXvsQDqL>aXArKm z95e`_mTJR*x0wuQ2-l_O&|+^}dOB_L=pOwAf19y}zKic?>^IkFpi2YqvOco1?rwHiuiZ~HI7JJ6h*$|03xDJ&qHD0= z*k%Q%RdNnX%rZfIgdaGz)QSpqit^gBTyCn4@@6`+-OoC|lM#<1mh8eE$x2$^=I(&=QR1!JC_sLyC(idL?mn?JF*Fk0 zjj1ATb%GVW3fl=b&O=X(;F`z?1H{C;9zWecBOY^Zr-!k}qUFw+~(sif%{yeGGi_Ta<06|{!$=jOhoMfkNqiwNChM8ZW# zmK%E1uSadRVZMlbgiM^oKk_Tc@Yd(Kl9!$YK-NsWCl4$)#)J@g1jsOqF|ZCF&MUO- zRN#?0SRIC@hpgC1XW08e_ E0W*uRi2wiq diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 12cfea8691ae602ad32ab380743d41c60431bf2c..ae006d3f0f0052537067f38ad9c9f4e6b40e6ddb 100644 GIT binary patch delta 619 zcmZutT}V@581|d-ps7jo+?s4Y+ZFDyMYgZ=s$fDiT<~(3}`zNaSPgoMCBC9>n#5p z0U`krU(laGJMn~Gsps`KE@s~Uq2H!HT=J~V7XJR$G)1hiBU_O8I0zF661bOxLOxt6 z4Ic3h4s#&qgs*cjkOO(OBr89;HpHZ@hO-Rs7`n}NZMYn6El3Zcxt1#ccfQ54_jdWMUcz^Gr!FP}Tx= z>@jwtI36=@(51ShG%Nq7!K54 zU!Nw@D{yPkS??emrEpARAsf?L*NN;(Pn`qtw$k4F=Y_*Xm{un0TM)7-OY0~?(@M7C z9IA|y(gT9H%d&}WbH%dbW?$gJAxWi>NUD6a%&U6jNT4xV?V3~NkyOkh-;D%dN^5jM zKat+ik3*MrscO{*$Csgb1-h1{NpDKZc*mh*K~DB>e={j1bm; zc}yukZd!)%9HR+O3-OmU7LQOm%CS^dUBug(5-6c8HidNTl>5yVoheNOwkgtENw Pj0i9AYb&66JY$7_S#u}N delta 599 zcmZutZD>+a81^`GT5f)=rk42%{fNdQ#zr(E?TbFRKVtnV2n<_TAVm?2KEP;3MHh4j z5*m@Icgzce$^9dR6w!xn5Z6J_7J+NDyb;%9YnsHeqxG{t&-Lu;EiD5F38cO@Z_y7I&dO#0n=-MQQz? z1h6u&_`K>k>cP`0p`%{CeqrYAFS0QE=Av&+@!RhovMh|O+KRSB5RJK*;cIx8-e#bd4pgWyMnk~01WxSJ51=%Ds$Z}4OY!%5 zL<^oX459_>Hf~T|k|@PvysB>cG~jvT9^}NEOuH$bHuX{*HC?2tOnbjDhw6|QraQV2vJ2I<1fjf8>^zHF({dy42tH=rNVmCc v?ZH>Hx9~RGOY~e=wnddx=f2&lH25XPTVld1jH1HuGLyp39DwFyKNzw(amZV4@ zv8fp2wkx}Vu=GJnR{EfAL*f=@1v5%)l|`N9+FhF6zWMSy=R3c1zVqkjIpjGMnd4X= zdBZJl-p??ih-Ve1OR{~~pcaPZS<_oE25<>kH1-Pz_YU+rt1HX+HT`zSi^U4kW2!S) z(`3e!ar&Xxj2-~;1G@j?m>q>-{tDP+lvw!5`n4o|IE5x%U6 zavySQ5e{AdCHJp;I0a-Ezf7m9w6svXZ8>ka`jzA?CwHbmeuB)Om5<&K+LuGk8hxg~ zE{gIS6xJggPSbYedBv@ff=gy{ku#A?f@4$AA=QY(%)GEFN_r2I%=@lY5)$eys9{-Y z!1Fn>Ae z?8x|ppRVGBFgu}x1r3rNW&NycG+K6mr6#k{%-RZk!kW1Dth3W2AS25fjO5>@eS0NS zl=IBDfyyP+-(o1>bMfz*4QkFV){0$Cfu{V~k7Oz0C5`S%ce_x2%$9<6($a<|(|K*4 zl0^B4AqAry_A{)-njU%!998|B1G6tk?dF;4r;tzcgJh$pa|*=?RYR~s#id$PM&cEw ziT>iOxZioxA83+QKvOZbP+`34x$uzRt`vzWHT)?4@LafS$d9Hob`f=eJPoghuNdM* zsuSH?L0i{Q--`Uw8<$^s6R7c5IOcOrK6)8Ppv7*)6xOQ-85pMpl5zgD4uuIJhZ1R8 zhG$lz?fS!LiwBdy^`4 zae`-)qINgwGk^gC+yp#Uz*8a`CGYu8@2COz6u7bmh7=$jlq9@i07r_{J`PUqngP76 zB542=siPdY|4SM?h@dlqPZ+o8RQaYxirprsZh8;LOjj;BBhol9toy%odO>Ln)T{LB zj0gyU>MegYT#ohBNixZvoR*XQOsCv1EcnxquVHv>224fQWC4LzB2AG`BQ3g_H2Dvv%vouNRC+Yg7@Q-N7ko?7*zk--Y!jMX;4v=E5!u`?-1|s;&=&3De>&1b{QQJQ zOaSAfS%d7cKrpMErAPFTfz{i@VuVwyrB%`b@M&~5g-WT2NkPuFe2d6jNZv-?{w{}c zsa_|?1XO`~>iX*vI-lF22sczJ3jNzn>jjH5a!@qg0dJIq8OCwQ`a>S0yjxhG1p}0noe>s8iT)gVDeW_SY!~xl Date: Fri, 8 Nov 2019 18:43:17 +0100 Subject: [PATCH 058/105] added some comments to tape support coode --- c64/kernal/tape/load_tape_normal.s | 22 ++++++++++++++++++++++ c64/kernal/tape/load_tape_turbo.s | 10 +++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/c64/kernal/tape/load_tape_normal.s b/c64/kernal/tape/load_tape_normal.s index f480922e..e9e69370 100644 --- a/c64/kernal/tape/load_tape_normal.s +++ b/c64/kernal/tape/load_tape_normal.s @@ -4,6 +4,28 @@ // +// We have the following possible CPU frequencies: +// - C64    PAL:  CPU frequency 0.985248 MHz +// - C64    NTSC: CPU frequency 1.022727 MHz +// - VIC-20 PAL:  CPU frequency 1.108405 MHz +// - VIC-20 NTSC: CPU frequency 1.022727 MHz +// Since VIC-20 tapes are not expected to be loaded often, routine will be optimized for C64 timings + +// We have to distinguish the following pulse lengths (http://sidpreservation.6581.org/tape-format/): +// - S (short)    352 us +// - M (medium)   512 us +// - L (long)     672 us +// This gives us the following thresholds (where average CPU frequency is 1.0039875 MHz): +// - S vs M       432 us (54 8-cycle periods) +// - M vs L       592 us (74 8-cycle periods) + +// The following encoding is used: +// (S,M) = 0 bit +// (M,S) = 1 bit +// (L,M) = new-data marker +// (L,S) = end-of-data marker + + #if CONFIG_TAPE_NORMAL diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 80169211..2bdc473f 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -18,9 +18,9 @@ load_tape_turbo: jsr tape_ditch_verify // only LOAD is supported, no VERIFY lda #$00 - sta CIA2_TIMAHI + sta CIA2_TIMAHI // $DD05 lda #$FE // timer threshold for TurboTape - sta CIA2_TIMALO + sta CIA2_TIMALO // $DD04 jsr tape_ask_play @@ -112,12 +112,12 @@ tape_turbo_get_bit: lda #$10 !: - bit CIA1_ICR + bit CIA1_ICR // $DC0D beq !- // busy loop to detect signal - lda CIA2_ICR + lda CIA2_ICR // $DD0D pha lda #$19 - sta CIA2_CRA + sta CIA2_CRA // $DD0E pla pha // audio/video effects From 67e82f2846c87993afd1aac01116193a44022455 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 12 Nov 2019 22:28:27 +0100 Subject: [PATCH 059/105] more work towards JiffyDOS --- c64/kernal/iec/f000.iec_jiffydos.s | 62 +++++++++++++++--------------- c64/kernal/iec/iec_tx_byte.s | 2 +- c64/kernal/iec/iec_tx_command.s | 9 ----- c64/kernal/iec/talk.s | 13 +++++++ c64/kernal/iec/unlsn.s | 7 ++++ c64/kernal/iec/untlk.s | 7 ++++ 6 files changed, 59 insertions(+), 41 deletions(-) diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index 2448e2f4..f83c45c5 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -10,30 +10,28 @@ #if CONFIG_IEC_JIFFYDOS +// JiffyDOS timing regime is very strict - before transmitting anything +// we need to disable sprites and (if screen is not disabled) wait for +// appropriate moment, so that no badline interruption can happen + + iec_tx_byte_jiffydos: - // XXX disable screen - temporary, just for testing - tay - lda VIC_SCROLY - and #($FF - $10) - sta VIC_SCROLY - lda VIC_RASTER -!: - cmp VIC_RASTER - beq !- - tya - - // JiffyDOS timing regime is very strict - before transmitting anything - // we need to disable sprites and (if screen is not disabled) wait for - // appropriate moment, so that no badline interruption can happen - jsr jiffydos_hide_sprites pha // store previous sprite status on stack + + // XXX prepare bit pairs too send + + // XXX lda TBTCNT + // XXX bits to stack: 0, 2 + // XXX bits to stack: 1, 3 + // XXX bits to stack: 7, 6 + // XXX bits to stack: 5, 4 + jsr jiffydos_wait_line __jd_check1: - // XXX send byte @@ -50,24 +48,25 @@ __jd_check1: iec_rx_byte_jiffydos: - - // XXX disable screen - temporary, just for testing - lda VIC_SCROLY - and #($FF - $10) - sta VIC_SCROLY - lda VIC_RASTER -!: - cmp VIC_RASTER - beq !- - - // JiffyDOS timing regime is very strict - before transmitting anything - // we need to disable sprites and (if screen is not disabled) wait for - // appropriate moment, so that no badline interruption can happen jsr jiffydos_hide_sprites pha // store previous sprite status on stack + + // Wait until device is ready to send + jsr iec_wait_for_clk_release + + // Prepare 'start sending' message + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_DAT_OUT // release + pha + + // Wait for appropriate moment jsr jiffydos_wait_line + // Ask device to start sending bits + pla + sta CIA2_PRA + // XXX retrieve byte @@ -95,7 +94,8 @@ jiffydos_wait_line: // To give the transfer routine as much time as possible, // wait till a badline - // XXX this has to be carefully tested! + // XXX this is probably overkill, most likely it is enough to avoid 2 (3?) lines + // before badline - to be adjusted in the future !: sec lda VIC_SCROLY @@ -104,7 +104,7 @@ jiffydos_wait_line: bne !- jiffydos_wait_line_done: - rts // XXX 6 cycles... we might be forced to inline this routine + rts __jd_check2: diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index a58a1689..02e28f81 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -75,7 +75,7 @@ iec_jiffydos_detect_loop: lda CIA2_PRA // 4 cycles bpl iec_jiffydos_detected // 2 cycles dey // 2 cycles - bne iec_jiffydos_detect_loop // 2 cyycles + bne iec_jiffydos_detect_loop // 2 cycles lda #$00 // 2 cycles beq iec_jiffydos_store_proto // 3 cycles, branch always diff --git a/c64/kernal/iec/iec_tx_command.s b/c64/kernal/iec/iec_tx_command.s index 9a43b02c..04c8a0ca 100644 --- a/c64/kernal/iec/iec_tx_command.s +++ b/c64/kernal/iec/iec_tx_command.s @@ -16,15 +16,6 @@ iec_tx_command: phx_trash_a phy_trash_a -#if CONFIG_IEC_JIFFYDOS - - // With each and every command, check whether device wants to talk JiffyDOS protocol - - lda #$FF // unknown protocol - sta IECPROTO - -#endif // CONFIG_IEC_JIFFYDOS - // Notify all devices that we are going to send a byte // and it is going to be a command (pulled ATN) jsr iec_pull_atn_clk_release_data diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index 4cd64cfe..52b689c3 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -29,6 +29,19 @@ TALK: common_talk_listen: // common part of TALK and LISTEN sta TBTCNT + +#if CONFIG_IEC_JIFFYDOS + + // It seems that only TALK/LISTEN is used to detect the JiffyDOS support + + lda #$FF // unknown protocol - check what is supported + sta IECPROTO + + // FALLTROUGH + +#endif // CONFIG_IEC_JIFFYDOS + + jmp iec_tx_command #else diff --git a/c64/kernal/iec/unlsn.s b/c64/kernal/iec/unlsn.s index 55fb5fd4..b5dc8990 100644 --- a/c64/kernal/iec/unlsn.s +++ b/c64/kernal/iec/unlsn.s @@ -18,6 +18,13 @@ UNLSN: // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#if CONFIG_IEC_JIFFYDOS + + lda #$00 // switch back to standard protocol + sta IECPROTO + +#endif + // Buffer empty, send the command lda #$3F diff --git a/c64/kernal/iec/untlk.s b/c64/kernal/iec/untlk.s index 1e7f542a..3dfceb2b 100644 --- a/c64/kernal/iec/untlk.s +++ b/c64/kernal/iec/untlk.s @@ -18,6 +18,13 @@ UNTLK: // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#if CONFIG_IEC_JIFFYDOS + + lda #$00 // switch back to standard protocol + sta IECPROTO + +#endif + // Buffer empty, send the command lda #$5F From 28bc07ea235714d58c0d6afa5ac2284f16070bd1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 17 Nov 2019 21:32:33 +0100 Subject: [PATCH 060/105] more JiffyDOS code, more startup adjustments --- c64/basic/init/initmsg_real.s | 12 ++--- c64/kernal/iec/f000.iec_jiffydos.s | 86 ++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 28 deletions(-) diff --git a/c64/basic/init/initmsg_real.s b/c64/basic/init/initmsg_real.s index a0ffda23..5cb951a3 100644 --- a/c64/basic/init/initmsg_real.s +++ b/c64/basic/init/initmsg_real.s @@ -10,7 +10,7 @@ initmsg_real: ldy #>startup_banner jsr STROUT - ldx #$02 + ldx #$01 ldy #$04 jsr plot_set @@ -18,13 +18,13 @@ initmsg_real: ldy #>rom_revision_basic_string jsr STROUT - ldx #$04 + ldx #$03 ldy #$04 jsr plot_set jsr initmsg_bytes_free - ldx #$07 + ldx #$06 ldy #$00 #if CONFIG_SHOW_PAL_NTSC && CONFIG_SHOW_FEATURES jsr plot_set @@ -54,7 +54,7 @@ initmsg_real: ldy #>startup_banner jsr STROUT - ldx #$02 + ldx #$01 ldy #$0A jsr plot_set @@ -66,14 +66,14 @@ initmsg_real: ldy #>rom_revision_basic_string jsr STROUT - ldx #$04 + ldx #$03 ldy #$0A jsr plot_set jsr initmsg_bytes_free + ldx #$06 ldy #$00 - ldx #$07 #if CONFIG_SHOW_PAL_NTSC && CONFIG_SHOW_FEATURES jsr plot_set jsr print_features diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index f83c45c5..b9c6104b 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -17,40 +17,89 @@ iec_tx_byte_jiffydos: + // We need to preserve 3 lowest bits of CIA2_PRA - as they encode + // Use C3PO for this, as afterwards we have to set there 0 nevertheless + lda CIA2_PRA + and #%00000111 + sta C3PO + + // Hide sprites, store their previous status on stack jsr jiffydos_hide_sprites - pha // store previous sprite status on stack + pha - // XXX prepare bit pairs too send + // Prepare nibbles to send + lda TBTCNT + and #$0F + pha + lda TBTCNT + and #$F0 + pha - // XXX lda TBTCNT - // XXX bits to stack: 0, 2 - // XXX bits to stack: 1, 3 - // XXX bits to stack: 7, 6 - // XXX bits to stack: 5, 4 - - jsr jiffydos_wait_line + // Wait till receiver is ready + jsr iec_wait_for_data_release __jd_check1: - // XXX send byte + // Wait till it is safe to send data + jsr jiffydos_wait_line + + // Notify device that we are going to send byte by releasing everything + // Cycles: 3 + 4 = 7 + lda C3PO + sta CIA2_PRA + + // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 + pla // retrieve high nibble from stack + ora C3PO // restore VIC-II and RS-232 bits + sta CIA2_PRA // bits 4 and 5 on CLK/DATA + ror // move bits 6 and 7 to positions 4 and 5 + ror + and #%00110000 // clear everything but CLK/DATA + sta CIA2_PRA // bits 6 and 7 on CLK/DATA + + // Send low nibble; cycles: XXX + + // XXX something strange seems to happen with low nibble: + + // $0 -> $00 + // $1 -> $80 = $10 + $70 + // $2 -> $20 + // $3 -> $A0 = $30 + $70 + // $4 -> $40 + // $5 -> $C0 = $50 + $70 + // $6 -> $60 + // $7 -> $E0 = $70 + $70 + + // $8 -> $10 = $80 - $70 + // $9 -> $90 + // $A -> $30 = $A0 - $70 + // $B -> $B0 + // $C -> $50 = $C0 - $70 + // $D -> $D0 + // $E -> $70 = $E0 - $70 + // $F -> $F0 + + // XXX why??? how this is calculated??? + + // XXX EOI signalled by early CLK (20us delay for non-CLK?) // Re-enable sprites pla lda VIC_SPENA - // XXX reenable screen - temporary, just for testing - lda VIC_SCROLY - ora #$10 - sta VIC_SCROLY + // Mark TX buffer as empty + lda #$00 + sta C3PO rts iec_rx_byte_jiffydos: + // Hide sprites, store their previous status on stack jsr jiffydos_hide_sprites - pha // store previous sprite status on stack + pha // Wait until device is ready to send jsr iec_wait_for_clk_release @@ -75,13 +124,6 @@ iec_rx_byte_jiffydos: pla lda VIC_SPENA - // XXX reenable screen - temporary, just for testing - tay - lda VIC_SCROLY - ora #$10 - sta VIC_SCROLY - tya - rts From d0fd34e79f14d4d5ec6194b707d6703556ef52d9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 18 Nov 2019 19:03:05 +0100 Subject: [PATCH 061/105] more JiffyDOS code - low nibble TX, general turbo dispatcher --- c64/kernal/iec/acptr.s | 4 + c64/kernal/iec/ciout.s | 4 + c64/kernal/iec/f000.iec_jiffydos.s | 357 ++++++++++++------------- c64/kernal/iec/iec_jiffydos_bittable.s | 33 +++ c64/kernal/iec/iec_rx_dispatch.s | 32 +++ c64/kernal/iec/iec_tx_byte.s | 14 +- c64/kernal/iec/iec_tx_dispatch.s | 33 +++ c64/kernal/iec/load_iec.s | 12 + c64/kernal/iec/save_iec.s | 216 ++++++++------- c64/kernal/iec/talk.s | 10 + 10 files changed, 422 insertions(+), 293 deletions(-) create mode 100644 c64/kernal/iec/iec_jiffydos_bittable.s create mode 100644 c64/kernal/iec/iec_rx_dispatch.s create mode 100644 c64/kernal/iec/iec_tx_dispatch.s diff --git a/c64/kernal/iec/acptr.s b/c64/kernal/iec/acptr.s index 4c9756e4..f31bfc74 100644 --- a/c64/kernal/iec/acptr.s +++ b/c64/kernal/iec/acptr.s @@ -14,7 +14,11 @@ ACPTR: jsr kernalstatus_reset #if CONFIG_IEC +#if CONFIG_IEC_JIFFYDOS + jmp iec_rx_dispatch +#else // no turbo supported jmp iec_rx_byte +#endif #else jmp kernalerror_ILLEGAL_DEVICE_NUMBER #endif diff --git a/c64/kernal/iec/ciout.s b/c64/kernal/iec/ciout.s index 9250c55c..4c6137bd 100644 --- a/c64/kernal/iec/ciout.s +++ b/c64/kernal/iec/ciout.s @@ -33,7 +33,11 @@ ciout_store_in_buffer: ciout_send_byte: clc // don't send with EOI +#if CONFIG_IEC_JIFFYDOS + jsr iec_tx_dispatch +#else // no turbo supported jsr iec_tx_byte +#endif inc C3PO // iec_tx_byte sets it to 0, but we still have something to send jmp ciout_store_in_buffer diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index b9c6104b..c7528db4 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -1,184 +1,173 @@ - -// -// JiffyDOS protocol support for IEC -// - -// XXX finish this - - - -#if CONFIG_IEC_JIFFYDOS - - -// JiffyDOS timing regime is very strict - before transmitting anything -// we need to disable sprites and (if screen is not disabled) wait for -// appropriate moment, so that no badline interruption can happen - - -iec_tx_byte_jiffydos: - - // We need to preserve 3 lowest bits of CIA2_PRA - as they encode - // Use C3PO for this, as afterwards we have to set there 0 nevertheless - lda CIA2_PRA - and #%00000111 - sta C3PO - - // Hide sprites, store their previous status on stack - jsr jiffydos_hide_sprites - pha - - // Prepare nibbles to send - lda TBTCNT - and #$0F - pha - lda TBTCNT - and #$F0 - pha - - // Wait till receiver is ready - jsr iec_wait_for_data_release - -__jd_check1: - - // Wait till it is safe to send data - jsr jiffydos_wait_line - - // Notify device that we are going to send byte by releasing everything - // Cycles: 3 + 4 = 7 - lda C3PO - sta CIA2_PRA - - // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 - pla // retrieve high nibble from stack - ora C3PO // restore VIC-II and RS-232 bits - sta CIA2_PRA // bits 4 and 5 on CLK/DATA - ror // move bits 6 and 7 to positions 4 and 5 - ror - and #%00110000 // clear everything but CLK/DATA - sta CIA2_PRA // bits 6 and 7 on CLK/DATA - - // Send low nibble; cycles: XXX - - // XXX something strange seems to happen with low nibble: - - // $0 -> $00 - // $1 -> $80 = $10 + $70 - // $2 -> $20 - // $3 -> $A0 = $30 + $70 - // $4 -> $40 - // $5 -> $C0 = $50 + $70 - // $6 -> $60 - // $7 -> $E0 = $70 + $70 - - // $8 -> $10 = $80 - $70 - // $9 -> $90 - // $A -> $30 = $A0 - $70 - // $B -> $B0 - // $C -> $50 = $C0 - $70 - // $D -> $D0 - // $E -> $70 = $E0 - $70 - // $F -> $F0 - - // XXX why??? how this is calculated??? - - // XXX EOI signalled by early CLK (20us delay for non-CLK?) - - - // Re-enable sprites - pla - lda VIC_SPENA - - // Mark TX buffer as empty - lda #$00 - sta C3PO - - rts - - -iec_rx_byte_jiffydos: - - // Hide sprites, store their previous status on stack - jsr jiffydos_hide_sprites - pha - - // Wait until device is ready to send - jsr iec_wait_for_clk_release - - // Prepare 'start sending' message - lda CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release - pha - - // Wait for appropriate moment - jsr jiffydos_wait_line - - // Ask device to start sending bits - pla - sta CIA2_PRA - - - // XXX retrieve byte - - - // Re-enable sprites - pla - lda VIC_SPENA - - rts - - -jiffydos_wait_line: - - lda VIC_SCROLY - and #$10 - beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines - - // To give the transfer routine as much time as possible, - // wait till a badline - - // XXX this is probably overkill, most likely it is enough to avoid 2 (3?) lines - // before badline - to be adjusted in the future -!: - sec - lda VIC_SCROLY - sbc VIC_RASTER - and #$07 // we want 8 lowest bits - bne !- - -jiffydos_wait_line_done: - rts - - -__jd_check2: - - -jiffydos_hide_sprites: - - lda VIC_SPENA - ldx #$00 - stx VIC_SPENA - - rts - - -.function SAME_PAGE_CHECK(label_1, label_2) -{ -#if PASS_SIZETEST - .return (label_1 - label_1 % 256) == (label_2 - label_2 % 256) -#else - .return true -#endif -} - -.if (!SAME_PAGE_CHECK(__jd_check1, __jd_check2)) -{ - // To meet the strict JiffyDOS timing, we need to make sure - // it does not span across multiple pages, as this would add - // 1 cycle to some jump instructions - maybe this wont cause - // problems, but better safe than sorry. - - .error "JiffyDOS code can't span across multiple pages" -} - - -#endif // CONFIG_IEC_JIFFYDOS + +// +// JiffyDOS protocol support for IEC +// + +// XXX finish this + + + +#if CONFIG_IEC_JIFFYDOS + + +// JiffyDOS timing regime is very strict - before transmitting anything +// we need to disable sprites and (if screen is not disabled) wait for +// appropriate moment, so that no badline interruption can happen + + +iec_tx_byte_jiffydos: + + // We need to preserve 3 lowest bits of CIA2_PRA - as they encode + // Use C3PO for this, as afterwards we have to set there 0 nevertheless + lda CIA2_PRA + and #%00000111 + sta C3PO + + // Hide sprites, store their previous status on stack + jsr jiffydos_hide_sprites + pha + + // Prepare nibbles to send + lda TBTCNT + and #$0F + tax + lda iec_jiffydos_bittable, X // low nibble has to be encoded + pha + lda TBTCNT + and #$F0 + pha + + // Wait till receiver is ready + jsr iec_wait_for_data_release + +__jd_check1: + + // Wait till it is safe to send data + jsr jiffydos_wait_line + + // Notify device that we are going to send byte by releasing everything + // Cycles: 3 + 4 = 7 + lda C3PO + sta CIA2_PRA + + // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 + pla // retrieve high nibble from stack + ora C3PO // restore VIC-II and RS-232 bits + sta CIA2_PRA // bits 4 and 5 on CLK/DATA + ror // move bits 6 and 7 to positions 4 and 5 + ror + and #%00110000 // clear everything but CLK/DATA + sta CIA2_PRA // bits 6 and 7 on CLK/DATA + + // Send low nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 + pla // retrieve low nibble from stack + ora C3PO // restore VIC-II and RS-232 bits + sta CIA2_PRA + ror + ror + and #%00110000 // clear everything but CLK/DATA + sta CIA2_PRA + + + + // XXX EOI signalled by early CLK (20us delay for non-CLK?) + + + // Re-enable sprites + pla + lda VIC_SPENA + + // Mark TX buffer as empty + lda #$00 + sta C3PO + + rts + + +iec_rx_byte_jiffydos: + + // Hide sprites, store their previous status on stack + jsr jiffydos_hide_sprites + pha + + // Wait until device is ready to send + jsr iec_wait_for_clk_release + + // Prepare 'start sending' message + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_DAT_OUT // release + pha + + // Wait for appropriate moment + jsr jiffydos_wait_line + + // Ask device to start sending bits + pla + sta CIA2_PRA + + + // XXX retrieve byte + + + // Re-enable sprites + pla + lda VIC_SPENA + + rts + + +jiffydos_wait_line: + + lda VIC_SCROLY + and #$10 + beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines + + // To give the transfer routine as much time as possible, + // wait till a badline + + // XXX this is probably overkill, most likely it is enough to avoid 2 (3?) lines + // before badline - to be adjusted in the future +!: + sec + lda VIC_SCROLY + sbc VIC_RASTER + and #$07 // we want 8 lowest bits + bne !- + +jiffydos_wait_line_done: + rts + + +__jd_check2: + + +jiffydos_hide_sprites: + + lda VIC_SPENA + ldx #$00 + stx VIC_SPENA + + rts + + +.function SAME_PAGE_CHECK(label_1, label_2) +{ +#if PASS_SIZETEST + .return (label_1 - label_1 % 256) == (label_2 - label_2 % 256) +#else + .return true +#endif +} + +.if (!SAME_PAGE_CHECK(__jd_check1, __jd_check2)) +{ + // To meet the strict JiffyDOS timing, we need to make sure + // it does not span across multiple pages, as this would add + // 1 cycle to some jump instructions - maybe this wont cause + // problems, but better safe than sorry. + + .error "JiffyDOS code can't span across multiple pages" +} + + +#endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec/iec_jiffydos_bittable.s b/c64/kernal/iec/iec_jiffydos_bittable.s new file mode 100644 index 00000000..0cc99ed9 --- /dev/null +++ b/c64/kernal/iec/iec_jiffydos_bittable.s @@ -0,0 +1,33 @@ + +// +// Helper table for encoding lower nibble for JiffyyDOS, +// values found by observing the actual transfer +// + +#if CONFIG_IEC_JIFFYDOS + + + // XXX consider calculating the values on-the-fly + +iec_jiffydos_bittable: + + .byte $00 + .byte $80 // $10 + $70 + .byte $20 + .byte $A0 // $30 + $70 + .byte $40 + .byte $C0 // $50 + $70 + .byte $60 + .byte $E0 // $70 + $70 + + .byte $10 // $80 - $70 + .byte $90 + .byte $30 // $A0 - $70 + .byte $B0 + .byte $50 // $C0 - $70 + .byte $D0 + .byte $70 // $E0 - $70 + .byte $F0 + + +#endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec/iec_rx_dispatch.s b/c64/kernal/iec/iec_rx_dispatch.s new file mode 100644 index 00000000..78a3690a --- /dev/null +++ b/c64/kernal/iec/iec_rx_dispatch.s @@ -0,0 +1,32 @@ + +// +// Arbitration code for normal/turbo transfer +// + + +#if CONFIG_IEC_JIFFYDOS + + +iec_rx_dispatch: + + lda IECPROTO +#if CONFIG_IEC_JIFFYDOS + cmp #$01 + beq iec_rx_dispatch_jiffydos +#endif // CONFIG_IEC_JIFFYDOS + + // FALLTROUGH + +iec_rx_dispatch_normal: + + plp + jmp iec_rx_byte + +#if CONFIG_IEC_JIFFYDOS +iec_rx_dispatch_jiffydos: + plp + jmp iec_rx_byte_jiffydos +#endif // CONFIG_IEC_JIFFYDOS + + +#endif // any turbo supported diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index 02e28f81..bed60be5 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -68,21 +68,21 @@ iec_tx_common_sendbit: cpx #$00 bne !+ // branch if not sending the last bit - ldy #$1B // 400us is nearly 410 cycles on NTSC - // loop iteration below is 15 cycles, + ldy #$25 // 400us is nearly 410 cycles on NTSC + // loop iteration below is 11 cycles, // and several cycles were already used iec_jiffydos_detect_loop: lda CIA2_PRA // 4 cycles bpl iec_jiffydos_detected // 2 cycles dey // 2 cycles - bne iec_jiffydos_detect_loop // 2 cycles + bne iec_jiffydos_detect_loop // 3 cycles if branch - lda #$00 // 2 cycles - beq iec_jiffydos_store_proto // 3 cycles, branch always + lda #$00 // normal protocol + skip_2_bytes_trash_nvz iec_jiffydos_detected: - - panic #$FF // WHOAAAA! He wants to speak jiffy, but I do not know this language yet! + + lda #$01 // JiffyDOS protocol iec_jiffydos_store_proto: sta IECPROTO diff --git a/c64/kernal/iec/iec_tx_dispatch.s b/c64/kernal/iec/iec_tx_dispatch.s new file mode 100644 index 00000000..4222e6a8 --- /dev/null +++ b/c64/kernal/iec/iec_tx_dispatch.s @@ -0,0 +1,33 @@ + +// +// Arbitration code for normal/turbo transfer +// + + +#if CONFIG_IEC_JIFFYDOS + + +iec_tx_dispatch: + + php // preserve C flag for EOI indication + lda IECPROTO +#if CONFIG_IEC_JIFFYDOS + cmp #$01 + beq iec_tx_dispatch_jiffydos +#endif // CONFIG_IEC_JIFFYDOS + + // FALLTROUGH + +iec_tx_dispatch_normal: + + plp + jmp iec_tx_byte + +#if CONFIG_IEC_JIFFYDOS +iec_tx_dispatch_jiffydos: + plp + jmp iec_tx_byte_jiffydos +#endif // CONFIG_IEC_JIFFYDOS + + +#endif // any turbo supported diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index df68986b..23f647b8 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -71,10 +71,18 @@ load_iec: // Get load address +#if CONFIG_IEC_JIFFYDOS + jsr iec_rx_dispatch +#else // no turbo supported jsr iec_rx_byte +#endif bcs load_iec_file_not_found sta EAL+0 +#if CONFIG_IEC_JIFFYDOS + jsr iec_rx_dispatch +#else // no turbo supported jsr iec_rx_byte +#endif bcs load_iec_file_not_found sta EAL+1 @@ -92,7 +100,11 @@ load_iec: iec_load_loop: // We are now ready to receive bytes +#if CONFIG_IEC_JIFFYDOS + jsr iec_rx_dispatch +#else // no turbo supported jsr iec_rx_byte +#endif bcs load_iec_error // Handle the byte (store in memory / verify) diff --git a/c64/kernal/iec/save_iec.s b/c64/kernal/iec/save_iec.s index 35f3b74f..e06d4a9e 100644 --- a/c64/kernal/iec/save_iec.s +++ b/c64/kernal/iec/save_iec.s @@ -1,102 +1,114 @@ - -// -// IEC part of the SAVE routine -// - - -#if CONFIG_IEC - - -save_iec_dev_not_found: - jmp lvs_device_not_found_error - - -save_iec: - - // Check file name - lda FNLEN - beq_far kernalerror_FILE_NAME_MISSING - - // Display SAVING - jsr lvs_display_saving - - // Call device to LISTEN - lda FA - jsr LISTEN - bcs save_iec_dev_not_found - - // Open channel 1 (reserved for file writing) - lda #$01 - jsr iec_cmd_open - bcs save_iec_dev_not_found - - // Send file name - jsr iec_send_file_name - bcs save_iec_dev_not_found - - // Call device to LISTEN once again - lda FA - jsr LISTEN - bcs save_iec_dev_not_found - - lda #$61 // open channel / data (p3) , required according to p13 - sta TBTCNT - jsr iec_tx_command - bcs save_iec_dev_not_found - - // Save start address - lda STAL+0 - sta TBTCNT - clc - jsr iec_tx_byte - - lda STAL+1 - sta TBTCNT - clc - jsr iec_tx_byte - - jsr lvs_setup_MEMUSS - ldy #$00 -iec_save_loop: - - // Retrieve byte to send -#if CONFIG_MEMORY_MODEL_60K - ldx # Date: Tue, 19 Nov 2019 22:33:38 +0100 Subject: [PATCH 062/105] started JiffyDOS byte reception, fixes for turbo dispatcher --- c64/aliases/,aliases_config.s | 10 ++-- c64/kernal/iec/f000.iec_jiffydos.s | 67 +++++++++++++++++++++++--- c64/kernal/iec/iec_jiffydos_bittable.s | 3 +- c64/kernal/iec/iec_rx_dispatch.s | 14 +----- c64/kernal/iec/iec_tx_byte.s | 1 - c64/kernal/iec/iec_tx_dispatch.s | 1 + 6 files changed, 70 insertions(+), 26 deletions(-) diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index 1ea8ba6f..4524efdf 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -304,18 +304,20 @@ .var features_str = "" #if CONFIG_TAPE_NORMAL - .eval features_str = ADD_FEATURE(features_str, "TAPE NORMAL") + .eval features_str = ADD_FEATURE(features_str, "TAPE LOAD NORMAL") #elif CONFIG_TAPE_TURBO - .eval features_str = ADD_FEATURE(features_str, "TAPE TURBO") + .eval features_str = ADD_FEATURE(features_str, "TAPE LOAD TURBO") #elif CONFIG_TAPE_NORMAL && CONFIG_TAPE_TURBO - .eval features_str = ADD_FEATURE(features_str, "TAPE NORMAL+TURBO") + .eval features_str = ADD_FEATURE(features_str, "TAPE LOAD NORMAL+TURBO") #endif + .eval feature_new_line = true + #if CONFIG_IEC #if !CONFIG_IEC_JIFFYDOS .eval features_str = ADD_FEATURE(features_str, "IEC") #else - .eval features_str = ADD_FEATURE(features_str, "IEC+JD") + .eval features_str = ADD_FEATURE(features_str, "IEC+JIFFY DEF") #endif #endif diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index c7528db4..bc238d4f 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -17,7 +17,17 @@ iec_tx_byte_jiffydos: - // We need to preserve 3 lowest bits of CIA2_PRA - as they encode + // Timing is critical, do not allow interrupts + sei + + // Preserve .X (.Y is not used by the routine) + phx_trash_a + + // If EOI requested (carryy flag set), mark this in IECPROTO as 0 + bcc !+ + dec IECPROTO // turns 1 into 0 +!: + // We need to preserve 3 lowest bits of CIA2_PRA, they contain important (but unrelated) data // Use C3PO for this, as afterwards we have to set there 0 nevertheless lda CIA2_PRA and #%00000111 @@ -68,21 +78,40 @@ __jd_check1: and #%00110000 // clear everything but CLK/DATA sta CIA2_PRA + // Signal EOI if needed XXX calculate cycles for quicklyy pulling CLK + lda C3PO + ldx IECPROTO + beq iec_tx_byte_jiffydos_wait_eoi + // FALLTROUGH - // XXX EOI signalled by early CLK (20us delay for non-CLK?) +iec_tx_byte_jiffydos_finalize: + ora #BIT_CIA2_PRA_CLK_OUT // pull CLK + sta CIA2_PRA // Re-enable sprites pla - lda VIC_SPENA + sta VIC_SPENA - // Mark TX buffer as empty - lda #$00 - sta C3PO + // Mark TX buffer as empty, restore proper IECPROTO value + ldx #$00 + stx C3PO + inx + sta IECPROTO + // Restore .X, interrupts, return + plx_trash_a + cli rts +iec_tx_byte_jiffydos_wait_eoi: + + jsr iec_wait20us // XXX is it enough? + lda C3PO + jmp iec_tx_byte_jiffydos_finalize + + iec_rx_byte_jiffydos: @@ -105,13 +134,35 @@ iec_rx_byte_jiffydos: pla sta CIA2_PRA + // Retrieve byte XXX count cycles, synchronize + lda CIA2_PRA // bits 0 and 1 + and #%11000000 + pha - // XXX retrieve byte + lda CIA2_PRA // bits 2 and 3 + and #%11000000 + pha + + lda CIA2_PRA // bits 4 and 5 + and #%11000000 + pha + + lda CIA2_PRA // bits 6 and 7 + and #%11000000 + pha + + // XXX check for EOI here + + // XXX decode byte instead of this - can we do it in real time? + pla // bits 6 and 7 + pla // bits 4 and 5 + pla // bits 2 and 3 + pla // bits 0 and 1 // Re-enable sprites pla - lda VIC_SPENA + sta VIC_SPENA rts diff --git a/c64/kernal/iec/iec_jiffydos_bittable.s b/c64/kernal/iec/iec_jiffydos_bittable.s index 0cc99ed9..3c4914a2 100644 --- a/c64/kernal/iec/iec_jiffydos_bittable.s +++ b/c64/kernal/iec/iec_jiffydos_bittable.s @@ -1,7 +1,8 @@ // // Helper table for encoding lower nibble for JiffyyDOS, -// values found by observing the actual transfer +// values found by observing the actual transfer using +// original ROMs // #if CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec/iec_rx_dispatch.s b/c64/kernal/iec/iec_rx_dispatch.s index 78a3690a..465ee4b5 100644 --- a/c64/kernal/iec/iec_rx_dispatch.s +++ b/c64/kernal/iec/iec_rx_dispatch.s @@ -10,23 +10,13 @@ iec_rx_dispatch: lda IECPROTO + #if CONFIG_IEC_JIFFYDOS cmp #$01 - beq iec_rx_dispatch_jiffydos + beq_far iec_rx_byte_jiffydos #endif // CONFIG_IEC_JIFFYDOS - // FALLTROUGH - -iec_rx_dispatch_normal: - - plp jmp iec_rx_byte -#if CONFIG_IEC_JIFFYDOS -iec_rx_dispatch_jiffydos: - plp - jmp iec_rx_byte_jiffydos -#endif // CONFIG_IEC_JIFFYDOS - #endif // any turbo supported diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index bed60be5..15b5d01c 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -81,7 +81,6 @@ iec_jiffydos_detect_loop: skip_2_bytes_trash_nvz iec_jiffydos_detected: - lda #$01 // JiffyDOS protocol iec_jiffydos_store_proto: diff --git a/c64/kernal/iec/iec_tx_dispatch.s b/c64/kernal/iec/iec_tx_dispatch.s index 4222e6a8..88898664 100644 --- a/c64/kernal/iec/iec_tx_dispatch.s +++ b/c64/kernal/iec/iec_tx_dispatch.s @@ -11,6 +11,7 @@ iec_tx_dispatch: php // preserve C flag for EOI indication lda IECPROTO + #if CONFIG_IEC_JIFFYDOS cmp #$01 beq iec_tx_dispatch_jiffydos From df1285e5f3c8c9df63f95ebde8e395cae056f8ab Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 20 Nov 2019 21:28:12 +0100 Subject: [PATCH 063/105] imported more UP9600 code --- .../{ckout_rs232.s => ckout_rs232_up2400.s} | 4 +- c64/kernal/rs232/ckout_rs232_up9600.s | 23 +++++++ c64/kernal/rs232/open_rs232.s | 9 ++- c64/kernal/rs232/up9600_disable.s | 44 +++++++++++++ c64/kernal/rs232/up9600_enable.s | 66 +++++++++++++++++++ c64/kernal/rs232/up9600_ihitab.s | 18 +++++ c64/kernal/rs232/up9600_ilotab.s | 18 +++++ 7 files changed, 177 insertions(+), 5 deletions(-) rename c64/kernal/rs232/{ckout_rs232.s => ckout_rs232_up2400.s} (72%) create mode 100644 c64/kernal/rs232/ckout_rs232_up9600.s create mode 100644 c64/kernal/rs232/up9600_disable.s create mode 100644 c64/kernal/rs232/up9600_enable.s create mode 100644 c64/kernal/rs232/up9600_ihitab.s create mode 100644 c64/kernal/rs232/up9600_ilotab.s diff --git a/c64/kernal/rs232/ckout_rs232.s b/c64/kernal/rs232/ckout_rs232_up2400.s similarity index 72% rename from c64/kernal/rs232/ckout_rs232.s rename to c64/kernal/rs232/ckout_rs232_up2400.s index 66d4b3e7..7cec81d6 100644 --- a/c64/kernal/rs232/ckout_rs232.s +++ b/c64/kernal/rs232/ckout_rs232_up2400.s @@ -4,11 +4,11 @@ // -#if HAS_RS232 +#if CONFIG_RS232_UP2400 ckout_rs232: STUB_IMPLEMENTATION() // XXX provide implementation for both UP2400 and UP9600 -#endif // HAS_RS232 +#endif // CONFIG_RS232_UP2400 diff --git a/c64/kernal/rs232/ckout_rs232_up9600.s b/c64/kernal/rs232/ckout_rs232_up9600.s new file mode 100644 index 00000000..e2877512 --- /dev/null +++ b/c64/kernal/rs232/ckout_rs232_up9600.s @@ -0,0 +1,23 @@ + +// +// RS-232 part of the CKOUT routine +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +ckout_rs232: + + // XXX adapt this + + lda #$02 + sta DFLTO + jsr ENABLE + clc + rts + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s index a052d9a5..b4f8fd1e 100644 --- a/c64/kernal/rs232/open_rs232.s +++ b/c64/kernal/rs232/open_rs232.s @@ -20,7 +20,8 @@ open_rs232: jsr rs232_count_channels bcs open_rs232_end - // Allocate buffer + // Allocate buffers - first RIBUF, afterwards ROBUF + // (checked addresses on original ROMs) lda MEMSIZK+0 sta ROBUF+0 @@ -28,11 +29,13 @@ open_rs232: dec MEMSIZK+1 lda MEMSIZK+1 - sta ROBUF+1 // XXX RIBUF or ROBUF? + sta RIBUF+1 dec MEMSIZK+1 lda MEMSIZK+1 - sta RIBUF+1 // XXX RIBUF or ROBUF? + sta ROBUF+1 + + // Initialize buffer indexes lda #$00 sta RIDBE diff --git a/c64/kernal/rs232/up9600_disable.s b/c64/kernal/rs232/up9600_disable.s new file mode 100644 index 00000000..80ec3cc4 --- /dev/null +++ b/c64/kernal/rs232/up9600_disable.s @@ -0,0 +1,44 @@ + +// +// Disable UP9600 interface +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_disable: // XXX adapt + + // XXX restore interrupt vectors and IRQ timer + + sei + lda CIA2_PRB // $DD01; DISABLE RTS + and #$FD + sta CIA2_PRB // $DD01 + lda #$7F + sta CIA2_ICR // $DD0D ; DISABLE ALL CIA INTERRUPTS + sta CIA1_ICR // $DC0D + lda #$41; QUICK (AND DIRTY) HACK TO SWITCH BACK + sta CIA1_TIMAHI // $DC05 ; TO THE DEFAULT CIA1 CONFIGURATION + lda #$81 + sta CIA1_ICR // $DC0D ; ENABLE TIMER1 (THIS IS DEFAULT) + lda #ORIGIRQ + sta IRQVECT+1 + lda #ORIGNMI + sta NMIVECT+1 + cli + pla + tay + pla + tax + pla + + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_enable.s b/c64/kernal/rs232/up9600_enable.s new file mode 100644 index 00000000..ff532cc9 --- /dev/null +++ b/c64/kernal/rs232/up9600_enable.s @@ -0,0 +1,66 @@ + +// +// Enable UP9600 interface +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_enable: // XXX adapt + + sei + // XXX set NEWIRQ as IRQ vector + // XXX set NMIDOBIT as NMI vector + + ldx TVSFLG; PAL OR NTSC VERSION PRINT + lda ILOTAB,X; (KEYSCAN INTERRUPT ONCE EVERY 1/64 SECOND) + sta CIA1_TIMBLO // $DC06 ; (SORRY THIS WILL BREAK CODE, THAT USES + lda IHITAB,X; THE TI$ - VARIABLE) + sta CIA1_TIMBHI // $DC07 ; START VALUE FOR TIMER B (OF CIA1) + txa + asl + eor #$33; ** TIME CONSTANT FOR SENDER ** + ldx #0; 51 OR 55 DEPENDING ON PAL/NTSC VERSION + sta CIA1_TIMALO // $DC04 ; START VALUE FOR TIMERA (OF CIA1) + stx CIA1_TIMAHI // $DC05 ; (TIME IS AROUND 1/(2*BAUDRATE) ) + asl; ** TIME CONSTANT FOR RECEIVER ** + ora #1; 103 OR 111 DEPENDING ON PAL/NTSC VERSION + sta CIA2_TIMBLO // $DD06 ; START VALUE FOR TIMERB (OF CIA2) + stx CIA2_TIMBHI // $DD07 ; (TIME IS AROUND 1/BAUDRATE ) + lda #$41; START TIMERA OF CIA1, SP1 USED AS OUTPUT + sta CIA1_CRA // $DC0E ; GENERATES THE SENDER'S BIT CLOCK + lda #1 + sta OUTSTAT + sta CIA1_ICR // $DC0D ; DISABLE TIMERA (CIA1) INTERRUPT + sta CIA1_CRB // $DC0F ; START TIMERB OF CIA1 (GENERATES KEYSCAN IRQ) + lda #$92; STOP TIMERB OF CIA2 (ENABLE SIGNAL AT PB7) + sta CIA2_CRB // $DD0F + lda #$98 + bit CIA2_ICR // $DD0D ; CLEAR PENDING NMIS + sta CIA2_ICR // $DD0D ; ENABLE NMI (SDR AND FLAG) (CIA2) + lda #$8A + sta CIA1_ICR // $DC0D ; ENABLE IRQ (TIMERB AND SDR) (CIA1) + lda #$FF + sta CIA2_PRB // $DD01; PB0-7 DEFAULT TO 1 + sta CIA1_SDR // $DC0C ; SP1 DEFAULTS TO 1 + sec + lda RIDBE + sbc RIDBS + cmp #200 + bcc ENABLE2;; DON'T ENABLE RTS IF REC-BUFFER IS FULL + lda #2;; ENABLE RTS + sta CIA2_DDRB // $DD03 ;; (THE RTS LINE IS THE ONLY OUTPUT) +ENABLE2 + cli + pla + tay + pla + tax + pla + rts + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_ihitab.s b/c64/kernal/rs232/up9600_ihitab.s new file mode 100644 index 00000000..05310e40 --- /dev/null +++ b/c64/kernal/rs232/up9600_ihitab.s @@ -0,0 +1,18 @@ + +// +// Timer values for PAL/NTSC - high bytes +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_ihitab: + + .byte $42 + .byte $40 + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_ilotab.s b/c64/kernal/rs232/up9600_ilotab.s new file mode 100644 index 00000000..bede02ea --- /dev/null +++ b/c64/kernal/rs232/up9600_ilotab.s @@ -0,0 +1,18 @@ + +// +// Timer values for PAL/NTSC - low bytes +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_ilotab: + + .byte $95 + .byte $25 + + +#endif // CONFIG_RS232_UP9600 From 6f010b8c56bbd8f6a1a3b4faf8e0977456411d0a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 22 Nov 2019 17:35:17 +0100 Subject: [PATCH 064/105] IRQ handler for UP9600 --- c64/aliases/,aliases_ram_lowmem.s | 2 +- .../interrupts/ea31.default_irq_handler.s | 15 +++- .../interrupts/fe47.default_nmi_handler.s | 3 +- c64/kernal/rs232/close_rs232.s | 1 + c64/kernal/rs232/open_rs232.s | 9 +++ c64/kernal/rs232/rs232_count_channels.s | 4 +- c64/kernal/rs232/up9600_enable.s | 69 ++++++++++++++++++- c64/kernal/rs232/up9600_irq.s | 40 +++++++++++ c64/kernal/rs232/up9600_nmi.s | 9 +-- 9 files changed, 138 insertions(+), 14 deletions(-) create mode 100644 c64/kernal/rs232/up9600_irq.s diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 71ba917c..e5e8e393 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -114,7 +114,7 @@ .label INBIT = $A7 // -- NOT IMPLEMENTED -- #if !CONFIG_LEGACY_SCNKEY .label BITCI = $A8 // -- NOT IMPLEMENTED -- - .label RINONE = $A9 // -- NOT IMPLEMENTED -- + .label RINONE = $A9 // -- WIP -- (UP9600 only) RS-232 check for start bit flag .label RIDDATA = $AA // -- NOT IMPLEMENTED -- .label RIPRTY = $AB // -- NOT IMPLEMENTED -- #endif diff --git a/c64/kernal/interrupts/ea31.default_irq_handler.s b/c64/kernal/interrupts/ea31.default_irq_handler.s index 472256b4..be964c9f 100644 --- a/c64/kernal/interrupts/ea31.default_irq_handler.s +++ b/c64/kernal/interrupts/ea31.default_irq_handler.s @@ -1,10 +1,22 @@ default_irq_handler: +#if CONFIG_RS232_UP9600 + + jsr rs232_count_channels + cpx #$00 + beq !+ + jsr up9600_irq +!: + +#endif // CONFIG_RS232_UP9600 + + jsr cursor_blink jsr JSCNKEY jsr JUDTIM // update jiffy clock + #if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO // Turn tape motor on/off depending on the button state @@ -25,7 +37,8 @@ default_irq_handler: default_irq_handler_end_tape: -#endif +#endif // CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + // Acknowledge CIA interrupt and return jmp clear_cia1_interrupt_flag_and_return_from_interrupt diff --git a/c64/kernal/interrupts/fe47.default_nmi_handler.s b/c64/kernal/interrupts/fe47.default_nmi_handler.s index 1fa8acc1..9f877bb5 100644 --- a/c64/kernal/interrupts/fe47.default_nmi_handler.s +++ b/c64/kernal/interrupts/fe47.default_nmi_handler.s @@ -17,9 +17,10 @@ default_nmi_handler: bne !+ jmp (ICART_WARM_START) !: - // According to C64 Wiki, if STOP key is pressed, the routine assumes warm start request + // XXX is it right? how to check that IRQ was caused by RESTORE? + jsr JSTOP bcs !+ jmp return_from_interrupt // no STOP pressed diff --git a/c64/kernal/rs232/close_rs232.s b/c64/kernal/rs232/close_rs232.s index 3362daaa..52d4bf84 100644 --- a/c64/kernal/rs232/close_rs232.s +++ b/c64/kernal/rs232/close_rs232.s @@ -18,6 +18,7 @@ close_rs232: // If more than one, skip deallocation (other channels still uses the buffer). jsr rs232_count_channels + cpx #$02 // set Carry if more than one is open bcs close_rs232_end // Deallocate buffer diff --git a/c64/kernal/rs232/open_rs232.s b/c64/kernal/rs232/open_rs232.s index b4f8fd1e..f4b1c0a0 100644 --- a/c64/kernal/rs232/open_rs232.s +++ b/c64/kernal/rs232/open_rs232.s @@ -18,6 +18,7 @@ open_rs232: // If more than one, skip allocation (already allocated). jsr rs232_count_channels + cpx #$02 // set Carry if more than one is open bcs open_rs232_end // Allocate buffers - first RIBUF, afterwards ROBUF @@ -43,6 +44,14 @@ open_rs232: sta RODBS sta RODBE + +#if CONFIG_RS232_UP9600 + + jmp up9600_enable + +#endif // CONFIG_RS232_UP9600 + + open_rs232_end: jmp open_done_success diff --git a/c64/kernal/rs232/rs232_count_channels.s b/c64/kernal/rs232/rs232_count_channels.s index e0169451..7e032781 100644 --- a/c64/kernal/rs232/rs232_count_channels.s +++ b/c64/kernal/rs232/rs232_count_channels.s @@ -1,7 +1,7 @@ // // Sets .X to number of open RS-232 channels -// Sets Carry if more than one is open +// #if HAS_RS232 @@ -20,8 +20,6 @@ rs232_count_channels: inx bpl !- // branch always - cpx #$02 - rts diff --git a/c64/kernal/rs232/up9600_enable.s b/c64/kernal/rs232/up9600_enable.s index ff532cc9..f282588c 100644 --- a/c64/kernal/rs232/up9600_enable.s +++ b/c64/kernal/rs232/up9600_enable.s @@ -1,6 +1,6 @@ // -// Enable UP9600 interface +// Enable UP9600 interface support // // Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations @@ -11,6 +11,63 @@ up9600_enable: // XXX adapt + sei + + + + lda IRQVECT + cmp #ORIGIRQ + bne INSTERR; IRQ-VECTOR ALREADY CHANGED + lda NMIVECT + cmp #ORIGNMI + bne INSTERR; NMI-VECTOR ALREADY CHANGED + ldy #0 + sty RODBE + sty RODBS + sty RIDBE + sty RIDBS + ; PROBE FOR RS232 INTERFACE + cli + lda #$7F + sta CIA2_ICR // $DD0D ; DISABLE ALL NMIS + lda #$80 + sta CIA2_DDRB // $DD03 ; PB7 USED AS OUTPUT + sta $DD0E; STOP TIMERA + sta CIA2_CRB // $DD0F ; STOP TIMERB + bit CIA2_ICR // $DD0D ; CLEAR PENDING INTERRUPTS + ldx #8 +INSTALL2 + stx CIA2_PRB // $DD01; TOGGLE TXD + sta CIA2_PRB // $DD01; AND LOOK IF IT TRIGGERS AN + dex; SHIFT-REGISTER INTERRUPT + bne INSTALL2 + lda CIA2_ICR // $DD0D ; CHECK FOR BIT3 (SDR-FLAG) + and #8 + beq INSTERR; NO INTERFACE DETECTED + ; GENERATE LOOKUP TABLE + ldx #0 +INSTALL3 + stx OUTSTAT; OUTSTAT USED AS TEMPORARY VARIABLE + ldy #8 +INSTALL4 + asl OUTSTAT + ror + dey + bne INSTALL4 + sta REVTAB,X + inx + bpl INSTALL3 + + + + + sei // XXX set NEWIRQ as IRQ vector // XXX set NMIDOBIT as NMI vector @@ -63,4 +120,14 @@ ENABLE2 rts + + +INSTERR + cli + sec + rts + + + + #endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_irq.s b/c64/kernal/rs232/up9600_irq.s new file mode 100644 index 00000000..a5a99e0e --- /dev/null +++ b/c64/kernal/rs232/up9600_irq.s @@ -0,0 +1,40 @@ + +// +// RS-232 IRQ handler part +// + +// Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations + + +#if CONFIG_RS232_UP9600 + + +up9600_irq: + + lda CIA1_ICR // $DC0D + + lsr + lsr // move bit 1 (timer B flag) into Carry + and #$02 // test SDR (shift register) status + + beq up9600_irq_continue + + ldx RINONE + beq !+ // skip if not waiting for empty SDR + dex + stx RINONE +!: + bcc up9600_irq_end + +up9600_irq_continue: + + rts + +up9600_irq_end: + + pla + pla + jmp return_from_interrupt + + +#endif // CONFIG_RS232_UP9600 diff --git a/c64/kernal/rs232/up9600_nmi.s b/c64/kernal/rs232/up9600_nmi.s index 853ff100..fea3652d 100644 --- a/c64/kernal/rs232/up9600_nmi.s +++ b/c64/kernal/rs232/up9600_nmi.s @@ -6,19 +6,14 @@ // Based on UP9600 code by Daniel Dallman with Bo Zimmerman adaptations -// XXX integrate with NMI handler - - #if CONFIG_RS232_UP9600 up9600_nmi: - // XXX integrate this + // XXX integrate with NMI handler - -NMIDOBIT pha - bit CIA2_ICR // $DD0D; CHECK BIT 7 (STARTBIT PRINT) + bit CIA2_ICR // $DD0D; check if CIA caused the interrupt bpl NMIDOBI2; NO STARTBIT RECEIVED, THEN SKIP lda #$13 sta CIA2_CRB // $DD0F; START TIMER B (FORCED RELOAD, SIGNAL AT PB7) From 937d1525404030ebda225eae79cc600edb0b6eab Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 26 Nov 2019 19:28:10 +0100 Subject: [PATCH 065/105] fixed flow desynchronization after JiffyDOS detection --- c64/aliases/,aliases_config.s | 2 +- c64/kernal/iec/f000.iec_jiffydos.s | 2 +- c64/kernal/iec/iec_tx_byte.s | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index 4524efdf..619223aa 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -317,7 +317,7 @@ #if !CONFIG_IEC_JIFFYDOS .eval features_str = ADD_FEATURE(features_str, "IEC") #else - .eval features_str = ADD_FEATURE(features_str, "IEC+JIFFY DEF") + .eval features_str = ADD_FEATURE(features_str, "IEC+JIFFY DEV") #endif #endif diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index bc238d4f..aeab1fd3 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -78,7 +78,7 @@ __jd_check1: and #%00110000 // clear everything but CLK/DATA sta CIA2_PRA - // Signal EOI if needed XXX calculate cycles for quicklyy pulling CLK + // Signal EOI if needed XXX calculate cycles for quickly pulling CLK lda C3PO ldx IECPROTO beq iec_tx_byte_jiffydos_wait_eoi diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index 15b5d01c..40259cbb 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -78,9 +78,10 @@ iec_jiffydos_detect_loop: bne iec_jiffydos_detect_loop // 3 cycles if branch lda #$00 // normal protocol - skip_2_bytes_trash_nvz + beq iec_jiffydos_store_proto // branch always iec_jiffydos_detected: + jsr iec_wait_for_data_release // guessed from VICE logs lda #$01 // JiffyDOS protocol iec_jiffydos_store_proto: @@ -118,7 +119,7 @@ iec_tx_common_bit_is_sent: cli - // Give device time to tell if they are busy by pulling DATA + // Give devices time to tell if they are busy by pulling DATA // They should do it within 1ms ldx #$FF !: From 17de034a1a4ad40deb56b00647daf41bfcda7cc6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 26 Nov 2019 19:55:47 +0100 Subject: [PATCH 066/105] fix for filename sending with disk turbo --- c64/kernal/iec/iec_send_file_name.s | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/c64/kernal/iec/iec_send_file_name.s b/c64/kernal/iec/iec_send_file_name.s index b0adc685..de266cfc 100644 --- a/c64/kernal/iec/iec_send_file_name.s +++ b/c64/kernal/iec/iec_send_file_name.s @@ -30,7 +30,11 @@ iec_send_file_name_loop: !: // Transmit one character sta TBTCNT +#if CONFIG_IEC_JIFFYDOS + jsr iec_tx_dispatch +#else // no turbo supported jsr iec_tx_byte +#endif jmp iec_send_file_name_loop iec_send_file_name_done: From 6bfaadff7837c8f0a8c79c7687e0e92fa44a42ec Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 26 Nov 2019 20:56:09 +0100 Subject: [PATCH 067/105] JiffyDOS byte tx fixes --- c64/kernal/iec/f000.iec_jiffydos.s | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index aeab1fd3..d33d91d5 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -23,7 +23,7 @@ iec_tx_byte_jiffydos: // Preserve .X (.Y is not used by the routine) phx_trash_a - // If EOI requested (carryy flag set), mark this in IECPROTO as 0 + // If EOI requested (carry flag set), mark this in IECPROTO as 0 bcc !+ dec IECPROTO // turns 1 into 0 !: @@ -47,6 +47,9 @@ iec_tx_byte_jiffydos: and #$F0 pha + // Prepare value for device notification + ldx C3PO + // Wait till receiver is ready jsr iec_wait_for_data_release @@ -56,17 +59,16 @@ __jd_check1: jsr jiffydos_wait_line // Notify device that we are going to send byte by releasing everything - // Cycles: 3 + 4 = 7 - lda C3PO - sta CIA2_PRA + stx CIA2_PRA // cycles: 4 - // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 + // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 3 + 4 = 24 pla // retrieve high nibble from stack ora C3PO // restore VIC-II and RS-232 bits sta CIA2_PRA // bits 4 and 5 on CLK/DATA ror // move bits 6 and 7 to positions 4 and 5 ror and #%00110000 // clear everything but CLK/DATA + ora C3PO sta CIA2_PRA // bits 6 and 7 on CLK/DATA // Send low nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 @@ -78,7 +80,7 @@ __jd_check1: and #%00110000 // clear everything but CLK/DATA sta CIA2_PRA - // Signal EOI if needed XXX calculate cycles for quickly pulling CLK + // Signal EOI if needed; cycles till no EOI: 3 + 3 + 2 + 2 + 4 = 14 lda C3PO ldx IECPROTO beq iec_tx_byte_jiffydos_wait_eoi @@ -176,8 +178,7 @@ jiffydos_wait_line: // To give the transfer routine as much time as possible, // wait till a badline - // XXX this is probably overkill, most likely it is enough to avoid 2 (3?) lines - // before badline - to be adjusted in the future + // XXX probably overkill, most likely it is enough to avoid 2 lines before badline !: sec lda VIC_SCROLY From 34ba758c4eb3cd0cbe11b9e85669779ad1158dbc Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 26 Nov 2019 21:18:02 +0100 Subject: [PATCH 068/105] fixed JiffyDOS EOI signalling --- c64/kernal/iec/f000.iec_jiffydos.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/f000.iec_jiffydos.s index d33d91d5..8691efa9 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/f000.iec_jiffydos.s @@ -109,7 +109,7 @@ iec_tx_byte_jiffydos_finalize: iec_tx_byte_jiffydos_wait_eoi: - jsr iec_wait20us // XXX is it enough? + jsr iec_wait60us lda C3PO jmp iec_tx_byte_jiffydos_finalize From 63ac74f09fd8aba9e490b5dd7481dd3dbf646c2a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 27 Nov 2019 18:07:53 +0100 Subject: [PATCH 069/105] initial input byte decoding for JiffyDOS --- c64/kernal/iec/f000.interop | 1 - .../{f000.iec_jiffydos.s => iec_jiffydos.s} | 66 ++++++++++++------- c64/kernal/iec/iec_jiffydos_bittable.s | 9 ++- 3 files changed, 48 insertions(+), 28 deletions(-) delete mode 100644 c64/kernal/iec/f000.interop rename c64/kernal/iec/{f000.iec_jiffydos.s => iec_jiffydos.s} (79%) diff --git a/c64/kernal/iec/f000.interop b/c64/kernal/iec/f000.interop deleted file mode 100644 index 9a37ffff..00000000 --- a/c64/kernal/iec/f000.interop +++ /dev/null @@ -1 +0,0 @@ -This is not really for interoperabilityy - we need a fixed memory address to be sure no branches will cross page border (timing is critical) diff --git a/c64/kernal/iec/f000.iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s similarity index 79% rename from c64/kernal/iec/f000.iec_jiffydos.s rename to c64/kernal/iec/iec_jiffydos.s index 8691efa9..408e22ac 100644 --- a/c64/kernal/iec/f000.iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -27,14 +27,15 @@ iec_tx_byte_jiffydos: bcc !+ dec IECPROTO // turns 1 into 0 !: - // We need to preserve 3 lowest bits of CIA2_PRA, they contain important (but unrelated) data + // We need to preserve 3 lowest bits of CIA2_PRA, they contain important + // data - fortunately, the bits are never changed by external devices // Use C3PO for this, as afterwards we have to set there 0 nevertheless lda CIA2_PRA and #%00000111 sta C3PO // Hide sprites, store their previous status on stack - jsr jiffydos_hide_sprites + jsr jiffydos_hide_sprites // XXX include C3PO initialization pha // Prepare nibbles to send @@ -75,8 +76,8 @@ __jd_check1: pla // retrieve low nibble from stack ora C3PO // restore VIC-II and RS-232 bits sta CIA2_PRA - ror - ror + lsr + lsr and #%00110000 // clear everything but CLK/DATA sta CIA2_PRA @@ -92,6 +93,8 @@ iec_tx_byte_jiffydos_finalize: ora #BIT_CIA2_PRA_CLK_OUT // pull CLK sta CIA2_PRA + // XXX part below should be common for TX and RX + // Re-enable sprites pla sta VIC_SPENA @@ -117,6 +120,19 @@ iec_tx_byte_jiffydos_wait_eoi: iec_rx_byte_jiffydos: + // Timing is critical, do not allow interrupts + sei + + // Preserve .X (.Y is not used by the routine) + phx_trash_a + + // We need to preserve 3 lowest bits of CIA2_PRA, they contain important + // data - fortunately, the bits are never changed by external devices + // Use C3PO for this, as afterwards we have to set there 0 nevertheless + lda CIA2_PRA + and #%00000111 + sta C3PO + // Hide sprites, store their previous status on stack jsr jiffydos_hide_sprites pha @@ -127,45 +143,45 @@ iec_rx_byte_jiffydos: // Prepare 'start sending' message lda CIA2_PRA and #$FF - BIT_CIA2_PRA_DAT_OUT // release - pha + tax // Wait for appropriate moment jsr jiffydos_wait_line // Ask device to start sending bits - pla - sta CIA2_PRA + stx CIA2_PRA // cycles: 4 // Retrieve byte XXX count cycles, synchronize - lda CIA2_PRA // bits 0 and 1 - and #%11000000 - pha - lda CIA2_PRA // bits 2 and 3 - and #%11000000 - pha + lda CIA2_PRA // bits 0 and 1 on CLK/DATA + lsr + lsr - lda CIA2_PRA // bits 4 and 5 - and #%11000000 - pha + ora CIA2_PRA // bits 2 and 3 on CLK/DATA + lsr + lsr - lda CIA2_PRA // bits 6 and 7 - and #%11000000 - pha + eor C3PO + eor CIA2_PRA // bits 4 and 5 on CLK/DATA + lsr + lsr - // XXX check for EOI here + eor C3PO + eor CIA2_PRA // bits 6 and 7 on CLK/DATA + tax + + // XXX CLK and DATA active = EOI + lda CIA2_PRA - // XXX decode byte instead of this - can we do it in real time? - pla // bits 6 and 7 - pla // bits 4 and 5 - pla // bits 2 and 3 - pla // bits 0 and 1 // Re-enable sprites pla sta VIC_SPENA + // Restore .X, interrupts, return + plx_trash_a + cli rts diff --git a/c64/kernal/iec/iec_jiffydos_bittable.s b/c64/kernal/iec/iec_jiffydos_bittable.s index 3c4914a2..80376c25 100644 --- a/c64/kernal/iec/iec_jiffydos_bittable.s +++ b/c64/kernal/iec/iec_jiffydos_bittable.s @@ -5,11 +5,16 @@ // original ROMs // +// Similar tables are probably used by nearly all the disk turbo loaders, +// either on the C64 or drive side, soometimes generated in RAM on the fly; +// example disk turbo presented below has a veryy similar table - but the +// values are in reversed order: +// - https://www.pagetable.com/?p=568 + + #if CONFIG_IEC_JIFFYDOS - // XXX consider calculating the values on-the-fly - iec_jiffydos_bittable: .byte $00 From 3d9e6a4ee25c547ea751c8905aee9f8511e3807d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 27 Nov 2019 18:27:17 +0100 Subject: [PATCH 070/105] improved JiffyyDOS scanline syynchronization --- c64/kernal/iec/iec_jiffydos.s | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s index 408e22ac..e7154d62 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -191,16 +191,14 @@ jiffydos_wait_line: and #$10 beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines - // To give the transfer routine as much time as possible, - // wait till a badline - - // XXX probably overkill, most likely it is enough to avoid 2 lines before badline + // Avoid 2 lines before the badline, otherwise VIC will ruin the synchronization !: sec - lda VIC_SCROLY - sbc VIC_RASTER + lda VIC_RASTER + sbc VIC_SCROLY and #$07 // we want 8 lowest bits - bne !- + cmp #$06 + bcs !- jiffydos_wait_line_done: rts From 95460f34da9f3c8d761076fb20e372da86adaba4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 27 Nov 2019 19:08:04 +0100 Subject: [PATCH 071/105] further improved JiffyDOS badline avoidance --- c64/kernal/iec/iec_jiffydos.s | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s index e7154d62..ac2ca272 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -192,15 +192,18 @@ jiffydos_wait_line: beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines // Avoid 2 lines before the badline, otherwise VIC will ruin the synchronization -!: - sec lda VIC_RASTER + cmp #$2E + bcc jiffydos_wait_line_done // we are safe, border - lot of time till badline +!: + lda VIC_RASTER // carry is definitely set here! sbc VIC_SCROLY and #$07 // we want 8 lowest bits cmp #$06 bcs !- jiffydos_wait_line_done: + rts From cf8b8f3f887feb5b10912534c9f229bd47cac9a6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 27 Nov 2019 20:28:35 +0100 Subject: [PATCH 072/105] small IEC fixes --- c64/kernal/iec/iec_jiffydos.s | 8 ++++---- c64/kernal/iec/iec_send_file_name.s | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s index ac2ca272..296357a7 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -66,8 +66,8 @@ __jd_check1: pla // retrieve high nibble from stack ora C3PO // restore VIC-II and RS-232 bits sta CIA2_PRA // bits 4 and 5 on CLK/DATA - ror // move bits 6 and 7 to positions 4 and 5 - ror + lsr // move bits 6 and 7 to positions 4 and 5 + lsr and #%00110000 // clear everything but CLK/DATA ora C3PO sta CIA2_PRA // bits 6 and 7 on CLK/DATA @@ -112,7 +112,7 @@ iec_tx_byte_jiffydos_finalize: iec_tx_byte_jiffydos_wait_eoi: - jsr iec_wait60us + jsr iec_wait20us // XXX is it enough? wait60us damages .Y, so it cannot be used here lda C3PO jmp iec_tx_byte_jiffydos_finalize @@ -196,7 +196,7 @@ jiffydos_wait_line: cmp #$2E bcc jiffydos_wait_line_done // we are safe, border - lot of time till badline !: - lda VIC_RASTER // carry is definitely set here! + lda VIC_RASTER // carry+ is definitely set here! sbc VIC_SCROLY and #$07 // we want 8 lowest bits cmp #$06 diff --git a/c64/kernal/iec/iec_send_file_name.s b/c64/kernal/iec/iec_send_file_name.s index de266cfc..7530f7a0 100644 --- a/c64/kernal/iec/iec_send_file_name.s +++ b/c64/kernal/iec/iec_send_file_name.s @@ -38,8 +38,7 @@ iec_send_file_name_loop: jmp iec_send_file_name_loop iec_send_file_name_done: - jsr UNLSN - rts + jmp UNLSN #endif // CONFIG_IEC From e29bf33a83ed299de811ab958d957205a82c838a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 28 Nov 2019 18:01:08 +0100 Subject: [PATCH 073/105] various JiffyDOS fixes --- c64/kernal/iec/iec_jiffydos.s | 98 +++++++++++------------------------ 1 file changed, 30 insertions(+), 68 deletions(-) diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s index 296357a7..257d35d7 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -20,22 +20,16 @@ iec_tx_byte_jiffydos: // Timing is critical, do not allow interrupts sei - // Preserve .X (.Y is not used by the routine) - phx_trash_a - // If EOI requested (carry flag set), mark this in IECPROTO as 0 bcc !+ dec IECPROTO // turns 1 into 0 !: - // We need to preserve 3 lowest bits of CIA2_PRA, they contain important - // data - fortunately, the bits are never changed by external devices - // Use C3PO for this, as afterwards we have to set there 0 nevertheless - lda CIA2_PRA - and #%00000111 - sta C3PO + // Store .X and .Y on the stack - preserve them + phx_trash_a + phy_trash_a - // Hide sprites, store their previous status on stack - jsr jiffydos_hide_sprites // XXX include C3PO initialization + // Store previous sprite status on stack + jsr jiffydos_prepare_for_transfer pha // Prepare nibbles to send @@ -54,8 +48,6 @@ iec_tx_byte_jiffydos: // Wait till receiver is ready jsr iec_wait_for_data_release -__jd_check1: - // Wait till it is safe to send data jsr jiffydos_wait_line @@ -93,26 +85,11 @@ iec_tx_byte_jiffydos_finalize: ora #BIT_CIA2_PRA_CLK_OUT // pull CLK sta CIA2_PRA - // XXX part below should be common for TX and RX - - // Re-enable sprites - pla - sta VIC_SPENA - - // Mark TX buffer as empty, restore proper IECPROTO value - ldx #$00 - stx C3PO - inx - sta IECPROTO - - // Restore .X, interrupts, return - plx_trash_a - cli - rts + bne jiffydos_return_success // branch always iec_tx_byte_jiffydos_wait_eoi: - jsr iec_wait20us // XXX is it enough? wait60us damages .Y, so it cannot be used here + jsr iec_wait20us // XXX is it enough? lda C3PO jmp iec_tx_byte_jiffydos_finalize @@ -123,18 +100,12 @@ iec_rx_byte_jiffydos: // Timing is critical, do not allow interrupts sei - // Preserve .X (.Y is not used by the routine) + // Store .X and .Y on the stack - preserve them phx_trash_a + phy_trash_a - // We need to preserve 3 lowest bits of CIA2_PRA, they contain important - // data - fortunately, the bits are never changed by external devices - // Use C3PO for this, as afterwards we have to set there 0 nevertheless - lda CIA2_PRA - and #%00000111 - sta C3PO - - // Hide sprites, store their previous status on stack - jsr jiffydos_hide_sprites + // Store previous sprite status on stack + jsr jiffydos_prepare_for_transfer pha // Wait until device is ready to send @@ -174,15 +145,21 @@ iec_rx_byte_jiffydos: lda CIA2_PRA + // FALLTROUGH - // Re-enable sprites +jiffydos_return_success: + + // Restore proper IECPROTO value + lda #$01 + sta IECPROTO + + // Re-enable sprites and interrupts pla sta VIC_SPENA - - // Restore .X, interrupts, return - plx_trash_a cli - rts + + // Return success + jmp iec_return_success jiffydos_wait_line: @@ -207,11 +184,16 @@ jiffydos_wait_line_done: rts -__jd_check2: +jiffydos_prepare_for_transfer: + // We need to preserve 3 lowest bits of CIA2_PRA, they contain important + // data - fortunately, the bits are never changed by external devices + // Use C3PO for this, as afterwards we have to set there 0 nevertheless + lda CIA2_PRA + and #%00000111 + sta C3PO -jiffydos_hide_sprites: - + // Hide sprites lda VIC_SPENA ldx #$00 stx VIC_SPENA @@ -219,24 +201,4 @@ jiffydos_hide_sprites: rts -.function SAME_PAGE_CHECK(label_1, label_2) -{ -#if PASS_SIZETEST - .return (label_1 - label_1 % 256) == (label_2 - label_2 % 256) -#else - .return true -#endif -} - -.if (!SAME_PAGE_CHECK(__jd_check1, __jd_check2)) -{ - // To meet the strict JiffyDOS timing, we need to make sure - // it does not span across multiple pages, as this would add - // 1 cycle to some jump instructions - maybe this wont cause - // problems, but better safe than sorry. - - .error "JiffyDOS code can't span across multiple pages" -} - - #endif // CONFIG_IEC_JIFFYDOS From 34d12e26ac563f57f80d21d1d244aa962dc0db5b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 28 Nov 2019 20:12:09 +0100 Subject: [PATCH 074/105] started JiffyDOS byte fetch synchronization --- c64/aliases/,aliases_config.s | 4 ++-- c64/kernal/iec/iec_jiffydos.s | 18 ++++++++++++++++-- c64/kernal/iec/talk.s | 10 ---------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index 619223aa..e40cbefb 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -308,7 +308,7 @@ #elif CONFIG_TAPE_TURBO .eval features_str = ADD_FEATURE(features_str, "TAPE LOAD TURBO") #elif CONFIG_TAPE_NORMAL && CONFIG_TAPE_TURBO - .eval features_str = ADD_FEATURE(features_str, "TAPE LOAD NORMAL+TURBO") + .eval features_str = ADD_FEATURE(features_str, "TAPE LOAD NORMAL TURBO") #endif .eval feature_new_line = true @@ -317,7 +317,7 @@ #if !CONFIG_IEC_JIFFYDOS .eval features_str = ADD_FEATURE(features_str, "IEC") #else - .eval features_str = ADD_FEATURE(features_str, "IEC+JIFFY DEV") + .eval features_str = ADD_FEATURE(features_str, "IEC JIFFY-DEV") #endif #endif diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s index 257d35d7..33331fad 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -122,29 +122,43 @@ iec_rx_byte_jiffydos: // Ask device to start sending bits stx CIA2_PRA // cycles: 4 - // Retrieve byte XXX count cycles, synchronize + // XXX we have to wait 20 cycles??? seriously??? what the hell shall we do here??? + pla // 4 cycles + pha // 3 cycles + pla // 4 cycles + pha // 3 cycles + nop // 2 cycles + nop // 2 cycles + nop // 2 cycles + // Get bits, cycles: 4 + 2 + 2 = 8 lda CIA2_PRA // bits 0 and 1 on CLK/DATA lsr lsr + // Wait for the drive, cycles: 2 + nop + + // Get bits, cycles: 4 + 2 + 2 = 8 ora CIA2_PRA // bits 2 and 3 on CLK/DATA lsr lsr + // Get bits, cycles: 3 + 4 + 2 + 2 = 11 eor C3PO eor CIA2_PRA // bits 4 and 5 on CLK/DATA lsr lsr + // Get bits, cycles: 3 + 4 = 7 eor C3PO eor CIA2_PRA // bits 6 and 7 on CLK/DATA + tax // XXX CLK and DATA active = EOI lda CIA2_PRA - // FALLTROUGH jiffydos_return_success: diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index ccf6d405..52b689c3 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -26,16 +26,6 @@ TALK: // Encode and execute the command ora #$40 -#if CONFIG_IEC_JIFFYDOS - - // XXX temporary, until receiving is implemented too - sta TBTCNT - lda #$00 // standard protocol - sta IECPROTO - jmp iec_tx_command - -#endif // CONFIG_IEC_JIFFYDOS - common_talk_listen: // common part of TALK and LISTEN sta TBTCNT From 36d803505e8ab2cd39cfa9e4fcf134e503cab6c5 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 28 Nov 2019 22:01:22 +0100 Subject: [PATCH 075/105] more work on JiffyDOS byte reception --- c64/kernal/iec/iec_jiffydos.s | 44 +++++++++++++++++++++++++---------- c64/kernal/iec/iec_rx_byte.s | 11 +++++---- c64/kernal/iec/talk.s | 2 ++ 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s index 33331fad..e19795f8 100644 --- a/c64/kernal/iec/iec_jiffydos.s +++ b/c64/kernal/iec/iec_jiffydos.s @@ -3,7 +3,8 @@ // JiffyDOS protocol support for IEC // -// XXX finish this +// XXX make it work +// XXX split into multiple files @@ -85,7 +86,18 @@ iec_tx_byte_jiffydos_finalize: ora #BIT_CIA2_PRA_CLK_OUT // pull CLK sta CIA2_PRA - bne jiffydos_return_success // branch always + // Restore proper IECPROTO value + lda #$01 + sta IECPROTO + + // Re-enable sprites and interrupts + pla + sta VIC_SPENA + cli + + // Return success + jmp iec_return_success + iec_tx_byte_jiffydos_wait_eoi: @@ -154,26 +166,33 @@ iec_rx_byte_jiffydos: eor C3PO eor CIA2_PRA // bits 6 and 7 on CLK/DATA + // Preserve read byte + sta TBTCNT // $A4 is a byte buffer according to http://sta.c64.org/cbm64mem.html + + // Retrieve status bits + lda CIA2_PRA tax - // XXX CLK and DATA active = EOI - lda CIA2_PRA - - // FALLTROUGH - -jiffydos_return_success: + // Pull DATA at the end + ora #BIT_CIA2_PRA_DAT_OUT + sta CIA2_PRA + // Check for EOI + txa + bmi !+ + jsr kernalstatus_EOI +!: // Restore proper IECPROTO value lda #$01 sta IECPROTO - // Re-enable sprites and interrupts + // Re-enable sprites pla sta VIC_SPENA - cli - // Return success - jmp iec_return_success + // End byte reception + jmp iec_rx_end + jiffydos_wait_line: @@ -198,6 +217,7 @@ jiffydos_wait_line_done: rts + jiffydos_prepare_for_transfer: // We need to preserve 3 lowest bits of CIA2_PRA, they contain important diff --git a/c64/kernal/iec/iec_rx_byte.s b/c64/kernal/iec/iec_rx_byte.s index cd86f951..36f00f78 100644 --- a/c64/kernal/iec/iec_rx_byte.s +++ b/c64/kernal/iec/iec_rx_byte.s @@ -137,10 +137,13 @@ iec_rx_clk_wait2: // Restore registers sta TBTCNT // $A4 is a byte buffer according to http://sta.c64.org/cbm64mem.html - pla - tay - pla - tax + + // FALLTROUGH + +iec_rx_end: + + ply_trash_a + plx_trash_a lda TBTCNT clc diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index 52b689c3..76b83ff0 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -26,6 +26,8 @@ TALK: // Encode and execute the command ora #$40 + // FALLTROUGH + common_talk_listen: // common part of TALK and LISTEN sta TBTCNT From 459672812194c8722312da8a7e997a75663b7946 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 28 Nov 2019 22:19:37 +0100 Subject: [PATCH 076/105] separate directory for fast IEC routines --- Makefile | 1 + c64/kernal/iec/iec_jiffydos.s | 238 ------------------ c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 97 +++++++ .../{iec => iec_fast}/iec_rx_dispatch.s | 0 c64/kernal/iec_fast/iec_tx_byte_jiffydos.s | 102 ++++++++ .../{iec => iec_fast}/iec_tx_dispatch.s | 0 .../jiffydos_bittable.s} | 2 +- c64/kernal/iec_fast/jiffydos_prepare.s | 29 +++ c64/kernal/iec_fast/jiffydos_wait_line.s | 33 +++ 9 files changed, 263 insertions(+), 239 deletions(-) delete mode 100644 c64/kernal/iec/iec_jiffydos.s create mode 100644 c64/kernal/iec_fast/iec_rx_byte_jiffydos.s rename c64/kernal/{iec => iec_fast}/iec_rx_dispatch.s (100%) create mode 100644 c64/kernal/iec_fast/iec_tx_byte_jiffydos.s rename c64/kernal/{iec => iec_fast}/iec_tx_dispatch.s (100%) rename c64/kernal/{iec/iec_jiffydos_bittable.s => iec_fast/jiffydos_bittable.s} (97%) create mode 100644 c64/kernal/iec_fast/jiffydos_prepare.s create mode 100644 c64/kernal/iec_fast/jiffydos_wait_line.s diff --git a/Makefile b/Makefile index 02266937..338def52 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ c64/kernal/,stubs \ c64/kernal/assets \ c64/kernal/iec \ + c64/kernal/iec_fast \ c64/kernal/init \ c64/kernal/interrupts \ c64/kernal/iostack \ diff --git a/c64/kernal/iec/iec_jiffydos.s b/c64/kernal/iec/iec_jiffydos.s deleted file mode 100644 index e19795f8..00000000 --- a/c64/kernal/iec/iec_jiffydos.s +++ /dev/null @@ -1,238 +0,0 @@ - -// -// JiffyDOS protocol support for IEC -// - -// XXX make it work -// XXX split into multiple files - - - -#if CONFIG_IEC_JIFFYDOS - - -// JiffyDOS timing regime is very strict - before transmitting anything -// we need to disable sprites and (if screen is not disabled) wait for -// appropriate moment, so that no badline interruption can happen - - -iec_tx_byte_jiffydos: - - // Timing is critical, do not allow interrupts - sei - - // If EOI requested (carry flag set), mark this in IECPROTO as 0 - bcc !+ - dec IECPROTO // turns 1 into 0 -!: - // Store .X and .Y on the stack - preserve them - phx_trash_a - phy_trash_a - - // Store previous sprite status on stack - jsr jiffydos_prepare_for_transfer - pha - - // Prepare nibbles to send - lda TBTCNT - and #$0F - tax - lda iec_jiffydos_bittable, X // low nibble has to be encoded - pha - lda TBTCNT - and #$F0 - pha - - // Prepare value for device notification - ldx C3PO - - // Wait till receiver is ready - jsr iec_wait_for_data_release - - // Wait till it is safe to send data - jsr jiffydos_wait_line - - // Notify device that we are going to send byte by releasing everything - stx CIA2_PRA // cycles: 4 - - // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 3 + 4 = 24 - pla // retrieve high nibble from stack - ora C3PO // restore VIC-II and RS-232 bits - sta CIA2_PRA // bits 4 and 5 on CLK/DATA - lsr // move bits 6 and 7 to positions 4 and 5 - lsr - and #%00110000 // clear everything but CLK/DATA - ora C3PO - sta CIA2_PRA // bits 6 and 7 on CLK/DATA - - // Send low nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 - pla // retrieve low nibble from stack - ora C3PO // restore VIC-II and RS-232 bits - sta CIA2_PRA - lsr - lsr - and #%00110000 // clear everything but CLK/DATA - sta CIA2_PRA - - // Signal EOI if needed; cycles till no EOI: 3 + 3 + 2 + 2 + 4 = 14 - lda C3PO - ldx IECPROTO - beq iec_tx_byte_jiffydos_wait_eoi - - // FALLTROUGH - -iec_tx_byte_jiffydos_finalize: - - ora #BIT_CIA2_PRA_CLK_OUT // pull CLK - sta CIA2_PRA - - // Restore proper IECPROTO value - lda #$01 - sta IECPROTO - - // Re-enable sprites and interrupts - pla - sta VIC_SPENA - cli - - // Return success - jmp iec_return_success - - -iec_tx_byte_jiffydos_wait_eoi: - - jsr iec_wait20us // XXX is it enough? - lda C3PO - jmp iec_tx_byte_jiffydos_finalize - - - -iec_rx_byte_jiffydos: - - // Timing is critical, do not allow interrupts - sei - - // Store .X and .Y on the stack - preserve them - phx_trash_a - phy_trash_a - - // Store previous sprite status on stack - jsr jiffydos_prepare_for_transfer - pha - - // Wait until device is ready to send - jsr iec_wait_for_clk_release - - // Prepare 'start sending' message - lda CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release - tax - - // Wait for appropriate moment - jsr jiffydos_wait_line - - // Ask device to start sending bits - stx CIA2_PRA // cycles: 4 - - // XXX we have to wait 20 cycles??? seriously??? what the hell shall we do here??? - pla // 4 cycles - pha // 3 cycles - pla // 4 cycles - pha // 3 cycles - nop // 2 cycles - nop // 2 cycles - nop // 2 cycles - - // Get bits, cycles: 4 + 2 + 2 = 8 - lda CIA2_PRA // bits 0 and 1 on CLK/DATA - lsr - lsr - - // Wait for the drive, cycles: 2 - nop - - // Get bits, cycles: 4 + 2 + 2 = 8 - ora CIA2_PRA // bits 2 and 3 on CLK/DATA - lsr - lsr - - // Get bits, cycles: 3 + 4 + 2 + 2 = 11 - eor C3PO - eor CIA2_PRA // bits 4 and 5 on CLK/DATA - lsr - lsr - - // Get bits, cycles: 3 + 4 = 7 - eor C3PO - eor CIA2_PRA // bits 6 and 7 on CLK/DATA - - // Preserve read byte - sta TBTCNT // $A4 is a byte buffer according to http://sta.c64.org/cbm64mem.html - - // Retrieve status bits - lda CIA2_PRA - tax - - // Pull DATA at the end - ora #BIT_CIA2_PRA_DAT_OUT - sta CIA2_PRA - - // Check for EOI - txa - bmi !+ - jsr kernalstatus_EOI -!: - // Restore proper IECPROTO value - lda #$01 - sta IECPROTO - - // Re-enable sprites - pla - sta VIC_SPENA - - // End byte reception - jmp iec_rx_end - - - -jiffydos_wait_line: - - lda VIC_SCROLY - and #$10 - beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines - - // Avoid 2 lines before the badline, otherwise VIC will ruin the synchronization - lda VIC_RASTER - cmp #$2E - bcc jiffydos_wait_line_done // we are safe, border - lot of time till badline -!: - lda VIC_RASTER // carry+ is definitely set here! - sbc VIC_SCROLY - and #$07 // we want 8 lowest bits - cmp #$06 - bcs !- - -jiffydos_wait_line_done: - - rts - - - -jiffydos_prepare_for_transfer: - - // We need to preserve 3 lowest bits of CIA2_PRA, they contain important - // data - fortunately, the bits are never changed by external devices - // Use C3PO for this, as afterwards we have to set there 0 nevertheless - lda CIA2_PRA - and #%00000111 - sta C3PO - - // Hide sprites - lda VIC_SPENA - ldx #$00 - stx VIC_SPENA - - rts - - -#endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s new file mode 100644 index 00000000..ffe072bf --- /dev/null +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -0,0 +1,97 @@ + +// +// JiffyDOS protocol support for IEC - byte reception +// + + +#if CONFIG_IEC_JIFFYDOS + + +iec_rx_byte_jiffydos: + + // Timing is critical, do not allow interrupts + sei + + // Store .X and .Y on the stack - preserve them + phx_trash_a + phy_trash_a + + // Store previous sprite status on stack + jsr jiffydos_prepare + pha + + // Wait until device is ready to send + jsr iec_wait_for_clk_release + + // Prepare 'start sending' message + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_DAT_OUT // release + tax + + // Wait for appropriate moment + jsr jiffydos_wait_line + + // Ask device to start sending bits + stx CIA2_PRA // cycles: 4 + + // XXX we have to wait 20 cycles??? seriously??? what the hell shall we do here??? + pla // 4 cycles + pha // 3 cycles + pla // 4 cycles + pha // 3 cycles + nop // 2 cycles + nop // 2 cycles + nop // 2 cycles + + // Get bits, cycles: 4 + 2 + 2 = 8 + lda CIA2_PRA // bits 0 and 1 on CLK/DATA + lsr + lsr + + // Wait for the drive, cycles: 2 + nop + + // Get bits, cycles: 4 + 2 + 2 = 8 + ora CIA2_PRA // bits 2 and 3 on CLK/DATA + lsr + lsr + + // Get bits, cycles: 3 + 4 + 2 + 2 = 11 + eor C3PO + eor CIA2_PRA // bits 4 and 5 on CLK/DATA + lsr + lsr + + // Get bits, cycles: 3 + 4 = 7 + eor C3PO + eor CIA2_PRA // bits 6 and 7 on CLK/DATA + + // Preserve read byte + sta TBTCNT // $A4 is a byte buffer according to http://sta.c64.org/cbm64mem.html + + // Retrieve status bits + lda CIA2_PRA + tax + + // Pull DATA at the end + ora #BIT_CIA2_PRA_DAT_OUT + sta CIA2_PRA + + // Check for EOI + txa + bmi !+ + jsr kernalstatus_EOI +!: + // Restore proper IECPROTO value + lda #$01 + sta IECPROTO + + // Re-enable sprites + pla + sta VIC_SPENA + + // End byte reception + jmp iec_rx_end + + +#endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec/iec_rx_dispatch.s b/c64/kernal/iec_fast/iec_rx_dispatch.s similarity index 100% rename from c64/kernal/iec/iec_rx_dispatch.s rename to c64/kernal/iec_fast/iec_rx_dispatch.s diff --git a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s new file mode 100644 index 00000000..c50adb5d --- /dev/null +++ b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s @@ -0,0 +1,102 @@ + +// +// JiffyDOS protocol support for IEC - byte transfer +// + +// XXX make it work + + +#if CONFIG_IEC_JIFFYDOS + + +iec_tx_byte_jiffydos: + + // Timing is critical, do not allow interrupts + sei + + // If EOI requested (carry flag set), mark this in IECPROTO as 0 + bcc !+ + dec IECPROTO // turns 1 into 0 +!: + // Store .X and .Y on the stack - preserve them + phx_trash_a + phy_trash_a + + // Store previous sprite status on stack + jsr jiffydos_prepare + pha + + // Prepare nibbles to send + lda TBTCNT + and #$0F + tax + lda jiffydos_bittable, X // low nibble has to be encoded + pha + lda TBTCNT + and #$F0 + pha + + // Prepare value for device notification + ldx C3PO + + // Wait till receiver is ready + jsr iec_wait_for_data_release + + // Wait till it is safe to send data + jsr jiffydos_wait_line + + // Notify device that we are going to send byte by releasing everything + stx CIA2_PRA // cycles: 4 + + // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 3 + 4 = 24 + pla // retrieve high nibble from stack + ora C3PO // restore VIC-II and RS-232 bits + sta CIA2_PRA // bits 4 and 5 on CLK/DATA + lsr // move bits 6 and 7 to positions 4 and 5 + lsr + and #%00110000 // clear everything but CLK/DATA + ora C3PO + sta CIA2_PRA // bits 6 and 7 on CLK/DATA + + // Send low nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 4 = 21 + pla // retrieve low nibble from stack + ora C3PO // restore VIC-II and RS-232 bits + sta CIA2_PRA + lsr + lsr + and #%00110000 // clear everything but CLK/DATA + sta CIA2_PRA + + // Signal EOI if needed; cycles till no EOI: 3 + 3 + 2 + 2 + 4 = 14 + lda C3PO + ldx IECPROTO + beq iec_tx_byte_jiffydos_wait_eoi + + // FALLTROUGH + +iec_tx_byte_jiffydos_finalize: + + ora #BIT_CIA2_PRA_CLK_OUT // pull CLK + sta CIA2_PRA + + // Restore proper IECPROTO value + lda #$01 + sta IECPROTO + + // Re-enable sprites and interrupts + pla + sta VIC_SPENA + cli + + // Return success + jmp iec_return_success + + +iec_tx_byte_jiffydos_wait_eoi: + + jsr iec_wait20us // XXX is it enough? + lda C3PO + jmp iec_tx_byte_jiffydos_finalize + + +#endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec/iec_tx_dispatch.s b/c64/kernal/iec_fast/iec_tx_dispatch.s similarity index 100% rename from c64/kernal/iec/iec_tx_dispatch.s rename to c64/kernal/iec_fast/iec_tx_dispatch.s diff --git a/c64/kernal/iec/iec_jiffydos_bittable.s b/c64/kernal/iec_fast/jiffydos_bittable.s similarity index 97% rename from c64/kernal/iec/iec_jiffydos_bittable.s rename to c64/kernal/iec_fast/jiffydos_bittable.s index 80376c25..b8c6220b 100644 --- a/c64/kernal/iec/iec_jiffydos_bittable.s +++ b/c64/kernal/iec_fast/jiffydos_bittable.s @@ -15,7 +15,7 @@ #if CONFIG_IEC_JIFFYDOS -iec_jiffydos_bittable: +jiffydos_bittable: .byte $00 .byte $80 // $10 + $70 diff --git a/c64/kernal/iec_fast/jiffydos_prepare.s b/c64/kernal/iec_fast/jiffydos_prepare.s new file mode 100644 index 00000000..1dc8f29b --- /dev/null +++ b/c64/kernal/iec_fast/jiffydos_prepare.s @@ -0,0 +1,29 @@ + +// +// JiffyDOS transfer preparation routine +// + + +#if CONFIG_IEC_JIFFYDOS + + +jiffydos_prepare: + + // We need to preserve 3 lowest bits of CIA2_PRA, they contain important + // data - fortunately, the bits are never changed by external devices + // Use C3PO for this, as afterwards we have to set there 0 nevertheless + lda CIA2_PRA + and #%00000111 + sta C3PO + + // Hide sprites; JiffyDOS timing regime is very strict, before transmitting + // anything we need to make sure nothing will steal the cycles + + lda VIC_SPENA + ldx #$00 + stx VIC_SPENA + + rts + + +#endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec_fast/jiffydos_wait_line.s b/c64/kernal/iec_fast/jiffydos_wait_line.s new file mode 100644 index 00000000..7bb85d1b --- /dev/null +++ b/c64/kernal/iec_fast/jiffydos_wait_line.s @@ -0,0 +1,33 @@ + +// +// JiffyDOS helper routine to wait for appropriate moment, +// where no badline will interrupt the transmission +// + + +#if CONFIG_IEC_JIFFYDOS + + +jiffydos_wait_line: + + lda VIC_SCROLY + and #$10 + beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines + + // Avoid 2 lines before the badline, otherwise VIC will ruin the synchronization + lda VIC_RASTER + cmp #$2E + bcc jiffydos_wait_line_done // we are safe, border - lot of time till badline +!: + lda VIC_RASTER // carry+ is definitely set here! + sbc VIC_SCROLY + and #$07 // we want 8 lowest bits + cmp #$06 + bcs !- + +jiffydos_wait_line_done: + + rts + + +#endif // CONFIG_IEC_JIFFYDOS From d5077496bffd01e53394e6d0d5e1d709d3573d84 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 28 Nov 2019 23:04:39 +0100 Subject: [PATCH 077/105] moved JiffyDOS detection to a separate routine --- c64/kernal/iec/iec_tx_byte.s | 29 ++---------------- c64/kernal/iec_fast/jiffydos_detect.s | 42 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 c64/kernal/iec_fast/jiffydos_detect.s diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index 40259cbb..4cff6ad9 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -57,36 +57,11 @@ iec_tx_common_sendbit: #if CONFIG_IEC_JIFFYDOS - // Here is the place we can detect JiffyDOS protocol, by inserting a long delay - // (above 400us?) during sending command last bit, see: - // - https://sites.google.com/site/h2obsession/CBM/C128/JiffySoft128 - // - https://github.com/rkrajnc/sd2iec/blob/master/src/iec.c - // The 'iec.s' suggests, that the drive should respond by pulling data - + bne !+ // branch if not sending the last bit lda IECPROTO bpl !+ // branch if protocol is known - cpx #$00 - bne !+ // branch if not sending the last bit - - ldy #$25 // 400us is nearly 410 cycles on NTSC - // loop iteration below is 11 cycles, - // and several cycles were already used -iec_jiffydos_detect_loop: - lda CIA2_PRA // 4 cycles - bpl iec_jiffydos_detected // 2 cycles - dey // 2 cycles - bne iec_jiffydos_detect_loop // 3 cycles if branch - - lda #$00 // normal protocol - beq iec_jiffydos_store_proto // branch always - -iec_jiffydos_detected: - jsr iec_wait_for_data_release // guessed from VICE logs - lda #$01 // JiffyDOS protocol - -iec_jiffydos_store_proto: - sta IECPROTO + jsr jiffydos_detect !: #endif // CONFIG_IEC_JIFFYDOS diff --git a/c64/kernal/iec_fast/jiffydos_detect.s b/c64/kernal/iec_fast/jiffydos_detect.s new file mode 100644 index 00000000..40f19523 --- /dev/null +++ b/c64/kernal/iec_fast/jiffydos_detect.s @@ -0,0 +1,42 @@ + +// +// Helper routine for JiffyDOS detection +// + +// Detection is done by inserting a long delay (above 400us?) during sending command last bit, see: +// - https://sites.google.com/site/h2obsession/CBM/C128/JiffySoft128 +// - https://github.com/rkrajnc/sd2iec/blob/master/src/iec.c +// The 'iec.s' suggests, that the drive should respond by pulling data + + + +#if CONFIG_IEC_JIFFYDOS + + +jiffydos_detect: + + ldy #$25 // 400us is nearly 410 cycles on NTSC + // loop iteration below is 11 cycles, + // and several cycles were already used +jiffydos_detect_loop: + lda CIA2_PRA // 4 cycles + bpl jiffydos_detected // 2 cycles + dey // 2 cycles + bne jiffydos_detect_loop // 3 cycles if branch + + lda #$00 // normal protocol + beq jiffydos_store_proto // branch always + +jiffydos_detected: + jsr iec_wait_for_data_release // guessed from VICE logs + lda #$01 // JiffyDOS protocol + + // FALLTROUGH + +jiffydos_store_proto: + sta IECPROTO + + rts + + +#endif // CONFIG_IEC_JIFFYDOS From 02863c5cf5d419a33cda4f37b1f86536deb23119 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 29 Nov 2019 17:55:10 +0100 Subject: [PATCH 078/105] removed faulty JiffyDOS optimization (compatibility problems) --- c64/,,config_generic.s | 2 +- c64/aliases/,aliases_ram_lowmem.s | 2 +- c64/kernal/iec/iec_tx_command.s | 16 ++++++++++++++++ c64/kernal/iec/talk.s | 12 ------------ c64/kernal/iec/unlsn.s | 7 ------- c64/kernal/iec/untlk.s | 7 ------- 6 files changed, 18 insertions(+), 28 deletions(-) diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 09774f1b..ace77aa5 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -41,7 +41,7 @@ // I/O devices #define CONFIG_IEC -// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now +#define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index e5e8e393..85004a2a 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -106,7 +106,7 @@ #if !CONFIG_IEC_JIFFYDOS .label TSFCNT = $A3 // temporary variable for tape and IEC, [!] our usage differs #else - .label IECPROTO = $A3 // -- WIP -- [!] 0 = normal, 1 = JiffyDOS, >= $80 for unknown + .label IECPROTO = $A3 // -- WIP -- [!] 0 = normal, 1 = JiffyDOS, $80 or above = detect protocol #endif .label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details .label CNTDN = $A5 // -- NOT IMPLEMENTED -- diff --git a/c64/kernal/iec/iec_tx_command.s b/c64/kernal/iec/iec_tx_command.s index 04c8a0ca..afdd57a5 100644 --- a/c64/kernal/iec/iec_tx_command.s +++ b/c64/kernal/iec/iec_tx_command.s @@ -16,6 +16,22 @@ iec_tx_command: phx_trash_a phy_trash_a +#if CONFIG_IEC_JIFFYDOS + + // IMHO detecting JiffDOS would be sufficient for TALK and LISTEN commands, + // this would also make the protocol slightly faster. But, for some reason + // (this is clearly visible in the logs) the original JiffyDOS Kernal tries + // to detect the JiffyDOS drive during each and every command - and trying + // to limit the detection to TALK/LISTEN only was causing transmission + // errors (at least with 1541 JiffyDOS ROM) + + lda #$FF // force JiffyDOS detection + sta IECPROTO + + // FALLTROUGH + +#endif // CONFIG_IEC_JIFFYDOS + // Notify all devices that we are going to send a byte // and it is going to be a command (pulled ATN) jsr iec_pull_atn_clk_release_data diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index 76b83ff0..94b6ec65 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -32,18 +32,6 @@ common_talk_listen: // common part of TALK and LISTEN sta TBTCNT -#if CONFIG_IEC_JIFFYDOS - - // It seems that only TALK/LISTEN is used to detect the JiffyDOS support - - lda #$FF // unknown protocol - check what is supported - sta IECPROTO - - // FALLTROUGH - -#endif // CONFIG_IEC_JIFFYDOS - - jmp iec_tx_command #else diff --git a/c64/kernal/iec/unlsn.s b/c64/kernal/iec/unlsn.s index b5dc8990..55fb5fd4 100644 --- a/c64/kernal/iec/unlsn.s +++ b/c64/kernal/iec/unlsn.s @@ -18,13 +18,6 @@ UNLSN: // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush -#if CONFIG_IEC_JIFFYDOS - - lda #$00 // switch back to standard protocol - sta IECPROTO - -#endif - // Buffer empty, send the command lda #$3F diff --git a/c64/kernal/iec/untlk.s b/c64/kernal/iec/untlk.s index 3dfceb2b..1e7f542a 100644 --- a/c64/kernal/iec/untlk.s +++ b/c64/kernal/iec/untlk.s @@ -18,13 +18,6 @@ UNTLK: // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush -#if CONFIG_IEC_JIFFYDOS - - lda #$00 // switch back to standard protocol - sta IECPROTO - -#endif - // Buffer empty, send the command lda #$5F From a11e50a3cfdac1fc096773d8ae3e774fe18ebe63 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 29 Nov 2019 18:17:15 +0100 Subject: [PATCH 079/105] Revert "removed faulty JiffyDOS optimization (compatibility problems)" This reverts commit 02863c5cf5d419a33cda4f37b1f86536deb23119. --- c64/,,config_generic.s | 2 +- c64/aliases/,aliases_ram_lowmem.s | 2 +- c64/kernal/iec/iec_tx_command.s | 16 ---------------- c64/kernal/iec/talk.s | 12 ++++++++++++ c64/kernal/iec/unlsn.s | 7 +++++++ c64/kernal/iec/untlk.s | 7 +++++++ 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index ace77aa5..09774f1b 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -41,7 +41,7 @@ // I/O devices #define CONFIG_IEC -#define CONFIG_IEC_JIFFYDOS // please keep disabled for now +// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 85004a2a..e5e8e393 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -106,7 +106,7 @@ #if !CONFIG_IEC_JIFFYDOS .label TSFCNT = $A3 // temporary variable for tape and IEC, [!] our usage differs #else - .label IECPROTO = $A3 // -- WIP -- [!] 0 = normal, 1 = JiffyDOS, $80 or above = detect protocol + .label IECPROTO = $A3 // -- WIP -- [!] 0 = normal, 1 = JiffyDOS, >= $80 for unknown #endif .label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details .label CNTDN = $A5 // -- NOT IMPLEMENTED -- diff --git a/c64/kernal/iec/iec_tx_command.s b/c64/kernal/iec/iec_tx_command.s index afdd57a5..04c8a0ca 100644 --- a/c64/kernal/iec/iec_tx_command.s +++ b/c64/kernal/iec/iec_tx_command.s @@ -16,22 +16,6 @@ iec_tx_command: phx_trash_a phy_trash_a -#if CONFIG_IEC_JIFFYDOS - - // IMHO detecting JiffDOS would be sufficient for TALK and LISTEN commands, - // this would also make the protocol slightly faster. But, for some reason - // (this is clearly visible in the logs) the original JiffyDOS Kernal tries - // to detect the JiffyDOS drive during each and every command - and trying - // to limit the detection to TALK/LISTEN only was causing transmission - // errors (at least with 1541 JiffyDOS ROM) - - lda #$FF // force JiffyDOS detection - sta IECPROTO - - // FALLTROUGH - -#endif // CONFIG_IEC_JIFFYDOS - // Notify all devices that we are going to send a byte // and it is going to be a command (pulled ATN) jsr iec_pull_atn_clk_release_data diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index 94b6ec65..76b83ff0 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -32,6 +32,18 @@ common_talk_listen: // common part of TALK and LISTEN sta TBTCNT +#if CONFIG_IEC_JIFFYDOS + + // It seems that only TALK/LISTEN is used to detect the JiffyDOS support + + lda #$FF // unknown protocol - check what is supported + sta IECPROTO + + // FALLTROUGH + +#endif // CONFIG_IEC_JIFFYDOS + + jmp iec_tx_command #else diff --git a/c64/kernal/iec/unlsn.s b/c64/kernal/iec/unlsn.s index 55fb5fd4..b5dc8990 100644 --- a/c64/kernal/iec/unlsn.s +++ b/c64/kernal/iec/unlsn.s @@ -18,6 +18,13 @@ UNLSN: // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#if CONFIG_IEC_JIFFYDOS + + lda #$00 // switch back to standard protocol + sta IECPROTO + +#endif + // Buffer empty, send the command lda #$3F diff --git a/c64/kernal/iec/untlk.s b/c64/kernal/iec/untlk.s index 1e7f542a..3dfceb2b 100644 --- a/c64/kernal/iec/untlk.s +++ b/c64/kernal/iec/untlk.s @@ -18,6 +18,13 @@ UNTLK: // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#if CONFIG_IEC_JIFFYDOS + + lda #$00 // switch back to standard protocol + sta IECPROTO + +#endif + // Buffer empty, send the command lda #$5F From 25576a7051bd97e74c46348b216deddb5614e385 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 29 Nov 2019 20:52:28 +0100 Subject: [PATCH 080/105] better simulation of original JiffyDOS ROM behaviour --- c64/kernal/iec/iec_tx_byte.s | 5 ++++- c64/kernal/iec/unlsn.s | 2 +- c64/kernal/iec/untlk.s | 2 +- c64/kernal/iec_fast/jiffydos_detect.s | 9 +++++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/c64/kernal/iec/iec_tx_byte.s b/c64/kernal/iec/iec_tx_byte.s index 4cff6ad9..5dcca324 100644 --- a/c64/kernal/iec/iec_tx_byte.s +++ b/c64/kernal/iec/iec_tx_byte.s @@ -59,7 +59,10 @@ iec_tx_common_sendbit: bne !+ // branch if not sending the last bit lda IECPROTO - bpl !+ // branch if protocol is known + beq !+ // branch if standard protocol + + // JiffyDOS ROM performs detection loop on every command; it seems we have to + // replicate this behaviour for compatibility with at least 1541 JiffyDOS ROM jsr jiffydos_detect !: diff --git a/c64/kernal/iec/unlsn.s b/c64/kernal/iec/unlsn.s index b5dc8990..4681c089 100644 --- a/c64/kernal/iec/unlsn.s +++ b/c64/kernal/iec/unlsn.s @@ -20,7 +20,7 @@ UNLSN: #if CONFIG_IEC_JIFFYDOS - lda #$00 // switch back to standard protocol + lda #$FF // XXX sta IECPROTO #endif diff --git a/c64/kernal/iec/untlk.s b/c64/kernal/iec/untlk.s index 3dfceb2b..d8db0fb1 100644 --- a/c64/kernal/iec/untlk.s +++ b/c64/kernal/iec/untlk.s @@ -20,7 +20,7 @@ UNTLK: #if CONFIG_IEC_JIFFYDOS - lda #$00 // switch back to standard protocol + lda #$FF // XXX sta IECPROTO #endif diff --git a/c64/kernal/iec_fast/jiffydos_detect.s b/c64/kernal/iec_fast/jiffydos_detect.s index 40f19523..49ada03c 100644 --- a/c64/kernal/iec_fast/jiffydos_detect.s +++ b/c64/kernal/iec_fast/jiffydos_detect.s @@ -8,6 +8,9 @@ // - https://github.com/rkrajnc/sd2iec/blob/master/src/iec.c // The 'iec.s' suggests, that the drive should respond by pulling data +// The original JiffyyDOS ROM seems to perform detection with every command +// (even though for many of them it always fails) and we have to replicate +// this behaviour for compatibility with at least 1541 JiffyDOS ROM #if CONFIG_IEC_JIFFYDOS @@ -24,6 +27,9 @@ jiffydos_detect_loop: dey // 2 cycles bne jiffydos_detect_loop // 3 cycles if branch + lda IECPROTO + bpl jiffydos_detect_end // no detection requested, preserve existing protocol + lda #$00 // normal protocol beq jiffydos_store_proto // branch always @@ -36,6 +42,9 @@ jiffydos_detected: jiffydos_store_proto: sta IECPROTO + // FALLTROUGH + +jiffydos_detect_end: rts From 707e8bcadb9726ab686af5f64e953a1badb9879f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 29 Nov 2019 21:33:48 +0100 Subject: [PATCH 081/105] documentation update --- STATUS.md | 36 ++++++++++++++++++++++ c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 3 ++ c64/kernal/iec_fast/iec_tx_byte_jiffydos.s | 2 -- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/STATUS.md b/STATUS.md index 821d2fc9..99605adb 100644 --- a/STATUS.md +++ b/STATUS.md @@ -37,6 +37,42 @@ The following ROM features are currently missing: * NMI handling is incomplete +# Hardware support status + +## Keyboard + +| Driver | Status | Remarks | +| :-----------------: | :------: | :------------------------------------------------: | +| C64 | DONE | | +| C128 | DONE | | +| C65 / Mega65 | NOT DONE | code should be complete, but is not tested yet | + +## Tape storage (LOAD only!) + +| Driver | Status | Remarks | +| :-----------------: | :------: | :------------------------------------------------: | +| normal | NOT DONE | | +| turbo | PARTIAL | works, to do: use sync to calibrate read speed | + +## IEC bus (disk drives, etc.) + +| Driver | Status | Remarks | +| :-----------------: | :------: | :------------------------------------------------: | +| standard protocol | DONE | | +| JiffyDOS | NOT DONE | work in progress, not functional yet | +| DolphinDOS serial | NOT DONE | | +| DolphinDOS parallel | NOT DONE | | +| CIA burst mod | NOT DONE | | + +## RS-232 + +| Driver | Status | Remarks | +| :-----------------: | :------: | :------------------------------------------------: | +| UP2400 | NOT DONE | | +| UP9600 | NOT DONE | work in progress, not functional yet | +| ACIA 6551 | NOT DONE | | + + # API status diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s index ffe072bf..27e863b2 100644 --- a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -3,6 +3,8 @@ // JiffyDOS protocol support for IEC - byte reception // +// XXX byte reception does not seem to work yet + #if CONFIG_IEC_JIFFYDOS @@ -64,6 +66,7 @@ iec_rx_byte_jiffydos: // Get bits, cycles: 3 + 4 = 7 eor C3PO + eor CIA2_PRA // bits 6 and 7 on CLK/DATA // Preserve read byte diff --git a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s index c50adb5d..7903e333 100644 --- a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s @@ -3,8 +3,6 @@ // JiffyDOS protocol support for IEC - byte transfer // -// XXX make it work - #if CONFIG_IEC_JIFFYDOS From 00284462617b47aa852937712d850b3a935c5a15 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 1 Dec 2019 10:23:22 +0100 Subject: [PATCH 082/105] further JiffyDOS timing fixes --- c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 17 +++++++++-------- c64/kernal/iec_fast/jiffydos_wait_line.s | 7 ++++--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s index 27e863b2..fa37d580 100644 --- a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -36,14 +36,15 @@ iec_rx_byte_jiffydos: // Ask device to start sending bits stx CIA2_PRA // cycles: 4 - // XXX we have to wait 20 cycles??? seriously??? what the hell shall we do here??? - pla // 4 cycles - pha // 3 cycles - pla // 4 cycles - pha // 3 cycles - nop // 2 cycles - nop // 2 cycles - nop // 2 cycles + // XXX how many cycles? (each NOP is 2) + + nop + nop + nop + + nop + nop + nop // Get bits, cycles: 4 + 2 + 2 = 8 lda CIA2_PRA // bits 0 and 1 on CLK/DATA diff --git a/c64/kernal/iec_fast/jiffydos_wait_line.s b/c64/kernal/iec_fast/jiffydos_wait_line.s index 7bb85d1b..cf6e9169 100644 --- a/c64/kernal/iec_fast/jiffydos_wait_line.s +++ b/c64/kernal/iec_fast/jiffydos_wait_line.s @@ -10,9 +10,10 @@ jiffydos_wait_line: - lda VIC_SCROLY - and #$10 - beq jiffydos_wait_line_done // screen is disabled, no need to watch for badlines + // One might try to optimize the code by checking for disabled screen + // (bit 4 of VIC_SCROLY); problem: VIC checks this bit only once per frame: + // - https://www.lemon64.com/forum/viewtopic.php?t=56582 + // so it would complicated the code // Avoid 2 lines before the badline, otherwise VIC will ruin the synchronization lda VIC_RASTER From 6c55889bafb636ab9cfd50ac8424bc038f3cd119 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 1 Dec 2019 12:48:01 +0100 Subject: [PATCH 083/105] JiffyDOS byte reception optimizations --- c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s index fa37d580..54955d9b 100644 --- a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -3,8 +3,6 @@ // JiffyDOS protocol support for IEC - byte reception // -// XXX byte reception does not seem to work yet - #if CONFIG_IEC_JIFFYDOS @@ -36,13 +34,13 @@ iec_rx_byte_jiffydos: // Ask device to start sending bits stx CIA2_PRA // cycles: 4 - // XXX how many cycles? (each NOP is 2) + // Prepare 'data pull' byte, cycles 3 + 2 + 2 = 7 + lda C3PO + ora #BIT_CIA2_PRA_DAT_OUT + tax - nop - nop - nop + // Delay, JiffyDOS needs some time - nop nop nop @@ -73,16 +71,18 @@ iec_rx_byte_jiffydos: // Preserve read byte sta TBTCNT // $A4 is a byte buffer according to http://sta.c64.org/cbm64mem.html + // Delay, JiffyDOS needs some time; for PAL one NOP would be enough, + // but NTSC machines are clocked slightly faster + nop + nop + // Retrieve status bits - lda CIA2_PRA - tax + bit CIA2_PRA // Pull DATA at the end - ora #BIT_CIA2_PRA_DAT_OUT - sta CIA2_PRA + stx CIA2_PRA - // Check for EOI - txa + // Check for EOI (DATA line) bmi !+ jsr kernalstatus_EOI !: From 0ae57c4a2c56ec48eb4822df90c7f900a8e2b402 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 1 Dec 2019 12:51:28 +0100 Subject: [PATCH 084/105] updated cycle count for JiffyDOS --- c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s index 54955d9b..9cb648bd 100644 --- a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -34,13 +34,12 @@ iec_rx_byte_jiffydos: // Ask device to start sending bits stx CIA2_PRA // cycles: 4 - // Prepare 'data pull' byte, cycles 3 + 2 + 2 = 7 + // Prepare 'data pull' byte, cycles: 3 + 2 + 2 = 7 lda C3PO - ora #BIT_CIA2_PRA_DAT_OUT + ora #BIT_CIA2_PRA_DAT_OUT // pull tax - // Delay, JiffyDOS needs some time - + // Delay, JiffyDOS needs some time, 4 cycles nop nop @@ -65,21 +64,20 @@ iec_rx_byte_jiffydos: // Get bits, cycles: 3 + 4 = 7 eor C3PO - eor CIA2_PRA // bits 6 and 7 on CLK/DATA - // Preserve read byte + // Preserve read byte, cycles: 3 sta TBTCNT // $A4 is a byte buffer according to http://sta.c64.org/cbm64mem.html // Delay, JiffyDOS needs some time; for PAL one NOP would be enough, - // but NTSC machines are clocked slightly faster + // but NTSC machines are clocked slightly faster; cycles: 4 nop nop - // Retrieve status bits + // Retrieve status bits, cycles: 4 bit CIA2_PRA - // Pull DATA at the end + // Pull DATA at the end, cycles: 4 stx CIA2_PRA // Check for EOI (DATA line) From 506d9d5c4faacf31eaae9b3c92ddc55f8e446c8b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 1 Dec 2019 16:29:00 +0100 Subject: [PATCH 085/105] compatibility fix for EOI handling in IEC code --- c64/kernal/iec/acptr.s | 10 ++++++++-- c64/kernal/iec/chrin_iec.s | 2 +- c64/kernal/iec/iec_rx_byte.s | 12 ++---------- c64/kernal/iec/load_iec.s | 36 ++++++++++++++++++++++-------------- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/c64/kernal/iec/acptr.s b/c64/kernal/iec/acptr.s index f31bfc74..e5e818e7 100644 --- a/c64/kernal/iec/acptr.s +++ b/c64/kernal/iec/acptr.s @@ -11,8 +11,14 @@ ACPTR: - jsr kernalstatus_reset - + lda IOSTATUS + beq !+ + + lda #$0D // tested on real ROMs + clc + rts +!: + #if CONFIG_IEC #if CONFIG_IEC_JIFFYDOS jmp iec_rx_dispatch diff --git a/c64/kernal/iec/chrin_iec.s b/c64/kernal/iec/chrin_iec.s index f293fa0c..93ad7afc 100644 --- a/c64/kernal/iec/chrin_iec.s +++ b/c64/kernal/iec/chrin_iec.s @@ -7,4 +7,4 @@ chrin_iec: // XXX is this really all? - jmp JACPTR // carry will be set accordingly + jmp JACPTR diff --git a/c64/kernal/iec/iec_rx_byte.s b/c64/kernal/iec/iec_rx_byte.s index 36f00f78..ac6f807a 100644 --- a/c64/kernal/iec/iec_rx_byte.s +++ b/c64/kernal/iec/iec_rx_byte.s @@ -111,16 +111,8 @@ iec_rx_clk_wait2: // Timeout jsr kernalstatus_EOI pla - - // Restore registers - pla - tay - pla - tax - - sec // XXX confirm that sec is really a way to report timeout here - cli - rts + + jmp iec_rx_end !: // More bits? dex diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 23f647b8..4175ab41 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -24,8 +24,6 @@ load_break_error: jsr iec_close_load jmp kernalerror_ROUTINE_TERMINATED -load_save_no_file_name: - load_iec: @@ -71,19 +69,10 @@ load_iec: // Get load address -#if CONFIG_IEC_JIFFYDOS - jsr iec_rx_dispatch -#else // no turbo supported - jsr iec_rx_byte -#endif - bcs load_iec_file_not_found + jsr load_iec_get_addr_byte sta EAL+0 -#if CONFIG_IEC_JIFFYDOS - jsr iec_rx_dispatch -#else // no turbo supported - jsr iec_rx_byte -#endif - bcs load_iec_file_not_found + + jsr load_iec_get_addr_byte sta EAL+1 // If secondary address is 0, override EAL with STAL @@ -143,4 +132,23 @@ iec_load_loop: jmp lvs_return_last_address +load_iec_get_addr_byte: + +#if CONFIG_IEC_JIFFYDOS + jsr iec_rx_dispatch +#else // no turbo supported + jsr iec_rx_byte +#endif + + bcs !+ + lda IOSTATUS + and #K_STS_EOI + bne !+ + rts +!: + pla + pla + jmp load_iec_file_not_found + + #endif // CONFIG_IEC From aaca51494ad141a0c0918137b61db85e076c1e9d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 1 Dec 2019 17:18:06 +0100 Subject: [PATCH 086/105] fix broken IEC flush with JiffyDOS --- c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 4 ++++ c64/kernal/iec_fast/iec_tx_byte_jiffydos.s | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s index 9cb648bd..f7c78ecb 100644 --- a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -84,6 +84,10 @@ iec_rx_byte_jiffydos: bmi !+ jsr kernalstatus_EOI !: + // Indicate that no byte waits in output buffer + lda #$00 + sta C3PO + // Restore proper IECPROTO value lda #$01 sta IECPROTO diff --git a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s index 7903e333..26b15c27 100644 --- a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s @@ -77,6 +77,10 @@ iec_tx_byte_jiffydos_finalize: ora #BIT_CIA2_PRA_CLK_OUT // pull CLK sta CIA2_PRA + // Indicate that no byte waits in output buffer + lda #$00 + sta C3PO + // Restore proper IECPROTO value lda #$01 sta IECPROTO From 76b39abd8e48382c879a1db1d616020eb7b4480f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 1 Dec 2019 17:47:38 +0100 Subject: [PATCH 087/105] updated prebuilt binaries --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/kernal/iec/talk.s | 2 -- 9 files changed, 2 deletions(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index a31fe15d746e46110270dec69edf6803cd4c5f8b..ea4a02dfff5342a22d27bc8279f2c6ba222fe85e 100644 GIT binary patch delta 207 zcmZp0XmFU|p|R%uN_&M%|1(x8%wMbU`o$teAidP;PU@CC~i zj6n3{znnTCN}J0PM5S?=fF$Q|se&aBbE|^5ueghZIgAVp_1v8G3@4|^SAmp1kXHZz DeWNXU delta 119 zcmZp0XmHqYh=pnYm(535elkk!|FY6v;nM$%RSNUhDx7?}ND)Nu{{lptud{t%1gSg8 zVFaQl|K-#HQQBOVAS#W^1SC0!OBF16m|GRZeZ^fQ%wcF?uIJ{gXFNGYz6zxDfxH3$ DdaO0^ diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index cdefb4d70704133289b05a186f39d298351ee3f3..6268fab0e557f7a18ce47b291d07cbb68e28b617 100644 GIT binary patch delta 115 zcmZp0XmHq|&!WP(fJK4l>B`Ur`xWF?FJcDs6gDnj#I}F|D6Y`>&gaLw$-ykzjBT6i zS(@yo}wDQ}e^p4GNkc6xt>~V0Q*8P~nJR0aCR*Zj6lGn~(6$5acj2 PFw}E%)-#-(B0mQJnJg&J delta 115 zcmZp0XmHq|&!WP#fJK4l>B`Ur`xWF?FJb}n6gDnj#J+$5D6Y`^&PVY5F+i@-lWqPK6IkHz+84P?$9N0lPC$feJ?i3y`YiabskhzWE663_%V< P19Lq$XFcP|De`jwXDui} diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index e809611de914ae319d6e0940bce0d3182174ccc6..ad199e5dea025425612379adb0b395958a8187ba 100644 GIT binary patch delta 215 zcmZp0XmFU|p;7)}rM<$X{~4K58Es5+*CM+e|iKXPX?$ehg^53WqH-W6k6w?qJ69$=kS}0m->MxMxAR>v5p%{nIWj50~;w6Ufw zs4PX|;gRRG-~@x)Tgy5E=cE}t?GhbcKv$D%=a1|h>3&$8d0=$)hsRy^cwuoI&@Wi)pyZ1 z)Aqh|cX`x2gkK`*v01w|PoZ_=&T`hxD_WH0!)N`m4+T4F3OYFCrZD93ybzfer+=pI zgQWB(V?9@S@>Fud)@}>`)%~5@`)*vhnEJVLtME3oGf>hRjM=%N??(IyXac}1OMe^IbIv}m^nKN?2cJjfk=<@WX(zJ6JZv@(N+ zxLzfc$Klc-UK`|p$m$sI8ND-V z3=?K)lCEoxpoA$==kj`Cz3YKDK{Mcv(A2JolG&{5_j(n5gXuRxZwt;GsWEu-5_=7I zx*{|VMUSA%MnNPHg7-kN9a!jUmK4kNbsy)9M!{or1sR+I9M)s_XIs>j_rs zxp|y*yfH`Stnag3#Wt<;7vx~vq4hGtwQFfRZWt|#NSBe; z<9IA48Dl8 zFI>LxnV^YBqF3snpS8Zrx)YQf^jsLFPos6@-wW3me>>{>!_0YCw_O zBZZ9#5e|O5aH+~!eVL3TW|LII(u%@>7^!0h>Q*VdXyRNUl^^7=8+;%8a#M6$4C7irZSxv6L0da3|c~%_^K6;Uyc7 z7KgyGx5D~|KzZpNYKb^F?DOGAKCvX$#Z?Y|=vBC0CBWMoYVvgbJ6R=U;){56J2K+3 zhYi8(3V^8A++bE2TsjFY(6!a1WV2S2f(yx4hUYVq!m>uV$)87^{#w9Gp4A!v0Wk1* z4JkIJRU94#Zi8uN3;-57s{T@ag;$R~gzkA&eROz5Bd|Khkl3pP(eJ~c91s$`5p^J)ByReUxF*X8t!6n z*|@!-D<1B!D=b}V+{sFp8~3o1v$34LQPlvVh{oU>&_FaehtOe<8hMES4?J0bYH~t) zjZpnNW5JH~g|GZ%6Z7oH?ejDmumpV4fermIDpw)=aR6_QsQ#`4N`Z6+lT+9y6J#>^ zg^KFEvJ^ z4T_LX&&D03Kq3p4FIf?^w4j1CbLIjK|yIXb}m$)=Po$@v}>GYy9t)B*u0 znebnSNq0(SMSeiK8{0?Yditck?2yoh^8@w{Iv+v_xbF{3PKai-2LZ*^(N}{_=QB#g6oTa1kE$c~Ep0e6lRpjJ# zQ)$uDoVRxfEYT5s&@c5Bjb=rik@`&gpoi8x0nehYvOTJk!_bhgO$E96ffLMt$f|{B zmEyV;oGmrop*W2SZWXXx&CkpE?d75ZQH(eLs`P+O(h90ZP$7&ddU$fQm^)#)^f-6i-v!>4z@`to7jfY5XgS6))cBBV8G3nGr9JqX)9M13BD* aTn^`i@W?cdA8H;D8J=MZXCD2B8~ZPWKg{U> delta 2434 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 delta 2480 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 delta 2548 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 I-^z>s1;1A1F#rGn delta 2115 zcmZ8iYfK#172cVFebv|t#$kDxYdfMqF~ScSw+Ri7(}t9*ptg<#>La&ul`aKKQGcY= zQ3FvKgh_EWxwzpWnq{(s7)!<*xe;EcG(c-7OJiqj6C2mix>i^oa@srCFw0POdS;2M zsM6@px#zyl`ObI0+g#CH5xOF{_?R3*dXk@QtF+r zsGA1m$>b@P)P>VDI-69yseUzhec%Q`fmytb<|Y^X;GI?U#QpFwK0;JG8qjh7Qt}-! zi1x-p0;;vT1kc3iR;O$8$v4w-`%>Q!nqTisPg(rv>w9|rMfrK@j&<|ID_1_to}bmU z^>s~)$K&fP7MoqwXdt*T7Y$hyJRN z4FJYbZ!9!|;zsB_ame}&iD%`o>XgUCA$eRpix%RRw-@!rL%&03>^} z=PRMte5Yl9VFkO5GR%yP^UF<{svPn8AUvP12ER+MI!cO{=M`HZr`tB!<}tol8V@`SoEzi@hIe)~p(G$*mu8M}7j~zl!&EoMjbj_R}Ilkc03!CsY z6Lx=?=Pq+2&wC1IZ;>0U%&p7jNMDRc~FhpRfA>pRimo zCVq&^R+VOzhwg`oi5+k7*1uU@q2Em1k!f)W+ZL?~4f>F70MEd{BL;P6m++S~`i<2)iD*h4DiPL^~K4M%+h%^1Nh=4penTs#kPhmBDiuD&1a8g)ao?-}y>?pj{H(0!Db z!`;XDk6OBb1_?Zdskn95R&%ApHXRo9-Q2Y5I@7^tI&}K}*8D?#>>hZ&C9kl@1E%B{ zxxrxG$R(D-O-D?YIclnp1{}9;FxA!N{q^73AkKWy=J|K&mI=?~sL7nDkM2xAnKlF0 zHR6D z_4M{5+nWOJHqSa)|DdU<*@Kcej!%+~oEhL5FID5^c{qhv1;r$?pP=~|WF9eGcYsb2 zr{57t@(YnXa*#;LBSP~`BU6P5b(sXa+DaX_YI!y0g)yu4mQ+2x0xjs$mnEq}3^w7t zF+g2)L_57c@f7g__|Z=M8(scbO_e`UQ=m4N#ZOR!0r&edIStCy4qBva=q_A7xO#~* zoQ-Hqvt;p43^i*7a8g$#6wqxI5dGQ2le%vZ?Yoa>4A`*~$Z^_BASn049==F7dk=UT zHI%e&T`x;UVLN)nyVw3g%sPd>=H1ow2Q4ABMIOh5su#c<>!jc?+Xg`aIu{K&4BC;f zKt6Em{r{oH9uvH90Ebs+im#$x?M$id3r_L?(&-Y(XjL zc%4^_4nMDOba&>9+^^{GGr#L{X#-PCu->XzW)*jZK9zL{O4^#$l7OSp!U52Di%F@F zPLXE|#EX~#&j-9FFd{h=TO~|N3>v5V6lZSvEKpY-!qALc z)|h4Wc`i$(Fa--H*kjTTi`2z=UUx!+EG7DsKATsQ_5DTsvW{O}f@cof=Wv~lGjtqc rc$m@Ayqrh>#jwsA3WSCtp`jQm9>Z@k?4AuwOEzM&?T_F6kFfY(bgdjk diff --git a/c64/kernal/iec/talk.s b/c64/kernal/iec/talk.s index 76b83ff0..d0c11e65 100644 --- a/c64/kernal/iec/talk.s +++ b/c64/kernal/iec/talk.s @@ -39,8 +39,6 @@ common_talk_listen: // common part of TALK and LISTEN lda #$FF // unknown protocol - check what is supported sta IECPROTO - // FALLTROUGH - #endif // CONFIG_IEC_JIFFYDOS From 24a8e52ad3c4aabe746b13ecf059e8b4ed20a54a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 2 Dec 2019 18:10:31 +0100 Subject: [PATCH 088/105] commented-out some dead code, improved ATN handling --- c64/kernal/errors.s | 22 ++++++++++++---------- c64/kernal/iec_fast/iec_tx_byte_jiffydos.s | 7 +++++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/c64/kernal/errors.s b/c64/kernal/errors.s index 70f9847e..73e6c552 100644 --- a/c64/kernal/errors.s +++ b/c64/kernal/errors.s @@ -63,17 +63,19 @@ kernalstatus_reset: sta IOSTATUS rts -kernalstatus_TIMEOUT_WRITE: // XXX detect this! - lda IOSTATUS - ora #K_STS_TIMEOUT_WRITE - sta IOSTATUS - rts +// The following two statuses are currentl not implemented - and most likely not really needed -kernalstatus_TIMEOUT_READ: // XXX detect this! - lda IOSTATUS - ora #K_STS_TIMEOUT_READ - sta IOSTATUS - rts +// kernalstatus_TIMEOUT_WRITE: +// lda IOSTATUS +// ora #K_STS_TIMEOUT_WRITE +// sta IOSTATUS +// rts + +// kernalstatus_TIMEOUT_READ: +// lda IOSTATUS +// ora #K_STS_TIMEOUT_READ +// sta IOSTATUS +// rts kernalstatus_EOI: lda IOSTATUS diff --git a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s index 26b15c27..0cf331cc 100644 --- a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s @@ -20,6 +20,9 @@ iec_tx_byte_jiffydos: phx_trash_a phy_trash_a + // Make sure we are not sending data on ATN + jsr iec_release_atn + // Store previous sprite status on stack jsr jiffydos_prepare pha @@ -45,7 +48,7 @@ iec_tx_byte_jiffydos: // Notify device that we are going to send byte by releasing everything stx CIA2_PRA // cycles: 4 - + // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 3 + 4 = 24 pla // retrieve high nibble from stack ora C3PO // restore VIC-II and RS-232 bits @@ -96,7 +99,7 @@ iec_tx_byte_jiffydos_finalize: iec_tx_byte_jiffydos_wait_eoi: - jsr iec_wait20us // XXX is it enough? + jsr iec_wait60us // XXX is it enough? lda C3PO jmp iec_tx_byte_jiffydos_finalize From 89b887cd12e1337639a9bb0785d7bab595a1d398 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 4 Dec 2019 20:56:20 +0100 Subject: [PATCH 089/105] fixed bug preventing JiffDOS stack from loading files --- CONFIG.md | 6 ++++++ bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/,,config_generic.s | 2 +- c64/,,config_mega65.s | 2 +- c64/,,config_testing.s | 2 +- c64/,,config_ultimate64.s | 2 +- c64/aliases/,aliases_config.s | 2 +- c64/kernal/iec_fast/iec_tx_byte_jiffydos.s | 6 +----- 15 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 1d200f10..06cc3736 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -103,6 +103,12 @@ Adds support for the IEEC bus - for serial printers, disk drives, etc. Needs over 1000 bytes in KERNAL segment. If unsure - enable. +### `CONFIG_IEC_JIFFYDOS` + +Adds support for JiffyDOS pprotocol to the IEC bus (note, that it currentlyy lacks the optimized LOAD loop, so it will be slower than original JiffyDOS enabled Kernal ROMs). + +Needs over 320 bytes in KERNAL segment. If unsure - enable. + ### `CONFIG_TAPE_TURBO` Adds a minimal turbo tape support - just LOAD command (device 7, like on _Action Replay_ and _Final_ cartridges) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index ea4a02dfff5342a22d27bc8279f2c6ba222fe85e..a20878cb34d096738e804d0f4ebb2490050232c5 100644 GIT binary patch delta 173 zcmZp0XmFU|q51RMN_&M%|1(x8%wMZe_HL0PkX~wa^8W{(Me< on#ZF9qR#MGf+%)g6A)#~+Xhs*`6%y9K}M6w@$&T`!3XjR00J9Q$p8QV delta 173 zcmZp0XmFU|p}FS$N_&M%|1(x8%wMbU`o$teAidP;) zg=x+E%?&KC8Kto40;&O`$*pYttjpi~!_4&h#pGn}ARu@0cJ8Mj pY95ach&sb#38L6}O+b__ZyQkM=A*nb1sM$|$II7)1RuyN002!GP&WVo diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index c708078c64d689db63b273bdadc1c60ae1d509d0..e988783a56400f87e278d0d20ae2dacfe2cdd37d 100644 GIT binary patch delta 140 zcmZp0XmHqYh=pnUhs{S=elkjJ|FF_t;nM$%RSNUhD(v~NND)MD{{Tdrud~fzWZLs# zaw$g;Ncl+)BSs)S`7fsqh|=b=1W{>RCLqZnY|sCe^H-kE}oCX?gk7XkpF4Iv=_ delta 84 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 O%m@rKYvlHQuJ8Znb#E&G diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index 5b9fd48db413866a5733ce84e016068759d9f89f..fa7d782a8efe6eb33b869372c5b645d83a5d0524 100644 GIT binary patch delta 2811 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 delta 2454 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 delta 2676 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 diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 09774f1b..25bca317 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -41,7 +41,7 @@ // I/O devices #define CONFIG_IEC -// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now +#define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 6b179612..80f96095 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -43,7 +43,7 @@ // I/O devices #define CONFIG_IEC -// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now +#define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index cdba7f9d..652a3e5d 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -42,7 +42,7 @@ // I/O devices #define CONFIG_IEC -// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now +#define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 091f1974..7af94966 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -41,7 +41,7 @@ // I/O devices #define CONFIG_IEC -// #define CONFIG_IEC_JIFFYDOS // please keep disabled for now +#define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO // #define CONFIG_RS232_UP2400 // please keep disabled for now diff --git a/c64/aliases/,aliases_config.s b/c64/aliases/,aliases_config.s index e40cbefb..132c7af0 100644 --- a/c64/aliases/,aliases_config.s +++ b/c64/aliases/,aliases_config.s @@ -317,7 +317,7 @@ #if !CONFIG_IEC_JIFFYDOS .eval features_str = ADD_FEATURE(features_str, "IEC") #else - .eval features_str = ADD_FEATURE(features_str, "IEC JIFFY-DEV") + .eval features_str = ADD_FEATURE(features_str, "IEC JIFFY") #endif #endif diff --git a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s index 0cf331cc..a2b8a62e 100644 --- a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s @@ -48,7 +48,6 @@ iec_tx_byte_jiffydos: // Notify device that we are going to send byte by releasing everything stx CIA2_PRA // cycles: 4 - // Send high nibble; cycles: 4 + 3 + 4 + 2 + 2 + 2 + 3 + 4 = 24 pla // retrieve high nibble from stack ora C3PO // restore VIC-II and RS-232 bits @@ -80,10 +79,6 @@ iec_tx_byte_jiffydos_finalize: ora #BIT_CIA2_PRA_CLK_OUT // pull CLK sta CIA2_PRA - // Indicate that no byte waits in output buffer - lda #$00 - sta C3PO - // Restore proper IECPROTO value lda #$01 sta IECPROTO @@ -99,6 +94,7 @@ iec_tx_byte_jiffydos_finalize: iec_tx_byte_jiffydos_wait_eoi: + sta CIA2_PRA jsr iec_wait60us // XXX is it enough? lda C3PO jmp iec_tx_byte_jiffydos_finalize From 11c389f7cc033808147b3a35ae4a1ae5135aebf3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 5 Dec 2019 18:03:46 +0100 Subject: [PATCH 090/105] fixed regression in IEC secondary LOAD address --- c64/kernal/iec/load_iec.s | 1 + 1 file changed, 1 insertion(+) diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 4175ab41..43a5419a 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -144,6 +144,7 @@ load_iec_get_addr_byte: lda IOSTATUS and #K_STS_EOI bne !+ + lda TBTCNT rts !: pla From 2487d2d5939eb0dd86d556e0527d4eaa00cf4662 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 5 Dec 2019 18:29:34 +0100 Subject: [PATCH 091/105] another fix for JiffyDOS EOI detection --- c64/kernal/iec/iec_rx_byte.s | 2 +- c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/c64/kernal/iec/iec_rx_byte.s b/c64/kernal/iec/iec_rx_byte.s index ac6f807a..5297a4ae 100644 --- a/c64/kernal/iec/iec_rx_byte.s +++ b/c64/kernal/iec/iec_rx_byte.s @@ -124,7 +124,7 @@ iec_rx_clk_wait2: // the next byte. (p11). jsr iec_release_clk_pull_data - // Retreive the received byte + // Retrieve the received byte pla // Restore registers diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s index f7c78ecb..976dfb25 100644 --- a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -80,10 +80,16 @@ iec_rx_byte_jiffydos: // Pull DATA at the end, cycles: 4 stx CIA2_PRA - // Check for EOI (DATA line) - bmi !+ + // If CLK line active - success + bvc iec_rx_byte_jiffydos_end + + // XXX does the DATA line status tell something? jsr kernalstatus_EOI -!: + + // FALLTROUGH + +iec_rx_byte_jiffydos_end: + // Indicate that no byte waits in output buffer lda #$00 sta C3PO From 3cd170d11e1571502e1485701c17eeb5fd0793ac Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 5 Dec 2019 21:45:41 +0100 Subject: [PATCH 092/105] initial optimized LOAD loop for JiffyDOS protocol --- CONFIG.md | 4 +- STATUS.md | 3 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/kernal/iec/load_iec.s | 24 +++++- c64/kernal/iec_fast/load_jiffydos.s | 117 ++++++++++++++++++++++++++++ 12 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 c64/kernal/iec_fast/load_jiffydos.s diff --git a/CONFIG.md b/CONFIG.md index 06cc3736..0572f73d 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -105,9 +105,9 @@ Needs over 1000 bytes in KERNAL segment. If unsure - enable. ### `CONFIG_IEC_JIFFYDOS` -Adds support for JiffyDOS pprotocol to the IEC bus (note, that it currentlyy lacks the optimized LOAD loop, so it will be slower than original JiffyDOS enabled Kernal ROMs). +Adds support for JiffyDOS fast protocol to the IEC bus. -Needs over 320 bytes in KERNAL segment. If unsure - enable. +Needs about 420 bytes in KERNAL segment. If unsure - enable. ### `CONFIG_TAPE_TURBO` diff --git a/STATUS.md b/STATUS.md index 99605adb..fdda84ef 100644 --- a/STATUS.md +++ b/STATUS.md @@ -8,11 +8,12 @@ Here are the features of the Open ROMs not found in the original ROMs from the 8 * pre-defined function keys * uses RAM under ROM and I/O: 61438 bytes free * cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses, configured addresses -* wark start due to BRK prints out the instruction address +* warm start due to BRK prints out the instruction address * extended `LOAD` command * start/end addresses are displayed, in the Final cartridge style * command with just the file name tries to use the last device if it's number seems sane; otherwise uses 8 * secondary address over 255 is considered a start address +* JiffyDOS protocol support * turbo tape load support (as device 7 or using `←L`) * DOS wedge (direct mode only) - `@`, `@`, `@$`, `@$`, `@` diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index a20878cb34d096738e804d0f4ebb2490050232c5..ebdb04d894f151bb2c91f2c443d7aee4f9e8c72f 100644 GIT binary patch delta 168 zcmZp0XmFU|p(*lirM<$X{~4B_s!lI&cJAmyqYHq4CtlasiEfxOAvxu1flc|1BG k>I{!1h+^k80a3QRZH)YzkMPbCWHg-|FJBK5dmyg>07Vu-!vFvP delta 168 zcmZp0XmFU|q51RMN_&M%|1(x8%wMZe_HL0PkX~wa^8W{(Me<jFJH#R@y6E`k%2%Vg6c$pWhZKg6Mz`3IUt1vCU;<`uS~g zDMt`c@d*xNM#g~2e>io4q!yPIkWA$=1xn23Qe)&tGiCAxZV8~&OYU1B6E+{^ohis@ OIyqjx9;oZSydnTFmo>To delta 131 zcmZp0XmHqYh=p3_y5h52h0_Iy~R2%@)tP}sit8rxh(rad1f zmvRIF6`$ZRW@Owx`46WqkksO`0+Oj*ra+0=TxyK`Xr@fQz%2okddYnYWWwg7yfXzE PO(w_7*8_FkmsbP;KW;gJ diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index 4d05189a9c10dc69bd908f7efc8718d552c24e63..fee95438de1c75f133e367dfb52797f163fc1edd 100644 GIT binary patch delta 83 zcmZp0XmHrz$HMaDjZeemAQl~_mv1&Vu$*CHdiQ3sAA2~EJ9#;~0oSc}OE)OodZz&7 hK4f~)j$nAidP;_5NxtbWgsFjoK`mg delta 182 zcmZp0XmFU|q3QO1rM<$X{~46LM9t&T0a0goEI|}IuL+2<HXur zbHC0#_nhDPomZGsnB%<78FH!UM7b2j%H$sR{MTN;B%j zF6})UR*B2y%D%l`N$)=8HMxK9H3=R3kGAN(e?OMOPZhH`f1raOgx;wu>MZU?&nN7i zwcP@;dhv3Sq)ppi6hyVMYd`A|q;S;h!xsm&4=i?chB`U4T^S1aRX>>>p`Ur`^sJM>bp$;hcK*>^FP5d}(EBJp zG-b%!A!WZ_nUy%vE||?&*Dp92%eR8~t(4P#i(e&vC#9;cCbz;@#Ma7=kfp})@w8j< zCm}%~w__97H3Q^H?7GNmxM%{k`>@|nKGQ8UrqEKR*Of|3Uzc2q>1&!^N#9V)CS;Op zx9uI3PpK&lG5z>#BV6B;zV>CslM=Q}SAE8&BJ>wB+d$aUXq8FqDg>u$8s%|&gF zIi)9AvHjLD*7@lS2UmK6ZO$nRcO9eTcM(U}EFYl}@dXf<1&V_pF3%hqB`#hiE)S-r zdK^2ZUN1om>_)W82XRop=zFdd%@3^$_4toihpo%JKt9@`CyY zfXd=Cl_pW5sO_dSgB0tHnh0`1zd*BrwCcZ1IWi!28uz4GI?;tO41;cMCuQ3^LF`w$ z%YQI@&XIjHqhlOV_-+WT@j{NELo)Q_^O-p@OayO4X&KoN)-KCEWmcNG;Nvv|Vi^r{ zL>UEqQ#OeeG%Ook7&QwGOrM@l|Gt#z100l=D_Q3#l!m7PHaLn8_-(&xsAVZ@%f(sn z8V@URj*uXh36Om%I^I>%Y;*JqBf1-U>|Qp`kE9oXVG)WB8kUAHkh17RU6YLV`0;LX zIeLC%gHcLnOO29ZoG&_V-YQ>z1-ARdDx~*8^0EWsSyjT%WRk)!Og=-wk>Fb4xT(?< zaTxu16df2vYh|=$G!0bl;Efp**9r`@=6a)mn&g)Qye(L1vR6_=2_!da4dJ8IT!)qg@WG&RJ=!>m z!Y06NJckcbu)~OJN3G0_D>SC*o0~VT7$r?M#D0|z|BWj4&xl|6%jqCSw0DY~=|PJU zMf(*R2Z#emYzvAm0G%oU?r?G7e^8+>^KQFO@bG2f9)Ysi0)(*r1z8=FtkDx8X3huT z2k=IwY>NS_7V*&?(g->fMERpARavp=9E=H^r7n({_nNE;s%R)t_nC2vA9xq#6L-u! zL;S#$0x9zIL z;f=v&2ImIsmCXjYd3{j4TD6T8zpmQJims~t?9HM|NMQw+SmOtv{LI80i(N?oe1^tG zC0)KaJ6iMRLEwIm4zy+rA+2&|UO!$R602b5JwN`9U+m=L+PnEMu%#QN4cWV0Jq*u* zL{{lOFrtoeNJ4F&W3n`?4^51tD??TupK9#6aN`P~~&DA61qd9+h+nNec<0DI?pjg94IvA=2oPwz}LcdiC@4qN% z`)zpZhXe8+ z8b%w)bM4$E`2#1JUK^{Fl-DKqLpoJb=0QnGo+>GkYDw9%x(>fdP8iEm4#~CmKv%h3 z+bQw(ZkpNN4cCbOQqvQZzLhXHaf7eUfy(ay`2sDTw+uM~mSHGp>AHIN7IHA*x0-6w zm5{dFJbD=3RThpG%kV`zl+3f~B%N48IW#&f+CQ||o#Bv?xKm}WJ$|%$%4GFCRQM%6Pt=Dg5 zXCUbXp-FkLv?=+RQdWDClU4vc(m{ce57Z!D0^o>^7`p3<)S^h|_*=FN*n+tb$St<{ z%6&^xj0TlM6eih2Hl@r-oM!!FqqdOBTsmO5G$3E#eo6{c;?oQ=PMyT`G5%}-pPaze zGXBzs*#V$md~^_(1n>hHuaxmS=CS$vB7KYwJ`$2ET4S% H6ZiDLfZ0&n delta 2762 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 delta 2022 zcmZ8ieQZ-f+>R3X2dsxZSB}!QF`%8jq^|^S5oaLFxV%4wB;dsO4YQ*MNKmdBa_Z#Ze}$cvG}Xt@hS9+ zujGFUbMmY(-`CFgt+C{{_?wmWyU>;#x?o6yX4-AJ(6VyckOmYMT{7U(60y8C6Cal; zXvxGs0b3?MMoew9@egEv`HsV|JrhrYbY18-#c?U2*rXw$Um6yU!|f%g)#8VtcPV}l zPAy6O{u-rZPY}+03;&&ucRU=5NuB;i^$T$3mUI6&XF6C-t3vak5URS)+dEP5v^1(T zUigq}kUmz{LfF6`6mHpJRtRm+@H}PXT;L0A+7s*w!h!5g7*#t9VN4}o*q4QIRkSKr zsaIuTbw-MA6{7J%h-J~U)6kQJm(%8%m(wZki|t~rkGjIyQi>j6QMZmd@Ncd4t~d2| zY9i66w_7hIPU`p36N;Tw(Vf6aYhB$1^%gM%rFnI8BnQ+@(VARP$@%0hwUnM1$*JzM zIi)sYy}W=OHn%T-TwNnK3g`Jgdct28VJ~MiwV;jD`2?*Ca|w$s%qJG{Gd909uA#_{ z#4-H3t=Z9}k#=CFrGsEnL) z(d1GzmXm>qh+FjWVs0Nb!J8Gznlg~(BSmf8A`hi${CjSrEo|(JMvfkl@E`}4S`F2t z@uLne)1=`S9hFaBQ_X6Rs-lDV)^TMiMT2RB;6U&pJEB#lf^bdEZyKRr1tadfTGW<5 z7eYe>q5nV(CmmjEz63!HPdWnYCyhPul15&BKuhdk)UxIJgqKEGl|_3^o6sFP7IN`K zppS6lii+U>xj2_y#xp-~Ifx#bF&)NCa*}-#KV{ef9hfD_;yx0U81X+=)b0vr2#daB z%o?+g31e=_w8@w$lQCD9O_${tml>lFdPH4tNFx-M`1%F`sas}+gFN0`Uh>SO5$#gBwnP(i{%wUt?-^$)v~4!pb+(Ay zd(e>H?rvhF!R{T5l<0nixwyNF1k2a(=Q+|MKX_oH5S4R6FS>oQr@Wjlo-}8}^Jc%* z;dd$mu5($qtOcd0zbuv<$t!B`=zbW*Y~?0v2cgLo7{`xQcCQQ@yN|!oA3H@0!>1@= zsQCdF?!>}#m1|eEXd%@Z6qyJEB~u|X5A@IotysiIp#?u!B{78H6IGsyox3A%91+Cr zJbCSB!np80+G^lw&g&V?qTi&Y!4XDbR>E)BiXvZY5rZL zeML)>ZN2iQs<0_#&TItu#vpi_01xAPocGZk_&Mh`>mlv>e&o<`%(=#UTPHOqDDdV` zvF!x%bke@0iC@q9$Xxi^dC%Ri>Y-z>aTZM)`|JDtssqB_n>XyPM|B&Ys8 z!PPsz2b93&?m*$k?H!Cfg@58+cNgjRCdSUgnHd87Ui=sLy?Dan!~O0Tn7sxrTG?SQ zO&=XsS@UNku57@oSFNWn;-^>nEd*D%hIg%cup+<`UYd`PX`wgNUa1i3VW_^ygf)D# zdISCW$!gCA+FWh(KK6aaf$RBLN3qMr@Whp~S5E_xdDT6Qx|G5S{F%A808tq*~8`H?H zBW9YE5xq8p+GbHe!-F-eYcunxD&6d3o9o!-b!04L(2$CXrXmv}#Z#1LadJUh{2w{B B=-L1P diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 2ad0274c7fb17b286f8f0fb65ec2b87f8b52a925..316e81590c0694e574be99f131187b052096511c 100644 GIT binary patch delta 2346 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 delta 2293 zcmZuzeNYtV8QjEg9vp^VlF2%X(qIJi4(<@)SFI{BkF zJJ0*u_kExD<9U9+XU|jVsjOS&+Ni6qz^$0O8BU#pH+AJ1Y}t!}n3<{+#^Kp=NcF-- zz5Z7}LGVf$$aoVEwzc=PP}U-93zeNQNj{i7tKmszI92&_h-`y`^M@7k{4zz zu-=R#_-YVbCiyrdk&PzJPD)Ncd^9WnWM;kKInppY?H6x%T|asBhcExz{O7&B_iqco z{#wVMVT3{h_|t>I(Fi@2SUzVm%z9Q17s)+j$1v-0?nDG7PpFZ&yl|wLEAX zw4QN0YzcyI2GI9s0ly_kkIee*vJ1Kzlh3Gc$v!v`^b2G(C`nwU$8-6z$3xb{h$GBe zVbCDeF}DS1EZezvz3K193;1tgk7oG)rb^S^S79{hZ-a|N@_EZ#U@ck_yCR=wSLF*Z zJO$ml{}gzp{3qb^DR$mfsHGmP0woA~*nh;`%<5c~W*<0W(;L1Nv*z2aUd<-C-Q?LJ zM&pPE>}ACjhRS*89p`S>ice}owFzDi>pIa$En6%KQ zP=8W|gB^z~!!H0o#7@K!nb0M;Px<7x=1zv8%Y;^gjE+jM&B|C|IQfB*km+y)RtVi*c|{f(y_k-Po#M{^GkG4 z68h6jGqqEULgy&Dkv|T%EijwgvP>FDuCRSUm#3_-X_wq7AMn(h@-DrfnzRA0nnrHL zR6ygMs}xDFc7VJy3>gD%ojc2$yi!dn4AzQ#5!9H(>Li$9#VgjWkEK=oz&j~MTzhf< zBz7iXGZTu)(P$AVpY-*%+~Y(+tu9udm+wditBzH{9vxbBv}ARVrlh~Hw~94r_Q3|H zTmD3H!a8HHft)i~mzK$HYH4`D8}d!~B7!lxVeO0Ah-)OdQubNQBnN`cn5KiMBK1L> zX0XEm%$BuRQVkr4!j34^=um|RS{)4J)nx=K>(T?;{K8I;6!7>dOV6IOIOuMI zj2kw%o7~Nq#a8-t`s(b;C?q_^z=;C+Q4rU1lH>H*jGyNGKB~m9dy#1G)FMSVW-U(- zXOzxcXOP7v66Sy8FuxVg4uke(lq1J-#FYZnhvXrUvICyZ8R7V=pJ-JY5A9NrIa`NoKn89!169tl>4VRsbX zvqluV%2h!P{WKH!-BJ42%zV2=Z(=j(!^{;KE-R!P##(mpW(LNWF3eiK_B(x!X$7ce zKrjWe+L|YyAZ241CNe+#-JAgFH^621i*Smy(5G21N>~gAtYYv0WxH?8e^1>$9SseY z@3Zoa>W{Z@Y0Aqf*Wh!0=KZTF%|xdOJ?^RgzdCg&p&urOpk~}F!pq}y zS*~NDJdUXT+PX%$5%3IS_}2WWQ4>huG3j}XL~H{xPT$KdDkbC3wXrtT#e}59yaMbR zuhpJ(Y7+>QWONJg=A@T<)TSBu(y4_d`q}J)l+h5RThT8Yy3{_q#Kxx^G@7${cDFur zNV4pS>N$Rovx@cGbAE>(i@rGp^vB||#HuG)%4v&O`NjeL>|IPoqkgtW6MemAX?rg+ zgWZW2dqlpT>vzoD+K!9ewe{T{7elr6p^oc!v>*;OsZihD-h;G4kyW@NF8uj;a9;OuxW|PJ64(ei{oY6VH$B1ZP^yBLAKS+f)A&#g-sUE z6uV|;XG{UU3^Lya+2@~y{3Gpg{h{V@&K|u}?AsidjhNJ_MN2G6p=xU4b>Sn!qUdMY zi@z`XMn;Oc{=-~1gJCoHDEd*}$SnlzgKrZrq$AoCc8-U2AAFccSt1dF2GOko!=PV78E zbJapuEOb)5p_JehBE%41!T%oUT3lF`cR_D?pASgdEbFs*dMt6eYT?HQtHU1(i$!J- zehAA4**8WsgJ8Z3=P#%Yk)!&qB4O7eVOOz0YE80LCn*Eozbl-?aVw@C{zn-3FBddo A2><{9 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 29bd3da43d16888aaeaef217240caf63fd36a7a1..97670f04b4222293176aeeef0c36b98a38994ea3 100644 GIT binary patch delta 2669 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 Date: Thu, 5 Dec 2019 22:16:58 +0100 Subject: [PATCH 093/105] improved JiffyDOS optimized LOAD loop --- CONFIG.md | 6 ++-- c64/kernal/iec/load_iec.s | 2 +- c64/kernal/iec_fast/load_jiffydos.s | 43 ++++++++++++++++++----------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 0572f73d..7b75bcd1 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -91,9 +91,9 @@ Planned for the future - not available yet. ### `CONFIG_MEMORY_MODEL_60K` -Uses RAM under BASIC, I/O and KERNAL, takes over `$C000`-`$CFFF` area requires special helper routines installed in `$2A7`-`$2FF` area (normally unused and free for the user). Gives the most free memory for BASIC programs, but it's the slowest and the least compatible model. +Uses RAM under BASIC, I/O and KERNAL, takes over `$C000`-`$CFFF` area requires special helper routines installed in `$2A7`-`$2FF` area (normally unused and free for the user). Gives the most free memory for BASIC programs, but it's the slowest (for example, forces disabling optimized LOAD loop for JiffyDOS) and the least compatible model. -Comparing to standard memoryy model, it needs about 180 bytes in BASIC segment and 80 bytes in KERNAL segment - at the moment of doing the test, these values are expected to change often. +Comparing to standard memory model, it needs about 180 bytes in BASIC segment and 80 bytes in KERNAL segment - at the moment of doing the test, these values are expected to change often. ## I/O devices @@ -107,7 +107,7 @@ Needs over 1000 bytes in KERNAL segment. If unsure - enable. Adds support for JiffyDOS fast protocol to the IEC bus. -Needs about 420 bytes in KERNAL segment. If unsure - enable. +Needs about 430 bytes in KERNAL segment. If unsure - enable. ### `CONFIG_TAPE_TURBO` diff --git a/c64/kernal/iec/load_iec.s b/c64/kernal/iec/load_iec.s index 6379aefd..0ab544ff 100644 --- a/c64/kernal/iec/load_iec.s +++ b/c64/kernal/iec/load_iec.s @@ -87,7 +87,7 @@ load_iec: // Display start address jsr lvs_display_loading_verifying -#if CONFIG_IEC_JIFFYDOS +#if CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K // If feasible, use JiffyDOS optimized LOAD loop diff --git a/c64/kernal/iec_fast/load_jiffydos.s b/c64/kernal/iec_fast/load_jiffydos.s index e9b858cd..f24bdd42 100644 --- a/c64/kernal/iec_fast/load_jiffydos.s +++ b/c64/kernal/iec_fast/load_jiffydos.s @@ -4,10 +4,14 @@ // -#if CONFIG_IEC_JIFFYDOS +#if CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K - // XXX add RUN/STOP support +// Note: original JiffyDOS LOAD loop checks for RUN/STOP key every time a sector is read. +// For simplicity and some space savings, our routine does not check the RUN/STOP key at all; +// the protocol is fast enough (especiallyy with modern flash mediums) that probably nobody +// will want to terminate the loading. + load_jiffydos: @@ -18,10 +22,8 @@ load_jiffydos: jsr jiffydos_prepare sta TBTCNT - // XXX For the first iteration load the whole sector minus 2 bytes - // XXX (as they are used to store the start address) - // XXX ldy #$FB - ldy #$00 + // A trick to shorten EAL update time + ldy #$FF // FALLTROUGH @@ -55,8 +57,8 @@ load_jiffydos_loop: lsr lsr - // Wait for the drive, cycles: 2 - nop + // Wait for the drive - we have time to increment offset, cycles: 2 + iny // Get bits, cycles: 4 + 2 + 2 = 8 ora CIA2_PRA // bits 2 and 3 on CLK/DATA @@ -74,7 +76,7 @@ load_jiffydos_loop: eor CIA2_PRA // bits 6 and 7 on CLK/DATA // Store retrieved byte, cycles: 6 - sta (EAL),y + sta (EAL),y // not compatible with CONFIG_MEMORY_MODEL_60K // Retrieve status bits, cycles: 4 bit CIA2_PRA @@ -85,16 +87,25 @@ load_jiffydos_loop: // If CLK line not active - this was the last byte bvs load_jiffydos_end - // Advance pointer to data XXX use INY instead, advance once per sector only - jsr lvs_advance_EAL - - jmp load_jiffydos_loop + // Handle EAL + cpy #$FF + bne load_jiffydos_loop + inc EAL+1 + jmp load_jiffydos_loop load_jiffydos_end: - // Save last byyte + // Save last byte tax + // Update EAL + tya + sec + adc EAL+0 + sta EAL+0 + bcc !+ + inc EAL+1 +!: // Indicate that no byte waits in output buffer lda #$00 sta C3PO @@ -107,11 +118,11 @@ load_jiffydos_end: lda TBTCNT sta VIC_SPENA - // Store last byte as unoptimized LOAD would + // Store last byte as unoptimized LOAD routine would stx TBTCNT // End of load loop jmp load_iec_loop_end -#endif // CONFIG_IEC_JIFFYDOS +#endif // CONFIG_IEC_JIFFYDOS and not CONFIG_MEMORY_MODEL_60K From 8240b8f4f5caad0c49f92cb48aedbb50870e6fcd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 6 Dec 2019 18:16:01 +0100 Subject: [PATCH 094/105] more work on JiffyDOS LOAD loop --- STATUS.md | 2 +- c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 2 +- c64/kernal/iec_fast/load_jiffydos.s | 60 ++++++++++++++++++++-- 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/STATUS.md b/STATUS.md index fdda84ef..ba80d598 100644 --- a/STATUS.md +++ b/STATUS.md @@ -60,7 +60,7 @@ The following ROM features are currently missing: | Driver | Status | Remarks | | :-----------------: | :------: | :------------------------------------------------: | | standard protocol | DONE | | -| JiffyDOS | NOT DONE | work in progress, not functional yet | +| JiffyDOS | PARTIAL | needs more optimizations, SD2IEC not tested yet | | DolphinDOS serial | NOT DONE | | | DolphinDOS parallel | NOT DONE | | | CIA burst mod | NOT DONE | | diff --git a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s index 976dfb25..3b66a005 100644 --- a/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_rx_byte_jiffydos.s @@ -20,7 +20,7 @@ iec_rx_byte_jiffydos: jsr jiffydos_prepare pha - // Wait until device is ready to send + // Wait until device is ready to send (releases CLK) jsr iec_wait_for_clk_release // Prepare 'start sending' message diff --git a/c64/kernal/iec_fast/load_jiffydos.s b/c64/kernal/iec_fast/load_jiffydos.s index f24bdd42..c3c2a1b6 100644 --- a/c64/kernal/iec_fast/load_jiffydos.s +++ b/c64/kernal/iec_fast/load_jiffydos.s @@ -3,11 +3,14 @@ // JiffyDOS protocol support for IEC - optimized load loop // +// XXX does not work yet #define CONFIG_IEC_BLANK_SCREEN #if CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K -// Note: original JiffyDOS LOAD loop checks for RUN/STOP key every time a sector is read. +// Note: original JiffyDOS LOAD loop checks for RUN/STOP key every time a sector is read, +// see description at https://sites.google.com/site/h2obsession/CBM/C128/JiffySoft128 +// // For simplicity and some space savings, our routine does not check the RUN/STOP key at all; // the protocol is fast enough (especiallyy with modern flash mediums) that probably nobody // will want to terminate the loading. @@ -18,10 +21,35 @@ load_jiffydos: // Timing is critical, do not allow interrupts sei +#if CONFIG_IEC_BLANK_SCREEN + + // Blank screen to make sure no sprite/badline will interrupt + lda VIC_SCROLY + sta TBTCNT + and #($FF - $10) + sta VIC_SCROLY + + // Only the next screen is badline-free +!: + lda VIC_SCROLY // wait for lower part of screen + bpl !- +!: + lda VIC_SCROLY // wait for screen start + bmi !- + + // Preserve 3 lowest bits of CIA2_PRA XXX deduplicate this + lda CIA2_PRA + and #%00000111 + sta C3PO + +#else + // Store previous sprite status in temporary variable jsr jiffydos_prepare sta TBTCNT +#endif + // A trick to shorten EAL update time ldy #$FF @@ -29,8 +57,17 @@ load_jiffydos: load_jiffydos_loop: - // Wait until device is ready to send - jsr iec_wait_for_clk_release + // Wait until device is ready to send (releases CLK) + jsr iec_wait_for_clk_release // XXX consider inlining this + +#if CONFIG_IEC_BLANK_SCREEN + + // Ask device to start sending bits + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_DAT_OUT // release + sta CIA2_PRA + +#else // Prepare 'start sending' message lda CIA2_PRA @@ -38,11 +75,13 @@ load_jiffydos_loop: tax // Wait for appropriate moment - jsr jiffydos_wait_line // XXX try to inline this, maybe one raster is enough? + jsr jiffydos_wait_line // Ask device to start sending bits stx CIA2_PRA // cycles: 4 +#endif + // Prepare 'data pull' byte, cycles: 3 + 2 + 2 = 7 lda C3PO ora #BIT_CIA2_PRA_DAT_OUT // pull @@ -114,13 +153,26 @@ load_jiffydos_end: lda #$01 sta IECPROTO +#if CONFIG_IEC_BLANK_SCREEN + + // Restore screen state + lda TBTCNT + sta VIC_SCROLY + +#else + // Re-enable sprites lda TBTCNT sta VIC_SPENA +#endif + // Store last byte as unoptimized LOAD routine would stx TBTCNT + // No need to re-enable interrupts; other IEC routines + // called by LOAD will do this nevertheless + // End of load loop jmp load_iec_loop_end From aad50ee979b48b0314d9e637ea1d035f1d06c014 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 6 Dec 2019 18:21:01 +0100 Subject: [PATCH 095/105] small IEC code size optimization --- c64/kernal/iec/iec_wait_for_clk_release.s | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/c64/kernal/iec/iec_wait_for_clk_release.s b/c64/kernal/iec/iec_wait_for_clk_release.s index 2464cd16..25a65bd8 100644 --- a/c64/kernal/iec/iec_wait_for_clk_release.s +++ b/c64/kernal/iec/iec_wait_for_clk_release.s @@ -5,9 +5,8 @@ iec_wait_for_clk_release: - lda CIA2_PRA - and #BIT_CIA2_PRA_CLK_IN - beq iec_wait_for_clk_release + bit CIA2_PRA + bvc iec_wait_for_clk_release rts From 430682d9c7687475418a7a1e321f636387e21964 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 6 Dec 2019 18:42:06 +0100 Subject: [PATCH 096/105] common screen visibilityy handling for Turbo Tape and JiffyDOS --- c64/kernal/iec_fast/load_jiffydos.s | 16 +++++----------- c64/kernal/screen/screen_blank.s | 28 ---------------------------- c64/kernal/screen/screen_off.s | 28 ++++++++++++++++++++++++++++ c64/kernal/screen/screen_on.s | 18 ++++++++++++++++++ c64/kernal/tape/tape_common.s | 20 ++++++++++---------- 5 files changed, 61 insertions(+), 49 deletions(-) delete mode 100644 c64/kernal/screen/screen_blank.s create mode 100644 c64/kernal/screen/screen_off.s create mode 100644 c64/kernal/screen/screen_on.s diff --git a/c64/kernal/iec_fast/load_jiffydos.s b/c64/kernal/iec_fast/load_jiffydos.s index c3c2a1b6..f402329f 100644 --- a/c64/kernal/iec_fast/load_jiffydos.s +++ b/c64/kernal/iec_fast/load_jiffydos.s @@ -23,21 +23,15 @@ load_jiffydos: #if CONFIG_IEC_BLANK_SCREEN - // Blank screen to make sure no sprite/badline will interrupt + // Preserve register with screen status (blank/visibe) lda VIC_SCROLY sta TBTCNT - and #($FF - $10) - sta VIC_SCROLY - // Only the next screen is badline-free -!: - lda VIC_SCROLY // wait for lower part of screen - bpl !- -!: - lda VIC_SCROLY // wait for screen start - bmi !- + // Blank screen to make sure no sprite/badline will interrupt + jsr screen_off // Preserve 3 lowest bits of CIA2_PRA XXX deduplicate this + lda CIA2_PRA and #%00000111 sta C3PO @@ -58,7 +52,7 @@ load_jiffydos: load_jiffydos_loop: // Wait until device is ready to send (releases CLK) - jsr iec_wait_for_clk_release // XXX consider inlining this + jsr iec_wait_for_clk_release #if CONFIG_IEC_BLANK_SCREEN diff --git a/c64/kernal/screen/screen_blank.s b/c64/kernal/screen/screen_blank.s deleted file mode 100644 index a0c89883..00000000 --- a/c64/kernal/screen/screen_blank.s +++ /dev/null @@ -1,28 +0,0 @@ - -// -// Helper routines to blank/show screen -// - - -#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO - - -screen_blank: - - lda VIC_SCROLY - and #($FF - $10) - sta VIC_SCROLY - - rts - - -screen_show: - - lda VIC_SCROLY - ora #$10 - sta VIC_SCROLY - - rts - - -#endif diff --git a/c64/kernal/screen/screen_off.s b/c64/kernal/screen/screen_off.s new file mode 100644 index 00000000..cd9a0265 --- /dev/null +++ b/c64/kernal/screen/screen_off.s @@ -0,0 +1,28 @@ + +// +// Helper routine to blank screen +// + + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO || (CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K) + + +screen_off: + + lda VIC_SCROLY + and #($FF - $10) + sta VIC_SCROLY + + // To be sure there are no badlines we have to wait till the next screen, + // as the bit is checked by VIC-II at the start of the frame only +!: + lda VIC_SCROLY // wait for lower part of screen + bpl !- +!: + lda VIC_SCROLY // wait for screen start + bmi !- + + rts + + +#endif diff --git a/c64/kernal/screen/screen_on.s b/c64/kernal/screen/screen_on.s new file mode 100644 index 00000000..4742321b --- /dev/null +++ b/c64/kernal/screen/screen_on.s @@ -0,0 +1,18 @@ + +// +// Helper routine to show screen +// + + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + +screen_on: + + lda VIC_SCROLY + ora #$10 + sta VIC_SCROLY + + rts + +#endif diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 55f43a62..92e4b9d2 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -58,20 +58,20 @@ tape_motor_on: // store/restore screen color // -tape_screen_show_motor_off: +tape_screen_on_motor_off: jsr tape_motor_off lda COLSTORE sta VIC_EXTCOL - jmp screen_show + jmp screen_on -tape_screen_hide_motor_on: +tape_screen_off_motor_on: lda VIC_EXTCOL sta COLSTORE - jsr screen_blank + jsr screen_off jmp tape_motor_on @@ -124,7 +124,7 @@ tape_wait_play_done: sta CAS1 // set the interlock jsr print_return - jmp tape_screen_hide_motor_on + jmp tape_screen_off_motor_on // @@ -133,7 +133,7 @@ tape_wait_play_done: tape_handle_header: - jsr tape_screen_show_motor_off + jsr tape_screen_on_motor_off // Print FOUND + file name @@ -220,7 +220,7 @@ tape_handle_header_displayed: // Load the file - jsr tape_screen_hide_motor_on + jsr tape_screen_off_motor_on // FALLTROUGH @@ -234,7 +234,7 @@ tape_handle_header_skip: // Skip this file jsr print_return - jsr tape_screen_hide_motor_on + jsr tape_screen_off_motor_on // FALLTROUGH @@ -317,7 +317,7 @@ tape_header_wait_stop: tape_load_success: - jsr tape_screen_show_motor_off + jsr tape_screen_on_motor_off jsr lvs_display_done cli @@ -325,7 +325,7 @@ tape_load_success: tape_load_error: - jsr tape_screen_show_motor_off + jsr tape_screen_on_motor_off cli jmp lvs_load_verify_error From d77887041f75c02bd4cfe4491fd6425136a85ef2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 6 Dec 2019 19:20:38 +0100 Subject: [PATCH 097/105] minor JiffyDOS improovements --- c64/kernal/iec_fast/load_jiffydos.s | 17 +++++++---------- c64/kernal/screen/screen_off.s | 4 ++-- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/c64/kernal/iec_fast/load_jiffydos.s b/c64/kernal/iec_fast/load_jiffydos.s index f402329f..51bf3bf3 100644 --- a/c64/kernal/iec_fast/load_jiffydos.s +++ b/c64/kernal/iec_fast/load_jiffydos.s @@ -3,7 +3,8 @@ // JiffyDOS protocol support for IEC - optimized load loop // -// XXX does not work yet #define CONFIG_IEC_BLANK_SCREEN +// XXX option does not work yet +// #define CONFIG_IEC_BLANK_SCREEN #if CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K @@ -54,24 +55,20 @@ load_jiffydos_loop: // Wait until device is ready to send (releases CLK) jsr iec_wait_for_clk_release + // Prepare 'start sending' message + lda CIA2_PRA + and #$FF - BIT_CIA2_PRA_DAT_OUT // release + #if CONFIG_IEC_BLANK_SCREEN // Ask device to start sending bits - lda CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release sta CIA2_PRA #else - // Prepare 'start sending' message - lda CIA2_PRA - and #$FF - BIT_CIA2_PRA_DAT_OUT // release + // Wait for appropriate moment, ask device to start sending bits tax - - // Wait for appropriate moment jsr jiffydos_wait_line - - // Ask device to start sending bits stx CIA2_PRA // cycles: 4 #endif diff --git a/c64/kernal/screen/screen_off.s b/c64/kernal/screen/screen_off.s index cd9a0265..c8f811d8 100644 --- a/c64/kernal/screen/screen_off.s +++ b/c64/kernal/screen/screen_off.s @@ -16,10 +16,10 @@ screen_off: // To be sure there are no badlines we have to wait till the next screen, // as the bit is checked by VIC-II at the start of the frame only !: - lda VIC_SCROLY // wait for lower part of screen + lda VIC_SCROLY // wait for higher part of screen bpl !- !: - lda VIC_SCROLY // wait for screen start + lda VIC_SCROLY // wait for lower part of the screen bmi !- rts From 899b2e748f3147b4f32c5000fbd54eee82203bdd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 6 Dec 2019 20:18:43 +0100 Subject: [PATCH 098/105] JiffyDOS NTSC fixes and screen blanking for transfer speedup --- CONFIG.md | 4 ++++ bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/,,config_generic.s | 1 + c64/,,config_mega65.s | 1 + c64/,,config_testing.s | 1 + c64/,,config_ultimate64.s | 1 + c64/kernal/iec/iec_wait1ms.s | 2 ++ c64/kernal/iec_fast/load_jiffydos.s | 13 ++++++++----- 15 files changed, 18 insertions(+), 5 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 7b75bcd1..3df98c2d 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -103,6 +103,10 @@ Adds support for the IEEC bus - for serial printers, disk drives, etc. Needs over 1000 bytes in KERNAL segment. If unsure - enable. +### `CONFIG_IEC_BLANK_SCREEN` + +Causes screen blanking during some IEC operations (currently only JiffyDOS file loading) to increase the data transfer performance. + ### `CONFIG_IEC_JIFFYDOS` Adds support for JiffyDOS fast protocol to the IEC bus. diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index ebdb04d894f151bb2c91f2c443d7aee4f9e8c72f..b05583c6af43dc061fc9a55c7a73f2b4df5f570a 100644 GIT binary patch delta 169 zcmZp0XmFU|q50+QN_&M%|1(x8%wMbU{_P?~AidP;I{!1h+^k80a3QRZ9tWqkMhnGWHg-|FJBK5d?2p?0EYiUvH$=8 diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index fdf8a5e2135abc1073ba649b979f3ed06ec4c43a..402d2cb264d9ed5fc1ca5fd55ce4a15f2eec5f48 100644 GIT binary patch delta 131 zcmZp0XmHqYh=oyo^I?`>jFRdfR@y6E`k%2%Vg6bLoezr?LA3e@1@+C>*yb`a>3o=6 z$`J%qe1gN6kx_l}A5L8$sl{alBvZLeffBR1)EN2EOqqOvTLLKclKU3Ogw02JX9_Z! OO^%nZ2kN>nuLuC<2QY&G delta 131 zcmZp0XmHqYh=nm=^I?`>jFJH#R@y6E`k%2%Vg6c$pWhZKg6Mz`3IUt1vCU;<`uS~g zDMt`c@d*xNM#g~2e>io4q!yPIkWA$=1xn23Qe)&tGiCAxZV8~&OYU1B6E+{^ohis@ OIyqjx9;oZSydnTFmo>To diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index fee95438de1c75f133e367dfb52797f163fc1edd..9159e416f16f58b681e068e814b29acad1a2da04 100644 GIT binary patch delta 83 zcmZp0XmHrz$HL~)j$nAidP;_5NxtbWgsFjoK`mg diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index c5e7be09c7d1e6eed87a2cdcd68d709468b981ae..16b3cd5e362d5211ba5ca01ecb09687fde7599ec 100644 GIT binary patch delta 2302 zcmZ8ieNa@_6@MSVvLNtQ(Or;*YXjo~nk%iAmwgV;$?7`JM6qKnDF+pYv3)E-JZ9kAJc!% zJ@@O}bI$K~&fT+O&x-J0`K(1$4x>dBy&NXJ{BX(QS68omwTfXx5kF9vg8|F)Y;{_j z{2;xTrupz*@>N<5TSn~Zj@qB;=(yItgXIiZy<9rW>}8X@I6@e#KM14MB`!dgN%9A*P|$;g^!}s ziLe)4NXX~QOVnuxU1-f18XgVrbDxtN%U94R$eNro`TZmc5jo?-X~#7sDYYser7Y!{ z>P&~=#w7ZTG?*N=bn0cEwr5lCYihfN&S#&h=8%^wu#)Shid7$I-@t-P9;M6uNi;qd zFkM@!!TD>IS`PcPJ4p*Vl4_~n^mwVJntit2E44OU`obeboOySJ2OUY8i9R6nGjFg~ z63MhRY|zmwhI4zP;cpZc*+;_t2x5Icwe(ooG?ipkz99u|Xih}FIW?ls6Mp96t?wq+ z6KV`@^k}JT%9p82fJgm2&DQg-TWL-I&i}0l2wXscd66J0ke(MBE)ab&#O+L zuLtBFsaw7$-9=7v%k1E)6PJd~I$vpS#My)Xf`CI*5WbgGazLO}{do5vTCaihXL*E4 zaURq6_5`WOolVx|uF4BpRI}iz|DKW&JQDvZ?Z zZgZc*YjvM1=%ZPl_Kh66mBibqyA3Uj;mvx=w`FmZHW_021RlRj!Hx}|i2Iq&%hYo5 z_g$TrZ7N#>sLhFBAH_YIzsxwA?NN2PRmfHtnvSfR!b+{;{+dNc7E~{(nq4{Hn?t@3 zs>{~uayt+Q0A344O7Vf%f8eH5?BVfp;em4r$*Vsn$(i=2Lx~vB-*J%494_L-N5tzELf*3 z)Q$a*g_C%3)VT1D(Vt-7cuqGXd@Pm?kB1%biV^0i>7~WMM@Wa=0HNF@HAD5LVk&<& zgz_i7jOdT8^9k^ z2Azn&MvKBrCq&OBpU)SX;EgL!cYReW* zZg1Jab?x`b=;~C2?1&A>{@-v`NI|1r;oX-`&zQmHZiY_TZ32_dZ_$u;=@0o%)?}=~ zgnT=*Y>74ErdC&g^K)ogzuN`<-VMc-9@vVkkpOcTsV{`dKn9FMDup7H9!S05@gee~ zS#4HGj#()G!proD1AaAQ;Eb9+5Ws6liFH=Sxc3OB=wzw&80#cG*4ZG3t>0sp62Uez z7usERs@>JS(S|F?LR-`8>$S7Jl*fCuv-edY_=r~Bd4!x1`Jr?l?-~Rxc)#-@E%bC< z?C~`9bX|;jnqpm@57h|to`kKCT}TQFHnWGwFAE$SH^%FMpp6;GqQQvXF{l|ZsV2FV z@+eH@;94md&H&2d&Qy^?CxA0`K+Gra1(Fbyka<_toks29b+kTJksn2X)#UBMO5!NY zS-4IAH@a@`Ocgj?-^kr*O&x@~hqH39Jn!7K+LS_FXPc3g3{9^oS_hv+A9y1-<9*|z z{IdIr8kb|;9W)C$FNF##+4tceW6elSliBiT5-Xy=O~|LbNX4IMA*4#DfRXt5L_O>Z z)E-y_7%7ausD*jp5yrp!$l8rfH44=0fS(&jC(z(T;D_MAf}#&O_{xtKm9cBcl_DoM zrjends(d>IvX@7Ir7#K;AeKRt+<8xQr4j&EYl}VbWAzpnF9HsggOdgYX_kBe*d?FGAZ{Ak4MRIE z{3YOoBbZNuej_jkJgqD#$VyeWQRDBEw@U2!yW%NiDg+ZW90wp{G}VR@o1=dimnATL zfqylK4^86VYIt7+bA!+p@!lx*#PDqm+cjKDu9w(L>ovSp+wS1ESMb~C@i=V^4-Mn2 Se*e<|BQnepcTG)PfNgvbu z$GP8meXrl|`_7RKM>YgM70uO54x(y?vJ^5dKFVMB!sbmclyjUU;jsXB!e^UGrD;9# zSn@ba>cDN}%cM$vEpa3lRUgw(w=!@*2usv}CRBVel04=1qcbchqFwq_!mH;=W{N4} zGr%EAGaU>$tw*9q#bqYm!IC+tiY$Lq&@lV)n=tt#2X{HJc2jH z@peuANY`8)cP$B3ntX+dcpq71$g~An@D40{qQO4}B;7EnGOSs<`6&u1!BgnMVz33h zzbIcS&ZlW7oM^`r^yqQ$H?Cf}wRi)&hqB{KDt{D5AtD>zO6yhvad%hX7YR)kW3BNV z+*m-vq{&!h&u1;%#6Tfyd65p3vgi2;YU*nda>~hdW67&c${Z{><;U#D-Z(O8KI66B z3Y@>TRY~V3!f}=}7^ekZ-O?DxL5w9uB;#fdm&B(Xi zVfl`G1Z^QVOhtlY;qoJsCK9h16?$`gMUtr%r_Kftz7r3m!+>6$#*MS6UV+hT_E;B) zHDjf*kDG+F$4E&=6*-!bnH^G`ayv_^MDN915^S2R#eZ$#CW$vAD?bv$2j_i1>+2Sn z;H$ih} zK%-!W8fV(=F866k&(=&k_N#IyGO0jQVOBnyknkMowG`%^VUQunnRLS0;Y?{jzmK7V zF;u0X?O<*{d1U$3&VD7px!YYmu3lWDbvXSU%LT7n%53?|91GxrUE<_UsE5N}K@en*ZTV~9DmYxO_-tUf#A+F#Pf)#v8e^zX z-|-m(oD z%(9fT`_o~O>E#M*?#_fiFaW1uM2#B6pike_^kn>>hU_H`4Nv|@!&&@;h<;&@-dA8B z%++Wngil9P!FaF;tmt8$Ush0Z%-ej??b|6evRmbzzRVw1G+8~Fk zqyCOTGdT0QCSUEW5#*0L_X_er=K&#ftOKekktTlL4$S*^&D{q!-^`ros^!|x`%eR&47 zt<*%@s@>Rwe@F`KZ74@Y{(w=a>9Bav-Ou#uaM-XIl-ZRDnO*qf^yqq(-@mi7571 z_P^ow2Ms`BJesJ++Ijs%6d&NS3MQ3 zmgN-q-2gms`@LLZzqF$5(i(2^BsY1`0FMRU_O$ok$7Mg9Z}#Jk8A<*+e2>QDXn2sB z(U!}7D@yrY@DlMRM3ZE`_`aK$(BGcP=UWiPXBYYqb)QFV3wY{T1MFIv!?z9~3~=7u zPHxO&efsTFG@x(N2)H%~Z!eBKL$l9(ucHc5k^7bakMXJ8LVgFinp-9;Q^~{J@~rjD z%Qp=CTIj47LVrFk(65Jwcaj$!du=vathU&w)Muk6t1gf($0ng)ArBmQWy83$&n~9t zh%CufXBS=gwMAzlN1(Mj&jWAHcwXK*pja_DsWX(B<@bSn@+AzzC%QDGOBbwv@s+_5 zEXF||@~r|-OY?Kgi8|M-y_RgtcVr!pB`_(m8lm+R0VaCiY|6J6nH5~Ph}i@D+gbd( z1$<7y=T$7sLg&LrBiIwgQwmsJKfG`XLt5l*O}6-9i*3`c>tQb2FgdLr` z!Valh9Ps4ze?6#V9@xj@l_TBa5R87q-q5}tbS>-+9q*BlJB+QQRBwB6O#&?+4!p(( zB_$J`is55J`n$3ht&jT!G*kVQFinyCEaMXgKA2j1#B@-od%v+D_pfU&oH^_okNb`u z{QI^JZ_T?MlZ>&6iP2H=PyN%G_zx2k@q=Pg@$a@K{3!4CZKoY)VoIZ`ZG~Y62EjGEl#2>QT5E0Xt(&y zdQYm2>ld@Sm3W1Ki{n@%+YO5>ws-^A7nmP!F!Tf##ebF2rx@EB_@ZBvPD6S5681d^ z9CVZ|cc&2d&|~P_%;0?I%PcpeFPLIQ=TgdSx8craV#+GAYsc9vU$uN$YRl-e=edPD zKMpcoy%?7Qu|atxkQ|gp1H*&lr7WAFD2CmG0TbDiRmp!hNKR!fu3gF-xF>RR3on^gT}1EH$i35(HE0$?&QUv zJ}yrx!*FAOY1e%Bv`c_IO(t3-2@S6cx+aJ{O+$H~_u&kNWb_2uGQDIbDCO-@qsqz-U>609qd(mbyJg{0)pt`{dHw1Yua zk=>#-XXOZ756L|kQ1gj6+hH7`E~fM4S|ogh!PZxDuY3jH9`kVx2i1b~)hVO2C71zl z-<-s+N9ma$uL!=BL|qaTqc0`5_?D~APBYooqFbrK&Z2QKX0HXCJo-+duHVcQp<5Y| zoF|;9CV{O9SYUGkA7mWuQurzf!lHt+bOJUk5=Wciska`WaYiWp-iPU*a!XAgc0Enhv6~54YY!gd^B~Ib!VGN z0h3;hfpd0)+z9og`D`C}hzceeNPh{cy?U@6a(;m8f87Xmbt%$;Zw|FKRc&sU+g*I5 z19IEw%aB{Bx51?B^Wvrmj>kB(KL#7kK0!VtIcOu(RUzwrrvwgro0wQ1*uY=@ToG`7 z;v9$94SSo;WrLA<3Ho{S2A-a2-o(>D^K1Ooy-gIINqhK*lorOH-KmznDoF79Pmkp1 zXUtuqa%o)6LP-R#PPvObHfisreHYzUmmyFf9J~m<1Np;b@dN3W@bvcyGtP_SRDw@`Y2Je16+P0Ze|ZnSVeMh3H9h)XB^a5AWvDl(5qQ zJ<16<)_YbUbCfKe=H;OT`ld}^Qm60`gDU{`EEVZYXT#R}HvIOuEAwA_`1alWdwci; zyLn0DP~gN>qrizkfWI+U)?79Es` z(nIMu4L~2grkH@ibK&*t@(uJw1oCrTYK24lfv9}x)&}$fgrhy4wG;g|sg?s2MM=_z zAw=Js=gdgNoF~xJ!+1$T&9RDX$iS-6#~;u;7g{O{H0$$|NH+l(5>*aIi^=;IbFD6h z--zP@=ANT&>W2Y{Pa>YeI+wUYe}wssg?sZYR-m21=xp%#KNu~ zQ3nq7Ak($gyo0}b?H|1IsHy4((A;ux|QX8+tAb(1$=O0)AVI?e3vp#5NdC$My~4nf?q9 zl`}BCw89+q*rAGOhx+fY9m8-zU7c4~N5qh)0yeRbg7p>847J?mSuNQb`>Q=*0a?$|aGaq#qWpqaU=BI6?xx8TPDo$s`)E=#zDk=1wgzOQuRdV& z?F!h09{!FqbKu_($~Jseu54h1YF$ix(5M*Vx)g-5a)xtc#U<)pv0EfV^m;o;zk zBMk?dZ(Lp4dW*tuY>ZO!zJA_BhuLWnoO&NuGf+uou19_%kdtOh6<(UarBUgudeW+d zeY}$&mCnc<{%I8T#=)|8*wg1`5EJoSM@?bR4KUS?cs_Fr<6&Jy-;fo_B^$2AP@H<+ zLv3+S9XcJCI;}5;=_9G)4*1>|>z`KEc{I;P+IlW?7(*Sk18Th}ieJL*{TGU79omae6bz+jU`>0(C$ zF%O*vUn7O}zP&VE*WaC>=JN@8hQn~Pkz}Qqt=e)r-CZeO5ju4J)=UR?Q&ebDEgu%V zb&B}J+o*`6-h&ExCBu3Bm^K}hon}mhvTEUf*&PM1qjU=YoZ zlfM~D^ZEmHLJuECJt45*-9cYG(C)h*Ad0b2*GO_xUt~82$=cKs_GLuacRIe2a3<=RenHJ(Ol`|zf+Mw-9}|$10@BgX0?>jT${!KPTD~Z4bI{F*ez6xr zarf{umd_4K4K&G}ZW3^u!qk^ypLi8_M%*e!^}N7^ww(b_5}JWMfwD@^`2Tf>)_C z3qmX9GkatOt&9RZ05&k=G`JZXdWUM0QTtY#!>n~vYqfQDd;x%S2dyE#tb(bGx~qr7 zlR_3atGzAT?zcPM%~1}URGZkMg$oUy zODeN-Z2#kuH}3L!lweN zt6T(rKXU6-eg{;3-yJvIbZ;DInk-!qT_#kbNEgSy=pS(hbL!IfgDY`)1U%xSnw$Hc z<^)Qm*`S_Wm_gq@fFicIIkELM!6r4)qzY6tWCuJ(UCorQ^{!{Hd@6HzTJ$`FSBK^Y2JFv-ON*83+-*?@pB&%|solmp#JJn+>#BS;Z&0~k^ov%tQ0^NNl7 zu>Ay@H-f83rYTQ1hm@Gg_w2uX;F6=L!Qjo|8ZW_vd8s9bQ}s-XYg!B?jR9qNRZw9& z6D}TdFqhBJtW$r#cKM7+)>QyjN)-Hl7?jL0Q(c-?D~F{vKF!TgJru;P6WavIZ#0Ph zK|kIUlzR1kn$qQ${MNAO$K{)X>PZmqFJqd3m+}T+u?5b9sKfsiLHg{;SVpMHY&!Q? zI@X;pE0VK&l^glo&=)O&+n$ZftA|P?+uu7S|!vI6z(t?CQ%VPSKDLs#v6n{D|cd+qasto*pEYn@=z z-~t=0n(_n7BG$k_!Zm$gs8ykM2oH(Z}WPwc!J-G8c#{Re#B0+|2+ diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 316e81590c0694e574be99f131187b052096511c..a83f643a2faf3c62210e13a8d67b1ae535f8ec53 100644 GIT binary patch delta 2373 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 Qk;w22vwY^se~i!m3s4ip4*&oF diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 97670f04b4222293176aeeef0c36b98a38994ea3..5792dd5e3aa0390c93d101346a23483792a24398 100644 GIT binary patch delta 2670 zcmZ8j4@?wS8lRn6*j)q}6lIqRJS(IuRS&QJp?^Gy_UhWaRNGvPUK4M6_1d+kN#o@# zF*(^9hfvbx7KgTA)vUt~VaS1N%!!LfK?Ta9v}5%UBc8T*fO2)`Eg(Bc*}ZRe^>Vq% zX6Ad}d*Aoo_x*m~_tsVFD)oQEqzn_ukA?}FnHGkahk0vPzP4%QDvIJbd_$(H#Eg6M zl+-5aM$!;5*5S>HLvEMZ55A(u*4pYf`(u!`7HHA?(+rHif}QHKasA^YMg#NT$&7 zi2oYOjQGC;Ro0mQip(XBa|!JhUQd2*XXgYGRsT_RBI8euNJHWmoeXA58O6X61(Y|3) zj`0ohZ=R$8?~ZUBBnZ_^dKg@xSxR}Iz5u5R%T2WzlqLy^L3g<+=5+4B`-N+!tc}mB zElA;yqfG=4jg?6TJ4P98|_{nJl`lK=;8~82&5s#0dyJO-OG$0h2 zchP`qmAQZ}2n%P-FB!cyu~1OW)^bSKGCed%*N?J6PuGZ^u6qg9E%}|q(G}?;@3W#Q zRl1b;qH|F%b>{MuL1$E%1dBsz+)VyHZUlhGbykS^Oaub1(k%A?{)#W^9Fjs%PoI)1 zR9JEr{xu}^lE1fnLpgP79FeBQ=WlDLCw$xtlitUE*D%8qy|PVu0U>Vah& z!+2NNy2s_A_jKa-XC)6Y%4t>(i-3ymjQ<)dBeF}OVfZz8p6e_xcd^K5FwjOIK%5mD zAQw`5kX9Hu#z`Jd{8dXMO=xi|#3(fc4X{n#WBg$_Te^vwVtxjP!}y1=nAE|z?wk%O zOuzC-P||Z&IGdcPSpzzOfDdVA-If>&@zt3^eEo5iqt1aIgwW<`c;jxNkX`i(L}gbY zDEP9o@PZUNq*}!^T5EOkpK&_QqqTS!k?Mh|P`UJ&bSy66L#l9?%`Zs}1GoS;SLg86 zk(A27P8wZ~;a1{oLN83>lNy9w3&&};a5Oo%z&MW*z|rSf*Lf`JcCwT)2Bp}OgUgxeD<;P1BcfZ7gH+Z3!V64 zxSzd?nuU&x++;loxK;Q*W7W!&S{1sfdKes11Mku#{mK5(AVU~DqU-qj_yKh=s)W)7 znU4Q6$x4_U{9lt}cT&qw>C*R-k`1b>~A%S4`<1J&mtTG}o2+`mzqQnr0Xd#)u7~%J-UXQL198 zv;Ij7HDTLSC94*v_p>*;V#JK%_GFn{%J*0xuK(QD6h%rvvLq zQ+E%^JJKUBc7IAsy#t@n{xve=7P!o9^H0M45;Q@`YkorR$+KT&78^{u4hF)bMFk}T zs*_|nMA}QE)DfoxE>0(uY?AmMbY_vNM#_D5PE3aHxI*+cWnt|%-P9dUcx!Q`ff8;n z&fOxXL3VVyn#<7T8J(}d+QU$_-NZ|Ew~>r97y7!}tcsxoAfHn4;t15Aw*Z{6^C}fh zYGCKd6iGro!kbz4SI^CeF_~m!QMripl>rWs>Oe z3}%F{vTW9ZuyiVztwba-xK#-QD@6Vjc_6P9)U2h3KL{Dte8YTUt+n55QyYf}1Ahg~ zHcXR{u-*2Kp-(t(EBy6mGi6YFo@8_-1YcA=gRX@{lVXw@2!mEeB;V`2&z}s{h^fbV z+|Zw3&4W-sdwWMb3fA1OXvKPifFR1^J!~1#>s4@P7p>!c;6qmx^gy-{YDe;R$zfL|E-pJcx zZyUu0QB3aRW0UyPIsB%Iw-Zc{0T1!V6F6%OSE)ESg7<`luDm7rt5y80y0?(oTg2>L a&fty+{`Y;HGU6Q;DUPCY=6?8z8UGLTm?*0N delta 2618 zcmZ8i4^R}>8QVgy@El>}h%uNJi;1R;N%YLTYMW^@+IG^l=_F@IJIQ3) z++^ATQ+^ZY^tjdd8`ErdIp|;ixtn6~zLhu?5ry_8ka!fXDUQMLV6| z+`RqX_rCAF@89qHD$6U&BY)@Y<5Z5Iaf)t_kREP0zjW2cmsYK27(u|-6{beYzB5Oi z+ah1j=%MCD{2KX}`I)(nWa!$F8v+Ur;9-)RQS_s>Bzjki?q*|xnu!7wH;rc85ksgj z9^sHn-wOE839`Uyn^${ae(vGydam-LhJ{)GykA>&;CCBd^z9a2U$f)&ji!wwBbqh_ zzX$Ns5{cyG1PNvoXSDA9OVwxOi;T4!>XY&r{e`V*?<}z=DYvQ|Zb~9`1~_|0BRvX( z{+Nh-iIyiKSAmr?6#1JX%$jony+>ZnT(SMbDMYl$0d#mK;z!44s7MqoyJPrYVFChpJAk?YVarj`;RxXBg0bEE{S{kw)Ntvi7{mPfpUhg)%hkR+t z*>EToMymJ;s!!pbA)jn=^E6i~Mctah1eXSw>(%_!V{4=Op*pIV#5PDGelUb?4@sL* zHz~Hh!9rGRtc9#SK~7koH!F;InP^sL1%zw4?iz&aYsI98Yd{azomti`Wyh@Ps(fAy zIgy>p7iPcc)J%{$aq;oy+>AN~8V^&3n(~#Q1PM2IPVl)c0S*U}wmXpis*f8zvPw~V zr#hEZ*>V^B`<~oEyTk9Zu`IP14Gf~(6gg!pWph&}hiwPNQ-S)}XzbPYGeBzhqip`DsB)*D`%VR+@vq&Vn>f3QQ#fKfZt|uS~b4 z)9IPibV9p*u7a`hPE=G<264GA_P~8WToZ3#N75Gx9%+&*q-}z8XJs9`^BjJAS`I*= zZHVJH;&L4|D_Kqf6U`$xP;(jTo%HIj*?9L&KhrNLjK7}M@2gZNd6HcThP11qlFUhvY*Bg&(F!1z)hGFb+9{tP1*7Rv)@LiT*T+92%;J2l{EF zC)7yo)zR%Nx|qhFQ*R6U#uyGKA$AR5(NU)WZ$H`KgQS;VQ?YLnnNxa#I6Oq*HYdJ2 ziGQpya)-*62~Y#N(YYy5cM6OV=MV1B+Qd8nScs?hMyt*k_V{!|z??@TQZ`&z%saZ& z1o||IqLYY@z=>p07!L>;hg064dxEa;LS4{aZ3uet`FIz98%4?4?7U1p0=SiYmA!gZ zI9Y>k>j*W|=$kBcJbr&B#!(JWYrqo&hJkw61EhTZLeKxHp%%7Az!?nulCa_hxaAh7`$~X z)YxVRTg0S%I;~Jgc=}*TZUFD{*x3*W1$6iVS_aTqzgZg|Mm5?Fe$WHdAV@=95D7 zdsG~c{(y=T(eKcfOYJm&Z@aSCzn_&muIytYr3&XK!ou&)3&X64S-|DeN9dAv@~;a^ zOctF78#2DAu&i72(j1S(23a(B!0Uk_=mn%^NN+)xm6%$j-s4kJCVU^L6cDYq2#BaU zKwev1ZE}#_#d+JLU+UmJ6Ju3QNeglv1RneZgEyzedZl8P&Zrmbg&=dOm1dv#tn*T< zQ#F-AtF%*Gm;lTL3w2=3saBJ6Ge1XRXa;0>Lyr69_DLyiRIvq0ya<4!qc7A-7eU)L z%1Dkv=Qb#4-neS)zx|dznLI9XJjdm*|lKWcq8F{&zBAT;rOlqu@n@E-!~bp(=zM2jy%0qK+H9 zKICqo=cYq9qPG~H1B&clvWYzZ)X&V0B>L@1>8Xt-(=fTe^tnY@@u0~UeV+~ditW6- zk5wObbZiqyN$yXxvsJg|&sK$Swrb;bf;8uDeHL2kb70(~QUPewb{@TR-oK#@hpiMj-D+Q#a|! z%PWNvbVD8L6-@2&aVSpt7>4D7PMz1O!~7Mg1Vk{G2Kv0T3`YLb`7XOL8uS4nlP&q1 z-RcM~oWb-SJ~W2+r|?@E-cB()1cit9jN+UjJTrlJ#&K+bwB;`?I5&znYrBfLUB%q4 al^njDz}+L*J`n7a7=dBFIdk_B_uxOwt_wy0 diff --git a/c64/,,config_generic.s b/c64/,,config_generic.s index 25bca317..cba2e0d3 100644 --- a/c64/,,config_generic.s +++ b/c64/,,config_generic.s @@ -41,6 +41,7 @@ // I/O devices #define CONFIG_IEC +#define CONFIG_IEC_BLANK_SCREEN #define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO diff --git a/c64/,,config_mega65.s b/c64/,,config_mega65.s index 80f96095..2af64048 100644 --- a/c64/,,config_mega65.s +++ b/c64/,,config_mega65.s @@ -43,6 +43,7 @@ // I/O devices #define CONFIG_IEC +#define CONFIG_IEC_BLANK_SCREEN #define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now // #define CONFIG_TAPE_TURBO diff --git a/c64/,,config_testing.s b/c64/,,config_testing.s index 652a3e5d..19376b5a 100644 --- a/c64/,,config_testing.s +++ b/c64/,,config_testing.s @@ -42,6 +42,7 @@ // I/O devices #define CONFIG_IEC +// #define CONFIG_IEC_BLANK_SCREEN #define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO diff --git a/c64/,,config_ultimate64.s b/c64/,,config_ultimate64.s index 7af94966..ea56cd38 100644 --- a/c64/,,config_ultimate64.s +++ b/c64/,,config_ultimate64.s @@ -41,6 +41,7 @@ // I/O devices #define CONFIG_IEC +#define CONFIG_IEC_BLANK_SCREEN #define CONFIG_IEC_JIFFYDOS // #define CONFIG_TAPE_NORMAL // please keep disabled for now #define CONFIG_TAPE_TURBO diff --git a/c64/kernal/iec/iec_wait1ms.s b/c64/kernal/iec/iec_wait1ms.s index 464619c4..9e550f35 100644 --- a/c64/kernal/iec/iec_wait1ms.s +++ b/c64/kernal/iec/iec_wait1ms.s @@ -29,6 +29,8 @@ wait_x_bars: // additional entry point for tape support dex bne !- +iec_wait_rts: // dummy RTS, for very short waits + rts diff --git a/c64/kernal/iec_fast/load_jiffydos.s b/c64/kernal/iec_fast/load_jiffydos.s index 51bf3bf3..126187c4 100644 --- a/c64/kernal/iec_fast/load_jiffydos.s +++ b/c64/kernal/iec_fast/load_jiffydos.s @@ -3,8 +3,6 @@ // JiffyDOS protocol support for IEC - optimized load loop // -// XXX option does not work yet -// #define CONFIG_IEC_BLANK_SCREEN #if CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K @@ -61,6 +59,10 @@ load_jiffydos_loop: #if CONFIG_IEC_BLANK_SCREEN + // It JiffyDOS needs some time here; waste few cycles + nop + jsr iec_wait_rts + // Ask device to start sending bits sta CIA2_PRA @@ -87,8 +89,8 @@ load_jiffydos_loop: lsr lsr - // Wait for the drive - we have time to increment offset, cycles: 2 - iny + // Delay, JiffyDOS needs some time, 2 cycles + nop // Get bits, cycles: 4 + 2 + 2 = 8 ora CIA2_PRA // bits 2 and 3 on CLK/DATA @@ -105,7 +107,8 @@ load_jiffydos_loop: eor C3PO eor CIA2_PRA // bits 6 and 7 on CLK/DATA - // Store retrieved byte, cycles: 6 + // Store retrieved byte, cycles: 2 + 6 = 8 + iny // NTSC needs this delay sta (EAL),y // not compatible with CONFIG_MEMORY_MODEL_60K // Retrieve status bits, cycles: 4 From f80d61febd7bfd0e52552b1cea40a0343b9283de Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 7 Dec 2019 09:42:02 +0100 Subject: [PATCH 099/105] SD2IEC+JiffyDOS EOI transmit fix --- STATUS.md | 2 +- c64/kernal/iec_fast/iec_tx_byte_jiffydos.s | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/STATUS.md b/STATUS.md index ba80d598..9f11bc40 100644 --- a/STATUS.md +++ b/STATUS.md @@ -60,7 +60,7 @@ The following ROM features are currently missing: | Driver | Status | Remarks | | :-----------------: | :------: | :------------------------------------------------: | | standard protocol | DONE | | -| JiffyDOS | PARTIAL | needs more optimizations, SD2IEC not tested yet | +| JiffyDOS | PARTIAL | not fully tested yet | | DolphinDOS serial | NOT DONE | | | DolphinDOS parallel | NOT DONE | | | CIA burst mod | NOT DONE | | diff --git a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s index a2b8a62e..dd33e378 100644 --- a/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s +++ b/c64/kernal/iec_fast/iec_tx_byte_jiffydos.s @@ -95,7 +95,7 @@ iec_tx_byte_jiffydos_finalize: iec_tx_byte_jiffydos_wait_eoi: sta CIA2_PRA - jsr iec_wait60us // XXX is it enough? + jsr iec_wait20us lda C3PO jmp iec_tx_byte_jiffydos_finalize From d4ba48bb3a8c988e7a48828762b0cb9326c46b5e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 8 Dec 2019 07:21:54 +0100 Subject: [PATCH 100/105] sound effect fixes for turbo tape loader --- c64/kernal/tape/load_tape_turbo.s | 7 +++++-- c64/kernal/tape/tape_common.s | 25 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 2bdc473f..a676d6d5 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -22,6 +22,7 @@ load_tape_turbo: lda #$FE // timer threshold for TurboTape sta CIA2_TIMALO // $DD04 + jsr tape_clean_sid jsr tape_ask_play // FALLTROUGH @@ -54,6 +55,7 @@ load_tape_turbo_header_loop: // this strange loop puts metadata after cpy #$10 bne load_tape_turbo_header_loop + jsr tape_clean_sid jsr tape_handle_header bcs load_tape_turbo_header // if name does not match, look for other header @@ -85,12 +87,13 @@ load_tape_turbo_loop: bne load_tape_turbo_loop // Get the checksum - jsr tape_turbo_get_byte tax - // Verify the checksum + // Silence audio + jsr tape_clean_sid + // Verify the checksum cpx PRTY beq_far tape_load_success jmp tape_load_error diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s index 92e4b9d2..9a630bb0 100644 --- a/c64/kernal/tape/tape_common.s +++ b/c64/kernal/tape/tape_common.s @@ -75,6 +75,22 @@ tape_screen_off_motor_on: jmp tape_motor_on +// +// Clear the SID settings - for sound effects during LOAD +// + +tape_clean_sid: + + lda #$00 + ldy #$1C +!: + sta __SID_BASE, y + dey + bpl !- + + rts + + // // Ask user to press PLAY on tape deck, // Unless user cancelled loading, blank screen and start motor @@ -95,15 +111,6 @@ tape_ask_play: ldx #__MSG_KERNAL_PRESS_PLAY jsr print_kernal_message - // Clean the SID registers, we need it for sound effects - - lda #$00 - ldy #$1C -!: - sta __SID_BASE, y - dey - bpl !- - // FALLTROUGH tape_wait_play_loop: From 179719adc6b19fa1f151cd66700093b00c8d67f6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 9 Dec 2019 22:21:05 +0100 Subject: [PATCH 101/105] release tool now supports Mega65 full ROM --- Makefile | 4 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/newc65.rom | Bin 0 -> 131072 bytes src/release.cc | 159 ++++++++++++++++++++++++++++---------- 11 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 bin/newc65.rom diff --git a/Makefile b/Makefile index 338def52..4f22c87b 100644 --- a/Makefile +++ b/Makefile @@ -84,8 +84,8 @@ clean: @rm -rf build c64/basic/combined.s c64/kernal/combined.s updatebin: - $(MAKE) -j64 --output-sync=target $(STD_TARGET_LIST) $(TOOL_RELEASE) - $(TOOL_RELEASE) -i ./build -o ./bin basic_generic.rom kernal_generic.rom basic_testing.rom kernal_testing.rom basic_mega65.rom kernal_mega65.rom basic_ultimate64.rom kernal_ultimate64.rom + $(MAKE) -j64 --output-sync=target $(STD_TARGET_LIST) $(EXT_TARGET_LIST) $(TOOL_RELEASE) + $(TOOL_RELEASE) -i ./build -o ./bin basic_generic.rom kernal_generic.rom basic_testing.rom kernal_testing.rom basic_mega65.rom kernal_mega65.rom basic_ultimate64.rom kernal_ultimate64.rom newc65.rom cp build/chargen.rom bin/chargen.rom # Rules - tools diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index b05583c6af43dc061fc9a55c7a73f2b4df5f570a..f35100af88e2d6c7313311859012e95170594896 100644 GIT binary patch delta 167 zcmZp0XmFU|p?U1fN_&M%|1(x8%wMbU^z9-=AidP;p4`+0nyo}wDGxGh?4GNL(72GC2 gV0Q+pP~nJR0aCR*Zj3;Mn~(C&6l64;9525R07#`9J^%m! diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index dfcaafab36c811449f796e15463db6598a88b851..6583b51e0fa07e6096664b8ea1558fc2522fec70 100644 GIT binary patch delta 34 qcmZp0XmHpd!p^?oozLX=3<;AJ*=;5pu(NHBWoMLNw459-zYqY@0}BEG delta 34 qcmZp0XmHpd!p^?yozJxQ3<;AJ*=;5pu(NHBWoMLNG@BeRzYqY^Jqru~ diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 16b3cd5e362d5211ba5ca01ecb09687fde7599ec..458494d42ff2c2b34b24f2a0dd45c63bedd2340d 100644 GIT binary patch delta 2222 zcmZ8iYfuzd7VZbkOJRCcU_c(%KokN>@JTjhd}Jj<>MCn$HToypu3KizN|{ahgKVvf z?mA{-GU0KF3%+VHOk0dwm_g%%Y_Xys%dlmojYuE@nyd_(TDp69&cMLz>Cvj)+OF!` z=iYPgckVgoJExCqJhIW-!!jM?q?aAZcx6S=>njQ?4~S9ag+7%2%g6UKSt=b^7?vsu!f4 zHC3@kDry$RJ(b;OPFHSzt*n&a`KtW*?^lQ;cJq9I@ zlV3J=aow#EMTepgN~UL{?Ka;?_vaX$Y~QbBCC1JL`Q~?J+eGtkW!q%)Ub&(Dw(^T( zw>^oDPZ^=(&c}>*AF=9=(^?|y%=8YT(=Xp(l7(9~w;7pabal>2HMKpTK#0bKuhBO{ zFdQBA{1D9}WHGvC=6SR-0O{CD4(Yeih_vbd7~cm;v9&5%p;ctjLsDW$q0e1@&+t2z z48<9B=;uTD@G#m!=y;Okkt{-u5>tpOLRP+!8qjk&-#MrO;*4LE_G1XYA8`G$@jRn2 zt`e*Tix6+t6XAtQo(#mlnzV9;o60H2-$ryoy^mI6vT;Qy8?Pn#Ml(|_kz(UgE#^50bjY}4rWPc4lAq#bAPy$9W!@{YkgufXge>E;k%9p`i{)DC0qANqk zLx>Nd@Ce-asqtWWwFJ)9SR1StaB;BK;;vN;_U7FTYK!1^6>9@pHHP;D)uU*A2*u2T zPaKQiRsh3{PXZ;{uPLUczjd}>GmCT~#L^_=S_KR{UsSiwvx`BYo}1^Plvt#bfQj|| zvBEVKD_5^8Se(1u5l6n`RXqkZhVy0K$5m>4yuuXn zW*&zo$tF`eJxF*{;v3)%_@t9uCNTOEXY3NE(7qrl4WUU@=%Z24BmDW80gQXI!3r8A zrx&ba!Xu=6!EWZp1j%2R`o^9hsb^E%=;`PB+3YUzzYg-L~@Jdj)UbmYOzOLKL z2+eh+Oy{v$Ab8X_I$-AiYwB|K!gPAoo*
3ow))eXj;!^8_xAc;bMI!aXjbqlb$D zn)IN|33pF(AH}gKlRQ~uNyD#4@D@0$HpP;N^_j3HC|m=m9b}1SxwdPLS@cIkrmv$)rwb49Q*S4#S2$x+pQ~< z?dE}%EW{GvzbE4fOQFseCno1>Wf%1s5}$ChE)9Ht5)~dU*=_5!{R4k8_57mv?6l`d zT_1(ck-dp06NNgs+2#O#C*XIA8vhq!tlx!;2$z&dhsd&|n#`-y`1ivI$-WZN(9m?( zhZGjd+qvwSh~An+hzusZK<5$KoDdJaY+kgN?cdaZb4ZrC>StS|^SyB91L^!dk#qMb z1sy#AC)~H)dj{;j*M46~v3EAzwO8HkY#Osyjdix)7iGYe%_;E1F(m&QT54%>_Uc`s zG9Y!O1~C$R(RP*2F0H5)>J=7w6~Xsu{6t0O@Krk7PR9re+IhE4z*1$U0|Ld%Azpjgh=ARXDA@>=5lfKY>vPV>UJ?|~Q+ z#(b@c0inx{DYZB(6t6>WmGhUMkc-2)g^Hh?$wGq#&KW<`Da|kpodO<34I&sgx}mG`YP*amP3ckebxYl|@rR6}JG4%y%6@n%ORR?c!52U&sS4 zN{Z~l>mwlT0+N>Xx+160FnO9ftFM;YZrv$-8U2&UY46a(WLx^jz^&f&bPaGT2Wd$- z{e?KKjM<2Amb>X%0xP*0$%bf=tEIl1Y|BWaKO_e-a=b@9f(=8?eiy}4)Is^j IF#FSg06~8%_y7O^ delta 2184 zcmZ8idr(x@8NZKxupsUQ1G~Hr@dZ*7P@^lHo3_d!O&d^LP zn7VeOZUP=^K%?0#dmYvUvuGnB9Y$2NEHh3o0TBa4(+DV2?!7E5?DE=vcjb>xcV^H1 z&iT&yzWe>o@Aut`%@v!yJuEXZN_yGRjPaZh5zMfF0rwpY>A z;N#?}CZAqT(zIEYKLpV^sreA&<3%01E#uGq+9x(QI;MD8RG?0IymE{zi83ty=xlu2 z#keZA;^XRZy7XP6%@{cvdF@U5DsBy4?QtPcuJB8ztuOTub>-H`1nsv9DIO2|lTki2Kn#d)s- zeKjv!&CU=PowA@p(wLAO4=#gHnY~$L1vhWCV*L=gq5Cy`j%f7n(PzjX^+(I!lKw;Y zixy#0DR73-^ps2AvQctS{Vh3CEZy%5D@m|Bs)Y-sZ=AU6NpzfH zgnRctWW4VXYt%{FMC2$ly_-ZCRu^Q-!fl(|j51|(W8O(M-dUL3oEOIdh)xNH<9^SN z5$pl^$eNkw(V8)Uub8}ND5i7C9mAg&e?Q})Y^{o3XcbxXgp@=l)1O^`H~RN1Im$+p zzF1?dCl-GfM!y`y$A-}^;*TXe8YGKQt!VO5Wys2VC`T0oK2L=>Db)FBK>w!@K04;w z)o__n7*`24L3$q}vYs$6RPsO&PuN!HDNvbkfAL1s+8J&tyBu;vsmB#f7Oo6s;SD6i zXl6o_*BnQNd1 zI2OODKnyefB;=&pnv}T4f3&wXnMFDuFwK;4jRJ|C%hjzhb}=Z_aWNiB(IS)Np>1{i ziTu|-UbAjPUP{htM=W{Bty^Cd6q-?*3V#uZM8PM=7cL`cP!=SD3uNBMRqA}a!sPR2 z9^acFTjJ7biSTiWg-{LDWRhHQkaQJi>=38Wfgm~@LR!`1(t9WilpJwRTi>-flOkrc zJ+jY=Z;f?ukI`Y$5|^%1A;bgZ$GE(5C>&{J^|k!X`x(Xf0@TNYK2}kM25YujK+ep= zfQy4LqQgO`L7i?5s+j#>1k;NM2dDlg!g;*juO8T`_6P7sP%t3;xAAC5?#+TMNFo>F zH!v|0>5kva)C`eVm!uZ%3&LG->RsLaMr84(U@L`7#@#io(GcPFpzuxYUPkz~c0VID z*B)ZpPt*X>Bel_EW|e6Rsji=0l1}IEgJ$8=LzvtE8c_jA8NxflLM^Op9m8*r30+*m zy&g^jTc&wYMgSjFW2R zL-^bz1) zVJC~e2-wBx4lw|R%K*oGi~mkypIq5>+lb=!Jv|HNme7V5&6racw4k0|sR*`IjM1Y9w2 z*$*Am06*jubwi(v+94M%Bt}yrJxx}as`X9N`2As&OKzD`pmz+IUZyvmH76{Fju#W@ zcn7!C<5gs-x$5;@(&b)-#mA+~T_Wf1QS$Efpj=saVC#xRklkHv50qqkdt;})scf(mrUsrAb-q_J+!U@|8LiC&3f#RLSnri+Z6>VUbr6+(kCG zR|g`%Z4t>I978)vdlJ(9R#wG8q@)dN4+K^9tFp8@5=78JStWC?E+Tj66R=TmXB)4y zltc{0a=99r$e!d)iCRgh#ve@c!i29+3<=}DRwWwcUjH&Vhc1Wj3~fN7Mxe7F+h`tr zKO=nVKq5XOH6YRUDN38ePiD%%%PDED*N{o}P|nm^s@u*@qrxdPI_YgzouVIJs})U* zV*d;po^kDfozTv&q3^=&K&VOd_gQZx`efF--N`jxv)yWk;WiB9&D3=U{|s<^VifsF zb?VYJg;PQm7Z3Rsxhjxut^@vd@wu7L=OHjMh4IlQEz&>4p@{8NX(|c9BYy>8x}5dw_KU9l9Q1X9cck-Blry| z&Pb!*C#4xVS%af^`8-yh;lB*yGjsT~gg=lmGYpLqANOPXIKC_4Gzl*wH#5?fl}Y#= isWgi%UB#CEjK!KMJTi)-2c7*cil?X}^1o-yo diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index a83f643a2faf3c62210e13a8d67b1ae535f8ec53..fc7df33b984c6010b7048ca8c011d290d326abca 100644 GIT binary patch delta 2279 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 bU&)g?oorW0>ahEtA|o(NqxSGW{OErHQ$l9> diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 5792dd5e3aa0390c93d101346a23483792a24398..cc82b2e144ce8593d5e35634244e7d7ca93aa7d7 100644 GIT binary patch delta 2612 zcmZ8j4^R}>8Q;6*I1WS>P&h#0DH=Hc6}39FAqg4(aCTlaZPSc)I@7H>&6&}*PA3!E z)Bqiqq74dpI0cExx!y7?20fE$6`e~#6yy?h^$0=%HCFB*iR?R&y91Q#w};JiI&<^( zd+&YUyzk%d_g!gWX`%B58{JPOC+a8NtbfN3R&Cy}YBj^~Jnoj6!(!t7IAuuW3W1n2R-FIXgcWdH1zPu zK7{WMkxWC*mXAZ|rSX=1`Yv9HMtdkeIcB&oI8dD5$s$JE^7v?wB*&QM9(g}$;fcg* zw)AMty!hK+Opn)By|Jr!AOHHC=kwM)+D?ubo==tPQ1v)i>V4Ajh=ku!d3iOtpStK5 zZ9bW)Gz`i!l~IG}u@8lPsLE^S(CgmnPp-AjSM+wKl~bs8l|AhIx6BCj=!93hZr@Z7 z@;_&kG1xVM!ozxn#a+YLGc4-_7uxM5hZf{+-tB$PCAqrv$^^zE&k{4q(nMQnO9yHMic`qhgKNBG5V$$O7`cP_kJANUI?vgKK z)|6C+PXyXv9E11Dor}_9W3qM}CaImHPB2nk&#??>5a~`1wLs1tetX#ZvTB@Q^ za=e+xAE|KFE%XYVxHBl1Dtg#<;(D?_A+_jeP`U_B#L8h_s^Z1hnj7>~FK)wbRXWwB zgT_mr!oTxNcTi&(n#AwN5B#FR#g-0AqY4Y{#zUosT_?%SgmjA(!et>_qYeKd6r)+w zs9fARnTu~s9k$k5(Y;Yr6o3`ClO%23Ky4n1lQ<7R4WL~F-!T?nG8f!CX$ONs*j-QY6P z&#ljUYZ660ZDs~J7GJ0Eh8f=gbX+-46VF|`cICWT(d9#p{VIOW45CS^fY1ij+yCVDT^OyXF?r>V&=7M3ZyV;-b?>yk~(Yh z$Nx1sj@OTA28T43`z~<^ixhPelC(Cykb;92qflcHqdwwE`gy^XC-^jFP}dOTt4?Nx z;~EFhsC?8pY2#5{2r|uSnZ9~KVewm`Rt9eycht7Vg6sRqp5zSO9wH=XC;e8fWCmJ( zuddV$D5mC0ecIdPVscK&-$%cNgH2L^7TCk0(e-o`)LaHNUN_JcrfIEVWr^L`_jFV- z)tV1Xj5gx5#}%BKm*D2QTf;O4MeJ#|Tqs=Sn{@-01UuW8M`=_A7vfv;sW8z}K!rfd z_i5vmt2FE2RXL^dJ-yU%{gB?dPG&0!KkwD#x)3zD5xi%-s1n#37d`p3ecp1Nu8yel zmuI+D8%?!}db=LY8M0YXKea*I8^m8DH(8gm)U?7Um)7+$XeHT|^0pqZHITBnL@tFm zz@aT+p;|7Pl?~NGHE&-E3FhJ|l#q0ai<22@fc61~JH<;LlTq+!*q+6DOovDESV9pd zc-H*qCdF{1fsD{-xzMK?1RUq-d>}K(cUeek0X_pMqbvlRhReslqapfih+&4DO-)Og z2}mcq(v_ejc5PGqP+CzqNk@oc_?~f-#y03TL~mZAGm#uK($y2IITzOb=F$ZzYC|t& zVazso6wc8@S9kQFm&c?pH8)9oT22zM%%CtKKNbQ|Ws9-N^@wav+o@|Oa$4?=s>xyq zw<;R7jlvfl(r_Xg6{B>DvM4nuIesKKoY8WQ4r$H1V zFOHA~q5v_nEIr@yVFch>GHsRf6#$py;pTVra8VFn59*k5^tALb9E&>0U(~CYmJ+;^ zyp~a9>9=#`+;g>F6(&cH%`7M-=_Bh~pnIx*v{L}zEDGnOo6&SC4b8Tn^hlT>9X zr2R1DW?zFr2l^)MRAD8DHj&ppDee`+$I%5cvS5vFoGe)QE|jx=;V*NbTBS+=;2UA` z=f{9oz?rHD#q7|Vcy!*YZOEd`6}k&#Yvv1cfqNnsZwy5)>M~!13DldJxz4SM7MRT% zmT0VW7H}e+!LVG`q&7`D!Ce>gKn1g5klVyXfS~1BX|a*1fMBgATeG&OZdGxr59@sz z&6bVfV-){I#okfk%F0@@TE$uF-duL?GIs9@7B>X(H^Vq~$UY!4Ji{z}`rrxs^?v|G C{3WOW delta 2640 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 ROM_DEFINITIONS = { { "BASIC", - 8192, // file size - 0x1F52, // signature offset - true, // whether to require BASIC ID - false // whether to require KERNAL ID + 8192, // file size + 0x1F52, // signature offset 1 + 0, // signature offset 2 + 0x0004, // BASIC ID offset + 0 // KERNAL ID offset }, { "KERNAL", - 8192, // file size - 0x04B9, // signature offset - false, // whether to require BASIC ID - false // whether to require KERNAL ID + 8192, // file size + 0x04B9, // signature offset 1 + 0, // signature offset 2 + 0, // BASIC ID offset + 0x1F80 // KERNAL ID offset + }, + + { + "MEGA65", + 128 * 1024, // file size + 0xBF52, // signature offset 1 + 0xE4B9, // signature offset 2 + 0xA004, // BASIC ID offset + 0xFF80 // KERNAL ID offset }, }; -const uint16_t MAX_FILE_SIZE = 8192; +const uint32_t MAX_FILE_SIZE = 128 * 1024; const std::vector STR_MEGABAS = { 0x4D, 0x45, 0x47, 0x41, 0x42, 0x41, 0x53, 0x32 }; const std::vector STR_OR = { 0x4F, 0x52 }; @@ -365,33 +377,49 @@ void ROMFile::recognizeSrcFile() { // Recognize source file type - for (auto &SPEC : ROM_DEFINITIONS) + auto checkSignature = [this](size_t signatureOffset) -> bool { - if (srcFileContent.size() != SPEC.fileSize) continue; - - if (SPEC.requireIdBASIC && memcmp(&srcFileContent[0x0004], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + if (signatureOffset == 0) { - continue; + return true; } - if (SPEC.requireIdKERNAL && srcFileContent[0x1F80] != 0xF0) + if (memcmp(&srcFileContent[signatureOffset], STR_OR.data(), STR_OR.size()) != 0) { - continue; + return false; } - if (memcmp(&srcFileContent[SPEC.signatureOffset], STR_OR.data(), STR_OR.size()) != 0) - { - continue; - } - - auto snapshotStrOffset = SPEC.signatureOffset + STR_OR.size() + 1; + auto snapshotStrOffset = signatureOffset + STR_OR.size() + 1; if (memcmp(&srcFileContent[snapshotStrOffset], STR_SNAPSHOT.data(), STR_SNAPSHOT.size()) != 0) { - continue; + return false; } auto zeroByteoffset = snapshotStrOffset + 0x10; if (srcFileContent[zeroByteoffset] != 0) + { + return false; + } + + return true; + }; + + for (auto &SPEC : ROM_DEFINITIONS) + { + if (srcFileContent.size() != SPEC.fileSize) continue; + + if ((SPEC.idBasicOffset != 0) && + memcmp(&srcFileContent[SPEC.idBasicOffset], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + { + continue; + } + + if ((SPEC.idKernalOffset != 0) && srcFileContent[SPEC.idKernalOffset] != 0xF0) + { + continue; + } + + if (!checkSignature(SPEC.signatureOffset1) || !checkSignature(SPEC.signatureOffset2)) { continue; } @@ -411,19 +439,26 @@ void ROMFile::dropUnmatchingDst() { // Drop unmatching destination file data - if (!dstFileContent.empty() && descPtr->requireIdBASIC && - memcmp(&dstFileContent[0x0004], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + if (!dstFileContent.empty() && (descPtr->idBasicOffset != 0) && + memcmp(&dstFileContent[descPtr->idBasicOffset], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) { dstFileContent.clear(); } - if (!dstFileContent.empty() && descPtr->requireIdKERNAL && dstFileContent[0x1F80] != 0xF0) + if (!dstFileContent.empty() && (descPtr->idKernalOffset != 0) && + dstFileContent[descPtr->idKernalOffset] != 0xF0) { dstFileContent.clear(); } - if (!dstFileContent.empty() && - memcmp(&dstFileContent[descPtr->signatureOffset], STR_OR.data(), STR_OR.size()) != 0) + if (!dstFileContent.empty() && (descPtr->signatureOffset1 != 0) && + memcmp(&dstFileContent[descPtr->signatureOffset1], STR_OR.data(), STR_OR.size()) != 0) + { + dstFileContent.clear(); + } + + if (!dstFileContent.empty() && (descPtr->signatureOffset2 != 0) && + memcmp(&dstFileContent[descPtr->signatureOffset2], STR_OR.data(), STR_OR.size()) != 0) { dstFileContent.clear(); } @@ -431,21 +466,54 @@ void ROMFile::dropUnmatchingDst() void ROMFile::analyzeContent() { - auto revOffset = descPtr->signatureOffset + 3; + auto revOffset1 = (descPtr->signatureOffset1 != 0) ? (descPtr->signatureOffset1 + 3) : 0; + auto revOffset2 = (descPtr->signatureOffset2 != 0) ? (descPtr->signatureOffset2 + 3) : 0; + + if (revOffset1 == 0) + { + revOffset1 = revOffset2; + revOffset2 = 0; + } + + if (revOffset1 == 0) + { + return; + } if (dstFileContent.empty()) { return; } + // If two ID strings are present, they should be the same + + if (0 != revOffset1 && 0 != revOffset2 && + memcmp(&dstFileContent[revOffset1], &dstFileContent[revOffset2], 0x10) != 0) + { + return; + } + // Check if meaningful file content is really different - if ((memcmp(&srcFileContent[0x0000], &dstFileContent[0x0000], revOffset) == 0) && - (memcmp(&srcFileContent[revOffset + 0x10], &dstFileContent[revOffset + 0x10], - descPtr->fileSize - revOffset - 0x10) == 0)) + sameContent = true; + for (uint32_t idx = 0; idx < descPtr->fileSize; idx++) { - sameContent = true; - } + if (revOffset1 != 0 && idx - revOffset1 < 0x10) + { + continue; + } + + if (revOffset2 != 0 && idx - revOffset2 < 0x10) + { + continue; + } + + if (srcFileContent[idx] != dstFileContent[idx]) + { + sameContent = false; + break; + } + } // Determine expected length of developer ID @@ -453,12 +521,12 @@ void ROMFile::analyzeContent() // Determine if old version is a devel version compatible with this tool - if (memcmp(&dstFileContent[revOffset], STR_DEV.data(), STR_DEV.size()) != 0) + if (memcmp(&dstFileContent[revOffset1], STR_DEV.data(), STR_DEV.size()) != 0) { return; } - uint16_t idxDate = revOffset + STR_DEV.size(); + uint16_t idxDate = revOffset1 + STR_DEV.size(); uint16_t idxLimit = idxDate + ENV_dateString.length(); uint16_t idx = idxDate; @@ -503,8 +571,17 @@ void ROMFile::embedRevisionStr(const std::string &newRevisionStr) while (revStr.length() < 16) revStr = revStr + '\0'; - memcpy(&srcFileContent[descPtr->signatureOffset + 3], - revStr.data(), revStr.size()); + if (descPtr->signatureOffset1 != 0) + { + memcpy(&srcFileContent[descPtr->signatureOffset1 + 3], + revStr.data(), revStr.size()); + } + + if (descPtr->signatureOffset2 != 0) + { + memcpy(&srcFileContent[descPtr->signatureOffset2 + 3], + revStr.data(), revStr.size()); + } } void ROMFile::save() From 80d7296cabf85779a08a9ae735ea66bc0809e375 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 10 Dec 2019 18:40:26 +0100 Subject: [PATCH 102/105] configuration tweaks and documentation updates --- .gitignore | 1 + STATUS.md | 41 ++++++------ bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/newc65.rom | Bin 131072 -> 131072 bytes c64/,,config_ultimate64.s | 2 +- c64/aliases/,aliases_config.s | 14 +++-- c64/kernal/iec_fast/iec_rx_byte_jiffydos.s | 2 +- c64/kernal/iec_fast/jiffydos_bittable.s | 2 +- c64/kernal/iec_fast/jiffydos_detect.s | 2 +- doc/Protocol-JiffyDOS.md | 70 +++++++++++++++++++++ 17 files changed, 105 insertions(+), 29 deletions(-) create mode 100644 doc/Protocol-JiffyDOS.md diff --git a/.gitignore b/.gitignore index 41758c3a..e4515487 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,6 @@ build/* # Various IDE project files, temporary files, etc. +dump.mem *project .*swp diff --git a/STATUS.md b/STATUS.md index 9f11bc40..110815b5 100644 --- a/STATUS.md +++ b/STATUS.md @@ -42,36 +42,35 @@ The following ROM features are currently missing: ## Keyboard -| Driver | Status | Remarks | -| :-----------------: | :------: | :------------------------------------------------: | -| C64 | DONE | | -| C128 | DONE | | -| C65 / Mega65 | NOT DONE | code should be complete, but is not tested yet | +| Driver | Status | Remarks | +| :-----------: | :------: | :------------------------------------------------: | +| C64 | DONE | | +| C128 | DONE | | +| C65 / Mega65 | NOT DONE | code should be complete, but is not tested yet | ## Tape storage (LOAD only!) -| Driver | Status | Remarks | -| :-----------------: | :------: | :------------------------------------------------: | -| normal | NOT DONE | | -| turbo | PARTIAL | works, to do: use sync to calibrate read speed | +| Driver | Status | Remarks | +| :-----------: | :------: | :------------------------------------------------: | +| normal | NOT DONE | | +| turbo | PARTIAL | works, to do: use sync to calibrate read speed | ## IEC bus (disk drives, etc.) -| Driver | Status | Remarks | -| :-----------------: | :------: | :------------------------------------------------: | -| standard protocol | DONE | | -| JiffyDOS | PARTIAL | not fully tested yet | -| DolphinDOS serial | NOT DONE | | -| DolphinDOS parallel | NOT DONE | | -| CIA burst mod | NOT DONE | | +| Driver | Status | Remarks | +| :-----------: | :------: | :------------------------------------------------: | +| standard | DONE | | +| JiffyDOS | DONE | | +| DolphinDOS | NOT DONE | | +| CIA burst mod | NOT DONE | | ## RS-232 -| Driver | Status | Remarks | -| :-----------------: | :------: | :------------------------------------------------: | -| UP2400 | NOT DONE | | -| UP9600 | NOT DONE | work in progress, not functional yet | -| ACIA 6551 | NOT DONE | | +| Driver | Status | Remarks | +| :-----------: | :------: | :------------------------------------------------: | +| UP2400 | NOT DONE | | +| UP9600 | NOT DONE | work in progress, not functional yet | +| ACIA 6551 | NOT DONE | | # API status diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index f35100af88e2d6c7313311859012e95170594896..a9f1c86991c2c338f5374342a260abfcc2d8ea51 100644 GIT binary patch delta 14 VcmZp0XmHpNE6-$TFgad+Apj(o1i}CS delta 14 VcmZp0XmHpNE6-$LIXPZ_Apj)41j+ya diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index 9a9d73279714d63f6770e646a437fed2d7f34625..7e056475e4e8963856a4ece71e30e717ba32a4ea 100644 GIT binary patch delta 14 VcmZp0XmHpNE6-$TFgad+Apj(o1i}CS delta 14 VcmZp0XmHpNE6-$LIXPZ_Apj)41j+ya diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index 301bcb53164445d2df007398fcfb7ddc466c14d6..7d402da212eda477ea13273e2fd4f25d77e87050 100644 GIT binary patch delta 14 VcmZp0XmHpNE6-$TFgad+Apj(o1i}CS delta 14 VcmZp0XmHpNE6-$LIXPZ_Apj)41j+ya diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 6583b51e0fa07e6096664b8ea1558fc2522fec70..c16ce9f8a381371663806543052290cccba74f2c 100644 GIT binary patch delta 14 VcmZp0XmHpNE6-$TFgad+Apj(o1i}CS delta 14 VcmZp0XmHpNE6-$LIXPZ_Apj)41j+ya diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 458494d42ff2c2b34b24f2a0dd45c63bedd2340d..1abd7c23cdb35dcfe642cc0bc84dff6105b57d71 100644 GIT binary patch delta 15 WcmZp0XmHqYgoVk_VDm8+D`@~Nqy;Vj delta 15 WcmZp0XmHqYgoVk#a`Q13D`@~N(*-sF diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index 93049ede3ff43df09dccfa95bfdd44c098673862..bcaa4aedd64e13bc32fbb879089b41e1ef7bcc23 100644 GIT binary patch delta 15 WcmZp0XmHqYgoVk_VDm8+D`@~Nqy;Vj delta 15 WcmZp0XmHqYgoVk#a`Q13D`@~N(*-sF diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index fc7df33b984c6010b7048ca8c011d290d326abca..0fff0fe8cb7a152451f39838dbddcc459a8a154a 100644 GIT binary patch delta 15 WcmZp0XmHqYgoVk_VDm8+D`@~Nqy;Vj delta 15 WcmZp0XmHqYgoVk#a`Q13D`@~N(*-sF diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index cc82b2e144ce8593d5e35634244e7d7ca93aa7d7..88de508d41b0b9dabe1dd4225d5dcabfe05a7504 100644 GIT binary patch delta 27 jcmZp0XmHqYgoVk_VDd4RpNwpi53ufKWZPWF)+7l4jmrtA delta 27 jcmZp0XmHqYgoVk#a`G{jpNtHX53ufK= 3.4 + +## Timing information + +When sending/receiving a byte, the JiffyDOS protocol timing is much more strict than the standard IEC. It is not enough to mask the interrupts - one has to make sure nothing will steal the CPU cycles. There are two ways to achieve this: + +- disable the screen completely for the duration of transmission; since VIC-II checks the bit in SCROLY register once per frame only, the code has to wait till the beginning of the next frame +- disable the sprites for the duration of transmission and synchronize with VIC-II RASTER/SCROLY registers to avoid badlines. Current implementation simply avoids transmission two lines before the badline; I suspect it can be reduced to one line, but it would need even more careful timing and would definitely mean inlining some subroutines - probably not worth the effort and increased code size, especially that 1541 JiffyDOS is not too fast sending bytes nevertheless + +Timing details are omitted by purpose - they are already described in [2], besides most of the time it was determined by observing VICE IEC logs and (for example) adding NOPs when necessary. The protocool is not cycle-exact, so our implementation probably behaves slightly differently than the original one. + +## Protocol detection + +Protocol detection happens when the IEC bus controller sends a command (under ATN) - first 7 bits of the commnad code is sent normally, detection is performed before sending the last bit: +- after releasing DATA, controller delays releasing the CLK +- if within about 400 usec (probably less time is needed, I took the value from a comment in the SD2IEC source code) the device pulls DATA line, it talks the JiffyDOS protocol +- in such case the controller waits till DATA is released again and continues the command transmission + +## Sending a command + +IEC commands are sent from the normally (with the additional protocol detection flow before the last bit). Althought it would be enough to perform detection within the TALK and LISTEN commands only, the original JiffyDOS ROMs tries to detect it every time. Omitting the detection is definitely not safe (depending on the command, it migh even cause the communication with device to fail, at least the 1541 JiffyDOS ROM shows such behavior). Moreover, it seems that only TALK/LISTEN commands cause the device to respond by pulling DATA; the controller side implementation has to be prepared for this. + +## Turnover + +Turnover (both to listener and to back to talker) is performed as usual. + +## Sending a byte + +Receiver releases DATA line once it is ready to receive a byte. When the bus controller is ready too (after possible 'badline synchronization' - this wasn't tested, but artificial delay might be needed when maintaining synchronization by screen blanking) it releases the CLK on his side. + +What happens now has to be carefully synchronized between bus controller and receiver, there is not much margin in terms of CPU cycles - see the source code and [2] for details. Basically, we are sending 2 bits a time (using CLK and DATA lines), without any sort of confirmation, and the only synchronization is done via instruction timing: + +- bits 4 (CLK out) and 5 (DATA out) +- bits 6 (CLK out) and 7 (DATA out) +- 2x two bits of the encoded low nibble + +Encoding the low nibble is done via lookup table, reverse engineered by observing the IEC logs from the original JiffyDOS ROMs in action. Unfortunately, IEC registers of the C64 and 1541 do not have the same layout - some bits are reversed and the bit layout is different (see [3]). Thus every single fast IEC protocol has to perform some kind of encoding/decoding; when sending byte using the JiffyDOS protocol the drive handles the high nibble and the controller - the lower one. + +Afterwards the controller either pulls the CLK quickly, or signals EOI by delaying this action. In our implementation the acceptable timing was adjusted by experimentation (pre-existing delay subroutine was used to reduce code size, also note that NTSC machines have slightly higher CPU frequency) - but it's important not to wait too long, 1541 JiffyDOS ROM can handle it, but SD2IEC implementation can not! + + +## Receiving a byte + +Device ready to send a byte signals it by releasing CLK, bus controller performs the 'badline synchronization' (note: if screen blanking method was choosen, artificial delay has to be inserted, otherwise communication with 1541 fails; also note the slightly faster CPU frequency on NTSC machines!). Controller releases the DATA line to signal it is ready to accept bits. + +Again, what happens now has to be carefully synchronized between bus controller and receiver, see [2]. Bits are received in the order shown below (using CLK and DATA lines), without any sort of confirmation, and the only synchronization is done via instruction timing: + +- bits 0 (CLK in) and 1 (DATA in) +- bits 2 (CLK in) and 3 (DATA in) +- bits 4 (CLK in) and 5 (DATA in) +- bits 6 (CLK in) and 7 (DATA in) + +No decoding is necessary (we just need to put received bits on proper positions by bit shifting and EOR manipulation to cancel the effect of non-IEC bits of the CIA register). I had to insert some delays (again - watch out for PAL/NTSC clock difference!) to make the protocol work. + +At the end the controller fetches the CLK/DATA bits and pulls DATA. If CLK is set at certain point, it means EOI (I'm not 100% sure about that, but such an implementation seems to work correctly). From 44f50cc3751f3fe839857302f6b7af5f1bcdb2c7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 10 Dec 2019 19:13:10 +0100 Subject: [PATCH 103/105] some documentation fixes (mostly spelling mistakes) --- c64/aliases/,aliases_ram_lowmem.s | 4 ++-- c64/kernal/iec_fast/jiffydos_bittable.s | 2 +- c64/kernal/iec_fast/load_jiffydos.s | 2 +- c64/kernal/iostack/load_save_common.s | 2 +- doc/Protocol-JiffyDOS.md | 3 +-- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index e5e8e393..814aff63 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -141,7 +141,7 @@ .label CAS1 = $C0 // tape motor interlock .label STAL = $C1 // $C1-$C2 LOAD/SAVE start address .label MEMUSS = $C3 // $C3-$C4 temporary address for tape LOAD/SAVE - .label LSTX = $C5 // last keyy matrix position [!] our usage probably differs in details + .label LSTX = $C5 // last key matrix position [!] our usage probably differs in details .label NDX = $C6 // number of chars in keyboard buffer .label RVS = $C7 // flag, whether to print reversed characters .label INDX = $C8 // end of logical line (column, 0-79) @@ -150,7 +150,7 @@ .label BLNSW = $CC // cursor blink disable flag .label BLNCT = $CD // cursor blink countdown .label GDBLN = $CE // cursor saved character - .label BLNON = $CF // cursor visibilityy flag + .label BLNON = $CF // cursor visibility flag .label CRSW = $D0 // whether to input from screen or keyboard .label PNT = $D1 // $D1-$D2 pointer to the current screen line .label PNTR = $D3 // current screen X position diff --git a/c64/kernal/iec_fast/jiffydos_bittable.s b/c64/kernal/iec_fast/jiffydos_bittable.s index b8b32367..94e89a39 100644 --- a/c64/kernal/iec_fast/jiffydos_bittable.s +++ b/c64/kernal/iec_fast/jiffydos_bittable.s @@ -7,7 +7,7 @@ // Similar tables are probably used by nearly all the disk turbo loaders, // either on the C64 or drive side, soometimes generated in RAM on the fly; -// example disk turbo presented below has a veryy similar table - but the +// example disk turbo presented below has a very similar table - but the // values are in reversed order: // - https://www.pagetable.com/?p=568 diff --git a/c64/kernal/iec_fast/load_jiffydos.s b/c64/kernal/iec_fast/load_jiffydos.s index 126187c4..463a276a 100644 --- a/c64/kernal/iec_fast/load_jiffydos.s +++ b/c64/kernal/iec_fast/load_jiffydos.s @@ -11,7 +11,7 @@ // see description at https://sites.google.com/site/h2obsession/CBM/C128/JiffySoft128 // // For simplicity and some space savings, our routine does not check the RUN/STOP key at all; -// the protocol is fast enough (especiallyy with modern flash mediums) that probably nobody +// the protocol is fast enough (especially with modern flash mediums) that probably nobody // will want to terminate the loading. diff --git a/c64/kernal/iostack/load_save_common.s b/c64/kernal/iostack/load_save_common.s index af5e1ad8..8f43b96b 100644 --- a/c64/kernal/iostack/load_save_common.s +++ b/c64/kernal/iostack/load_save_common.s @@ -220,7 +220,7 @@ lvs_display_saving: lda (FNADDR), y jsr JCHROUT iny - bne !- // jump alwayys + bne !- // jump always !: rts diff --git a/doc/Protocol-JiffyDOS.md b/doc/Protocol-JiffyDOS.md index 95388eeb..f3773ad7 100644 --- a/doc/Protocol-JiffyDOS.md +++ b/doc/Protocol-JiffyDOS.md @@ -20,7 +20,7 @@ For legal reasons, no disassembling of the JiffyDOS ROMs was performed (only IEC When sending/receiving a byte, the JiffyDOS protocol timing is much more strict than the standard IEC. It is not enough to mask the interrupts - one has to make sure nothing will steal the CPU cycles. There are two ways to achieve this: - disable the screen completely for the duration of transmission; since VIC-II checks the bit in SCROLY register once per frame only, the code has to wait till the beginning of the next frame -- disable the sprites for the duration of transmission and synchronize with VIC-II RASTER/SCROLY registers to avoid badlines. Current implementation simply avoids transmission two lines before the badline; I suspect it can be reduced to one line, but it would need even more careful timing and would definitely mean inlining some subroutines - probably not worth the effort and increased code size, especially that 1541 JiffyDOS is not too fast sending bytes nevertheless +- disable the sprites for the duration of transmission and synchronize with VIC-II RASTER/SCROLY registers to avoid badlines. Current implementation simply avoids transmission two lines before the badline; I suspect it can be reduced to one line, but it would need even more careful timing and would definitely mean inlining some subroutines - probably not worth the effort and increased code size Timing details are omitted by purpose - they are already described in [2], besides most of the time it was determined by observing VICE IEC logs and (for example) adding NOPs when necessary. The protocool is not cycle-exact, so our implementation probably behaves slightly differently than the original one. @@ -53,7 +53,6 @@ Encoding the low nibble is done via lookup table, reverse engineered by observin Afterwards the controller either pulls the CLK quickly, or signals EOI by delaying this action. In our implementation the acceptable timing was adjusted by experimentation (pre-existing delay subroutine was used to reduce code size, also note that NTSC machines have slightly higher CPU frequency) - but it's important not to wait too long, 1541 JiffyDOS ROM can handle it, but SD2IEC implementation can not! - ## Receiving a byte Device ready to send a byte signals it by releasing CLK, bus controller performs the 'badline synchronization' (note: if screen blanking method was choosen, artificial delay has to be inserted, otherwise communication with 1541 fails; also note the slightly faster CPU frequency on NTSC machines!). Controller releases the DATA line to signal it is ready to accept bits. From c180ae0a951e2683f685c87d3aa4282368b0fcf6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 14 Dec 2019 12:10:43 +0100 Subject: [PATCH 104/105] workaround for a screen editor bug triggered by XEMU --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_testing.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_testing.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/newc65.rom | Bin 131072 -> 131072 bytes c64/,,config_mega65.s | 4 ++-- c64/kernal/iec_fast/load_jiffydos.s | 2 +- 11 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index a9f1c86991c2c338f5374342a260abfcc2d8ea51..d09f539ff5b182e60c67761674d4aa5e357eb1a3 100644 GIT binary patch delta 13 UcmZp0XmHpNC(mdyIbMDt03g@|l>h($ delta 13 UcmZp0XmHpNC(mdwIbMDt03gH!kpKVy diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index 7e056475e4e8963856a4ece71e30e717ba32a4ea..06e4b304cc5da376cc7dfe4ce221c41c8943c79f 100644 GIT binary patch delta 1880 zcmcgt|8o;n5P!)vO=!|4Vrx^i?V}2alv>o%QV1<#OVlgWRz*SNN-adi?_X(^Fb-Ec zj*P9RPGLlDVlL)oo0)Xf>9iWC!-&1k0H@O*7)QrIQvt^>=Qlb6a_*%v{sGQ-xx2S- zvv1$-e%^j=XZ_B4*PD|=lT8h)SKhL+^+u^MYtB_CKymtG^pFw|oyww`DW|wdsW?N# z3a{`%U*0Ge6zEh^dC=BjYtuP?8Wgu`Xw%AOF<)sH3%r8t9G;urL%1H#w461(IK77> zC^CMxhhx*bFXI^Op3Tv+G(R*+1ZAP88hFHsYGkRB8wha0-iy&tW`c$H4k7?8VPcYW+?eO`fJ8gyTQ2!!uWI$v;x=yE8)W+nMnV z8)<3a8&cCkIAK;yU#*sDPG#aY zL!4k`Mf~1qWJ0SzxUW-#z4K!Jem~nGRav_=&_(N82 z(rVdW&h}X?J>#C=0{pRPPft(IXt4L&fINT3Cd->7mhHE)eYiAZ^G8&wa}`@JM5PB@ z8`oj!I}!eD`Z?pbF%w0#R=0YE8sVQjOar=&B^pgZuSchOIk9AE%%3cY`EiwiP&#ql zJY2`|=fHH-&HCE!3wE<$cnMTP4J?IPSO&|%2i57D(<`73>R}}uO?QNEfmP6P@K$Jm zMpzAgxD9THvS@1Z4ropD&;)DXtI4&{40l2cw8C9*H{1j3;9j^7*24z4A2z}Run7cc zgU!$m4?+iQfvpgLhv4BLJObO`QFsg{)b zf4=w>;IRqNVF=kj+WgkKanGM9<1L-HU!8LVzH3w3JiqW~r8$o4q&}xtlAW`ph_f!3 z;R{CSmj<3pM)naaJ!R01Vdj?Ibi`oTQzjXhEp6hfaeQ`My%vY!I1-0PtxdSb5cV4o z?kZrVk`C!~6mjXNvL1e{z)#0%vIQ{~N zBPMx$%`l#SorK)<@Qgc|j5h1}bjZ-$NNJfJ_7LkB|KoswdzfrMdMaljU12t-wcl|Y zMj|6JQlVkSHEJZ*AsHSv63r$f-eJC^{+wl->Y_@oeh7ob68Lcl#K!re0olOBwDbLu z&Tto>Gz4a#CPnnTVaEyNam)Cqq5WJV^!qb&-ATWQWAg^0W7-b^mX9F_G4?X{=LzX} z?uOD-3N?Y~VATS*evRtZFOT*6Q*J#69cCv}sSjH6UUXZL0kz@q&B)@hFFMXdVt0eL6NQg!M4_M0mjS5+(~1eqOA&=7VqI{FJJ(r_7?o&)>{ ze5`bdpUi07DnTwd%J_W;zZ>FTIfzH4dxSPb5_y*(H4zm@(ATi3&PTQMY3cO^MFZW7 Qc2&@u6r{o#%0|}y8yWP8n*aa+ delta 2202 zcmcgt{cjsZ8XkM&c$0OqZktdiy(ZH_lZJ*+4mE__nG4?r7SsX~s0eP`5HS3}F9$*- z08ngx`UhHj15_4)(Z0u++s#0XKmmViA35|w}?%)}(X9ZP@)TCRKV+U*_p z58U`;W@p~#eczpVo_F^5?e7acM<&VbH{N{hb=ThYTLonYb!=4QhZVu2=*X=D&N+ZiEGYy<33GB?=+vri9=)Ym3*vq~U0qXYmY>e%D}*9JI7IGVH_wJEl7Y0z+% zhD3F+XW1bQszb|2f~Q_xo~!YP+LTk|Q}P-4oXnAVvOvBdggg}Ok5aNoO5{uOKAj~? zWSI=ienq|}-;jThf0A#BNdoc5>35_%xkA1tKaj`hkK{C2B|nj$$r*B%{6hXk&Jl|s z>Yz@_&?@Sp)znQ{T0?6oM?JKT)>EE(Lv#&YOV`l`+DI>=>#2`6(Pp}V{)TR(E&qp4 zl^rCz>sBW(!dCeMg{)t?CMfyEL!M2J;X_@`g7{bROmv^xe4HL1e&v1o9>sC0Av|K? z-7)(-ID90AKZ}hp!gx{`SCELOiMAisBM5(BWzOn#rgwhlh%0iDFfAXgx-xWJ!#iiv z$f<81>C>;y{9biStcD~v{023rGz9+CLCGC+=fDOV%#v|>*bPA;NQS}dqpJHI)@1P0 zs_?hy1q}3%w`NJbaORMh;>h|9hp1F#{Wg^f#;PDE3uC?ke?Z>lTF(#B9`&llZ3(q! zu@kQ(4PJPfd;MxPEJd#v--7;3yy;6hPFE#qa zX9Kw1)c$}!w1V=Vs(td2>R#t!Om1?&;CwJDXWct~hom6h9FMqP-~0SMMeolrhOfdz zkni=qPu%nT-leejv>F_EKnkis1N4Hs6>g7zK=Y_l&Pk9}lx>6W<_^wpLKj0Lm_X@|BT|C!wqI=mL+kcM$9K8&G3 z2M>7kSnJx#DAbDa;g>57h8Vj>ZFSo)yOm+1krTE#z*3P&WmKLA`JALKsIzXU?PFtjwKvj9)5a&j-D%+-xjNK&Wzn|8$kd3qfD7fvux;buOf#3FO3I zT6hc9c!kH)mImd*W~9w41%qA-(GEO-aw>{x6tIwa(*L%Z7K7Ov?I5H|!lnzT#ksZi2b124)H zj1|ozHE68VXfW^^Wd*1Wpa8WI6p-ebK&qa3rH)B^n622$fE=w<_l|BPFK`#jjK{xw zC23P0L6UY7&jvK4xW^&1y)&uJr0}-b$=X5+Zl$vll!bR`*L7^oT4u@;=p^>?u z(q6Ht^5u}@DLFL((6Y@9DcNK{!m zV5-%gFgg79H10Hm@q+P9P-}oK7Zchs(DS_fN!@*|)|_2;;@KS?ym_(Co9hx|fqCAn z1&`G^Ywp!M>-X_aC=ABNj!h4jZ&Kj=d%$^J-D7&nrHsLg#|8fk{L9TPn_S&-xOL^e zmPcz(q*PY-0)J%rwU*r-6AQ-TQsJb>Sc!2(@V~B@n^=IboZai^UIQ4uWD`Y z-`;i8^<7sWRK97X$qEr8NemTwGngJt!u@bU9g^Ox%h($ delta 13 UcmZp0XmHpNC(mdwIbMDt03gH!kpKVy diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index c16ce9f8a381371663806543052290cccba74f2c..4c147b6cf5ad64da75d8bcf67fa2645c360e6493 100644 GIT binary patch delta 13 UcmZp0XmHpNC(mdyIbMDt03g@|l>h($ delta 13 UcmZp0XmHpNC(mdwIbMDt03gH!kpKVy diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 1abd7c23cdb35dcfe642cc0bc84dff6105b57d71..749b319ea43ee9939579cb54976c2321083fdfb6 100644 GIT binary patch delta 14 VcmZp0XmHqYl!eh`^D!1HX#go~1pxp6 delta 14 VcmZp0XmHqYl!eh?^D!1HX#goy1pNR2 diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index bcaa4aedd64e13bc32fbb879089b41e1ef7bcc23..58a7a0c716e9614147a9ff12c1ecf8f8bf25de1f 100644 GIT binary patch delta 472 zcmYjM%}X0W6rasRGImlEB^GULnL|MjB@j`ulxUzIC=8TJ@hC%2E%+B`L5r>z2?)6; z2#U-!9W}B`PdyYu4`mZjhTeo8Rwh&i=eN)~pTGAd`G~B}#1^s|1cYrF0NlS;L~FpQ zX#`{;39!6XBC1K}o}`A}fNC!dk)$74F9BC{x@l8$w?V)|(lGIV0H5?*sbKyk7GfUv z6%BENfU~Dj`vkFzPS1RktaLfp+Z2_w)3Mq2x-Ps*+B7s0&VHo0jtBCCau>O|DbLN> z6R+%?;FbE`9llc*%IR>!o;}8P%F1Q=U&?{T21C9o*+sq8QvqMo#l`5uC4OF7udm2A z>UJq8tsR{N#{r=5>_(HlkZfK%lyyqB{cZ#E9|!!m7O;c)&jExloNfoE+g%8;XTIyW zozleaH5de%7m`?|3f)-s7J6_wfu|0;@X<|Nj^iPg#1P*+92*@gzKz^U|NZ%F#(Ml@ aHj{mj9nOwqo<7QC5fXxb(;vP@GwCaRCBr2E delta 244 zcmZp0XmHs0a23CofyTu+i4z#75gzyNp)b1fP&6i)4M~uT5Aar!ar* zQmd2yKkzJ)2Q!yhDtub4p#H(9WyvdwflupdAH65bbay@A*ub=iBVpyq1uGQfR<8_Q zupdY*VqPGm!1Giged!{W1q>jT(gz>)50m#Z%W_vg0Xjfo#StvOQ?p?6B^Ett07a>WVE_OC diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 0fff0fe8cb7a152451f39838dbddcc459a8a154a..4f8f47340256964d22ef8df8835b9753dbb8138b 100644 GIT binary patch delta 14 VcmZp0XmHqYl!eh`^D!1HX#go~1pxp6 delta 14 VcmZp0XmHqYl!eh?^D!1HX#goy1pNR2 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 88de508d41b0b9dabe1dd4225d5dcabfe05a7504..2106f3ec89a2b6eff14065e5ba9b179e194bc2ca 100644 GIT binary patch delta 14 VcmZp0XmHqYl!eh`^D!1HX#go~1pxp6 delta 14 VcmZp0XmHqYl!eh?^D!1HX#goy1pNR2 diff --git a/bin/newc65.rom b/bin/newc65.rom index 08a6fbf82198787c0f08543eac042455e9e2515a..90f97c65b248809436faa3be84c32f5174879f80 100644 GIT binary patch delta 2169 zcmcgt|8o<^6+h{0OSTLW#DERKS=dWrl-g|HNz0ZC=+t=sr>vJc(vb0huUo{J=ClDiN)S&25H`dL0#EojzHBPK5 z6_SoAzC$2$DfOBB?))y3r}LnCHA|mY4~Qk|L2+5BAbZB{$)4c&0pGlwH&&B9!E-od z^q7xl^T(F(42~`3Nkx{9W;j9JAo|rxahnhsH{1zl*ey+Fmf!t)l&mx9QAHr*8P-Pz ztuRL}Sc#k3BGYHI4(5lK)1Y)(xi8c_LRu%{oKveFY}B?S9#CDPn{lEG|2@np_L4$H z?GarOR|;*2&R^9(?st)rEO|AO;7PHpy8h%gdGZsL{!+Q^gS}te#w@X(_A~ORB0G|P z-66<%Nx#OK1!;YregNsA(r$l1+M}-UUdhy{o98yf)VjG!@_JNyLA_9MhG~^%p+?N> z~ssDEb9y0#>ZXEb$kp&ga^iXw&w+O++di ze#Kdvm6F4?q4(toDTgp87m?yQ_U^)yW8rCuJdE$yWAdbJ!sjN*b85Ii=Fpf{n73=e z<8IaC)jWMxAq`QoFGANwWge3oNcv+zECH!Bv4}Hv#mwDWh3-*j9<;<6R#8SzMk6zN zm1dduYN5fkvA|G(9T98UB}s|i(;WCkfN^sE3C=O#yAhOEpvkg8*jbu#I$o?~r<{&~ zY2Uwt^g?uCV4!F!H2C+Ryl%lJuQbIuUfjt}p=-|OdQ@r{S?&BZDs_%@v}5Ue5dH%4 z4x@*djiOd>I!lE*;qyFf19FHZcG&~75rZx+ily#~1ybd)0D1`sr3d}iq90FhfE}ox zNeAU8L;WnIY=X^D2V0;Xw!#D8ht1jhv)iBn8euz}&vq+cgB{R4xf7aT7wm=rJO~d# zMbyYV412Q_n&A=nOQr={VGp#yUU(E9gU6vAo`5G|A3Oz5LkD!ieh{Dw4!}Wp2D;%{ zcn*T_b$C7m-+)8#P52gk8@>bIh3~=l;Ro_^Xx^WawwB#GutFHlUGI! zK=gxT48pG8ANWoCwC@uf<4?Ldd}q-)xZI_7`Tj*emexe?m5xKHBtxMTfre0y^^7AI zEj(b1JHt!4=swRA5kQ*MP5oHI?|9}#d3o7CJubs?$_W^+~l2$x}8WL!o; zv+R9MS&4Skw6j*C)fTpg?M51kZQb7xRR_&8xLGVg0J~spnwE{o7AB_O9E$WPy)gq#Ppx0`4$E<;dhi^US5v#p;+)*` zY(hwl6VDfMhU(UQSdR~+-%adWf8>%rcQt*sSpP8Mna22cOs9@q z!eu>nuie6`&risGIF>d~t~+>t)vg^?H5`WmjVEXn35kI|1A=N=fu=VAwfrr$SA2V6 z#;b8i>GO=9n!G$pe?EyvrGK0>MG}i|Luw-`j$^Dbd%6Utr9Vu5xwvekf8)_Aa-WKd z_U8O#A?Z+Ey0cC|L$~O$LHnbDvG=GRz3i&$(i|qwtV(uknsgfW+fIW<4aGgiISRcf zR+sH7C+CJQsIlOYH;p#aczQYwsWe`_g&K;-^nTHaHW+p!bU5q6?1~N5WAc~Xg5pjy zE*BQBjQ3`xpT<}H)`&T!mos-Zu2T?>FWe$@DidB!Psar{k)Je|h6ydkI#r*p$EXI@ect1E}I!~JiZ&z{TXDvtLo7Q~i84^|4VNUZ)x zKtEx^0undCJ`3-?n$?#e&G@wbAuAS3m|I+?^LA;UhBdB!W{qsB-E`cseAQ>yTiP5u dn;x&K*;4b>n%me40+Q;bi`mhOSx42X{{nK9|1$sp delta 2259 zcmcgu|8E;-8Gr4IV<&cFH%(S2ZIibxO%|G&l+i5B@Mzh(88}2X3L8a*YqL2;NZrR$fmi2hf zZejZecx~VN+d|YH*qKfodwO_Y-xjs%h)5EX@ zBBIPNc8TdnO+(+WhQ=G}6WP2N$mYZVpg0xlPQY~lj$vmMGf;;pye@w$)FECWezCQIb6gplt=2cwiMlNEB6yh-z9m0Tl3`M;6BlXu8J$Un)uL??mxkLY`(S6L(P zlMl!<^g6jg*2%xfhvX)?MgC1bBDaY_5VcS%WoQkx(OPP!4q8X+sgt_s2HHT~)Dxl` zX(Qc4n`kq=hi;}`+Cp3D7P^&gqiz3(PmP%*WBIbx&B5OJ1I3J=e<;ZNIl(1vw~Prs zv6basB+o}rO0BbWcI=fm=^GTssf_Trfe**bU3cPhG5mIHoMERFc1lDXULf))JdYs! zmXW@tZqPmDfpJ^p9(F;PiQXTYmGM9>g{*4N_VcgTph!*5u&@*@yW8s_aW zdlr1K#;j^L#_W(3lB5~DIV#zI>(CkeoW%YtdKUvd%v?73emGf}m}trPH47)!Wc(&! zirP9WD8)(dkUthc%xWg{s3FyamxeEO|Zz8@?hFLEcx7{rJh3j;)40H>BXucle+b)Ib%u zH@&T|Y!%o<guw*1swJPJ_-}VXQ7Y}^>OAnjSiI5Cea0+1@naJHizg8W)6Bz%Z zg1wXUzDhH(FaW743I5wvZ|^33*#x#vY}jB!GMYwKeAU3asO%Qqc)^h27)?f+yb@6; zGpsQzmry?i-LnaxuSe}qyNXbAJ_D@T&Hhow*Ah5u;DP~aSWK9)I(6(zRLHJs@15-xe( z53+5^a5!9F2#qfW#m=fvjW>%dCxqlQKr23vBn3Ub&H9z3;FgaZk?fkaj|1sDc&EAS z=Ta)t9+#Y2%c^8oEjl9`-SX`cZb_L>TT<*`D(aX=mO3}gWyP#H6&O6Qr>cmW68My0 z;w>rRNV#XHJr#B8?vI1mn@KYg04~|#0DqSh(&gr-P+9X78q!R0k}GUU+a|r=CtR_x zMO%@PSw&<6wz!P+hWXAi=-*N*7}~pi++?6~uRHPYQ@C3X#*5lJLAeQbjZ4VqL3U-~ zPpNOW8;fRnh-db8x%Hi@Ti=wJ43yn^Jp`=H8jBa6c;%$q3i{QuUE7a~=4k;n-vDZ= z(ox-2sW=Q?o@Moj}yHY|8OCys(GJdp1k?D0MNux}4Sl@|g(SLI7Y!B9wdfa{C`W&ENv z!oOA>al`4TxgzZqGqw-voGG$X zQQ?5nCk!a{pJRE2_0iZu*^#zJ9Gt9*aoncJ-w^ZAMHsOWyO!~BDN-XM)7qi4ow|@G z+ngg5!obqazY Date: Sat, 14 Dec 2019 20:33:38 +0100 Subject: [PATCH 105/105] explained all similarities longer than 3 bytes --- strings/00A9009900 | 3 +++ strings/012910F0 | 3 +++ strings/02A21E4C | 3 +++ strings/02F0034C | 3 +++ strings/0D505245535320504C4159204F4E20544150 | 8 ++++++++ strings/18D00902D0 | 3 +++ strings/2044E54C | 3 +++ strings/20504C4159204F4E20544150 | 3 +++ strings/208AAD20 | 3 +++ strings/20A9EEB0 | 3 +++ strings/20EAFFA5 | 3 +++ strings/2910F009 | 3 +++ strings/459B859B | 3 +++ strings/464F554E | 3 +++ strings/464F554E44A0 | 3 +++ strings/48A5AF48 | 3 +++ strings/48A5D0F0 | 3 +++ strings/494E47A0 | 3 +++ strings/494EC70D534156494E47A0 | 3 +++ strings/50524553 | 3 +++ strings/505245535320 | 3 +++ strings/60A599D0 | 3 +++ strings/6885AF6885 | 3 +++ strings/6885AF6885AE | 3 +++ strings/6C30038593 | 3 +++ strings/78AD11D0 | 4 ++++ strings/83028C8402 | 3 +++ strings/85AF6885 | 3 +++ strings/85AF6885AE | 3 +++ strings/8D05DDA9 | 3 +++ strings/8E03DC8E03DD | 3 +++ strings/8E16D020 | 3 +++ strings/90F004A90D18604C | 3 +++ strings/91D18810 | 3 +++ strings/A000D1AEF0 | 3 +++ strings/A20FDDDAE8 | 3 +++ strings/A5010920 | 3 +++ strings/A5010920D0 | 3 +++ strings/A5AE48A5AF48 | 3 +++ strings/A5C385C1A5C4 | 3 +++ strings/A6AEA4AF | 3 +++ strings/A92091D188 | 3 +++ strings/AD11D009108D11D0 | 3 +++ strings/AE48A5AF48 | 3 +++ strings/AFA5C385C1A5C485C2 | 3 +++ strings/B1B220D2FFC8C0 | 3 +++ strings/B50085C1 | 3 +++ strings/B50185C2 | 3 +++ strings/B7D0034C | 3 +++ strings/BB20D2FFC8 | 3 +++ strings/C8B1B285 | 3 +++ strings/C8C015D0 | 3 +++ strings/C8D0F4A23C | 3 +++ strings/CAD0F660 | 3 +++ strings/E5A9008D | 3 +++ strings/E6AED002E6AF | 3 +++ strings/EAEAAD00DD | 4 ++++ strings/ED4C25FE4C | 3 +++ strings/EDAD00DD | 3 +++ strings/EDAD00DD29 | 3 +++ strings/F0AD11D029EF8D11D0AD | 3 +++ strings/F3A5BA20 | 3 +++ strings/F7C903F0 | 3 +++ strings/FF00000000 | 3 +++ strings/FF0000000000 | 3 +++ strings/FF586C00A0A2 | 3 +++ 66 files changed, 205 insertions(+) create mode 100644 strings/00A9009900 create mode 100644 strings/012910F0 create mode 100644 strings/02A21E4C create mode 100644 strings/02F0034C create mode 100644 strings/0D505245535320504C4159204F4E20544150 create mode 100644 strings/18D00902D0 create mode 100644 strings/2044E54C create mode 100644 strings/20504C4159204F4E20544150 create mode 100644 strings/208AAD20 create mode 100644 strings/20A9EEB0 create mode 100644 strings/20EAFFA5 create mode 100644 strings/2910F009 create mode 100644 strings/459B859B create mode 100644 strings/464F554E create mode 100644 strings/464F554E44A0 create mode 100644 strings/48A5AF48 create mode 100644 strings/48A5D0F0 create mode 100644 strings/494E47A0 create mode 100644 strings/494EC70D534156494E47A0 create mode 100644 strings/50524553 create mode 100644 strings/505245535320 create mode 100644 strings/60A599D0 create mode 100644 strings/6885AF6885 create mode 100644 strings/6885AF6885AE create mode 100644 strings/6C30038593 create mode 100644 strings/78AD11D0 create mode 100644 strings/83028C8402 create mode 100644 strings/85AF6885 create mode 100644 strings/85AF6885AE create mode 100644 strings/8D05DDA9 create mode 100644 strings/8E03DC8E03DD create mode 100644 strings/8E16D020 create mode 100644 strings/90F004A90D18604C create mode 100644 strings/91D18810 create mode 100644 strings/A000D1AEF0 create mode 100644 strings/A20FDDDAE8 create mode 100644 strings/A5010920 create mode 100644 strings/A5010920D0 create mode 100644 strings/A5AE48A5AF48 create mode 100644 strings/A5C385C1A5C4 create mode 100644 strings/A6AEA4AF create mode 100644 strings/A92091D188 create mode 100644 strings/AD11D009108D11D0 create mode 100644 strings/AE48A5AF48 create mode 100644 strings/AFA5C385C1A5C485C2 create mode 100644 strings/B1B220D2FFC8C0 create mode 100644 strings/B50085C1 create mode 100644 strings/B50185C2 create mode 100644 strings/B7D0034C create mode 100644 strings/BB20D2FFC8 create mode 100644 strings/C8B1B285 create mode 100644 strings/C8C015D0 create mode 100644 strings/C8D0F4A23C create mode 100644 strings/CAD0F660 create mode 100644 strings/E5A9008D create mode 100644 strings/E6AED002E6AF create mode 100644 strings/EAEAAD00DD create mode 100644 strings/ED4C25FE4C create mode 100644 strings/EDAD00DD create mode 100644 strings/EDAD00DD29 create mode 100644 strings/F0AD11D029EF8D11D0AD create mode 100644 strings/F3A5BA20 create mode 100644 strings/F7C903F0 create mode 100644 strings/FF00000000 create mode 100644 strings/FF0000000000 create mode 100644 strings/FF586C00A0A2 diff --git a/strings/00A9009900 b/strings/00A9009900 new file mode 100644 index 00000000..01c5cb64 --- /dev/null +++ b/strings/00A9009900 @@ -0,0 +1,3 @@ +$00 + LDA #$00 + STA (address does not fully match),Y + +Instruction + some parts. Trivial, not copyrightable. diff --git a/strings/012910F0 b/strings/012910F0 new file mode 100644 index 00000000..e106620d --- /dev/null +++ b/strings/012910F0 @@ -0,0 +1,3 @@ +$01 + AND #$10 + BEQ (offset does not match) + +Instrcution + some parts. Trivial - not copyrightable. diff --git a/strings/02A21E4C b/strings/02A21E4C new file mode 100644 index 00000000..874f43f7 --- /dev/null +++ b/strings/02A21E4C @@ -0,0 +1,3 @@ +$02 + LDX #$1E + JMP (address does not match) + +Instruction and some parts - trivial, not copyrightable. diff --git a/strings/02F0034C b/strings/02F0034C new file mode 100644 index 00000000..6b918606 --- /dev/null +++ b/strings/02F0034C @@ -0,0 +1,3 @@ +$02 + BEQ (skip next instruction) + JMP (address does not match) + +Instruction and some parts - trivial, not copyrightable. diff --git a/strings/0D505245535320504C4159204F4E20544150 b/strings/0D505245535320504C4159204F4E20544150 new file mode 100644 index 00000000..acdaf769 --- /dev/null +++ b/strings/0D505245535320504C4159204F4E20544150 @@ -0,0 +1,8 @@ + + 'PRESS PLAY ON TAP' PETSCII string + +The 'PRESS PLAY ON TAPE' cannot be copyrighted, as it is a short, not creative phrase, not used to sell anything. Since then it became a part of the popular culture, it is already used on countless -shirts, book titles, there is even a music band with such name: + +https://books.google.pl/books/about/Press_play_on_tape_Storia_di_un_videogio.html?id=tH5pngEACAAJ +https://www.youtube.com/user/pressplayontape + +Such a phrase is not copyrightable - see https://fairuse.stanford.edu/2003/09/09/copyright_protection_for_short/ diff --git a/strings/18D00902D0 b/strings/18D00902D0 new file mode 100644 index 00000000..c8fb8d9d --- /dev/null +++ b/strings/18D00902D0 @@ -0,0 +1,3 @@ +$D018 + ORA #$02 + BNE (offset does not match) + +Instruction + some parts (including address of a documented I/O register) - trivial, not copyrightable. diff --git a/strings/2044E54C b/strings/2044E54C new file mode 100644 index 00000000..147b349e --- /dev/null +++ b/strings/2044E54C @@ -0,0 +1,3 @@ +JSR $E544 (clear screen) + JMP (address does not match) + +Instruction (call to a well-known routine) + some part - trivial, not copyrightable. diff --git a/strings/20504C4159204F4E20544150 b/strings/20504C4159204F4E20544150 new file mode 100644 index 00000000..bd2305c1 --- /dev/null +++ b/strings/20504C4159204F4E20544150 @@ -0,0 +1,3 @@ +PETSCII string: ' PLAY ON TAP' + +Not even a full phrase - not copyrightable. diff --git a/strings/208AAD20 b/strings/208AAD20 new file mode 100644 index 00000000..7daa77b7 --- /dev/null +++ b/strings/208AAD20 @@ -0,0 +1,3 @@ +JSR $AD8A + JSR (address does not match) + +Instruction and a half. Trivial, not copyrightable. diff --git a/strings/20A9EEB0 b/strings/20A9EEB0 new file mode 100644 index 00000000..92ee40c6 --- /dev/null +++ b/strings/20A9EEB0 @@ -0,0 +1,3 @@ +JSR $EEA9 + BCS (offset does not match) + +Instruction + some part. TYrivial, not copyrightable. diff --git a/strings/20EAFFA5 b/strings/20EAFFA5 new file mode 100644 index 00000000..278cda7c --- /dev/null +++ b/strings/20EAFFA5 @@ -0,0 +1,3 @@ +JSR $FFEA (UDTIM) + LDA (zeropage address does not match) + +Instruction (call to the official routine) + some part. Trivial, not copyrightable. diff --git a/strings/2910F009 b/strings/2910F009 new file mode 100644 index 00000000..799507da --- /dev/null +++ b/strings/2910F009 @@ -0,0 +1,3 @@ +AND #$10 + BEQ (offset matches) + +Check whether the bit of the data in accumulator is set or not. Trivial and not creative - not copyrightable. diff --git a/strings/459B859B b/strings/459B859B new file mode 100644 index 00000000..0983a62c --- /dev/null +++ b/strings/459B859B @@ -0,0 +1,3 @@ +EOR $9B + STA $9B + +Part of the code (incomplete) calculating EOR checksum of data stream - not creative, not copyrightable. diff --git a/strings/464F554E b/strings/464F554E new file mode 100644 index 00000000..a13ffe96 --- /dev/null +++ b/strings/464F554E @@ -0,0 +1,3 @@ +'FOUN' PETSCII string + +Not even a full word - not copyrightable. diff --git a/strings/464F554E44A0 b/strings/464F554E44A0 new file mode 100644 index 00000000..b9e7886a --- /dev/null +++ b/strings/464F554E44A0 @@ -0,0 +1,3 @@ +PETSCII string, with end of string encoded by high bit set: 'FOUND ' + +Single word followed by space, string encoding common for 6502 CPU (for example, Turbo Basic XL for Atari uses the same) - not copyrightable. diff --git a/strings/48A5AF48 b/strings/48A5AF48 new file mode 100644 index 00000000..038ee560 --- /dev/null +++ b/strings/48A5AF48 @@ -0,0 +1,3 @@ +PHA + LDA $AF + PHA + +Piece of code copying EAL variable to the stack. Trivial - not copyrightable. diff --git a/strings/48A5D0F0 b/strings/48A5D0F0 new file mode 100644 index 00000000..a7e65abd --- /dev/null +++ b/strings/48A5D0F0 @@ -0,0 +1,3 @@ +PHA + LDA $D0 + BEQ (address does not match) + +Check the input (screen vs keyboard), preserving .A on stack - trivial, not copyyrightable. diff --git a/strings/494E47A0 b/strings/494E47A0 new file mode 100644 index 00000000..9c2cb283 --- /dev/null +++ b/strings/494E47A0 @@ -0,0 +1,3 @@ +PETSCII string, with end of string encoded by high bit set: 'ING ' + +Single syllable, string encoding common for 6502 CPU (for example, Turbo Basic XL for Atari uses the same) - not copyrightable. diff --git a/strings/494EC70D534156494E47A0 b/strings/494EC70D534156494E47A0 new file mode 100644 index 00000000..37fe667e --- /dev/null +++ b/strings/494EC70D534156494E47A0 @@ -0,0 +1,3 @@ +PETSCII string, with end of string encoded by high bit set: 'ING' + RETURN + 'SAVING ' + +Single word with some parts, string encoding common for 6502 CPU (for example, Turbo Basic XL for Atari uses the same) - not copyrightable. diff --git a/strings/50524553 b/strings/50524553 new file mode 100644 index 00000000..e8e7d394 --- /dev/null +++ b/strings/50524553 @@ -0,0 +1,3 @@ +'PRES' PETSCII string + +Not even a full word - not copyrightable. diff --git a/strings/505245535320 b/strings/505245535320 new file mode 100644 index 00000000..97c99f36 --- /dev/null +++ b/strings/505245535320 @@ -0,0 +1,3 @@ +PETSCII string, with end of string encoded by high bit set: 'PRESS ' + +Single word followed by space, string encoding common for 6502 CPU (for example, Turbo Basic XL for Atari uses the same) - not copyrightable. diff --git a/strings/60A599D0 b/strings/60A599D0 new file mode 100644 index 00000000..d3705eb2 --- /dev/null +++ b/strings/60A599D0 @@ -0,0 +1,3 @@ +RTS + LDA $99 + BNE (offset does not match) + +Routine starts by checking whether a documented zeropagevariable is 0 or not - trivial, not copyrightable. diff --git a/strings/6885AF6885 b/strings/6885AF6885 new file mode 100644 index 00000000..112c7f10 --- /dev/null +++ b/strings/6885AF6885 @@ -0,0 +1,3 @@ +PLA + STA $AF + PLA + STA (zero page address does not match) + +Piece of code retrieving some zero page variables from the stack (not even identical varaibles) - trivial, not copyrightable. diff --git a/strings/6885AF6885AE b/strings/6885AF6885AE new file mode 100644 index 00000000..d638c4b5 --- /dev/null +++ b/strings/6885AF6885AE @@ -0,0 +1,3 @@ +PLA + STA $AF + PLA + STA $AE + +Piece of code copying EAL variable from the stack to zero page locatioon. Trivial - not copyrightable. diff --git a/strings/6C30038593 b/strings/6C30038593 new file mode 100644 index 00000000..c854535f --- /dev/null +++ b/strings/6C30038593 @@ -0,0 +1,3 @@ +JMP ($0330) + STA $93 + +Jump via vector + loading value of a documented zero page variable - trivial, not copyrightable. diff --git a/strings/78AD11D0 b/strings/78AD11D0 new file mode 100644 index 00000000..19c817f3 --- /dev/null +++ b/strings/78AD11D0 @@ -0,0 +1,4 @@ +SEI + LDA $D011 + +Disable interrupts and load value of the I/O register - nothing creative here, to use value from $D011 one often disables interrupts, +otherwise several scanlines might pass if interrupt happens in between our routine. Not copyrightable. diff --git a/strings/83028C8402 b/strings/83028C8402 new file mode 100644 index 00000000..4e3d81c7 --- /dev/null +++ b/strings/83028C8402 @@ -0,0 +1,3 @@ +$0283 + STY $0284 + +Instruction + some part (both accessing documented related addresses) - trivial, not copyrightable. diff --git a/strings/85AF6885 b/strings/85AF6885 new file mode 100644 index 00000000..e20e5ca7 --- /dev/null +++ b/strings/85AF6885 @@ -0,0 +1,3 @@ +STA $AF + PLA + STA $AE + +Part of a routine retrieving EAL 16-bit variable value from stack - trivial, not copyrightable. diff --git a/strings/85AF6885AE b/strings/85AF6885AE new file mode 100644 index 00000000..8ef3455e --- /dev/null +++ b/strings/85AF6885AE @@ -0,0 +1,3 @@ +STA $AF + PLA + STA (zeropage address does not match) + +Part of a routine retrieving EAL 16-bit variable value from stack - trivial, not copyrightable. diff --git a/strings/8D05DDA9 b/strings/8D05DDA9 new file mode 100644 index 00000000..981b1ebd --- /dev/null +++ b/strings/8D05DDA9 @@ -0,0 +1,3 @@ +STA $DD05 + LDA (value does not match) + +Instruction (storing byte in a documented I/O register) + some part. Trivial, not copyrightable. diff --git a/strings/8E03DC8E03DD b/strings/8E03DC8E03DD new file mode 100644 index 00000000..8dced645 --- /dev/null +++ b/strings/8E03DC8E03DD @@ -0,0 +1,3 @@ +STX $DC03 + STX $DD03 + +Part of system initialization - store the same value in both CIA chips. Trivial - not copyrightable. diff --git a/strings/8E16D020 b/strings/8E16D020 new file mode 100644 index 00000000..2aa436db --- /dev/null +++ b/strings/8E16D020 @@ -0,0 +1,3 @@ +STX $D016 + JSR (address does not match) + +Instruction (storing data in a documented I/O register) + some part. Trivial - not copyrightable. diff --git a/strings/90F004A90D18604C b/strings/90F004A90D18604C new file mode 100644 index 00000000..0d90900d --- /dev/null +++ b/strings/90F004A90D18604C @@ -0,0 +1,3 @@ +$90 + BEQ (skip 3 bytes) + LDA #$0D + CLC + RTS + JMP + +Routine ending, returning error code or success - trivial, not copyrightable. diff --git a/strings/91D18810 b/strings/91D18810 new file mode 100644 index 00000000..771b2981 --- /dev/null +++ b/strings/91D18810 @@ -0,0 +1,3 @@ +STA ($D1),Y + DEY + BPL (offset does not match) + +Small part of a loop filling a screen line - trivial, not copyrightable. diff --git a/strings/A000D1AEF0 b/strings/A000D1AEF0 new file mode 100644 index 00000000..99173118 --- /dev/null +++ b/strings/A000D1AEF0 @@ -0,0 +1,3 @@ +LDY #$00 + CMP ($AE),Y + BEQ (address does not match) + +Check of the value poined by EAL variable (whether it is 0 or not) - not creative, not copyrightable. diff --git a/strings/A20FDDDAE8 b/strings/A20FDDDAE8 new file mode 100644 index 00000000..63253a2e --- /dev/null +++ b/strings/A20FDDDAE8 @@ -0,0 +1,3 @@ +LDX #$0F + CMP $E8DA,X + +Small part of a loop checking for PETSCII code in color table (the loop as a whole differs) - trivial, not copyrightable. diff --git a/strings/A5010920 b/strings/A5010920 new file mode 100644 index 00000000..f6c58a16 --- /dev/null +++ b/strings/A5010920 @@ -0,0 +1,3 @@ +LDA $01 + ORA #$20 + +Part of code (two instructions only) to set a bit in a documented I/O register (for manipulating tape motor) - trivial, not copyrightable. diff --git a/strings/A5010920D0 b/strings/A5010920D0 new file mode 100644 index 00000000..542bc60a --- /dev/null +++ b/strings/A5010920D0 @@ -0,0 +1,3 @@ +LDA $01 + ORA #$20 + BNE (offset does not match) + +Simple check whether the button on a tape deck has been pressed - trivial, not copyrightable. diff --git a/strings/A5AE48A5AF48 b/strings/A5AE48A5AF48 new file mode 100644 index 00000000..5090ea36 --- /dev/null +++ b/strings/A5AE48A5AF48 @@ -0,0 +1,3 @@ +LDA $AE + PHA + LDA $AF + PHA + +Piece of code copying EAL variable from zero page to the stack. Trivial - not copyrightable. diff --git a/strings/A5C385C1A5C4 b/strings/A5C385C1A5C4 new file mode 100644 index 00000000..13ca1511 --- /dev/null +++ b/strings/A5C385C1A5C4 @@ -0,0 +1,3 @@ +LDA $C3 + STA $C1 + LDA $C4 + +Copying one 16-bit zero page variable to another (not even complete) - trivial, not copyrightable. diff --git a/strings/A6AEA4AF b/strings/A6AEA4AF new file mode 100644 index 00000000..f0466ef6 --- /dev/null +++ b/strings/A6AEA4AF @@ -0,0 +1,3 @@ +LDX $AE + LDY $AF + +Load documented 16-bit variable (EAL) into registers .X and .Y - trivial, not copyrightable. diff --git a/strings/A92091D188 b/strings/A92091D188 new file mode 100644 index 00000000..357e4bba --- /dev/null +++ b/strings/A92091D188 @@ -0,0 +1,3 @@ +LDA #$20 + STA ($D1),Y + DEY + +Part of the loop (it macthes only partially) to fill-in a screen line with spaces - trivial, not copyrightable. diff --git a/strings/AD11D009108D11D0 b/strings/AD11D009108D11D0 new file mode 100644 index 00000000..7b25284f --- /dev/null +++ b/strings/AD11D009108D11D0 @@ -0,0 +1,3 @@ +LDA $D011 + ORA #$10 + STA $D011 + +Setting a bit in a documented I/O register (to turn on the screen) - trivial, not copyrightable. diff --git a/strings/AE48A5AF48 b/strings/AE48A5AF48 new file mode 100644 index 00000000..a754e049 --- /dev/null +++ b/strings/AE48A5AF48 @@ -0,0 +1,3 @@ +$AE + PHA + LDA $AF + PHA + +Part of a routine storing EAL 16-bit variable value to stack - trivial, not copyrightable. diff --git a/strings/AFA5C385C1A5C485C2 b/strings/AFA5C385C1A5C485C2 new file mode 100644 index 00000000..7ec2db32 --- /dev/null +++ b/strings/AFA5C385C1A5C485C2 @@ -0,0 +1,3 @@ +$AF + LDA $C3 + STA $C1 + LDA $C4 + STA $C2 + +Copyying one 16-bit zeropage variable to another. Trivial - not copyrightable. diff --git a/strings/B1B220D2FFC8C0 b/strings/B1B220D2FFC8C0 new file mode 100644 index 00000000..2b919186 --- /dev/null +++ b/strings/B1B220D2FFC8C0 @@ -0,0 +1,3 @@ +LDA ($B2),Y + JSR $FFD2 + INY + CPY (value does not match) + +Small part of loop indexed by .Y, outputing data via CHROUT - not creative, not copyrightable. diff --git a/strings/B50085C1 b/strings/B50085C1 new file mode 100644 index 00000000..31457717 --- /dev/null +++ b/strings/B50085C1 @@ -0,0 +1,3 @@ +LDA $00,X + STA $C1 + +Small part (match limited to 2 instructions) of a routine retrieving start address from the variable pointed by register - matching part is trivial, not copyrightable. diff --git a/strings/B50185C2 b/strings/B50185C2 new file mode 100644 index 00000000..ccad01a0 --- /dev/null +++ b/strings/B50185C2 @@ -0,0 +1,3 @@ +LDA $01,X + STA $C2 + +Small part (match limited to 2 instructions) of a routine retrieving start address from the variable pointed by register - matching part is trivial, not copyrightable. diff --git a/strings/B7D0034C b/strings/B7D0034C new file mode 100644 index 00000000..affc0015 --- /dev/null +++ b/strings/B7D0034C @@ -0,0 +1,3 @@ +$B7 + BNE (offset match) + JMP (address does not match) + +Instruction and some parts. Trivial, not copyrightable. diff --git a/strings/BB20D2FFC8 b/strings/BB20D2FFC8 new file mode 100644 index 00000000..d906f4e1 --- /dev/null +++ b/strings/BB20D2FFC8 @@ -0,0 +1,3 @@ +$BB + JSR $FFD2 + INY + +Call to well-known routine (CHROUT) within a loop indexed by .Y (onlyy a small part of the loop matches) - not creative, not copyrightable. diff --git a/strings/C8B1B285 b/strings/C8B1B285 new file mode 100644 index 00000000..f158c521 --- /dev/null +++ b/strings/C8B1B285 @@ -0,0 +1,3 @@ +INY + LDA ($B2),Y + STA (zeropage address does not match) + +Part of loop processing data pointed by a documented zero page variable (just 2 instructions fully match) - trivial, not copyrightable. diff --git a/strings/C8C015D0 b/strings/C8C015D0 new file mode 100644 index 00000000..b9eccdfc --- /dev/null +++ b/strings/C8C015D0 @@ -0,0 +1,3 @@ +INY + CPY #$15 + BNE (offset does not match) + +Loop condition (loop running to $15, indexed by .Y) - trivial, not copyyrightable. diff --git a/strings/C8D0F4A23C b/strings/C8D0F4A23C new file mode 100644 index 00000000..ca69ad0a --- /dev/null +++ b/strings/C8D0F4A23C @@ -0,0 +1,3 @@ +INY + BNE (offset matches) + LDX #$3C + +End of the loop indexed by .Y followed by loading a value into .X - too small piece of code to be creative, not copyrightable. diff --git a/strings/CAD0F660 b/strings/CAD0F660 new file mode 100644 index 00000000..003392c6 --- /dev/null +++ b/strings/CAD0F660 @@ -0,0 +1,3 @@ +DEX + BNE (offset matches) + RTS + +End of a loop indexed by .X register, counting down to 0 - similar code can be found in any non-trivial 6502 software. Not creative - not coprightable. diff --git a/strings/E5A9008D b/strings/E5A9008D new file mode 100644 index 00000000..6af77b2e --- /dev/null +++ b/strings/E5A9008D @@ -0,0 +1,3 @@ +$E5 + LDA #$00 + STA (address does not match) + +Instruction + some parts. Trivial, not copyrightable. diff --git a/strings/E6AED002E6AF b/strings/E6AED002E6AF new file mode 100644 index 00000000..c05bd490 --- /dev/null +++ b/strings/E6AED002E6AF @@ -0,0 +1,3 @@ +INC $AE + BNE (offset matches) + INC $AF + +Incrementing a 16-bit zeropage variable (not the hoole increment matches) - trivial, not copyrightable. diff --git a/strings/EAEAAD00DD b/strings/EAEAAD00DD new file mode 100644 index 00000000..94de0dc6 --- /dev/null +++ b/strings/EAEAAD00DD @@ -0,0 +1,4 @@ +NOP + NOP + LDA $DD00 + +Delayed reading of a documented I/O register - what's interesting, this was detected as a similarity between original IEC code +and our JiffyDOS protocol implementation (protocol, which is not supported by original ROM). Not creative - not copyrightable. diff --git a/strings/ED4C25FE4C b/strings/ED4C25FE4C new file mode 100644 index 00000000..a305a5c3 --- /dev/null +++ b/strings/ED4C25FE4C @@ -0,0 +1,3 @@ +$ED + JMP $FE25 + JMP (address does not match) + +Instruction (jump to a well-known address) + some parts. Trivial - not copyrightable. diff --git a/strings/EDAD00DD b/strings/EDAD00DD new file mode 100644 index 00000000..2a9418e9 --- /dev/null +++ b/strings/EDAD00DD @@ -0,0 +1,3 @@ +$ED + LDA $DD00 + +Instruction (reading documented I/O register) + some part. Trivial, not copyrightable. diff --git a/strings/EDAD00DD29 b/strings/EDAD00DD29 new file mode 100644 index 00000000..e22d5f1c --- /dev/null +++ b/strings/EDAD00DD29 @@ -0,0 +1,3 @@ +$ED + LDA $DD00 + AND (value does not match) + +Instruction (reading a documented I/O register) + some parts. Trivial, not copyrightable. diff --git a/strings/F0AD11D029EF8D11D0AD b/strings/F0AD11D029EF8D11D0AD new file mode 100644 index 00000000..7e16541f --- /dev/null +++ b/strings/F0AD11D029EF8D11D0AD @@ -0,0 +1,3 @@ +$F0 + LDA $D011 + AND #$EF + STA $D011 + LDA (address does not matc + +Clear bit in a documented I/O register - trivial, not copyrightable. diff --git a/strings/F3A5BA20 b/strings/F3A5BA20 new file mode 100644 index 00000000..e8d525e8 --- /dev/null +++ b/strings/F3A5BA20 @@ -0,0 +1,3 @@ +$F3 + LDA $BA + JSR (address does not match) + +Instruction + some parts - trivial, not copyrightable. diff --git a/strings/F7C903F0 b/strings/F7C903F0 new file mode 100644 index 00000000..8849aa07 --- /dev/null +++ b/strings/F7C903F0 @@ -0,0 +1,3 @@ +$F7 + CMP #$03 + BEQ (offset does not match) + +Instruction and some parts - trivial, not copyrightable. diff --git a/strings/FF00000000 b/strings/FF00000000 new file mode 100644 index 00000000..f4672b03 --- /dev/null +++ b/strings/FF00000000 @@ -0,0 +1,3 @@ +$FF followed by multiple 0's + +Meaningless - results of both ROM sets having empty space. Not copyrightable. diff --git a/strings/FF0000000000 b/strings/FF0000000000 new file mode 100644 index 00000000..f4672b03 --- /dev/null +++ b/strings/FF0000000000 @@ -0,0 +1,3 @@ +$FF followed by multiple 0's + +Meaningless - results of both ROM sets having empty space. Not copyrightable. diff --git a/strings/FF586C00A0A2 b/strings/FF586C00A0A2 new file mode 100644 index 00000000..f545bc59 --- /dev/null +++ b/strings/FF586C00A0A2 @@ -0,0 +1,3 @@ +$FF + CLI + JMP ($A000) + LDX (value does not match) + +Part of the startup - matching part calls BASIC startup (via a well-known vector) with enabled interrupts. Trivial - not copyrightable.