... | ... |
@@ -45,8 +45,8 @@ Uint8 |
45 | 45 |
system_dei(Device *d, Uint8 port) |
46 | 46 |
{ |
47 | 47 |
switch(port) { |
48 |
- case 0x2: return d->u->wst.ptr; |
|
49 |
- case 0x3: return d->u->rst.ptr; |
|
48 |
+ case 0x2: return d->u->wst->ptr; |
|
49 |
+ case 0x3: return d->u->rst->ptr; |
|
50 | 50 |
default: return d->dat[port]; |
51 | 51 |
} |
52 | 52 |
} |
... | ... |
@@ -56,8 +56,8 @@ system_deo(Device *d, Uint8 port) |
56 | 56 |
{ |
57 | 57 |
switch(port) { |
58 | 58 |
case 0x1: DEVPEEK16(d->vector, 0x0); break; |
59 |
- case 0x2: d->u->wst.ptr = d->dat[port]; break; |
|
60 |
- case 0x3: d->u->rst.ptr = d->dat[port]; break; |
|
59 |
+ case 0x2: d->u->wst->ptr = d->dat[port]; break; |
|
60 |
+ case 0x3: d->u->rst->ptr = d->dat[port]; break; |
|
61 | 61 |
default: system_deo_special(d, port); |
62 | 62 |
} |
63 | 63 |
} |
... | ... |
@@ -39,13 +39,13 @@ uxn_eval(Uxn *u, Uint16 pc) |
39 | 39 |
Stack *src, *dst; |
40 | 40 |
Device *dev; |
41 | 41 |
if(!pc || u->dev[0].dat[0xf]) return 0; |
42 |
- if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; |
|
42 |
+ if(u->wst->ptr > 0xf8) u->wst->ptr = 0xf8; |
|
43 | 43 |
while((instr = u->ram[pc++])) { |
44 | 44 |
/* Return Mode */ |
45 | 45 |
if(instr & 0x40) { |
46 |
- src = &u->rst; dst = &u->wst; |
|
46 |
+ src = u->rst; dst = u->wst; |
|
47 | 47 |
} else { |
48 |
- src = &u->wst; dst = &u->rst; |
|
48 |
+ src = u->wst; dst = u->rst; |
|
49 | 49 |
} |
50 | 50 |
/* Keep Mode */ |
51 | 51 |
if(instr & 0x80) { |
... | ... |
@@ -108,12 +108,14 @@ err: |
108 | 108 |
/* clang-format on */ |
109 | 109 |
|
110 | 110 |
int |
111 |
-uxn_boot(Uxn *u, Uint8 *memory) |
|
111 |
+uxn_boot(Uxn *u, Stack *wst, Stack *rst, Uint8 *memory) |
|
112 | 112 |
{ |
113 | 113 |
Uint32 i; |
114 | 114 |
char *cptr = (char *)u; |
115 | 115 |
for(i = 0; i < sizeof(*u); i++) |
116 | 116 |
cptr[i] = 0x00; |
117 |
+ u->wst = wst; |
|
118 |
+ u->rst = rst; |
|
117 | 119 |
u->ram = memory; |
118 | 120 |
return 1; |
119 | 121 |
} |
... | ... |
@@ -38,12 +38,12 @@ typedef struct Device { |
38 | 38 |
} Device; |
39 | 39 |
|
40 | 40 |
typedef struct Uxn { |
41 |
- Stack wst, rst; |
|
41 |
+ Stack *wst, *rst; |
|
42 | 42 |
Uint8 *ram; |
43 | 43 |
Device dev[16]; |
44 | 44 |
} Uxn; |
45 | 45 |
|
46 |
-int uxn_boot(Uxn *c, Uint8 *memory); |
|
46 |
+int uxn_boot(Uxn *u, Stack *wst, Stack *rst, Uint8 *memory); |
|
47 | 47 |
int uxn_eval(Uxn *u, Uint16 pc); |
48 | 48 |
int uxn_halt(Uxn *u, Uint8 error, Uint16 addr); |
49 | 49 |
Device *uxn_port(Uxn *u, Uint8 id, Uint8 (*deifn)(Device *, Uint8), void (*deofn)(Device *, Uint8)); |
... | ... |
@@ -50,8 +50,8 @@ void |
50 | 50 |
system_deo_special(Device *d, Uint8 port) |
51 | 51 |
{ |
52 | 52 |
if(port == 0xe) { |
53 |
- inspect(&d->u->wst, "Working-stack"); |
|
54 |
- inspect(&d->u->rst, "Return-stack"); |
|
53 |
+ inspect(d->u->wst, "Working-stack"); |
|
54 |
+ inspect(d->u->rst, "Return-stack"); |
|
55 | 55 |
} |
56 | 56 |
} |
57 | 57 |
|
... | ... |
@@ -133,7 +133,7 @@ load(Uxn *u, char *filepath) |
133 | 133 |
return 1; |
134 | 134 |
} |
135 | 135 |
|
136 |
-static Uint8 *memory; |
|
136 |
+static Uint8 *shadow, *memory; |
|
137 | 137 |
|
138 | 138 |
int |
139 | 139 |
main(int argc, char **argv) |
... | ... |
@@ -141,8 +141,9 @@ main(int argc, char **argv) |
141 | 141 |
Uxn u; |
142 | 142 |
int i, loaded = 0; |
143 | 143 |
|
144 |
+ shadow = (Uint8 *)calloc(0xffff, sizeof(Uint8)); |
|
144 | 145 |
memory = (Uint8 *)calloc(0xffff, sizeof(Uint8)); |
145 |
- if(!uxn_boot(&u, memory)) |
|
146 |
+ if(!uxn_boot(&u, (Stack *)(shadow + 0x200), (Stack *)(shadow + 0x400), memory)) |
|
146 | 147 |
return error("Boot", "Failed"); |
147 | 148 |
|
148 | 149 |
/* system */ devsystem = uxn_port(&u, 0x0, system_dei, system_deo); |
... | ... |
@@ -44,6 +44,7 @@ static SDL_Rect gRect; |
44 | 44 |
static Device *devsystem, *devscreen, *devmouse, *devctrl, *devaudio0, *devconsole; |
45 | 45 |
static Uint8 zoom = 1; |
46 | 46 |
static Uint32 stdin_event, audio0_event; |
47 |
+static Uxn hypervisor; |
|
47 | 48 |
|
48 | 49 |
static int |
49 | 50 |
clamp(int val, int min, int max) |
... | ... |
@@ -126,7 +127,7 @@ static void |
126 | 127 |
redraw(Uxn *u) |
127 | 128 |
{ |
128 | 129 |
if(devsystem->dat[0xe]) |
129 |
- screen_debug(&uxn_screen, u->wst.dat, u->wst.ptr, u->rst.ptr, u->ram); |
|
130 |
+ screen_debug(&uxn_screen, u->wst->dat, u->wst->ptr, u->rst->ptr, u->ram); |
|
130 | 131 |
screen_redraw(&uxn_screen, uxn_screen.pixels); |
131 | 132 |
if(SDL_UpdateTexture(gTexture, NULL, uxn_screen.pixels, uxn_screen.width * sizeof(Uint32)) != 0) |
132 | 133 |
error("SDL_UpdateTexture", SDL_GetError()); |
... | ... |
@@ -272,13 +273,17 @@ load(Uxn *u, char *rom) |
272 | 273 |
return 1; |
273 | 274 |
} |
274 | 275 |
|
275 |
-static Uint8 *memory; |
|
276 |
+static Uint8 *shadow, *memory; |
|
276 | 277 |
|
277 | 278 |
static int |
278 | 279 |
start(Uxn *u, char *rom) |
279 | 280 |
{ |
280 | 281 |
memory = (Uint8 *)calloc(0xffff, sizeof(Uint8)); |
281 |
- if(!uxn_boot(u, memory)) |
|
282 |
+ shadow = (Uint8 *)calloc(0xffff, sizeof(Uint8)); |
|
283 |
+ |
|
284 |
+ if(!uxn_boot(&hypervisor, (Stack *)(shadow + 0x600), (Stack *)(shadow + 0x800), shadow)) |
|
285 |
+ return error("Boot", "Failed to start uxn."); |
|
286 |
+ if(!uxn_boot(u, (Stack *)(shadow + 0x200), (Stack *)(shadow + 0x400), memory)) |
|
282 | 287 |
return error("Boot", "Failed to start uxn."); |
283 | 288 |
if(!load(u, rom)) |
284 | 289 |
return error("Boot", "Failed to load rom."); |