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