shithub: sms

Download patch

ref: f02938865de648be37f836b50bec65bf3327629b
parent: fcd896071ef85285b0a6dfcae57f927532d90337
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Sun Jul 7 17:52:29 EDT 2024

Implement or stub ed78, ed61, ed69

--- a/dat.h
+++ b/dat.h
@@ -12,8 +12,6 @@
 extern uint8_t *prg;
 extern uint8_t *rom;
 extern uint8_t *mem;
-extern uint8_t *sram;
-extern uint32_t sramctl, sram0, sram1;
 
 enum {
 	MODE1   = 0x00,
--- a/mem.c
+++ b/mem.c
@@ -6,7 +6,8 @@
 
 #define sysfatal(fmt, ...){printf(fmt"\n", ##__VA_ARGS__); exit(EXIT_FAILURE);}
 
-uint16_t ram[32768], vram[32768];
+uint16_t ram[32768] = {0};
+uint16_t vram[32768];
 uint16_t cram[64], vsram[40];
 uint32_t cramc[64];
 uint8_t zram[8192];
@@ -20,7 +21,8 @@
 uint8_t yma1, yma2;
 
 uint8_t z80bus = 0;
-uint16_t z80bank;
+uint16_t ram_bank;
+uint8_t ram_enabled = 0;
 
 int slotaddr[3] = {0, 0, 0};
 int nbank = 16;
@@ -38,9 +40,13 @@
 	else if (a < 0x8000)
 		return rom[(a - 0x4000) + slotaddr[1]];
 	else if (a < 0xC000){
-		printf("== page 2 %x %x %x\n", a, (a - 0x8000) + slotaddr[2], slotaddr[2]);
-		printf("== rom[(a - 0x8000) + slotaddr[2]] %x\n", rom[(a - 0x8000) + slotaddr[2]]);
-		return rom[(a - 0x8000) + slotaddr[2]];
+		if (ram_enabled)
+			return ram[(a - 0x8000) + ram_bank];
+		else{
+			printf("== page 2 %x %x %x\n", a, (a - 0x8000) + slotaddr[2], slotaddr[2]);
+			printf("== rom[(a - 0x8000) + slotaddr[2]] %x\n", rom[(a - 0x8000) + slotaddr[2]]);
+			return rom[(a - 0x8000) + slotaddr[2]];
+		}
 	}else
 		return mem[a];
 }
