Remove circular dependencies between libs, use callback function pointers instead
[mercenary-reloaded.git] / src / libcpu / execute.c
index cb97845..0b53f23 100644 (file)
 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)
@@ -56,10 +59,10 @@ 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));
@@ -68,7 +71,7 @@ unsigned int m68k_read_memory_8(unsigned int 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];
@@ -78,8 +81,8 @@ unsigned int m68k_read_memory_32(unsigned int address)
 {
        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)|
@@ -93,10 +96,10 @@ void m68k_write_memory_8(unsigned int address, unsigned int value)
        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;
        }
@@ -106,7 +109,7 @@ void m68k_write_memory_8(unsigned int address, unsigned int value)
 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;
@@ -116,8 +119,8 @@ void m68k_write_memory_16(unsigned int address, unsigned int value)
 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;
@@ -126,11 +129,13 @@ void m68k_write_memory_32(unsigned int address, unsigned int value)
        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();