gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/examples/megaduck/laptop_keyboard/src/megaduck_key2ascii.c
1 #include <gbdk/platform.h>
2 #include <stdint.h>
3
4 #include <duck/model.h>
5 #include <duck/laptop_keycodes.h>
6
7 #include "megaduck_key2ascii.h"
8 #include "megaduck_keyboard.h"
9
10
11 // TODO: Not a very efficient use of space, lots of null entries
12 const char scancode_to_ascii_LUT_spanish[] = {
13
14 // == Start of shift adjusted scan code range (0x00 through 0x7F) ==
15 //
16 // Caps lock is handled separate by manually adjusting a-z
17
18 NO_KEY, // 0x80
19 NO_KEY, // 0x81
20 NO_KEY, // 0x82
21 NO_KEY, // 0x83
22 NO_KEY, // 0x84
23 '!', // 0x85 Shift alt: !
24 'Q', // 0x86 Shift alt: Q
25 'A', // 0x87 Shift alt: A
26 NO_KEY, // 0x88
27 '"', // 0x89 Shift alt: "
28 'W', // 0x8A Shift alt: W
29 'S', // 0x8B Shift alt: S
30 NO_KEY, // 0x8C
31 '·', // 0x8D Shift alt: · (Spanish, mid-dot) | § (German, legal section)
32 'E', // 0x8E Shift alt: E
33 'D', // 0x8F Shift alt: D
34
35 NO_KEY, // 0x90
36 '$', // 0x91 Shift alt: $
37 'R', // 0x92
38 'F', // 0x93
39 NO_KEY, // 0x94
40 '%', // 0x95 Shift alt: %
41 'T', // 0x96
42 'G', // 0x97
43 NO_KEY, // 0x98
44 '&', // 0x99 Shift alt: &
45 'Y', // 0x9A
46 'H', // 0x9B
47 NO_KEY, // 0x9C
48 '/', // 0x9D Shift alt: /
49 'U', // 0x9E
50 'J', // 0x9F
51
52 NO_KEY, // 0xA0
53 '(', // 0xA1 Shift alt: (
54 'I', // 0xA2
55 'K', // 0xA3
56 NO_KEY, // 0xA4
57 ')', // 0xA5 Shift alt: )
58 'O', // 0xA6
59 'L', // 0xA7
60 NO_KEY, // 0xA8
61 '\\', // 0xA9 Shift alt: "\"
62 'P', // 0xAA
63 'Ñ', // 0xAB
64 NO_KEY, // 0xAC
65 '?', // 0xAD Shift alt: ?
66 '[', // 0xAE Shift alt: [ (Spanish, only shift mode works) | German version: Ü
67 'Ü', // 0xAF
68
69 NO_KEY, // 0xB0
70 '¿', // 0xB1 Shift alt: ¿ (Spanish) | ` (German) ; German version: ' (single quote?)
71 '*', // 0xB2 Shift alt: * | German version: · (mid-dot)
72 'ª', // 0xB3 Shift alt: Feminine Ordinal [A over line] (Spanish) | ^ (German)
73 NO_KEY, // 0xB4
74 NO_KEY, // 0xB5
75 NO_KEY, // 0xB6
76 NO_KEY, // 0xB7
77 'Z', // 0xB8 // German version : 'Y'
78 NO_KEY, // 0xB9
79 NO_KEY, // 0xBA
80 NO_KEY, // 0xBB
81 'X', // 0xBC
82 '>', // 0xBD Shift alt: >
83 NO_KEY, // 0xBE
84 NO_KEY, // 0xBF
85
86 'C', // 0xC0
87 NO_KEY, // 0xC1
88 NO_KEY, // 0xC2
89 NO_KEY, // 0xC3
90 'V', // 0xC4
91 NO_KEY, // 0xC5
92 NO_KEY, // 0xC6
93 NO_KEY, // 0xC7
94 'B', // 0xC8
95 NO_KEY, // 0xC9
96 NO_KEY, // 0xCA
97 NO_KEY, // 0xCB
98 'N', // 0xCC
99 NO_KEY, // 0xCD
100 NO_KEY, // 0xCE
101 NO_KEY, // 0xCF
102
103 'M', // 0xD0
104 NO_KEY, // 0xD1
105 NO_KEY, // 0xD2
106 NO_KEY, // 0xD3
107 ';', // 0xD4 ; Shift alt: ;
108 NO_KEY, // 0xD5
109 NO_KEY, // 0xD6
110 NO_KEY, // 0xD7
111 ':', // 0xD8 ; Shift alt: :
112 NO_KEY, // 0xD9
113 NO_KEY, // 0xDA
114 NO_KEY, // 0xDB
115 '_', // 0xDC ; Shift alt: _ | German version: @
116 NO_KEY, // 0xDD
117 NO_KEY, // 0xDE
118 NO_KEY, // 0xDF
119
120 NO_KEY, // 0xE0
121 NO_KEY, // 0xE1
122 NO_KEY, // 0xE2
123 NO_KEY, // 0xE3
124 NO_KEY, // 0xE4
125 NO_KEY, // 0xE5
126 NO_KEY, // 0xE6
127 NO_KEY, // 0xE7
128 NO_KEY, // 0xE8
129 NO_KEY, // 0xE9
130 NO_KEY, // 0xEA
131 NO_KEY, // 0xEB
132 NO_KEY, // 0xEC
133 NO_KEY, // 0xED
134 NO_KEY, // 0xEE
135 NO_KEY, // 0xEF
136
137 NO_KEY, // 0xF0
138 NO_KEY, // 0xF1
139 NO_KEY, // 0xF2
140 NO_KEY, // 0xF3
141 NO_KEY, // 0xF4
142 NO_KEY, // 0xF5
143 NO_KEY, // 0xF6
144 NO_KEY, // 0xF7
145 NO_KEY, // 0xF8
146 NO_KEY, // 0xF9
147 NO_KEY, // 0xFA
148 NO_KEY, // 0xFB
149 NO_KEY, // 0xFC
150 NO_KEY, // 0xFD
151 NO_KEY, // 0xFE
152 NO_KEY, // 0xFF
153
154
155
156 // == Start of actual scan code range (0x80 through 0xFF) ==
157
158 NO_KEY, // 0x80 SYS_KBD_CODE_F1
159 KEY_ESCAPE, // 0x81 SYS_KBD_CODE_ESCAPE
160 KEY_HELP, // 0x82 SYS_KBD_CODE_HELP
161 NO_KEY, // 0x83
162 NO_KEY, // 0x84 SYS_KBD_CODE_F2
163 '1', // 0x85 SYS_KBD_CODE_1
164 'q', // 0x86 SYS_KBD_CODE_Q
165 'a', // 0x87 SYS_KBD_CODE_A
166 NO_KEY, // 0x88 SYS_KBD_CODE_F3
167 '2', // 0x89 SYS_KBD_CODE_2
168 'w', // 0x8A SYS_KBD_CODE_W
169 's', // 0x8B SYS_KBD_CODE_S
170 NO_KEY, // 0x8C SYS_KBD_CODE_F4
171 '3', // 0x8D SYS_KBD_CODE_3
172 'e', // 0x8E SYS_KBD_CODE_E
173 'd', // 0x8F SYS_KBD_CODE_D
174
175 NO_KEY, // 0x90 SYS_KBD_CODE_F5
176 '4', // 0x91 SYS_KBD_CODE_4
177 'r', // 0x92 SYS_KBD_CODE_R
178 'f', // 0x93 SYS_KBD_CODE_F
179 NO_KEY, // 0x94 SYS_KBD_CODE_F6
180 '5', // 0x95 SYS_KBD_CODE_5
181 't', // 0x96 SYS_KBD_CODE_T
182 'g', // 0x97 SYS_KBD_CODE_G
183 NO_KEY, // 0x98 SYS_KBD_CODE_F7
184 '6', // 0x99 SYS_KBD_CODE_6
185 'y', // 0x9A SYS_KBD_CODE_Y
186 'h', // 0x9B SYS_KBD_CODE_H
187 NO_KEY, // 0x9C SYS_KBD_CODE_F8
188 '7', // 0x9D SYS_KBD_CODE_7
189 'u', // 0x9E SYS_KBD_CODE_U
190 'j', // 0x9F SYS_KBD_CODE_J
191
192 NO_KEY, // 0xA0 SYS_KBD_CODE_F9
193 '8', // 0xA1 SYS_KBD_CODE_8
194 'i', // 0xA2 SYS_KBD_CODE_I
195 'k', // 0xA3 SYS_KBD_CODE_K
196 NO_KEY, // 0xA4 SYS_KBD_CODE_F10
197 '9', // 0xA5 SYS_KBD_CODE_9
198 'o', // 0xA6 SYS_KBD_CODE_O
199 'l', // 0xA7 SYS_KBD_CODE_L
200 NO_KEY, // 0xA8 SYS_KBD_CODE_F11
201 '0', // 0xA9 SYS_KBD_CODE_0
202 'p', // 0xAA SYS_KBD_CODE_P
203 'ñ', // 0xAB SYS_KBD_CODE_N_TILDE
204 NO_KEY, // 0xAC SYS_KBD_CODE_F12
205 '\'', // 0xAD SYS_KBD_CODE_SINGLE_QUOTE
206 '`', // 0xAE SYS_KBD_CODE_BACKTICK
207 'ü', // 0xAF SYS_KBD_CODE_U_UMLAUT
208
209 NO_KEY, // 0xB0
210 '¡', // 0xB1 SYS_KBD_CODE_EXCLAMATION_FLIPPED
211 ']', // 0xB2 SYS_KBD_CODE_RIGHT_SQ_BRACKET
212 'º', // 0xB3 SYS_KBD_CODE_O_OVER_LINE Masculine Ordinal
213 NO_KEY, // 0xB4
214 KEY_BACKSPACE, // 0xB5 SYS_KBD_CODE_BACKSPACE
215 KEY_ENTER, // 0xB6 SYS_KBD_CODE_ENTER
216 NO_KEY, // 0xB7
217 'z', // 0xB8 SYS_KBD_CODE_Z // German version : 'y'
218 ' ', // 0xB9 SYS_KBD_CODE_SPACE
219 NO_KEY, // 0xBA SYS_KBD_CODE_PIANO_DO_SHARP
220 NO_KEY, // 0xBB SYS_KBD_CODE_PIANO_DO
221 'x', // 0xBC SYS_KBD_CODE_X
222 '<', // 0xBD SYS_KBD_CODE_LESS_THAN
223 NO_KEY, // 0xBE SYS_KBD_CODE_PIANO_RE_SHARP
224 NO_KEY, // 0xBF SYS_KBD_CODE_PIANO_RE
225
226 'c', // 0xC0 SYS_KBD_CODE_C
227 NO_KEY, // 0xC1 SYS_KBD_CODE_PAGE_UP
228 NO_KEY, // 0xC2
229 NO_KEY, // 0xC3 SYS_KBD_CODE_PIANO_MI
230 'v', // 0xC4 SYS_KBD_CODE_V
231 NO_KEY, // 0xC5 SYS_KBD_CODE_PAGE_DOWN
232 NO_KEY, // 0xC6 SYS_KBD_CODE_PIANO_FA_SHARP
233 NO_KEY, // 0xC7 SYS_KBD_CODE_PIANO_FA
234 'b', // 0xC8 SYS_KBD_CODE_B
235 NO_KEY, // 0xC9 SYS_KBD_CODE_MEMORY_MINUS
236 NO_KEY, // 0xCA SYS_KBD_CODE_PIANO_SOL_SHARP
237 NO_KEY, // 0xCB SYS_KBD_CODE_PIANO_SOL
238 'n', // 0xCC SYS_KBD_CODE_N
239 NO_KEY, // 0xCD SYS_KBD_CODE_MEMORY_PLUS
240 NO_KEY, // 0xCE SYS_KBD_CODE_PIANO_LA_SHARP
241 NO_KEY, // 0xCF SYS_KBD_CODE_PIANO_LA
242
243 'm', // 0xD0 SYS_KBD_CODE_M
244 NO_KEY, // 0xD1 SYS_KBD_CODE_MEMORY_RECALL
245 NO_KEY, // 0xD2
246 NO_KEY, // 0xD3 SYS_KBD_CODE_PIANO_SI
247 ',', // 0xD4 SYS_KBD_CODE_COMMA
248 NO_KEY, // 0xD5 SYS_KBD_CODE_SQUAREROOT
249 NO_KEY, // 0xD6 SYS_KBD_CODE_PIANO_DO_2_SHARP
250 NO_KEY, // 0xD7 SYS_KBD_CODE_PIANO_DO_2
251 '.', // 0xD8 SYS_KBD_CODE_PERIOD
252 '*', // 0xD9 SYS_KBD_CODE_MULTIPLY
253 NO_KEY, // 0xDA SYS_KBD_CODE_PIANO_RE_2_SHARP
254 NO_KEY, // 0xDB SYS_KBD_CODE_PIANO_RE_2
255 '-', // 0xDC SYS_KBD_CODE_DASH
256 KEY_ARROW_DOWN, // 0xDD SYS_KBD_CODE_ARROW_DOWN // TODO: Temporary
257 KEY_PRINTSCREEN, // 0xDE SYS_KBD_CODE_PRINTSCREEN_RIGHT // TODO: Temporary
258 NO_KEY, // 0xDF
259
260 KEY_DELETE, // 0xE0 SYS_KBD_CODE_DELETE
261 '-', // 0xE1 SYS_KBD_CODE_MINUS
262 NO_KEY, // 0xE2 SYS_KBD_CODE_PIANO_FA_2_SHARP
263 NO_KEY, // 0xE3 SYS_KBD_CODE_PIANO_FA_2
264 '÷', // 0xE4 SYS_KBD_CODE_DIVIDE
265 KEY_ARROW_LEFT, // 0xE5 SYS_KBD_CODE_ARROW_LEFT // TODO: Temporary
266 NO_KEY, // 0xE6 SYS_KBD_CODE_PIANO_SOL_2_SHARP
267 NO_KEY, // 0xE7 SYS_KBD_CODE_PIANO_SOL_2
268 KEY_ARROW_UP, // 0xE8 SYS_KBD_CODE_ARROW_UP // TODO: Temporary
269 '=', // 0xE9 SYS_KBD_CODE_EQUALS
270 NO_KEY, // 0xEA SYS_KBD_CODE_PIANO_LA_2_SHARP
271 NO_KEY, // 0xEB SYS_KBD_CODE_PIANO_LA_2
272 '+', // 0xEC SYS_KBD_CODE_PLUS
273 KEY_ARROW_RIGHT, // 0xED SYS_KBD_CODE_ARROW_RIGHT // TODO: Temporary
274 NO_KEY, // 0xEE
275 NO_KEY, // 0xEF SYS_KBD_CODE_PIANO_MI_2
276
277 't', // 0xF0 SYS_KBD_CODE_MAYBE_SYST_CODES_START
278 NO_KEY, // 0xF1
279 NO_KEY, // 0xF2
280 NO_KEY, // 0xF3
281 NO_KEY, // 0xF4
282 NO_KEY, // 0xF5
283 NO_KEY, // 0xF6 SYS_KBD_CODE_MAYBE_RX_NOT_A_KEY
284 NO_KEY, // 0xF7
285 NO_KEY, // 0xF8
286 NO_KEY, // 0xF9
287 NO_KEY, // 0xFA
288 NO_KEY, // 0xFB
289 NO_KEY, // 0xFC
290 NO_KEY, // 0xFD
291 NO_KEY, // 0xFE
292 NO_KEY // 0xFF
293 };
294
295
296 char duck_io_scancode_to_ascii(const uint8_t key_code, const uint8_t megaduck_model) {
297
298 char ascii_char = scancode_to_ascii_LUT_spanish[key_code];
299
300 // Handle alternate German keyboard layout
301 if (megaduck_model == MEGADUCK_LAPTOP_GERMAN)
302 switch (ascii_char) {
303 // Row 1
304 // case '·': ascii_char = '§'; break; // TODO: handling for these
305 case '\'': ascii_char = 'ß'; break;
306 // case '¿': ascii_char = '`'; break; // TODO: handling for these
307 // case '¡': ascii_char = '\''; break; // TODO: handling for these
308 case '÷': ascii_char = ':'; break;
309 // Row 2
310 case '[': // maps to same char below
311 case '`': ascii_char = 'Ü'; break;
312 case ']': ascii_char = '·'; break;
313 case 'y': ascii_char = 'z'; break;
314 case 'Y': ascii_char = 'Z'; break;
315 // Row 3
316 // case 'ñ': ascii_char = 'ö'; break; // TODO: handling for these
317 // case 'Ñ': ascii_char = 'Ö'; break; // TODO: handling for these
318 // case 'ü': ascii_char = 'ä'; break; // TODO: handling for these
319 // case 'Ü': ascii_char = 'Ä'; break; // TODO: handling for these
320 // case 'ª': ascii_char = '^'; break; // TODO: handling for these
321 // case 'º': ascii_char = '#'; break; // TODO: handling for these
322 // Row 4
323 case 'z': ascii_char = 'y'; break;
324 case 'Z': ascii_char = 'Y'; break;
325 case '-': ascii_char = '@'; break;
326 }
327
328 return ascii_char;
329 }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.