static uint8_t *memory = NULL;
static uint32_t memory_size = 0;
static uint16_t *chipreg = NULL;
+static uint16_t (*io_read)(uint32_t address) = NULL;
+static void (*io_write)(uint32_t address, uint16_t value) = NULL;
-static uint16_t read_io(unsigned int address)
+
+static uint16_t read_io_16(unsigned int address)
{
#ifdef DEBUG_CPU
printf("Chip read from 0x%08x\n", address);
#endif
- return emulate_io_read(address);
+ return io_read(address);
}
-static void write_io(unsigned int address, uint16_t value)
+static void write_io_16(unsigned int address, uint16_t value)
{
#ifdef DEBUG_CPU
printf("Chip write to 0x%08x\n", address);
#endif
if ((address & IOMASK) == IOBASE)
chipreg[address & ~IOMASK] = value;
- emulate_io_write(address, value);
+ io_write(address, value);
}
unsigned int m68k_read_memory_8(unsigned int address)
if (address > memory_size - 1) {
if ((address & 1)) {
/* read lower (right) byte */
- return read_io(address & ~1);
+ return read_io_16(address & ~1);
} else {
/* read upper (left) byte */
- return read_io(address) >> 8;
+ return read_io_16(address) >> 8;
}
}
return *((uint8_t *)(memory + address));
unsigned int m68k_read_memory_16(unsigned int address)
{
if (address > memory_size - 2) {
- return read_io(address);
+ return read_io_16(address);
}
return (memory[address] << 8) |
memory[address + 1];
{
if (address > memory_size - 4) {
int32_t value;
- value = read_io(address) << 16;
- value |= read_io(address + 2);
+ value = read_io_16(address) << 16;
+ value |= read_io_16(address + 2);
return value;
}
return (memory[address] << 24)|
if (address > memory_size - 1) {
if ((address & 1)) {
/* write lower (right) byte */
- write_io(address & ~1, 0xff00 | value);
+ write_io_16(address & ~1, 0xff00 | value);
} else {
/* write upper (left) byte */
- write_io(address, 0x00ff | (value << 8));
+ write_io_16(address, 0x00ff | (value << 8));
}
return;
}
void m68k_write_memory_16(unsigned int address, unsigned int value)
{
if (address > memory_size - 2) {
- write_io(address, value);
+ write_io_16(address, value);
return;
}
memory[address] = value >> 8;
void m68k_write_memory_32(unsigned int address, unsigned int value)
{
if (address > memory_size - 4) {
- write_io(address, value >> 16);
- write_io(address + 2, value);
+ write_io_16(address, value >> 16);
+ write_io_16(address + 2, value);
return;
}
memory[address] = value >> 24;
memory[address + 3] = value;
}
-void execute_init(int32_t _memory_size, uint8_t *_memory, uint16_t *_chipreg)
+void execute_init(int32_t _memory_size, uint8_t *_memory, uint16_t *_chipreg, uint16_t (*_io_read)(uint32_t address), void (*_io_write)(uint32_t address, uint16_t value))
{
memory_size = _memory_size;
memory = _memory;
chipreg = _chipreg;
+ io_read = _io_read;
+ io_write = _io_write;
/* init CPU */
m68k_init();