summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blastcpm.c28
-rwxr-xr-xcpu_dsl.py11
-rw-r--r--z80.cpu3
-rw-r--r--z80_util.c26
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 <string.h>
#include <sys/select.h>
+#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