Browse code

Implement System/vector for debugging.

Andrew Alderwick authored on 05/01/2022 17:27:01
Showing 2 changed files
... ...
@@ -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);