| ... | ... |
@@ -18,7 +18,7 @@ controller_down(Device *d, Uint8 mask) |
| 18 | 18 |
{
|
| 19 | 19 |
if(mask) {
|
| 20 | 20 |
d->dat[2] |= mask; |
| 21 |
- uxn_eval(d->u, d->vector); |
|
| 21 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 22 | 22 |
} |
| 23 | 23 |
} |
| 24 | 24 |
|
| ... | ... |
@@ -27,7 +27,7 @@ controller_up(Device *d, Uint8 mask) |
| 27 | 27 |
{
|
| 28 | 28 |
if(mask) {
|
| 29 | 29 |
d->dat[2] &= (~mask); |
| 30 |
- uxn_eval(d->u, d->vector); |
|
| 30 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 31 | 31 |
} |
| 32 | 32 |
} |
| 33 | 33 |
|
| ... | ... |
@@ -36,7 +36,7 @@ controller_key(Device *d, Uint8 key) |
| 36 | 36 |
{
|
| 37 | 37 |
if(key) {
|
| 38 | 38 |
d->dat[3] = key; |
| 39 |
- uxn_eval(d->u, d->vector); |
|
| 39 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 40 | 40 |
d->dat[3] = 0x00; |
| 41 | 41 |
} |
| 42 | 42 |
} |
| ... | ... |
@@ -46,7 +46,7 @@ controller_special(Device *d, Uint8 key) |
| 46 | 46 |
{
|
| 47 | 47 |
if(key) {
|
| 48 | 48 |
d->dat[4] = key; |
| 49 |
- uxn_eval(d->u, d->vector); |
|
| 49 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 50 | 50 |
d->dat[4] = 0x00; |
| 51 | 51 |
} |
| 52 | 52 |
} |
| 53 | 53 |
\ No newline at end of file |
| ... | ... |
@@ -17,14 +17,14 @@ void |
| 17 | 17 |
mouse_down(Device *d, Uint8 mask) |
| 18 | 18 |
{
|
| 19 | 19 |
d->dat[6] |= mask; |
| 20 |
- uxn_eval(d->u, d->vector); |
|
| 20 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 21 | 21 |
} |
| 22 | 22 |
|
| 23 | 23 |
void |
| 24 | 24 |
mouse_up(Device *d, Uint8 mask) |
| 25 | 25 |
{
|
| 26 | 26 |
d->dat[6] &= (~mask); |
| 27 |
- uxn_eval(d->u, d->vector); |
|
| 27 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 28 | 28 |
} |
| 29 | 29 |
|
| 30 | 30 |
void |
| ... | ... |
@@ -32,7 +32,7 @@ mouse_pos(Device *d, Uint16 x, Uint16 y) |
| 32 | 32 |
{
|
| 33 | 33 |
DEVPOKE16(0x2, x); |
| 34 | 34 |
DEVPOKE16(0x4, y); |
| 35 |
- uxn_eval(d->u, d->vector); |
|
| 35 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 36 | 36 |
} |
| 37 | 37 |
|
| 38 | 38 |
void |
| ... | ... |
@@ -40,7 +40,7 @@ mouse_scroll(Device *d, Uint16 x, Uint16 y) |
| 40 | 40 |
{
|
| 41 | 41 |
DEVPOKE16(0xa, x); |
| 42 | 42 |
DEVPOKE16(0xc, -y); |
| 43 |
- uxn_eval(d->u, d->vector); |
|
| 43 |
+ uxn_eval(d->u, GETVECTOR(d)); |
|
| 44 | 44 |
DEVPOKE16(0xa, 0); |
| 45 | 45 |
DEVPOKE16(0xc, 0); |
| 46 | 46 |
} |
| ... | ... |
@@ -28,12 +28,14 @@ int |
| 28 | 28 |
uxn_halt(Uxn *u, Uint8 error, Uint16 addr) |
| 29 | 29 |
{
|
| 30 | 30 |
Device *d = &u->dev[0]; |
| 31 |
- Uint16 vec = d->vector; |
|
| 31 |
+ Uint16 vec = GETVECTOR(d); |
|
| 32 | 32 |
DEVPOKE16(0x4, addr); |
| 33 | 33 |
d->dat[0x6] = error; |
| 34 |
- uxn_eval(&supervisor, supervisor.dev[0].vector); |
|
| 34 |
+ uxn_eval(&supervisor, GETVECTOR(&supervisor.dev[0])); |
|
| 35 | 35 |
if(vec) {
|
| 36 |
- d->vector = 0; /* need to rearm to run System/vector again */ |
|
| 36 |
+ /* need to rearm to run System/vector again */ |
|
| 37 |
+ d->dat[0] = 0; |
|
| 38 |
+ d->dat[1] = 0; |
|
| 37 | 39 |
if(error != 2) /* working stack overflow has special treatment */ |
| 38 | 40 |
vec += 0x0004; |
| 39 | 41 |
return uxn_eval(u, vec); |
| ... | ... |
@@ -58,7 +60,6 @@ void |
| 58 | 60 |
system_deo(Device *d, Uint8 port) |
| 59 | 61 |
{
|
| 60 | 62 |
switch(port) {
|
| 61 |
- case 0x1: DEVPEEK16(d->vector, 0x0); break; |
|
| 62 | 63 |
case 0x2: d->u->wst->ptr = d->dat[port]; break; |
| 63 | 64 |
case 0x3: d->u->rst->ptr = d->dat[port]; break; |
| 64 | 65 |
default: system_deo_special(d, port); |
| ... | ... |
@@ -27,6 +27,7 @@ typedef unsigned int Uint32; |
| 27 | 27 |
|
| 28 | 28 |
#define DEVPEEK16(o, x) { (o) = (d->dat[(x)] << 8) + d->dat[(x) + 1]; }
|
| 29 | 29 |
#define DEVPOKE16(x, y) { d->dat[(x)] = (y) >> 8; d->dat[(x) + 1] = (y); }
|
| 30 |
+#define GETVECTOR(d) ((d)->dat[0] << 8 | (d)->dat[1]) |
|
| 30 | 31 |
|
| 31 | 32 |
/* clang-format on */ |
| 32 | 33 |
|
| ... | ... |
@@ -37,7 +38,6 @@ typedef struct {
|
| 37 | 38 |
typedef struct Device {
|
| 38 | 39 |
struct Uxn *u; |
| 39 | 40 |
Uint8 *dat, *mem; |
| 40 |
- Uint16 vector; |
|
| 41 | 41 |
Uint8 (*dei)(struct Device *d, Uint8); |
| 42 | 42 |
void (*deo)(struct Device *d, Uint8); |
| 43 | 43 |
} Device; |
| ... | ... |
@@ -60,8 +60,6 @@ system_deo_special(Device *d, Uint8 port) |
| 60 | 60 |
static void |
| 61 | 61 |
console_deo(Device *d, Uint8 port) |
| 62 | 62 |
{
|
| 63 |
- if(port == 0x1) |
|
| 64 |
- DEVPEEK16(d->vector, 0x0); |
|
| 65 | 63 |
if(port > 0x7) |
| 66 | 64 |
write(port - 0x7, (char *)&d->dat[port], 1); |
| 67 | 65 |
} |
| ... | ... |
@@ -75,7 +73,8 @@ nil_dei(Device *d, Uint8 port) |
| 75 | 73 |
static void |
| 76 | 74 |
nil_deo(Device *d, Uint8 port) |
| 77 | 75 |
{
|
| 78 |
- if(port == 0x1) DEVPEEK16(d->vector, 0x0); |
|
| 76 |
+ (void)d; |
|
| 77 |
+ (void)port; |
|
| 79 | 78 |
} |
| 80 | 79 |
|
| 81 | 80 |
#pragma mark - Generics |
| ... | ... |
@@ -84,7 +83,7 @@ static int |
| 84 | 83 |
console_input(Uxn *u, char c) |
| 85 | 84 |
{
|
| 86 | 85 |
devconsole->dat[0x2] = c; |
| 87 |
- return uxn_eval(u, devconsole->vector); |
|
| 86 |
+ return uxn_eval(u, GETVECTOR(devconsole)); |
|
| 88 | 87 |
} |
| 89 | 88 |
|
| 90 | 89 |
static void |
| ... | ... |
@@ -180,8 +180,6 @@ system_deo_special(Device *d, Uint8 port) |
| 180 | 180 |
static void |
| 181 | 181 |
console_deo(Device *d, Uint8 port) |
| 182 | 182 |
{
|
| 183 |
- if(port == 0x1) |
|
| 184 |
- DEVPEEK16(d->vector, 0x0); |
|
| 185 | 183 |
if(port > 0x7) |
| 186 | 184 |
write(port - 0x7, (char *)&d->dat[port], 1); |
| 187 | 185 |
} |
| ... | ... |
@@ -228,7 +226,8 @@ nil_dei(Device *d, Uint8 port) |
| 228 | 226 |
static void |
| 229 | 227 |
nil_deo(Device *d, Uint8 port) |
| 230 | 228 |
{
|
| 231 |
- if(port == 0x1) DEVPEEK16(d->vector, 0x0); |
|
| 229 |
+ (void)d; |
|
| 230 |
+ (void)port; |
|
| 232 | 231 |
} |
| 233 | 232 |
|
| 234 | 233 |
/* Boot */ |
| ... | ... |
@@ -409,7 +408,7 @@ static int |
| 409 | 408 |
console_input(Uxn *u, char c) |
| 410 | 409 |
{
|
| 411 | 410 |
devconsole->dat[0x2] = c; |
| 412 |
- return uxn_eval(u, devconsole->vector); |
|
| 411 |
+ return uxn_eval(u, GETVECTOR(devconsole)); |
|
| 413 | 412 |
} |
| 414 | 413 |
|
| 415 | 414 |
static int |
| ... | ... |
@@ -483,8 +482,8 @@ run(Uxn *u) |
| 483 | 482 |
console_input(u, event.cbutton.button); |
| 484 | 483 |
} |
| 485 | 484 |
if(devsystem->dat[0xe]) |
| 486 |
- uxn_eval(&supervisor, supervisor.dev[2].vector); |
|
| 487 |
- uxn_eval(u, devscreen->vector); |
|
| 485 |
+ uxn_eval(&supervisor, GETVECTOR(&supervisor.dev[2])); |
|
| 486 |
+ uxn_eval(u, GETVECTOR(devscreen)); |
|
| 488 | 487 |
if(uxn_screen.fg.changed || uxn_screen.bg.changed || devsystem->dat[0xe]) |
| 489 | 488 |
redraw(); |
| 490 | 489 |
if(!BENCH) {
|