浏览代码

removed the autogenerated F-Bomb, some more ASM details

LH 3 年之前
父节点
当前提交
ef28922579

+ 2 - 2
QuickStuff/src/main/java/QuickVerifyCrap/ASMFucker.java

@@ -2,9 +2,9 @@ package QuickVerifyCrap;
 
 public class ASMFucker {
     public static void main(String[] args) {
-        for(int i=-65535;i<1;i++)
+        for(int i=0;i<0x0FFFFF;i++)
         {
-            System.out.println("enterl #"+i);
+            System.out.println("bra #"+i);
         }
     }
 }

+ 49 - 0
QuickStuff/src/main/java/QuickVerifyCrap/ASMGotoHell.java

@@ -0,0 +1,49 @@
+package QuickVerifyCrap;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+
+public class ASMGotoHell {
+    public static void main(String[] args) throws Exception{
+        PrintStream metabatschp = new PrintStream(new FileOutputStream(new File("Q:\\scratchspace\\asm\\assemblerp.bat")));
+        PrintStream metabatschn = new PrintStream(new FileOutputStream(new File("Q:\\scratchspace\\asm\\assemblern.bat")));
+        metabatschp.println("cd positive");
+        metabatschn.println("cd negative");
+        //0x1000000
+        for(int i=0;i<0x1000000;i++)
+        {
+            PrintStream s = new PrintStream(new FileOutputStream(new File("Q:\\scratchspace\\asm\\negatives\\"+i+".xap")));
+            s.println("\tMODULE\tcrt0\n" +
+                    "\t.CODE\n" +
+                    "\tORG\tH'0000");
+            for(int j=0;j<i;j++)
+            {
+                s.println("nop");
+            }
+            s.println("bra 0");
+            s.close();
+
+            s = new PrintStream(new FileOutputStream(new File("Q:\\scratchspace\\asm\\positives\\"+i+".xap")));
+
+            s.println("\tMODULE\tcrt0\n" +
+                    "\t.CODE\n" +
+                    "\tORG\tH'0000");
+            s.println("bra "+i);
+            s.close();
+
+
+
+
+            String asm = "C:\\ADK_CSR867x.WIN4.3.1.5\\tools\\lib\\gcc-lib\\xap-local-xap-assisted\\3.3.3\\xapasmcsr -list -pass 250 -I C:/ADK_CSR867x.WIN4.3.1.5/tools/lib/gcc-lib/xap-local-xap/3.3.3/ -large -supcmt "+i+".xap";
+            metabatschp.println(asm);
+            metabatschn.println(asm);
+            if(i%1000==0)
+            {
+                System.out.println(i);
+            }
+        }
+        metabatschp.close();
+        metabatschn.close();
+    }
+}

+ 112 - 41
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/XAPDisAsm.java

@@ -13,26 +13,31 @@ interface OpCodeMangler
 }
 
 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];
         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)->{
-                String badOpCode ="";
                 if(modifier!=0x00)
                 {
-                    badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
+                    //return invalid.mangleOpCode(modifier,opcode,address);
                 };
 
                 byte[] opcodeValues = new byte[opcode.length];
@@ -129,14 +134,13 @@ public class XAPDisAsm {
                         value = ParamManglerIndirectY(valueSigned);
                         break;
                 }
-                return addressToString(address)+":ld: "+register+" "+value;
+                return OpcodeAddressRangeToString(address,opcode.length)+":ld: "+register+" "+value;
             };
 
             OpCodeMangler st =  (modifier,opcode,address)->{
-                String badOpCode ="";
                 if(modifier!=0x00)
                 {
-                    badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
+                    //return invalid.mangleOpCode(modifier,opcode,address);
                 };
 
                 byte[] opcodeValues = new byte[opcode.length];
@@ -215,7 +219,7 @@ public class XAPDisAsm {
                         value = ParamManglerIndirectY(valueSigned);
                         break;
                 }
-                return addressToString(address)+":ld: "+register+" "+value;
+                return OpcodeAddressRangeToString(address,opcode.length)+":st: "+register+" "+value;
             };
 
             OpCodeMangler add = GetBasicMangler("add",(short)0x30);
