+uint64_t trig_irq = 0, serv_irq = 0;
+uint16_t irq_delay = 0;
+unsigned int amiga_reset=0, amiga_reset_last=0;
+unsigned int do_reset=0;
+
+void *ipl_task(void *args) {
+ printf("IPL thread running\n");
+ uint16_t old_irq = 0;
+ uint32_t value;
+
+ while (1) {
+ value = *(gpio + 13);
+
+ if (!(value & (1 << PIN_IPL_ZERO))) {
+ old_irq = irq_delay;
+ //NOP
+ if (!irq) {
+ M68K_END_TIMESLICE;
+ NOP
+ irq = 1;
+ }
+ //usleep(0);
+ }
+ else {
+ if (irq) {
+ if (old_irq) {
+ old_irq--;
+ }
+ else {
+ irq = 0;
+ }
+ M68K_END_TIMESLICE;
+ NOP
+ //usleep(0);
+ }
+ }
+ if(do_reset==0)
+ {
+ amiga_reset=(value & (1 << PIN_RESET));
+ if(amiga_reset!=amiga_reset_last)
+ {
+ amiga_reset_last=amiga_reset;
+ if(amiga_reset==0)
+ {
+ printf("Amiga Reset is down...\n");
+ do_reset=1;
+ M68K_END_TIMESLICE;
+ }
+ else
+ {
+ printf("Amiga Reset is up...\n");
+ }
+ }
+ }
+
+ /*if (gayle_ide_enabled) {
+ if (((gayle_int & 0x80) || gayle_a4k_int) && (get_ide(0)->drive[0].intrq || get_ide(0)->drive[1].intrq)) {
+ //get_ide(0)->drive[0].intrq = 0;
+ gayleirq = 1;
+ M68K_END_TIMESLICE;
+ }
+ else
+ gayleirq = 0;
+ }*/
+ //usleep(0);
+ //NOP NOP
+ NOP NOP NOP NOP NOP NOP NOP NOP
+ //NOP NOP NOP NOP NOP NOP NOP NOP
+ //NOP NOP NOP NOP NOP NOP NOP NOP
+ /*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;
+}
+
+void *cpu_task() {
+ m68ki_cpu_core *state = &m68ki_cpu;
+ m68k_pulse_reset(state);
+
+cpu_loop:
+ if (mouse_hook_enabled) {
+ get_mouse_status(&mouse_dx, &mouse_dy, &mouse_buttons, &mouse_extra);
+ }
+
+ if (realtime_disassembly && (do_disasm || cpu_emulation_running)) {
+ m68k_disassemble(disasm_buf, m68k_get_reg(NULL, M68K_REG_PC), cpu_type);
+ printf("REGA: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1), m68k_get_reg(NULL, M68K_REG_A2), m68k_get_reg(NULL, M68K_REG_A3), \
+ m68k_get_reg(NULL, M68K_REG_A4), m68k_get_reg(NULL, M68K_REG_A5), m68k_get_reg(NULL, M68K_REG_A6), m68k_get_reg(NULL, M68K_REG_A7));
+ printf("REGD: 0:$%.8X 1:$%.8X 2:$%.8X 3:$%.8X 4:$%.8X 5:$%.8X 6:$%.8X 7:$%.8X\n", m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1), m68k_get_reg(NULL, M68K_REG_D2), m68k_get_reg(NULL, M68K_REG_D3), \
+ m68k_get_reg(NULL, M68K_REG_D4), m68k_get_reg(NULL, M68K_REG_D5), m68k_get_reg(NULL, M68K_REG_D6), m68k_get_reg(NULL, M68K_REG_D7));
+ 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(state, 1);
+ }
+ else {
+ if (cpu_emulation_running) {
+ if (irq)
+ m68k_execute(state, 5);
+ else
+ m68k_execute(state, loop_cycles);
+ }
+ }
+
+ if (irq) {
+ last_irq = ((read_reg() & 0xe000) >> 13);
+ if (last_irq != last_last_irq) {
+ last_last_irq = last_irq;
+ M68K_SET_IRQ(last_irq);
+ }
+ } else if (!irq && last_last_irq != 0) {
+ M68K_SET_IRQ(0);
+ last_last_irq = 0;
+ }
+
+ if (do_reset) {
+ cpu_pulse_reset();
+ do_reset=0;
+ usleep(1000000); // 1sec
+ rtg_on=0;
+// while(amiga_reset==0);
+// printf("CPU emulation reset.\n");
+ }
+
+ if (mouse_hook_enabled && (mouse_extra != 0x00)) {
+ // mouse wheel events have occurred; unlike l/m/r buttons, these are queued as keypresses, so add to end of buffer
+ switch (mouse_extra) {
+ case 0xff:
+ // wheel up
+ queue_keypress(0xfe, KEYPRESS_PRESS, PLATFORM_AMIGA);
+ break;
+ case 0x01:
+ // wheel down
+ queue_keypress(0xff, KEYPRESS_PRESS, PLATFORM_AMIGA);
+ break;
+ }
+
+ // dampen the scroll wheel until next while loop iteration
+ mouse_extra = 0x00;
+ }
+
+ if (load_new_config) {
+ printf("[CPU] Loading new config file.\n");
+ goto stop_cpu_emulation;
+ }
+
+ if (end_signal)
+ goto stop_cpu_emulation;