shithub: sms

Download patch

ref: e1dfe664672f3520ecfccefd0fe6a9c1a8d38c0f
parent: 47cf02e0c5a922a7d6d01eb3dffdd1fe56978362
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Sat Mar 7 16:24:23 EST 2026

Implement some missing ed opcodes

--- a/z80.c
+++ b/z80.c
@@ -443,6 +443,32 @@
 }
 
 static int
+in_c(int dst)
+{
+	u8int v = z80in(s[rC]);
+
+	if(dst >= 0)
+		s[dst] = v;
+
+	s[rF] &= FLAGC;
+	if(v == 0)
+		s[rF] |= FLAGZ;
+	if((v & 0x80) != 0)
+		s[rF] |= FLAGS;
+	if(!parity(v))
+		s[rF] |= FLAGV;
+	if((v & 0x08) != 0)
+		s[rF] |= FLAGX;
+	else
+		s[rF] &= ~FLAGX;
+	if((v & 0x20) != 0)
+		s[rF] |= FLAGY;
+	else
+		s[rF] &= ~FLAGY;
+	return 12;
+}
+
+static int
 ed(void)
 {
 	u8int op, v, u, l;
@@ -646,24 +672,21 @@
 	case 0x5e: intm = intm & 0xc0 | 2; return 8;
 	case 0x4f: return 9;
 	case 0x5f: return 9;
-	case 0x78:
-		s[rA] = z80in(s[rC]);
-		s[rF] &= FLAGC;
-		if(s[rA] == 0)
-			s[rF] |= FLAGZ;
-		if((s[rA] & 0x80) != 0)
-			s[rF] |= FLAGS;
-		if(!parity(s[rA]))
-			s[rF] |= FLAGV;
-		if ((s[rA] & 0x08) != 0) s[rF] |= FLAGX; else s[rF] &= ~FLAGX;
-		if ((s[rA] & 0x20) != 0) s[rF] |= FLAGY; else s[rF] &= ~FLAGY;
-		return 12;
+	case 0x40: return in_c(rB);
 	case 0x41: z80out(s[rC], s[rB]); return 12;
+	case 0x48: return in_c(rC);
 	case 0x51: z80out(s[rC], s[rD]); return 12;
+	case 0x50: return in_c(rD);
 	case 0x61: z80out(s[rC], s[rH]); return 12;
+	case 0x60: return in_c(rH);
 	case 0x49: z80out(s[rC], s[rC]); return 12;
 	case 0x59: z80out(s[rC], s[rE]); return 12;
 	case 0x69: z80out(s[rC], s[rL]); return 12;
+	case 0x58: return in_c(rE);
+	case 0x68: return in_c(rL);
+	case 0x70: return in_c(-1);
+	case 0x71: z80out(s[rC], 0); return 12;
+	case 0x78: return in_c(rA);
 	case 0x79: z80out(s[rC], s[rA]); return 12;
 	}
 	sysfatal("undefined z80 opcode ed%.2x at pc=%#.4x", op, scurpc);
--