(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
run: all
@ bin/uxn test.bin
@ bin/uxn test.bin "Text from arg"
format:
@ clang-format -i uxn.c

View File

@ -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);