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