| ... | ... |
@@ -16,6 +16,8 @@ WITH REGARD TO THIS SOFTWARE. |
| 16 | 16 |
*/ |
| 17 | 17 |
|
| 18 | 18 |
char *boot_rom; |
| 19 |
+Uint8 dei_masks[0x100], deo_masks[0x100]; |
|
| 20 |
+Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; |
|
| 19 | 21 |
|
| 20 | 22 |
static const char *errors[] = {
|
| 21 | 23 |
"underflow", |
| ... | ... |
@@ -64,12 +66,12 @@ system_inspect(Uxn *u) |
| 64 | 66 |
} |
| 65 | 67 |
|
| 66 | 68 |
void |
| 67 |
-system_connect(Uxn *u, Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo) |
|
| 69 |
+system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo) |
|
| 68 | 70 |
{
|
| 69 | 71 |
int i, d = (device << 0x4); |
| 70 | 72 |
for(i = 0; i < 0x10; i++) {
|
| 71 |
- u->dei_masks[d + i] = (dei >> i) & 0x1; |
|
| 72 |
- u->deo_masks[d + i] = (deo >> i) & 0x1; |
|
| 73 |
+ dei_masks[d + i] = (dei >> i) & 0x1; |
|
| 74 |
+ deo_masks[d + i] = (deo >> i) & 0x1; |
|
| 73 | 75 |
} |
| 74 | 76 |
dev_vers[device] = ver; |
| 75 | 77 |
dei_mask[device] = dei; |
| ... | ... |
@@ -77,7 +79,7 @@ system_connect(Uxn *u, Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo) |
| 77 | 79 |
} |
| 78 | 80 |
|
| 79 | 81 |
int |
| 80 |
-system_version(Uxn *u, char *name, char *date) |
|
| 82 |
+system_version(char *name, char *date) |
|
| 81 | 83 |
{
|
| 82 | 84 |
int i; |
| 83 | 85 |
printf("%s, %s.\n", name, date);
|
| ... | ... |
@@ -17,10 +17,10 @@ WITH REGARD TO THIS SOFTWARE. |
| 17 | 17 |
|
| 18 | 18 |
extern char *boot_rom; |
| 19 | 19 |
|
| 20 |
-void system_connect(Uxn *u, Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo); |
|
| 20 |
+void system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo); |
|
| 21 | 21 |
void system_reboot(Uxn *u, char *rom, int soft); |
| 22 | 22 |
void system_inspect(Uxn *u); |
| 23 |
-int system_version(Uxn *u, char *emulator, char *date); |
|
| 23 |
+int system_version(char *emulator, char *date); |
|
| 24 | 24 |
int system_error(char *msg, const char *err); |
| 25 | 25 |
int system_init(Uxn *u, Uint8 *ram, char *rom); |
| 26 | 26 |
|
| ... | ... |
@@ -11,10 +11,10 @@ WITH REGARD TO THIS SOFTWARE. |
| 11 | 11 |
|
| 12 | 12 |
/* clang-format off */ |
| 13 | 13 |
|
| 14 |
-#define POKE2(d, v) { *(d) = (v) >> 8; (d)[1] = (v); }
|
|
| 15 | 14 |
#define PEEK2(d) (*(d) << 8 | (d)[1]) |
| 16 |
-#define DEI(p) (u->dei_masks[p] ? emu_dei(u, (p)) : u->dev[(p)]) |
|
| 17 |
-#define DEO(p, v) { u->dev[p] = v; if(u->deo_masks[p]) emu_deo(u, p); }
|
|
| 15 |
+#define POKE2(d, v) { *(d) = (v) >> 8; (d)[1] = (v); }
|
|
| 16 |
+#define DEI(p) (dei_masks[p] ? emu_dei(u, (p)) : u->dev[(p)]) |
|
| 17 |
+#define DEO(p, v) { u->dev[p] = v; if(deo_masks[p]) emu_deo(u, p); }
|
|
| 18 | 18 |
|
| 19 | 19 |
/* clang-format on */ |
| 20 | 20 |
|
| ... | ... |
@@ -31,7 +31,7 @@ typedef struct {
|
| 31 | 31 |
} Stack; |
| 32 | 32 |
|
| 33 | 33 |
typedef struct Uxn {
|
| 34 |
- Uint8 *ram, dev[0x100], dei_masks[0x100], deo_masks[0x100]; |
|
| 34 |
+ Uint8 *ram, dev[0x100]; |
|
| 35 | 35 |
Stack wst, rst; |
| 36 | 36 |
} Uxn; |
| 37 | 37 |
|
| ... | ... |
@@ -40,6 +40,7 @@ typedef struct Uxn {
|
| 40 | 40 |
extern Uint8 emu_dei(Uxn *u, Uint8 addr); |
| 41 | 41 |
extern void emu_deo(Uxn *u, Uint8 addr); |
| 42 | 42 |
extern int emu_halt(Uxn *u, Uint8 instr, Uint8 err, Uint16 addr); |
| 43 |
+extern Uint8 dei_masks[0x100], deo_masks[0x100]; |
|
| 43 | 44 |
extern Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; |
| 44 | 45 |
|
| 45 | 46 |
/* built-ins */ |
| ... | ... |
@@ -18,8 +18,6 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 18 | 18 |
WITH REGARD TO THIS SOFTWARE. |
| 19 | 19 |
*/ |
| 20 | 20 |
|
| 21 |
-Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; |
|
| 22 |
- |
|
| 23 | 21 |
Uint8 |
| 24 | 22 |
emu_dei(Uxn *u, Uint8 addr) |
| 25 | 23 |
{
|
| ... | ... |
@@ -67,14 +65,14 @@ main(int argc, char **argv) |
| 67 | 65 |
if(i == argc) |
| 68 | 66 |
return system_error("usage", "uxncli [-v] file.rom [args..]");
|
| 69 | 67 |
/* Connect Varvara */ |
| 70 |
- system_connect(&u, 0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
| 71 |
- system_connect(&u, 0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
| 72 |
- system_connect(&u, 0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 73 |
- system_connect(&u, 0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 74 |
- system_connect(&u, 0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
| 68 |
+ system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
| 69 |
+ system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
| 70 |
+ system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 71 |
+ system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 72 |
+ system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
| 75 | 73 |
/* Read flags */ |
| 76 | 74 |
if(argv[i][0] == '-' && argv[i][1] == 'v') |
| 77 |
- return system_version(&u, "Uxncli - Console Varvara Emulator", "19 Aug 2023"); |
|
| 75 |
+ return system_version("Uxncli - Console Varvara Emulator", "19 Aug 2023");
|
|
| 78 | 76 |
if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++])) |
| 79 | 77 |
return system_error("Init", "Failed to initialize uxn.");
|
| 80 | 78 |
/* Game Loop */ |
| ... | ... |
@@ -59,8 +59,6 @@ static int window_created = 0; |
| 59 | 59 |
static Uint32 stdin_event, audio0_event, zoom = 1; |
| 60 | 60 |
static Uint64 exec_deadline, deadline_interval, ms_interval; |
| 61 | 61 |
|
| 62 |
-Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; |
|
| 63 |
- |
|
| 64 | 62 |
static int |
| 65 | 63 |
clamp(int v, int min, int max) |
| 66 | 64 |
{
|
| ... | ... |
@@ -485,6 +483,7 @@ emu_run(Uxn *u, char *rom) |
| 485 | 483 |
static int |
| 486 | 484 |
emu_end(Uxn *u) |
| 487 | 485 |
{
|
| 486 |
+ free(u->ram); |
|
| 488 | 487 |
#ifdef _WIN32 |
| 489 | 488 |
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" |
| 490 | 489 |
TerminateThread((HANDLE)SDL_GetThreadID(stdin_thread), 0); |
| ... | ... |
@@ -503,21 +502,21 @@ main(int argc, char **argv) |
| 503 | 502 |
if(i == argc) |
| 504 | 503 |
return system_error("usage", "uxnemu [-v][-2x][-3x] file.rom [args...]");
|
| 505 | 504 |
/* Connect Varvara */ |
| 506 |
- system_connect(&u, 0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
| 507 |
- system_connect(&u, 0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
| 508 |
- system_connect(&u, 0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK); |
|
| 509 |
- system_connect(&u, 0x3, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 510 |
- system_connect(&u, 0x4, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 511 |
- system_connect(&u, 0x5, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 512 |
- system_connect(&u, 0x6, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 513 |
- system_connect(&u, 0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK); |
|
| 514 |
- system_connect(&u, 0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK); |
|
| 515 |
- system_connect(&u, 0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 516 |
- system_connect(&u, 0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 517 |
- system_connect(&u, 0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
| 505 |
+ system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
| 506 |
+ system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
| 507 |
+ system_connect(0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK); |
|
| 508 |
+ system_connect(0x3, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 509 |
+ system_connect(0x4, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 510 |
+ system_connect(0x5, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 511 |
+ system_connect(0x6, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
| 512 |
+ system_connect(0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK); |
|
| 513 |
+ system_connect(0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK); |
|
| 514 |
+ system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 515 |
+ system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
| 516 |
+ system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
| 518 | 517 |
/* Read flags */ |
| 519 | 518 |
if(argv[i][0] == '-' && argv[i][1] == 'v') |
| 520 |
- return system_version(&u, "Uxnemu - Graphical Varvara Emulator", "19 Aug 2023"); |
|
| 519 |
+ return system_version("Uxnemu - Graphical Varvara Emulator", "19 Aug 2023");
|
|
| 521 | 520 |
if(strcmp(argv[i], "-2x") == 0 || strcmp(argv[i], "-3x") == 0) |
| 522 | 521 |
set_zoom(argv[i++][1] - '0', 0); |
| 523 | 522 |
if(!emu_init()) |