- reorganized project directory structure
[z80comp2] / emu / src / emu.c
diff --git a/emu/src/emu.c b/emu/src/emu.c
new file mode 100644 (file)
index 0000000..01f798a
--- /dev/null
@@ -0,0 +1,74 @@
+#include <stdlib.h>
+#include "emu.h"
+#include "cpu.h"
+#include "duart.h"
+
+#define RAM_SIZE       0x8000
+static uint8_t ram[RAM_SIZE];
+static uint8_t *rom;
+static int rom_size;
+
+int emu_init(void *romimg, int romsz)
+{
+       rom = romimg;
+       rom_size = romsz;
+
+       emu_reset();
+       return 0;
+}
+
+void emu_reset(void)
+{
+       cpu_reset();
+       duart_reset();
+}
+
+void emu_cleanup(void)
+{
+}
+
+void emu_step(void)
+{
+       cpu_step();
+}
+
+uint8_t emu_mem_read(uint16_t addr)
+{
+       if(addr & 0x8000) {     /* RAM */
+               return ram[addr & 0x7fff];
+       } else { /* ROM */
+               if((int)addr < rom_size) {
+                       return rom[addr];
+               }
+       }
+       return 0;
+}
+
+void emu_mem_write(uint16_t addr, uint8_t data)
+{
+       if(addr & 0x8000) {
+               ram[addr & 0x7fff] = data;
+       }
+}
+
+uint8_t emu_io_read(uint16_t addr)
+{
+       if((addr & 0xf0) == 0) {
+               return duart_read(addr & 0xf);
+       }
+
+       /* nothing is enabled, the bus floats, return random bits */
+       return rand();
+}
+
+void emu_io_write(uint16_t addr, uint8_t data)
+{
+       if((addr & 0xf0) == 0) {
+               duart_write(addr & 0xf, data);
+       }
+}
+
+void emu_serin(int port, int c)
+{
+       duart_serin(port, c);
+}