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);--
⑨