From 2c9b9630b38e7e890daf65ef7b65beb1f5a5783f Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 23 Jan 2023 13:36:05 +0100 Subject: Update UXN core to latest version This modernizes the uxn core and emulator approach (dei/deo instead of _talk), forgoing the previous uxn-fast core implementation. As a consequence, there are some performance regressions. That tradeoff gives us an easier way of keeping uxngba up to date as it follows more closely the upstream version. --- src/main.c | 494 +++---- src/ppu.c | 7 + src/uxn.c | 4334 ++---------------------------------------------------------- src/uxn.h | 52 +- 4 files changed, 381 insertions(+), 4506 deletions(-) diff --git a/src/main.c b/src/main.c index a2661cd..beb65e3 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,12 @@ /* -Copyright (c) 2021 Bad Diode + Copyright (c) 2021 Bad Diode -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE. */ #include @@ -39,8 +39,10 @@ WITH REGARD TO THIS SOFTWARE. #ifdef PROF_ENABLE #if PROF_ENABLE == 0 +#define TEXT_ENABLE 1 #define PROF(F,VAR) (profile_start(),(F),(VAR) = profile_stop()) #elif PROF_ENABLE == 1 +#define TEXT_ENABLE 1 #define PROF(F,VAR) (profile_start(),(F),(VAR) = MAX(profile_stop(), (VAR))) #endif #ifndef PROF_SHOW_X @@ -90,219 +92,254 @@ typedef struct Mouse { int y; } Mouse; +EWRAM_BSS +static u8 umem[0x10300]; + +static Uxn u; static Ppu ppu; -static Device *devscreen; -static Device *devctrl; -static Device *devmouse; -static Device *devaudio; static Mouse mouse = {SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2}; -void -nil_talk(Device *d, u8 b0, u8 w) { - (void)d; - (void)b0; - (void)w; -} - -void -console_talk(Device *d, u8 b0, u8 w) { - char stmp[2]; - if(!w) { - return; - } - switch(b0) { - case 0x8: stmp[0] = d->dat[0x8]; stmp[1] = 0; txt_printf(stmp); break; - 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; - } +int +uxn_halt(Uxn *u, u8 instr, u8 err, u16 addr) { + (void)u; + txt_printf("HALTED\n"); + txt_printf("I: %lu\n", instr); + txt_printf("E: %lu\n", err); + txt_printf("A: %lu\n", addr); + while (true); } -void -system_talk(Device *d, u8 b0, u8 w) { - if(!w) { - d->dat[0x2] = d->u->wst.ptr; - d->dat[0x3] = d->u->rst.ptr; - } else { - putcolors(&d->dat[0x8]); +IWRAM_CODE +u8 +screen_dei(u8 *d, u8 port) { + switch(port) { + case 0x2: return (SCREEN_WIDTH >> 8); + case 0x3: return (SCREEN_WIDTH); + case 0x4: return (SCREEN_HEIGHT >> 8); + case 0x5: return (SCREEN_HEIGHT); + default: return d[port]; } - (void)b0; } IWRAM_CODE void -screen_talk(Device *d, u8 b0, u8 w) { - if (!w) { - switch(b0) { - case 0x2: d->dat[b0] = (SCREEN_WIDTH >> 8); break; - case 0x3: d->dat[b0] = (SCREEN_WIDTH); break; - case 0x4: d->dat[b0] = (SCREEN_HEIGHT >> 8); break; - case 0x5: d->dat[b0] = (SCREEN_HEIGHT); break; +screen_deo(u8 *ram, u8 *d, u8 port) { + switch(port) { + case 0xe: { + u16 x, y; + u8 layer = d[0xe] & 0x40; + PEKDEV(x, 0x8); + PEKDEV(y, 0xa); + ppu_pixel(layer ? ppu.fg : ppu.bg, x, y, d[0xe] & 0x3); + if(d[0x6] & 0x01) POKDEV(0x8, x + 1); /* auto x+1 */ + if(d[0x6] & 0x02) POKDEV(0xa, y + 1); /* auto y+1 */ + break; } - } else { - switch (b0) { - case 0x1: { - d->vector = mempeek16(d->dat, 0x0); - } break; - case 0xe: { - u16 x, y; - u8 layer = d->dat[0xe] & 0x40; - DEVPEEK16(x, 0x8); - DEVPEEK16(y, 0xa); - ppu_pixel(layer ? ppu.fg : ppu.bg, x, y, d->dat[0xe] & 0x3); - if(d->dat[0x6] & 0x01) DEVPOKE16(0x8, x + 1); /* auto x+1 */ - if(d->dat[0x6] & 0x02) DEVPOKE16(0xa, y + 1); /* auto y+1 */ - } break; - case 0xf: { - u16 x, y, dx, dy, addr; - u8 twobpp = !!(d->dat[0xf] & 0x80); - DEVPEEK16(x, 0x8); - DEVPEEK16(y, 0xa); - DEVPEEK16(addr, 0xc); - u8 n = d->dat[0x6] >> 4; - dx = (d->dat[0x6] & 0x01) << 3; - dy = (d->dat[0x6] & 0x02) << 2; - if(addr > 0x10000 - ((n + 1) << (3 + twobpp))) { - return; - } - u8 *layer = (d->dat[0xf] & 0x40) ? ppu.fg : ppu.bg; - u8 color = d->dat[0xf] & 0xf; - u8 flipx = d->dat[0xf] & 0x10; - u8 flipy = d->dat[0xf] & 0x20; - for(size_t i = 0; i <= n; i++) { - u8 *sprite = &d->mem[addr]; - if (twobpp) { - ppu_2bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); - } else { - ppu_1bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); - } - addr += (d->dat[0x6] & 0x04) << (1 + twobpp); + case 0xf: { + u16 x, y, dx, dy, addr; + u8 n, twobpp = !!(d[0xf] & 0x80); + PEKDEV(x, 0x8); + PEKDEV(y, 0xa); + PEKDEV(addr, 0xc); + n = d[0x6] >> 4; + dx = (d[0x6] & 0x01) << 3; + dy = (d[0x6] & 0x02) << 2; + if(addr > 0x10000 - ((n + 1) << (3 + twobpp))) { + return; + } + u8 *layer = (d[0xf] & 0x40) ? ppu.fg : ppu.bg; + u8 color = d[0xf] & 0xf; + u8 flipx = d[0xf] & 0x10; + u8 flipy = d[0xf] & 0x20; + for(size_t i = 0; i <= n; i++) { + u8 *sprite = &ram[addr]; + if (twobpp) { + ppu_2bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); + } else { + ppu_1bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); } - DEVPOKE16(0xc, addr); /* auto addr+length */ - DEVPOKE16(0x8, x + dx); /* auto x+8 */ - DEVPOKE16(0xa, y + dy); /* auto y+8 */ - } break; - default: break; + addr += (d[0x6] & 0x04) << (1 + twobpp); + } + POKDEV(0xc, addr); /* auto addr+length */ + POKDEV(0x8, x + dx); /* auto x+8 */ + POKDEV(0xa, y + dy); /* auto y+8 */ + break; } } } -static void -audio_talk(Device *d, u8 b0, u8 w) { - AudioChannel *c = &channels[d - devaudio]; - if(!w) { - if(b0 == 0x2) { - mempoke16(d->dat, 0x2, c->pos); +u8 +audio_dei(int instance, u8 *d, u8 port) { + AudioChannel *c = &channels[instance]; + switch(port) { + // case 0x4: return apu_get_vu(instance); + case 0x2: { + POKDEV(0x2, c->pos); c->pos <<= 12; // fixed point. - } else if(b0 == 0x4) { - // d->dat[0x4] = apu_get_vu(c); + break; } - } else if(b0 == 0xf) { - u16 length = mempeek16(d->dat, 0xa); - u8 *data = &d->mem[mempeek16(d->dat, 0xc)]; - u8 pitch = d->dat[0xf] & 0x7f; - u16 adsr = mempeek16(d->dat, 0x8); - u32 vol = MAX(d->dat[0xe] >> 4, d->dat[0xe] & 0xf) * 4 / 3; - bool loop = !(d->dat[0xf] & 0x80); - update_channel(c, data, length, pitch, adsr, vol, loop); } + return d[port]; } void -datetime_talk(Device *d, u8 b0, u8 w) { - (void)b0; - (void)w; +audio_deo(int instance, u8 *d, u8 port, Uxn *u) { + AudioChannel *c = &channels[instance]; + if (port == 0xf) { + u16 length = 0; + u16 adsr = 0; + u16 addr = 0; + u8 pitch = d[0xf] & 0x7f; + PEKDEV(adsr, 0x8); + PEKDEV(length, 0xa); + PEKDEV(addr, 0xc); + u8 *data = &u->ram[addr]; + u32 vol = MAX(d[0xe] >> 4, d[0xe] & 0xf) * 4 / 3; + bool loop = !(d[0xf] & 0x80); + update_channel(c, data, length, pitch, adsr, vol, loop); + } +} + +u8 +datetime_dei(u8 *d, u8 port) { struct tm *t = gmtime(&seconds); - t->tm_year += 1900; - DEVPOKE16(0x0, t->tm_year); - d->dat[0x2] = t->tm_mon; - d->dat[0x3] = t->tm_mday; - d->dat[0x4] = t->tm_hour; - d->dat[0x5] = t->tm_min; - d->dat[0x6] = t->tm_sec; - d->dat[0x7] = t->tm_wday; - DEVPOKE16(0x08, t->tm_yday); - d->dat[0xa] = t->tm_isdst; + switch(port) { + case 0x0: return (t->tm_year + 1900) >> 8; + case 0x1: return (t->tm_year + 1900); + case 0x2: return t->tm_mon; + case 0x3: return t->tm_mday; + case 0x4: return t->tm_hour; + case 0x5: return t->tm_min; + case 0x6: return t->tm_sec; + case 0x7: return t->tm_wday; + case 0x8: return t->tm_yday >> 8; + case 0x9: return t->tm_yday; + case 0xa: return t->tm_isdst; + default: return d[port]; + } } -void -file_talk(Device *d, u8 b0, u8 w) { - if (w) { - u16 a, b, res; - UxnFile *f = &uxn_file[d - &d->u->dev[0xa]]; - switch(b0) { - case 0x5: { - DEVPEEK16(a, 0x4); - DEVPEEK16(b, 0xa); - if(b > 0x10000 - a) { - b = 0x10000 - a; - } - res = file_stat(f, &d->mem[a], b); - DEVPOKE16(0x2, res); - } break; - case 0x6: { - // TODO: no file deletion for now - // res = file_delete(); - // DEVPOKE16(0x2, res); - } break; - case 0x9: { - DEVPEEK16(a, 0x8); - res = file_init(f, &d->mem[a]); - DEVPOKE16(0x2, res); - } break; - case 0xd: { - DEVPEEK16(a, 0xc); - DEVPEEK16(b, 0xa); - if(b > 0x10000 - a) { - b = 0x10000 - a; - } - res = file_read(f, &d->mem[a], b); - DEVPOKE16(0x2, res); - } break; - case 0xf: { - DEVPEEK16(a, 0xe); - DEVPEEK16(b, 0xa); - if(b > 0x10000 - a) { - b = 0x10000 - a; - } - res = file_write(f, &d->mem[a], b, d->dat[0x7]); - DEVPOKE16(0x2, res); - } break; +u8 +file_dei(u8 id, u8 *d, u8 port) { + UxnFile *c = &uxn_file[id]; + u16 res; + switch(port) { + case 0xc: + case 0xd: { + res = file_read(c, &d[port], 1); + POKDEV(0x2, res); + break; } } + return d[port]; } void -init_uxn(Uxn *u) { - // Initialize PPU. - initppu(&ppu, 30, 20); +file_deo(u8 id, u8 *ram, u8 *d, u8 port) { + u16 a, b, res; + UxnFile *f = &uxn_file[id]; + switch(port) { + case 0x5: { + PEKDEV(a, 0x4); + PEKDEV(b, 0xa); + if(b > 0x10000 - a) { + b = 0x10000 - a; + } + res = file_stat(f, &ram[a], b); + POKDEV(0x2, res); + } break; + case 0x6: { + // TODO: no file deletion for now + // res = file_delete(); + // POKDEV(0x2, res); + } break; + case 0x9: { + PEKDEV(a, 0x8); + res = file_init(f, &ram[a]); + POKDEV(0x2, res); + } break; + case 0xd: { + PEKDEV(a, 0xc); + PEKDEV(b, 0xa); + if(b > 0x10000 - a) { + b = 0x10000 - a; + } + res = file_read(f, &ram[a], b); + POKDEV(0x2, res); + } break; + case 0xf: { + PEKDEV(a, 0xe); + PEKDEV(b, 0xa); + if(b > 0x10000 - a) { + b = 0x10000 - a; + } + res = file_write(f, &ram[a], b, d[0x7]); + POKDEV(0x2, res); + } break; + } +} - // Enable sound. - init_sound(); +void +console_deo(u8 *d, u8 port) { + txt_printf("%c", d[port]); +} + +void +system_deo(Uxn *u, u8 *d, u8 port) { + switch(port) { + case 0x2: u->wst = (Stack *)(u->ram + (d[port] ? (d[port] * 0x100) : 0x10000)); break; + case 0x3: u->rst = (Stack *)(u->ram + (d[port] ? (d[port] * 0x100) : 0x10100)); break; + } +} + +u8 +emu_dei(Uxn *u, u8 addr) { + u8 p = addr & 0x0f, d = addr & 0xf0; + switch(d) { + case 0x20: return screen_dei(&u->dev[d], p); + case 0x30: return audio_dei(0, &u->dev[d], p); + case 0x40: return audio_dei(1, &u->dev[d], p); + case 0x50: return audio_dei(2, &u->dev[d], p); + case 0x60: return audio_dei(3, &u->dev[d], p); + case 0xa0: return file_dei(0, &u->dev[d], p); + case 0xb0: return file_dei(1, &u->dev[d], p); + case 0xc0: return datetime_dei(&u->dev[d], p); + } + return u->dev[addr]; + return 0; +} + +void +emu_deo(Uxn *u, u8 addr, u8 v) { + u8 p = addr & 0x0f, d = addr & 0xf0; + u->dev[addr] = v; + switch(d) { + case 0x00: + system_deo(u, &u->dev[d], p); + if(p > 0x7 && p < 0xe) + putcolors(&u->dev[0x8]); + break; + case 0x10: console_deo(&u->dev[d], p); break; + case 0x20: screen_deo(u->ram, &u->dev[d], p); break; + case 0x30: audio_deo(0, &u->dev[d], p, u); break; + case 0x40: audio_deo(1, &u->dev[d], p, u); break; + case 0x50: audio_deo(2, &u->dev[d], p, u); break; + case 0x60: audio_deo(3, &u->dev[d], p, u); break; + case 0xa0: file_deo(0, u->ram, &u->dev[d], p); break; + case 0xb0: file_deo(1, u->ram, &u->dev[d], p); break; + } +} + +void +init_uxn(Uxn *u) { + // Initialize uxn. + u32 fill = 0; + dma_fill(umem, fill, 0x10300, 3); + uxn_boot(u, umem, emu_dei, emu_deo); // Copy rom to VM. - memcpy(u->ram.dat + PAGE_PROGRAM, uxn_rom, sizeof(uxn_rom)); - - // Prepare devices. - uxn_port(u, 0x0, "system", system_talk); - uxn_port(u, 0x1, "console", console_talk); - devscreen = uxn_port(u, 0x2, "screen", screen_talk); - devaudio = uxn_port(u, 0x3, "audio0", audio_talk); - uxn_port(u, 0x4, "audio1", audio_talk); - uxn_port(u, 0x5, "audio2", audio_talk); - uxn_port(u, 0x6, "audio3", audio_talk); - uxn_port(u, 0x7, "---", nil_talk); - devctrl = uxn_port(u, 0x8, "controller", nil_talk); - devmouse = uxn_port(u, 0x9, "mouse", nil_talk); - uxn_port(u, 0xa, "file1", file_talk); - uxn_port(u, 0xb, "file2", file_talk); // TODO: support second file device - uxn_port(u, 0xc, "datetime", datetime_talk); - uxn_port(u, 0xd, "---", nil_talk); - uxn_port(u, 0xe, "---", nil_talk); - uxn_port(u, 0xf, "---", nil_talk); - mempoke16(devscreen->dat, 2, ppu.hor * 8); - mempoke16(devscreen->dat, 4, ppu.ver * 8); + memcpy(u->ram + PAGE_PROGRAM, uxn_rom, sizeof(uxn_rom)); } IWRAM_CODE @@ -313,16 +350,18 @@ handle_input(Uxn *u) { // Reset control variables on method switch. switch (ctrl_methods[ctrl_idx]) { case CONTROL_CONTROLLER: { - devctrl->dat[2] = 0; - uxn_eval(u, mempeek16(devctrl->dat, 0)); - devctrl->dat[3] = 0; + u8 *d = &u->dev[0x80]; + d[2] = 0; + uxn_eval(u, GETVEC(d)); + d[3] = 0; } break; case CONTROL_MOUSE: { - devmouse->dat[6] = 0; - devmouse->dat[7] = 0; - mempoke16(devmouse->dat, 0x2, -10); - mempoke16(devmouse->dat, 0x4, -10); - uxn_eval(u, mempeek16(devmouse->dat, 0)); + u8 *d = &u->dev[0x90]; + d[6] = 0; + d[7] = 0; + POKDEV(0x2, -10); + POKDEV(0x4, -10); + uxn_eval(u, GETVEC(d)); } break; case CONTROL_KEYBOARD: { toggle_keyboard(); @@ -339,9 +378,10 @@ handle_input(Uxn *u) { } if (ctrl_methods[ctrl_idx] == CONTROL_CONTROLLER) { - // TODO: We don't need ifs if we use KEY_INPUTS directly and mayvbe just + u8 *d = &u->dev[0x80]; + // TODO: We don't need ifs if we use KEY_INPUTS directly and maybe just // swap some things if needed. - u8 *flag = &devctrl->dat[2]; + u8 *flag = &d[2]; if (key_tap(KEY_A)) { *flag |= 0x01; } else { @@ -383,11 +423,12 @@ handle_input(Uxn *u) { *flag &= ~0x80; } - uxn_eval(u, mempeek16(devctrl->dat, 0)); - devctrl->dat[3] = 0; + uxn_eval(u, GETVEC(d)); + d[3] = 0; } else if (ctrl_methods[ctrl_idx] == CONTROL_MOUSE) { + u8 *d = &u->dev[0x90]; // Detect "mouse key press". - u8 flag = devmouse->dat[6]; + u8 flag = d[6]; if (key_tap(KEY_B)) { flag |= 0x01; } else if (key_released(KEY_B)) { @@ -400,12 +441,12 @@ handle_input(Uxn *u) { } // Handle chording. - devmouse->dat[6] = flag; - if(flag == 0x10 && (devmouse->dat[6] & 0x01)) { - devmouse->dat[7] = 0x01; + d[6] = flag; + if(flag == 0x10 && (d[6] & 0x01)) { + d[7] = 0x01; } - if(flag == 0x01 && (devmouse->dat[6] & 0x10)) { - devmouse->dat[7] = 0x10; + if(flag == 0x01 && (d[6] & 0x10)) { + d[7] = 0x10; } // Detect mouse movement. @@ -421,10 +462,11 @@ handle_input(Uxn *u) { } // Eval mouse. - mempoke16(devmouse->dat, 0x2, mouse.x); - mempoke16(devmouse->dat, 0x4, mouse.y); - uxn_eval(u, mempeek16(devmouse->dat, 0)); + POKDEV(0x2, mouse.x); + POKDEV(0x4, mouse.y); + uxn_eval(u, GETVEC(d)); } else if (ctrl_methods[ctrl_idx] == CONTROL_KEYBOARD) { + u8 *d = &u->dev[0x80]; if (key_tap(KEY_LEFT)) { update_cursor(cursor_position - 1); } else if (key_tap(KEY_RIGHT)) { @@ -441,43 +483,40 @@ handle_input(Uxn *u) { switch (symbol) { case 0x7f: { // Backspace. - devctrl->dat[3] = 0x08; + d[3] = 0x08; } break; case 0x14: { // New line. - devctrl->dat[3] = 0x0d; + d[3] = 0x0d; } break; case 0x18: { // Arrow up. - devctrl->dat[2] = 0x10; + d[2] = 0x10; } break; case 0x19: { // Arrow down. - devctrl->dat[2] = 0x20; + d[2] = 0x20; } break; case 0x1b: { // Arrow left. - devctrl->dat[2] = 0x40; + d[2] = 0x40; } break; case 0x1a: { // Arrow right. - devctrl->dat[2] = 0x80; + d[2] = 0x80; } break; default: { - devctrl->dat[3] = symbol; + d[3] = symbol; } break; } - uxn_eval(u, mempeek16(devctrl->dat, 0)); - devctrl->dat[3] = 0; + uxn_eval(u, GETVEC(d)); + d[3] = 0; } } } -static Uxn u; -EWRAM_BSS -static u8 umem[KB(64)]; - -int main(void) { +int +main(void) { // Adjust system wait times. SYSTEM_WAIT = SYSTEM_WAIT_CARTRIDGE; @@ -488,16 +527,19 @@ int main(void) { irq_init(); irs_set(IRQ_VBLANK, sound_vsync); - // Initialize VM. - dma_fill(&u, 0, sizeof(u), 3); - u.ram.dat = umem; - init_uxn(&u); + // Initialize PPU. + initppu(&ppu, 30, 20); // Initialize text engine. +#ifdef TEXT_ENABLE txt_init(1, TEXT_LAYER); txt_position(0,0); +#endif + + // Initialize UXN. + init_uxn(&u); - // Initialize sound mixer. + // Enable sound. init_sound(); // Main loop. @@ -507,7 +549,7 @@ int main(void) { while(true) { bios_vblank_wait(); PROF(handle_input(&u), input_cycles); - PROF(uxn_eval(&u, mempeek16(devscreen->dat, 0)), eval_cycles); + PROF(uxn_eval(&u, GETVEC(&u.dev[0x20])), eval_cycles); PROF(sound_mix(), mix_cycles); PROF_SHOW(); PROF(flipbuf(&ppu), flip_cycles); diff --git a/src/ppu.c b/src/ppu.c index 0f8fefd..1a13ba3 100644 --- a/src/ppu.c +++ b/src/ppu.c @@ -386,6 +386,13 @@ flipbuf(Ppu *p) { } } +void +redraw(void) { + for (size_t i = 0; i < 21; i++) { + dirty_tiles[i] = 0xFFFFFFFF; + } +} + typedef struct KeyboardChar { int x; int y; diff --git a/src/uxn.c b/src/uxn.c index a8fe7ac..5c39803 100644 --- a/src/uxn.c +++ b/src/uxn.c @@ -1,11 +1,7 @@ -#include #include "uxn.h" -#define NO_STACK_CHECKS - /* -Copyright (u) 2021 Devine Lu Linvega -Copyright (u) 2021 Andrew Alderwick +Copyright (u) 2022-2023 Devine Lu Linvega, Andrew Alderwick, Andrew Richards Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -15,4255 +11,101 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE. */ -/* - ^ -/!\ THIS FILE IS AUTOMATICALLY GENERATED ---- - -Its contents can get overwritten with the processed contents of src/uxn.c. -See etc/mkuxn-fast.moon for instructions. - -*/ +/* a,b,c: general use. bs: byte/short bool. src, dst: stack ptrs, swapped in return mode. + pc: program counter. sp: ptr to src stack ptr. kptr: "keep" mode copy of src stack ptr. + x,y: macro in params. d: macro in device. j: macro temp variables. o: macro out param. */ -#define MODE_RETURN 0x40 -#define MODE_KEEP 0x80 +#define HALT(c) { return uxn_halt(u, instr, (c), pc - 1); } +#define JUMP(x) { if(bs) pc = (x); else pc += (s8)(x); } +#define PUSH8(s, x) { if(s->ptr == 0xff) HALT(2) s->dat[s->ptr++] = (x); } +#define PUSH16(s, x) { if((j = s->ptr) >= 0xfe) HALT(2) k = (x); s->dat[j] = k >> 8; s->dat[j + 1] = k; s->ptr = j + 2; } +#define PUSH(s, x) { if(bs) { PUSH16(s, (x)) } else { PUSH8(s, (x)) } } +#define POP8(o) { if(!(j = *sp)) HALT(1) o = (u16)src->dat[--j]; *sp = j; } +#define POP16(o) { if((j = *sp) <= 1) HALT(1) o = (src->dat[j - 2] << 8) + src->dat[j - 1]; *sp = j - 2; } +#define POP(o) { if(bs) { POP16(o) } else { POP8(o) } } +#define POKE(x, y) { if(bs) { u->ram[(x)] = (y) >> 8; u->ram[(x) + 1] = (y); } else { u->ram[(x)] = y; } } +#define PEEK16(o, x) { o = (u->ram[(x)] << 8) + u->ram[(x) + 1]; } +#define PEEK(o, x) { if(bs) PEEK16(o, x) else o = u->ram[(x)]; } +#define DEVR(o, x) { o = u->dei(u, x); if (bs) o = (o << 8) + u->dei(u, (x) + 1); } +#define DEVW(x, y) { if (bs) { u->deo(u, (x), (y) >> 8); u->deo(u, (x) + 1, (y)); } else { u->deo(u, x, (y)); } } IWRAM_CODE int -uxn_eval(Uxn *u, u16 vec) +uxn_eval(Uxn *u, u16 pc) { - u8 instr; - if(!vec || u->dev[0].dat[0xf]) - return 0; - u->ram.ptr = vec; - if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; - while((instr = u->ram.dat[u->ram.ptr++])) { - switch(instr) { -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-value" -#pragma GCC diagnostic ignored "-Wunused-variable" - case 0x00: /* LIT */ - case 0x80: /* LITk */ - __asm__("evaluxn_00_LIT:"); - { - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x01: /* INC */ - __asm__("evaluxn_01_INC:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 1] = a + 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x02: /* POP */ - __asm__("evaluxn_02_POP:"); - { - u->wst.dat[u->wst.ptr - 1]; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x06: /* DUP */ - __asm__("evaluxn_03_DUP:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x03: /* NIP */ - __asm__("evaluxn_04_NIP:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x04: /* SWP */ - __asm__("evaluxn_05_SWP:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = a; - u->wst.dat[u->wst.ptr - 1] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x07: /* OVR */ - __asm__("evaluxn_06_OVR:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x05: /* ROT */ - __asm__("evaluxn_07_ROT:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3]; - u->wst.dat[u->wst.ptr - 3] = b; - u->wst.dat[u->wst.ptr - 2] = a; - u->wst.dat[u->wst.ptr - 1] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x08: /* EQU */ - __asm__("evaluxn_08_EQU:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x09: /* NEQ */ - __asm__("evaluxn_09_NEQ:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x0a: /* GTH */ - __asm__("evaluxn_0a_GTH:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x0b: /* LTH */ - __asm__("evaluxn_0b_LTH:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x0c: /* JMP */ - __asm__("evaluxn_0c_JMP:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x0d: /* JCN */ - __asm__("evaluxn_0d_JCN:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - if(u->wst.dat[u->wst.ptr - 2]) u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x0e: /* JSR */ - __asm__("evaluxn_0e_JSR:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; - u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0x0f: /* STH */ - __asm__("evaluxn_0f_STH:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->rst.dat[u->rst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x10: /* LDZ */ - __asm__("evaluxn_10_LDZ:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x11: /* STZ */ - __asm__("evaluxn_11_STZ:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u8 b = u->wst.dat[u->wst.ptr - 2]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x12: /* LDR */ - __asm__("evaluxn_12_LDR:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x13: /* STR */ - __asm__("evaluxn_13_STR:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u8 b = u->wst.dat[u->wst.ptr - 2]; - mempoke8(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x14: /* LDA */ - __asm__("evaluxn_14_LDA:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u->wst.dat[u->wst.ptr - 2] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x15: /* STA */ - __asm__("evaluxn_15_STA:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u8 b = u->wst.dat[u->wst.ptr - 3]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x16: /* DEI */ - __asm__("evaluxn_16_DEI:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x17: /* DEO */ - __asm__("evaluxn_17_DEO:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - devpoke8(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x18: /* ADD */ - __asm__("evaluxn_18_ADD:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b + a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x19: /* SUB */ - __asm__("evaluxn_19_SUB:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b - a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x1a: /* MUL */ - __asm__("evaluxn_1a_MUL:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b * a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x1b: /* DIV */ - __asm__("evaluxn_1b_DIV:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - if(a == 0) { - u->wst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->wst.dat[u->wst.ptr - 2] = b / a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x1c: /* AND */ - __asm__("evaluxn_1c_AND:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x1d: /* ORA */ - __asm__("evaluxn_1d_ORA:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x1e: /* EOR */ - __asm__("evaluxn_1e_EOR:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x1f: /* SFT */ - __asm__("evaluxn_1f_SFT:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr - 2] = b >> (a & 0x07) << ((a & 0x70) >> 4); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x20: /* LIT2 */ - case 0xa0: /* LIT2k */ - __asm__("evaluxn_20_LIT2:"); - { - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); - u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x21: /* INC2 */ - __asm__("evaluxn_21_INC2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u->wst.dat[u->wst.ptr - 2] = (a + 1) >> 8; - u->wst.dat[u->wst.ptr - 1] = (a + 1) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x22: /* POP2 */ - __asm__("evaluxn_22_POP2:"); - { - (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x26: /* DUP2 */ - __asm__("evaluxn_23_DUP2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b; - u->wst.dat[u->wst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x23: /* NIP2 */ - __asm__("evaluxn_24_NIP2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = a >> 8; - u->wst.dat[u->wst.ptr - 3] = a & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x24: /* SWP2 */ - __asm__("evaluxn_25_SWP2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr - 4] = b; - u->wst.dat[u->wst.ptr - 3] = a; - u->wst.dat[u->wst.ptr - 2] = d; - u->wst.dat[u->wst.ptr - 1] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x27: /* OVR2 */ - __asm__("evaluxn_26_OVR2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr] = d; - u->wst.dat[u->wst.ptr + 1] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x25: /* ROT2 */ - __asm__("evaluxn_27_ROT2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4], e = u->wst.dat[u->wst.ptr - 5], f = u->wst.dat[u->wst.ptr - 6]; - u->wst.dat[u->wst.ptr - 6] = d; - u->wst.dat[u->wst.ptr - 5] = c; - u->wst.dat[u->wst.ptr - 4] = b; - u->wst.dat[u->wst.ptr - 3] = a; - u->wst.dat[u->wst.ptr - 2] = f; - u->wst.dat[u->wst.ptr - 1] = e; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 6, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x28: /* EQU2 */ - __asm__("evaluxn_28_EQU2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x29: /* NEQ2 */ - __asm__("evaluxn_29_NEQ2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x2a: /* GTH2 */ - __asm__("evaluxn_2a_GTH2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x2b: /* LTH2 */ - __asm__("evaluxn_2b_LTH2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x2c: /* JMP2 */ - __asm__("evaluxn_2c_JMP2:"); - { - u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x2d: /* JCN2 */ - __asm__("evaluxn_2d_JCN2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - if(u->wst.dat[u->wst.ptr - 3]) u->ram.ptr = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x2e: /* JSR2 */ - __asm__("evaluxn_2e_JSR2:"); - { - u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; - u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0x2f: /* STH2 */ - __asm__("evaluxn_2f_STH2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b; - u->rst.dat[u->rst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0x30: /* LDZ2 */ - __asm__("evaluxn_30_LDZ2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, a); - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x31: /* STZ2 */ - __asm__("evaluxn_31_STZ2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x32: /* LDR2 */ - __asm__("evaluxn_32_LDR2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x33: /* STR2 */ - __asm__("evaluxn_33_STR2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - mempoke16(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x34: /* LDA2 */ - __asm__("evaluxn_34_LDA2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u->wst.dat[u->wst.ptr - 2] = mempeek8(u->ram.dat, a); - u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x35: /* STA2 */ - __asm__("evaluxn_35_STA2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u16 b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 4; - } - break; - case 0x36: /* DEI2 */ - __asm__("evaluxn_36_DEI2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); - u->wst.dat[u->wst.ptr] = devpeek8(&u->dev[a >> 4], a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x37: /* DEO2 */ - __asm__("evaluxn_37_DEO2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - devpoke16(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 3; - } - break; - case 0x38: /* ADD2 */ - __asm__("evaluxn_38_ADD2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = (b + a) >> 8; - u->wst.dat[u->wst.ptr - 3] = (b + a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x39: /* SUB2 */ - __asm__("evaluxn_39_SUB2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = (b - a) >> 8; - u->wst.dat[u->wst.ptr - 3] = (b - a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x3a: /* MUL2 */ - __asm__("evaluxn_3a_MUL2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr - 4] = (b * a) >> 8; - u->wst.dat[u->wst.ptr - 3] = (b * a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x3b: /* DIV2 */ - __asm__("evaluxn_3b_DIV2:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - if(a == 0) { - u->wst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->wst.dat[u->wst.ptr - 4] = (b / a) >> 8; - u->wst.dat[u->wst.ptr - 3] = (b / a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x3c: /* AND2 */ - __asm__("evaluxn_3c_AND2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr - 4] = d & b; - u->wst.dat[u->wst.ptr - 3] = c & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x3d: /* ORA2 */ - __asm__("evaluxn_3d_ORA2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr - 4] = d | b; - u->wst.dat[u->wst.ptr - 3] = c | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x3e: /* EOR2 */ - __asm__("evaluxn_3e_EOR2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr - 4] = d ^ b; - u->wst.dat[u->wst.ptr - 3] = c ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 2; - } - break; - case 0x3f: /* SFT2 */ - __asm__("evaluxn_3f_SFT2:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - u->wst.dat[u->wst.ptr - 3] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8; - u->wst.dat[u->wst.ptr - 2] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - u->wst.ptr -= 1; - } - break; - case 0x40: /* LITr */ - case 0xc0: /* LITkr */ - __asm__("evaluxn_40_LITr:"); - { - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x41: /* INCr */ - __asm__("evaluxn_41_INCr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 1] = a + 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x42: /* POPr */ - __asm__("evaluxn_42_POPr:"); - { - u->rst.dat[u->rst.ptr - 1]; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x46: /* DUPr */ - __asm__("evaluxn_43_DUPr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x43: /* NIPr */ - __asm__("evaluxn_44_NIPr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x44: /* SWPr */ - __asm__("evaluxn_45_SWPr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = a; - u->rst.dat[u->rst.ptr - 1] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x47: /* OVRr */ - __asm__("evaluxn_46_OVRr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x45: /* ROTr */ - __asm__("evaluxn_47_ROTr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3]; - u->rst.dat[u->rst.ptr - 3] = b; - u->rst.dat[u->rst.ptr - 2] = a; - u->rst.dat[u->rst.ptr - 1] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x48: /* EQUr */ - __asm__("evaluxn_48_EQUr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x49: /* NEQr */ - __asm__("evaluxn_49_NEQr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x4a: /* GTHr */ - __asm__("evaluxn_4a_GTHr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x4b: /* LTHr */ - __asm__("evaluxn_4b_LTHr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x4c: /* JMPr */ - __asm__("evaluxn_4c_JMPr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x4d: /* JCNr */ - __asm__("evaluxn_4d_JCNr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - if(u->rst.dat[u->rst.ptr - 2]) u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x4e: /* JSRr */ - __asm__("evaluxn_4e_JSRr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; - u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x4f: /* STHr */ - __asm__("evaluxn_4f_STHr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->wst.dat[u->wst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x50: /* LDZr */ - __asm__("evaluxn_50_LDZr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x51: /* STZr */ - __asm__("evaluxn_51_STZr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u8 b = u->rst.dat[u->rst.ptr - 2]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x52: /* LDRr */ - __asm__("evaluxn_52_LDRr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x53: /* STRr */ - __asm__("evaluxn_53_STRr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u8 b = u->rst.dat[u->rst.ptr - 2]; - mempoke8(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x54: /* LDAr */ - __asm__("evaluxn_54_LDAr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u->rst.dat[u->rst.ptr - 2] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x55: /* STAr */ - __asm__("evaluxn_55_STAr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u8 b = u->rst.dat[u->rst.ptr - 3]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x56: /* DEIr */ - __asm__("evaluxn_56_DEIr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x57: /* DEOr */ - __asm__("evaluxn_57_DEOr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - devpoke8(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x58: /* ADDr */ - __asm__("evaluxn_58_ADDr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b + a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x59: /* SUBr */ - __asm__("evaluxn_59_SUBr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b - a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x5a: /* MULr */ - __asm__("evaluxn_5a_MULr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b * a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x5b: /* DIVr */ - __asm__("evaluxn_5b_DIVr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - if(a == 0) { - u->rst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->rst.dat[u->rst.ptr - 2] = b / a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x5c: /* ANDr */ - __asm__("evaluxn_5c_ANDr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x5d: /* ORAr */ - __asm__("evaluxn_5d_ORAr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x5e: /* EORr */ - __asm__("evaluxn_5e_EORr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x5f: /* SFTr */ - __asm__("evaluxn_5f_SFTr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr - 2] = b >> (a & 0x07) << ((a & 0x70) >> 4); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x60: /* LIT2r */ - case 0xe0: /* LIT2kr */ - __asm__("evaluxn_60_LIT2r:"); - { - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); - u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0x61: /* INC2r */ - __asm__("evaluxn_61_INC2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u->rst.dat[u->rst.ptr - 2] = (a + 1) >> 8; - u->rst.dat[u->rst.ptr - 1] = (a + 1) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x62: /* POP2r */ - __asm__("evaluxn_62_POP2r:"); - { - (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x66: /* DUP2r */ - __asm__("evaluxn_63_DUP2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b; - u->rst.dat[u->rst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0x63: /* NIP2r */ - __asm__("evaluxn_64_NIP2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = a >> 8; - u->rst.dat[u->rst.ptr - 3] = a & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x64: /* SWP2r */ - __asm__("evaluxn_65_SWP2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr - 4] = b; - u->rst.dat[u->rst.ptr - 3] = a; - u->rst.dat[u->rst.ptr - 2] = d; - u->rst.dat[u->rst.ptr - 1] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x67: /* OVR2r */ - __asm__("evaluxn_66_OVR2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr] = d; - u->rst.dat[u->rst.ptr + 1] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0x65: /* ROT2r */ - __asm__("evaluxn_67_ROT2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4], e = u->rst.dat[u->rst.ptr - 5], f = u->rst.dat[u->rst.ptr - 6]; - u->rst.dat[u->rst.ptr - 6] = d; - u->rst.dat[u->rst.ptr - 5] = c; - u->rst.dat[u->rst.ptr - 4] = b; - u->rst.dat[u->rst.ptr - 3] = a; - u->rst.dat[u->rst.ptr - 2] = f; - u->rst.dat[u->rst.ptr - 1] = e; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 6, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x68: /* EQU2r */ - __asm__("evaluxn_68_EQU2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x69: /* NEQ2r */ - __asm__("evaluxn_69_NEQ2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x6a: /* GTH2r */ - __asm__("evaluxn_6a_GTH2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x6b: /* LTH2r */ - __asm__("evaluxn_6b_LTH2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x6c: /* JMP2r */ - __asm__("evaluxn_6c_JMP2r:"); - { - u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x6d: /* JCN2r */ - __asm__("evaluxn_6d_JCN2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - if(u->rst.dat[u->rst.ptr - 3]) u->ram.ptr = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x6e: /* JSR2r */ - __asm__("evaluxn_6e_JSR2r:"); - { - u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; - u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x6f: /* STH2r */ - __asm__("evaluxn_6f_STH2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b; - u->wst.dat[u->wst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x70: /* LDZ2r */ - __asm__("evaluxn_70_LDZ2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, a); - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x71: /* STZ2r */ - __asm__("evaluxn_71_STZ2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x72: /* LDR2r */ - __asm__("evaluxn_72_LDR2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x73: /* STR2r */ - __asm__("evaluxn_73_STR2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - mempoke16(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x74: /* LDA2r */ - __asm__("evaluxn_74_LDA2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u->rst.dat[u->rst.ptr - 2] = mempeek8(u->ram.dat, a); - u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0x75: /* STA2r */ - __asm__("evaluxn_75_STA2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u16 b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 4; - } - break; - case 0x76: /* DEI2r */ - __asm__("evaluxn_76_DEI2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); - u->rst.dat[u->rst.ptr] = devpeek8(&u->dev[a >> 4], a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x77: /* DEO2r */ - __asm__("evaluxn_77_DEO2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - devpoke16(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 3; - } - break; - case 0x78: /* ADD2r */ - __asm__("evaluxn_78_ADD2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = (b + a) >> 8; - u->rst.dat[u->rst.ptr - 3] = (b + a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x79: /* SUB2r */ - __asm__("evaluxn_79_SUB2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = (b - a) >> 8; - u->rst.dat[u->rst.ptr - 3] = (b - a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x7a: /* MUL2r */ - __asm__("evaluxn_7a_MUL2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr - 4] = (b * a) >> 8; - u->rst.dat[u->rst.ptr - 3] = (b * a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x7b: /* DIV2r */ - __asm__("evaluxn_7b_DIV2r:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - if(a == 0) { - u->rst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->rst.dat[u->rst.ptr - 4] = (b / a) >> 8; - u->rst.dat[u->rst.ptr - 3] = (b / a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x7c: /* AND2r */ - __asm__("evaluxn_7c_AND2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr - 4] = d & b; - u->rst.dat[u->rst.ptr - 3] = c & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x7d: /* ORA2r */ - __asm__("evaluxn_7d_ORA2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr - 4] = d | b; - u->rst.dat[u->rst.ptr - 3] = c | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x7e: /* EOR2r */ - __asm__("evaluxn_7e_EOR2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr - 4] = d ^ b; - u->rst.dat[u->rst.ptr - 3] = c ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 2; - } - break; - case 0x7f: /* SFT2r */ - __asm__("evaluxn_7f_SFT2r:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - u->rst.dat[u->rst.ptr - 3] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8; - u->rst.dat[u->rst.ptr - 2] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - u->rst.ptr -= 1; - } - break; - case 0x81: /* INCk */ - __asm__("evaluxn_81_INCk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = a + 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x82: /* POPk */ - __asm__("evaluxn_82_POPk:"); - { - u->wst.dat[u->wst.ptr - 1]; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x86: /* DUPk */ - __asm__("evaluxn_83_DUPk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = a; - u->wst.dat[u->wst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x83: /* NIPk */ - __asm__("evaluxn_84_NIPk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x84: /* SWPk */ - __asm__("evaluxn_85_SWPk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = a; - u->wst.dat[u->wst.ptr + 1] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0x87: /* OVRk */ - __asm__("evaluxn_86_OVRk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b; - u->wst.dat[u->wst.ptr + 1] = a; - u->wst.dat[u->wst.ptr + 2] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 252, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 3; - } - break; - case 0x85: /* ROTk */ - __asm__("evaluxn_87_ROTk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3]; - u->wst.dat[u->wst.ptr] = b; - u->wst.dat[u->wst.ptr + 1] = a; - u->wst.dat[u->wst.ptr + 2] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 252, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 3; - } - break; - case 0x88: /* EQUk */ - __asm__("evaluxn_88_EQUk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x89: /* NEQk */ - __asm__("evaluxn_89_NEQk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x8a: /* GTHk */ - __asm__("evaluxn_8a_GTHk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x8b: /* LTHk */ - __asm__("evaluxn_8b_LTHk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x8c: /* JMPk */ - __asm__("evaluxn_8c_JMPk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x8d: /* JCNk */ - __asm__("evaluxn_8d_JCNk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - if(u->wst.dat[u->wst.ptr - 2]) u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x8e: /* JSRk */ - __asm__("evaluxn_8e_JSRk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; - u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0x8f: /* STHk */ - __asm__("evaluxn_8f_STHk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->rst.dat[u->rst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0x90: /* LDZk */ - __asm__("evaluxn_90_LDZk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x91: /* STZk */ - __asm__("evaluxn_91_STZk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u8 b = u->wst.dat[u->wst.ptr - 2]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x92: /* LDRk */ - __asm__("evaluxn_92_LDRk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x93: /* STRk */ - __asm__("evaluxn_93_STRk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u8 b = u->wst.dat[u->wst.ptr - 2]; - mempoke8(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x94: /* LDAk */ - __asm__("evaluxn_94_LDAk:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x95: /* STAk */ - __asm__("evaluxn_95_STAk:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u8 b = u->wst.dat[u->wst.ptr - 3]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x96: /* DEIk */ - __asm__("evaluxn_96_DEIk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = devpeek8(&u->dev[a >> 4], a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x97: /* DEOk */ - __asm__("evaluxn_97_DEOk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - devpoke8(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0x98: /* ADDk */ - __asm__("evaluxn_98_ADDk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b + a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x99: /* SUBk */ - __asm__("evaluxn_99_SUBk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b - a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x9a: /* MULk */ - __asm__("evaluxn_9a_MULk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b * a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x9b: /* DIVk */ - __asm__("evaluxn_9b_DIVk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - if(a == 0) { - u->wst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->wst.dat[u->wst.ptr] = b / a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x9c: /* ANDk */ - __asm__("evaluxn_9c_ANDk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x9d: /* ORAk */ - __asm__("evaluxn_9d_ORAk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x9e: /* EORk */ - __asm__("evaluxn_9e_EORk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0x9f: /* SFTk */ - __asm__("evaluxn_9f_SFTk:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b >> (a & 0x07) << ((a & 0x70) >> 4); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0xa1: /* INC2k */ - __asm__("evaluxn_a1_INC2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u->wst.dat[u->wst.ptr] = (a + 1) >> 8; - u->wst.dat[u->wst.ptr + 1] = (a + 1) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xa2: /* POP2k */ - __asm__("evaluxn_a2_POP2k:"); - { - (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0xa6: /* DUP2k */ - __asm__("evaluxn_a3_DUP2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b; - u->wst.dat[u->wst.ptr + 1] = a; - u->wst.dat[u->wst.ptr + 2] = b; - u->wst.dat[u->wst.ptr + 3] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 251, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 4; - } - break; - case 0xa3: /* NIP2k */ - __asm__("evaluxn_a4_NIP2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = a >> 8; - u->wst.dat[u->wst.ptr + 1] = a & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xa4: /* SWP2k */ - __asm__("evaluxn_a5_SWP2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr] = b; - u->wst.dat[u->wst.ptr + 1] = a; - u->wst.dat[u->wst.ptr + 2] = d; - u->wst.dat[u->wst.ptr + 3] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 251, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 4; - } - break; - case 0xa7: /* OVR2k */ - __asm__("evaluxn_a6_OVR2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr] = d; - u->wst.dat[u->wst.ptr + 1] = c; - u->wst.dat[u->wst.ptr + 2] = b; - u->wst.dat[u->wst.ptr + 3] = a; - u->wst.dat[u->wst.ptr + 4] = d; - u->wst.dat[u->wst.ptr + 5] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 249, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 6; - } - break; - case 0xa5: /* ROT2k */ - __asm__("evaluxn_a7_ROT2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4], e = u->wst.dat[u->wst.ptr - 5], f = u->wst.dat[u->wst.ptr - 6]; - u->wst.dat[u->wst.ptr] = d; - u->wst.dat[u->wst.ptr + 1] = c; - u->wst.dat[u->wst.ptr + 2] = b; - u->wst.dat[u->wst.ptr + 3] = a; - u->wst.dat[u->wst.ptr + 4] = f; - u->wst.dat[u->wst.ptr + 5] = e; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 6, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 249, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 6; - } - break; - case 0xa8: /* EQU2k */ - __asm__("evaluxn_a8_EQU2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0xa9: /* NEQ2k */ - __asm__("evaluxn_a9_NEQ2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0xaa: /* GTH2k */ - __asm__("evaluxn_aa_GTH2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0xab: /* LTH2k */ - __asm__("evaluxn_ab_LTH2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0xac: /* JMP2k */ - __asm__("evaluxn_ac_JMP2k:"); - { - u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0xad: /* JCN2k */ - __asm__("evaluxn_ad_JCN2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - if(u->wst.dat[u->wst.ptr - 3]) u->ram.ptr = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0xae: /* JSR2k */ - __asm__("evaluxn_ae_JSR2k:"); - { - u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; - u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xaf: /* STH2k */ - __asm__("evaluxn_af_STH2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b; - u->rst.dat[u->rst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xb0: /* LDZ2k */ - __asm__("evaluxn_b0_LDZ2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); - u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xb1: /* STZ2k */ - __asm__("evaluxn_b1_STZ2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0xb2: /* LDR2k */ - __asm__("evaluxn_b2_LDR2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); - u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xb3: /* STR2k */ - __asm__("evaluxn_b3_STR2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - mempoke16(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0xb4: /* LDA2k */ - __asm__("evaluxn_b4_LDA2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); - u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 2, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xb5: /* STA2k */ - __asm__("evaluxn_b5_STA2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); - u16 b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0xb6: /* DEI2k */ - __asm__("evaluxn_b6_DEI2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u->wst.dat[u->wst.ptr] = devpeek8(&u->dev[a >> 4], a); - u->wst.dat[u->wst.ptr + 1] = devpeek8(&u->dev[a >> 4], a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 1, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xb7: /* DEO2k */ - __asm__("evaluxn_b7_DEO2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - devpoke16(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } -#endif - } - break; - case 0xb8: /* ADD2k */ - __asm__("evaluxn_b8_ADD2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = (b + a) >> 8; - u->wst.dat[u->wst.ptr + 1] = (b + a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xb9: /* SUB2k */ - __asm__("evaluxn_b9_SUB2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = (b - a) >> 8; - u->wst.dat[u->wst.ptr + 1] = (b - a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xba: /* MUL2k */ - __asm__("evaluxn_ba_MUL2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - u->wst.dat[u->wst.ptr] = (b * a) >> 8; - u->wst.dat[u->wst.ptr + 1] = (b * a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xbb: /* DIV2k */ - __asm__("evaluxn_bb_DIV2k:"); - { - u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); - if(a == 0) { - u->wst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->wst.dat[u->wst.ptr] = (b / a) >> 8; - u->wst.dat[u->wst.ptr + 1] = (b / a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xbc: /* AND2k */ - __asm__("evaluxn_bc_AND2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr] = d & b; - u->wst.dat[u->wst.ptr + 1] = c & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xbd: /* ORA2k */ - __asm__("evaluxn_bd_ORA2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr] = d | b; - u->wst.dat[u->wst.ptr + 1] = c | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xbe: /* EOR2k */ - __asm__("evaluxn_be_EOR2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; - u->wst.dat[u->wst.ptr] = d ^ b; - u->wst.dat[u->wst.ptr + 1] = c ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 4, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xbf: /* SFT2k */ - __asm__("evaluxn_bf_SFT2k:"); - { - u8 a = u->wst.dat[u->wst.ptr - 1]; - u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); - u->wst.dat[u->wst.ptr] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8; - u->wst.dat[u->wst.ptr + 1] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->wst.ptr < 3, 0)) { - u->wst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xc1: /* INCkr */ - __asm__("evaluxn_c1_INCkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = a + 1; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xc2: /* POPkr */ - __asm__("evaluxn_c2_POPkr:"); - { - u->rst.dat[u->rst.ptr - 1]; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xc6: /* DUPkr */ - __asm__("evaluxn_c3_DUPkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = a; - u->rst.dat[u->rst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xc3: /* NIPkr */ - __asm__("evaluxn_c4_NIPkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xc4: /* SWPkr */ - __asm__("evaluxn_c5_SWPkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = a; - u->rst.dat[u->rst.ptr + 1] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xc7: /* OVRkr */ - __asm__("evaluxn_c6_OVRkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b; - u->rst.dat[u->rst.ptr + 1] = a; - u->rst.dat[u->rst.ptr + 2] = b; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 252, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 3; - } - break; - case 0xc5: /* ROTkr */ - __asm__("evaluxn_c7_ROTkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3]; - u->rst.dat[u->rst.ptr] = b; - u->rst.dat[u->rst.ptr + 1] = a; - u->rst.dat[u->rst.ptr + 2] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 252, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 3; - } - break; - case 0xc8: /* EQUkr */ - __asm__("evaluxn_c8_EQUkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xc9: /* NEQkr */ - __asm__("evaluxn_c9_NEQkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xca: /* GTHkr */ - __asm__("evaluxn_ca_GTHkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xcb: /* LTHkr */ - __asm__("evaluxn_cb_LTHkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xcc: /* JMPkr */ - __asm__("evaluxn_cc_JMPkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xcd: /* JCNkr */ - __asm__("evaluxn_cd_JCNkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - if(u->rst.dat[u->rst.ptr - 2]) u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xce: /* JSRkr */ - __asm__("evaluxn_ce_JSRkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; - u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr += (s8)a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xcf: /* STHkr */ - __asm__("evaluxn_cf_STHkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->wst.dat[u->wst.ptr] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 254, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 1; - } - break; - case 0xd0: /* LDZkr */ - __asm__("evaluxn_d0_LDZkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xd1: /* STZkr */ - __asm__("evaluxn_d1_STZkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u8 b = u->rst.dat[u->rst.ptr - 2]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xd2: /* LDRkr */ - __asm__("evaluxn_d2_LDRkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xd3: /* STRkr */ - __asm__("evaluxn_d3_STRkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u8 b = u->rst.dat[u->rst.ptr - 2]; - mempoke8(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xd4: /* LDAkr */ - __asm__("evaluxn_d4_LDAkr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xd5: /* STAkr */ - __asm__("evaluxn_d5_STAkr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u8 b = u->rst.dat[u->rst.ptr - 3]; - mempoke8(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xd6: /* DEIkr */ - __asm__("evaluxn_d6_DEIkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = devpeek8(&u->dev[a >> 4], a); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xd7: /* DEOkr */ - __asm__("evaluxn_d7_DEOkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - devpoke8(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xd8: /* ADDkr */ - __asm__("evaluxn_d8_ADDkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b + a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xd9: /* SUBkr */ - __asm__("evaluxn_d9_SUBkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b - a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xda: /* MULkr */ - __asm__("evaluxn_da_MULkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b * a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xdb: /* DIVkr */ - __asm__("evaluxn_db_DIVkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - if(a == 0) { - u->rst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->rst.dat[u->rst.ptr] = b / a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xdc: /* ANDkr */ - __asm__("evaluxn_dc_ANDkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xdd: /* ORAkr */ - __asm__("evaluxn_dd_ORAkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xde: /* EORkr */ - __asm__("evaluxn_de_EORkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xdf: /* SFTkr */ - __asm__("evaluxn_df_SFTkr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b >> (a & 0x07) << ((a & 0x70) >> 4); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xe1: /* INC2kr */ - __asm__("evaluxn_e1_INC2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u->rst.dat[u->rst.ptr] = (a + 1) >> 8; - u->rst.dat[u->rst.ptr + 1] = (a + 1) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xe2: /* POP2kr */ - __asm__("evaluxn_e2_POP2kr:"); - { - (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xe6: /* DUP2kr */ - __asm__("evaluxn_e3_DUP2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->rst.dat[u->rst.ptr] = b; - u->rst.dat[u->rst.ptr + 1] = a; - u->rst.dat[u->rst.ptr + 2] = b; - u->rst.dat[u->rst.ptr + 3] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 251, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 4; - } - break; - case 0xe3: /* NIP2kr */ - __asm__("evaluxn_e4_NIP2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = a >> 8; - u->rst.dat[u->rst.ptr + 1] = a & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xe4: /* SWP2kr */ - __asm__("evaluxn_e5_SWP2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr] = b; - u->rst.dat[u->rst.ptr + 1] = a; - u->rst.dat[u->rst.ptr + 2] = d; - u->rst.dat[u->rst.ptr + 3] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 251, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 4; - } - break; - case 0xe7: /* OVR2kr */ - __asm__("evaluxn_e6_OVR2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr] = d; - u->rst.dat[u->rst.ptr + 1] = c; - u->rst.dat[u->rst.ptr + 2] = b; - u->rst.dat[u->rst.ptr + 3] = a; - u->rst.dat[u->rst.ptr + 4] = d; - u->rst.dat[u->rst.ptr + 5] = c; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 249, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 6; - } - break; - case 0xe5: /* ROT2kr */ - __asm__("evaluxn_e7_ROT2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4], e = u->rst.dat[u->rst.ptr - 5], f = u->rst.dat[u->rst.ptr - 6]; - u->rst.dat[u->rst.ptr] = d; - u->rst.dat[u->rst.ptr + 1] = c; - u->rst.dat[u->rst.ptr + 2] = b; - u->rst.dat[u->rst.ptr + 3] = a; - u->rst.dat[u->rst.ptr + 4] = f; - u->rst.dat[u->rst.ptr + 5] = e; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 6, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 249, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 6; - } - break; - case 0xe8: /* EQU2kr */ - __asm__("evaluxn_e8_EQU2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = b == a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xe9: /* NEQ2kr */ - __asm__("evaluxn_e9_NEQ2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = b != a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xea: /* GTH2kr */ - __asm__("evaluxn_ea_GTH2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = b > a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xeb: /* LTH2kr */ - __asm__("evaluxn_eb_LTH2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = b < a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 254, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 1; - } - break; - case 0xec: /* JMP2kr */ - __asm__("evaluxn_ec_JMP2kr:"); - { - u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xed: /* JCN2kr */ - __asm__("evaluxn_ed_JCN2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - if(u->rst.dat[u->rst.ptr - 3]) u->ram.ptr = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xee: /* JSR2kr */ - __asm__("evaluxn_ee_JSR2kr:"); - { - u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; - u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff; - u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xef: /* STH2kr */ - __asm__("evaluxn_ef_STH2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; - u->wst.dat[u->wst.ptr] = b; - u->wst.dat[u->wst.ptr + 1] = a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->wst.ptr > 253, 0)) { - u->wst.error = 2; - goto error; - } -#endif - u->wst.ptr += 2; - } - break; - case 0xf0: /* LDZ2kr */ - __asm__("evaluxn_f0_LDZ2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); - u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xf1: /* STZ2kr */ - __asm__("evaluxn_f1_STZ2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xf2: /* LDR2kr */ - __asm__("evaluxn_f2_LDR2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); - u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xf3: /* STR2kr */ - __asm__("evaluxn_f3_STR2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - mempoke16(u->ram.dat, u->ram.ptr + (s8)a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xf4: /* LDA2kr */ - __asm__("evaluxn_f4_LDA2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); - u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 2, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xf5: /* STA2kr */ - __asm__("evaluxn_f5_STA2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); - u16 b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - mempoke16(u->ram.dat, a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xf6: /* DEI2kr */ - __asm__("evaluxn_f6_DEI2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u->rst.dat[u->rst.ptr] = devpeek8(&u->dev[a >> 4], a); - u->rst.dat[u->rst.ptr + 1] = devpeek8(&u->dev[a >> 4], a + 1); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 1, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xf7: /* DEO2kr */ - __asm__("evaluxn_f7_DEO2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - devpoke16(&u->dev[a >> 4], a, b); -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } -#endif - } - break; - case 0xf8: /* ADD2kr */ - __asm__("evaluxn_f8_ADD2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = (b + a) >> 8; - u->rst.dat[u->rst.ptr + 1] = (b + a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xf9: /* SUB2kr */ - __asm__("evaluxn_f9_SUB2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = (b - a) >> 8; - u->rst.dat[u->rst.ptr + 1] = (b - a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xfa: /* MUL2kr */ - __asm__("evaluxn_fa_MUL2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - u->rst.dat[u->rst.ptr] = (b * a) >> 8; - u->rst.dat[u->rst.ptr + 1] = (b * a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xfb: /* DIV2kr */ - __asm__("evaluxn_fb_DIV2kr:"); - { - u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); - if(a == 0) { - u->rst.error = 3; -#ifndef NO_STACK_CHECKS - goto error; -#endif - a = 1; - } - u->rst.dat[u->rst.ptr] = (b / a) >> 8; - u->rst.dat[u->rst.ptr + 1] = (b / a) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xfc: /* AND2kr */ - __asm__("evaluxn_fc_AND2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr] = d & b; - u->rst.dat[u->rst.ptr + 1] = c & a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xfd: /* ORA2kr */ - __asm__("evaluxn_fd_ORA2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr] = d | b; - u->rst.dat[u->rst.ptr + 1] = c | a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xfe: /* EOR2kr */ - __asm__("evaluxn_fe_EOR2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; - u->rst.dat[u->rst.ptr] = d ^ b; - u->rst.dat[u->rst.ptr + 1] = c ^ a; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 4, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; - case 0xff: /* SFT2kr */ - __asm__("evaluxn_ff_SFT2kr:"); - { - u8 a = u->rst.dat[u->rst.ptr - 1]; - u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); - u->rst.dat[u->rst.ptr] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8; - u->rst.dat[u->rst.ptr + 1] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff; -#ifndef NO_STACK_CHECKS - if(__builtin_expect(u->rst.ptr < 3, 0)) { - u->rst.error = 1; - goto error; - } - if(__builtin_expect(u->rst.ptr > 253, 0)) { - u->rst.error = 2; - goto error; - } -#endif - u->rst.ptr += 2; - } - break; -#pragma GCC diagnostic pop + u8 kptr, *sp; + u16 a, b, c, j, k, bs, instr, opcode; + Stack *src, *dst; + if(!pc || u->dev[0x0f]) return 0; + for(;;) { + instr = u->ram[pc++]; + /* Return Mode */ + if(instr & 0x40) { src = u->rst; dst = u->wst; } + else { src = u->wst; dst = u->rst; } + /* Keep Mode */ + if(instr & 0x80) { kptr = src->ptr; sp = &kptr; } + else sp = &src->ptr; + /* Short Mode */ + bs = instr & 0x20; + opcode = instr & 0x1f; + switch(opcode - (!opcode * (instr >> 5))) { + /* Literals/Calls */ + case -0x0: /* BRK */ return 1; + case -0x1: /* JCI */ POP8(b) if(!b) { pc += 2; break; } // fallthrough + case -0x2: /* JMI */ PEEK16(a, pc) pc += a + 2; break; + case -0x3: /* JSI */ PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc += a + 2; break; + case -0x4: /* LIT */ + case -0x6: /* LITr */ a = u->ram[pc++]; PUSH8(src, a) break; + case -0x5: /* LIT2 */ + case -0x7: /* LIT2r */ PEEK16(a, pc) PUSH16(src, a) pc += 2; break; + /* ALU */ + case 0x01: /* INC */ POP(a) PUSH(src, a + 1) break; + case 0x02: /* POP */ POP(a) break; + case 0x03: /* NIP */ POP(a) POP(b) PUSH(src, a) break; + case 0x04: /* SWP */ POP(a) POP(b) PUSH(src, a) PUSH(src, b) break; + case 0x05: /* ROT */ POP(a) POP(b) POP(c) PUSH(src, b) PUSH(src, a) PUSH(src, c) break; + case 0x06: /* DUP */ POP(a) PUSH(src, a) PUSH(src, a) break; + case 0x07: /* OVR */ POP(a) POP(b) PUSH(src, b) PUSH(src, a) PUSH(src, b) break; + case 0x08: /* EQU */ POP(a) POP(b) PUSH8(src, b == a) break; + case 0x09: /* NEQ */ POP(a) POP(b) PUSH8(src, b != a) break; + case 0x0a: /* GTH */ POP(a) POP(b) PUSH8(src, b > a) break; + case 0x0b: /* LTH */ POP(a) POP(b) PUSH8(src, b < a) break; + case 0x0c: /* JMP */ POP(a) JUMP(a) break; + case 0x0d: /* JCN */ POP(a) POP8(b) if(b) JUMP(a) break; + case 0x0e: /* JSR */ POP(a) PUSH16(dst, pc) JUMP(a) break; + case 0x0f: /* STH */ POP(a) PUSH(dst, a) break; + case 0x10: /* LDZ */ POP8(a) PEEK(b, a) PUSH(src, b) break; + case 0x11: /* STZ */ POP8(a) POP(b) POKE(a, b) break; + case 0x12: /* LDR */ POP8(a) b = pc + (s8)a; PEEK(c, b) PUSH(src, c) break; + case 0x13: /* STR */ POP8(a) POP(b) c = pc + (s8)a; POKE(c, b) break; + case 0x14: /* LDA */ POP16(a) PEEK(b, a) PUSH(src, b) break; + case 0x15: /* STA */ POP16(a) POP(b) POKE(a, b) break; + case 0x16: /* DEI */ POP8(a) DEVR(b, a) PUSH(src, b) break; + case 0x17: /* DEO */ POP8(a) POP(b) DEVW(a, b) break; + case 0x18: /* ADD */ POP(a) POP(b) PUSH(src, b + a) break; + case 0x19: /* SUB */ POP(a) POP(b) PUSH(src, b - a) break; + case 0x1a: /* MUL */ POP(a) POP(b) PUSH(src, (u32)b * a) break; + case 0x1b: /* DIV */ POP(a) POP(b) if(!a) HALT(3) PUSH(src, b / a) break; + case 0x1c: /* AND */ POP(a) POP(b) PUSH(src, b & a) break; + case 0x1d: /* ORA */ POP(a) POP(b) PUSH(src, b | a) break; + case 0x1e: /* EOR */ POP(a) POP(b) PUSH(src, b ^ a) break; + case 0x1f: /* SFT */ POP8(a) POP(b) PUSH(src, b >> (a & 0x0f) << ((a & 0xf0) >> 4)) break; } } - return 1; -#ifndef NO_STACK_CHECKS -error: - return 0; -#endif } -Device * -uxn_port(Uxn *u, u8 id, char *name, void (*talkfn)(Device *d, u8 b0, u8 w)) +int +uxn_boot(Uxn *u, u8 *ram, Dei *dei, Deo *deo) { - Device *d = &u->dev[id]; - d->addr = id * 0x10; - d->u = u; - d->mem = u->ram.dat; - d->talk = talkfn; - (void)name; - return d; + u32 i; + char *cptr = (char *)u; + for(i = 0; i < sizeof(*u); i++) + cptr[i] = 0x00; + u->wst = (Stack *)(ram + 0x10000); + u->rst = (Stack *)(ram + 0x10100); + u->dev = (u8 *)(ram + 0x10200); + u->ram = ram; + u->dei = dei; + u->deo = deo; + return 1; } diff --git a/src/uxn.h b/src/uxn.h index 5d68528..f9bee16 100644 --- a/src/uxn.h +++ b/src/uxn.h @@ -1,8 +1,5 @@ #ifndef UXNGBA_UXN_H #define UXNGBA_UXN_H - -#include - /* Copyright (c) 2021 Devine Lu Linvega @@ -15,43 +12,30 @@ WITH REGARD TO THIS SOFTWARE. */ #define PAGE_PROGRAM 0x0100 -#define DEVPEEK16(o, x) { (o) = (d->dat[(x)] << 8) + d->dat[(x) + 1]; } -#define DEVPOKE16(x, y) { d->dat[(x)] = (y) >> 8; d->dat[(x) + 1] = (y); } -typedef struct { - u8 ptr, kptr, error; - u8 dat[256]; -} Stack; +/* clang-format off */ -typedef struct { - u16 ptr; - u8 *dat; -} Memory; +#define GETVEC(d) ((d)[0] << 8 | (d)[1]) +#define POKDEV(x, y) { d[(x)] = (y) >> 8; d[(x) + 1] = (y); } +#define PEKDEV(o, x) { (o) = (d[(x)] << 8) + d[(x) + 1]; } -typedef struct Device { - struct Uxn *u; - u8 addr, dat[16], *mem; - u16 vector; - void (*talk)(struct Device *d, u8, u8); -} Device; +/* clang-format on */ + +typedef struct { + u8 dat[255], ptr; +} Stack; typedef struct Uxn { - Stack wst, rst, *src, *dst; - Memory ram; - Device dev[16]; + u8 *ram, *dev; + Stack *wst, *rst; + u8 (*dei)(struct Uxn *u, u8 addr); + void (*deo)(struct Uxn *u, u8 addr, u8 value); } Uxn; -struct Uxn; - -static inline void mempoke8(u8 *m, u16 a, u8 b) { m[a] = b; } -static inline u8 mempeek8(u8 *m, u16 a) { return m[a]; } -static inline void mempoke16(u8 *m, u16 a, u16 b) { mempoke8(m, a, b >> 8); mempoke8(m, a + 1, b); } -static inline u16 mempeek16(u8 *m, u16 a) { return (mempeek8(m, a) << 8) + mempeek8(m, a + 1); } -static inline void devpoke8(Device *d, u8 a, u8 b) { d->dat[a & 0xf] = b; d->talk(d, a & 0x0f, 1); } -static inline u8 devpeek8(Device *d, u8 a) { d->talk(d, a & 0x0f, 0); return d->dat[a & 0xf]; } -static inline void devpoke16(Device *d, u8 a, u16 b) { devpoke8(d, a, b >> 8); devpoke8(d, a + 1, b); } -static inline u16 devpeek16(Device *d, u16 a) { return (devpeek8(d, a) << 8) + devpeek8(d, a + 1); } +typedef u8 Dei(Uxn *u, u8 addr); +typedef void Deo(Uxn *u, u8 addr, u8 value); -int uxn_eval(Uxn *u, u16 vec); -Device *uxn_port(Uxn *u, u8 id, char *name, void (*talkfn)(Device *, u8, u8)); +int uxn_halt(Uxn *u, u8 instr, u8 err, u16 addr); +int uxn_boot(Uxn *u, u8 *ram, Dei *dei, Deo *deo); +int uxn_eval(Uxn *u, u16 pc); #endif // UXNGBA_UXN_H -- cgit v1.2.1