while (1) {
value = *(gpio + 13);
+ if (value & (1 << PIN_TXN_IN_PROGRESS))
+ goto noppers;
if (!(value & (1 << PIN_IPL_ZERO))) {
old_irq = irq_delay;
}*/
//usleep(0);
//NOP NOP
+noppers:
NOP NOP NOP NOP NOP NOP NOP NOP
//NOP NOP NOP NOP NOP NOP NOP NOP
//NOP NOP NOP NOP NOP NOP NOP NOP
return args;
}
+static inline unsigned int inline_read_status_reg() {
+ *(gpio + 7) = (REG_STATUS << PIN_A0);
+ *(gpio + 7) = 1 << PIN_RD;
+ *(gpio + 7) = 1 << PIN_RD;
+ *(gpio + 7) = 1 << PIN_RD;
+ *(gpio + 7) = 1 << PIN_RD;
+
+ unsigned int value = *(gpio + 13);
+
+ *(gpio + 10) = 0xffffec;
+
+ return (value >> 8) & 0xffff;
+}
+
void *cpu_task() {
- m68k_pulse_reset();
+ m68ki_cpu_core *state = &m68ki_cpu;
+ m68k_pulse_reset(state);
cpu_loop:
if (mouse_hook_enabled) {
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);
+ while (irq) {
+ last_irq = ((inline_read_status_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);
- }
+ m68k_execute(state, 50);
+ }
+ 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;
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;
}
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) {
*(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) {
*(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) {
*(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;
*(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;
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;
}