Ejemplo n.º 1
0
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&REG_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;
}
Ejemplo n.º 2
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);
        }
    }
}