@@ -241,6 +245,10 @@ public class XAPDisAsm {
 
 
             OpCodeMangler enterlleavel = (modifier,opcode,address)->{
+                if(modifier!=0x00)
+                {
+                    //return invalid.mangleOpCode(modifier,opcode,address);
+                };
                 byte[] opcodeValues = new byte[opcode.length];
                 short opcodeReal = 0x00; // only checking lower byte though
                 for(int i=0;i<opcode.length;i++)
@@ -264,10 +272,14 @@ public class XAPDisAsm {
                         break;
                 }
 
-                return addressToString(address)+":"+label+":"+ParamManglerImmediate(valueStack);
+                return OpcodeAddressRangeToString(address,opcode.length)+":"+label+":"+ParamManglerImmediate(valueStack);
             };
 
             OpCodeMangler bxx = (modifier,opcode,address)->{
+                if(modifier!=0x00)
+                {
+                    //return invalid.mangleOpCode(modifier,opcode,address);
+                };
                 byte[] opcodeValues = new byte[opcode.length];
                 short opcodeReal = 0x00; // only checking lower byte though
                 for(int i=0;i<opcode.length;i++)
@@ -294,7 +306,7 @@ public class XAPDisAsm {
                         break;
                 }
                 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)->{
-
-                return addressToString(address)+": nop";
+                if(modifier!=0x00)
+                {
+                    return invalid.mangleOpCode(modifier,opcode,address);
+                };
+                return OpcodeAddressRangeToString(address,opcode.length)+": nop";
             };
             manglers[0x1]=invalid;
             manglers[0x2]=invalid;
@@ -476,7 +491,7 @@ public class XAPDisAsm {
             manglers[0x99]=tst;
             manglers[0x9a]=tst;
             manglers[0x9b]=tst;
-            manglers[0x9c]=invalid;
+            manglers[0x9c]=bsr;
             manglers[0x9d]=bsr;
             manglers[0x9e]=bsr;
             manglers[0x9f]=bsr;
@@ -556,11 +571,11 @@ public class XAPDisAsm {
             manglers[0xde]=xor;
             manglers[0xdf]=xor;
 
-            manglers[0xe0]=invalid;
+            manglers[0xe0]=bra;
             manglers[0xe1]=bra;
             manglers[0xe2]=bra;
             manglers[0xe3]=bra;
-            manglers[0xe4]=invalid;
+            manglers[0xe4]=blt;
             manglers[0xe5]=blt;
             manglers[0xe6]=blt;
             manglers[0xe7]=blt;
@@ -573,19 +588,19 @@ public class XAPDisAsm {
             manglers[0xee]=invalid;
             manglers[0xef]=invalid;
 
-            manglers[0xf0]=invalid;
+            manglers[0xf0]=bne;
             manglers[0xf1]=bne;
             manglers[0xf2]=bne;
             manglers[0xf3]=bne;
-            manglers[0xf4]=invalid;
+            manglers[0xf4]=beq;
             manglers[0xf5]=beq;
             manglers[0xf6]=beq;
             manglers[0xf7]=beq;
-            manglers[0xf8]=invalid;
+            manglers[0xf8]=bcc;
             manglers[0xf9]=bcc;
             manglers[0xfa]=bcc;
             manglers[0xfb]=bcc;
-            manglers[0xfc]=invalid;
+            manglers[0xfc]=bcs;
             manglers[0xfd]=bcs;
             manglers[0xfe]=bcs;
             manglers[0xff]=bcs;
@@ -626,7 +641,7 @@ public class XAPDisAsm {
                     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)
     {
         return (modifier,opcode,address)->{
-            String badOpCode ="";
             if(modifier!=0x00)
             {
-                badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
+                //return invalid.mangleOpCode(modifier,opcode,address);
             };
 
             byte[] opcodeValues = new byte[opcode.length];
@@ -651,14 +665,22 @@ public class XAPDisAsm {
                 opcodeValues[i]=opcodeWord[0];
                 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 value = "";
             switch(opcodeReal)
             {
+                case 0x00:
+                    register="AH";
+                    value = ParamManglerConstAddr(untwiddleOpcodeParamBra(opcodeValues,address));
+                    break;
                 case 0x01:
                     register="AH";
                     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)
     {
         return (modifier,opcode,address)->{
-            String badOpCode ="";
             if(modifier!=0x00)
             {
-                badOpCode += (EntryPoint.bytesToHex(Shorts.toByteArray(modifier)));
+                //return invalid.mangleOpCode(modifier,opcode,address);
             };
 
             byte[] opcodeValues = new byte[opcode.length];
@@ -781,21 +802,55 @@ public class XAPDisAsm {
                     value = ParamManglerIndirectY(valueSigned);
                     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)
     {
         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)
     {
         return "#"+number;
     }
 
+    private static String ParamManglerConstAddr(int number)
+    {
+        return String.format("0x%08X", number);
+    }
+
     private static String ParamManglerAddress(int number)
     {
         return "@"+number;
@@ -828,8 +883,16 @@ public class XAPDisAsm {
             {
                 Short word = f.readShort();
                 System.out.println("READ:"+ (word&0xff));
+                System.out.println(addressToString(i));
+                System.out.println(addressToString(baseAddressLastOpcode));
                 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
                     {
@@ -853,7 +916,15 @@ public class XAPDisAsm {
                             }
                         }
                         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();
                         opcodeHoldingBay.clear();
 

文件差异内容过多而无法显示
+ 755 - 755
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/XAPDisAsmGeneratedCode.java


部分文件因为文件数量过多而无法显示