X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=z80comp2;a=blobdiff_plain;f=emu%2Fsrc%2Femu.c;fp=emu%2Fsrc%2Femu.c;h=01f798a56ccb41cb9b0a13d5adeab590dadb559a;hp=0000000000000000000000000000000000000000;hb=a0a85eb847ff3bb5da13e78618efdcd1b9f588cf;hpb=b55f31d1ac4a1991f2ad7b2d17be06969ea25e47 diff --git a/emu/src/emu.c b/emu/src/emu.c new file mode 100644 index 0000000..01f798a --- /dev/null +++ b/emu/src/emu.c @@ -0,0 +1,74 @@ +#include +#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); +}