ref: 3774586cf5fa1e79538ef024f48017a7090bcfe6
parent: 80af738289152b503fa3547a9e40b5b56cfb353b
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Wed Feb 18 17:08:05 EST 2026
Fix ed block IO
--- a/z80.c
+++ b/z80.c
@@ -459,9 +459,118 @@
pc -= 2;
return 21;
}
- }else
+ }else{s[rF] &= ~FLAGV;
+ }
return 16;
+ case 0xa2: /* INI */
+ v = z80in(s[rC]);
+ z80write(HL(), v);
+ if((++s[rL]) == 0)
+ ++s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else
+ s[rF] |= FLAGV;
+ return 16;
+ case 0xb2: /* INIR */
+ v = z80in(s[rC]);
+ z80write(HL(), v);
+ if((++s[rL]) == 0)
+ ++s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else{+ s[rF] |= FLAGV;
+ pc -= 2;
+ return 21;
+ }
+ return 16;
+ case 0xaa: /* IND */
+ v = z80in(s[rC]);
+ z80write(HL(), v);
+ if((s[rL]--) == 0)
+ --s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else
+ s[rF] |= FLAGV;
+ return 16;
+ case 0xba: /* INDR */
+ v = z80in(s[rC]);
+ z80write(HL(), v);
+ if((s[rL]--) == 0)
+ --s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else{+ s[rF] |= FLAGV;
+ pc -= 2;
+ return 21;
+ }
+ return 16;
+ case 0xa3: /* OUTI */
+ v = z80read(HL());
+ z80out(s[rC], v);
+ if((++s[rL]) == 0)
+ ++s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else
+ s[rF] |= FLAGV;
+ return 16;
+ case 0xb3: /* OTIR */
+ v = z80read(HL());
+ z80out(s[rC], v);
+ if((++s[rL]) == 0)
+ ++s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else{+ s[rF] |= FLAGV;
+ pc -= 2;
+ return 21;
+ }
+ return 16;
+ case 0xab: /* OUTD */
+ v = z80read(HL());
+ z80out(s[rC], v);
+ if((s[rL]--) == 0)
+ --s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else
+ s[rF] |= FLAGV;
+ return 16;
+ case 0xbb: /* OTDR */
+ v = z80read(HL());
+ z80out(s[rC], v);
+ if((s[rL]--) == 0)
+ --s[rH];
+ --s[rB];
+ s[rF] = (s[rF] & FLAGC) | FLAGN;
+ if(s[rB] == 0)
+ s[rF] |= FLAGZ;
+ else{+ s[rF] |= FLAGV;
+ pc -= 2;
+ return 21;
+ }
+ return 16;
case 0x42: sbchl(BC()); return 15;
case 0x52: sbchl(DE()); return 15;
case 0x62: sbchl(HL()); return 15;
@@ -537,37 +646,6 @@
case 0x59: z80out(s[rC], s[rE]); return 12;
case 0x69: z80out(s[rC], s[rL]); return 12;
case 0x79: z80out(s[rC], s[rA]); return 12;
- case 0xb3:
- s[rB]--;
- u8int u = z80read(HL());
- z80out(s[rC], u);
- addhl(1);
- if (s[rB] == 0) s[rF] |= FLAGZ; else s[rF] &= ~FLAGZ;
- if (u & 0x80) s[rF] |= FLAGN; else s[rF] &= ~FLAGN;
- if (s[rL] + u > 0xff) s[rF] |= (FLAGC|FLAGH); else s[rF] &= ~(FLAGC|FLAGH);
- if (((s[rL] + u) & 0x07) ^ s[rB]) s[rF] |= FLAGV; else s[rF] &= ~FLAGV;
- if ((s[rB] & 0x08) != 0) s[rF] |= FLAGX; else s[rF] &= ~FLAGX;
- if ((s[rB] & 0x20) != 0) s[rF] |= FLAGY; else s[rF] &= ~FLAGY;
- if (s[rB] != 0) { pc -= 2; return 21; }- return 16;
- case 0xa3:
- s[rB]--;
- u = z80read(HL());
- z80out(s[rC], u);
- addhl(1);
- if (u & 0x80) s[rF] |= FLAGN; else s[rF] &= ~FLAGN;
- if (s[rL] + u > 0xff) s[rF] |= (FLAGC|FLAGH); else s[rF] &= ~(FLAGC|FLAGH);
- if (((s[rL] + u) & 0x07) ^ s[rB]) s[rF] |= FLAGV; else s[rF] &= ~FLAGV;
- return 16;
- case 0xab:
- s[rB]--;
- u = z80read(HL());
- z80out(s[rC], u);
- addhl(-1);
- if (u & 0x80) s[rF] |= FLAGN; else s[rF] &= ~FLAGN;
- if (s[rL] + u > 0xff) s[rF] |= (FLAGC|FLAGH); else s[rF] &= ~(FLAGC|FLAGH);
- if (((s[rL] + u) & 0x07) ^ s[rB]) s[rF] |= FLAGV; else s[rF] &= ~FLAGV;
- return 16;
}
sysfatal("undefined z80 opcode ed%.2x at pc=%#.4x", op, curpc);}
@@ -905,4 +983,4 @@
s[rE] = 0x00;
s[rH] = 0x00;
s[rL] = 0x00;
-}
\ No newline at end of file
+}
--
⑨