shithub: sms

Download patch

ref: cda22ef3740bddcd1ae90ad5e8de1fbd70ab7242
parent: 2971ff3c2916014d6b34728886ef11e20391046d
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Sat Mar 7 13:19:44 EST 2026

cleanup

--- a/dat.h
+++ b/dat.h
@@ -3,7 +3,7 @@
 extern u8int reg[16];
 
 extern u8int z80bus, z80irq;
-extern u16int pc, curpc;
+extern u16int spc, scurpc;
 
 extern u16int ram[32768];
 extern u8int *prg;
--- a/mem.c
+++ b/mem.c
@@ -26,6 +26,12 @@
 int slotaddr[3] = {0, 0, 0};
 int nbank = 1;
 
+u8int portDC = 0x00;
+u8int portDD = 0xff;
+u8int port3E = 0x00;
+u8int port3F = 0x00;
+u8int port3FHC = 0x00;
+
 void
 cramwrite(u16int a, u8int v)
 {
@@ -36,11 +42,6 @@
 	u8int b = (v & 0x30) << 2;
 
 	cramc[a & 0x1f] = (r << 16) | (g << 8) | b;
-
-	// printf("cramwrite %x %x\n", a, v);
-	// for(int i=0;i<64;i++)
-	// 	printf("%x ", cram[i]);
-	// printf("\n");
 }
 
 void
@@ -56,8 +57,6 @@
 u8int
 z80read(u16int a)
 {
-	// printf("z80read %x\n", a);
-
 	if (a < 0x400)
 		return rom[a];
 	else if (a < 0x4000)
@@ -67,11 +66,8 @@
 	else if (a < 0xC000){
 		if (ram_enabled)
 			return ram[(a - 0x8000) + ram_bank];
-		else{
-			// print("== page 2 %x %x %x\n", a, (a - 0x8000) + slotaddr[2], slotaddr[2]);
-			// print("== rom[(a - 0x8000) + slotaddr[2]] %x\n", rom[(a - 0x8000) + slotaddr[2]]);
+		else
 			return rom[(a - 0x8000) + slotaddr[2]];
-		}
 	}else
 		return mem[a];
 }
@@ -79,7 +75,6 @@
 void
 z80write(u16int a, u8int v)
 {
-	// print("z80write %x %x\n", a, v);
 	if (a < 0x8000)
 		print("wrong z80write page 0 or 1 %x %x", a, v);
 	else if (a < 0xC000)
@@ -94,7 +89,6 @@
 	}
 	else
 	{
-		// print("z80write > 0xE000 %x %x", a, v);
 		mem[a] = v;
 		mem[a - 0x2000]  = v;
 
@@ -102,20 +96,15 @@
 		{
 			case 0xFFFC:
 				ram_bank = (v & (1 << 2)) != 0 ? 0x4000 : 0;
-				// print("RAM bank %x", ram_bank);
 				ram_enabled = (v & (1 << 3)) != 0 ? 1 : 0;
-				// print("RAM enabled %x", ram_enabled);
 				break;
 			case 0xFFFD:
-				// print("Switch mapper slot 0 to %d", (v & nbank-1));
 				slotaddr[0] = (v & nbank-1) * 0x4000;
 				break;
 			case 0xFFFE:
-				// print("switch mapper slot 1 to %d", (v & nbank-1));
 				slotaddr[1] = (v & nbank-1) * 0x4000;
 				break;
 			case 0xFFFF:
-				// print("switch mapper slot 2 to %d", (v & nbank-1));
 				slotaddr[2] = (v & nbank-1) * 0x4000;
 				break;
 		}
@@ -122,16 +111,9 @@
 	}
 }
 
-u8int portDC = 0x00;
-u8int portDD = 0xff;
-u8int port3E = 0x00;
-u8int port3F = 0x00;
-u8int port3FHC = 0x00;
-
 u8int
 z80in(u8int port)
 {
-	// print("z80in %x", port);
 	if (port < 0x40)
 		return 0xff;
 	else if (port >= 0x40 && port < 0x80)
@@ -154,9 +136,7 @@
 void
 z80out(u8int port, u8int v)
 {
-	// print("z80out %x %x", port, v);
 	if (port < 0x40){
-		// print("  write to control register");
 		if ((port & 0x01) == 0x00)
 			port3E = v;
 		else{
@@ -164,14 +144,11 @@
 			port3F = ((v & 0x80) | (v & 0x20) << 1) & 0xC0;
 		}
 	}else if ((port >= 0x40) && (port < 0x80)){
-		// print("  write to SN76489 PSG");
 		psgwrite(v);
 	}else if ((port >= 0x80) && (port < 0xC0)){
-		// print("  write to VDP");
 		if ((port & 0x01) == 0x00)
 			vdpdata(v);
 		else
 			vdpctrl(v);
-	}else
-		print("  write with no effect");
+	}
 }
