]> git.sesse.net Git - pistorm/blobdiff - emulator.c
Add some more Mac68k handling stuff
[pistorm] / emulator.c
index 0ea23f0430b8a6933d3b3ba30c6f38a0e467b2f4..968f52e7bd430c988034566d401d08039c322d37 100644 (file)
 
 #define KEY_POLL_INTERVAL_MSEC 5000
 
-unsigned char read_ranges;
-unsigned int read_addr[8];
-unsigned int read_upper[8];
-unsigned char *read_data[8];
-unsigned char write_ranges;
-unsigned int write_addr[8];
-unsigned int write_upper[8];
-unsigned char *write_data[8];
-address_translation_cache code_translation_cache = {0};
-
 int kb_hook_enabled = 0;
 int mouse_hook_enabled = 0;
 int cpu_emulation_running = 1;
@@ -191,7 +181,8 @@ void *ipl_task(void *args) {
 }
 
 void *cpu_task() {
-  m68k_pulse_reset();
+       m68ki_cpu_core *state = &m68ki_cpu;
+       m68k_pulse_reset(state);
 
 cpu_loop:
   if (mouse_hook_enabled) {
@@ -207,39 +198,28 @@ cpu_loop:
     printf("%.8X (%.8X)]] %s\n", m68k_get_reg(NULL, M68K_REG_PC), (m68k_get_reg(NULL, M68K_REG_PC) & 0xFFFFFF), disasm_buf);
     if (do_disasm)
       do_disasm--;
-    m68k_execute(1);
+         m68k_execute(state, 1);
   }
   else {
-    if (cpu_emulation_running)
-      m68k_execute(loop_cycles);
+    if (cpu_emulation_running) {
+               if (irq)
+                       m68k_execute(state, 5);
+               else
+                       m68k_execute(state, loop_cycles);
+    }
   }
 
   if (irq) {
-    while (irq) {
       last_irq = ((read_reg() & 0xe000) >> 13);
       if (last_irq != last_last_irq) {
         last_last_irq = last_irq;
         M68K_SET_IRQ(last_irq);
       }
-      m68k_execute(5);
-    }
-    if (gayleirq && int2_enabled) {
-      write16(0xdff09c, 0x8000 | (1 << 3) && last_irq != 2);
-      last_last_irq = last_irq;
-      last_irq = 2;
-      M68K_SET_IRQ(2);
-    }
+  } else if (!irq && last_last_irq != 0) {
     M68K_SET_IRQ(0);
     last_last_irq = 0;
-    m68k_execute(5);
   }
-  /*else {
-    if (last_irq != 0) {
-      M68K_SET_IRQ(0);
-      last_last_irq = last_irq;
-      last_irq = 0;
-    }
-  }*/
+
   if (do_reset) {
     cpu_pulse_reset();
     do_reset=0;
@@ -587,7 +567,7 @@ switch_config:
 
   m68k_init();
   printf("Setting CPU type to %d.\n", cpu_type);
-  m68k_set_cpu_type(cpu_type);
+       m68k_set_cpu_type(&m68ki_cpu, cpu_type);
   cpu_pulse_reset();
 
   pthread_t ipl_tid = 0, cpu_tid, kbd_tid;
@@ -647,16 +627,14 @@ switch_config:
 }
 
 void cpu_pulse_reset(void) {
+       m68ki_cpu_core *state = &m68ki_cpu;
   ps_pulse_reset();
-  if (cfg->platform->handle_reset)
-    cfg->platform->handle_reset(cfg);
 
-  //m68k_write_memory_16(INTENA, 0x7FFF);
   ovl = 1;
-  //m68k_write_memory_8(0xbfe201, 0x0001);  // AMIGA OVL
-  //m68k_write_memory_8(0xbfe001, 0x0001);  // AMIGA OVL high (ROM@0x0)
+  if (cfg->platform->handle_reset)
+    cfg->platform->handle_reset(cfg);
 
-  m68k_pulse_reset();
+       m68k_pulse_reset(state);
 }
 
 int cpu_irq_ack(int level) {
@@ -697,8 +675,7 @@ static inline void inline_write_16(unsigned int address, unsigned int data) {
   *(gpio + 1) = GPFSEL1_INPUT;
   *(gpio + 2) = GPFSEL2_INPUT;
 
-  while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS))
-    ;
+  while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS)) {}
 }
 
 static inline void inline_write_8(unsigned int address, unsigned int data) {
@@ -730,8 +707,7 @@ static inline void inline_write_8(unsigned int address, unsigned int data) {
   *(gpio + 1) = GPFSEL1_INPUT;
   *(gpio + 2) = GPFSEL2_INPUT;
 
-  while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS))
-    ;
+  while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS)) {}
 }
 
 static inline void inline_write_32(unsigned int address, unsigned int value) {
@@ -761,9 +737,8 @@ static inline unsigned int inline_read_16(unsigned int address) {
   *(gpio + 7) = (REG_DATA << PIN_A0);
   *(gpio + 7) = 1 << PIN_RD;
 
+  while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS)) {}
   unsigned int value = *(gpio + 13);
-  while ((value=*(gpio + 13)) & (1 << PIN_TXN_IN_PROGRESS))
-    ;
 
   *(gpio + 10) = 0xffffec;
 
@@ -792,9 +767,8 @@ static inline unsigned int inline_read_8(unsigned int address) {
   *(gpio + 7) = (REG_DATA << PIN_A0);
   *(gpio + 7) = 1 << PIN_RD;
 
+  while (*(gpio + 13) & (1 << PIN_TXN_IN_PROGRESS)) {}
   unsigned int value = *(gpio + 13);
-  while ((value=*(gpio + 13)) & (1 << PIN_TXN_IN_PROGRESS))
-    ;
 
   *(gpio + 10) = 0xffffec;
 
@@ -971,6 +945,21 @@ unsigned int m68k_read_memory_32(unsigned int address) {
 
 static inline int32_t platform_write_check(uint8_t type, uint32_t addr, uint32_t val) {
   switch (cfg->platform->id) {
+    case PLATFORM_MAC:
+      switch (addr) {
+        case 0xEFFFFE: // VIA1?
+          if (val & 0x10 && !ovl) {
+              ovl = 1;
+              printf("[MAC] OVL on.\n");
+              handle_ovl_mappings_mac68k(cfg);
+          } else if (ovl) {
+            ovl = 0;
+            printf("[MAC] OVL off.\n");
+            handle_ovl_mappings_mac68k(cfg);
+          }
+          break;
+      }
+      break;
     case PLATFORM_AMIGA:
       switch (addr) {
         case CIAAPRA: