inline int GBA_InterruptCheck(void) { if(GBA_CPUGetHalted() == 2) return 0; u32 IRQ_ENABLED = (REG_IME&1) && ((CPU.CPSR&F_IRQ_DIS) == 0); if(REG_IE®_IF) { GBA_CPUClearHalted(); if(IRQ_ENABLED) { GBA_CPUChangeMode(M_IRQ); CPU.R[R_LR] = CPU.R[R_PC]+4;//(CPU.EXECUTION_MODE==EXEC_ARM?4:2); // save return address CPU.SPSR = CPU.CPSR; //save CPSR flags CPU.CPSR &= ~(0x1F|F_T|F_I); //Enter IRQ mode, ARM state, IRQs disabled CPU.CPSR |= M_IRQ|F_I; CPU.R[R_PC] = 0x18; //jump to IRQ vector address CPU.EXECUTION_MODE = EXEC_ARM; return 1; } } return 0; }
static void _win_gba_disassembly_inputwindow_callback(char * text, int is_valid) { if(is_valid) { text[8] = '\0'; u32 newvalue = asciihex_to_int(text); _cpu_t * cpu = GBA_CPUGet(); if(gba_debugger_register_to_change < 16) cpu->R[gba_debugger_register_to_change] = newvalue; else if(gba_debugger_register_to_change == 16) { cpu->CPSR = newvalue; if(cpu->CPSR&F_T) cpu->EXECUTION_MODE = EXEC_THUMB; else cpu->EXECUTION_MODE = EXEC_ARM; GBA_CPUChangeMode(newvalue&0x1F); } else if(gba_debugger_register_to_change == 17) cpu->SPSR = newvalue; else if(gba_debugger_register_to_change == 100) { int increment; if( ((disassemble_mode == GBA_DISASM_CPU_AUTO) && (cpu->EXECUTION_MODE == EXEC_ARM)) || (disassemble_mode == GBA_DISASM_CPU_ARM) ) //ARM increment = 4; else //THUMB increment = 2; gba_disassembler_start_address = newvalue-((CPU_DISASSEMBLER_MAX_INSTRUCTIONS/2)*increment); } } }