--- a/mkfile
+++ b/mkfile
@@ -14,4 +14,6 @@
 
 </sys/src/cmd/mkone
 eui.$O: ../eui.c
-	$CC $CFLAGS ../eui.c
\ No newline at end of file
+	$CC $CFLAGS ../eui.c
+#z80.$O: ../md/z80.c
+#	$CC $CFLAGS ../md/z80.c
--- a/psg.c
+++ b/psg.c
@@ -5,8 +5,6 @@
 #include "dat.h"
 #include "fns.h"
 
-#define NOISE_TAPPED 0x9
-
 static int fd;
 static short sbuf[2 * 2000], *sbufp;
 
@@ -29,7 +27,9 @@
 void
 psgwrite(const u8int data)
 {
-	int first = data & 128;
+	int first;
+
+	first = data & 128;
 	if(first){
 		curr_reg = (data >> 5) & 3;
 		curr_type = (data >> 4) & 1;
@@ -79,7 +79,7 @@
 					u8int fb = (freqreg[3] >> 2) & 1;
 					countreg[3] = nf == 3 ? freqreg[2] : (0x10 << nf);
 
-					noise = (noise >> 1) | ((fb ? parity(noise & NOISE_TAPPED) : noise & 1) << 15);
+					noise = (noise >> 1) | ((fb ? parity(noise & 0x9) : noise & 1) << 15);
 					flipflop[3] = (noise & 1);
 				}
 			}
--- a/sms.c
+++ b/sms.c
@@ -9,7 +9,6 @@
 
 int t = 0;
 u32int r[16];
-extern u16int pc, curpc, sp;
 u32int irq;
 u8int *rom = nil;
 u8int *mem = nil;
@@ -47,7 +46,7 @@
 	if(mem == nil)
 		sysfatal("mallocz: %r");
 	mapperinit();
-	pc = 0;
+	spc = 0;
 
 	close(fd);
 }
