From d69482b7a3e0a3af3558f37a8a4fbd294308571b Mon Sep 17 00:00:00 2001 From: Michael Pavone Date: Sun, 3 Feb 2019 11:05:40 -0800 Subject: Get new Z80 core running in CPM harness --- blastcpm.c | 28 +++++++++++++++++++++++++++- cpu_dsl.py | 11 +++++++++-- z80.cpu | 3 +++ z80_util.c | 26 ++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/blastcpm.c b/blastcpm.c index 72a53cc..36fb3ae 100644 --- a/blastcpm.c +++ b/blastcpm.c @@ -4,7 +4,11 @@ #include #include +#ifdef NEW_CORE +#include "z80.h" +#else #include "z80_to_x86.h" +#endif #include "util.h" uint8_t ram[64 * 1024]; @@ -14,10 +18,12 @@ uint8_t ram[64 * 1024]; #define OS_RESET 0xE403 int headless = 1; +#ifndef NEW_CORE void z80_next_int_pulse(z80_context * context) { context->int_pulse_start = context->int_pulse_end = CYCLE_NEVER; } +#endif void render_errorbox(char *title, char *message) { @@ -65,7 +71,7 @@ const memmap_chunk z80_map[] = { { 0x0000, 0x10000, 0xFFFF, 0, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram, NULL, NULL, NULL, NULL}, }; -const memmap_chunk io_map[] = { +memmap_chunk io_map[] = { { 0x0, 0x1, 0xFFFF, 0, 0, 0, NULL, NULL, NULL, console_read, console_write}, { 0x1, 0x2, 0xFFFF, 0, 0, 0, NULL, NULL, NULL, console_status_read, console_flush_write}, { 0x2, 0x3, 0xFFFF, 0, 0, 0, NULL, NULL, NULL, NULL, exit_write}, @@ -101,12 +107,32 @@ int main(int argc, char **argv) z80_options opts; z80_context *context; +#ifdef NEW_CORE + memset(&opts, 0, sizeof(opts)); + opts.gen.memmap = z80_map; + opts.gen.memmap_chunks = 1; + opts.gen.address_mask = 0xFFFF; + opts.gen.max_address = 0xFFFF; + opts.gen.clock_divider = 1; + context = calloc(1, sizeof(z80_context)); + context->opts = &opts; + context->io_map = io_map; + context->io_chunks = 3; + context->io_mask = 0xFF; +#else init_z80_opts(&opts, z80_map, 1, io_map, 3, 1, 0xFF); context = init_z80_context(&opts); +#endif for(;;) { +#ifdef NEW_CORE + z80_execute(context, 1000000); + context->cycles = 0; +#else z80_run(context, 1000000); context->current_cycle = 0; +#endif + } return 0; } \ No newline at end of file diff --git a/cpu_dsl.py b/cpu_dsl.py index 062d2ac..d131a70 100755 --- a/cpu_dsl.py +++ b/cpu_dsl.py @@ -1026,7 +1026,7 @@ class Registers: self.addRegArray(parts[0], int(parts[1]), parts[2:]) else: if parts[1].startswith('ptr'): - self.addPointer(parts[0], int(parts[1][3:])) + self.addPointer(parts[0], parts[1][3:]) else: self.addReg(parts[0], int(parts[1])) return self @@ -1034,7 +1034,14 @@ class Registers: def writeHeader(self, otype, hFile): fieldList = [] for pointer in self.pointers: - hFile.write('\n\tuint{sz}_t *{nm};'.format(nm=pointer, sz=self.pointers[pointer])) + stars = '*' + ptype = self.pointers[pointer] + while ptype.startswith('ptr'): + stars += '*' + ptype = ptype[3:] + if ptype.isdigit(): + ptype = 'uint{sz}_t'.format(sz=ptype) + hFile.write('\n\t{ptype} {stars}{nm};'.format(nm=pointer, ptype=ptype, stars=stars)) for reg in self.regs: if not self.isRegArrayMember(reg): fieldList.append((self.regs[reg], 1, reg)) diff --git a/z80.cpu b/z80.cpu index c13d765..d09601e 100644 --- a/z80.cpu +++ b/z80.cpu @@ -27,6 +27,9 @@ regs zflag 8 scratch1 16 scratch2 16 + io_map ptrmemmap_chunk + io_chunks 32 + io_mask 32 flags register f diff --git a/z80_util.c b/z80_util.c index 6a4a556..39526aa 100644 --- a/z80_util.c +++ b/z80_util.c @@ -13,8 +13,34 @@ void z80_write_8(z80_context *context) void z80_io_read8(z80_context *context) { + uint32_t tmp_mask = context->opts->gen.address_mask; + memmap_chunk const *tmp_map = context->opts->gen.memmap; + uint32_t tmp_chunks = context->opts->gen.memmap_chunks; + + context->opts->gen.address_mask = context->io_mask; + context->opts->gen.memmap = context->io_map; + context->opts->gen.memmap_chunks = context->io_chunks; + + context->scratch1 = read_byte(context->scratch1, NULL, &context->opts->gen, context); + + context->opts->gen.address_mask = tmp_mask; + context->opts->gen.memmap = tmp_map; + context->opts->gen.memmap_chunks = tmp_chunks; } void z80_io_write8(z80_context *context) { + uint32_t tmp_mask = context->opts->gen.address_mask; + memmap_chunk const *tmp_map = context->opts->gen.memmap; + uint32_t tmp_chunks = context->opts->gen.memmap_chunks; + + context->opts->gen.address_mask = context->io_mask; + context->opts->gen.memmap = context->io_map; + context->opts->gen.memmap_chunks = context->io_chunks; + + write_byte(context->scratch2, context->scratch1, NULL, &context->opts->gen, context); + + context->opts->gen.address_mask = tmp_mask; + context->opts->gen.memmap = tmp_map; + context->opts->gen.memmap_chunks = tmp_chunks; } \ No newline at end of file -- cgit v1.2.3