📄 arm2x86_mem.c
字号:
#include "armdefs.h"
#include "arm2x86_self.h"
uint32_t
tea_ldm(ARMul_State * state, ARMword address, ARMword reg_map)
{
int i;
ARMword data;
for(i = 0; i < 16; i++) {
arm2x86_tmp_reg[i] = state->Reg[i];
if (reg_map & (1 << i)) {
data = ARMul_ReadWord(state, address);
if (state->abortSig != LOW) {
state->trap = TRAP_DATA_ABORT;
//if (state->is_XScale) {
if (!state->abort_model) {
return(0);
}
else {
break;
}
}
if (i == 15) {
arm2x86_tmp_reg[i] = (data & (~3)) + 4;
}
else {
arm2x86_tmp_reg[i] = data;
}
address += 4;
}
}
if (state->trap != TRAP_DATA_ABORT) {
for(i = 0; i < 16; i++) {
state->Reg[i] = arm2x86_tmp_reg[i];
}
address -= 4;
}
return(address);
}
uint32_t
tea_ldm_user(ARMul_State * state, ARMword address, ARMword reg_map)
{
int i;
ARMword data;
for(i = 0; i < 15; i++) {
if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
arm2x86_tmp_reg[i] = state->RegBank[USERBANK][i];
}
else {
arm2x86_tmp_reg[i] = state->Reg[i];
}
arm2x86_tmp_reg[i] = state->Reg[i];
if (reg_map & (1 << i)) {
data = ARMul_ReadWord(state, address);
if (state->abortSig != LOW) {
state->trap = TRAP_DATA_ABORT;
//if (state->is_XScale) {
if (!state->abort_model) {
return(0);
}
else {
break;
}
}
/*if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
state->RegBank[USERBANK][i] = data;
}
else {
state->Reg[i] = data;
}*/
arm2x86_tmp_reg[i] = data;
address += 4;
}
}
if (state->trap != TRAP_DATA_ABORT) {
for(i = 0; i < 15; i++) {
if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
state->RegBank[USERBANK][i] = arm2x86_tmp_reg[i];
}
else {
state->Reg[i] = arm2x86_tmp_reg[i];
}
}
address -= 4;
}
return(address);
}
uint32_t
tea_stm(ARMul_State * state, ARMword address, ARMword reg_map)
{
int i;
for(i = 0; i < 16; i++) {
if (reg_map & (1 << i)) {
if (i == 15) {
ARMul_WriteWord(state, address, state->Reg[i] + 4);
}
else {
ARMul_WriteWord(state, address, state->Reg[i]);
}
if (state->abortSig != LOW) {
state->trap = TRAP_DATA_ABORT;
//if (state->is_XScale) {
if (!state->abort_model) {
return(0);
}
else {
break;
}
}
address += 4;
}
}
if (state->trap != TRAP_DATA_ABORT) {
address -= 4;
}
return(address);
}
uint32_t
tea_stm_user(ARMul_State * state, ARMword address, ARMword reg_map)
{
int i;
for(i = 0; i < 16; i++) {
if (reg_map & (1 << i)) {
if (i == 15) {
ARMul_WriteWord(state, address, state->Reg[i] + 4);
}
else {
if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
ARMul_WriteWord(state, address, state->RegBank[USERBANK][i]);
}
else {
ARMul_WriteWord(state, address, state->Reg[i]);
}
}
if (state->abortSig != LOW) {
state->trap = TRAP_DATA_ABORT;
//if (state->is_XScale) {
if (!state->abort_model) {
return(0);
}
else {
break;
}
}
address += 4;
}
}
if (state->trap != TRAP_DATA_ABORT) {
address -= 4;
}
return(address);
}
//--------------------------------------------------------------------------------------------------
uint8_t *
get_op_ldr_T0_T1(int *len)
{
unsigned int begin=0,end=0;
OP_BEGIN("get_op_ldr_T0_T1");
//T0 = ARMul_ReadWord(st, T1);
__asm__ __volatile__ ("subl $0x8, %esp");
__asm__ __volatile__ ("push %"AREG_T1);
__asm__ __volatile__ ("push %"AREG_st);
arm2x86_pfun = (uint32_t)ARMul_ReadWord;
//chy 2005-05-11
#ifndef __CYGWIN__
__asm__ __volatile__ ("call *arm2x86_pfun");
#else
wmb();
(*arm2x86_pfun)();
#endif
__asm__ __volatile__ ("addl $0x10, %esp");
__asm__ __volatile__ ("movl %eax, %"AREG_T0);
if (st->abortSig != LOW) {
st->trap = TRAP_DATA_ABORT;
//if (st->is_XScale) {
if (st->abort_model < 2) {
__asm__ __volatile__ ("ret");
}
}
if (T1 & 3) {
T0 = LOADWORD_ALIGN(T1, T0);
}
OP_END("get_op_ldr_T0_T1");
*len = end - begin;
return((uint8_t *)begin);
}
uint8_t *
get_op_ldr_T2_T1(int *len)
{
unsigned int begin=0,end=0;
OP_BEGIN("get_op_ldr_T2_T1");
//T2 = ARMul_ReadWord(st, T1);
__asm__ __volatile__ ("subl $0x8, %esp");
__asm__ __volatile__ ("push %"AREG_T1);
__asm__ __volatile__ ("push %"AREG_st);
arm2x86_pfun = (uint32_t)ARMul_ReadWord;
//chy 2005-05-11
#ifndef __CYGWIN__
__asm__ __volatile__ ("call *arm2x86_pfun");
#else
wmb();
(*arm2x86_pfun)();
#endif
__asm__ __volatile__ ("addl $0x10, %esp");
__asm__ __volatile__ ("movl %eax, %"AREG_T2);
if (st->abortSig != LOW) {
st->trap = TRAP_DATA_ABORT;
//if (st->is_XScale) {
if (st->abort_model < 2) {
__asm__ __volatile__ ("ret");
}
}
if (T1 & 3) {
T2 = LOADWORD_ALIGN(T1, T2);
}
OP_END("get_op_ldr_T2_T1");
*len = end - begin;
return((uint8_t *)begin);
}
uint8_t *
get_op_ldrh_T0_T1(int *len)
{
unsigned int begin=0,end=0;
OP_BEGIN("get_op_ldrh_T0_T1");
//T0 = ARMul_LoadHalfWord(st, T1);
__asm__ __volatile__ ("subl $0x8, %esp");
__asm__ __volatile__ ("push %"AREG_T1);
__asm__ __volatile__ ("push %"AREG_st);
arm2x86_pfun = (uint32_t)ARMul_LoadHalfWord;
//chy 2005-05-11
#ifndef __CYGWIN__
__asm__ __volatile__ ("call *arm2x86_pfun");
#else
wmb();
(*arm2x86_pfun)();
#endif
__asm__ __volatile__ ("addl $0x10, %esp");
__asm__ __volatile__ ("movl %eax, %"AREG_T0);
if (st->abortSig != LOW) {
st->trap = TRAP_DATA_ABORT;
//if (st->is_XScale) {
if (st->abort_model < 2) {
__asm__ __volatile__ ("ret");
}
}
OP_END("get_op_ldrh_T0_T1");
*len = end - begin;
return((uint8_t *)begin);
}
uint8_t *
get_op_ldrb_T0_T1(int *len)
{
unsigned int begin=0,end=0;
OP_BEGIN("get_op_ldrb_T0_T1");
//T0 = ARMul_ReadByte(st, T1);
__asm__ __volatile__ ("subl $0x8, %esp");
__asm__ __volatile__ ("push %"AREG_T1);
__asm__ __volatile__ ("push %"AREG_st);
arm2x86_pfun = (uint32_t)ARMul_ReadByte;
//chy 2005-05-11
#ifndef __CYGWIN__
__asm__ __volatile__ ("call *arm2x86_pfun");
#else
wmb();
(*arm2x86_pfun)();
#endif
__asm__ __volatile__ ("addl $0x10, %esp");
__asm__ __volatile__ ("movl %eax, %"AREG_T0);
if (st->abortSig != LOW) {
st->trap = TRAP_DATA_ABORT;
//if (st->is_XScale) {
if (st->abort_model < 2) {
__asm__ __volatile__ ("ret");
}
}
OP_END("get_op_ldrb_T0_T1");
*len = end - begin;
return((uint8_t *)begin);
}
uint8_t *
get_op_ldrb_T2_T1(int *len)
{
unsigned int begin=0,end=0;
OP_BEGIN("get_op_ldrb_T2_T1");
//T2 = ARMul_ReadByte(st, T1);
__asm__ __volatile__ ("subl $0x8, %esp");
__asm__ __volatile__ ("push %"AREG_T1);
__asm__ __volatile__ ("push %"AREG_st);
arm2x86_pfun = (uint32_t)ARMul_ReadByte;
//chy 2005-05-11
#ifndef __CYGWIN__
__asm__ __volatile__ ("call *arm2x86_pfun");
#else
wmb();
(*arm2x86_pfun)();
#endif
__asm__ __volatile__ ("addl $0x10, %esp");
__asm__ __volatile__ ("movl %eax, %"AREG_T2);
if (st->abortSig != LOW) {
st->trap = TRAP_DATA_ABORT;
//if (st->is_XScale) {
if (st->abort_model < 2) {
__asm__ __volatile__ ("ret");
}
}
OP_END("get_op_ldrb_T2_T1");
*len = end - begin;
return((uint8_t *)begin);
}
uint8_t *
get_op_str_T0_T1(int *len)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -