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 a1e9f2ef..bfdb0f18 100644 Binary files a/bin/basic_generic.rom and b/bin/basic_generic.rom differ diff --git a/bin/basic_mega65.rom b/bin/basic_mega65.rom index 2d95059d..39165f09 100644 Binary files a/bin/basic_mega65.rom and b/bin/basic_mega65.rom differ diff --git a/bin/basic_testing.rom b/bin/basic_testing.rom index efbebfcd..7597c515 100644 Binary files a/bin/basic_testing.rom and b/bin/basic_testing.rom differ diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index d9cdeaf9..56989957 100644 Binary files a/bin/basic_ultimate64.rom and b/bin/basic_ultimate64.rom differ diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 3833498b..6b99eb9f 100644 Binary files a/bin/kernal_generic.rom and b/bin/kernal_generic.rom differ diff --git a/bin/kernal_mega65.rom b/bin/kernal_mega65.rom index b4a039f8..1c091b93 100644 Binary files a/bin/kernal_mega65.rom and b/bin/kernal_mega65.rom differ diff --git a/bin/kernal_testing.rom b/bin/kernal_testing.rom index 6731edb1..1947d680 100644 Binary files a/bin/kernal_testing.rom and b/bin/kernal_testing.rom differ diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 90de039e..3ca562a5 100644 Binary files a/bin/kernal_ultimate64.rom and b/bin/kernal_ultimate64.rom differ 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