📄 thumb-opcodes-x86.cpp
字号:
/*************************************************************************** DSemu - The Next Generation ** Portable ARM cores: Thumb opcode implementations [thumb-opcodes.cpp] ** Copyright Imran Nazar, 2005; released under the BSD public licence. ***************************************************************************/#ifdef ARM7TDMI_X86// __ARMHDR is set by the Makefile to be either arm7tdmi.h or arm9es.h#include __ARMHDR// Various helper values we'll be using throughout#define _ROR(val, shft) ((((val)&(~((1<<(shft))-1)))>>(shft)) | (((val)&((1<<(shft))-1))<<(32-(shft))))#define _RM reg.r[(reg.curop&TMSK_RM)>>TSHFT_RM]#define _RN reg.r[(reg.curop&TMSK_RN)>>TSHFT_RN]#define _RD reg.r[(reg.curop&TMSK_RD)>>TSHFT_RD]#define _RDH reg.r[((reg.curop&TMSK_RD)>>TSHFT_RD)|((reg.curop&0x0080)>>4)]#define _RNH reg.r[((reg.curop&TMSK_RN)>>TSHFT_RN)|((reg.curop&0x0040)>>3)]OPC xtopUND() { return opUND(); }//---Data processing-------------------------------------------------------#define flagDPnz \ return 1#define flagDPnzTST \ return 1#define flagDPnzt(x) \ return 1#define flagDPvADD#define flagDPvCMN#define flagDPvSUB#define flagDPvRSB#define flagDPvCMP #define flagDPcADD#define flagDPcCMN#define flagDPcSUB#define flagDPcRSB#define flagDPcCMP#define flagDPcADDt(x)#define flagDPcSUBt(x)#define flagDPvADDt(x)#define flagDPvSUBt(x)#define LSrorOPC xtopLSLimm(){ flagDPnz;}OPC xtopLSRimm(){ flagDPnz;}OPC xtopASRimm(){ flagDPnz;}OPC xtopADDreg() { reg.tmp1=_RM; reg.tmp2=_RN; _RD=_RN+reg.tmp1; flagDPcADD; flagDPvADD; flagDPnz; }OPC xtopSUBreg() { reg.tmp1=_RM; reg.tmp2=_RN; _RD=_RN-reg.tmp1; flagDPcSUB; flagDPvSUB; flagDPnz; }OPC xtopADDimm3() { reg.tmp1=(reg.curop&TMSK_RM)>>TSHFT_RM; reg.tmp2=_RN; _RD=_RN+reg.tmp1; flagDPcADD; flagDPvADD; flagDPnz; }OPC xtopSUBimm3() { reg.tmp1=(reg.curop&TMSK_RM)>>TSHFT_RM; reg.tmp2=_RN; _RD=_RN-reg.tmp1; flagDPcSUB; flagDPvSUB; flagDPnz; }OPC xtopMOVimm8r0() { reg.r[0]=reg.curop&TMSK_IMM8; flagDPnzt(0); }OPC xtopMOVimm8r1() { reg.r[1]=reg.curop&TMSK_IMM8; flagDPnzt(1); }OPC xtopMOVimm8r2() { reg.r[2]=reg.curop&TMSK_IMM8; flagDPnzt(2); }OPC xtopMOVimm8r3() { reg.r[3]=reg.curop&TMSK_IMM8; flagDPnzt(3); }OPC xtopMOVimm8r4() { reg.r[4]=reg.curop&TMSK_IMM8; flagDPnzt(4); }OPC xtopMOVimm8r5() { reg.r[5]=reg.curop&TMSK_IMM8; flagDPnzt(5); }OPC xtopMOVimm8r6() { reg.r[6]=reg.curop&TMSK_IMM8; flagDPnzt(6); }OPC xtopMOVimm8r7() { reg.r[7]=reg.curop&TMSK_IMM8; flagDPnzt(7); }OPC xtopCMPimm8r0() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[0]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopCMPimm8r1() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[1]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopCMPimm8r2() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[2]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopCMPimm8r3() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[3]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopCMPimm8r4() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[4]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopCMPimm8r5() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[5]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopCMPimm8r6() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[6]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopCMPimm8r7() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[7]; reg.tmp3=reg.tmp2-reg.tmp1;flagDPcCMP;flagDPvCMP;flagDPnzTST;}OPC xtopADDimm8r0() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[0]; reg.r[0]+=reg.tmp1;flagDPcADDt(0);flagDPvADDt(0);flagDPnzt(0);}OPC xtopADDimm8r1() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[1]; reg.r[1]+=reg.tmp1;flagDPcADDt(1);flagDPvADDt(1);flagDPnzt(1);}OPC xtopADDimm8r2() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[2]; reg.r[2]+=reg.tmp1;flagDPcADDt(2);flagDPvADDt(2);flagDPnzt(2);}OPC xtopADDimm8r3() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[3]; reg.r[3]+=reg.tmp1;flagDPcADDt(3);flagDPvADDt(3);flagDPnzt(3);}OPC xtopADDimm8r4() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[4]; reg.r[4]+=reg.tmp1;flagDPcADDt(4);flagDPvADDt(4);flagDPnzt(4);}OPC xtopADDimm8r5() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[5]; reg.r[5]+=reg.tmp1;flagDPcADDt(5);flagDPvADDt(5);flagDPnzt(5);}OPC xtopADDimm8r6() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[6]; reg.r[6]+=reg.tmp1;flagDPcADDt(6);flagDPvADDt(6);flagDPnzt(6);}OPC xtopADDimm8r7() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[7]; reg.r[7]+=reg.tmp1;flagDPcADDt(7);flagDPvADDt(7);flagDPnzt(7);}OPC xtopSUBimm8r0() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[0]; reg.r[0]-=reg.tmp1;flagDPcSUBt(0);flagDPvSUBt(0);flagDPnzt(0);}OPC xtopSUBimm8r1() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[1]; reg.r[1]-=reg.tmp1;flagDPcSUBt(1);flagDPvSUBt(1);flagDPnzt(1);}OPC xtopSUBimm8r2() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[2]; reg.r[2]-=reg.tmp1;flagDPcSUBt(2);flagDPvSUBt(2);flagDPnzt(2);}OPC xtopSUBimm8r3() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[3]; reg.r[3]-=reg.tmp1;flagDPcSUBt(3);flagDPvSUBt(3);flagDPnzt(3);}OPC xtopSUBimm8r4() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[4]; reg.r[4]-=reg.tmp1;flagDPcSUBt(4);flagDPvSUBt(4);flagDPnzt(4);}OPC xtopSUBimm8r5() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[5]; reg.r[5]-=reg.tmp1;flagDPcSUBt(5);flagDPvSUBt(5);flagDPnzt(5);}OPC xtopSUBimm8r6() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[6]; reg.r[6]-=reg.tmp1;flagDPcSUBt(6);flagDPvSUBt(6);flagDPnzt(6);}OPC xtopSUBimm8r7() {reg.tmp1=reg.curop&TMSK_IMM8; reg.tmp2=reg.r[7]; reg.r[7]-=reg.tmp1;flagDPcSUBt(7);flagDPvSUBt(7);flagDPnzt(7);}OPC xtopDPg1(){ switch(reg.curop&0x00C0) { case 0x00: _RD&=_RN; break; case 0x40: _RD^=_RN; break; case 0x80: if(_RN&255) { if((_RN&255) < 32) { reg.flags[FLAG_C]=(_RD&(1<<(32-(_RN&255))))?1:0; _RD <<= (_RN&255); } else if((_RN&255) == 32) { reg.flags[FLAG_C] = _RD&1; _RD=0; } else { _RD=0; reg.flags[FLAG_C]=0; } } break; case 0xC0: if(_RN&255) { if((_RN&255) < 32) { reg.flags[FLAG_C]=(_RD&(1<<((_RN&255)-1)))?1:0; _RD >>= (_RN&255); } else if((_RN&255) == 32) { reg.flags[FLAG_C]=(_RD&0x80000000)?1:0; _RD=0; } else { _RD=0; reg.flags[FLAG_C]=0; } } break; } flagDPnz;}OPC xtopDPg2(){ switch(reg.curop&0x00C0) { case 0x00: if(_RN&255) { if((_RN&255) < 32) { reg.flags[FLAG_C]=(_RD&(1<<((_RN&255)-1)))?1:0; _RD >>= (signed)(_RN&255); } else if((_RN&255) == 32) { _RD=(_RN&0x80000000)?~0:0; reg.flags[FLAG_C]=_RD&1; } else { _RD=0; reg.flags[FLAG_C]=0; } } break; case 0x40: reg.tmp1=_RN+reg.flags[FLAG_C]; reg.tmp2=_RD; _RD+=reg.tmp1; flagDPcADD; flagDPvADD; break; case 0x80: reg.tmp1=_RN-(1-reg.flags[FLAG_C]); reg.tmp2=_RD; _RD-=reg.tmp1; flagDPcSUB; flagDPvSUB; break; case 0xC0:// if(_RN&255)// { if(_RN&31) { reg.flags[FLAG_C]=(_RD&(1<<((_RN&31)-1)))?1:0; _RD=_ROR(_RD, _RN&31); } else reg.flags[FLAG_C]=_RD>>31;// } break; } flagDPnz;}OPC xtopDPg3(){ switch(reg.curop&0x00C0) { case 0x00: reg.tmp2=_RD&_RN; flagDPnzTST; break; case 0x40: reg.tmp1=0; reg.tmp2=_RN; _RD=0-_RN; flagDPcSUB; flagDPvSUB; flagDPnz; break; case 0x80: reg.tmp1=_RD; reg.tmp2=_RN; reg.tmp3=_RD-_RN; flagDPcCMP; flagDPvCMP; flagDPnzTST; break; case 0xC0: reg.tmp1=_RD; reg.tmp2=_RN; reg.tmp3=_RD+_RN; flagDPcCMN; flagDPvCMN; flagDPnzTST; break; } return 1;}OPC xtopDPg4(){ switch(reg.curop&0x00C0) { case 0x00: _RD|=_RN; break; case 0x40: if((reg.curop&TMSK_RD)==((reg.curop&TMSK_RN)>>TSHFT_RN)) opUNP(); _RD*=_RN; break; case 0x80: _RD&=(~_RN); break; case 0xC0: _RD=~_RN; break; } flagDPnz;}OPC xtopADDH(){ if(!(reg.curop&0x00C0)) opUNP(); _RDH+=_RNH+((((reg.curop&0x0078)>>3)==15)?2:0); reg.r[15]&=~1; return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -