Example #1
0
        public void Decompile(String InputFilename, String OutputFilename)
        {
            FileStream   InFileStream;
            StreamWriter OutFileStream;

            try
            {
                InFileStream = new FileStream(InputFilename, FileMode.Open);
            }
            catch
            {
                Console.WriteLine(String.Format("Cannot open intput file: {0}", InputFilename));
                return;
            }

            try
            {
                OutFileStream = new StreamWriter(OutputFilename, false, System.Text.Encoding.ASCII);
            }
            catch
            {
                Console.WriteLine(String.Format("Cannot open output file: {0}", OutputFilename));
                return;
            }

            Console.WriteLine(String.Format("Decompiling: {0}", InputFilename));

            FillOpT1();

            int    ByteFromFile;
            byte   Byte;
            string Mnemonic;
            bool   HaveNextByte = false;
            int    Line         = 1;

            ByteFromFile = InFileStream.ReadByte();

            while (ByteFromFile != -1)
            {
                if (ByteFromFile == 0x00)    //NULL
                {
                    ByteFromFile = InFileStream.ReadByte();
                    continue;
                }

                if (OpListT1.TryGetValue(ByteFromFile, out Mnemonic))  //without parameter
                {
                    OutFileStream.WriteLine(Mnemonic);
                }
                else
                if (OpListT2.TryGetValue(ByteFromFile, out Mnemonic))  //number|stack or IND number|stack
                {
                    String Ind = String.Empty;

                    ByteFromFile = InFileStream.ReadByte();

                    if ((ByteFromFile & 0x80) != 0)
                    {
                        ByteFromFile &= 0x7f;
                        Ind           = "IND ";
                    }

                    if (ByteFromFile <= 101)
                    {
                        OutFileStream.WriteLine("{0} {1}{2}", Mnemonic, Ind, ByteFromFile.ToString());
                    }
                    else
                    {
                        OutFileStream.WriteLine("{0} {1}{2}", Mnemonic, Ind, StackParamter[(short)ByteFromFile]);
                    }
                }
                else
                if ((ByteFromFile & 0xf0) == 0x20) //rcl number <= 15
                {
                    OutFileStream.WriteLine("RCL {0}", (ByteFromFile & 0x0F).ToString("D2"));
                }
                else
                if ((ByteFromFile & 0xf0) == 0x30) //sto number <= 15
                {
                    OutFileStream.WriteLine("STO {0}", (ByteFromFile & 0x0F).ToString("D2"));
                }
                else
                if ((ByteFromFile & 0xf0) == 0x00) //lbl number < 15
                {
                    OutFileStream.WriteLine("LBL {0}", ((ByteFromFile & 0x0F) - 1).ToString("D2"));
                }
                else
                if ((ByteFromFile & 0xf0) == 0xb0) //gto number < 15
                {
                    OutFileStream.WriteLine("GTO {0}", ((ByteFromFile & 0x0F) - 1).ToString("D2"));
                }
                else
                if (OpListT3.TryGetValue(ByteFromFile, out Mnemonic))  //gto, xeq [number > 15]
                {
                    ByteFromFile = InFileStream.ReadByte();
                    ByteFromFile = InFileStream.ReadByte();

                    if (ByteFromFile <= 101)
                    {
                        OutFileStream.WriteLine("{0} {1}", Mnemonic, ByteFromFile.ToString("D2"));
                    }
                    else
                    {
                        OutFileStream.WriteLine("{0} {1}", Mnemonic, ShortLabelParamter[(short)ByteFromFile]);
                    }
                }
                else
                if (ByteFromFile == 0xcf) //lbl [number > 14]
                {
                    ByteFromFile = InFileStream.ReadByte();

                    if (ByteFromFile <= 101)
                    {
                        OutFileStream.WriteLine("LBL {0}", ByteFromFile.ToString("D2"));
                    }
                    else
                    {
                        OutFileStream.WriteLine("LBL {0}", ShortLabelParamter[(short)ByteFromFile]);
                    }
                }
                else
                if (ByteFromFile == 0xae) //gto, xeq ind ..
                {
                    ByteFromFile = InFileStream.ReadByte();

                    if ((ByteFromFile & 0x80) == 0)
                    {
                        Mnemonic = "GTO";
                    }
                    else
                    {
                        Mnemonic = "XEQ";
                    }

                    ByteFromFile &= 0x7f;

                    if (ByteFromFile <= 101)
                    {
                        OutFileStream.WriteLine("{0} IND {1}", Mnemonic, ByteFromFile.ToString("D2"));
                    }
                    else
                    {
                        OutFileStream.WriteLine("{0} IND {1}", Mnemonic, StackParamter[(short)ByteFromFile]);
                    }
                }
                else
                if ((ByteFromFile & 0xf8) == 0xa0) //xrom
                {
                    int Byte2;
                    int Module;
                    int Function;

                    Byte2    = InFileStream.ReadByte();
                    Module   = ((ByteFromFile & 0x07) << 2) | (Byte2 >> 6);
                    Function = Byte2 & 0x3f;

                    OutFileStream.WriteLine("XROM {0},{1}", Module.ToString("D2"), Function.ToString("D2"));
                }
                else
                if ((ByteFromFile & 0xf0) == 0xc0) //lbl alpha
                {
                    int    Len;
                    String Label = String.Empty;

                    ByteFromFile = InFileStream.ReadByte();
                    Len          = InFileStream.ReadByte();
                    ByteFromFile = InFileStream.ReadByte();

                    if ((Len & 0xf0) == 0xf0)
                    {
                        Len -= 0xf1;

                        while (Len-- > 0)
                        {
                            ByteFromFile = InFileStream.ReadByte();
                            Label       += (char)ByteFromFile;
                        }

                        OutFileStream.WriteLine("LBL \"{0}\"", Label);
                    }
                    else
                    {
                        OutFileStream.WriteLine("END");
                    }
                }
                else
                if (OpListT4.TryGetValue(ByteFromFile, out Mnemonic))  //gto, xeq alpha
                {
                    int    Len;
                    String Label = String.Empty;

                    Len = InFileStream.ReadByte() - 0xf0;

                    while (Len-- > 0)
                    {
                        ByteFromFile = InFileStream.ReadByte();
                        Label       += (char)ByteFromFile;
                    }

                    OutFileStream.WriteLine("LBL \"{0}\"", Label);
                }
                else
                if ((ByteFromFile & 0xf0) == 0xf0) //alpha
                {
                    int    Len;
                    String Label  = String.Empty;
                    String Append = String.Empty;

                    Len          = ByteFromFile & 0x0f;
                    ByteFromFile = InFileStream.ReadByte();

                    if (ByteFromFile == 0x7f) //append
                    {
                        Append       = ">";
                        ByteFromFile = InFileStream.ReadByte();
                        Len--;
                    }

                    while (Len-- > 0)
                    {
                        Label       += (char)ByteFromFile;
                        ByteFromFile = InFileStream.ReadByte();
                    }

                    OutFileStream.WriteLine("{0}\"{1}\"", Append, Label);
                }
                else
                if (ByteFromFile >= 0x10 && ByteFromFile <= 0x1c) //number
                {
                    do
                    {
                        if (ByteFromFile == 0x1b)
                        {
                            OutFileStream.Write("E");
                        }
                        else
                        if (ByteFromFile == 0x1a)
                        {
                            OutFileStream.Write(".");
                        }
                        else
                        if (ByteFromFile == 0x1c)
                        {
                            OutFileStream.Write("-");
                        }
                        else
                        {
                            OutFileStream.Write("{0}", (char)(ByteFromFile - 0x10 + '0'));
                        }

                        ByteFromFile = InFileStream.ReadByte();
                    }while (ByteFromFile >= 0x10 && ByteFromFile <= 0x1c);

                    OutFileStream.WriteLine();
                    HaveNextByte = true;
                }
                else
                {
                    OutFileStream.WriteLine("? {0}", ByteFromFile.ToString("X2"));
                }

                if (!HaveNextByte)
                {
                    ByteFromFile = InFileStream.ReadByte();
                }

                HaveNextByte = false;
            }

            InFileStream.Close();
            OutFileStream.Close();
        }
Example #2
0
        public void Decompile(String InputFilename, String OutputFilename)
        {
            FileStream   InFileStream;
            StreamWriter OutFileStream;

            try
            {
                InFileStream = new FileStream(InputFilename, FileMode.Open);
            }
            catch
            {
                Console.WriteLine(String.Format("Cannot open intput file: {0}", InputFilename));
                return;
            }

            try
            {
                OutFileStream = new StreamWriter(OutputFilename, false, System.Text.Encoding.ASCII);
            }
            catch
            {
                Console.WriteLine(String.Format("Cannot open output file: {0}", OutputFilename));
                return;
            }

            Console.WriteLine(String.Format("Decompiling: {0}", InputFilename));

            InitParameter();

            ///////////////////////////////

            int       ByteFromFile;
            string    Mnemonic;
            bool      HaveNextByte = false;
            OpCodes   OpCodes      = new FocalDecompiler.OpCodes();
            XRomCodes XRomCodes    = new XRomCodes(false);

            string exeFilename = Assembly.GetExecutingAssembly().Location;

            XRomCodes.AddMnemonicsFromFile(Path.Combine(Path.GetDirectoryName(exeFilename), "XRomCodes.txt"));

            ByteFromFile = InFileStream.ReadByte();

            int[] dump    = new int[50];
            int   dumpidx = 0;

            try
            {
                while (ByteFromFile != -1)
                {
                    dumpidx         = 0;
                    dump[dumpidx++] = ByteFromFile;

                    OpCodes.OpCode OpCode = OpCodes.GetOpCodeInfo(ByteFromFile);

                    switch (OpCode.FctType)
                    {
                    case FocalDecompiler.OpCodes.FctType.Null:
                        break;

                    case FocalDecompiler.OpCodes.FctType.NoParam:
                        OutFileStream.WriteLine(OpCode.Mnemonic);
                        break;

                    case FocalDecompiler.OpCodes.FctType.R_0_9:
                    {
                        String Ind = String.Empty;

                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;

                        if ((ByteFromFile & 0x80) != 0)
                        {
                            ByteFromFile &= 0x7f;
                            Ind           = "IND ";
                        }

                        if (ByteFromFile <= 101)
                        {
                            OutFileStream.WriteLine("{0,-4} {1}{2}", OpCode.Mnemonic, Ind, ByteFromFile.ToString("D1"));
                        }
                        else
                        {
                            OutFileStream.WriteLine("{0,-4} {1}{2}", OpCode.Mnemonic, Ind, StackParamter[(short)ByteFromFile]);
                        }

                        break;
                    }

                    case FocalDecompiler.OpCodes.FctType.R_0_55:
                    case FocalDecompiler.OpCodes.FctType.R_0_101_Stack:
                    {
                        String Ind = String.Empty;

                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;

                        if ((ByteFromFile & 0x80) != 0)
                        {
                            ByteFromFile &= 0x7f;
                            Ind           = "IND ";
                        }

                        if (ByteFromFile <= 101)
                        {
                            OutFileStream.WriteLine("{0,-4} {1}{2}", OpCode.Mnemonic, Ind, ByteFromFile.ToString("D2"));
                        }
                        else
                        {
                            OutFileStream.WriteLine("{0,-4} {1}{2}", OpCode.Mnemonic, Ind, StackParamter[(short)ByteFromFile]);
                        }

                        break;
                    }

                    case FocalDecompiler.OpCodes.FctType.R_0_15:
                        OutFileStream.WriteLine("{0,-4} {1}", OpCode.Mnemonic, (ByteFromFile & 0x0F).ToString("D2"));
                        break;

                    case FocalDecompiler.OpCodes.FctType.R_0_14:
                        OutFileStream.WriteLine("{0,-4} {1}", OpCode.Mnemonic, ((ByteFromFile & 0x0F) - 1).ToString("D2"));
                        break;

                    case FocalDecompiler.OpCodes.FctType.GTO_0_14:
                        OutFileStream.WriteLine("{0,-4} {1}", OpCode.Mnemonic, ((ByteFromFile & 0x0F) - 1).ToString("D2"));
                        ByteFromFile = InFileStream.ReadByte();
                        break;

                    case FocalDecompiler.OpCodes.FctType.R_0_99_A_J:
                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;
                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;

                        ByteFromFile &= 0x7F;

                        if (ByteFromFile <= 101)
                        {
                            OutFileStream.WriteLine("{0,-4} {1}", OpCode.Mnemonic, ByteFromFile.ToString("D2"));
                        }
                        else
                        {
                            OutFileStream.WriteLine("{0,-4} {1}", OpCode.Mnemonic, ShortLabelParamter[(short)ByteFromFile]);
                        }

                        break;

                    case FocalDecompiler.OpCodes.FctType.LBL_0_99_A_J:
                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;

                        if (ByteFromFile <= 101)
                        {
                            OutFileStream.WriteLine("{0,-4} {1}", OpCode.Mnemonic, ByteFromFile.ToString("D2"));
                        }
                        else
                        {
                            OutFileStream.WriteLine("{0,-4} {1}", OpCode.Mnemonic, ShortLabelParamter[(short)ByteFromFile]);
                        }

                        break;

                    case FocalDecompiler.OpCodes.FctType.GTO_XEQ_Ind:
                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;

                        if ((ByteFromFile & 0x80) == 0)
                        {
                            Mnemonic = "GTO";
                        }
                        else
                        {
                            Mnemonic = "XEQ";
                        }

                        ByteFromFile &= 0x7f;

                        if (ByteFromFile <= 101)
                        {
                            OutFileStream.WriteLine("{0,-4} IND {1}", Mnemonic, ByteFromFile.ToString("D2"));
                        }
                        else
                        {
                            OutFileStream.WriteLine("{0,-4} IND {1}", Mnemonic, StackParamter[(short)ByteFromFile]);
                        }

                        break;

                    case FocalDecompiler.OpCodes.FctType.XRom:
                    {
                        int      Byte2;
                        int      Module;
                        int      Function;
                        XRomCode XRomCode;

                        Byte2           = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;
                        Module          = ((ByteFromFile & 0x07) << 2) | (Byte2 >> 6);
                        Function        = Byte2 & 0x3f;

                        if (XRomCodes.FindFunction(Module, Function, out XRomCode))
                        {
                            OutFileStream.WriteLine("{0}", XRomCode.Mnemonic);
                        }
                        else
                        {
                            OutFileStream.WriteLine("{0,-4} {1},{2}", OpCode.Mnemonic, Module.ToString("D2"), Function.ToString("D2"));
                        }
                        break;
                    }

                    case FocalDecompiler.OpCodes.FctType.LabelAlpha:
                    {
                        int    Len;
                        String Label = String.Empty;

                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;
                        Len             = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;
                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;

                        if ((Len & 0xf0) != 0)
                        {
                            Len -= 0xf1;

                            while (Len-- > 0)
                            {
                                ByteFromFile    = InFileStream.ReadByte();
                                dump[dumpidx++] = ByteFromFile;
                                Label          += (char)ByteFromFile;
                            }

                            OutFileStream.WriteLine("{0,-4} \"{1}\"", OpCode.Mnemonic, Label);
                        }
                        else
                        {
                            OutFileStream.WriteLine("END");
                        }

                        break;
                    }

                    case FocalDecompiler.OpCodes.FctType.GTO_XEQ_Alpha:
                    {
                        int    Len;
                        String Label = String.Empty;

                        Len             = InFileStream.ReadByte() - 0xf0;
                        dump[dumpidx++] = ByteFromFile;

                        while (Len-- > 0)
                        {
                            ByteFromFile    = InFileStream.ReadByte();
                            dump[dumpidx++] = ByteFromFile;
                            Label          += (char)ByteFromFile;
                        }

                        OutFileStream.WriteLine("{0,-4} \"{1}\"", OpCode.Mnemonic, Label);
                        break;
                    }

                    case FocalDecompiler.OpCodes.FctType.Alpha:
                    {
                        int    Len;
                        String Label  = String.Empty;
                        String Append = String.Empty;

                        Len             = ByteFromFile & 0x0f;
                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;

                        if (ByteFromFile == 0x7f)         //append
                        {
                            Append          = ">";
                            ByteFromFile    = InFileStream.ReadByte();
                            dump[dumpidx++] = ByteFromFile;
                            Len--;
                        }

                        while (Len-- > 0)
                        {
                            Label          += (char)ByteFromFile;
                            ByteFromFile    = InFileStream.ReadByte();
                            dump[dumpidx++] = ByteFromFile;
                        }

                        OutFileStream.WriteLine("{0}\"{1}\"", Append, Label);
                        HaveNextByte = true;
                        break;
                    }

                    case FocalDecompiler.OpCodes.FctType.Number:
                        do
                        {
                            if (ByteFromFile == 0x1b)
                            {
                                OutFileStream.Write("E");
                            }
                            else
                            if (ByteFromFile == 0x1a)
                            {
                                OutFileStream.Write(".");
                            }
                            else
                            if (ByteFromFile == 0x1c)
                            {
                                OutFileStream.Write("-");
                            }
                            else
                            {
                                OutFileStream.Write("{0}", (char)(ByteFromFile - 0x10 + '0'));
                            }

                            ByteFromFile    = InFileStream.ReadByte();
                            dump[dumpidx++] = ByteFromFile;
                            OpCode          = OpCodes.GetOpCodeInfo(ByteFromFile);
                        }while (OpCode.FctType == FocalDecompiler.OpCodes.FctType.Number);

                        OutFileStream.WriteLine();
                        HaveNextByte = true;
                        break;

                    default:
                        OutFileStream.WriteLine("? {0}", ByteFromFile.ToString("X2"));
                        break;
                    }

                    if (!HaveNextByte)
                    {
                        ByteFromFile    = InFileStream.ReadByte();
                        dump[dumpidx++] = ByteFromFile;
                    }

                    HaveNextByte = false;
                }
            }
            catch (Exception e)
            {
                Console.Write("Exception caught on statement: ");

                for (int i = 0; i < dumpidx; i++)
                {
                    Console.Write("{0} ", dump[i]);
                }

                Console.WriteLine();
            }


            InFileStream.Close();
            OutFileStream.Close();
        }