diff upd78k2_util.c @ 2705:ab2d916380bf

WIP uPD78K/II CPU core
author Michael Pavone <pavone@retrodev.com>
date Sun, 06 Jul 2025 15:20:46 -0700
parents
children 0bd48217941a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upd78k2_util.c	Sun Jul 06 15:20:46 2025 -0700
@@ -0,0 +1,77 @@
+#include <string.h>
+
+void upd78k2_read_8(upd78k2_context *upd)
+{
+	uint32_t tmp = upd->scratch1;
+	upd->scratch1 = read_byte(upd->scratch1, (void **)upd->mem_pointers, &upd->opts->gen, upd);
+	if (tmp == upd->pc) {
+		printf("uPD78K/II fetch %04X: %02X, AX=%02X%02X BC=%02X%02X DE=%02X%02X HL=%02X%02X SP=%04X\n", tmp, upd->scratch1,
+			upd->main[1], upd->main[0], upd->main[3], upd->main[2], upd->main[5], upd->main[4], upd->main[7], upd->main[6], upd->sp);
+	}
+}
+
+void upd78k2_write_8(upd78k2_context *upd)
+{
+	write_byte(upd->scratch2, upd->scratch1, (void **)upd->mem_pointers, &upd->opts->gen, upd);
+}
+
+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 0x21:
+	case 0x26:
+		return upd->port_mode[address & 0x7];
+	case 0xC4:
+		return upd->mm;
+	default:
+		fprintf(stderr, "Unhandled uPD78237 SFR read %02X\n", address);
+		return 0xFF;
+	}
+}
+
+void *upd78237_sfr_write(uint32_t address, void *context, uint8_t value)
+{
+	upd78k2_context *upd = context;
+	if (address < 8 && address != 2 && address != 7) {
+		upd->port_data[address] = value;
+	} else {
+		switch (address)
+		{
+		case 0x20:
+		case 0x23:
+		case 0x25:
+		case 0x26:
+			upd->port_mode[address & 7] = value;
+			break;
+		case 0xC4:
+			upd->mm = value;
+			break;
+		default:
+			fprintf(stderr, "Unhandled uPD78237 SFR write %02X: %02X\n", address, value);
+			break;
+		}
+	}
+	return context;
+}
+
+void init_upd78k2_opts(upd78k2_options *opts, memmap_chunk const *chunks, uint32_t num_chunks)
+{
+	memset(opts, 0, sizeof(*opts));
+	opts->gen.memmap = chunks;
+	opts->gen.memmap_chunks = num_chunks;
+	opts->gen.address_mask = 0xFFFFF;
+	opts->gen.max_address = 0xFFFFF;
+}
+
+upd78k2_context *init_upd78k2_context(upd78k2_options *opts)
+{
+	upd78k2_context *context = calloc(1, sizeof(upd78k2_context));
+	context->opts = opts;
+	return context;
+}
+