--- a/vdp.c
+++ b/vdp.c
@@ -121,10 +121,12 @@
 static void
 sprites(void)
 {
-	u16int t1 = (reg[SPRTAB] << 7 & 0x3f00);
-	u16int t2 = t1 + 0x80;
-	u16int t3 = (reg[SPRADDR] << 11) & 0x2000;
+	u16int t1, t2, t3;
 
+	t1 = (reg[SPRTAB] << 7 & 0x3f00);
+	t2 = t1 + 0x80;
+	t3 = (reg[SPRADDR] << 11) & 0x2000;
+
 	for(int i = 7; i >= 0; i--){
 		if(sprlst[i] < 0) continue;
 
@@ -153,10 +155,7 @@
 void
 vdpctrl(u8int v)
 {
-	// print("	vdp write to control port %x", v);
-
 	if(first){
-		// print("first");
 		first = 0;
 		vdpaddr = (vdpaddr & 0xff00) | v;
 		return;
@@ -165,7 +164,6 @@
 	vdpcode = (v >> 6) & 0x03;
 	vdpaddr = (vdpaddr & 0x00ff) | ((v & 0x3f) << 8);
 
-	// print("vdp code and address %x %x", vdpcode, vdpaddr);
 	first = 1;
 
 	switch(vdpcode){
@@ -181,13 +179,11 @@
 void
 vdpdata(u8int v)
 {
-	// print("	vdp (code: %x) write to data port %x", vdpcode, v);
 	first = 1;
 	vdpbuf = v;
 	switch(vdpcode){
 		case 0: case 1: case 2:
 			vram[vdpaddr] = v;
-			// print("vramwrite %x %x", vdpaddr, v);
 		break;
 		case 3: cramwrite(vdpaddr, v); break;
 	}
@@ -198,11 +194,12 @@
 u8int
 vdpdataport(void)
 {
-	u8int v = vdpbuf;
+	u8int v;
+
+	v = vdpbuf;
 	vdpbuf = vram[vdpaddr];
 	vdpaddr++;
 	vdpaddr &= 0x3fff;
-	// print("    vdp read from data port %x", v);
 	first = 1;
 	return v;
 }
@@ -210,10 +207,11 @@
 u8int
 vdpstatus(void)
 {
-	u8int v = vdpstat | 0x1f;
+	u8int v;
+
+	v = vdpstat | 0x1f;
 	vdpstat = 0;
 	z80irq = 0;
-	// print("    vdp read status flags %x", v);
 	first = 1;
 	return v;
 }
@@ -221,7 +219,6 @@
 u8int
 vdphcounter(void)
 {
-	// print("    vdp read hcounter %x", vdpx);
 	return vdpx;
 }
 
@@ -228,7 +225,6 @@
 u8int
 vdpvcounter(void)
 {
-	// print("    vdp read hcounter %y", vdpy);
 	if (vdpy > 0xda)
 		return vdpy - 0x06;
 	return vdpy;
@@ -245,7 +241,6 @@
 		if(vdpy == 0)
 			scrolly = reg[VERSCR];
 	}
-
 	if(vdpx < xdisp && vdpy < disph){
 		planes();
 		if(vdpx == xdisp - 1) sprites();
--- a/z80.c
+++ b/z80.c
@@ -5,11 +5,10 @@
 #include "fns.h"
 
 u8int ipage, intm, z80irq;
-u16int ix[2] = {0xffff, 0xffff};
-u16int pc, curpc;
+u16int ix[2];
+u16int spc, scurpc;
 u16int sp = 0xdff0;
-int halt;
-int inplast;
+int halt, inplast;
 
 enum {
 	FLAGC = 0x01,
@@ -36,14 +35,16 @@
 static u8int
 fetch8(void)
 {
-	return z80read(pc++);
+	return z80read(spc++);
 }
 
 static u16int
 fetch16(void)
 {
-	u16int u = z80read(pc++);
-	return u | z80read(pc++) << 8;
+	u16int u;
+	
+	u = z80read(spc++);
+	return u | z80read(spc++) << 8;
 }
 
 static void
@@ -68,7 +69,9 @@
 static u16int
 pop16(void)
 {
-	u16int v = z80read(sp++);
+	u16int v;
+	
+	v = z80read(sp++);
 	return v | z80read(sp++) << 8;
 }
 
@@ -193,10 +196,12 @@
 static int
 branch(int cc, int t)
 {
-	u16int v = (s8int)fetch8();
+	u16int v;
+	
+	v = (s8int)fetch8();
 	if(!cc)
 		return t + 7;
-	pc += v;
+	spc += v;
 	return t + 12;
 }
 
@@ -235,8 +240,10 @@
 static int
 addhl(u16int u)
 {
+	u32int v;
+	
 	s[rF] &= ~(FLAGN|FLAGC|FLAGH);
-	u32int v = HL() + u;
+	v = HL() + u;
 	if((v & 0x10000) != 0)
 		s[rF] |= FLAGC;
 	if((HL() & 0xfff) + (u & 0xfff) >= 0x1000)
@@ -249,8 +256,10 @@
 static void
 adchl(u16int u)
 {
-	u32int v = HL() + u + (s[rF] & FLAGC);
-	u32int v4 = (HL() & 0xfff) + (u & 0xfff) + (s[rF] & FLAGC);
+	u32int v, v4;
+	
+	v = HL() + u + (s[rF] & FLAGC);
+	v4 = (HL() & 0xfff) + (u & 0xfff) + (s[rF] & FLAGC);
 	s[rF] = 0;
 	if((v & 0x10000) != 0)
 		s[rF] |= FLAGC;
@@ -269,8 +278,10 @@
 static void
 sbchl(u16int u)
 {
-	u32int v = HL() + (u16int)~u + (~s[rF] & FLAGC);
-	u32int v4 = (HL() & 0xfff) + (~u & 0xfff) + (~s[rF] & FLAGC);
+	u32int v, v4;
+	
+	v = HL() + (u16int)~u + (~s[rF] & FLAGC);
+	v4 = (HL() & 0xfff) + (~u & 0xfff) + (~s[rF] & FLAGC);
 	s[rF] = FLAGN;
 	if((v & 0x10000) == 0)
 		s[rF] |= FLAGC;
@@ -291,8 +302,10 @@
 static int
 addindex(int n, u16int u)
 {
+	u32int v;
+	
 	s[rF] &= ~(FLAGN|FLAGC|FLAGH);
-	u32int v = ix[n] + u;
+	v = ix[n] + u;
 	if((v & 0x10000) != 0)
 		s[rF] |= FLAGC;
 	if((ix[n] & 0xfff) + (u & 0xfff) >= 0x1000)
@@ -304,9 +317,11 @@
 static int
 jump(int cc)
 {
-	u16int v = fetch16();
+	u16int v;
+	
+	v = fetch16();
 	if(cc)
-		pc = v;
+		spc = v;
 	return 10;
 }
 
@@ -315,8 +330,8 @@
 {
 	if(!cc)
 		return 10;
-	push16(pc);
-	pc = a;
+	push16(spc);
+	spc = a;
 	return 17;
 }
 
@@ -325,8 +340,8 @@
 {
 	if(!cc)
 		return 0;
-	push16(pc);
-	pc = a;
+	push16(spc);
+	spc = a;
 	return 11;
 }
 
@@ -333,7 +348,9 @@
 static void
 swap(u8int a)
 {
-	u8int v = s[a];
+	u8int v;
+	
+	v = s[a];
 	s[a] = s[a + 8];
 	s[a + 8] = v;
 }
@@ -344,11 +361,8 @@
 	u8int op, v, n, m, c;
 	u16int a;
 	int t;
-
-	//SET(a, v, t);
-	a = 0;
-	v = 0;
-	t = 0;
+	
+	SET(a, v, t);
 	if(i >= 0){
 		a = ix[i] + fetch8();
 		v = z80read(a);
@@ -410,9 +424,8 @@
 {
 	u8int op, v, u, l;
 	u16int a, n;
-
+	
 	op = fetch8();
-	// print("ed %.2x", op);
 	switch(op){
 	case 0xa0: case 0xa1: case 0xa8: case 0xa9:
 	case 0xb0: case 0xb1: case 0xb8: case 0xb9:
@@ -456,12 +469,11 @@
 		if(BC() != 0){
 			s[rF] |= FLAGV;
 			if((op & 0x10) != 0 && l){
-				pc -= 2;
+				spc -= 2;
 				return 21;
 			}
-		}else{
+		}else
 			s[rF] &= ~FLAGV;
-		}
 		return 16;
 	case 0xa2:	/* INI */
 		v = z80in(s[rC]);
@@ -486,7 +498,7 @@
 			s[rF] |= FLAGZ;
 		else{
 			s[rF] |= FLAGV;
-			pc -= 2;
+			spc -= 2;
 			return 21;
 		}
 		return 16;
@@ -513,7 +525,7 @@
 			s[rF] |= FLAGZ;
 		else{
 			s[rF] |= FLAGV;
-			pc -= 2;
+			spc -= 2;
 			return 21;
 		}
 		return 16;
@@ -540,7 +552,7 @@
 			s[rF] |= FLAGZ;
 		else{
 			s[rF] |= FLAGV;
-			pc -= 2;
+			spc -= 2;
 			return 21;
 		}
 		return 16;
@@ -567,7 +579,7 @@
 			s[rF] |= FLAGZ;
 		else{
 			s[rF] |= FLAGV;
-			pc -= 2;
+			spc -= 2;
 			return 21;
 		}
 		return 16;
@@ -601,7 +613,7 @@
 		v = z80read(HL());
 		z80write(HL(), v >> 4 | s[rA] << 4);
 		s[rA] = s[rA] & 0xf0 | v & 0x0f;
-		if (0){
+		if(0){
 	case 0x6f:
 			v = z80read(HL());
 			z80write(HL(), v << 4 | s[rA] & 0xf);
@@ -623,7 +635,7 @@
 	case 0x5b: a = fetch16(); s[rE] = z80read(a++); s[rD] = z80read(a); return 20;
 	case 0x6b: a = fetch16(); s[rL] = z80read(a++); s[rH] = z80read(a); return 20;
 	case 0x7b: sp = read16(fetch16()); return 20;
-	case 0x4d: pc = pop16(); return 14;
+	case 0x4d: spc = pop16(); return 14;
 	case 0x5e: intm = intm & 0xc0 | 2; return 8;
 	case 0x4f: return 9;
 	case 0x5f: return 9;
@@ -647,15 +659,16 @@
 	case 0x69: z80out(s[rC], s[rL]); return 12;
 	case 0x79: z80out(s[rC], s[rA]); return 12;
 	}
-	sysfatal("undefined z80 opcode ed%.2x at pc=%#.4x", op, curpc);
+	sysfatal("undefined z80 opcode ed%.2x at pc=%#.4x", op, scurpc);
 }
 
 static int
-index_(int n)
+index(int n)
 {
+	u8int op;
 	u16int v;
-
-	u8int op = fetch8();
+	
+	op = fetch8();
 	switch(op){
 	case 0x40: case 0x41: case 0x42: case 0x43: case 0x47:
 	case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4f:
@@ -694,8 +707,8 @@
 		return alu(op >> 3 & 7, 10 + n);
 	case 0x86: case 0x8e: case 0x96: case 0x9e:
 	case 0xa6: case 0xae: case 0xb6: case 0xbe:
-		return alu(op >> 3 & 7, 14 + n);
-
+		return alu(op >> 3 & 7, 14 + n);	
+	
 	case 0x21: ix[n] = fetch16(); return 14;
 	case 0xe1: ix[n] = pop16(); return 14;
 	case 0x22: write16(fetch16(), ix[n]); return 20;
@@ -712,7 +725,7 @@
 	case 0x19: return addindex(n, DE());
 	case 0x29: return addindex(n, ix[n]);
 	case 0x39: return addindex(n, sp);
-	case 0xe9: pc = ix[n]; return 8;
+	case 0xe9: spc = ix[n]; return 8;
 	case 0xf9: sp = ix[n]; return 10;
 	case 0x2a: ix[n] = read16(fetch16()); return 20;
 	case 0x2b: ix[n]--; return 10;
@@ -721,7 +734,7 @@
 	case 0x2d: dec(ix[n]--); return 8;
 	case 0x2e: ix[n] = ix[n] & 0xff00 | fetch8(); return 11;
 	}
-	sysfatal("undefined z80 opcode %.2x%.2x at pc=%#.4x", n ? 0xfd : 0xdd, op, curpc);
+	sysfatal("undefined z80 opcode %.2x%.2x at pc=%#.4x", n ? 0xfd : 0xdd, op, scurpc);
 }
 
 int
@@ -731,39 +744,35 @@
 	u16int v, w;
 
 	if((z80bus & RESET) != 0){
-		print("reset");
-		curpc = pc = 0;
+		scurpc = spc = 0;
 		intm = 0;
 		ipage = 0;
 		return 1;
 	}
 	if((z80bus & BUSACK) != 0){
-		print("busack");
 		if((z80bus & BUSREQ) == 0)
 			z80bus &= ~BUSACK;
 		return 1;
 	}
 	if((z80bus & BUSREQ) != 0){
-		print("busreq");
 		z80bus |= BUSACK;
 		return 1;
 	}
 	if(z80irq != 0 && (intm & 0x80) != 0){
-		//print("irq");
-		push16(pc);
+		push16(spc);
 		intm &= 0x3f;
 		switch(intm & 3){
 		case 1:
-			pc = 0x38;
+			spc = 0x38;
 			return 2;
 		default:
 			sysfatal("z80 interrupt in mode %d", intm & 3);
 		}
 	}
-	curpc = pc;
-	// print("%x AF %.2x%.2x BC %.2x%.2x DE %.2x%.2x HL %.2x%.2x IX %.4x IY %.4x", curpc, s[rA], s[rF], s[rB], s[rC], s[rD], s[rE], s[rH], s[rL], ix[0], ix[1]);
+	scurpc = spc;
+	if(0)
+		print("%x AF %.2x%.2x BC %.2x%.2x DE %.2x%.2x HL %.2x%.2x IX %.4x IY %.4x\n", scurpc, s[rA], s[rF], s[rB], s[rC], s[rD], s[rE], s[rH], s[rL], ix[0], ix[1]);
 	op = fetch8();
-	// print("op: %x", op);
 	switch(op >> 6){
 	case 1: return move(op >> 3 & 7, op & 7);
 	case 2: return alu(op >> 3 & 7, op & 7);
@@ -879,10 +888,10 @@
 	case 0x3f:
 		s[rF] = s[rF] & ~(FLAGN|FLAGH) ^ FLAGC | s[rF] << 4 & FLAGH;
 		return 4;
-	case 0xc0: if((s[rF] & FLAGZ) == 0) {pc = pop16(); return 11;} return 5;
-	case 0xd0: if((s[rF] & FLAGC) == 0) {pc = pop16(); return 11;} return 5;
-	case 0xe0: if((s[rF] & FLAGV) == 0) {pc = pop16(); return 11;} return 5;
-	case 0xf0: if((s[rF] & FLAGS) == 0) {pc = pop16(); return 11;} return 5;
+	case 0xc0: if((s[rF] & FLAGZ) == 0) {spc = pop16(); return 11;} return 5;
+	case 0xd0: if((s[rF] & FLAGC) == 0) {spc = pop16(); return 11;} return 5;
+	case 0xe0: if((s[rF] & FLAGV) == 0) {spc = pop16(); return 11;} return 5;
+	case 0xf0: if((s[rF] & FLAGS) == 0) {spc = pop16(); return 11;} return 5;
 	case 0xc1: s[rC] = pop8(); s[rB] = pop8(); return 10;
 	case 0xd1: s[rE] = pop8(); s[rD] = pop8(); return 10;
 	case 0xe1: s[rL] = pop8(); s[rH] = pop8(); return 10;
@@ -916,11 +925,11 @@
 	case 0xd7: return call2(0x10, 1);
 	case 0xe7: return call2(0x20, 1);
 	case 0xf7: return call2(0x30, 1);
-	case 0xc8: if((s[rF] & FLAGZ) != 0) {pc = pop16(); return 11;} return 5;
-	case 0xd8: if((s[rF] & FLAGC) != 0) {pc = pop16(); return 11;} return 5;
-	case 0xe8: if((s[rF] & FLAGV) != 0) {pc = pop16(); return 11;} return 5;
-	case 0xf8: if((s[rF] & FLAGS) != 0) {pc = pop16(); return 11;} return 5;
-	case 0xc9: pc = pop16(); return 10;
+	case 0xc8: if((s[rF] & FLAGZ) != 0) {spc = pop16(); return 11;} return 5;
+	case 0xd8: if((s[rF] & FLAGC) != 0) {spc = pop16(); return 11;} return 5;
+	case 0xe8: if((s[rF] & FLAGV) != 0) {spc = pop16(); return 11;} return 5;
+	case 0xf8: if((s[rF] & FLAGS) != 0) {spc = pop16(); return 11;} return 5;
+	case 0xc9: spc = pop16(); return 10;
 	case 0xd9:
 		swap(rB);
 		swap(rC);
@@ -929,7 +938,7 @@
 		swap(rH);
 		swap(rL);
 		return 4;
-	case 0xe9: pc = HL(); return 4;
+	case 0xe9: spc = HL(); return 4;
 	case 0xf9: sp = HL(); return 6;
 	case 0xca: return jump((s[rF] & FLAGZ) != 0);
 	case 0xda: return jump((s[rF] & FLAGC) != 0);
@@ -938,7 +947,7 @@
 	case 0xcb: return bits(-1);
 	case 0xdb:
 		if(inplast){ s[rA] = z80in(fetch8()); inplast = 0; return 1;
-		}else{ pc--; inplast = 1; return 10; }
+		}else{ spc--; inplast = 1; return 10; }
 	case 0xeb:
 		v = DE();
 		s[rD] = s[rH];
@@ -952,9 +961,9 @@
 	case 0xec: return call(fetch16(), (s[rF] & FLAGV) != 0);
 	case 0xfc: return call(fetch16(), (s[rF] & FLAGS) != 0);
 	case 0xcd: return call(fetch16(), 1);
-	case 0xdd: return index_(0);
+	case 0xdd: return index(0);
 	case 0xed: return ed();
-	case 0xfd: return index_(1);
+	case 0xfd: return index(1);
 	case 0xce: return alu(1, 8);
 	case 0xde: return alu(3, 8);
 	case 0xee: return alu(5, 8);
@@ -964,13 +973,13 @@
 	case 0xef: return call2(0x28, 1);
 	case 0xff: return call2(0x38, 1);
 	}
-	sysfatal("undefined z80 opcode %#.2x at pc=%#.4x", op, curpc);
+	sysfatal("undefined z80 opcode %#.2x at pc=%#.4x", op, scurpc);
 }
 
 void
 z80reset(void)
 {
-	curpc = pc = 0;
+	scurpc = spc = 0;
 	intm = 0;
 	ipage = 0;
 	sp = 0xdff0;
--