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

📄 thumb-opcodes.cpp

📁 一个任天堂掌上游戏机NDS的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	case 0x80: _RD&=(~_RN); break;	case 0xC0: _RD=~_RN; break;    }    flagDPnz;}OPC topADDH(){    if(!(reg.curop&0x00C0)) opUNP();    _RDH+=_RNH+((((reg.curop&0x0078)>>3)==15)?2:0);    reg.r[15]&=~1;    return 1;}OPC topMOVH(){    if(!(reg.curop&0x00C0)) opUNP();    _RDH=_RNH+((((reg.curop&0x0078)>>3)==15)?2:0);    reg.r[15]&=~1;    return 1;}OPC topCMPH(){    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 topADDPCr0() { reg.r[0]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDPCr1() { reg.r[1]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDPCr2() { reg.r[2]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDPCr3() { reg.r[3]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDPCr4() { reg.r[4]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDPCr5() { reg.r[5]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDPCr6() { reg.r[6]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDPCr7() { reg.r[7]=(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr0() { reg.r[0]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr1() { reg.r[1]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr2() { reg.r[2]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr3() { reg.r[3]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr4() { reg.r[4]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr5() { reg.r[5]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr6() { reg.r[6]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPr7() { reg.r[7]=(reg.r[13]+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topADDSPimm7() { reg.r[13]+=(reg.curop&0x0080)?(-(reg.curop&TMSK_IMM7))*4:(reg.curop&TMSK_IMM7)*4; return 1; }//---Load/store (simple and multiple)--------------------------------------OPC topLDRPCr0() { reg.r[0]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topLDRPCr1() { reg.r[1]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topLDRPCr2() { reg.r[2]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topLDRPCr3() { reg.r[3]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topLDRPCr4() { reg.r[4]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topLDRPCr5() { reg.r[5]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topLDRPCr6() { reg.r[6]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topLDRPCr7() { reg.r[7]=MMU->rdW(((reg.r[15]+2)&~3)+((reg.curop&TMSK_IMM8)<<2)); return 1; }OPC topSTRSPr0() {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 topSTRSPr1() {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 topSTRSPr2() {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 topSTRSPr3() {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 topSTRSPr4() {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 topSTRSPr5() {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 topSTRSPr6() {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 topSTRSPr7() {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 topLDRSPr0() {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 topLDRSPr1() {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 topLDRSPr2() {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 topLDRSPr3() {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 topLDRSPr4() {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 topLDRSPr5() {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 topLDRSPr6() {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 topLDRSPr7() {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 topSTRreg() {  reg.tmp1=_RN+_RM; if(reg.tmp1&3) opUNP(); MMU->wrW(reg.tmp1, _RD); return 1; }OPC topLDRreg() {  reg.tmp1=_RN+_RM; if(reg.tmp1&3) opUNP(); _RD=MMU->rdW(reg.tmp1); LSror; return 1; }OPC topSTRHreg() { reg.tmp1=_RN+_RM; if(reg.tmp1&1) opUNP(); MMU->wrH(reg.tmp1, _RD&65535); return 1; }OPC topLDRHreg() { reg.tmp1=_RN+_RM; if(reg.tmp1&1) opUNP(); _RD=(u32)MMU->rdH(reg.tmp1); return 1; }OPC topSTRBreg() { reg.tmp1=_RN+_RM; MMU->wrB(reg.tmp1, _RD&255); return 1; }OPC topLDRBreg() { reg.tmp1=_RN+_RM; _RD=(u32)MMU->rdB(reg.tmp1); return 1; }OPC topLDRSBreg() { reg.tmp1=_RN+_RM;reg.tmp2=(u32)MMU->rdB(reg.tmp1); _RD=(reg.tmp2&0x80)?(reg.tmp2|0xFFFFFF00):reg.tmp2;return 1;}OPC topLDRSHreg() { 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 topSTRimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-2));if(reg.tmp1&3)opUNP();MMU->wrW(reg.tmp1,_RD);return 1;}OPC topLDRimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-2));if(reg.tmp1&3)opUNP();_RD=MMU->rdW(reg.tmp1);LSror;return 1;}OPC topSTRHimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-1));if(reg.tmp1&1)opUNP();MMU->wrH(reg.tmp1,_RD&65535);return 1;}OPC topLDRHimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>(TSHFT_IMM5-1));if(reg.tmp1&1)opUNP();_RD=(u32)MMU->rdH(reg.tmp1);return 1;}OPC topSTRBimm5(){reg.tmp1=_RN+((reg.curop&TMSK_IMM5)>>TSHFT_IMM5);MMU->wrB(reg.tmp1,_RD&255);return 1;}OPC topLDRBimm5(){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 topPUSH()   { addrLMDB(13); addrLMwd(13); opSTM; return 2; }OPC topPUSHlr() { addrLMDBp(13); addrLMwdp(13); opSTM; opSTMlr; return 2; }OPC topPOP()    { addrLMIA(13); addrLMwi(13); opLDM; return 3; }OPC topPOPpc()  { addrLMIAp(13); addrLMwip(13); opLDM; opLDMpc; return 3; }OPC topLDMIAr0() { addrLMIA(0); addrLMwi(0); opLDM; return 3; }OPC topLDMIAr1() { addrLMIA(1); addrLMwi(1); opLDM; return 3; }OPC topLDMIAr2() { addrLMIA(2); addrLMwi(2); opLDM; return 3; }OPC topLDMIAr3() { addrLMIA(3); addrLMwi(3); opLDM; return 3; }OPC topLDMIAr4() { addrLMIA(4); addrLMwi(4); opLDM; return 3; }OPC topLDMIAr5() { addrLMIA(5); addrLMwi(5); opLDM; return 3; }OPC topLDMIAr6() { addrLMIA(6); addrLMwi(6); opLDM; return 3; }OPC topLDMIAr7() { addrLMIA(7); addrLMwi(7); opLDM; return 3; }OPC topSTMIAr0() { addrLMIA(0); addrLMwi(0); opSTM; return 2; }OPC topSTMIAr1() { addrLMIA(1); addrLMwi(1); opSTM; return 2; }OPC topSTMIAr2() { addrLMIA(2); addrLMwi(2); opSTM; return 2; }OPC topSTMIAr3() { addrLMIA(3); addrLMwi(3); opSTM; return 2; }OPC topSTMIAr4() { addrLMIA(4); addrLMwi(4); opSTM; return 2; }OPC topSTMIAr5() { addrLMIA(5); addrLMwi(5); opSTM; return 2; }OPC topSTMIAr6() { addrLMIA(6); addrLMwi(6); opSTM; return 2; }OPC topSTMIAr7() { addrLMIA(7); addrLMwi(7); opSTM; return 2; }//---Branching-------------------------------------------------------------#define topTempB {reg.tmp1=reg.curop&0xFF; reg.r[15]+=2; reg.r[15]+=((reg.tmp1&0x80)?(0xFFFFFE00|(reg.tmp1<<1)):(reg.tmp1<<1));}OPC topBEQ() { if(condEQ()) topTempB; return 1; }OPC topBNE() { if(condNE()) topTempB; return 1; }OPC topBCS() { if(condCS()) topTempB; return 1; }OPC topBCC() { if(condCC()) topTempB; return 1; }OPC topBMI() { if(condMI()) topTempB; return 1; }OPC topBPL() { if(condPL()) topTempB; return 1; }OPC topBVS() { if(condVS()) topTempB; return 1; }OPC topBVC() { if(condVC()) topTempB; return 1; }OPC topBHI() { if(condHI()) topTempB; return 1; }OPC topBLS() { if(condLS()) topTempB; return 1; }OPC topBGE() { if(condGE()) topTempB; return 1; }OPC topBLT() { if(condLT()) topTempB; return 1; }OPC topBGT() { if(condGT()) topTempB; return 1; }OPC topBLE() { if(condLE()) topTempB; return 1; }OPC topB(){    reg.tmp1=(reg.curop&TMSK_IMM11)<<1;    reg.r[15]+=((reg.tmp1&0x800)?(0xFFFFF000|reg.tmp1):reg.tmp1)+2;    return 1;}OPC topBLsetup(){    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 topBLoff(){    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;}/*** EOF: thumb-opcodes.cpp **********************************************/

⌨️ 快捷键说明

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