void ARMul_SetReg(ARMul_State *state, unsigned mode, unsigned reg, ARMword value) {mode &= MODEBITS ; if (mode != state->Mode) state->RegBank[ModeToBank(state,(ARMword)mode)][reg] = value ; else state->Reg[reg] = value ; }
ARMword ARMul_GetReg(ARMul_State *state, unsigned mode, unsigned reg) {mode &= MODEBITS ; if (mode != state->Mode) return(state->RegBank[ModeToBank(state,(ARMword)mode)][reg]) ; else return(state->Reg[reg]) ; }
ARMword ARMul_GetSPSR(ARMul_State *state, ARMword mode) {ARMword bank = ModeToBank(state,mode & MODEBITS) ; if (bank == USERBANK || bank == DUMMYBANK) return(CPSR) ; else return(state->Spsr[bank]) ; }
void ARMul_SetSPSR (ARMul_State * state, ARMword mode, ARMword value) { ARMword bank = ModeToBank (mode & MODEBITS); if (BANK_CAN_ACCESS_SPSR (bank)) state->Spsr[bank] = value; }
ARMword ARMul_SwitchMode(ARMul_State *state,ARMword oldmode, ARMword newmode) {unsigned i ; oldmode = ModeToBank(state,oldmode) ; state->Bank = ModeToBank(state,newmode) ; if (oldmode != state->Bank) { /* really need to do it */ switch (oldmode) { /* save away the old registers */ case USERBANK : case IRQBANK : case SVCBANK : case ABORTBANK : case UNDEFBANK : if (state->Bank == FIQBANK) for (i = 8 ; i < 13 ; i++) state->RegBank[USERBANK][i] = state->Reg[i] ; state->RegBank[oldmode][13] = state->Reg[13] ; state->RegBank[oldmode][14] = state->Reg[14] ; break ; case FIQBANK : for (i = 8 ; i < 15 ; i++) state->RegBank[FIQBANK][i] = state->Reg[i] ; break ; case DUMMYBANK : for (i = 8 ; i < 15 ; i++) state->RegBank[DUMMYBANK][i] = 0 ; break ; } switch (state->Bank) { /* restore the new registers */ case USERBANK : case IRQBANK : case SVCBANK : case ABORTBANK : case UNDEFBANK : if (oldmode == FIQBANK) for (i = 8 ; i < 13 ; i++) state->Reg[i] = state->RegBank[USERBANK][i] ; state->Reg[13] = state->RegBank[state->Bank][13] ; state->Reg[14] = state->RegBank[state->Bank][14] ; break ; case FIQBANK : for (i = 8 ; i < 15 ; i++) state->Reg[i] = state->RegBank[FIQBANK][i] ; break ; case DUMMYBANK : for (i = 8 ; i < 15 ; i++) state->Reg[i] = 0 ; break ; } /* switch */ } /* if */ return(newmode) ; }
ARMword ARMul_GetSPSR (ARMul_State * state, ARMword mode) { ARMword bank = ModeToBank (mode & MODEBITS); if (!BANK_CAN_ACCESS_SPSR (bank)) return ARMul_GetCPSR (state); return state->Spsr[bank]; }
ARMword ARMul_SwitchMode (ARMul_State * state, ARMword oldmode, ARMword newmode) { unsigned i; ARMword oldbank; ARMword newbank; static int revision_value = 53; oldbank = ModeToBank (oldmode); newbank = state->Bank = ModeToBank (newmode); /* Do we really need to do it? */ if (oldbank != newbank) { if (oldbank == 3 && newbank == 2) { //printf("icounter is %d PC is %x MODE CHANGED : %d --> %d\n", state->NumInstrs, state->pc, oldbank, newbank); if (state->NumInstrs >= 5832487) { // printf("%d, ", state->NumInstrs + revision_value); // printf("revision_value : %d\n", revision_value); revision_value ++; } } /* Save away the old registers. */ switch (oldbank) { case USERBANK: case IRQBANK: case SVCBANK: case ABORTBANK: case UNDEFBANK: if (newbank == FIQBANK) for (i = 8; i < 13; i++) state->RegBank[USERBANK][i] = state->Reg[i]; state->RegBank[oldbank][13] = state->Reg[13]; state->RegBank[oldbank][14] = state->Reg[14]; break; case FIQBANK: for (i = 8; i < 15; i++) state->RegBank[FIQBANK][i] = state->Reg[i]; break; case DUMMYBANK: for (i = 8; i < 15; i++) state->RegBank[DUMMYBANK][i] = 0; break; default: abort (); } /* Restore the new registers. */ switch (newbank) { case USERBANK: case IRQBANK: case SVCBANK: case ABORTBANK: case UNDEFBANK: if (oldbank == FIQBANK) for (i = 8; i < 13; i++) state->Reg[i] = state->RegBank[USERBANK][i]; state->Reg[13] = state->RegBank[newbank][13]; state->Reg[14] = state->RegBank[newbank][14]; break; case FIQBANK: for (i = 8; i < 15; i++) state->Reg[i] = state->RegBank[FIQBANK][i]; break; case DUMMYBANK: for (i = 8; i < 15; i++) state->Reg[i] = 0; break; default: abort (); } } return newmode; }
void ARMul_SetSPSR(ARMul_State *state, ARMword mode, ARMword value) {ARMword bank = ModeToBank(state,mode & MODEBITS) ; if (bank != USERBANK && bank !=DUMMYBANK) state->Spsr[bank] = value ; }
ARMword ARMul_SwitchMode (ARMul_State * state, ARMword oldmode, ARMword newmode) { unsigned i; ARMword oldbank; ARMword newbank; oldbank = ModeToBank (oldmode); newbank = state->Bank = ModeToBank (newmode); /* Do we really need to do it? */ if (oldbank != newbank) { /* Save away the old registers. */ switch (oldbank) { case USERBANK: case IRQBANK: case SVCBANK: case ABORTBANK: case UNDEFBANK: if (newbank == FIQBANK) for (i = 8; i < 13; i++) state->RegBank[USERBANK][i] = state->Reg[i]; state->RegBank[oldbank][13] = state->Reg[13]; state->RegBank[oldbank][14] = state->Reg[14]; break; case FIQBANK: for (i = 8; i < 15; i++) state->RegBank[FIQBANK][i] = state->Reg[i]; break; case DUMMYBANK: for (i = 8; i < 15; i++) state->RegBank[DUMMYBANK][i] = 0; break; default: abort (); } /* Restore the new registers. */ switch (newbank) { case USERBANK: case IRQBANK: case SVCBANK: case ABORTBANK: case UNDEFBANK: if (oldbank == FIQBANK) for (i = 8; i < 13; i++) state->Reg[i] = state->RegBank[USERBANK][i]; state->Reg[13] = state->RegBank[newbank][13]; state->Reg[14] = state->RegBank[newbank][14]; break; case FIQBANK: for (i = 8; i < 15; i++) state->Reg[i] = state->RegBank[FIQBANK][i]; break; case DUMMYBANK: for (i = 8; i < 15; i++) state->Reg[i] = 0; break; default: abort (); } } return newmode; }