| ... | ... |
@@ -22,9 +22,9 @@ |
| 22 | 22 |
|
| 23 | 23 |
( devices ) |
| 24 | 24 |
|
| 25 |
-|00 @System &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 &debug $1 &halt $1 |
|
| 25 |
+|00 @System &vector $2 &wst $1 &rst $1 &eaddr $2 &ecode $1 &pad $1 &r $2 &g $2 &b $2 &debug $1 &halt $1 |
|
| 26 | 26 |
|10 @Console &vector $2 &read $1 &pad $5 &write $1 &error $1 |
| 27 |
-|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 |
|
| 27 |
+|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 |
|
| 28 | 28 |
|30 @Audio0 &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 |
| 29 | 29 |
|40 @Audio1 &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 |
| 30 | 30 |
|50 @Audio2 &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 |
| ... | ... |
@@ -25,6 +25,16 @@ static const char *errors[] = {
|
| 25 | 25 |
int |
| 26 | 26 |
uxn_halt(Uxn *u, Uint8 error, Uint16 addr) |
| 27 | 27 |
{
|
| 28 |
+ Device *d = &u->dev[0]; |
|
| 29 |
+ Uint16 vec = d->vector; |
|
| 30 |
+ if(vec) {
|
|
| 31 |
+ d->vector = 0; /* need to rearm to run System/vector again */ |
|
| 32 |
+ DEVPOKE16(0x4, addr); |
|
| 33 |
+ d->dat[0x6] = error; |
|
| 34 |
+ if(error != 2) /* working stack overflow has special treatment */ |
|
| 35 |
+ vec += 0x0004; |
|
| 36 |
+ return uxn_eval(u, vec); |
|
| 37 |
+ } |
|
| 28 | 38 |
fprintf(stderr, "Halted: %s#%04x, at 0x%04x\n", errors[error], u->ram[addr], addr); |
| 29 | 39 |
return 0; |
| 30 | 40 |
} |
| ... | ... |
@@ -45,6 +55,7 @@ void |
| 45 | 55 |
system_deo(Device *d, Uint8 port) |
| 46 | 56 |
{
|
| 47 | 57 |
switch(port) {
|
| 58 |
+ case 0x1: DEVPEEK16(d->vector, 0x0); break; |
|
| 48 | 59 |
case 0x2: d->u->wst.ptr = d->dat[port]; break; |
| 49 | 60 |
case 0x3: d->u->rst.ptr = d->dat[port]; break; |
| 50 | 61 |
default: system_deo_special(d, port); |