3 * (C) 2018 by Andreas Eversberg <jolly@eversberg.eu>
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "../../include/keycodes.h"
24 #include "../libsdl/print.h"
30 static struct keycodes {
72 { KEYCODE_KP_0, 0x0F },
73 { KEYCODE_KP_1, 0x1D },
74 { KEYCODE_KP_2, 0x1E },
75 { KEYCODE_KP_3, 0x1F },
76 { KEYCODE_KP_4, 0x2D },
77 { KEYCODE_KP_5, 0x2E },
78 { KEYCODE_KP_6, 0x2F },
79 { KEYCODE_KP_7, 0x3D },
80 { KEYCODE_KP_8, 0x3E },
81 { KEYCODE_KP_9, 0x3F },
83 { KEYCODE_KP_DIVIDE, 0x5C },
84 { KEYCODE_KP_MULTIPLY, 0x5D },
85 { KEYCODE_KP_MINUS, 0x4A },
86 { KEYCODE_KP_PLUS, 0x5E },
87 { KEYCODE_KP_PERIOD, 0x3C },
88 { KEYCODE_KP_ENTER, 0x43 },
89 { KEYCODE_KP_LPAREN, 0x5A },
90 { KEYCODE_KP_RPAREN, 0x5B },
100 { KEYCODE_F9, 0x58 },
101 { KEYCODE_F10, 0x59 },
103 { KEYCODE_UP, 0x4C },
104 { KEYCODE_DOWN, 0x4D },
105 { KEYCODE_LEFT, 0x4F },
106 { KEYCODE_RIGHT, 0x4E },
108 { KEYCODE_SPACE, 0x40 },
109 { KEYCODE_BACKSPACE, 0x41 },
110 { KEYCODE_TAB, 0x42 },
111 { KEYCODE_RETURN, 0x44 },
112 { KEYCODE_ESCAPE, 0x45 },
113 { KEYCODE_DELETE, 0x46 },
115 { KEYCODE_LSHIFT, 0x60 },
116 { KEYCODE_RSHIFT, 0x61 },
117 { KEYCODE_CAPSLOCK, 0x62 },
118 { KEYCODE_LCTRL, 0x63 },
119 { KEYCODE_RCTRL, 0x63 },
120 { KEYCODE_LALT, 0x64 },
121 { KEYCODE_RALT, 0x65 },
122 { KEYCODE_LAMIGA, 0x66 },
123 { KEYCODE_RAMIGA, 0x67 },
124 { KEYCODE_HELP, 0x5F },
126 { KEYCODE_LBRACKET, 0x1A },
127 { KEYCODE_RBRACKET, 0x1B },
128 { KEYCODE_SEMICOLON, 0x29 },
129 { KEYCODE_COMMA, 0x38 },
130 { KEYCODE_PERIOD, 0x39 },
131 { KEYCODE_SLASH, 0x3A },
132 { KEYCODE_BACKSLASH, 0x0D },
133 { KEYCODE_QUOTE, 0x2A },
134 { KEYCODE_NUMBERSIGN, 0x2B },
135 { KEYCODE_LTGT, 0x30 },
136 { KEYCODE_BACKQUOTE, 0x00 },
137 { KEYCODE_MINUS, 0x0B },
138 { KEYCODE_EQUAL, 0x0C },
140 { KEYCODE_UNDEFINED, 0xff },
143 static uint8_t buffer[16];
144 static int buffer_size = sizeof(buffer), buffer_len = 0;
145 static uint32_t keydown[4] = {0, 0, 0, 0};
147 #define ROL(v) ((v << 1) | (v >> 7))
149 #define CIAASDR 0xbfec00
150 #define CIAAICR 0xbfed00
151 #define CIAACRA 0xbfee00
153 uint16_t emulate_keyboard_read(uint32_t address)
168 printf("sending amiga code 0x%02x\n", value);
170 /* rotate and negate */
172 /* remove first entry from buffer */
174 for (i = 0; i < buffer_len; i++)
175 buffer[i] = buffer[i + 1];
176 return 0xff00 | value;
182 /* schedule given key to queue,
186 void set_amiga_key(enum keycode key, int down)
188 int code = -1, isdown;
191 for (i = 0; keycodes[i].key != KEYCODE_UNDEFINED; i++) {
192 if (keycodes[i].key == key) {
193 code = keycodes[i].code;
197 if (code < 0 || code >= 0x80) {
199 printf("Key code '%d' unknown, ignoring!\n", key);
204 isdown = (keydown[code >> 5] >> (code & 0x1f)) & 1;
207 // printf("key already down\n");
210 keydown[code >> 5] |= (1 << (code & 0x1f));
213 // printf("key already up\n");
216 keydown[code >> 5] &= ~(1 << (code & 0x1f));
220 if (buffer_len == buffer_size) {
221 print_info("keyboard buffer overflow\n");
225 buffer[buffer_len++] = code;
227 printf("Converting keycode %d to amiga code 0x%02x\n", key, code);