... | ... |
@@ -36,7 +36,7 @@ echo "Cleaning.." |
36 | 36 |
rm -f ./bin/uxnasm |
37 | 37 |
rm -f ./bin/uxnemu |
38 | 38 |
rm -f ./bin/uxncli |
39 |
-rm -f ./bin/hypervisor.rom |
|
39 |
+rm -f ./bin/supervisor.rom |
|
40 | 40 |
rm -f ./bin/boot.rom |
41 | 41 |
rm -f ./bin/asma.rom |
42 | 42 |
|
... | ... |
@@ -106,9 +106,10 @@ then |
106 | 106 |
cp bin/uxnemu bin/uxnasm bin/uxncli $HOME/bin/ |
107 | 107 |
fi |
108 | 108 |
|
109 |
-echo "Assembling(boot+hypervisor).." |
|
109 |
+echo "Assembling(supervisor).." |
|
110 |
+./bin/uxnasm projects/software/supervisor.tal bin/supervisor.rom |
|
111 |
+echo "Assembling(boot).." |
|
110 | 112 |
./bin/uxnasm projects/software/boot.tal bin/boot.rom |
111 |
-./bin/uxnasm projects/software/hypervisor.tal bin/hypervisor.rom |
|
112 | 113 |
echo "Assembling(asma).." |
113 | 114 |
./bin/uxnasm projects/software/asma.tal bin/asma.rom |
114 | 115 |
|
115 | 116 |
similarity index 96% |
116 | 117 |
rename from projects/software/hypervisor.tal |
117 | 118 |
rename to projects/software/supervisor.tal |
... | ... |
@@ -22,6 +22,9 @@ |
22 | 22 |
%2// { #01 SFT2 } |
23 | 23 |
%8** { #30 SFT2 } |
24 | 24 |
|
25 |
+%EADDR { #fd04 } |
|
26 |
+%ECODE { #fd06 } |
|
27 |
+ |
|
25 | 28 |
( devices ) |
26 | 29 |
|
27 | 30 |
|00 @System &vector $2 &wst $1 &rst $1 &eaddr $2 &ecode $1 &pad $1 &r $2 &g $2 &b $2 &debug $1 &halt $1 |
... | ... |
@@ -51,7 +54,7 @@ |
51 | 54 |
;draw-cross JSR2 |
52 | 55 |
;draw-stacks JSR2 |
53 | 56 |
|
54 |
- .System/eaddr DEI2 #0000 !! ;on-error JCN2 |
|
57 |
+ EADDR LDA2 #0000 !! ;on-error JCN2 |
|
55 | 58 |
|
56 | 59 |
BRK |
57 | 60 |
|
... | ... |
@@ -93,9 +96,9 @@ BRK |
93 | 96 |
|
94 | 97 |
;at-txt #4f ;draw-str JSR2 |
95 | 98 |
|
96 |
- .System/eaddr DEI2 #47 ;draw-short JSR2 |
|
99 |
+ EADDR LDA2 #47 ;draw-short JSR2 |
|
97 | 100 |
|
98 |
- #0000 .System/eaddr DEO2 |
|
101 |
+ #0000 EADDR STA2 |
|
99 | 102 |
|
100 | 103 |
BRK |
101 | 104 |
|
... | ... |
@@ -14,7 +14,7 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
14 | 14 |
WITH REGARD TO THIS SOFTWARE. |
15 | 15 |
*/ |
16 | 16 |
|
17 |
-Uxn hypervisor; |
|
17 |
+Uxn supervisor; |
|
18 | 18 |
|
19 | 19 |
static const char *errors[] = { |
20 | 20 |
"Working-stack underflow", |
... | ... |
@@ -29,27 +29,15 @@ uxn_halt(Uxn *u, Uint8 error, Uint16 addr) |
29 | 29 |
{ |
30 | 30 |
Device *d = &u->dev[0]; |
31 | 31 |
Uint16 vec = d->vector; |
32 |
- |
|
33 |
- /* hypervisor */ |
|
34 |
- d = &hypervisor.dev[0]; |
|
35 |
- vec = d->vector; |
|
36 |
- DEVPOKE16(0x4, addr); |
|
37 |
- d->dat[0x6] = error; |
|
38 |
- uxn_eval(&hypervisor, PAGE_PROGRAM); |
|
39 |
- |
|
40 |
- /* core */ |
|
41 |
- d = &u->dev[0]; |
|
42 | 32 |
DEVPOKE16(0x4, addr); |
43 | 33 |
d->dat[0x6] = error; |
44 |
- vec = d->vector; |
|
45 |
- |
|
34 |
+ uxn_eval(&supervisor, PAGE_PROGRAM); |
|
46 | 35 |
if(vec) { |
47 | 36 |
d->vector = 0; /* need to rearm to run System/vector again */ |
48 | 37 |
if(error != 2) /* working stack overflow has special treatment */ |
49 | 38 |
vec += 0x0004; |
50 | 39 |
return uxn_eval(u, vec); |
51 | 40 |
} |
52 |
- |
|
53 | 41 |
fprintf(stderr, "Halted: %s#%04x, at 0x%04x\n", errors[error], u->ram[addr], addr); |
54 | 42 |
return 0; |
55 | 43 |
} |
... | ... |
@@ -108,15 +108,16 @@ err: |
108 | 108 |
/* clang-format on */ |
109 | 109 |
|
110 | 110 |
int |
111 |
-uxn_boot(Uxn *u, Uint8 *ram, Uint8 *dev, Stack *wst, Stack *rst) |
|
111 |
+uxn_boot(Uxn *u, Uint8 *ram, Uint8 *devpage, Stack *wst, Stack *rst) |
|
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->ram = ram; |
|
118 |
+ u->devpage = devpage; |
|
117 | 119 |
u->wst = wst; |
118 | 120 |
u->rst = rst; |
119 |
- u->ram = ram; |
|
120 | 121 |
return 1; |
121 | 122 |
} |
122 | 123 |
|
... | ... |
@@ -124,10 +125,10 @@ Device * |
124 | 125 |
uxn_port(Uxn *u, Uint8 id, Uint8 (*deifn)(Device *d, Uint8 port), void (*deofn)(Device *d, Uint8 port)) |
125 | 126 |
{ |
126 | 127 |
Device *d = &u->dev[id]; |
127 |
- d->addr = id * 0x10; |
|
128 | 128 |
d->u = u; |
129 | 129 |
d->mem = u->ram; |
130 | 130 |
d->dei = deifn; |
131 | 131 |
d->deo = deofn; |
132 |
+ d->dat = u->devpage + id * 0x10; |
|
132 | 133 |
return d; |
133 | 134 |
} |
... | ... |
@@ -16,6 +16,9 @@ typedef signed short Sint16; |
16 | 16 |
typedef unsigned int Uint32; |
17 | 17 |
|
18 | 18 |
#define PAGE_PROGRAM 0x0100 |
19 |
+#define VISOR_DEV 0xfa00 |
|
20 |
+#define VISOR_WST 0xfb00 |
|
21 |
+#define VISOR_RST 0xfc00 |
|
19 | 22 |
#define PAGE_DEV 0xfd00 |
20 | 23 |
#define PAGE_WST 0xfe00 |
21 | 24 |
#define PAGE_RST 0xff00 |
... | ... |
@@ -28,25 +31,24 @@ typedef unsigned int Uint32; |
28 | 31 |
/* clang-format on */ |
29 | 32 |
|
30 | 33 |
typedef struct { |
31 |
- Uint8 ptr; |
|
32 |
- Uint8 dat[255]; |
|
34 |
+ Uint8 ptr, dat[255]; |
|
33 | 35 |
} Stack; |
34 | 36 |
|
35 | 37 |
typedef struct Device { |
36 | 38 |
struct Uxn *u; |
37 |
- Uint8 addr, dat[16], *mem; |
|
39 |
+ Uint8 *dat, *mem; |
|
38 | 40 |
Uint16 vector; |
39 | 41 |
Uint8 (*dei)(struct Device *d, Uint8); |
40 | 42 |
void (*deo)(struct Device *d, Uint8); |
41 | 43 |
} Device; |
42 | 44 |
|
43 | 45 |
typedef struct Uxn { |
46 |
+ Uint8 *ram, *devpage; |
|
44 | 47 |
Stack *wst, *rst; |
45 |
- Uint8 *ram; |
|
46 | 48 |
Device dev[16]; |
47 | 49 |
} Uxn; |
48 | 50 |
|
49 |
-int uxn_boot(Uxn *u, Uint8 *ram, Uint8 *dev, Stack *wst, Stack *rst); |
|
51 |
+int uxn_boot(Uxn *u, Uint8 *ram, Uint8 *devpage, Stack *wst, Stack *rst); |
|
50 | 52 |
int uxn_eval(Uxn *u, Uint16 pc); |
51 | 53 |
int uxn_halt(Uxn *u, Uint8 error, Uint16 addr); |
52 | 54 |
Device *uxn_port(Uxn *u, Uint8 id, Uint8 (*deifn)(Device *, Uint8), void (*deofn)(Device *, Uint8)); |
... | ... |
@@ -278,12 +278,12 @@ start(Uxn *u, char *rom) |
278 | 278 |
memory = (Uint8 *)calloc(0xffff, sizeof(Uint8)); |
279 | 279 |
shadow = (Uint8 *)calloc(0xffff, sizeof(Uint8)); |
280 | 280 |
|
281 |
- if(!uxn_boot(&hypervisor, shadow, shadow + PAGE_DEV, (Stack *)(shadow + 0xfb00), (Stack *)(shadow + 0xfc00))) |
|
281 |
+ if(!uxn_boot(&supervisor, shadow, shadow + VISOR_DEV, (Stack *)(shadow + VISOR_WST), (Stack *)(shadow + VISOR_RST))) |
|
282 | 282 |
return error("Boot", "Failed to start uxn."); |
283 | 283 |
if(!uxn_boot(u, memory, shadow + PAGE_DEV, (Stack *)(shadow + PAGE_WST), (Stack *)(shadow + PAGE_RST))) |
284 | 284 |
return error("Boot", "Failed to start uxn."); |
285 |
- if(!load(&hypervisor, "hypervisor.rom")) |
|
286 |
- error("Hypervisor", "No debugger found."); |
|
285 |
+ if(!load(&supervisor, "supervisor.rom")) |
|
286 |
+ error("Supervisor", "No debugger found."); |
|
287 | 287 |
if(!load(u, rom)) |
288 | 288 |
return error("Boot", "Failed to load rom."); |
289 | 289 |
|
... | ... |
@@ -304,10 +304,10 @@ start(Uxn *u, char *rom) |
304 | 304 |
/* unused */ uxn_port(u, 0xe, nil_dei, nil_deo); |
305 | 305 |
/* unused */ uxn_port(u, 0xf, nil_dei, nil_deo); |
306 | 306 |
|
307 |
- /* Hypervisor */ |
|
308 |
- uxn_port(&hypervisor, 0x0, system_dei, system_deo); |
|
309 |
- uxn_port(&hypervisor, 0x1, nil_dei, console_deo); |
|
310 |
- uxn_port(&hypervisor, 0x2, screen_dei, screen_deo); |
|
307 |
+ /* Supervisor */ |
|
308 |
+ uxn_port(&supervisor, 0x0, system_dei, system_deo); |
|
309 |
+ uxn_port(&supervisor, 0x1, nil_dei, console_deo); |
|
310 |
+ uxn_port(&supervisor, 0x2, screen_dei, screen_deo); |
|
311 | 311 |
|
312 | 312 |
if(!uxn_eval(u, PAGE_PROGRAM)) |
313 | 313 |
return error("Boot", "Failed to start rom."); |
... | ... |
@@ -485,7 +485,7 @@ run(Uxn *u) |
485 | 485 |
console_input(u, event.cbutton.button); |
486 | 486 |
} |
487 | 487 |
if(devsystem->dat[0xe]) |
488 |
- uxn_eval(&hypervisor, PAGE_PROGRAM); |
|
488 |
+ uxn_eval(&supervisor, PAGE_PROGRAM); |
|
489 | 489 |
uxn_eval(u, devscreen->vector); |
490 | 490 |
if(uxn_screen.fg.changed || uxn_screen.bg.changed || devsystem->dat[0xe]) |
491 | 491 |
redraw(); |