From d0ac49b2b6278468f74c9f9cd84684f7dcbec4a3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 27 Oct 2019 17:59:53 +0100 Subject: [PATCH] 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 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 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