@@ -50,35 +56,43 @@
 {
 	printf("z80write %x %x\n", a, v);
 	if (a < 0x8000)
-		printf("wrong z80write %x %x\n", a, v);
-    else if (a < 0xE000)
-    {
-        rom[a] = v;
-        rom[a + 0x2000]  = v;
-    }
+		printf("wrong z80write page 0 or 1 %x %x\n", a, v);
+	else if (a < 0xC000)
+		if (ram_enabled)
+			ram[(a - 0x8000) + ram_bank] = v;
+		else
+			printf("wrong z80write page 2 %x %x\n", a, v);
+	else if (a < 0xE000)
+	{
+		mem[a] = v;
+		mem[a + 0x2000]  = v;
+	}
 	else
 	{
-		printf("z80write > 0xE000 %x %x\n", a, v);
-        rom[a] = v;
-        rom[a - 0x2000]  = v;
+		// printf("z80write > 0xE000 %x %x\n", a, v);
+		mem[a] = v;
+		mem[a - 0x2000]  = v;
 
-        switch (a)
-        {
-            case 0xFFFC:
-                printf("Persistent RAM");
-                break;
-            case 0xFFFD:
-                printf("Switch mapper slot 0 to %d\n", (v & nbank-1));
-                slotaddr[0] = (v & nbank-1) * 0x4000;
-                break;
-            case 0xFFFE:
-                printf("Switch mapper slot 1 to %d\n", (v & nbank-1));
-                slotaddr[1] = (v & nbank-1) * 0x4000;
-                break;
-            case 0xFFFF:
-                printf("Switch mapper slot 2 to %d\n", (v & nbank-1));
-                slotaddr[2] = (v & nbank-1) * 0x4000;
-                break;
+		switch (a)
+		{
+			case 0xFFFC:
+				ram_bank = (v & (1 << 2)) != 0 ? 0x4000 : 0;
+				printf("RAM bank %x\n", ram_bank);
+				ram_enabled = (v & (1 << 3)) != 0 ? 1 : 0;
+				printf("RAM enabled %x\n", ram_enabled);
+				break;
+			case 0xFFFD:
+				printf("Switch mapper slot 0 to %d\n", (v & nbank-1));
+				slotaddr[0] = (v & nbank-1) * 0x4000;
+				break;
+			case 0xFFFE:
+				printf("Switch mapper slot 1 to %d\n", (v & nbank-1));
+				slotaddr[1] = (v & nbank-1) * 0x4000;
+				break;
+			case 0xFFFF:
+				printf("Switch mapper slot 2 to %d\n", (v & nbank-1));
+				slotaddr[2] = (v & nbank-1) * 0x4000;
+				break;
 		}
 	}
 }
@@ -86,10 +100,23 @@
 uint8_t
 z80in(uint8_t a)
 {
+	printf("z80in %x\n", a);
+	if (a == 0xBF)
+		return 0x1F;
 	return 0xff;
 }
 
 void
-z80out(uint8_t a, uint8_t b)
+z80out(uint8_t port, uint8_t v)
 {
+	printf("z80out %x %x\n", port, v);
+
+	if (port < 0x40)
+		printf("  write to control register\n");
+	else if ((port >= 0x40) && (port < 0x80))
+		printf("  write to SN76489 PSG\n");
+	else if ((port >= 0x80) && (port < 0xC0))
+		printf("  write to VDP\n");
+	else
+		printf("  write with no effect\n");
 }
--- a/sms.c
+++ b/sms.c
@@ -15,8 +15,6 @@
 uint32_t r[16], pc, curpc;
 extern uint16_t spc, scurpc, sp;
 uint32_t asp, irq, stop;
-uint8_t *sram;
-uint32_t sramctl, nsram, sram0, sram1;
 int doflush = 0;
 // uint8_t header[0x7fff];
 // uint8_t *prg = NULL;
--- a/z80.c
+++ b/z80.c
@@ -109,6 +109,7 @@
 static int
 alu(uint8_t op, uint8_t n)
 {
+	printf("alu %x %x\n", op, n);
 	uint8_t v4;
 	uint8_t u;
 	uint16_t v;
@@ -149,13 +150,13 @@
 		v4 = (s[rA] & 0x0f) + (~u & 0x0f) + (~s[rF] & 1);
 		v = s[rA] + (u ^ 0xff) + (~s[rF] & 1);
 		break;
-	case 4: v = s[rA] & u; break;
-	case 5: v = s[rA] ^ u; break;
-	case 6: v = s[rA] | u; break;
+	case 4: {v = s[rA] & u; printf("result: %x <= %x & %x\n", (uint8_t)v, s[rA], u);} break;
+	case 5: {v = s[rA] ^ u; printf("result: %x <= %x ^ %x\n", (uint8_t)v, s[rA], u);} break;
+	case 6: {v = s[rA] | u; printf("result: %x <= %x | %x\n", (uint8_t)v, s[rA], u);} break;
 	}
 	s[rF] = 0;
 	if((uint8_t)v == 0)
-		s[rF] |= FLAGZ;
+		{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 	if((v & 0x80) != 0)
 		s[rF] |= FLAGS;
 	if(op < 2){
@@ -188,7 +189,9 @@
 branch(int cc, int t)
 {
 	uint16_t v;
-	
+
+	printf("branch %x %x\n", cc, t);
+
 	v = (int8_t)fetch8();
 	if(!cc)
 		return t + 7;
@@ -202,7 +205,7 @@
 	s[rF] &= FLAGC;
 	++v;
 	if(v == 0)
-		s[rF] |= FLAGZ;
+		{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 	if((v & 0x80) != 0)
 		s[rF] |= FLAGS;
 	if(v == 0x80)
@@ -218,7 +221,7 @@
 	--v;
 	s[rF] = s[rF] & FLAGC | FLAGN;
 	if(v == 0)
-		s[rF] |= FLAGZ;
+		{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 	if((v & 0x80) != 0)
 		s[rF] |= FLAGS;
 	if(v == 0x7f)
@@ -257,7 +260,7 @@
 	if((v4 & 0x1000) != 0)
 		s[rF] |= FLAGH;
 	if((uint16_t)v == 0)
-		s[rF] |= FLAGZ;
+		{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 	if((v & 0x8000) != 0)
 		s[rF] |= FLAGS;
 	if((~(HL() ^ u) & (HL() ^ v) & 0x8000) != 0)
@@ -279,7 +282,7 @@
 	if((v4 & 0x1000) == 0)
 		s[rF] |= FLAGH;
 	if((uint16_t)v == 0)
-		s[rF] |= FLAGZ;
+		{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 	if((v & 0x8000) != 0)
 		s[rF] |= FLAGS;
 	if(((HL() ^ u) & (HL() ^ v) & 0x8000) != 0)
@@ -377,7 +380,7 @@
 		case 7:  s[rF] = v & 1; v >>= 1; break;
 		}
 		if(v == 0)
-			s[rF] |= FLAGZ;
+			{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 		if((v & 0x80) != 0)
 			s[rF] |= FLAGS;
 		if(!parity(v))
@@ -386,7 +389,7 @@
 	case 1:
 		s[rF] = s[rF] & ~(FLAGN|FLAGZ) | FLAGH;
 		if((v & 1<<m) == 0)
-			s[rF] |= FLAGZ;
+			{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 		return t;
 	case 2:
 		v &= ~(1<<m);
@@ -425,7 +428,7 @@
 			if((v & 0x80) != 0)
 				s[rF] |= FLAGS;
 			if(v == 0)
-				s[rF] |= FLAGZ;
+				{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 			if((s[rA] & 0xf) < (u & 0xf))
 				s[rF] |= FLAGH;
 			break;
@@ -464,7 +467,7 @@
 		s[rA] = -s[rA];
 		s[rF] = FLAGN;
 		if(s[rA] == 0)
-			s[rF] |= FLAGZ;
+			{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 		else
 			s[rF] |= FLAGC;
 		if((s[rA] & 0x80) != 0)
@@ -490,7 +493,7 @@
 		}
 		s[rF] &= FLAGC;
 		if(s[rA] == 0)
-			s[rF] |= FLAGZ;
+			{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 		if((s[rA] & 0x80) != 0)
 			s[rF] |= FLAGS;
 		if(!parity(s[rA]))
@@ -507,9 +510,9 @@
 	case 0x4d: spc = pop16(); return 14;
 	case 0x5e: intm = intm & 0xc0 | 2; return 8;
 	case 0x4f: return 9;
-	case 0x78: printf("- ed78\n"); return 0;
-	case 0x61: printf("- ed61\n"); return 0;
-	case 0x69: printf("- ed69\n"); return 0;
+	case 0x78: s[rA] = z80in(s[rC]); return 12;
+	case 0x61: z80out(s[rC], s[rH]); return 12;
+	case 0x69: z80out(s[rC], s[rL]); return 12;
 	}
 	sysfatal("undefined z80 opcode ed%.2x at pc=%#.4x", op, scurpc);
 	return 0;
@@ -628,7 +631,7 @@
 		}
 	}
 	scurpc = spc;
-	if(1)
+	if(0)
 		printf("%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();
 	printf("op: %x\n", op);
@@ -695,7 +698,7 @@
 		if(!parity(s[rA]))
 			s[rF] |= FLAGV;
 		if(s[rA] == 0)
-			s[rF] |= FLAGZ;
+			{ s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }
 		if((s[rA] & 0x80) != 0)
 			s[rF] |= FLAGS;
 		return 4;
@@ -784,7 +787,7 @@
 	case 0xd7: return call(0x10, 1);
 	case 0xe7: return call(0x20, 1);
 	case 0xf7: return call(0x30, 1);
-	case 0xc8: if((s[rF] & FLAGZ) != 0) {spc = pop16(); return 11;} return 5;
+	case 0xc8: if((s[rF] & FLAGZ) != 0) {spc = pop16(); return 11;} return 5; // s[rF] should be 44 not 84
 	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;
--