GBDK 2020 Docs  4.4.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