📄 arm-dp.cpp
字号:
_RD += pl; _RN += ph; if(plorig>_RD) _RN++; return 1;}OPC opSMULL(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=_RS, neg=0; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } _RD = pl; _RN=ph; return 1; }OPC opSMLAL(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=_RS, neg=0, plorig=_RD; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(plorig>pl) ph++; if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } _RD += pl; _RN+=ph; return 1;}OPC opUMULLS(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=_RS; for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } _RD = pl; _RN=ph; reg.flags[FLAG_Z]=(!_RD && !_RN)?1:0; reg.flags[FLAG_N]=(_RN&0x80000000)?1:0; return 1;}OPC opUMLALS(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=_RS, plorig=_RD; for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } _RD += pl; _RN += ph; if(plorig>_RD) _RN++; reg.flags[FLAG_Z]=(!_RD && !_RN)?1:0; reg.flags[FLAG_N]=(_RN&0x80000000)?1:0; return 1;}OPC opSMULLS(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=_RS, neg=0; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } _RD = pl; _RN=ph; reg.flags[FLAG_Z]=(!_RD && !_RN)?1:0; reg.flags[FLAG_N]=(_RN&0x80000000)?1:0; return 1;}OPC opSMLALS(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=_RS, neg=0, plorig=_RD; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(plorig>pl) ph++; if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } _RD += pl; _RN+=ph; reg.flags[FLAG_Z]=(!_RD && !_RN)?1:0; reg.flags[FLAG_N]=(_RN&0x80000000)?1:0; return 1; }//---Move between register and cpsr----------------------------------------OPC opMRSrc(){ cpsrUpdate();/* if(_OP_RD==15) opUNP();*/ _RD = reg.cpsr; return 1;}OPC opMRSrs(){ cpsrUpdate();/* if(_OP_RD==15) opUNP();*/ if(reg.curmode==MODE_USR || reg.curmode==MODE_SYS) opUNP(); _RD = reg.spsr[reg.curmode]; return 1;}OPC opMSRrc(){/* if(_OP_RD==15) opUNP();*/ reg.tmp1 = _RM; reg.tmp2 = reg.cpsr; if(reg.curop & 0x00080000) { reg.tmp2 &= 0x00FFFFFF; reg.tmp2 |= (reg.tmp1&0xFF000000); } if(reg.curmode != MODE_USR) { if(reg.curop & 0x00040000) { reg.tmp2 &= 0xFF00FFFF; reg.tmp2 |= (reg.tmp1&0x00FF0000); } if(reg.curop & 0x00020000) { reg.tmp2 &= 0xFFFF00FF; reg.tmp2 |= (reg.tmp1&0x0000FF00); } if(reg.curop & 0x00010000) { reg.tmp2 &= 0xFFFFFF00; reg.tmp2 |= (reg.tmp1&0x000000FF); } } reg.cpsr = reg.tmp2; cpsrSplit(); return 1;}OPC opMSRrs(){/* if(_OP_RD==15) opUNP();*/ if(reg.curmode==MODE_USR || reg.curmode==MODE_SYS) opUNP(); reg.tmp1 = _RM; reg.tmp2 = reg.spsr[reg.curmode]; if(reg.curop & 0x00080000) { reg.tmp2 &= 0x00FFFFFF; reg.tmp2 |= (reg.tmp1&0xFF000000); } if(reg.curmode != MODE_USR) { if(reg.curop & 0x00040000) { reg.tmp2 &= 0xFF00FFFF; reg.tmp2 |= (reg.tmp1&0x00FF0000); } if(reg.curop & 0x00020000) { reg.tmp2 &= 0xFFFF00FF; reg.tmp2 |= (reg.tmp1&0x0000FF00); } if(reg.curop & 0x00010000) { reg.tmp2 &= 0xFFFFFF00; reg.tmp2 |= (reg.tmp1&0x000000FF); } } reg.spsr[reg.curmode] = reg.tmp2; return 1;}OPC opMSRic(){/* if(_OP_RD==15) opUNP();*/ reg.tmp1 = _ROR(reg.curop&MSK_IMM8, (reg.curop&MSK_RS)>>7); reg.tmp2=reg.cpsr; if(reg.curop & 0x00080000) { reg.tmp2 &= 0x00FFFFFF; reg.tmp2 |= (reg.tmp1&0xFF000000); } if(reg.curmode != MODE_USR) { if(reg.curop & 0x00040000) { reg.tmp2 &= 0xFF00FFFF; reg.tmp2 |= (reg.tmp1&0x00FF0000); } if(reg.curop & 0x00020000) { reg.tmp2 &= 0xFFFF00FF; reg.tmp2 |= (reg.tmp1&0x0000FF00); } if(reg.curop & 0x00010000) { reg.tmp2 &= 0xFFFFFF00; reg.tmp2 |= (reg.tmp1&0x000000FF); } } reg.cpsr = reg.tmp2; cpsrSplit(); return 1;}OPC opMSRis(){/* if(_OP_RD==15) opUNP();*/ if(reg.curmode==MODE_USR || reg.curmode==MODE_SYS) opUNP(); reg.tmp1 = _ROR(reg.curop&MSK_IMM8, (reg.curop&MSK_RS)>>7); reg.tmp2=reg.spsr[reg.curmode]; if(reg.curop & 0x00080000) { reg.tmp2 &= 0x00FFFFFF; reg.tmp2 |= (reg.tmp1&0xFF000000); } if(reg.curmode != MODE_USR) { if(reg.curop & 0x00040000) { reg.tmp2 &= 0xFF00FFFF; reg.tmp2 |= (reg.tmp1&0x00FF0000); } if(reg.curop & 0x00020000) { reg.tmp2 &= 0xFFFF00FF; reg.tmp2 |= (reg.tmp1&0x0000FF00); } if(reg.curop & 0x00010000) { reg.tmp2 &= 0xFFFFFF00; reg.tmp2 |= (reg.tmp1&0x000000FF); } } reg.spsr[reg.curmode] = reg.tmp2; return 1;}//---Swap between registers and memory-------------------------------------OPC opSWP(){/* if((((reg.curop&MSK_RM)>>SHFT_RM)==15)| (((reg.curop&MSK_RN)>>SHFT_RN)==15)| (((reg.curop&MSK_RD)>>SHFT_RD)==15)) opUNP();*//* if(((reg.curop&MSK_RN)>>SHFT_RN)==((reg.curop&MSK_RD)>>SHFT_RD)) opUNP();*//* if(((reg.curop&MSK_RN)>>SHFT_RN)==((reg.curop&MSK_RM)>>SHFT_RM)) opUNP();*/ reg.tmp1=_RN; reg.tmp2=_RD; _RD=MMU->rdW(reg.tmp1); LSror; MMU->wrW(reg.tmp1, reg.tmp2); return 1;}OPC opSWPB(){/* if((((reg.curop&MSK_RM)>>SHFT_RM)==15)| (((reg.curop&MSK_RN)>>SHFT_RN)==15)| (((reg.curop&MSK_RD)>>SHFT_RD)==15)) opUNP();*//* if(((reg.curop&MSK_RN)>>SHFT_RN)==((reg.curop&MSK_RD)>>SHFT_RD)) opUNP();*//* if(((reg.curop&MSK_RN)>>SHFT_RN)==((reg.curop&MSK_RM)>>SHFT_RM)) opUNP();*/ reg.tmp2=_RD; _RD=(u32)MMU->rdB(_RN); MMU->wrB(_RN, reg.tmp2&255); return 1;}/*** EOF: arm-dp.cpp *****************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -