Simplify disassembly of memory access with zero offset

This commit is contained in:
Kingcom 2014-08-22 23:28:28 +02:00
parent b72963ee5f
commit d1619af18c
1 changed files with 51 additions and 25 deletions

View File

@ -820,32 +820,58 @@ void BLEZL( std::string& output ) { _sap("blezl\t%s, ") GPR_REG[DECO
void BGTZL( std::string& output ) { _sap("bgtzl\t%s, ") GPR_REG[DECODE_RS]); offset_decode(output); }
void DADDI( std::string& output ) { _sap("daddi\t%s, %s, 0x%04X") GPR_REG[DECODE_RT], GPR_REG[DECODE_RS], DECODE_IMMED); }
void DADDIU( std::string& output ) { _sap("daddiu\t%s, %s, 0x%04X") GPR_REG[DECODE_RT], GPR_REG[DECODE_RS], DECODE_IMMED); }
void LDL( std::string& output ) { _sap("ldl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LDR( std::string& output ) { _sap("ldr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LB( std::string& output ) { _sap("lb\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LH( std::string& output ) { _sap("lh\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LWL( std::string& output ) { _sap("lwl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LW( std::string& output ) { _sap("lw\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LBU( std::string& output ) { _sap("lbu\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LHU( std::string& output ) { _sap("lhu\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LWR( std::string& output ) { _sap("lwr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LWU( std::string& output ) { _sap("lwu\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SB( std::string& output ) { _sap("sb\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SH( std::string& output ) { _sap("sh\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SWL( std::string& output ) { _sap("swl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SW( std::string& output ) { _sap("sw\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SDL( std::string& output ) { _sap("sdl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SDR( std::string& output ) { _sap("sdr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SWR( std::string& output ) { _sap("swr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LD( std::string& output ) { _sap("ld\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SD( std::string& output ) { _sap("sd\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LQ( std::string& output ) { _sap("lq\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SQ( std::string& output ) { _sap("sq\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SWC1( std::string& output ) { _sap("swc1\t%s, %s(%s)") COP1_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SQC2( std::string& output ) { _sap("sqc2\t%s, %s(%s)") COP2_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void disMemAccess( std::string& output, const char* name, int cop = 0)
{
const char* rt;
switch (cop)
{
case 0:
rt = GPR_REG[DECODE_RT];
break;
case 1:
rt = COP1_REG_FP[DECODE_FT];
break;
case 2:
rt = COP2_REG_FP[DECODE_FT];
break;
}
const char* rs = GPR_REG[DECODE_RS];
s16 imm = DECODE_IMMED;
if (disSimplify && imm == 0)
ssappendf(output, "%s\t%s,(%s)",name,rt,rs);
else
ssappendf(output, "%s\t%s, %s(%s)",name,rt,signedImmediate(imm,4),rs);
}
void LDL( std::string& output ) { disMemAccess(output,"ldl"); }
void LDR( std::string& output ) { disMemAccess(output,"ldr"); }
void LB( std::string& output ) { disMemAccess(output,"lb"); }
void LH( std::string& output ) { disMemAccess(output,"lh"); }
void LWL( std::string& output ) { disMemAccess(output,"lwl"); }
void LW( std::string& output ) { disMemAccess(output,"lw"); }
void LBU( std::string& output ) { disMemAccess(output,"lbu"); }
void LHU( std::string& output ) { disMemAccess(output,"lhu"); }
void LWR( std::string& output ) { disMemAccess(output,"lwr"); }
void LWU( std::string& output ) { disMemAccess(output,"lwu"); }
void SB( std::string& output ) { disMemAccess(output,"sb"); }
void SH( std::string& output ) { disMemAccess(output,"sh"); }
void SWL( std::string& output ) { disMemAccess(output,"swl"); }
void SW( std::string& output ) { disMemAccess(output,"sw"); }
void SDL( std::string& output ) { disMemAccess(output,"sdl"); }
void SDR( std::string& output ) { disMemAccess(output,"sdr"); }
void SWR( std::string& output ) { disMemAccess(output,"swr"); }
void LD( std::string& output ) { disMemAccess(output,"ld"); }
void SD( std::string& output ) { disMemAccess(output,"sd"); }
void LQ( std::string& output ) { disMemAccess(output,"lq"); }
void SQ( std::string& output ) { disMemAccess(output,"sq"); }
void SWC1( std::string& output ) { disMemAccess(output,"swc1",1); }
void SQC2( std::string& output ) { disMemAccess(output,"sqc2",2); }
void PREF( std::string& output ) { output += "pref ---"; /*_sap("PREF\t%s, 0x%04X(%s)") GPR_REG[DECODE_RT], DECODE_IMMED, GPR_REG[RS]); */}
void LWC1( std::string& output ) { _sap("lwc1\t%s, %s(%s)") COP1_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LQC2( std::string& output ) { _sap("lqc2\t%s, %s(%s)") COP2_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LWC1( std::string& output ) { disMemAccess(output,"lwc1",1); }
void LQC2( std::string& output ) { disMemAccess(output,"lqc2",2); }
//********************END OF STANDARD OPCODES*************************
void SLL( std::string& output )