From 8c40fb31d36488b99045b7fa3641f8ce2cf1ff99 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 5 Mar 2022 22:41:43 +0100 Subject: [PATCH] Finish uxn core update --- src/main.c | 357 ++++++++++++++++++++++++++--------------------------- 1 file changed, 172 insertions(+), 185 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) { void handle_keyboard(void) { - // // Find mod keys. - // bool shift_mod = false; - // // bool ctrl_mod = false; - // // bool alt_mod = false; - // // bool meta_mod = false; - // for (size_t i = 0; i < sizeof(in.map); i++) { - // for (size_t j = 0; j < 8; j++) { - // char key = in.map[i] & (1 << j); - // if (key) { - // char key_code = i * 8 + j; - // switch (key_code) { - // case KEY_LEFTSHIFT: - // case KEY_RIGHTSHIFT: { shift_mod = true; } break; - // // case KEY_LEFTCTRL: - // // case KEY_RIGHTCTRL: { ctrl_mod = true; } break; - // // case KEY_LEFTALT: - // // case KEY_RIGHTALT: { alt_mod = true; } break; - // // case KEY_LEFTMETA: - // // case KEY_RIGHTMETA: { meta_mod = true; } break; - // default: break; - // } - // } - // } - // } + // Find mod keys. + bool shift_mod = false; + // bool ctrl_mod = false; + // bool alt_mod = false; + // bool meta_mod = false; + for (size_t i = 0; i < sizeof(in.map); i++) { + for (size_t j = 0; j < 8; j++) { + char key = in.map[i] & (1 << j); + if (key) { + char key_code = i * 8 + j; + switch (key_code) { + case KEY_LEFTSHIFT: + case KEY_RIGHTSHIFT: { shift_mod = true; } break; + // case KEY_LEFTCTRL: + // case KEY_RIGHTCTRL: { ctrl_mod = true; } break; + // case KEY_LEFTALT: + // case KEY_RIGHTALT: { alt_mod = true; } break; + // case KEY_LEFTMETA: + // case KEY_RIGHTMETA: { meta_mod = true; } break; + default: break; + } + } + } + } - // // Handle normal keys. - // u8 controller_now = 0; - // for (size_t i = 0; i < sizeof(in.map); i++) { - // for (size_t j = 0; j < 8; j++) { - // char key = in.map[i] & (1 << j); - // if (key) { - // char key_code = i * 8 + j; - // // Normal keys. - // u8 rune = '\0'; - // switch (key_code) { - // case KEY_KP1: - // case KEY_1: { rune = shift_mod ? '!' : '1'; } break; - // case KEY_KP2: - // case KEY_2: { rune = shift_mod ? '@' : '2'; } break; - // case KEY_KP3: - // case KEY_3: { rune = shift_mod ? '#' : '3'; } break; - // case KEY_KP4: - // case KEY_4: { rune = shift_mod ? '$' : '4'; } break; - // case KEY_KP5: - // case KEY_5: { rune = shift_mod ? '%' : '5'; } break; - // case KEY_KP6: - // case KEY_6: { rune = shift_mod ? '^' : '6'; } break; - // case KEY_KP7: - // case KEY_7: { rune = shift_mod ? '&' : '7'; } break; - // case KEY_KP8: - // case KEY_8: { rune = shift_mod ? '*' : '8'; } break; - // case KEY_KP9: - // case KEY_9: { rune = shift_mod ? '(' : '9'; } break; - // case KEY_KP0: - // case KEY_0: { rune = shift_mod ? ')' : '0'; } break; - // case KEY_KPMINUS: - // case KEY_MINUS: { rune = shift_mod ? '_' : '-'; } break; - // case KEY_KPEQUAL: - // case KEY_EQUAL: { rune = shift_mod ? '+' : '+'; } break; - // case KEY_Q: { rune = shift_mod ? 'Q' : 'q'; } break; - // case KEY_W: { rune = shift_mod ? 'W' : 'w'; } break; - // case KEY_E: { rune = shift_mod ? 'E' : 'e'; } break; - // case KEY_R: { rune = shift_mod ? 'T' : 't'; } break; - // case KEY_T: { rune = shift_mod ? 'T' : 't'; } break; - // case KEY_Y: { rune = shift_mod ? 'Y' : 'y'; } break; - // case KEY_U: { rune = shift_mod ? 'U' : 'u'; } break; - // case KEY_I: { rune = shift_mod ? 'I' : 'i'; } break; - // case KEY_O: { rune = shift_mod ? 'O' : 'o'; } break; - // case KEY_P: { rune = shift_mod ? 'P' : 'p'; } break; - // case KEY_LEFTBRACE: { rune = shift_mod ? '{' : '['; } break; - // case KEY_RIGHTBRACE: { rune = shift_mod ? '}' : ']'; } break; - // case KEY_A: { rune = shift_mod ? 'A' : 'a'; } break; - // case KEY_S: { rune = shift_mod ? 'S' : 's'; } break; - // case KEY_D: { rune = shift_mod ? 'D' : 'd'; } break; - // case KEY_F: { rune = shift_mod ? 'F' : 'f'; } break; - // case KEY_G: { rune = shift_mod ? 'G' : 'g'; } break; - // case KEY_H: { rune = shift_mod ? 'H' : 'h'; } break; - // case KEY_J: { rune = shift_mod ? 'J' : 'j'; } break; - // case KEY_K: { rune = shift_mod ? 'K' : 'k'; } break; - // case KEY_L: { rune = shift_mod ? 'L' : 'l'; } break; - // case KEY_SEMICOLON: { rune = shift_mod ? ':' : ';'; } break; - // case KEY_APOSTROPHE: { rune = shift_mod ? '"' : '\''; } break; - // case KEY_GRAVE: { rune = shift_mod ? '~' : '`'; } break; - // case KEY_BACKSLASH: { rune = shift_mod ? '|' : '\\'; } break; - // case KEY_Z: { rune = shift_mod ? 'Z' : 'z'; } break; - // case KEY_X: { rune = shift_mod ? 'X' : 'x'; } break; - // case KEY_C: { rune = shift_mod ? 'C' : 'c'; } break; - // case KEY_V: { rune = shift_mod ? 'V' : 'v'; } break; - // case KEY_B: { rune = shift_mod ? 'B' : 'b'; } break; - // case KEY_N: { rune = shift_mod ? 'N' : 'n'; } break; - // case KEY_M: { rune = shift_mod ? 'M' : 'm'; } break; - // case KEY_COMMA: { rune = shift_mod ? '<' : ','; } break; - // case KEY_DOT: { rune = shift_mod ? '>' : '.'; } break; - // case KEY_KPSLASH: - // case KEY_SLASH: { rune = shift_mod ? '?' : '/'; } break; - // case KEY_KPASTERISK: { rune = '*'; } break; - // case KEY_KPPLUS: { rune = '+'; } break; - // case KEY_KPCOMMA: { rune = '.'; } break; - // case KEY_SPACE: { rune = ' '; } break; - // case KEY_TAB: { rune = '\t'; } break; - // case KEY_ESC: { rune = 0x1b; } break; - // case KEY_BACKSPACE: { rune = 0x08; } break; - // case KEY_ENTER: - // case KEY_KPENTER: { rune = 0x0d; } break; - // default: break; - // } - // if (rune) { - // devctrl->dat[3] = rune; - // uxn_eval(&u, mempeek16(devctrl->dat, 0)); - // devctrl->dat[3] = 0; - // continue; - // } + // Handle normal keys. + u8 controller_now = 0; + for (size_t i = 0; i < sizeof(in.map); i++) { + for (size_t j = 0; j < 8; j++) { + char key = in.map[i] & (1 << j); + if (key) { + char key_code = i * 8 + j; + // Normal keys. + u8 rune = '\0'; + switch (key_code) { + case KEY_KP1: + case KEY_1: { rune = shift_mod ? '!' : '1'; } break; + case KEY_KP2: + case KEY_2: { rune = shift_mod ? '@' : '2'; } break; + case KEY_KP3: + case KEY_3: { rune = shift_mod ? '#' : '3'; } break; + case KEY_KP4: + case KEY_4: { rune = shift_mod ? '$' : '4'; } break; + case KEY_KP5: + case KEY_5: { rune = shift_mod ? '%' : '5'; } break; + case KEY_KP6: + case KEY_6: { rune = shift_mod ? '^' : '6'; } break; + case KEY_KP7: + case KEY_7: { rune = shift_mod ? '&' : '7'; } break; + case KEY_KP8: + case KEY_8: { rune = shift_mod ? '*' : '8'; } break; + case KEY_KP9: + case KEY_9: { rune = shift_mod ? '(' : '9'; } break; + case KEY_KP0: + case KEY_0: { rune = shift_mod ? ')' : '0'; } break; + case KEY_KPMINUS: + case KEY_MINUS: { rune = shift_mod ? '_' : '-'; } break; + case KEY_KPEQUAL: + case KEY_EQUAL: { rune = shift_mod ? '+' : '+'; } break; + case KEY_Q: { rune = shift_mod ? 'Q' : 'q'; } break; + case KEY_W: { rune = shift_mod ? 'W' : 'w'; } break; + case KEY_E: { rune = shift_mod ? 'E' : 'e'; } break; + case KEY_R: { rune = shift_mod ? 'T' : 't'; } break; + case KEY_T: { rune = shift_mod ? 'T' : 't'; } break; + case KEY_Y: { rune = shift_mod ? 'Y' : 'y'; } break; + case KEY_U: { rune = shift_mod ? 'U' : 'u'; } break; + case KEY_I: { rune = shift_mod ? 'I' : 'i'; } break; + case KEY_O: { rune = shift_mod ? 'O' : 'o'; } break; + case KEY_P: { rune = shift_mod ? 'P' : 'p'; } break; + case KEY_LEFTBRACE: { rune = shift_mod ? '{' : '['; } break; + case KEY_RIGHTBRACE: { rune = shift_mod ? '}' : ']'; } break; + case KEY_A: { rune = shift_mod ? 'A' : 'a'; } break; + case KEY_S: { rune = shift_mod ? 'S' : 's'; } break; + case KEY_D: { rune = shift_mod ? 'D' : 'd'; } break; + case KEY_F: { rune = shift_mod ? 'F' : 'f'; } break; + case KEY_G: { rune = shift_mod ? 'G' : 'g'; } break; + case KEY_H: { rune = shift_mod ? 'H' : 'h'; } break; + case KEY_J: { rune = shift_mod ? 'J' : 'j'; } break; + case KEY_K: { rune = shift_mod ? 'K' : 'k'; } break; + case KEY_L: { rune = shift_mod ? 'L' : 'l'; } break; + case KEY_SEMICOLON: { rune = shift_mod ? ':' : ';'; } break; + case KEY_APOSTROPHE: { rune = shift_mod ? '"' : '\''; } break; + case KEY_GRAVE: { rune = shift_mod ? '~' : '`'; } break; + case KEY_BACKSLASH: { rune = shift_mod ? '|' : '\\'; } break; + case KEY_Z: { rune = shift_mod ? 'Z' : 'z'; } break; + case KEY_X: { rune = shift_mod ? 'X' : 'x'; } break; + case KEY_C: { rune = shift_mod ? 'C' : 'c'; } break; + case KEY_V: { rune = shift_mod ? 'V' : 'v'; } break; + case KEY_B: { rune = shift_mod ? 'B' : 'b'; } break; + case KEY_N: { rune = shift_mod ? 'N' : 'n'; } break; + case KEY_M: { rune = shift_mod ? 'M' : 'm'; } break; + case KEY_COMMA: { rune = shift_mod ? '<' : ','; } break; + case KEY_DOT: { rune = shift_mod ? '>' : '.'; } break; + case KEY_KPSLASH: + case KEY_SLASH: { rune = shift_mod ? '?' : '/'; } break; + case KEY_KPASTERISK: { rune = '*'; } break; + case KEY_KPPLUS: { rune = '+'; } break; + case KEY_KPCOMMA: { rune = '.'; } break; + case KEY_SPACE: { rune = ' '; } break; + case KEY_TAB: { rune = '\t'; } break; + case KEY_ESC: { rune = 0x1b; } break; + case KEY_BACKSPACE: { rune = 0x08; } break; + case KEY_ENTER: + case KEY_KPENTER: { rune = 0x0d; } break; + default: break; + } + if (rune) { + devctrl->dat[3] = rune; + uxn_eval(&u, GETVECTOR(devctrl)); + devctrl->dat[3] = 0; + continue; + } - // // Special keys. - // switch (key_code) { - // case KEY_LEFTCTRL: { rune = 0x01; } break; - // case KEY_LEFTALT: { rune = 0x02; } break; - // case KEY_LEFTSHIFT: { rune = 0x04; } break; - // case KEY_HOME: { rune = 0x08; } break; - // case KEY_UP: { rune = 0x10; } break; - // case KEY_DOWN: { rune = 0x20; } break; - // case KEY_LEFT: { rune = 0x40; } break; - // case KEY_RIGHT: { rune = 0x80; } break; - // default: break; - // } - // if (rune) { - // controller_now |= rune; - // continue; - // } - // } - // } - // } + // Special keys. + switch (key_code) { + case KEY_LEFTCTRL: { rune = 0x01; } break; + case KEY_LEFTALT: { rune = 0x02; } break; + case KEY_LEFTSHIFT: { rune = 0x04; } break; + case KEY_HOME: { rune = 0x08; } break; + case KEY_UP: { rune = 0x10; } break; + case KEY_DOWN: { rune = 0x20; } break; + case KEY_LEFT: { rune = 0x40; } break; + case KEY_RIGHT: { rune = 0x80; } break; + default: break; + } + if (rune) { + controller_now |= rune; + continue; + } + } + } + } - // if (controller_now != in.controller) { - // devctrl->dat[2] = controller_now; - // uxn_eval(&u, mempeek16(devctrl->dat, 0)); - // in.controller = controller_now; - // } + if (controller_now != in.controller) { + devctrl->dat[2] = controller_now; + uxn_eval(&u, GETVECTOR(devctrl)); + in.controller = controller_now; + } - // // Reset input state. - // devctrl->dat[3] = 0; - // memset(in.map, 0, sizeof(in.map)); + // Reset input state. + devctrl->dat[3] = 0; + memset(in.map, 0, sizeof(in.map)); +} + +void +mouse_pos(Device *d, u16 x, u16 y) { + DEVPOKE16(0x2, x); + DEVPOKE16(0x4, y); + uxn_eval(d->u, GETVECTOR(d)); } void handle_mouse(void) { - // if (in.mouse.update) { - // // Handle mouse keys. - // devmouse->dat[6] = in.mouse.buttons; - // if(in.mouse.buttons == 0x10 && (devmouse->dat[6] & 0x01)) { - // devmouse->dat[7] = 0x01; - // } - // if(in.mouse.buttons == 0x01 && (devmouse->dat[6] & 0x10)) { - // devmouse->dat[7] = 0x10; - // } + if (in.mouse.update) { + // Handle mouse keys. + devmouse->dat[6] = in.mouse.buttons; + if(in.mouse.buttons == 0x10 && (devmouse->dat[6] & 0x01)) { + devmouse->dat[7] = 0x01; + } + if(in.mouse.buttons == 0x01 && (devmouse->dat[6] & 0x10)) { + devmouse->dat[7] = 0x10; + } - // // Handle mouse location. - // mempoke16(devmouse->dat, 0x2, in.mouse.x); - // mempoke16(devmouse->dat, 0x4, in.mouse.y); - // uxn_eval(&u, mempeek16(devmouse->dat, 0)); - // in.mouse.update = false; - // } + // Handle mouse location. + mouse_pos(devmouse, in.mouse.x, in.mouse.y); + uxn_eval(&u, GETVECTOR(devmouse)); + in.mouse.update = false; + } } void @@ -312,19 +318,19 @@ handle_input(void) { handle_mouse(); } -static Uint8 -nil_dei(Device *d, Uint8 port) { +static u8 +nil_dei(Device *d, u8 port) { return d->dat[port]; } static void -nil_deo(Device *d, Uint8 port) { +nil_deo(Device *d, u8 port) { (void)d; (void)port; } static void -console_deo(Device *d, Uint8 port) { +console_deo(Device *d, u8 port) { FILE *fd = port == 0x8 ? stdout : port == 0x9 ? stderr : 0; if(fd) { fputc(d->dat[port], fd); @@ -332,27 +338,8 @@ console_deo(Device *d, Uint8 port) { } } -void -console_talk(Device *d, u8 b0, u8 w) { - (void)d; - (void)b0; - (void)w; - // char stmp[2]; - // if(!w) { - // return; - // } - // switch(b0) { - // case 0x8: stmp[0] = d->dat[0x8]; stmp[1] = 0; uart_puts(stmp); break; - // TODO: implement printf for the uart to be able to format - // numbers. - // case 0x9: txt_printf("0x%02x", d->dat[0x9]); break; - // case 0xb: txt_printf("0x%04x", mempeek16(d->dat, 0xa)); break; - // case 0xd: txt_printf("%s", &d->mem[mempeek16(d->dat, 0xc)]); break; - // } -} - -Uint8 -screen_dei(Device *d, Uint8 port) { +u8 +screen_dei(Device *d, u8 port) { switch(port) { case 0x2: return screen_width >> 8; case 0x3: return screen_width; @@ -363,11 +350,11 @@ screen_dei(Device *d, Uint8 port) { } void -screen_deo(Device *d, Uint8 port) { +screen_deo(Device *d, u8 port) { switch(port) { case 0xe: { - Uint16 x, y; - Uint8 layer = d->dat[0xe] & 0x40; + u16 x, y; + u8 layer = d->dat[0xe] & 0x40; DEVPEEK16(x, 0x8); DEVPEEK16(y, 0xa); ppu_pixel(layer ? pixels_fg : pixels_bg, x, y, d->dat[0xe] & 0x3); @@ -375,8 +362,8 @@ screen_deo(Device *d, Uint8 port) { if(d->dat[0x6] & 0x02) DEVPOKE16(0xa, y + 1); /* auto y+1 */ } break; case 0xf: { - Uint16 x, y, addr; - Uint8 twobpp = !!(d->dat[0xf] & 0x80); + u16 x, y, addr; + u8 twobpp = !!(d->dat[0xf] & 0x80); DEVPEEK16(x, 0x8); DEVPEEK16(y, 0xa); DEVPEEK16(addr, 0xc); @@ -424,7 +411,7 @@ screen_palette(Device *d) { } void -system_deo_special(Device *d, Uint8 port) { +system_deo_special(Device *d, u8 port) { if(port > 0x7 && port < 0xe) { screen_palette(d); } @@ -452,7 +439,7 @@ load_rom(char *file_name) { void init_uxn(Uxn *u, char *file_name) { // Setup UXN memory. - uxn_boot(u, calloc(0x10000, sizeof(Uint8))); + uxn_boot(u, calloc(0x10000, sizeof(u8))); // Copy rom to VM. load_rom(file_name);