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

📄 arm-dp.cpp

📁 一个任天堂掌上游戏机NDS的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        _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 + -