(ref) Removed uniques
This commit is contained in:
parent
6deb08adcd
commit
6e92c7aaae
|
@ -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
|
||||
|
|
69
ref/uxn.c
69
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);
|
||||
|
|
Loading…
Reference in New Issue