diff upd78k2_util.c @ 2706:0bd48217941a

Get uPD78K/II core done enough to run the LaserActive firmware main loop
author Michael Pavone <pavone@retrodev.com>
date Sun, 06 Jul 2025 20:09:32 -0700
parents ab2d916380bf
children
line wrap: on
line diff
--- a/upd78k2_util.c	Sun Jul 06 15:20:46 2025 -0700
+++ b/upd78k2_util.c	Sun Jul 06 20:09:32 2025 -0700
@@ -28,6 +28,28 @@
 		return upd->port_mode[address & 0x7];
 	case 0xC4:
 		return upd->mm;
+	case 0xE0:
+		return upd->if0;
+	case 0xE1:
+		return upd->if0 >> 8;
+	case 0xE4:
+		return upd->mk0;
+	case 0xE5:
+		return upd->mk0 >> 8;
+	case 0xE8:
+		return upd->pr0;
+	case 0xE9:
+		return upd->pr0 >> 8;
+	case 0xEC:
+		return upd->ism0;
+	case 0xED:
+		return upd->ism0 >> 8;
+	case 0xF4:
+		return upd->intm0;
+	case 0xF5:
+		return upd->intm1;
+	case 0xF8:
+		return upd->ist;
 	default:
 		fprintf(stderr, "Unhandled uPD78237 SFR read %02X\n", address);
 		return 0xFF;
@@ -51,6 +73,47 @@
 		case 0xC4:
 			upd->mm = value;
 			break;
+		case 0xE0:
+			upd->if0 &= 0xFF00;
+			upd->if0 |= value;
+			break;
+		case 0xE1:
+			upd->if0 &= 0xFF;
+			upd->if0 |= value << 8;
+			break;
+		case 0xE4:
+			upd->mk0 &= 0xFF00;
+			upd->mk0 |= value;
+			break;
+		case 0xE5:
+			upd->mk0 &= 0xFF;
+			upd->mk0 |= value << 8;
+			break;
+		case 0xE8:
+			upd->pr0 &= 0xFF00;
+			upd->pr0 |= value;
+			break;
+		case 0xE9:
+			upd->pr0 &= 0xFF;
+			upd->pr0 |= value << 8;
+			break;
+		case 0xEC:
+			upd->ism0 &= 0xFF00;
+			upd->ism0 |= value;
+			break;
+		case 0xED:
+			upd->ism0 &= 0xFF;
+			upd->ism0 |= value << 8;
+			break;
+		case 0xF4:
+			upd->intm0 = value;
+			break;
+		case 0xF5:
+			upd->intm1 = value;
+			break;
+		case 0xF8:
+			upd->ist = value;
+			break;
 		default:
 			fprintf(stderr, "Unhandled uPD78237 SFR write %02X: %02X\n", address, value);
 			break;
@@ -75,3 +138,7 @@
 	return context;
 }
 
+void upd78k2_sync_cycle(upd78k2_context *upd, uint32_t target_cycle)
+{
+	//TODO: implement me
+}