diff upd78k2_util.c @ 2716:033d8d4308e3

Fix enough issues in uPD78K/II core so that LaserActive firmware regularly polls front-panel button state
author Michael Pavone <pavone@retrodev.com>
date Sat, 12 Jul 2025 22:25:20 -0700
parents d30e7f605ff8
children 8ce5d1a7ef54
line wrap: on
line diff
--- a/upd78k2_util.c	Fri Jul 11 10:55:33 2025 -0700
+++ b/upd78k2_util.c	Sat Jul 12 22:25:20 2025 -0700
@@ -188,11 +188,27 @@
 uint8_t upd78237_sfr_read(uint32_t address, void *context)
 {
 	upd78k2_context *upd = context;
-	if (address < 8) {
-		return upd->port_data[address];
-	}
 	switch (address)
 	{
+	case 0x00:
+	case 0x04:
+	case 0x05:
+	case 0x06:
+		return upd->port_data[address];
+	case 0x02:
+	case 0x07:
+		//input only
+		if (upd->io_read) {
+			upd->io_read(upd, address);
+		}
+		return upd->port_input[address];
+		break;
+	case 0x01:
+	case 0x03:
+		if (upd->io_read) {
+			upd->io_read(upd, address);
+		}
+		return (upd->port_input[address] & upd->port_mode[address]) | (upd->port_data[address] & ~upd->port_mode[address]);
 	case 0x10:
 		return upd->cr00;
 	case 0x11:
@@ -262,6 +278,9 @@
 		case 0x06:
 			printf("P%X: %02X\n", address & 7, value);
 			upd->port_data[address & 7] = value;
+			if (upd->io_write) {
+				upd->io_write(upd, address);
+			}
 			break;
 		case 0x10:
 			upd78k2_update_timer0(upd);
@@ -400,9 +419,11 @@
 			printf("ISM0: %04X\n", upd->ism0);
 			break;
 		case 0xF4:
+			printf("INTM0: %02X\n", value);
 			upd->intm0 = value;
 			break;
 		case 0xF5:
+			printf("INTM1: %02X\n", value);
 			upd->intm1 = value;
 			break;
 		case 0xF8: