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

📄 armdasm.cpp

📁 一个任天堂掌上游戏机NDS的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{
    tmp4=(op&0x00000F80)>>7; 
    sprintf(dout,"r%d, [r%d], +r%d, lsr #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}

void ARMDasm::opptrpar(u32 op, u32 r15)
{
    tmp4=(op&0x00000F80)>>7; 
    sprintf(dout,"r%d, [r%d], +r%d, asr #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}

void ARMDasm::opptrprr(u32 op, u32 r15)
{
    tmp4=(op&0x00000F80)>>7; 
    (tmp4)?
        sprintf(dout,"r%d, [r%d], +r%d, ror #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4):
        sprintf(dout,"r%d, [r%d], +r%d, rrx", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}

// Load/store miscellaneous (halfword-style)
void ARMDasm::oplmofim(u32 op, u32 r15)
{
    sprintf(dout,"r%d, [r%d, #-$%1X%1X]", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}

void ARMDasm::oplmofip(u32 op, u32 r15)
{
    sprintf(dout,"r%d, [r%d, #+$%1X%1X]", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}

void ARMDasm::oplmprim(u32 op, u32 r15)
{
    sprintf(dout,"r%d, [r%d, #-$%1X%1X]!", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}

void ARMDasm::oplmprip(u32 op, u32 r15)
{
    sprintf(dout,"r%d, [r%d, #+$%1X%1X]!", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}

void ARMDasm::oplmptim(u32 op, u32 r15)
{
    sprintf(dout,"r%d, [r%d], #-$%1X%1X", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}

void ARMDasm::oplmptip(u32 op, u32 r15)
{
    sprintf(dout,"r%d, [r%d], #+$%1X%1X", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}

// Load/store multiple
// ACK: Costis (LDM disassembly algorithm, original)
void ARMDasm::oplm(u32 op, u32 r15)
{
    int i, b_start, b_end, inWord=op;
    char str[520],regstr[512];
    sprintf(str,"r%d",DASMOP_RN);
    if(op&0x00200000) sprintf(str,"%s!",str);
    sprintf(regstr,",{");
    b_start = b_end = -1;
    for (i = 0; i <= 16; i++)
    {
        if ((inWord & 1) && (b_start < 0))  { if(i<16) b_start = i; }
	else if (!(inWord & 1))
	{
	    b_end = i - 1;
	    if (b_start >= 0)
	    {
 	        if(strlen(regstr)==2)
 	        {
		    if(b_start!=b_end) sprintf(regstr, "%sr%d-r%d", regstr, b_start, b_end);
		    else sprintf(regstr, "%sr%d", regstr, b_start);
		} else {
		    if(b_start!=b_end) sprintf(regstr, "%s,r%d-r%d", regstr, b_start, b_end);
		    else sprintf(regstr, "%s,r%d", regstr, b_start);
		}
	    }
  	    b_start = -1;
	}
	inWord >>= 1;
    }
    sprintf(str,"%s%s}",str,regstr);
    if(op&0x00400000) sprintf(str,"%s^",str);
    sprintf(dout,"%s",str);
}

// MSR/MRS
void ARMDasm::opmrsrs(u32 op, u32 r15)
{
    sprintf(dout,"r%d, cpsr",DASMOP_RD);
}

void ARMDasm::opmrsrc(u32 op, u32 r15)
{
    sprintf(dout,"r%d, spsr",DASMOP_RD);
}

void ARMDasm::opmsric(u32 op, u32 r15)
{
    tmp3 = op&255; 
    tmp4 = (op&0x00000F00)>>7; 
    tmp1 = (tmp3>>tmp4)|((tmp3&((1<<tmp4)-1))<<(32-tmp4)); 
    sprintf(dout,"cpsr_%c%c%c%c, #%08X",
        ((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
        ((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), tmp1);
	
}

void ARMDasm::opmsris(u32 op, u32 r15)
{
    tmp3 = op&255; 
    tmp4 = (op&0x00000F00)>>7;
    tmp1 = (tmp3>>tmp4)|((tmp3&((1<<tmp4)-1))<<(32-tmp4));
    sprintf(dout,"spsr_%c%c%c%c, #%08X",
        ((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
        ((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), tmp1);
}

void ARMDasm::opmsrrc(u32 op, u32 r15)
{
    sprintf(dout,"cpsr_%c%c%c%c, r%d",
        ((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
        ((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), DASMOP_RM);
}

void ARMDasm::opmsrrs(u32 op, u32 r15)
{
    sprintf(dout,"spsr_%c%c%c%c, r%d",
        ((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
        ((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), DASMOP_RM);
}

// Swap
void ARMDasm::opswp(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d, [r%d]",DASMOP_RD,DASMOP_RM,DASMOP_RN);
}

void ARMDasm::opswi(u32 op, u32 r15)
{
    sprintf(dout,"$%06X",op&0x00FFFFFF);
}

// Multiply
void ARMDasm::opmul(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d, r%d",DASMOP_RN,DASMOP_RM,DASMOP_RS);
}

void ARMDasm::opmla(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d, r%d, r%d",DASMOP_RN,DASMOP_RM,DASMOP_RS,DASMOP_RD);
}

void ARMDasm::opmull(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d, r%d, r%d",DASMOP_RD,DASMOP_RN,DASMOP_RM,DASMOP_RS);
}

// Coprocessors
void ARMDasm::opmcr(u32 op, u32 r15)
{
    sprintf(dout,"p%d, %1X, r%d, c%d, c%d, %1X",DASMOP_RS,DASMOP_RO>>1,DASMOP_RD,DASMOP_RN,DASMOP_RM,DASMOP_RP>>1);
}

void ARMDasm::opcpd(u32 op, u32 r15)
{
    sprintf(dout,"p%d, %1X, c%d, c%d, c%d, %1X",DASMOP_RS,DASMOP_RO>>1,DASMOP_RD,DASMOP_RN,DASMOP_RM,DASMOP_RP>>1);
}

// Enhanced DSP QADD
void ARMDasm::opqadd(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d, r%d", DASMOP_RD, DASMOP_RM, DASMOP_RN);
}

// CLZ
void ARMDasm::opclz(u32 op, u32 r15)
{
    sprintf(dout, "r%d, r%d", DASMOP_RD, DASMOP_RM);
}

//---Thumb disasms---------------------------------------------------------

void ARMDasm::topimm5(u32 op, u32 r15)
{
    sprintf(dout,"r%d, [r%d, #$%02X",TDASMOP_RD,TDASMOP_RN,TDASMOP_IMM5);
}

void ARMDasm::topimm5shft(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d, #$%02X",TDASMOP_RD,TDASMOP_RN,TDASMOP_IMM5);
}

void ARMDasm::topimm7(u32 op, u32 r15)
{
    if(op&0x0080) sprintf(dout,"SUB sp, sp, #$%02X",TDASMOP_IMM7);
    else          sprintf(dout,"ADD sp, sp, #$%02X",TDASMOP_IMM7);
}

void ARMDasm::topimm8(u32 op, u32 r15)
{
    sprintf(dout,"r%d, #$%02X",TDASMOP_RS, TDASMOP_IMM8);
}

void ARMDasm::topimm3(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d, #$%01X",TDASMOP_RD,TDASMOP_RN,TDASMOP_RM);
}

void ARMDasm::topb(u32 op, u32 r15)
{
    signed int b = (op&0x0400)?(0xFFFFFC00|(op&0x03FF))
                                          :(op&0x03FF);
    sprintf(dout,"$%08X",r15+4+(b*2));
}

void ARMDasm::topbx(u32 op, u32 r15)
{
    if(op&0x0080)
        sprintf(dout,"BLX r%d",TDASMOP_RNH);
    else
        sprintf(dout,"BX r%d",TDASMOP_RNH);
}

void ARMDasm::topbl1(u32 op, u32 r15)
{
    tmp4=(TDASMOP_IMM11)<<12; tmp4=(tmp4&0x400000)?(0xFF800000|tmp4):tmp4; tmp4+=r15; tmp4+=4;
    sprintf(dout,";Long branch");
}

void ARMDasm::topbl2(u32 op, u32 r15)
{
    tmp4 += TDASMOP_IMM11*2;
    sprintf(dout,"$%08X", tmp4);
}

void ARMDasm::topbc(u32 op, u32 r15)
{
    signed int b = (op&0x0080)?(0xFFFFFF00|(op&0x00FF))
                                          :(op&0x00FF);
    sprintf(dout,"$%08X",r15+4+(b*2));
}

void ARMDasm::toph(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d",TDASMOP_RDH,TDASMOP_RNH);
}

void ARMDasm::topldm(u32 op, u32 r15)
{
    int i, b_start, b_end, inWord=op;
    char str[512];
    sprintf(str,"{");
    b_start = b_end = -1;
    for (i = 0; i <= 8; i++)
    {
        if ((inWord & 1) && (b_start < 0))  { if(i<8) b_start = i; }
	else if (!(inWord & 1))
	{
	    b_end = i - 1;
	    if (b_start >= 0)
	    {
 	        if(strlen(str)==1)
 	        {
		    if (b_start != b_end) sprintf (str, "%sr%d-r%d", str, b_start, b_end);
		    else sprintf (str, "%sr%d", str, b_start);
		} else {
		    if (b_start != b_end) sprintf (str, "%s,r%d-r%d", str, b_start, b_end);
		    else sprintf (str, "%s,r%d", str, b_start);
		}
	    }
  	    b_start = -1;
	}
	inWord >>= 1;
    }
    sprintf(dout,"%s}",str);
}

void ARMDasm::topdp1(u32 op, u32 r15)
{
    switch((op&0x00C0)>>6)
    {
        case 0: sprintf(dout,"AND r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 1: sprintf(dout,"EOR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 2: sprintf(dout,"LSL r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 3: sprintf(dout,"LSR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
    }
}

void ARMDasm::topdp2(u32 op, u32 r15)
{
    switch((op&0x00C0)>>6)
    {
        case 0: sprintf(dout,"ASR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 1: sprintf(dout,"ADC r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 2: sprintf(dout,"SBC r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 3: sprintf(dout,"ROR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
    }
}

void ARMDasm::topdp3(u32 op, u32 r15)
{
    switch((op&0x00C0)>>6)
    {
        case 0: sprintf(dout,"TST r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 1: sprintf(dout,"NEG r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 2: sprintf(dout,"CMP r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 3: sprintf(dout,"CMN r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
    }
}

void ARMDasm::topdp4(u32 op, u32 r15)
{
    switch((op&0x00C0)>>6)
    {
        case 0: sprintf(dout,"ORR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 1: sprintf(dout,"MUL r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 2: sprintf(dout,"BIC r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
        case 3: sprintf(dout,"MVN r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
    }
}

void ARMDasm::topreg(u32 op, u32 r15)
{
    sprintf(dout,"r%d, r%d",TDASMOP_RD,TDASMOP_RN);
}

void ARMDasm::topund(u32 op, u32 r15)
{
    sprintf(dout,"<unknown>");
}

void ARMDasm::toppc(u32 op, u32 r15)
{
    sprintf(dout,"=$%08X",rdW(r15+(TDASMOP_IMM8<<2)+4));
}

void ARMDasm::topsp(u32 op, u32 r15)
{
    sprintf(dout,"[sp, #$%02X*4]",TDASMOP_IMM8);
}

void ARMDasm::topbkpt(u32 op, u32 r15)
{
    sprintf(dout,"<unimpl>");
}

void ARMDasm::topswi(u32 op, u32 r15)
{
    sprintf(dout,"$%02X",op&0x00FF);
}

//---Tables----------------------------------------------------------------

const char *ARMDasm::condstr[]={
    "eq","ne","cs","cc",
    "mi","pl","vs","vc",
    "hi","ls","ge","lt",
    "gt","le","","nv",
};

const ARMDasm::DASMOP ARMDasm::ops[]={
    //0x00
    {"and%s %s", ARMDasm::oplli      },
    {"and%s %s", ARMDasm::opllr      },
    {"and%s %s", ARMDasm::oplri      },
    {"and%s %s", ARMDasm::oplrr      },
    {"and%s %s", ARMDasm::opari      },
    {"and%s %s", ARMDasm::oparr      },
    {"and%s %s", ARMDasm::oprri      },
    {"and%s %s", ARMDasm::oprrr      },
    {"and%s %s", ARMDasm::oplli      },
    {"mul%s %s", ARMDasm::opmul      },
    {"and%s %s", ARMDasm::oplri      },
    {"strh%s %s", ARMDasm::opptrm    },
    {"and%s %s", ARMDasm::opari      },
    {"ldrd%s %s", ARMDasm::opptrm    },  // ++ARM5E
    {"and%s %s", ARMDasm::oprri      },
    {"strd%s %s", ARMDasm::opptrm    },  // ++ARM5E

    //0x01
    {"and%ss %s", ARMDasm::oplli     },
    {"and%ss %s", ARMDasm::opllr     },
    {"and%ss %s", ARMDasm::oplri     },
    {"and%ss %s", ARMDasm::oplrr     },
    {"and%ss %s", ARMDasm::opari     },
    {"and%ss %s", ARMDasm::oparr     },

⌨️ 快捷键说明

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