|
@@ -13,26 +13,31 @@ interface OpCodeMangler
|
|
}
|
|
}
|
|
|
|
|
|
public class XAPDisAsm {
|
|
public class XAPDisAsm {
|
|
|
|
+ private static OpCodeMangler brxl = (modifier,opcode,address)->{
|
|
|
|
+ return OpcodeAddressRangeToString(address,1)+": brxl";
|
|
|
|
+ };
|
|
|
|
+ private static OpCodeMangler invalid = (modifier,opcode,address)->{
|
|
|
|
+ String badOpCode ="";
|
|
|
|
+ boolean modified=false;
|
|
|
|
+ if(modifier!=0x00)
|
|
|
|
+ {
|
|
|
|
+ modified=true;
|
|
|
|
+ badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
|
|
|
|
+ };
|
|
|
|
+ for(int i=0;i<opcode.length;i++)
|
|
|
|
+ {
|
|
|
|
+ badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(opcode[i])));
|
|
|
|
+ }
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length+(modified?1:0))+":Invalid OpCode: "+badOpCode;
|
|
|
|
+ };
|
|
public static OpCodeMangler[] manglers = new OpCodeMangler[256];
|
|
public static OpCodeMangler[] manglers = new OpCodeMangler[256];
|
|
static {
|
|
static {
|
|
- OpCodeMangler invalid = (modifier,opcode,address)->{
|
|
|
|
- String badOpCode ="";
|
|
|
|
- if(modifier!=0x00)
|
|
|
|
- {
|
|
|
|
- badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
|
|
|
|
- };
|
|
|
|
- for(int i=0;i<opcode.length;i++)
|
|
|
|
- {
|
|
|
|
- badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(opcode[i])));
|
|
|
|
- }
|
|
|
|
- return addressToString(address)+":Invalid OpCode: "+badOpCode;
|
|
|
|
- };
|
|
|
|
|
|
+
|
|
|
|
|
|
OpCodeMangler ld = (modifier,opcode,address)->{
|
|
OpCodeMangler ld = (modifier,opcode,address)->{
|
|
- String badOpCode ="";
|
|
|
|
if(modifier!=0x00)
|
|
if(modifier!=0x00)
|
|
{
|
|
{
|
|
- badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
|
|
|
|
|
|
+ //return invalid.mangleOpCode(modifier,opcode,address);
|
|
};
|
|
};
|
|
|
|
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
@@ -129,14 +134,13 @@ public class XAPDisAsm {
|
|
value = ParamManglerIndirectY(valueSigned);
|
|
value = ParamManglerIndirectY(valueSigned);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- return addressToString(address)+":ld: "+register+" "+value;
|
|
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length)+":ld: "+register+" "+value;
|
|
};
|
|
};
|
|
|
|
|
|
OpCodeMangler st = (modifier,opcode,address)->{
|
|
OpCodeMangler st = (modifier,opcode,address)->{
|
|
- String badOpCode ="";
|
|
|
|
if(modifier!=0x00)
|
|
if(modifier!=0x00)
|
|
{
|
|
{
|
|
- badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
|
|
|
|
|
|
+ //return invalid.mangleOpCode(modifier,opcode,address);
|
|
};
|
|
};
|
|
|
|
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
@@ -215,7 +219,7 @@ public class XAPDisAsm {
|
|
value = ParamManglerIndirectY(valueSigned);
|
|
value = ParamManglerIndirectY(valueSigned);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- return addressToString(address)+":ld: "+register+" "+value;
|
|
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length)+":st: "+register+" "+value;
|
|
};
|
|
};
|
|
|
|
|
|
OpCodeMangler add = GetBasicMangler("add",(short)0x30);
|
|
OpCodeMangler add = GetBasicMangler("add",(short)0x30);
|
|
@@ -241,6 +245,10 @@ public class XAPDisAsm {
|
|
|
|
|
|
|
|
|
|
OpCodeMangler enterlleavel = (modifier,opcode,address)->{
|
|
OpCodeMangler enterlleavel = (modifier,opcode,address)->{
|
|
|
|
+ if(modifier!=0x00)
|
|
|
|
+ {
|
|
|
|
+ //return invalid.mangleOpCode(modifier,opcode,address);
|
|
|
|
+ };
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
short opcodeReal = 0x00; // only checking lower byte though
|
|
short opcodeReal = 0x00; // only checking lower byte though
|
|
for(int i=0;i<opcode.length;i++)
|
|
for(int i=0;i<opcode.length;i++)
|
|
@@ -264,10 +272,14 @@ public class XAPDisAsm {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- return addressToString(address)+":"+label+":"+ParamManglerImmediate(valueStack);
|
|
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length)+":"+label+":"+ParamManglerImmediate(valueStack);
|
|
};
|
|
};
|
|
|
|
|
|
OpCodeMangler bxx = (modifier,opcode,address)->{
|
|
OpCodeMangler bxx = (modifier,opcode,address)->{
|
|
|
|
+ if(modifier!=0x00)
|
|
|
|
+ {
|
|
|
|
+ //return invalid.mangleOpCode(modifier,opcode,address);
|
|
|
|
+ };
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
short opcodeReal = 0x00; // only checking lower byte though
|
|
short opcodeReal = 0x00; // only checking lower byte though
|
|
for(int i=0;i<opcode.length;i++)
|
|
for(int i=0;i<opcode.length;i++)
|
|
@@ -294,7 +306,7 @@ public class XAPDisAsm {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
String potentialTargetAddress=addressToString(address+opcode.length-1+valueSigned);
|
|
String potentialTargetAddress=addressToString(address+opcode.length-1+valueSigned);
|
|
- return addressToString(address)+":"+label+":"+value+"; Target="+potentialTargetAddress+" OR "+addressToString(valueUnsigned);
|
|
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length)+":"+label+":"+value+"; Target="+potentialTargetAddress+" OR "+addressToString(valueUnsigned);
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -302,8 +314,11 @@ public class XAPDisAsm {
|
|
|
|
|
|
|
|
|
|
manglers[0x0] = (modifier,opcode,address)->{
|
|
manglers[0x0] = (modifier,opcode,address)->{
|
|
-
|
|
|
|
- return addressToString(address)+": nop";
|
|
|
|
|
|
+ if(modifier!=0x00)
|
|
|
|
+ {
|
|
|
|
+ return invalid.mangleOpCode(modifier,opcode,address);
|
|
|
|
+ };
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length)+": nop";
|
|
};
|
|
};
|
|
manglers[0x1]=invalid;
|
|
manglers[0x1]=invalid;
|
|
manglers[0x2]=invalid;
|
|
manglers[0x2]=invalid;
|
|
@@ -476,7 +491,7 @@ public class XAPDisAsm {
|
|
manglers[0x99]=tst;
|
|
manglers[0x99]=tst;
|
|
manglers[0x9a]=tst;
|
|
manglers[0x9a]=tst;
|
|
manglers[0x9b]=tst;
|
|
manglers[0x9b]=tst;
|
|
- manglers[0x9c]=invalid;
|
|
|
|
|
|
+ manglers[0x9c]=bsr;
|
|
manglers[0x9d]=bsr;
|
|
manglers[0x9d]=bsr;
|
|
manglers[0x9e]=bsr;
|
|
manglers[0x9e]=bsr;
|
|
manglers[0x9f]=bsr;
|
|
manglers[0x9f]=bsr;
|
|
@@ -556,11 +571,11 @@ public class XAPDisAsm {
|
|
manglers[0xde]=xor;
|
|
manglers[0xde]=xor;
|
|
manglers[0xdf]=xor;
|
|
manglers[0xdf]=xor;
|
|
|
|
|
|
- manglers[0xe0]=invalid;
|
|
|
|
|
|
+ manglers[0xe0]=bra;
|
|
manglers[0xe1]=bra;
|
|
manglers[0xe1]=bra;
|
|
manglers[0xe2]=bra;
|
|
manglers[0xe2]=bra;
|
|
manglers[0xe3]=bra;
|
|
manglers[0xe3]=bra;
|
|
- manglers[0xe4]=invalid;
|
|
|
|
|
|
+ manglers[0xe4]=blt;
|
|
manglers[0xe5]=blt;
|
|
manglers[0xe5]=blt;
|
|
manglers[0xe6]=blt;
|
|
manglers[0xe6]=blt;
|
|
manglers[0xe7]=blt;
|
|
manglers[0xe7]=blt;
|
|
@@ -573,19 +588,19 @@ public class XAPDisAsm {
|
|
manglers[0xee]=invalid;
|
|
manglers[0xee]=invalid;
|
|
manglers[0xef]=invalid;
|
|
manglers[0xef]=invalid;
|
|
|
|
|
|
- manglers[0xf0]=invalid;
|
|
|
|
|
|
+ manglers[0xf0]=bne;
|
|
manglers[0xf1]=bne;
|
|
manglers[0xf1]=bne;
|
|
manglers[0xf2]=bne;
|
|
manglers[0xf2]=bne;
|
|
manglers[0xf3]=bne;
|
|
manglers[0xf3]=bne;
|
|
- manglers[0xf4]=invalid;
|
|
|
|
|
|
+ manglers[0xf4]=beq;
|
|
manglers[0xf5]=beq;
|
|
manglers[0xf5]=beq;
|
|
manglers[0xf6]=beq;
|
|
manglers[0xf6]=beq;
|
|
manglers[0xf7]=beq;
|
|
manglers[0xf7]=beq;
|
|
- manglers[0xf8]=invalid;
|
|
|
|
|
|
+ manglers[0xf8]=bcc;
|
|
manglers[0xf9]=bcc;
|
|
manglers[0xf9]=bcc;
|
|
manglers[0xfa]=bcc;
|
|
manglers[0xfa]=bcc;
|
|
manglers[0xfb]=bcc;
|
|
manglers[0xfb]=bcc;
|
|
- manglers[0xfc]=invalid;
|
|
|
|
|
|
+ manglers[0xfc]=bcs;
|
|
manglers[0xfd]=bcs;
|
|
manglers[0xfd]=bcs;
|
|
manglers[0xfe]=bcs;
|
|
manglers[0xfe]=bcs;
|
|
manglers[0xff]=bcs;
|
|
manglers[0xff]=bcs;
|
|
@@ -626,7 +641,7 @@ public class XAPDisAsm {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- return addressToString(address)+":"+(modified?OpcodeLabelModified:opcodeLabel)+":"+value;
|
|
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length+(modified?1:0))+":"+(modified?OpcodeLabelModified:opcodeLabel)+":"+value;
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
@@ -637,10 +652,9 @@ public class XAPDisAsm {
|
|
static OpCodeMangler GetBraMangler(String opcodeLabel, short opcodeBase, boolean bra_specialcase)
|
|
static OpCodeMangler GetBraMangler(String opcodeLabel, short opcodeBase, boolean bra_specialcase)
|
|
{
|
|
{
|
|
return (modifier,opcode,address)->{
|
|
return (modifier,opcode,address)->{
|
|
- String badOpCode ="";
|
|
|
|
if(modifier!=0x00)
|
|
if(modifier!=0x00)
|
|
{
|
|
{
|
|
- badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
|
|
|
|
|
|
+ //return invalid.mangleOpCode(modifier,opcode,address);
|
|
};
|
|
};
|
|
|
|
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
@@ -651,14 +665,22 @@ public class XAPDisAsm {
|
|
opcodeValues[i]=opcodeWord[0];
|
|
opcodeValues[i]=opcodeWord[0];
|
|
opcodeReal=(short)((opcode[i]-opcodeBase)&0xFF); //stompy stomp, only keeps the last
|
|
opcodeReal=(short)((opcode[i]-opcodeBase)&0xFF); //stompy stomp, only keeps the last
|
|
}
|
|
}
|
|
-
|
|
|
|
- int valueUnsigned = XAPDisAsmGeneratedCode.unsignedCounts.get(EntryPoint.bytesToHex(opcodeValues));
|
|
|
|
- int valueSigned =XAPDisAsmGeneratedCode.signedCounts.get(EntryPoint.bytesToHex(opcodeValues));
|
|
|
|
|
|
+ int valueUnsigned=0;
|
|
|
|
+ int valueSigned=0;
|
|
|
|
+ if(opcodeReal !=0x0)
|
|
|
|
+ {
|
|
|
|
+ valueUnsigned = XAPDisAsmGeneratedCode.unsignedCounts.get(EntryPoint.bytesToHex(opcodeValues));
|
|
|
|
+ valueSigned =XAPDisAsmGeneratedCode.signedCounts.get(EntryPoint.bytesToHex(opcodeValues));
|
|
|
|
+ }
|
|
String register = "";
|
|
String register = "";
|
|
|
|
|
|
String value = "";
|
|
String value = "";
|
|
switch(opcodeReal)
|
|
switch(opcodeReal)
|
|
{
|
|
{
|
|
|
|
+ case 0x00:
|
|
|
|
+ register="AH";
|
|
|
|
+ value = ParamManglerConstAddr(untwiddleOpcodeParamBra(opcodeValues,address));
|
|
|
|
+ break;
|
|
case 0x01:
|
|
case 0x01:
|
|
register="AH";
|
|
register="AH";
|
|
value = ParamManglerAddress(valueSigned);
|
|
value = ParamManglerAddress(valueSigned);
|
|
@@ -680,7 +702,7 @@ public class XAPDisAsm {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- return addressToString(address)+":"+opcodeLabel+":"+value+"; Target="+potentialTargetAddress+" OR "+addressToString(valueUnsigned);
|
|
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length)+":"+opcodeLabel+":"+value+"; Target="+potentialTargetAddress+" OR "+addressToString(valueUnsigned);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
@@ -689,10 +711,9 @@ public class XAPDisAsm {
|
|
static OpCodeMangler GetBasicMangler(String opcodeLabel, short opcodeBase)
|
|
static OpCodeMangler GetBasicMangler(String opcodeLabel, short opcodeBase)
|
|
{
|
|
{
|
|
return (modifier,opcode,address)->{
|
|
return (modifier,opcode,address)->{
|
|
- String badOpCode ="";
|
|
|
|
if(modifier!=0x00)
|
|
if(modifier!=0x00)
|
|
{
|
|
{
|
|
- badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
|
|
|
|
|
|
+ //return invalid.mangleOpCode(modifier,opcode,address);
|
|
};
|
|
};
|
|
|
|
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
byte[] opcodeValues = new byte[opcode.length];
|
|
@@ -781,21 +802,55 @@ public class XAPDisAsm {
|
|
value = ParamManglerIndirectY(valueSigned);
|
|
value = ParamManglerIndirectY(valueSigned);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- return addressToString(address)+":"+opcodeLabel+": "+register+" "+value;
|
|
|
|
|
|
+ return OpcodeAddressRangeToString(address,opcode.length)+":"+opcodeLabel+": "+register+" "+value;
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static int untwiddleOpcodeParamBra(byte[] opcode,int opcodelocation)
|
|
|
|
+ {
|
|
|
|
+ int out = opcode[0];
|
|
|
|
+ System.out.println(out);
|
|
|
|
+ System.out.println(String.format("0x%08X", out));
|
|
|
|
+ for(int i=1;i<opcode.length;i++)
|
|
|
|
+ {
|
|
|
|
+ out=out<<8;
|
|
|
|
+ out+=opcode[i];
|
|
|
|
+ System.out.println(out);
|
|
|
|
+ System.out.println(opcode[i]);
|
|
|
|
+ System.out.println(String.format("0x%08X", out));
|
|
|
|
+ }
|
|
|
|
+ out=out+opcodelocation;
|
|
|
|
+ out = out &0x00FFFFFF;
|
|
|
|
+ return out;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
private static String addressToString(int address)
|
|
private static String addressToString(int address)
|
|
{
|
|
{
|
|
return "0x"+(EntryPoint.bytesToHex(Ints.toByteArray(address)));
|
|
return "0x"+(EntryPoint.bytesToHex(Ints.toByteArray(address)));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static String OpcodeAddressRangeToString(int address,int opcodelen)
|
|
|
|
+ {
|
|
|
|
+ if(opcodelen>1)
|
|
|
|
+ {
|
|
|
|
+ return addressToString(address)+
|
|
|
|
+ "---"+
|
|
|
|
+ addressToString(address+(opcodelen-1));
|
|
|
|
+ }
|
|
|
|
+ else return addressToString(address);
|
|
|
|
+ }
|
|
|
|
+
|
|
private static String ParamManglerImmediate(int number)
|
|
private static String ParamManglerImmediate(int number)
|
|
{
|
|
{
|
|
return "#"+number;
|
|
return "#"+number;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static String ParamManglerConstAddr(int number)
|
|
|
|
+ {
|
|
|
|
+ return String.format("0x%08X", number);
|
|
|
|
+ }
|
|
|
|
+
|
|
private static String ParamManglerAddress(int number)
|
|
private static String ParamManglerAddress(int number)
|
|
{
|
|
{
|
|
return "@"+number;
|
|
return "@"+number;
|
|
@@ -828,8 +883,16 @@ public class XAPDisAsm {
|
|
{
|
|
{
|
|
Short word = f.readShort();
|
|
Short word = f.readShort();
|
|
System.out.println("READ:"+ (word&0xff));
|
|
System.out.println("READ:"+ (word&0xff));
|
|
|
|
+ System.out.println(addressToString(i));
|
|
|
|
+ System.out.println(addressToString(baseAddressLastOpcode));
|
|
opcodeHoldingBay.add(word);
|
|
opcodeHoldingBay.add(word);
|
|
- if((word&0xFF)!=0)
|
|
|
|
|
|
+ if(word==(short)0xfe09) //specialcasing one specific opcode
|
|
|
|
+ {
|
|
|
|
+ opcodeHoldingBay.clear();
|
|
|
|
+ disassembled.println(brxl.mangleOpCode((short)0x00,(short[])null,baseAddressLastOpcode));
|
|
|
|
+ baseAddressLastOpcode++;
|
|
|
|
+ }
|
|
|
|
+ else if((word&0xFF)!=0)
|
|
{
|
|
{
|
|
if((word&0xFF)!=0x09)//skip modifier
|
|
if((word&0xFF)!=0x09)//skip modifier
|
|
{
|
|
{
|
|
@@ -853,7 +916,15 @@ public class XAPDisAsm {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
System.out.println("Mangling Opcode with length"+opcode.length);
|
|
System.out.println("Mangling Opcode with length"+opcode.length);
|
|
- disassembled.println(manglers[word&0xff].mangleOpCode(modifier,opcode,baseAddressLastOpcode));
|
|
|
|
|
|
+ try{
|
|
|
|
+ disassembled.println(manglers[word&0xff].mangleOpCode(modifier,opcode,baseAddressLastOpcode));
|
|
|
|
+ }
|
|
|
|
+ catch(Exception e)
|
|
|
|
+ {
|
|
|
|
+ System.err.println(invalid.mangleOpCode(modifier,opcode,baseAddressLastOpcode));
|
|
|
|
+ disassembled.println(invalid.mangleOpCode(modifier,opcode,baseAddressLastOpcode));
|
|
|
|
+ //System.exit(-1);
|
|
|
|
+ }
|
|
baseAddressLastOpcode+=opcodeHoldingBay.size();
|
|
baseAddressLastOpcode+=opcodeHoldingBay.size();
|
|
opcodeHoldingBay.clear();
|
|
opcodeHoldingBay.clear();
|
|
|
|
|