shithub: sms

Download patch

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
+}
--