GBDK 2020 Docs  4.5.0
API Documentation for GBDK 2020
laptop_keycodes.h
Go to the documentation of this file.
1#include <gbdk/platform.h>
2#include <stdint.h>
3#include <stdbool.h>
4
5#ifndef _MEGADUCK_LAPTOP_KEYCODES_H
6#define _MEGADUCK_LAPTOP_KEYCODES_H
7
8
9// - Left /right shift are shared
10//
11// Keyboard serial reply scan codes have different ordering than System ROM character codes
12// - They go diagonal down from upper left for the first *4* rows
13// - The bottom 4 rows (including piano keys) are more varied
14
15// Modifier Keys / Flags
16//
17// See input_key_modifier_flags__RAM_D027_
18#define DUCK_IO_KEY_FLAG_KEY_REPEAT 0x01u
19#define DUCK_IO_KEY_FLAG_KEY_REPEAT_BIT 0x0u
20#define DUCK_IO_KEY_FLAG_CAPSLOCK 0x02u
21#define DUCK_IO_KEY_FLAG_CAPSLOCK_BIT 0x1u
22#define DUCK_IO_KEY_FLAG_SHIFT 0x04u
23#define DUCK_IO_KEY_FLAG_SHIFT_BIT 0x2u
24// Right Print Screen has actual scancode vs Left being in a flag
25#define DUCK_IO_KEY_FLAG_PRINTSCREEN_LEFT 0x08u
26#define DUCK_IO_KEY_FLAG_PRINTSCREEN_LEFT_BIT 0x3u
27
28// Keyboard scancodes
29// All valid keys seem to have bit 7 set (0x80+)
30#define DUCK_IO_KEY_BASE_BIT 0x7u
31#define DUCK_IO_KEY_BASE 0x80u
32
33
34// First 4 rows (top of keyboard) ~ 0x80 - 0xB7
35//
36// - For each row, most chars are +4 vs char to immediate left
37// due to the diagonal down-right scancode ordering
38//
39// Starting values
40// - Row 1: 0x80
41// - Row 2: 0x81
42// - Row 3: 0x82
43// - Row 4: 0x83
44
45// Row 1
46#define DUCK_IO_KEY_F1 0x80u
47#define DUCK_IO_KEY_F2 0x84u
48#define DUCK_IO_KEY_F3 0x88u
49#define DUCK_IO_KEY_F4 0x8Cu
50#define DUCK_IO_KEY_F5 0x90u
51#define DUCK_IO_KEY_F6 0x94u
52#define DUCK_IO_KEY_F7 0x98u
53#define DUCK_IO_KEY_F8 0x9Cu
54#define DUCK_IO_KEY_F9 0xA0u
55#define DUCK_IO_KEY_F10 0xA4u
56#define DUCK_IO_KEY_F11 0xA8u
57#define DUCK_IO_KEY_F12 0xACu
58// GAP at 0xB0 maybe Blank spot where F13 would be
59// GAP at 0xB4 maybe ON Key?
60
61// Row 2
62#define DUCK_IO_KEY_ESCAPE 0x81u // Spanish label: Salida | German label: Esc
63#define DUCK_IO_KEY_1 0x85u // Shift alt: !
64#define DUCK_IO_KEY_2 0x89u // Shift alt: "
65#define DUCK_IO_KEY_3 0x8Du // Shift alt: · (Spanish, mid-dot) | § (German, legal section)
66#define DUCK_IO_KEY_4 0x91u // Shift alt: $
67#define DUCK_IO_KEY_5 0x95u // Shift alt: %
68#define DUCK_IO_KEY_6 0x99u // Shift alt: &
69#define DUCK_IO_KEY_7 0x9Du // Shift alt: /
70#define DUCK_IO_KEY_8 0xA1u // Shift alt: (
71#define DUCK_IO_KEY_9 0xA5u // Shift alt: )
72#define DUCK_IO_KEY_0 0xA9u // Shift alt: "\"
73#define DUCK_IO_KEY_SINGLE_QUOTE 0xADu // Shift alt: ? | German version: ß (eszett)
74#define DUCK_IO_KEY_EXCLAMATION_FLIPPED 0xB1u // Shift alt: ¿ (Spanish) | ` (German) // German version: ' (single quote?)
75#define DUCK_IO_KEY_BACKSPACE 0xB5u // German label: Lösch
76// See Continued Row 2 below
77
78// Row 3
79#define DUCK_IO_KEY_HELP 0x82u // Spanish label: Ayuda | German label: Hilfe
80#define DUCK_IO_KEY_Q 0x86u
81#define DUCK_IO_KEY_W 0x8Au
82#define DUCK_IO_KEY_E 0x8Eu
83#define DUCK_IO_KEY_R 0x92u
84#define DUCK_IO_KEY_T 0x96u
85#define DUCK_IO_KEY_Y 0x9Au // German version: z
86#define DUCK_IO_KEY_U 0x9Eu
87#define DUCK_IO_KEY_I 0xA2u
88#define DUCK_IO_KEY_O 0xA6u
89#define DUCK_IO_KEY_P 0xAAu
90#define DUCK_IO_KEY_BACKTICK 0xAEu // Shift alt: [ (Spanish, only shift mode works) | German version: Ü
91#define DUCK_IO_KEY_RIGHT_SQ_BRACKET 0xB2u // Shift alt: * | German version: · (mid-dot)
92#define DUCK_IO_KEY_ENTER 0xB6u // Spanish label: Entra | German label: Ein-gabe
93// See Continued Row 3 below
94
95// Row 4
96// GAP at 0x83 maybe CAPS LOCK (Spanish label: Mayuscula, German label: Groß)
97#define DUCK_IO_KEY_A 0x87u
98#define DUCK_IO_KEY_S 0x8Bu
99#define DUCK_IO_KEY_D 0x8Fu
100#define DUCK_IO_KEY_F 0x93u
101#define DUCK_IO_KEY_G 0x97u
102#define DUCK_IO_KEY_H 0x9Bu
103#define DUCK_IO_KEY_J 0x9Fu
104#define DUCK_IO_KEY_K 0xA3u
105#define DUCK_IO_KEY_L 0xA7u
106#define DUCK_IO_KEY_N_TILDE 0xABu // German version: ö
107#define DUCK_IO_KEY_U_UMLAUT 0xAFu // German version: ä
108#define DUCK_IO_KEY_O_OVER_LINE 0xB3u // Shift alt: [A over line] (Spanish) | ^ (German) | German version: #
109// ? GAP at 0x87 ?
110
111
112// Second 4 rows (bottom of keyboard) ~ 0x80 - 0xB7
113//
114// - For each row, most chars are +4 vs char to immediate left
115//
116// Starting values
117// - Row 5: 0xB8
118// - Row 6: 0xB9
119// - Row 7: 0xBA
120// - Row 8: 0xBB
121
122// Row 5
123#define DUCK_IO_KEY_Z 0xB8u // German version: y
124#define DUCK_IO_KEY_X 0xBCu
125#define DUCK_IO_KEY_C 0xC0u
126#define DUCK_IO_KEY_V 0xC4u
127#define DUCK_IO_KEY_B 0xC8u
128#define DUCK_IO_KEY_N 0xCCu
129#define DUCK_IO_KEY_M 0xD0u
130#define DUCK_IO_KEY_COMMA 0xD4u
131#define DUCK_IO_KEY_PERIOD 0xD8u
132#define DUCK_IO_KEY_DASH 0xDCu // Shift alt: _ | German version: @
133// See Continued Row 5 below
134// Row 6 Continued (from below)
135#define DUCK_IO_KEY_DELETE 0xE0u // * Spanish label: Borrar | German label: Entf.
136
137
138
139// Encoding is less orderly below
140
141// Row 6
142#define DUCK_IO_KEY_SPACE 0xB9u // Spanish label: Espacio | German label (blank)
143// Continued Row 5
144#define DUCK_IO_KEY_LESS_THAN 0xBDu // Shift alt: >
145// Continued Row 6
146#define DUCK_IO_KEY_PAGE_UP 0xC1u // Spanish label: Pg Arriba | German label: Zu-rück
147#define DUCK_IO_KEY_PAGE_DOWN 0xC5u // Spanish label: Pg Abajo | German label: Wei-ter
148#define DUCK_IO_KEY_MEMORY_MINUS 0xC9u
149// Continued Row 5
150#define DUCK_IO_KEY_MEMORY_PLUS 0xCDu
151#define DUCK_IO_KEY_MEMORY_RECALL 0xD1u
152#define DUCK_IO_KEY_SQUAREROOT 0xD5u
153// ** 3x3 Arrow and Math Key area **
154// Continued Row 6
155#define DUCK_IO_KEY_MULTIPLY 0xD9u
156#define DUCK_IO_KEY_ARROW_DOWN 0xDDu
157#define DUCK_IO_KEY_MINUS 0xE1u
158// Continued Row 3
159#define DUCK_IO_KEY_ARROW_LEFT 0xE5u
160#define DUCK_IO_KEY_EQUALS 0xE9u
161#define DUCK_IO_KEY_ARROW_RIGHT 0xEDu
162// Continued Row 2
163#define DUCK_IO_KEY_DIVIDE 0xE4u // German version: :
164#define DUCK_IO_KEY_ARROW_UP 0xE8u
165#define DUCK_IO_KEY_PLUS 0xECu
166
167// Row 7
168// Piano Sharp Keys
169#define DUCK_IO_KEY_PIANO_DO_SHARP 0xBAu
170#define DUCK_IO_KEY_PIANO_RE_SHARP 0xBEu
171// GAP at 0xC2 where there is no key
172#define DUCK_IO_KEY_PIANO_FA_SHARP 0xC6u
173#define DUCK_IO_KEY_PIANO_SOL_SHARP 0xCAu
174#define DUCK_IO_KEY_PIANO_LA_SHARP 0xCEu
175// GAP at 0xD2 where there is no key
176//
177// Octave 2 maybe
178#define DUCK_IO_KEY_PIANO_DO_2_SHARP 0xD6u
179#define DUCK_IO_KEY_PIANO_RE_2_SHARP 0xDAu
180// Row 6 Continued
181#define DUCK_IO_KEY_PRINTSCREEN_RIGHT 0xDEu // German label: Druck (* Mixed in with piano keys)
182// Row 7 Continued
183#define DUCK_IO_KEY_PIANO_FA_2_SHARP 0xE2u
184#define DUCK_IO_KEY_PIANO_SOL_2_SHARP 0xE6u
185#define DUCK_IO_KEY_PIANO_LA_2_SHARP 0xEAu
186
187// Row 8
188// Piano Primary Keys
189#define DUCK_IO_KEY_PIANO_DO 0xBBu
190#define DUCK_IO_KEY_PIANO_RE 0xBFu
191#define DUCK_IO_KEY_PIANO_MI 0xC3u
192#define DUCK_IO_KEY_PIANO_FA 0xC7u
193#define DUCK_IO_KEY_PIANO_SOL 0xCBu
194#define DUCK_IO_KEY_PIANO_LA 0xCFu
195#define DUCK_IO_KEY_PIANO_SI 0xD3u
196#define DUCK_IO_KEY_PIANO_DO_2 0xD7u
197#define DUCK_IO_KEY_PIANO_RE_2 0xDBu
198#define DUCK_IO_KEY_PIANO_MI_2 0xDFu
199#define DUCK_IO_KEY_PIANO_FA_2 0xE3u
200#define DUCK_IO_KEY_PIANO_SOL_2 0xE7u
201#define DUCK_IO_KEY_PIANO_LA_2 0xEBu
202#define DUCK_IO_KEY_PIANO_SI_2 0xEFu
203
204#define DUCK_IO_KEY_LAST_KEY (DUCK_IO_KEY_PIANO_SI_2u)
205
206// Special System Codes? 0xF0+
207#define DUCK_IO_KEY_MAYBE_SYST_CODES_START 0xF0u
208#define DUCK_IO_KEY_MAYBE_RX_NOT_A_KEY 0xF6u
209
210#endif // _MEGADUCK_LAPTOP_KEYCODES_H