(ref) Removed uniques

This commit is contained in:
Devine Lu Linvega 2024-01-10 12:49:22 -08:00
parent 6deb08adcd
commit 6e92c7aaae
2 changed files with 21 additions and 50 deletions

View File

@ -3,7 +3,7 @@
all: bin/uxn all: bin/uxn
run: all run: all
@ bin/uxn test.bin @ bin/uxn test.bin "Text from arg"
format: format:
@ clang-format -i uxn.c @ clang-format -i uxn.c

View File

@ -5,20 +5,12 @@
#define PEEK2(d) (*(d) << 8 | (d)[1]) #define PEEK2(d) (*(d) << 8 | (d)[1])
#define POKE2(d, v) { *(d) = (v) >> 8; (d)[1] = (v); } #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 */ /* clang-format on */
typedef unsigned char Uint8; typedef unsigned char Uint8;
typedef signed char Sint8; typedef signed char Sint8;
typedef unsigned short Uint16; typedef unsigned short Uint16;
typedef signed short Sint16;
typedef unsigned int Uint32;
typedef struct { typedef struct {
Uint8 dat[0x100], ptr; Uint8 dat[0x100], ptr;
@ -32,36 +24,11 @@ typedef struct Uxn {
int uxn_eval(Uxn *u, Uint16 pc); int uxn_eval(Uxn *u, Uint16 pc);
int 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) system_load(Uxn *u, char *filename)
{ {
int l, i = 0;
FILE *f = fopen(filename, "rb"); FILE *f = fopen(filename, "rb");
if(!f) if(!f) return 0;
return 0; fread(&u->ram[0x0100], 0xff00, 1, f);
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);
fclose(f); fclose(f);
return 1; return 1;
} }
@ -70,11 +37,9 @@ int
system_init(Uxn *u, Uint8 *ram, char *rom) system_init(Uxn *u, Uint8 *ram, char *rom)
{ {
u->ram = ram; u->ram = ram;
system_zero(u, 0);
if(!system_load(u, rom)) if(!system_load(u, rom))
if(!system_load(u, "boot.rom")) if(!system_load(u, "boot.rom"))
return system_error("Init", "Failed to load rom."); return 0;
boot_rom = rom;
return 1; return 1;
} }
@ -92,8 +57,8 @@ console_listen(Uxn *u, int i, int argc, char **argv)
{ {
for(; i < argc; i++) { for(; i < argc; i++) {
char *p = argv[i]; char *p = argv[i];
while(*p) console_input(u, *p++, CONSOLE_ARG); while(*p) console_input(u, *p++, 0x2);
console_input(u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA); 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 FLIP { s = ins & 0x40 ? &u->wst : &u->rst; }
#define JUMP(x) { if(m2) pc = (x); else pc += (Sint8)(x); } #define JUMP(x) { if(m2) pc = (x); else pc += (Sint8)(x); }
#define POP1(o) { o = s->dat[--*sp]; } #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 0x17: /* DEO */ POP1(a) POPx(b) DEVW(a, b) break;
case 0x18: /* ADD */ POPx(a) POPx(b) PUSHx(b + a) break; case 0x18: /* ADD */ POPx(a) POPx(b) PUSHx(b + a) break;
case 0x19: /* SUB */ 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 0x1b: /* DIV */ POPx(a) POPx(b) PUSHx(a ? b / a : 0) break;
case 0x1c: /* AND */ POPx(a) POPx(b) PUSHx(b & a) break; case 0x1c: /* AND */ POPx(a) POPx(b) PUSHx(b & a) break;
case 0x1d: /* ORA */ 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 int
main(int argc, char **argv) main(int argc, char **argv)
{ {
int i = 1; int i = 1;
Uxn u = {0}; Uxn u = {0};
if(i == argc) if(i == argc) {
return system_error("usage:", "uxncli [-v] file.rom [args..]"); fprintf(stdout, "usage: %s file.rom [args..]\n", argv[0]);
if(argv[i][0] == '-' && argv[i][1] == 'v') return 0;
return system_error("Uxncli - Varvara Emulator(CLI)", "4 Jan 2024."); }
if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++])) if(!system_init(&u, (Uint8 *)calloc(0x10000, sizeof(Uint8)), argv[i++])) {
return system_error("Init", "Failed to initialize uxn."); fprintf(stderr, "Failed to initialize %s\n", argv[1]);
return 0;
}
/* eval */ /* eval */
u.dev[0x17] = argc - i; u.dev[0x17] = argc - i;
if(uxn_eval(&u, 0x0100)) { if(uxn_eval(&u, 0x0100)) {
@ -215,10 +186,10 @@ main(int argc, char **argv)
while(!u.dev[0x0f]) { while(!u.dev[0x0f]) {
char c = fgetc(stdin); char c = fgetc(stdin);
if(c == EOF) { if(c == EOF) {
console_input(&u, 0x00, CONSOLE_END); console_input(&u, 0x00, 0x4);
break; break;
} }
console_input(&u, (Uint8)c, CONSOLE_STD); console_input(&u, (Uint8)c, 0x1);
} }
} }
free(u.ram); free(u.ram);