diff --git a/ref/makefile b/ref/makefile index 59d55c8..b1bbb2c 100644 --- a/ref/makefile +++ b/ref/makefile @@ -3,7 +3,7 @@ all: bin/uxn run: all - @ bin/uxn test.bin + @ bin/uxn test.bin "Text from arg" format: @ clang-format -i uxn.c diff --git a/ref/uxn.c b/ref/uxn.c index 242d1f9..94de1d5 100644 --- a/ref/uxn.c +++ b/ref/uxn.c @@ -5,20 +5,12 @@ #define PEEK2(d) (*(d) << 8 | (d)[1]) #define POKE2(d, v) { *(d) = (v) >> 8; (d)[1] = (v); } -#define CONSOLE_STD 0x1 -#define CONSOLE_ARG 0x2 -#define CONSOLE_EOA 0x3 -#define CONSOLE_END 0x4 -#define PAGE_PROGRAM 0x0100 -#define RAM_PAGES 0x10 /* clang-format on */ typedef unsigned char Uint8; typedef signed char Sint8; typedef unsigned short Uint16; -typedef signed short Sint16; -typedef unsigned int Uint32; typedef struct { Uint8 dat[0x100], ptr; @@ -32,36 +24,11 @@ typedef struct Uxn { int uxn_eval(Uxn *u, Uint16 pc); int -system_error(char *msg, const char *err) -{ - fprintf(stderr, "%s %s\n", msg, err); - fflush(stderr); - return 0; -} - -static void -system_zero(Uxn *u, int soft) -{ - int i; - for(i = PAGE_PROGRAM * soft; i < 0x10000; i++) - u->ram[i] = 0; - for(i = 0x0; i < 0x100; i++) - u->dev[i] = 0; - u->wst.ptr = u->rst.ptr = 0; -} - -char *boot_rom; - -static int system_load(Uxn *u, char *filename) { - int l, i = 0; FILE *f = fopen(filename, "rb"); - if(!f) - return 0; - l = fread(&u->ram[PAGE_PROGRAM], 0x10000 - PAGE_PROGRAM, 1, f); - while(l && ++i < RAM_PAGES) - l = fread(u->ram + 0x10000 * i, 0x10000, 1, f); + if(!f) return 0; + fread(&u->ram[0x0100], 0xff00, 1, f); fclose(f); return 1; } @@ -70,11 +37,9 @@ int system_init(Uxn *u, Uint8 *ram, char *rom) { u->ram = ram; - system_zero(u, 0); if(!system_load(u, rom)) if(!system_load(u, "boot.rom")) - return system_error("Init", "Failed to load rom."); - boot_rom = rom; + return 0; return 1; } @@ -92,8 +57,8 @@ console_listen(Uxn *u, int i, int argc, char **argv) { for(; i < argc; i++) { char *p = argv[i]; - while(*p) console_input(u, *p++, CONSOLE_ARG); - console_input(u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA); + while(*p) console_input(u, *p++, 0x2); + console_input(u, '\n', i == argc - 1 ? 0x4 : 0x3); } } @@ -128,6 +93,8 @@ emu_deo(Uxn *u, Uint8 addr, Uint8 value) } } +/* clang-format off */ + #define FLIP { s = ins & 0x40 ? &u->wst : &u->rst; } #define JUMP(x) { if(m2) pc = (x); else pc += (Sint8)(x); } #define POP1(o) { o = s->dat[--*sp]; } @@ -187,7 +154,7 @@ uxn_eval(Uxn *u, Uint16 pc) case 0x17: /* DEO */ POP1(a) POPx(b) DEVW(a, b) break; case 0x18: /* ADD */ POPx(a) POPx(b) PUSHx(b + a) break; case 0x19: /* SUB */ POPx(a) POPx(b) PUSHx(b - a) break; - case 0x1a: /* MUL */ POPx(a) POPx(b) PUSHx((Uint32)b * a) break; + case 0x1a: /* MUL */ POPx(a) POPx(b) PUSHx(b * a) break; case 0x1b: /* DIV */ POPx(a) POPx(b) PUSHx(a ? b / a : 0) break; case 0x1c: /* AND */ POPx(a) POPx(b) PUSHx(b & a) break; case 0x1d: /* ORA */ POPx(a) POPx(b) PUSHx(b | a) break; @@ -197,17 +164,21 @@ uxn_eval(Uxn *u, Uint16 pc) } } +/* clang-format on */ + int main(int argc, char **argv) { int i = 1; Uxn u = {0}; - if(i == argc) - return system_error("usage:", "uxncli [-v] file.rom [args..]"); - if(argv[i][0] == '-' && argv[i][1] == 'v') - return system_error("Uxncli - Varvara Emulator(CLI)", "4 Jan 2024."); - if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++])) - return system_error("Init", "Failed to initialize uxn."); + if(i == argc) { + fprintf(stdout, "usage: %s file.rom [args..]\n", argv[0]); + return 0; + } + if(!system_init(&u, (Uint8 *)calloc(0x10000, sizeof(Uint8)), argv[i++])) { + fprintf(stderr, "Failed to initialize %s\n", argv[1]); + return 0; + } /* eval */ u.dev[0x17] = argc - i; if(uxn_eval(&u, 0x0100)) { @@ -215,10 +186,10 @@ main(int argc, char **argv) while(!u.dev[0x0f]) { char c = fgetc(stdin); if(c == EOF) { - console_input(&u, 0x00, CONSOLE_END); + console_input(&u, 0x00, 0x4); break; } - console_input(&u, (Uint8)c, CONSOLE_STD); + console_input(&u, (Uint8)c, 0x1); } } free(u.ram);