⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thumb-opcodes-x86.cpp

📁 一个任天堂掌上游戏机NDS的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}OPC xtopMOVH(){    if(!(reg.curop&0x00C0)) opUNP();    _RDH=_RNH+((((reg.curop&0x0078)>>3)==15)?2:0);    reg.r[15]&=~1;    return 1;}OPC xtopCMPH(){    if(!(reg.curop&0x00C0)) opUNP();    reg.tmp1=_RNH+((((reg.curop&0x0078)>>3)==15)?2:0);    reg.tmp2=_RDH+(((reg.curop&TMSK_RD)>>TSHFT_RD)|((reg.curop&0x0080)>>4));    reg.tmp3=reg.tmp2-reg.tmp1;    flagDPcCMP; flagDPvCMP; flagDPnzTST;    return 1;}OPC xtopADDPCr0() { reg.r[0]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDPCr1() { reg.r[1]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDPCr2() { reg.r[2]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDPCr3() { reg.r[3]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDPCr4() { reg.r[4]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDPCr5() { reg.r[5]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDPCr6() { reg.r[6]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDPCr7() { reg.r[7]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr0() { reg.r[0]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr1() { reg.r[1]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr2() { reg.r[2]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr3() { reg.r[3]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr4() { reg.r[4]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr5() { reg.r[5]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr6() { reg.r[6]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPr7() { reg.r[7]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopADDSPimm7() { reg.r[13]+=(reg.curop&0x0080)?(-(reg.curop&TMSK_IMM7))*4:(reg.curop&TMSK_IMM7)*4; return 1; }//---Load/store (simple and multiple)--------------------------------------OPC xtopLDRPCr0() { reg.r[0]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopLDRPCr1() { reg.r[1]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopLDRPCr2() { reg.r[2]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopLDRPCr3() { reg.r[3]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopLDRPCr4() { reg.r[4]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopLDRPCr5() { reg.r[5]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopLDRPCr6() { reg.r[6]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopLDRPCr7() { reg.r[7]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC xtopSTRSPr0() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[0]); return 1;}OPC xtopSTRSPr1() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[1]); return 1;}OPC xtopSTRSPr2() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[2]); return 1;}OPC xtopSTRSPr3() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[3]); return 1;}OPC xtopSTRSPr4() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[4]); return 1;}OPC xtopSTRSPr5() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[5]); return 1;}OPC xtopSTRSPr6() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[6]); return 1;}OPC xtopSTRSPr7() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,reg.r[7]); return 1;}OPC xtopLDRSPr0() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[0]=MMU->rdW(reg.tmp1); return 1;}OPC xtopLDRSPr1() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[1]=MMU->rdW(reg.tmp1); return 1;}OPC xtopLDRSPr2() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[2]=MMU->rdW(reg.tmp1); return 1;}OPC xtopLDRSPr3() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[3]=MMU->rdW(reg.tmp1); return 1;}OPC xtopLDRSPr4() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[4]=MMU->rdW(reg.tmp1); return 1;}OPC xtopLDRSPr5() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[5]=MMU->rdW(reg.tmp1); return 1;}OPC xtopLDRSPr6() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[6]=MMU->rdW(reg.tmp1); return 1;}OPC xtopLDRSPr7() {reg.tmp1=reg.r[13]+((reg.curop&TMSK_IMM8)<<2);if(reg.tmp1&3)opUNP();reg.r[7]=MMU->rdW(reg.tmp1); return 1;}// BUGBUG: LDR reg/imm5 rotate their result; GBA implementation specificOPC xtopSTRreg() {  reg.tmp1=_RN+_RM; if(reg.tmp1&3) opUNP(); MMU->wrW(reg.tmp1, _RD); return 1; }OPC xtopLDRreg() {  reg.tmp1=_RN+_RM; if(reg.tmp1&3) opUNP(); _RD=MMU->rdW(reg.tmp1); LSror; return 1; }OPC xtopSTRHreg() { reg.tmp1=_RN+_RM; if(reg.tmp1&1) opUNP(); MMU->wrH(reg.tmp1, _RD&65535); return 1; }OPC xtopLDRHreg() { reg.tmp1=_RN+_RM; if(reg.tmp1&1) opUNP(); _RD=(u32)MMU->rdH(reg.tmp1); return 1; }OPC xtopSTRBreg() { reg.tmp1=_RN+_RM; MMU->wrB(reg.tmp1, _RD&255); return 1; }OPC xtopLDRBreg() { reg.tmp1=_RN+_RM; _RD=(u32)MMU->rdB(reg.tmp1); return 1; }OPC xtopLDRSBreg() { reg.tmp1=_RN+_RM;reg.tmp2=(u32)MMU->rdB(reg.tmp1); _RD=(reg.tmp2&0x80)?(reg.tmp2|0xFFFFFF00):reg.tmp2;return 1;}OPC xtopLDRSHreg() { reg.tmp1=_RN+_RM; if(reg.tmp1&1) opUNP(); reg.tmp2=(u32)MMU->rdH(reg.tmp1); _RD=(reg.tmp2&0x8000)?(reg.tmp2|0xFFFF0000):reg.tmp2; return 1; }OPC xtopSTRimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-2));if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,_RD);return 1;}OPC xtopLDRimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-2));if(reg.tmp1&3)opUNP();_RD=MMU->rdW(reg.tmp1);LSror;return 1;}OPC xtopSTRHimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-1));if(reg.tmp1&1)opUNP();MMU->wrH(reg.tmp1,_RD&65535);return 1;}OPC xtopLDRHimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-1));if(reg.tmp1&1)opUNP();_RD=(u32)MMU->rdH(reg.tmp1);return 1;}OPC xtopSTRBimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>TSHFT_IMM5);MMU->wrB(reg.tmp1,_RD&255);return 1;}OPC xtopLDRBimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>TSHFT_IMM5);_RD=(u32)MMU->rdB(reg.tmp1);return 1;}#define addrLMIA(x) reg.tmp1 = (reg.r[(x)]&~3)#define addrLMIB(x) reg.tmp1 = (reg.r[(x)]&~3)+4#define addrLMDA(x) reg.tmp1 = (reg.r[(x)]&~3)-(ssum16(reg.curop&255)*4)+4#define addrLMDB(x) reg.tmp1 = (reg.r[(x)]&~3)-(ssum16(reg.curop&255)*4)#define addrLMIAp(x) reg.tmp1 = (reg.r[(x)]&~3)#define addrLMIBp(x) reg.tmp1 = (reg.r[(x)]&~3)+4#define addrLMDAp(x) reg.tmp1 = (reg.r[(x)]&~3)-(ssum16(reg.curop&511)*4)+4#define addrLMDBp(x) reg.tmp1 = (reg.r[(x)]&~3)-(ssum16(reg.curop&511)*4)#define addrLMwi(x) reg.r[(x)] += ssum16(reg.curop&255)*4#define addrLMwd(x) reg.r[(x)] -= ssum16(reg.curop&255)*4#define addrLMwip(x) reg.r[(x)] += ssum16(reg.curop&511)*4#define addrLMwdp(x) reg.r[(x)] -= ssum16(reg.curop&511)*4#define opLDM \    for(int a=0;a<=7;a++) \    { \        if(reg.curop&(1<<a)) \        { \            reg.r[a]=MMU->rdW(reg.tmp1); \            reg.tmp1+=4; \        } \    }#define opSTM \    for(int a=0;a<=7;a++) \    { \        if(reg.curop&(1<<a)) \        { \            MMU->wrW(reg.tmp1,reg.r[a]); \            reg.tmp1+=4; \        } \    }#define opLDMpc reg.r[15]=MMU->rdW(reg.tmp1); reg.r[15]&=~1; reg.tmp1+=4#define opSTMlr MMU->wrW(reg.tmp1,reg.r[14]); reg.tmp1+=4OPC xtopPUSH()   { addrLMDB(13); addrLMwd(13); opSTM; return 2; }OPC xtopPUSHlr() { addrLMDBp(13); addrLMwdp(13); opSTM; opSTMlr; return 2; }OPC xtopPOP()    { addrLMIA(13); addrLMwi(13); opLDM; return 3; }OPC xtopPOPpc()  { addrLMIAp(13); addrLMwip(13); opLDM; opLDMpc; return 3; }OPC xtopLDMIAr0() { addrLMIA(0); addrLMwi(0); opLDM; return 3; }OPC xtopLDMIAr1() { addrLMIA(1); addrLMwi(1); opLDM; return 3; }OPC xtopLDMIAr2() { addrLMIA(2); addrLMwi(2); opLDM; return 3; }OPC xtopLDMIAr3() { addrLMIA(3); addrLMwi(3); opLDM; return 3; }OPC xtopLDMIAr4() { addrLMIA(4); addrLMwi(4); opLDM; return 3; }OPC xtopLDMIAr5() { addrLMIA(5); addrLMwi(5); opLDM; return 3; }OPC xtopLDMIAr6() { addrLMIA(6); addrLMwi(6); opLDM; return 3; }OPC xtopLDMIAr7() { addrLMIA(7); addrLMwi(7); opLDM; return 3; }OPC xtopSTMIAr0() { addrLMIA(0); addrLMwi(0); opSTM; return 2; }OPC xtopSTMIAr1() { addrLMIA(1); addrLMwi(1); opSTM; return 2; }OPC xtopSTMIAr2() { addrLMIA(2); addrLMwi(2); opSTM; return 2; }OPC xtopSTMIAr3() { addrLMIA(3); addrLMwi(3); opSTM; return 2; }OPC xtopSTMIAr4() { addrLMIA(4); addrLMwi(4); opSTM; return 2; }OPC xtopSTMIAr5() { addrLMIA(5); addrLMwi(5); opSTM; return 2; }OPC xtopSTMIAr6() { addrLMIA(6); addrLMwi(6); opSTM; return 2; }OPC xtopSTMIAr7() { addrLMIA(7); addrLMwi(7); opSTM; return 2; }//---Branching-------------------------------------------------------------#define xtopTempB {reg.tmp1=reg.curop&0xFF; reg.r[15]+=2; reg.r[15]+=((reg.tmp1&0x80)?(0xFFFFFE00|(reg.tmp1<<1)):(reg.tmp1<<1));}OPC xtopBEQ() { if(condEQ()) xtopTempB; return 1; }OPC xtopBNE() { if(condNE()) xtopTempB; return 1; }OPC xtopBCS() { if(condCS()) xtopTempB; return 1; }OPC xtopBCC() { if(condCC()) xtopTempB; return 1; }OPC xtopBMI() { if(condMI()) xtopTempB; return 1; }OPC xtopBPL() { if(condPL()) xtopTempB; return 1; }OPC xtopBVS() { if(condVS()) xtopTempB; return 1; }OPC xtopBVC() { if(condVC()) xtopTempB; return 1; }OPC xtopBHI() { if(condHI()) xtopTempB; return 1; }OPC xtopBLS() { if(condLS()) xtopTempB; return 1; }OPC xtopBGE() { if(condGE()) xtopTempB; return 1; }OPC xtopBLT() { if(condLT()) xtopTempB; return 1; }OPC xtopBGT() { if(condGT()) xtopTempB; return 1; }OPC xtopBLE() { if(condLE()) xtopTempB; return 1; }OPC xtopB(){    reg.tmp1=(reg.curop&TMSK_IMM11)<<1;    reg.r[15]+=((reg.tmp1&0x800)?(0xFFFFF000|reg.tmp1):reg.tmp1)+2;    return 1;}OPC xtopBLsetup(){    reg.tmp1=(reg.curop&TMSK_IMM11)<<12; reg.tmp1=(reg.tmp1&0x400000)?(0xFF800000|reg.tmp1):reg.tmp1;reg.r[14]=reg.r[15]+2+reg.tmp1;    return 1;}OPC xtopBLoff(){    reg.tmp1=reg.r[15]|1; reg.r[15]=(reg.r[14]+((reg.curop&TMSK_IMM11)<<1))&~1; reg.r[14]=reg.tmp1;    return 1;}#endif/*** EOF: thumb-opcodes.cpp **********************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -