aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-03-05 22:41:43 +0100
committerBad Diode <bd@badd10de.dev>2022-03-05 22:41:43 +0100
commit8c40fb31d36488b99045b7fa3641f8ce2cf1ff99 (patch)
treee63003d3dd5385360772d86e8703b2053714a929
parent4aa83a8de5e5b131ddcabc920536d9b807b608ca (diff)
downloaduxnfb-8c40fb31d36488b99045b7fa3641f8ce2cf1ff99.tar.gz
uxnfb-8c40fb31d36488b99045b7fa3641f8ce2cf1ff99.zip
Finish uxn core update
-rw-r--r--src/main.c367
1 files changed, 177 insertions, 190 deletions
diff --git a/src/main.c b/src/main.c
index 2c7fe03..222fef3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -142,168 +142,174 @@ poll_input(void) {
142 142
143void 143void
144handle_keyboard(void) { 144handle_keyboard(void) {
145 // // Find mod keys. 145 // Find mod keys.
146 // bool shift_mod = false; 146 bool shift_mod = false;
147 // // bool ctrl_mod = false; 147 // bool ctrl_mod = false;
148 // // bool alt_mod = false; 148 // bool alt_mod = false;
149 // // bool meta_mod = false; 149 // bool meta_mod = false;
150 // for (size_t i = 0; i < sizeof(in.map); i++) { 150 for (size_t i = 0; i < sizeof(in.map); i++) {
151 // for (size_t j = 0; j < 8; j++) { 151 for (size_t j = 0; j < 8; j++) {
152 // char key = in.map[i] & (1 << j); 152 char key = in.map[i] & (1 << j);
153 // if (key) { 153 if (key) {
154 // char key_code = i * 8 + j; 154 char key_code = i * 8 + j;
155 // switch (key_code) { 155 switch (key_code) {
156 // case KEY_LEFTSHIFT: 156 case KEY_LEFTSHIFT:
157 // case KEY_RIGHTSHIFT: { shift_mod = true; } break; 157 case KEY_RIGHTSHIFT: { shift_mod = true; } break;
158 // // case KEY_LEFTCTRL: 158 // case KEY_LEFTCTRL:
159 // // case KEY_RIGHTCTRL: { ctrl_mod = true; } break; 159 // case KEY_RIGHTCTRL: { ctrl_mod = true; } break;
160 // // case KEY_LEFTALT: 160 // case KEY_LEFTALT:
161 // // case KEY_RIGHTALT: { alt_mod = true; } break; 161 // case KEY_RIGHTALT: { alt_mod = true; } break;
162 // // case KEY_LEFTMETA: 162 // case KEY_LEFTMETA:
163 // // case KEY_RIGHTMETA: { meta_mod = true; } break; 163 // case KEY_RIGHTMETA: { meta_mod = true; } break;
164 // default: break; 164 default: break;
165 // } 165 }
166 // } 166 }
167 // } 167 }
168 // } 168 }
169 169
170 // // Handle normal keys. 170 // Handle normal keys.
171 // u8 controller_now = 0; 171 u8 controller_now = 0;
172 // for (size_t i = 0; i < sizeof(in.map); i++) { 172 for (size_t i = 0; i < sizeof(in.map); i++) {
173 // for (size_t j = 0; j < 8; j++) { 173 for (size_t j = 0; j < 8; j++) {
174 // char key = in.map[i] & (1 << j); 174 char key = in.map[i] & (1 << j);
175 // if (key) { 175 if (key) {
176 // char key_code = i * 8 + j; 176 char key_code = i * 8 + j;
177 // // Normal keys. 177 // Normal keys.
178 // u8 rune = '\0'; 178 u8 rune = '\0';
179 // switch (key_code) { 179 switch (key_code) {
180 // case KEY_KP1: 180 case KEY_KP1:
181 // case KEY_1: { rune = shift_mod ? '!' : '1'; } break; 181 case KEY_1: { rune = shift_mod ? '!' : '1'; } break;
182 // case KEY_KP2: 182 case KEY_KP2:
183 // case KEY_2: { rune = shift_mod ? '@' : '2'; } break; 183 case KEY_2: { rune = shift_mod ? '@' : '2'; } break;
184 // case KEY_KP3: 184 case KEY_KP3:
185 // case KEY_3: { rune = shift_mod ? '#' : '3'; } break; 185 case KEY_3: { rune = shift_mod ? '#' : '3'; } break;
186 // case KEY_KP4: 186 case KEY_KP4:
187 // case KEY_4: { rune = shift_mod ? '$' : '4'; } break; 187 case KEY_4: { rune = shift_mod ? '$' : '4'; } break;
188 // case KEY_KP5: 188 case KEY_KP5:
189 // case KEY_5: { rune = shift_mod ? '%' : '5'; } break; 189 case KEY_5: { rune = shift_mod ? '%' : '5'; } break;
190 // case KEY_KP6: 190 case KEY_KP6:
191 // case KEY_6: { rune = shift_mod ? '^' : '6'; } break; 191 case KEY_6: { rune = shift_mod ? '^' : '6'; } break;
192 // case KEY_KP7: 192 case KEY_KP7:
193 // case KEY_7: { rune = shift_mod ? '&' : '7'; } break; 193 case KEY_7: { rune = shift_mod ? '&' : '7'; } break;
194 // case KEY_KP8: 194 case KEY_KP8:
195 // case KEY_8: { rune = shift_mod ? '*' : '8'; } break; 195 case KEY_8: { rune = shift_mod ? '*' : '8'; } break;
196 // case KEY_KP9: 196 case KEY_KP9:
197 // case KEY_9: { rune = shift_mod ? '(' : '9'; } break; 197 case KEY_9: { rune = shift_mod ? '(' : '9'; } break;
198 // case KEY_KP0: 198 case KEY_KP0:
199 // case KEY_0: { rune = shift_mod ? ')' : '0'; } break; 199 case KEY_0: { rune = shift_mod ? ')' : '0'; } break;
200 // case KEY_KPMINUS: 200 case KEY_KPMINUS:
201 // case KEY_MINUS: { rune = shift_mod ? '_' : '-'; } break; 201 case KEY_MINUS: { rune = shift_mod ? '_' : '-'; } break;
202 // case KEY_KPEQUAL: 202 case KEY_KPEQUAL:
203 // case KEY_EQUAL: { rune = shift_mod ? '+' : '+'; } break; 203 case KEY_EQUAL: { rune = shift_mod ? '+' : '+'; } break;
204 // case KEY_Q: { rune = shift_mod ? 'Q' : 'q'; } break; 204 case KEY_Q: { rune = shift_mod ? 'Q' : 'q'; } break;
205 // case KEY_W: { rune = shift_mod ? 'W' : 'w'; } break; 205 case KEY_W: { rune = shift_mod ? 'W' : 'w'; } break;
206 // case KEY_E: { rune = shift_mod ? 'E' : 'e'; } break; 206 case KEY_E: { rune = shift_mod ? 'E' : 'e'; } break;
207 // case KEY_R: { rune = shift_mod ? 'T' : 't'; } break; 207 case KEY_R: { rune = shift_mod ? 'T' : 't'; } break;
208 // case KEY_T: { rune = shift_mod ? 'T' : 't'; } break; 208 case KEY_T: { rune = shift_mod ? 'T' : 't'; } break;
209 // case KEY_Y: { rune = shift_mod ? 'Y' : 'y'; } break; 209 case KEY_Y: { rune = shift_mod ? 'Y' : 'y'; } break;
210 // case KEY_U: { rune = shift_mod ? 'U' : 'u'; } break; 210 case KEY_U: { rune = shift_mod ? 'U' : 'u'; } break;
211 // case KEY_I: { rune = shift_mod ? 'I' : 'i'; } break; 211 case KEY_I: { rune = shift_mod ? 'I' : 'i'; } break;
212 // case KEY_O: { rune = shift_mod ? 'O' : 'o'; } break; 212 case KEY_O: { rune = shift_mod ? 'O' : 'o'; } break;
213 // case KEY_P: { rune = shift_mod ? 'P' : 'p'; } break; 213 case KEY_P: { rune = shift_mod ? 'P' : 'p'; } break;
214 // case KEY_LEFTBRACE: { rune = shift_mod ? '{' : '['; } break; 214 case KEY_LEFTBRACE: { rune = shift_mod ? '{' : '['; } break;
215 // case KEY_RIGHTBRACE: { rune = shift_mod ? '}' : ']'; } break; 215 case KEY_RIGHTBRACE: { rune = shift_mod ? '}' : ']'; } break;
216 // case KEY_A: { rune = shift_mod ? 'A' : 'a'; } break; 216 case KEY_A: { rune = shift_mod ? 'A' : 'a'; } break;
217 // case KEY_S: { rune = shift_mod ? 'S' : 's'; } break; 217 case KEY_S: { rune = shift_mod ? 'S' : 's'; } break;
218 // case KEY_D: { rune = shift_mod ? 'D' : 'd'; } break; 218 case KEY_D: { rune = shift_mod ? 'D' : 'd'; } break;
219 // case KEY_F: { rune = shift_mod ? 'F' : 'f'; } break; 219 case KEY_F: { rune = shift_mod ? 'F' : 'f'; } break;
220 // case KEY_G: { rune = shift_mod ? 'G' : 'g'; } break; 220 case KEY_G: { rune = shift_mod ? 'G' : 'g'; } break;
221 // case KEY_H: { rune = shift_mod ? 'H' : 'h'; } break; 221 case KEY_H: { rune = shift_mod ? 'H' : 'h'; } break;
222 // case KEY_J: { rune = shift_mod ? 'J' : 'j'; } break; 222 case KEY_J: { rune = shift_mod ? 'J' : 'j'; } break;
223 // case KEY_K: { rune = shift_mod ? 'K' : 'k'; } break; 223 case KEY_K: { rune = shift_mod ? 'K' : 'k'; } break;
224 // case KEY_L: { rune = shift_mod ? 'L' : 'l'; } break; 224 case KEY_L: { rune = shift_mod ? 'L' : 'l'; } break;
225 // case KEY_SEMICOLON: { rune = shift_mod ? ':' : ';'; } break; 225 case KEY_SEMICOLON: { rune = shift_mod ? ':' : ';'; } break;
226 // case KEY_APOSTROPHE: { rune = shift_mod ? '"' : '\''; } break; 226 case KEY_APOSTROPHE: { rune = shift_mod ? '"' : '\''; } break;
227 // case KEY_GRAVE: { rune = shift_mod ? '~' : '`'; } break; 227 case KEY_GRAVE: { rune = shift_mod ? '~' : '`'; } break;
228 // case KEY_BACKSLASH: { rune = shift_mod ? '|' : '\\'; } break; 228 case KEY_BACKSLASH: { rune = shift_mod ? '|' : '\\'; } break;
229 // case KEY_Z: { rune = shift_mod ? 'Z' : 'z'; } break; 229 case KEY_Z: { rune = shift_mod ? 'Z' : 'z'; } break;
230 // case KEY_X: { rune = shift_mod ? 'X' : 'x'; } break; 230 case KEY_X: { rune = shift_mod ? 'X' : 'x'; } break;
231 // case KEY_C: { rune = shift_mod ? 'C' : 'c'; } break; 231 case KEY_C: { rune = shift_mod ? 'C' : 'c'; } break;
232 // case KEY_V: { rune = shift_mod ? 'V' : 'v'; } break; 232 case KEY_V: { rune = shift_mod ? 'V' : 'v'; } break;
233 // case KEY_B: { rune = shift_mod ? 'B' : 'b'; } break; 233 case KEY_B: { rune = shift_mod ? 'B' : 'b'; } break;
234 // case KEY_N: { rune = shift_mod ? 'N' : 'n'; } break; 234 case KEY_N: { rune = shift_mod ? 'N' : 'n'; } break;
235 // case KEY_M: { rune = shift_mod ? 'M' : 'm'; } break; 235 case KEY_M: { rune = shift_mod ? 'M' : 'm'; } break;
236 // case KEY_COMMA: { rune = shift_mod ? '<' : ','; } break; 236 case KEY_COMMA: { rune = shift_mod ? '<' : ','; } break;
237 // case KEY_DOT: { rune = shift_mod ? '>' : '.'; } break; 237 case KEY_DOT: { rune = shift_mod ? '>' : '.'; } break;
238 // case KEY_KPSLASH: 238 case KEY_KPSLASH:
239 // case KEY_SLASH: { rune = shift_mod ? '?' : '/'; } break; 239 case KEY_SLASH: { rune = shift_mod ? '?' : '/'; } break;
240 // case KEY_KPASTERISK: { rune = '*'; } break; 240 case KEY_KPASTERISK: { rune = '*'; } break;
241 // case KEY_KPPLUS: { rune = '+'; } break; 241 case KEY_KPPLUS: { rune = '+'; } break;
242 // case KEY_KPCOMMA: { rune = '.'; } break; 242 case KEY_KPCOMMA: { rune = '.'; } break;
243 // case KEY_SPACE: { rune = ' '; } break; 243 case KEY_SPACE: { rune = ' '; } break;
244 // case KEY_TAB: { rune = '\t'; } break; 244 case KEY_TAB: { rune = '\t'; } break;
245 // case KEY_ESC: { rune = 0x1b; } break; 245 case KEY_ESC: { rune = 0x1b; } break;
246 // case KEY_BACKSPACE: { rune = 0x08; } break; 246 case KEY_BACKSPACE: { rune = 0x08; } break;
247 // case KEY_ENTER: 247 case KEY_ENTER:
248 // case KEY_KPENTER: { rune = 0x0d; } break; 248 case KEY_KPENTER: { rune = 0x0d; } break;
249 // default: break; 249 default: break;
250 // } 250 }
251 // if (rune) { 251 if (rune) {
252 // devctrl->dat[3] = rune; 252 devctrl->dat[3] = rune;
253 // uxn_eval(&u, mempeek16(devctrl->dat, 0)); 253 uxn_eval(&u, GETVECTOR(devctrl));
254 // devctrl->dat[3] = 0; 254 devctrl->dat[3] = 0;
255 // continue; 255 continue;
256 // } 256 }
257 257
258 // // Special keys. 258 // Special keys.
259 // switch (key_code) { 259 switch (key_code) {
260 // case KEY_LEFTCTRL: { rune = 0x01; } break; 260 case KEY_LEFTCTRL: { rune = 0x01; } break;
261 // case KEY_LEFTALT: { rune = 0x02; } break; 261 case KEY_LEFTALT: { rune = 0x02; } break;
262 // case KEY_LEFTSHIFT: { rune = 0x04; } break; 262 case KEY_LEFTSHIFT: { rune = 0x04; } break;
263 // case KEY_HOME: { rune = 0x08; } break; 263 case KEY_HOME: { rune = 0x08; } break;
264 // case KEY_UP: { rune = 0x10; } break; 264 case KEY_UP: { rune = 0x10; } break;
265 // case KEY_DOWN: { rune = 0x20; } break; 265 case KEY_DOWN: { rune = 0x20; } break;
266 // case KEY_LEFT: { rune = 0x40; } break; 266 case KEY_LEFT: { rune = 0x40; } break;
267 // case KEY_RIGHT: { rune = 0x80; } break; 267 case KEY_RIGHT: { rune = 0x80; } break;
268 // default: break; 268 default: break;
269 // } 269 }
270 // if (rune) { 270 if (rune) {
271 // controller_now |= rune; 271 controller_now |= rune;
272 // continue; 272 continue;
273 // } 273 }
274 // } 274 }
275 // } 275 }
276 // } 276 }
277 277
278 // if (controller_now != in.controller) { 278 if (controller_now != in.controller) {
279 // devctrl->dat[2] = controller_now; 279 devctrl->dat[2] = controller_now;
280 // uxn_eval(&u, mempeek16(devctrl->dat, 0)); 280 uxn_eval(&u, GETVECTOR(devctrl));
281 // in.controller = controller_now; 281 in.controller = controller_now;
282 // } 282 }
283 283
284 // // Reset input state. 284 // Reset input state.
285 // devctrl->dat[3] = 0; 285 devctrl->dat[3] = 0;
286 // memset(in.map, 0, sizeof(in.map)); 286 memset(in.map, 0, sizeof(in.map));
287}
288
289void
290mouse_pos(Device *d, u16 x, u16 y) {
291 DEVPOKE16(0x2, x);
292 DEVPOKE16(0x4, y);
293 uxn_eval(d->u, GETVECTOR(d));
287} 294}
288 295
289void 296void
290handle_mouse(void) { 297handle_mouse(void) {
291 // if (in.mouse.update) { 298 if (in.mouse.update) {
292 // // Handle mouse keys. 299 // Handle mouse keys.
293 // devmouse->dat[6] = in.mouse.buttons; 300 devmouse->dat[6] = in.mouse.buttons;
294 // if(in.mouse.buttons == 0x10 && (devmouse->dat[6] & 0x01)) { 301 if(in.mouse.buttons == 0x10 && (devmouse->dat[6] & 0x01)) {
295 // devmouse->dat[7] = 0x01; 302 devmouse->dat[7] = 0x01;
296 // } 303 }
297 // if(in.mouse.buttons == 0x01 && (devmouse->dat[6] & 0x10)) { 304 if(in.mouse.buttons == 0x01 && (devmouse->dat[6] & 0x10)) {
298 // devmouse->dat[7] = 0x10; 305 devmouse->dat[7] = 0x10;
299 // } 306 }
300 307
301 // // Handle mouse location. 308 // Handle mouse location.
302 // mempoke16(devmouse->dat, 0x2, in.mouse.x); 309 mouse_pos(devmouse, in.mouse.x, in.mouse.y);
303 // mempoke16(devmouse->dat, 0x4, in.mouse.y); 310 uxn_eval(&u, GETVECTOR(devmouse));
304 // uxn_eval(&u, mempeek16(devmouse->dat, 0)); 311 in.mouse.update = false;
305 // in.mouse.update = false; 312 }
306 // }
307} 313}
308 314
309void 315void
@@ -312,19 +318,19 @@ handle_input(void) {
312 handle_mouse(); 318 handle_mouse();
313} 319}
314 320
315static Uint8 321static u8
316nil_dei(Device *d, Uint8 port) { 322nil_dei(Device *d, u8 port) {
317 return d->dat[port]; 323 return d->dat[port];
318} 324}
319 325
320static void 326static void
321nil_deo(Device *d, Uint8 port) { 327nil_deo(Device *d, u8 port) {
322 (void)d; 328 (void)d;
323 (void)port; 329 (void)port;
324} 330}
325 331
326static void 332static void
327console_deo(Device *d, Uint8 port) { 333console_deo(Device *d, u8 port) {
328 FILE *fd = port == 0x8 ? stdout : port == 0x9 ? stderr : 0; 334 FILE *fd = port == 0x8 ? stdout : port == 0x9 ? stderr : 0;
329 if(fd) { 335 if(fd) {
330 fputc(d->dat[port], fd); 336 fputc(d->dat[port], fd);
@@ -332,27 +338,8 @@ console_deo(Device *d, Uint8 port) {
332 } 338 }
333} 339}
334 340
335void 341u8
336console_talk(Device *d, u8 b0, u8 w) { 342screen_dei(Device *d, u8 port) {
337 (void)d;
338 (void)b0;
339 (void)w;
340 // char stmp[2];
341 // if(!w) {
342 // return;
343 // }
344 // switch(b0) {
345 // case 0x8: stmp[0] = d->dat[0x8]; stmp[1] = 0; uart_puts(stmp); break;
346 // TODO: implement printf for the uart to be able to format
347 // numbers.
348 // case 0x9: txt_printf("0x%02x", d->dat[0x9]); break;
349 // case 0xb: txt_printf("0x%04x", mempeek16(d->dat, 0xa)); break;
350 // case 0xd: txt_printf("%s", &d->mem[mempeek16(d->dat, 0xc)]); break;
351 // }
352}
353
354Uint8
355screen_dei(Device *d, Uint8 port) {
356 switch(port) { 343 switch(port) {
357 case 0x2: return screen_width >> 8; 344 case 0x2: return screen_width >> 8;
358 case 0x3: return screen_width; 345 case 0x3: return screen_width;
@@ -363,11 +350,11 @@ screen_dei(Device *d, Uint8 port) {
363} 350}
364 351
365void 352void
366screen_deo(Device *d, Uint8 port) { 353screen_deo(Device *d, u8 port) {
367 switch(port) { 354 switch(port) {
368 case 0xe: { 355 case 0xe: {
369 Uint16 x, y; 356 u16 x, y;
370 Uint8 layer = d->dat[0xe] & 0x40; 357 u8 layer = d->dat[0xe] & 0x40;
371 DEVPEEK16(x, 0x8); 358 DEVPEEK16(x, 0x8);
372 DEVPEEK16(y, 0xa); 359 DEVPEEK16(y, 0xa);
373 ppu_pixel(layer ? pixels_fg : pixels_bg, x, y, d->dat[0xe] & 0x3); 360 ppu_pixel(layer ? pixels_fg : pixels_bg, x, y, d->dat[0xe] & 0x3);
@@ -375,8 +362,8 @@ screen_deo(Device *d, Uint8 port) {
375 if(d->dat[0x6] & 0x02) DEVPOKE16(0xa, y + 1); /* auto y+1 */ 362 if(d->dat[0x6] & 0x02) DEVPOKE16(0xa, y + 1); /* auto y+1 */
376 } break; 363 } break;
377 case 0xf: { 364 case 0xf: {
378 Uint16 x, y, addr; 365 u16 x, y, addr;
379 Uint8 twobpp = !!(d->dat[0xf] & 0x80); 366 u8 twobpp = !!(d->dat[0xf] & 0x80);
380 DEVPEEK16(x, 0x8); 367 DEVPEEK16(x, 0x8);
381 DEVPEEK16(y, 0xa); 368 DEVPEEK16(y, 0xa);
382 DEVPEEK16(addr, 0xc); 369 DEVPEEK16(addr, 0xc);
@@ -424,7 +411,7 @@ screen_palette(Device *d) {
424} 411}
425 412
426void 413void
427system_deo_special(Device *d, Uint8 port) { 414system_deo_special(Device *d, u8 port) {
428 if(port > 0x7 && port < 0xe) { 415 if(port > 0x7 && port < 0xe) {
429 screen_palette(d); 416 screen_palette(d);
430 } 417 }
@@ -452,7 +439,7 @@ load_rom(char *file_name) {
452void 439void
453init_uxn(Uxn *u, char *file_name) { 440init_uxn(Uxn *u, char *file_name) {
454 // Setup UXN memory. 441 // Setup UXN memory.
455 uxn_boot(u, calloc(0x10000, sizeof(Uint8))); 442 uxn_boot(u, calloc(0x10000, sizeof(u8)));
456 443
457 // Copy rom to VM. 444 // Copy rom to VM.
458 load_rom(file_name); 445 load_rom(file_name);