... | ... |
@@ -286,19 +286,3 @@ file_dei(Uint8 id, Uint8 *d, Uint8 port) |
286 | 286 |
} |
287 | 287 |
return d[port]; |
288 | 288 |
} |
289 |
- |
|
290 |
-/* Boot */ |
|
291 |
- |
|
292 |
-int |
|
293 |
-load_rom(Uxn *u, char *filename) |
|
294 |
-{ |
|
295 |
- int l, i = 0; |
|
296 |
- FILE *f = fopen(filename, "rb"); |
|
297 |
- if(!f) |
|
298 |
- return 0; |
|
299 |
- l = fread(&u->ram[PAGE_PROGRAM], 1, 0x10000 - PAGE_PROGRAM, f); |
|
300 |
- while(l && ++i < 15) |
|
301 |
- l = fread(u->ram + 0x10000 * i, 1, 0x10000, f); |
|
302 |
- fclose(f); |
|
303 |
- return 1; |
|
304 |
-} |
... | ... |
@@ -39,31 +39,11 @@ system_inspect(Uxn *u) |
39 | 39 |
system_print(u->rst, "rst"); |
40 | 40 |
} |
41 | 41 |
|
42 |
-int |
|
43 |
-uxn_halt(Uxn *u, Uint8 instr, Uint8 err, Uint16 addr) |
|
44 |
-{ |
|
45 |
- Uint8 *d = &u->dev[0x00]; |
|
46 |
- Uint16 handler = GETVEC(d); |
|
47 |
- if(handler) { |
|
48 |
- u->wst->ptr = 4; |
|
49 |
- u->wst->dat[0] = addr >> 0x8; |
|
50 |
- u->wst->dat[1] = addr & 0xff; |
|
51 |
- u->wst->dat[2] = instr; |
|
52 |
- u->wst->dat[3] = err; |
|
53 |
- return uxn_eval(u, handler); |
|
54 |
- } else { |
|
55 |
- system_inspect(u); |
|
56 |
- fprintf(stderr, "%s %s, by %02x at 0x%04x.\n", (instr & 0x40) ? "Return-stack" : "Working-stack", errors[err - 1], instr, addr); |
|
57 |
- } |
|
58 |
- return 0; |
|
59 |
-} |
|
60 |
- |
|
61 |
-/* MMU */ |
|
42 |
+/* RAM */ |
|
62 | 43 |
|
63 | 44 |
Uint8 * |
64 |
-mmu_init(Mmu *m, Uint16 pages) |
|
45 |
+system_init(Mmu *m, Uint16 pages) |
|
65 | 46 |
{ |
66 |
- m->length = pages; |
|
67 | 47 |
m->pages = (Uint8 *)calloc(0x10000 * pages, sizeof(Uint8)); |
68 | 48 |
return m->pages; |
69 | 49 |
} |
... | ... |
@@ -82,6 +62,20 @@ mmu_eval(Uint8 *ram, Uint16 addr) |
82 | 62 |
} |
83 | 63 |
} |
84 | 64 |
|
65 |
+int |
|
66 |
+system_load(Uxn *u, char *filename) |
|
67 |
+{ |
|
68 |
+ int l, i = 0; |
|
69 |
+ FILE *f = fopen(filename, "rb"); |
|
70 |
+ if(!f) |
|
71 |
+ return 0; |
|
72 |
+ l = fread(&u->ram[PAGE_PROGRAM], 1, 0x10000 - PAGE_PROGRAM, f); |
|
73 |
+ while(l && ++i < RAM_PAGES) |
|
74 |
+ l = fread(u->ram + 0x10000 * i, 1, 0x10000, f); |
|
75 |
+ fclose(f); |
|
76 |
+ return 1; |
|
77 |
+} |
|
78 |
+ |
|
85 | 79 |
/* IO */ |
86 | 80 |
|
87 | 81 |
void |
... | ... |
@@ -98,3 +92,25 @@ system_deo(Uxn *u, Uint8 *d, Uint8 port) |
98 | 92 |
break; |
99 | 93 |
} |
100 | 94 |
} |
95 |
+ |
|
96 |
+/* Error */ |
|
97 |
+ |
|
98 |
+int |
|
99 |
+uxn_halt(Uxn *u, Uint8 instr, Uint8 err, Uint16 addr) |
|
100 |
+{ |
|
101 |
+ Uint8 *d = &u->dev[0x00]; |
|
102 |
+ Uint16 handler = GETVEC(d); |
|
103 |
+ if(handler) { |
|
104 |
+ u->wst->ptr = 4; |
|
105 |
+ u->wst->dat[0] = addr >> 0x8; |
|
106 |
+ u->wst->dat[1] = addr & 0xff; |
|
107 |
+ u->wst->dat[2] = instr; |
|
108 |
+ u->wst->dat[3] = err; |
|
109 |
+ return uxn_eval(u, handler); |
|
110 |
+ } else { |
|
111 |
+ system_inspect(u); |
|
112 |
+ fprintf(stderr, "%s %s, by %02x at 0x%04x.\n", (instr & 0x40) ? "Return-stack" : "Working-stack", errors[err - 1], instr, addr); |
|
113 |
+ } |
|
114 |
+ return 0; |
|
115 |
+} |
|
116 |
+ |
... | ... |
@@ -9,11 +9,13 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
9 | 9 |
WITH REGARD TO THIS SOFTWARE. |
10 | 10 |
*/ |
11 | 11 |
|
12 |
-void system_inspect(Uxn *u); |
|
13 |
-void system_deo(Uxn *u, Uint8 *d, Uint8 port); |
|
12 |
+#define RAM_PAGES 0x10 |
|
14 | 13 |
|
15 | 14 |
typedef struct { |
16 |
- Uint8 length, *pages; |
|
15 |
+ Uint8 *pages; |
|
17 | 16 |
} Mmu; |
18 | 17 |
|
19 |
-Uint8 *mmu_init(Mmu *m, Uint16 pages); |
|
18 |
+Uint8 *system_init(Mmu *m, Uint16 pages); |
|
19 |
+int system_load(Uxn *u, char *filename); |
|
20 |
+void system_inspect(Uxn *u); |
|
21 |
+void system_deo(Uxn *u, Uint8 *d, Uint8 port); |
... | ... |
@@ -81,9 +81,9 @@ main(int argc, char **argv) |
81 | 81 |
Mmu mmu; |
82 | 82 |
if(argc < 2) |
83 | 83 |
return emu_error("Usage", "uxncli game.rom args"); |
84 |
- if(!uxn_boot(&u, mmu_init(&mmu, 16), emu_dei, emu_deo)) |
|
84 |
+ if(!uxn_boot(&u, system_init(&mmu, RAM_PAGES), emu_dei, emu_deo)) |
|
85 | 85 |
return emu_error("Boot", "Failed"); |
86 |
- if(!load_rom(&u, argv[1])) |
|
86 |
+ if(!system_load(&u, argv[1])) |
|
87 | 87 |
return emu_error("Load", "Failed"); |
88 | 88 |
if(!uxn_eval(&u, PAGE_PROGRAM)) |
89 | 89 |
return emu_error("Init", "Failed"); |
... | ... |
@@ -264,9 +264,9 @@ static int |
264 | 264 |
start(Uxn *u, char *rom) |
265 | 265 |
{ |
266 | 266 |
free(mmu.pages); |
267 |
- if(!uxn_boot(u, mmu_init(&mmu, 16), emu_dei, emu_deo)) |
|
267 |
+ if(!uxn_boot(u, system_init(&mmu, RAM_PAGES), emu_dei, emu_deo)) |
|
268 | 268 |
return error("Boot", "Failed to start uxn."); |
269 |
- if(!load_rom(u, rom)) |
|
269 |
+ if(!system_load(u, rom)) |
|
270 | 270 |
return error("Boot", "Failed to load rom."); |
271 | 271 |
exec_deadline = SDL_GetPerformanceCounter() + deadline_interval; |
272 | 272 |
if(!uxn_eval(u, PAGE_PROGRAM)) |