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