Removed indirection in uxn_eval call

This commit is contained in:
Devine Lu Linvega 2024-06-29 11:35:34 -08:00
parent 6e094ca520
commit cfc8349d54
8 changed files with 33 additions and 32 deletions

View File

@ -87,7 +87,7 @@ console_input(char c, int type)
Uint8 *d = &uxn.dev[0x10]; Uint8 *d = &uxn.dev[0x10];
d[0x2] = c; d[0x2] = c;
d[0x7] = type; d[0x7] = type;
return uxn_eval(&uxn, PEEK2(d)); return uxn_eval(PEEK2(d));
} }
void void

View File

@ -17,7 +17,7 @@ controller_down(Uint8 *d, Uint8 mask)
{ {
if(mask) { if(mask) {
d[2] |= mask; d[2] |= mask;
uxn_eval(&uxn, PEEK2(d)); uxn_eval(PEEK2(d));
} }
} }
@ -26,7 +26,7 @@ controller_up(Uint8 *d, Uint8 mask)
{ {
if(mask) { if(mask) {
d[2] &= (~mask); d[2] &= (~mask);
uxn_eval(&uxn, PEEK2(d)); uxn_eval(PEEK2(d));
} }
} }
@ -35,7 +35,7 @@ controller_key(Uint8 *d, Uint8 key)
{ {
if(key) { if(key) {
d[3] = key; d[3] = key;
uxn_eval(&uxn, PEEK2(d)); uxn_eval(PEEK2(d));
d[3] = 0x00; d[3] = 0x00;
} }
} }

View File

@ -16,14 +16,14 @@ void
mouse_down(Uint8 *d, Uint8 mask) mouse_down(Uint8 *d, Uint8 mask)
{ {
d[6] |= mask; d[6] |= mask;
uxn_eval(&uxn, PEEK2(d)); uxn_eval(PEEK2(d));
} }
void void
mouse_up(Uint8 *d, Uint8 mask) mouse_up(Uint8 *d, Uint8 mask)
{ {
d[6] &= (~mask); d[6] &= (~mask);
uxn_eval(&uxn, PEEK2(d)); uxn_eval(PEEK2(d));
} }
void void
@ -31,7 +31,7 @@ mouse_pos(Uint8 *d, Uint16 x, Uint16 y)
{ {
*(d + 2) = x >> 8, *(d + 3) = x; *(d + 2) = x >> 8, *(d + 3) = x;
*(d + 4) = y >> 8, *(d + 5) = y; *(d + 4) = y >> 8, *(d + 5) = y;
uxn_eval(&uxn, PEEK2(d)); uxn_eval(PEEK2(d));
} }
void void
@ -39,7 +39,7 @@ mouse_scroll(Uint8 *d, Uint16 x, Uint16 y)
{ {
*(d + 0xa) = x >> 8, *(d + 0xb) = x; *(d + 0xa) = x >> 8, *(d + 0xb) = x;
*(d + 0xc) = -y >> 8, *(d + 0xd) = -y; *(d + 0xc) = -y >> 8, *(d + 0xd) = -y;
uxn_eval(&uxn, PEEK2(d)); uxn_eval(PEEK2(d));
*(d + 0xa) = 0, *(d + 0xb) = 0; *(d + 0xa) = 0, *(d + 0xb) = 0;
*(d + 0xc) = 0, *(d + 0xd) = 0; *(d + 0xc) = 0, *(d + 0xd) = 0;
} }

View File

@ -72,7 +72,7 @@ system_reboot(char *rom, int soft)
{ {
system_zero(soft); system_zero(soft);
if(system_load(boot_rom)) if(system_load(boot_rom))
if(uxn_eval(&uxn, PAGE_PROGRAM)) if(uxn_eval(PAGE_PROGRAM))
boot_rom = rom; boot_rom = rom;
} }

View File

