void ARMul_LDC (ARMul_State * state, ARMword instr, ARMword address) { unsigned cpab; ARMword data; UNDEF_LSCPCBaseWb; if (! CP_ACCESS_ALLOWED (state, CPNum)) { ARMul_UndefInstr (state, instr); return; } if (ADDREXCEPT (address)) INTERNALABORT (address); cpab = (state->LDC[CPNum]) (state, ARMul_FIRST, instr, 0); while (cpab == ARMul_BUSY) { ARMul_Icycles (state, 1, 0); if (IntPending (state)) { cpab = (state->LDC[CPNum]) (state, ARMul_INTERRUPT, instr, 0); return; } else cpab = (state->LDC[CPNum]) (state, ARMul_BUSY, instr, 0); } if (cpab == ARMul_CANT) { CPTAKEABORT; return; } cpab = (state->LDC[CPNum]) (state, ARMul_TRANSFER, instr, 0); data = ARMul_LoadWordN (state, address); BUSUSEDINCPCN; if (BIT (21)) LSBase = state->Base; cpab = (state->LDC[CPNum]) (state, ARMul_DATA, instr, data); while (cpab == ARMul_INC) { address += 4; data = ARMul_LoadWordN (state, address); cpab = (state->LDC[CPNum]) (state, ARMul_DATA, instr, data); } if (state->abortSig || state->Aborted) TAKEABORT; }
void ARMul_LDC (ARMul_State * state, ARMword instr, ARMword address) { unsigned cpab; ARMword data; UNDEF_LSCPCBaseWb; //printf("SKYEYE ARMul_LDC, CPnum is %x, instr %x, addr %x\n",CPNum, instr, address); /*chy 2004-05-23 should update this function in the future,should concern dataabort*/ // chy 2004-05-25 , fix it now,so needn't printf // printf("SKYEYE ARMul_LDC, should update this function!!!!!\n"); //exit(-1); //if (!CP_ACCESS_ALLOWED (state, CPNum)) { if (!state->LDC[CPNum]) { /* printf ("SKYEYE ARMul_LDC,NOT ALLOW, underinstr, CPnum is %x, instr %x, addr %x\n", CPNum, instr, address); */ ARMul_UndefInstr (state, instr); return; } /*if (ADDREXCEPT (address)) INTERNALABORT (address);*/ cpab = (state->LDC[CPNum]) (state, ARMul_FIRST, instr, 0); while (cpab == ARMul_BUSY) { ARMul_Icycles (state, 1, 0); if (IntPending (state)) { cpab = (state->LDC[CPNum]) (state, ARMul_INTERRUPT, instr, 0); return; } else cpab = (state->LDC[CPNum]) (state, ARMul_BUSY, instr, 0); } if (cpab == ARMul_CANT) { /* printf ("SKYEYE ARMul_LDC,NOT CAN, underinstr, CPnum is %x, instr %x, addr %x\n", CPNum, instr, address); */ CPTAKEABORT; return; } cpab = (state->LDC[CPNum]) (state, ARMul_TRANSFER, instr, 0); data = ARMul_LoadWordN (state, address); //chy 2004-05-25 if (state->abortSig || state->Aborted) goto L_ldc_takeabort; BUSUSEDINCPCN; //chy 2004-05-25 /* if (BIT (21)) LSBase = state->Base; */ cpab = (state->LDC[CPNum]) (state, ARMul_DATA, instr, data); while (cpab == ARMul_INC) { address += 4; data = ARMul_LoadWordN (state, address); //chy 2004-05-25 if (state->abortSig || state->Aborted) goto L_ldc_takeabort; cpab = (state->LDC[CPNum]) (state, ARMul_DATA, instr, data); } //chy 2004-05-25 L_ldc_takeabort: if (BIT (21)) { if (! ((state->abortSig || state->Aborted) && state->lateabtSig == LOW)) LSBase = state->Base; } if (state->abortSig || state->Aborted) TAKEABORT; }