@ -35,13 +35,14 @@ WITH REGARD TO THIS SOFTWARE.
#define SET(x, y) { SHIFT((ins & 0x80) ? x + y : y) } #define SET(x, y) { SHIFT((ins & 0x80) ? x + y : y) }
int int
uxn_eval(Uxn *u, Uint16 pc) uxn_eval(Uint16 pc)
{ {
Uxn *u = &uxn;
Uint16 t, n, l, r; Uint16 t, n, l, r;
Uint8 *ram = u->ram, *rr; Uint8 *rr;
if(!pc || u->dev[0x0f]) return 0; if(!pc || u->dev[0x0f]) return 0;
for(;;) { for(;;) {
Uint8 ins = ram[pc++]; Uint8 ins = uxn.ram[pc++];
Stack *s = ins & 0x40 ? &u->rst : &u->wst; Stack *s = ins & 0x40 ? &u->rst : &u->wst;
switch(ins & 0x3f) { switch(ins & 0x3f) {
/* IMM */ /* IMM */
@ -49,10 +50,10 @@ uxn_eval(Uxn *u, Uint16 pc)
switch(ins) { switch(ins) {
case 0x00: /* BRK */ return 1; case 0x00: /* BRK */ return 1;
case 0x20: /* JCI */ t=T; SHIFT(-1) if(!t) { pc += 2; break; } /* fall-through */ case 0x20: /* JCI */ t=T; SHIFT(-1) if(!t) { pc += 2; break; } /* fall-through */
case 0x40: /* JMI */ rr = ram + pc; pc += 2 + PEEK2(rr); break; case 0x40: /* JMI */ rr = uxn.ram + pc; pc += 2 + PEEK2(rr); break;
case 0x60: /* JSI */ SHIFT( 2) rr = ram + pc; pc += 2; T2_(pc); pc += PEEK2(rr); break; case 0x60: /* JSI */ SHIFT( 2) rr = uxn.ram + pc; pc += 2; T2_(pc); pc += PEEK2(rr); break;
case 0x80: /* LIT */ case 0xc0: SHIFT( 1) T = ram[pc++]; break; case 0x80: /* LIT */ case 0xc0: SHIFT( 1) T = uxn.ram[pc++]; break;
case 0xa0: /* LIT2 */ case 0xe0: SHIFT( 2) N = ram[pc++]; T = ram[pc++]; break; case 0xa0: /* LIT2 */ case 0xe0: SHIFT( 2) N = uxn.ram[pc++]; T = uxn.ram[pc++]; break;
} break; } break;
/* ALU */ /* ALU */
case 0x01: /* INC */ t=T; SET(1, 0) T = t + 1; break; case 0x01: /* INC */ t=T; SET(1, 0) T = t + 1; break;
@ -85,18 +86,18 @@ uxn_eval(Uxn *u, Uint16 pc)
case 0x2e: /* JSR2 */ t=T2; SET(2,-2) FLIP SHIFT(2) T2_(pc) pc = t; break; case 0x2e: /* JSR2 */ t=T2; SET(2,-2) FLIP SHIFT(2) T2_(pc) pc = t; break;
case 0x0f: /* STH */ t=T; SET(1,-1) FLIP SHIFT(1) T = t; break; case 0x0f: /* STH */ t=T; SET(1,-1) FLIP SHIFT(1) T = t; break;
case 0x2f: /* STH2 */ t=T2; SET(2,-2) FLIP SHIFT(2) T2_(t) break; case 0x2f: /* STH2 */ t=T2; SET(2,-2) FLIP SHIFT(2) T2_(t) break;
case 0x10: /* LDZ */ t=T; SET(1, 0) T = ram[t]; break; case 0x10: /* LDZ */ t=T; SET(1, 0) T = uxn.ram[t]; break;
case 0x30: /* LDZ2 */ t=T; SET(1, 1) N = ram[t++]; T = ram[(Uint8)t]; break; case 0x30: /* LDZ2 */ t=T; SET(1, 1) N = uxn.ram[t++]; T = uxn.ram[(Uint8)t]; break;
case 0x11: /* STZ */ t=T;n=N; SET(2,-2) ram[t] = n; break; case 0x11: /* STZ */ t=T;n=N; SET(2,-2) uxn.ram[t] = n; break;
case 0x31: /* STZ2 */ t=T;n=H2; SET(3,-3) ram[t++] = n >> 8; ram[(Uint8)t] = n; break; case 0x31: /* STZ2 */ t=T;n=H2; SET(3,-3) uxn.ram[t++] = n >> 8; uxn.ram[(Uint8)t] = n; break;
case 0x12: /* LDR */ t=T; SET(1, 0) r = pc + (Sint8)t; T = ram[r]; break; case 0x12: /* LDR */ t=T; SET(1, 0) r = pc + (Sint8)t; T = uxn.ram[r]; break;
case 0x32: /* LDR2 */ t=T; SET(1, 1) r = pc + (Sint8)t; N = ram[r++]; T = ram[r]; break; case 0x32: /* LDR2 */ t=T; SET(1, 1) r = pc + (Sint8)t; N = uxn.ram[r++]; T = uxn.ram[r]; break;
case 0x13: /* STR */ t=T;n=N; SET(2,-2) r = pc + (Sint8)t; ram[r] = n; break; case 0x13: /* STR */ t=T;n=N; SET(2,-2) r = pc + (Sint8)t; uxn.ram[r] = n; break;
case 0x33: /* STR2 */ t=T;n=H2; SET(3,-3) r = pc + (Sint8)t; ram[r++] = n >> 8; ram[r] = n; break; case 0x33: /* STR2 */ t=T;n=H2; SET(3,-3) r = pc + (Sint8)t; uxn.ram[r++] = n >> 8; uxn.ram[r] = n; break;
case 0x14: /* LDA */ t=T2; SET(2,-1) T = ram[t]; break; case 0x14: /* LDA */ t=T2; SET(2,-1) T = uxn.ram[t]; break;
case 0x34: /* LDA2 */ t=T2; SET(2, 0) N = ram[t++]; T = ram[t]; break; case 0x34: /* LDA2 */ t=T2; SET(2, 0) N = uxn.ram[t++]; T = uxn.ram[t]; break;
case 0x15: /* STA */ t=T2;n=L; SET(3,-3) ram[t] = n; break; case 0x15: /* STA */ t=T2;n=L; SET(3,-3) uxn.ram[t] = n; break;
case 0x35: /* STA2 */ t=T2;n=N2; SET(4,-4) ram[t++] = n >> 8; ram[t] = n; break; case 0x35: /* STA2 */ t=T2;n=N2; SET(4,-4) uxn.ram[t++] = n >> 8; uxn.ram[t] = n; break;
case 0x16: /* DEI */ t=T; SET(1, 0) T = emu_dei(t); break; case 0x16: /* DEI */ t=T; SET(1, 0) T = emu_dei(t); break;
case 0x36: /* DEI2 */ t=T; SET(1, 1) N = emu_dei(t++); T = emu_dei(t); break; case 0x36: /* DEI2 */ t=T; SET(1, 1) N = emu_dei(t++); T = emu_dei(t); break;
case 0x17: /* DEO */ t=T;n=N; SET(2,-2) emu_deo(t, n); break; case 0x17: /* DEO */ t=T;n=N; SET(2,-2) emu_deo(t, n); break;

View File

@ -41,4 +41,4 @@ extern Uxn uxn;
/* built-ins */ /* built-ins */
int uxn_eval(Uxn *u, Uint16 pc); int uxn_eval(Uint16 pc);

View File

@ -248,7 +248,7 @@ emu_run(void)
emu_event(); emu_event();
if(poll(&fds[1], 1, 0)) { if(poll(&fds[1], 1, 0)) {
read(fds[1].fd, expirations, 8); read(fds[1].fd, expirations, 8);
uxn_eval(&uxn, uxn.dev[0x20] << 8 | uxn.dev[0x21]); uxn_eval(uxn.dev[0x20] << 8 | uxn.dev[0x21]);
if(screen_changed()) { if(screen_changed()) {
int x = uxn_screen.x1 * uxn_screen.scale, y = uxn_screen.y1 * uxn_screen.scale; int x = uxn_screen.x1 * uxn_screen.scale, y = uxn_screen.y1 * uxn_screen.scale;
int w = uxn_screen.x2 * uxn_screen.scale - x, h = uxn_screen.y2 * uxn_screen.scale - y; int w = uxn_screen.x2 * uxn_screen.scale - x, h = uxn_screen.y2 * uxn_screen.scale - y;
@ -286,7 +286,7 @@ main(int argc, char **argv)
} }
/* Game Loop */ /* Game Loop */
uxn.dev[0x17] = argc - i; uxn.dev[0x17] = argc - i;
if(uxn_eval(&uxn, PAGE_PROGRAM)) { if(uxn_eval(PAGE_PROGRAM)) {
console_listen(i, argc, argv); console_listen(i, argc, argv);
emu_run(); emu_run();
} }

View File

@ -77,7 +77,7 @@ main(int argc, char **argv)
return system_error("Init", "Failed to initialize uxn."); return system_error("Init", "Failed to initialize uxn.");
/* Game Loop */ /* Game Loop */
uxn.dev[0x17] = argc - i; uxn.dev[0x17] = argc - i;
if(uxn_eval(&uxn, PAGE_PROGRAM) && PEEK2(uxn.dev + 0x10)) { if(uxn_eval(PAGE_PROGRAM) && PEEK2(uxn.dev + 0x10)) {
console_listen(i, argc, argv); console_listen(i, argc, argv);
emu_run(); emu_run();
} }