Пример #1
0
        private void ProcessCommands(byte[] file)
        {
            // Local variables.
            int  numCommands = file.Length / C.CMDLENGTH;
            uint cmd;
            uint opcode;

            // Search file for all instances of a LUI command.
            for (int i = 0; i < numCommands; i++)
            {
                int position = i * 4;

                // If LUI command, find pairs and update addresses.
                cmd    = ASM.GetCommand(file, position);
                opcode = ASM.GetOpcode(cmd);

                switch (opcode)
                {
                case C.LUICMD:
                    UpdateLui(file, cmd, position);
                    break;

                case C.JALCMD:
                    UpdateJAL(file, cmd, position);
                    break;
                }
            }
        }
Пример #2
0
        public override void PrintASM(string levelTabulatiion, bool isNewLine = false)
        {
            bool isConditionBelongToCicle = ASMregisters.isContitionBelongsToCicle;

            ASMregisters.isContitionBelongsToCicle = false;
            string markerJumpPrevBody  = "";
            string markerJumpAfterBody = "";

            if (bodyCondition != null)
            {
                bodyCondition.PrintASM(levelTabulatiion);
                markerJumpPrevBody  = ASMregisters.MarkerJumpPrevBody;
                markerJumpAfterBody = ASMregisters.MarkerJumpAfterBody;
            }
            BinaryExprAST.ClearStaicFlags();

            bool isNextNodeElse = IsNextNodeElse(markerJumpPrevBody, markerJumpAfterBody);

            ASMregisters.ClearMarkerks();

            if (markerJumpPrevBody != null && markerJumpPrevBody != "")
            {
                ASM.WriteASMCode(levelTabulatiion + markerJumpPrevBody + ":");
            }

            (body as BodyMethodAST).PrintASM(levelTabulatiion + "\t", isNewLine);

            if (!isNextNodeElse)
            {
                if (markerJumpAfterBody != null && markerJumpAfterBody != "" && !isConditionBelongToCicle)
                {
                    ASM.WriteASMCode(levelTabulatiion + markerJumpAfterBody + ":");
                }
            }
        }
Пример #3
0
        public override string Convert(ASM.ASMBlock theBlock)
        {
            StringBuilder ASMResult = new StringBuilder();
            ASMResult.AppendLine("# Method Table - " + CurrentTypeName);
            ASMResult.AppendLine(".globl " + CurrentTypeId + "_MethodTable");
            ASMResult.AppendLine(".align 2");
            ASMResult.AppendLine(CurrentTypeId + "_MethodTable:");

            foreach (Tuple<string, string> aMethodInfo in AllMethodInfos)
            {
                string MethodID = aMethodInfo.Item1;
                string MethodIDValue = aMethodInfo.Item2;

                foreach (Tuple<string, int> anEntryFieldInfo in TableEntryFieldInfos)
                {
                    string allocString = ASMUtilities.GetAllocStringForSize(anEntryFieldInfo.Item2);
                    switch (anEntryFieldInfo.Item1)
                    {
                        case "MethodID":
                            ASMResult.AppendLine(allocString + " " + MethodIDValue);
                            break;
                        case "MethodPtr":
                            ASMResult.AppendLine(allocString + " " + MethodID);
                            break;
                    }
                }
            }

            ASMResult.AppendLine("# Method Table End - " + CurrentTypeName);

            return ASMResult.ToString();
        }
Пример #4
0
        private void UpdateJAL(byte[] file, uint jalCmd, int position)
        {
            uint jalImmediate = ASM.GetJalImmediate(jalCmd);
            uint fullAddress  = jalImmediate + 0x80000000;

            // Convert to new address.
            uint offset     = (uint)(fullAddress - _BASERAM);
            uint newAddress = (uint)(_baseRam + RomFile.CurrentFileOffset + offset);

            uint newJal = ASM.BuildNewJalCommand(newAddress);

            byte[] JalArray = BitConverter.GetBytes(newJal);

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(JalArray);
            }

            if ((jalImmediate >= (_BASERAM - 0x80000000)) && (jalImmediate <= (_upperRAM - 0x80000000)))
            {
                file[position]     = JalArray[0];
                file[position + 1] = JalArray[1];
                file[position + 2] = JalArray[2];
                file[position + 3] = JalArray[3];
            }
        }
Пример #5
0
        public override string Convert(ASM.ASMBlock theBlock)
        {
            StringBuilder ASMResult = new StringBuilder();
            ASMResult.AppendLine("; Field Table - " + CurrentTypeName);
            ASMResult.AppendLine("GLOBAL " + CurrentTypeId + "_FieldTable:data");
            ASMResult.AppendLine(CurrentTypeId + "_FieldTable:");
        
            foreach(Tuple<string, string, string> aFieldInfo in AllFieldInfos)
            {
                string fieldOffsetVal = aFieldInfo.Item1;
                string fieldSizeVal = aFieldInfo.Item2;
                string fieldTypeIdVal = aFieldInfo.Item3;

                foreach(Tuple<string, int> anEntryFieldInfo in TableEntryFieldInfos)
                {
                    string allocStr = ASMUtilities.GetAllocStringForSize(anEntryFieldInfo.Item2);
                    switch (anEntryFieldInfo.Item1)
                    {
                        case "Offset":
                            ASMResult.AppendLine(allocStr + " " + fieldOffsetVal);
                            break;
                        case "Size":
                            ASMResult.AppendLine(allocStr + " " + fieldSizeVal);
                            break;
                        case "FieldType":
                            ASMResult.AppendLine(allocStr + " " + fieldTypeIdVal);
                            break;
                    }
                }
            }
            ASMResult.AppendLine("; Field Table End - " + CurrentTypeName);

            return ASMResult.ToString();
        }
Пример #6
0
        /// <summary>
        /// Set the secret code entry message when a player enters a cheat code that is not valid.
        /// </summary>
        /// <param name="msg"></param>
        public static void SetSecretCodeEntryMessage(string msg)
        {
            var address = (IntPtr)Addrs.UIAddrs.STATIC_UI_INVALID_SECRET_CODE_ENTRY_TEXT;

            ASM.Abolish(address, INVALID_SECRET_CODE_ENTRY_TEXT_MAX_LENGTH);
            Memory.WriteStringASCII(address, msg.Substring(0, INVALID_SECRET_CODE_ENTRY_TEXT_MAX_LENGTH));
        }
Пример #7
0
        private void PrintCondition(string levelTabulatiion, bool isNewLine)
        {
            bool isConditionBelongToCicle = ASMregisters.isContitionBelongsToCicle;

            ASMregisters.isContitionBelongsToCicle = false;
            string markerJumpPrevBody  = "";
            string markerJumpAfterBody = "";

            if (condition != null)
            {
                condition.PrintASM(levelTabulatiion);
                markerJumpPrevBody  = ASMregisters.MarkerJumpPrevBody;
                markerJumpAfterBody = ASMregisters.MarkerJumpAfterBody;

                ASMregisters.ClearMarkerks();
            }
            BinaryExprAST.ClearStaicFlags();

            if (markerJumpPrevBody != null && markerJumpPrevBody != "")
            {
                ASM.WriteASMCode(levelTabulatiion + markerJumpPrevBody + ":");
            }

            body.PrintASM(levelTabulatiion + "\t", isNewLine);

            if (markerJumpAfterBody != null && markerJumpAfterBody != "" && !isConditionBelongToCicle)
            {
                ASM.WriteASMCode(levelTabulatiion + markerJumpAfterBody + ":");
            }
        }
Пример #8
0
 /// <summary>
 /// Creates a new instance of an offset.
 /// </summary>
 /// <param name="offset">The raw offset.</param>
 /// <param name="rva">The virtual address that is relative to a section.</param>
 /// <param name="va">The virtual address.</param>
 /// <param name="offsettype">The type of offset.</param>
 public Offset(uint offset, uint rva, ulong va, ASM.OperandType offsettype)
 {
     this.FileOffset = offset;
     this.Rva = rva;
     this.Va = va;
     this.OffsetType = offsettype;
 }
Пример #9
0
        public override void PrintASM(string levelTabulatiion, bool isNewLine = false)
        {
            if (node == null)
            {
                return;
            }

            if (node is BinaryExprAST)
            {
                node.PrintASM(levelTabulatiion);
            }
            else if (node is ParenthesisExprAST)
            {
                node.PrintASM(levelTabulatiion);
            }
            else
            {
                string elementStorage;
                if (node is IEject)
                {
                    elementStorage = (node as IEject).GetValue();
                    string register = ASMregisters.GetFreeRegister(ASMregisters.Register.DATA);
                    ASM.WriteASMCode(levelTabulatiion + "mov\t" + register + ", " + elementStorage);
                    ASM.WriteASMCode(levelTabulatiion + "push\t" + register);
                    ASMregisters.SetStateRegister(ASMregisters.Register.DATA, register, true);
                }
                else
                {
                    node.PrintASM(levelTabulatiion);
                }
            }
        }
Пример #10
0
        public override string Convert(ASM.ASMBlock theBlock)
        {
            StringBuilder LiteralASM = new StringBuilder();
            //This is UTF-16 (Unicode)/ASCII text
            LiteralASM.AppendLine(string.Format("GLOBAL {0}:data", Id));
            LiteralASM.AppendLine(string.Format("{0}:", Id));
            //Put in type info as FOS_System.String type
            LiteralASM.AppendLine(string.Format("dd {0}", StringTypeId));
            //Put in string length bytes
            LiteralASM.Append("db ");
            for (int i = 0; i < 3; i++)
            {
                LiteralASM.Append(LengthBytes[i]);
                LiteralASM.Append(", ");
            }
            LiteralASM.Append(LengthBytes[3]);

            if (Characters.Length > 0)
            {
                //Put in string characters (as words)
                LiteralASM.Append("\ndw ");
                for (int i = 0; i < (Characters.Length - 1); i++)
                {
                    LiteralASM.Append((uint)Characters[i]);
                    LiteralASM.Append(", ");
                }
                LiteralASM.Append((uint)Characters.Last());
            }

            LiteralASM.AppendLine();

            return LiteralASM.ToString();
        }
Пример #11
0
        /// <summary>
        /// Вывод массива
        /// </summary>
        public void PrintArrayASM(string levelTabulatiion)
        {
            if (type != "string")
            {
                string registerIteration = ASMregisters.GetFreeRegister(ASMregisters.Register.DATA);
                ASM.WriteASMCode(levelTabulatiion + "mov\t" + registerIteration + ", 0");
                PrintArrayIterationASM(levelTabulatiion + "\t", registerIteration, isShowResult: true);

                for (int i = 0; i < lengthArray; i++)
                {
                    PrintArrayIterationASM(levelTabulatiion + "\t", registerIteration, isShowResult: true);
                }

                ASM.WriteASMCode(levelTabulatiion + "push\t" + ASMregisters.NewString);
                ASM.WriteASMCode(levelTabulatiion + "call\t[printf]");

                ASMregisters.SetStateRegister(ASMregisters.Register.DATA, registerIteration, true);
            }
            else
            {
                for (int i = 0; i < lengthArray; i++)
                {
                    PrintStringASM(levelTabulatiion, i);
                }
            }
        }
Пример #12
0
        internal static void _setNetworkLobbyIP(string ip)
        {
            var address = (IntPtr)Addrs.NetworkAddrs.STATIC_NETWORK_LOBBY_IP;

            ASM.Abolish(address, NETWORK_LOBBY_IP_LENGTH);
            Memory.WriteStringASCII(address, ip.Substring(0, NETWORK_LOBBY_IP_LENGTH));
        }
Пример #13
0
        public SpellAnimEditor()
        {
            try
            {
                InitializeComponent();

                EntryArrayBox.Load("Spell Animations.txt");
                EntryArrayBox.Value         = 0;
                EntryArrayBox.ValueChanged += EntryArrayBox_ValueChanged;

                Commands              = new SpellCommands("Spell Commands.txt");
                Anim_CodeBox.KeyDown += new KeyEventHandler(TextBox_SelectAll);
                Anim_CodeBox.AddSyntax(ASM.GetInstructionsRegex_Thumb(), System.Drawing.Color.Black, FontStyle.Bold | FontStyle.Italic);
                Anim_CodeBox.AddSyntax(Commands.GetRegex(), SystemColors.Highlight);
                Anim_CodeBox.AddSyntax(@"((\b[0-9]+)|((\b0x|\$)[0-9a-fA-F]+))\b", System.Drawing.Color.SlateBlue);
                Anim_CodeBox.AddSyntax("return|label.*", SystemColors.ControlDark);
                Anim_CodeBox.AddSyntax("@.*", SystemColors.ControlDark);
            }
            catch (Exception ex)
            {
                Program.ShowError("Could not properly open the " + this.Text, ex);

                Core_CloseEditor(this, null);
            }
        }
Пример #14
0
        private void UpdateF37F90(AsmFile fileObj)
        {
            uint jr = 0x03E00008;
            uint cmd;

            if (fileObj.Id == (int)_levelID.CC)
            {
                cmd = ASM.GetCommand(_F37F90, 0x5DA20);
                UpdateJAL(_F37F90, cmd, 0x5DA20);
            }


            for (int j = 0; j < C.AsmGlobalsFuncsOffsets.afo[fileObj.Id].Length; j++)
            {
                int pos = C.AsmGlobalsFuncsOffsets.afo[fileObj.Id][j];

                // Step thru all commands in subroutine and check for JALs.
                while (ASM.GetCommand(_F37F90, pos) != jr)
                {
                    cmd = ASM.GetCommand(_F37F90, pos);
                    if (ASM.GetOpcode(cmd) == C.JALCMD)
                    {
                        UpdateJAL(_F37F90, cmd, pos);
                    }

                    pos += 4;
                }
            }
        }
Пример #15
0
        public static void Cast(Core core, int skillID)
        {
            //00492AFA    8B0D D46F9200     mov ecx,dword ptr ds:[926FD4]              ; elementc.00927630
            //00492B00    8B40 08           mov eax,dword ptr ds:[eax+8]
            //00492B03    6A FF             push -1
            //00492B05    6A 00             push 0
            //00492B07    8B51 1C           mov edx,dword ptr ds:[ecx+1C]
            //00492B0A    6A 00             push 0
            //00492B0C    50                push eax
            //00492B0D    8B4A 20           mov ecx,dword ptr ds:[edx+20]
            //00492B10    E8 BB2EFCFF       call elementc.004559D0

            var asm = new ASM();

            {
                asm.Pushad();

                asm.Push6A(-1);
                asm.Push6A(0);
                asm.Push6A(0);
                asm.Mov_EDX(skillID);
                asm.Push_EDX();

                asm.Mov_ECX_DWORD_Ptr(Game.GameBaseAddress);
                asm.Mov_ECX_DWORD_Ptr_ECX_Add(0x1C);
                asm.Mov_ECX_DWORD_Ptr_ECX_Add(0x20);

                asm.Mov_EAX(0x004559D0);
                asm.Call_EAX();

                asm.Popad();
                asm.Ret();
            };
            asm.Run(core);
        }
Пример #16
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     int numBytes = (int)Size;
     string loadOp = "";
     switch(Size)
     {
         case OperandSize.Byte:
             if (SignExtend)
             {
                 loadOp = "lb";
             }
             else
             {
                 loadOp = "lbu";
             }
             break;
         case OperandSize.Halfword:
             if (SignExtend)
             {
                 loadOp = "lh";
             }
             else
             {
                 loadOp = "lhu";
             }
             break;
         case OperandSize.Word:
             loadOp = "lw";
             break;
     }
     return loadOp + " " + Dest + ", 0($sp)\r\n" +
             "addi $sp, $sp, " + numBytes;
 }
Пример #17
0
        public override void PrintASM(string levelTabulatiion, bool isNewLine = false)
        {
            IdentificatorAST identificatorRight = (IdentificatorAST)SymTable.symTabls.FindNode((id as IdentificatorAST).GetName());
            int startInStack = identificatorRight.GetAddresInStack();

            ASM.WriteASMCode(levelTabulatiion + ASMregisters.GetCrement(crement) + "\t" + ASMregisters.GetNameType(identificatorRight.GetTypeId()) + " [ebp-" + startInStack + "], 1");
        }
Пример #18
0
 private void PrintExprAST(ASTNode node, string levelTabulatiion)
 {
     if (ASMregisters.HasFillRegisters(ASMregisters.Register.DATA))
     {
         ASM.WriteASMCode(levelTabulatiion + "push\t" + ASMregisters.GetFirstFillRegister(ASMregisters.Register.DATA));
     }
     node.PrintASM(levelTabulatiion);
 }
Пример #19
0
 private void PrintValueASM(string levelTabulatiion, string register, string offset = "")
 {
     ASM.WriteASMCode(levelTabulatiion + "mov\t" + register + ", " + ASMregisters.GetNameType(type) + " [ebp-" + startInStack + offset + "]");
     ASM.WriteASMCode(levelTabulatiion + "push\t" + register);
     ASM.WriteASMCode(levelTabulatiion + "push\t" + ASMregisters.ShowValue);
     ASM.WriteASMCode(levelTabulatiion + "call\t[printf]");
     ASM.WriteASMCode(levelTabulatiion + "push\t" + ASMregisters.SpaceString);
     ASM.WriteASMCode(levelTabulatiion + "call\t[printf]");
 }
Пример #20
0
        /// <summary>
        /// Вывод переменной
        /// </summary>
        public void PrintIdentificatorASM(string levelTabulatiion)
        {
            string register = ASMregisters.GetFreeRegister(ASMregisters.Register.DATA);

            PrintValueASM(levelTabulatiion, register);
            ASMregisters.SetStateRegister(ASMregisters.Register.DATA, register, true);
            ASM.WriteASMCode(levelTabulatiion + "push\t" + ASMregisters.NewString);
            ASM.WriteASMCode(levelTabulatiion + "call\t[printf]");
        }
Пример #21
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (MoveType == MoveTypes.SrcRegToDestMemory)
     {
         switch (Size)
         {
             case OperandSize.Byte:
                 return "sb " + Src + ", " + Dest;
             case OperandSize.Halfword:
                 return "sh " + Src + ", " + Dest;
             case OperandSize.Word:
                 return "sw " + Src + ", " + Dest;
             default:
                 throw new NotSupportedException("MIPS: Unrecognised move operand sizes. (DestIsMemory)");
         }
     }
     else if (MoveType == MoveTypes.SrcMemoryToDestReg)
     {
         if (SignExtend)
         {
             switch (Size)
             {
                 case OperandSize.Byte:
                     return "lb " + Dest + ", " + Src;
                 case OperandSize.Halfword:
                     return "lh " + Dest + ", " + Src;
                 case OperandSize.Word:
                     return "lw " + Dest + ", " + Src;
                 default:
                     throw new NotSupportedException("MIPS: Unrecognised move operand sizes. (SrcIsMemory)");
             }
         }
         else
         {
             switch (Size)
             {
                 case OperandSize.Byte:
                     return "lbu " + Dest + ", " + Src;
                 case OperandSize.Halfword:
                     return "lhu " + Dest + ", " + Src;
                 case OperandSize.Word:
                     return "lw " + Dest + ", " + Src;
                 default:
                     throw new NotSupportedException("MIPS: Unrecognised move operand sizes. (SrcIsMemory)");
             }
         }
     }
     else if (MoveType == MoveTypes.ImmediateToReg)
     {
         return "add " + Dest + ", $zero, " + Src;
     }
     else
     {
         return "move " + Dest + ", " + Src;
     }
 }
Пример #22
0
        private void PrintStringASM(string levelTabulatiion, int i)
        {
            string register = ASMregisters.GetFreeRegister(ASMregisters.Register.DATA);

            ASM.WriteASMCode(levelTabulatiion + "mov\t" + register + ", [ebp-" + (startInStack + i * 4) + "]");
            ASM.WriteASMCode(levelTabulatiion + "mov\t" + "[" + ASMregisters.BufferString + "], " + register);
            ASM.WriteASMCode(levelTabulatiion + "push\t" + ASMregisters.BufferString);
            //ASM.WriteASMCode(levelTabulatiion + "push\t" + ASMregisters.ShowString);
            ASM.WriteASMCode(levelTabulatiion + "call\t[printf]");
            ASMregisters.SetStateRegister(ASMregisters.Register.DATA, register, true);
        }
Пример #23
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (Signed)
     {
         return "mult " + Src1 + ", " + Src2;
     }
     else
     {
         return "multu " + Src1 + ", " + Src2;
     }
 }
Пример #24
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (WithBorrow)
     {
         return "sbb " + Dest + ", " + Src;
     }
     else
     {
         return "sub " + Dest + ", " + Src;
     }
 }
Пример #25
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (!string.IsNullOrWhiteSpace(Count))
     {
         return "shld " + Dest + ", " + Src + ", " + Count;
     }
     else
     {
         return "shl " + Dest + ", " + Src;
     }
 }
Пример #26
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (WithCarry)
     {
         return "adc " + Dest + ", " + Src;
     }
     else
     {
         return "add " + Dest + ", " + Src;
     }
 }
Пример #27
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (Signed)
     {
         return "div " + Arg1 + ", " + Arg2;
     }
     else
     {
         return "divu " + Arg1 + ", " + Arg2;
     }
 }
Пример #28
0
        //public static T Call<T>(IntPtr address, params dynamic[] args)
        //{
        //    return Call<T>(((IntPtr)address, (IntPtr)address + 0x1590, (IntPtr)address), args);
        //}

        //public static T CallReg<T>(IntPtr address, dynamic[] args,
        //    dynamic eax = null,
        //    dynamic ecx = null,
        //    dynamic edx = null,
        //    dynamic ebx = null,
        //    dynamic esp = null,
        //    dynamic esi = null,
        //    dynamic edi = null)
        //{
        //    return CallReg<T>(((IntPtr)address, (IntPtr)address + 0x1590, (IntPtr)address), args, eax, ecx, edx, ebx, esp, esi, edi);
        //}

        public static T Call <T>(Memloc address, params dynamic[] args)
        {
            if (IntPtr.Size == 4)
            {
                return(ASM.CallIngameFunc <T>(address, args));
            }
            else
            {
                return(ASM.CallIngameFunc64 <T>(address, args));
            }
        }
Пример #29
0
 public static T CallReg <T>(Memloc address, dynamic[] args,
                             dynamic eax = null,
                             dynamic ecx = null,
                             dynamic edx = null,
                             dynamic ebx = null,
                             dynamic esp = null,
                             dynamic esi = null,
                             dynamic edi = null)
 {
     return(ASM.CallIngameFuncReg <T>(address, args, eax, ecx, edx, ebx, esp, esi, edi));
 }
Пример #30
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (Unsigned)
     {
         return "addu " + Dest + ", " + Src1 + ", " + Src2;
     }
     else
     {
         return "add " + Dest + ", " + Src1 + ", " + Src2;
     }
 }
Пример #31
0
        public void Start(IContainer container)
        {
            ASM asmInterfaces = ASM.GetAssembly(typeof(ds.IDataSource)),
                asmClasses    = ASM.GetAssembly(this.GetType());

            container.RegisterFromAssembly(
                servicesAssembly: asmInterfaces,
                implementationsAssembly: asmClasses,
                isService: t => t.IsInterface && !t.IsClass && typeof(ds.IDataSource).IsAssignableFrom(t),
                isServiceImplementation: t => !t.IsInterface && t.IsClass && t.IsSubclassOf(typeof(DAL.DataSource))
                );
        }
Пример #32
0
        internal static void _setDebugErrorString(string s)
        {
            IntPtr address = (IntPtr)UIAddrs.STATIC_DEBUG_ERROR_MSG_ADDRESS;

            ASM.Abolish(address, DEBUG_ERROR_STRING_MAX_LENGTH);
            string newString = s;

            if (newString.Length > DEBUG_ERROR_STRING_MAX_LENGTH)
            {
                newString = newString.Substring(0, DEBUG_ERROR_STRING_MAX_LENGTH);
            }
            memory.WriteStringASCII(address, newString);
        }
Пример #33
0
        internal static void _setErrorMsgString(string s)
        {
            var address = (IntPtr)CarbonAddresses.UIAddrs.STATIC_ERROR_ALLOCATED_MSG;

            ASM.Abolish(address, ERROR_MSG_MAX_LENGTH);
            var newString = s;

            if (newString.Length > ERROR_MSG_MAX_LENGTH)
            {
                newString = newString.Substring(0, ERROR_MSG_MAX_LENGTH);
            }
            Memory.WriteStringASCII(address, newString);
        }
Пример #34
0
        internal static void _setHelloWorldString(string s)
        {
            IntPtr address = (IntPtr)UIAddrs.STATIC_STRING_HELLO_WORLD_ADDRESS;

            ASM.Abolish(address, STRING_MAX_LENGTH);
            string newString = s;

            if (newString.Length > STRING_MAX_LENGTH)
            {
                newString = newString.Substring(0, STRING_MAX_LENGTH);
            }
            memory.WriteStringASCII(address, newString);
        }
Пример #35
0
        /// <summary>
        /// Set the code entry message when a player enters a cheat code that is not valid.
        /// </summary>
        /// <param name="msg"></param>
        public static void SetCodeEntryMessage(string msg)
        {
            var addr = Memory.ReadInt32((IntPtr)Memory.getBaseAddress + Addrs.UIAddrs.PNON_STATIC_UI_INVALID_CODE_ENTRY_TEXT);

            addr = Memory.ReadInt32((IntPtr)addr + Addrs.UIAddrs.POINTER_UI_INVALID_CODE_ENTRY_TEXT_1);
            addr = Memory.ReadInt32((IntPtr)addr + Addrs.UIAddrs.POINTER_UI_INVALID_CODE_ENTRY_TEXT_2);
            addr = Memory.ReadInt32((IntPtr)addr + Addrs.UIAddrs.POINTER_UI_INVALID_CODE_ENTRY_TEXT_3);
            addr = Memory.ReadInt32((IntPtr)addr + Addrs.UIAddrs.POINTER_UI_INVALID_CODE_ENTRY_TEXT_4);
            var final = (IntPtr)addr + Addrs.UIAddrs.POINTER_UI_INVALID_CODE_ENTRY_TEXT_5;

            ASM.Abolish(final, INVALID_CODE_ENTRY_TEXT_MAX_LENGTH);
            Memory.WriteStringASCII(final, msg.Substring(0, INVALID_CODE_ENTRY_TEXT_MAX_LENGTH));
        }
Пример #36
0
        public override void PrintASM(string levelTabulatiion, bool isNewLine = false)
        {
            ASM.WriteASMCode(levelTabulatiion + "jmp\t" + markerPrevBody);
            ASM.WriteASMCode(levelTabulatiion + markerAfterBody + ":");
            (expr as BodyMethodAST).PrintASM(levelTabulatiion, isNewLine);

            ASM.WriteASMCode(levelTabulatiion + markerPrevBody + ":");

            //ASM.WriteASMCode(levelTabulatiion + "jmp\t" + markerAfterBody);
            //ASM.WriteASMCode(levelTabulatiion + markerPrevBody + ":");
            //(expr as BodyMethodAST).PrintASM(levelTabulatiion, isNewLine);

            //ASM.WriteASMCode(levelTabulatiion + markerAfterBody + ":");
        }
Пример #37
0
        public void PrintSringArray(string levelTabulatiion, int locateStack)
        {
            int    startInStack = locateStack;
            string type         = "string";
            string cutsSting    = GetString();

            ASM.WriteASMCode(levelTabulatiion + "mov\t" + ASMregisters.GetNameType(type) + " [ebp-" + locateStack + "], '" + cutsSting[0] + "'");
            for (int i = 1; i < cutsSting.Length; i++)
            {
                locateStack            = startInStack + (ASMregisters.GetSizeStep(type) * i);
                ASMregisters.stepByte += ASMregisters.GetSizeStep(type);
                ASM.WriteASMCode(levelTabulatiion + "mov\t" + ASMregisters.GetNameType(type) + " [ebp-" + locateStack + "], '" + cutsSting[i] + "'");
            }
        }
Пример #38
0
        public override string Convert(ASM.ASMBlock theBlock)
        {
            StringBuilder ASMResult = new StringBuilder();
            ASMResult.AppendLine(".globl " + TypeId);
            ASMResult.AppendLine(".align 2");
            ASMResult.AppendLine(TypeId + ":");

            foreach (Tuple<string, Types.TypeInfo> aFieldInfo in FieldInformation)
            {
                string allocStr = ASMUtilities.GetAllocStringForSize(
                    aFieldInfo.Item2.IsValueType ? aFieldInfo.Item2.SizeOnHeapInBytes : aFieldInfo.Item2.SizeOnStackInBytes);
                switch (aFieldInfo.Item1)
                {
                    case "Size":
                        ASMResult.AppendLine(allocStr + " " + SizeVal);
                        break;
                    case "Id":
                        ASMResult.AppendLine(allocStr + " " + IdVal);
                        break;
                    case "StackSize":
                        ASMResult.AppendLine(allocStr + " " + StackSizeVal);
                        break;
                    case "IsValueType":
                        ASMResult.AppendLine(allocStr + " " + IsValueTypeVal);
                        break;
                    case "MethodTablePtr":
                        ASMResult.AppendLine(allocStr + " " + MethodTablePointer);
                        break;
                    case "IsPointer":
                        ASMResult.AppendLine(allocStr + " " + IsPointerTypeVal);
                        break;
                    case "TheBaseType":
                        ASMResult.AppendLine(allocStr + " " + BaseTypeIdVal);
                        break;
                    case "FieldTablePtr":
                        ASMResult.AppendLine(allocStr + " " + FieldTablePointer);
                        break;
                    case "Signature":
                        ASMResult.AppendLine(allocStr + " " + TypeSignatureLiteralLabel);
                        break;
                    case "IdString":
                        ASMResult.AppendLine(allocStr + " " + TypeIdLiteralLabel);
                        break;
                }
            }
            ASMResult.AppendLine();

            return ASMResult.ToString();
        }
Пример #39
0
        public ASMViewModel GetDetail(int id)
        {
            IRepository <ASM> repo = _unitOfWork.GetRepository <ASM>();

            repo.Condition = PredicateBuilder.True <ASM>().And(x => x.NIK == id);

            ASM item = repo.Find().FirstOrDefault();

            if (item == null)
            {
                return(null);
            }

            return(GetASMViewModel(item));
        }
Пример #40
0
        public static void Attack(this Character character)
        {
            var asm = new ASM();

            {
                asm.Pushad();

                asm.Mov_EAX(0x5A80C0);
                asm.Call_EAX();

                asm.Popad();
                asm.Ret();
            }
            asm.Run(character.CharacterBase.Core);
        }
Пример #41
0
        public override void PrintASM(string levelTabulatiion, bool isNewLine = false)
        {
            markerJumpPrevBody  = ASMregisters.GetNewMarkerJumpPrevBody();
            markerJumpAfterBody = ASMregisters.GetNewMarkerJumpAfterBody();
            ASMregisters.ClearMarkerPrevBody();

            ASM.WriteASMCode(levelTabulatiion + markerJumpPrevBody + ":");
            ASMregisters.isContitionBelongsToCicle = true;

            PrintCondition(levelTabulatiion + "\t", false);

            ASM.WriteASMCode(levelTabulatiion + "\t" + "jmp" + "\t" + markerJumpPrevBody);

            ASM.WriteASMCode(levelTabulatiion + markerJumpAfterBody + ":");
        }
Пример #42
0
        public static void MoveBackgroundRAM(byte[] F37F90, byte[] F9CAE0, uint decompressedRam, uint compressedRam)
        {
            uint upperCompressed = compressedRam >> 16;
            uint lowerCompressed = (compressedRam & 0x0000FFFF);

            uint upperDecompressed = decompressedRam >> 16;
            uint lowerDecompressed = (decompressedRam & 0x0000FFFF);

            int fileOffset = 0x7520;

            // Hook to Background loading routine.
            ASM.WriteCommand(F37F90, 0x83124, 0x0C0DAAAC);                                   // JAL 8036AAB0

            // Custom Background Loader Subroutine.
            ASM.WriteCommand(F9CAE0, fileOffset, 0x3C088038);                                // LUI	    T0, 0x8038
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x25083CC4);                           // AddIU	T0, T0, 0x3CC4
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x8D080000);                           // LW	    T0, 0x0000(T0)			        ; RAM Offset of File Lookup Table

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x000448C0);                           // SLL	    T1, A0, 3			            ; Multiply Background Id by 8 to get position in lookup table
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x01285021);                           // ADDU	T2, T1, T0			            ; Ram Pointer to Background ID ROM Offset (from 101C50)
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x8D490000);                           // LW	    T1, 0x0000 (T2)			        ; Address from 101C50 of Background
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x8D480008);                           // LW	    T0, 0x0008 (T2)			        ; Address from 101C50 of next file
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x01093022);                           // SUB	    A2, T0, T1			            ; Compressed Size

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x3C0A8038);                           // LUI	    T2, 0x8038
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x354A3CCC);                           // ORI     T2, T2, 0x3CCC
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x8D4A0000);                           // LW	    T2, 0x0000 (T2)			        ; Store 0x101C50 to REG T2

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x3C040000 + upperCompressed);         // LUI	    A0, upperCompressed
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x34840000 + lowerCompressed);         // ORI	    A0, A0, lowerCompressed		    ; Where to store compressed data in RAM

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x0C09017C);                           // JAL	    0x802405F0			            ; Subroutine call: Load compressed data
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x012A2821);                           // ADDU	A1, T1, T2			            ; Finally get ROM address

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x3C040000 + upperCompressed);         // LUI	    A0, upperCompressed
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x34840000 + lowerCompressed);         // ORI     A0, A0, lowerCompressed		    ; Where compressed data is stored (RAM)

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x3C050000 + upperDecompressed);       // LUI	    A1, upperDecompressed

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x0C08F828);                           // JAL	    0x8023E0A0			            ; Subroutine Call: Decompress data
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x34A50000 + lowerDecompressed);       // ORI	    A1, A1, lowerDecompressed       ; Write decompressed data to decompressedRam address

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x3C020000 + upperDecompressed);       // LUI	    V0, upperDecompressed
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x34420000 + lowerDecompressed);       // ORI     V0, V0, lowerDecompressed	    ; Pointer to the decompressed data

            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x080C282F);                           // J	    0x8030A0BC			            ; Return to caller
            ASM.WriteCommand(F9CAE0, fileOffset += 4, 0x00000000);                           // NOP
        }
Пример #43
0
    void ReadFromFile(string filePath)
    {
        XElement xd = XElement.Load(filePath);

        foreach (XElement xel in xd.Elements())
        {
            ASM asm = new ASM();
            asm.name = xel.Attribute("name").Value;
            foreach (XElement childxel in xel.Elements())
            {
                CHILD child = new CHILD();
                child.name = childxel.Attribute("name").Value;
                foreach (XElement chprop in childxel.Elements())
                {
                    switch (chprop.Name.ToString())
                    {
                    case "translateFrom":
                        string[] transtring = chprop.Value.Split(' ');
                        child.translateFrom = new Vector3(ConvertToFloat(transtring[0]), ConvertToFloat(transtring[1]), ConvertToFloat(transtring[2]));
                        //Console.WriteLine("\t\tT " + chprop.Value);
                        break;

                    case "alphaFromTo":
                        string[] astring = chprop.Value.Split(' ');
                        child.alphaFromTo = new Vector2(ConvertToFloat(astring[0]), ConvertToFloat(astring[1]));
                        //Console.WriteLine("\t\tA " + chprop.Value);
                        break;

                    case "durationFrames":
                        child.durationFrames = ConvertToInt(chprop.Value);
                        //Console.WriteLine("\t\tD " + chprop.Value);
                        break;

                    case "extraInstruction":
                        child.extraInstruction = chprop.Value;
                        //Console.WriteLine("\t\tE " + chprop.Value);
                        break;

                    default:
                        Debug.LogError("error!");
                        break;
                    }
                }
                asm.childList.Add(child);
            }
            asmDict.Add(asm.name, asm);
        }
    }
Пример #44
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     int numBytes = -(int)Size;
     string storeOp = "";
     switch (Size)
     {
         case OperandSize.Byte:
             storeOp = "sb";
             break;
         case OperandSize.Halfword:
             storeOp = "sh";
             break;
         case OperandSize.Word:
             storeOp = "sw";
             break;
     }
     return @"addi $sp, $sp, " + numBytes + "\r\n" + 
         storeOp + " " + Src + @", 0($sp)";
 }
Пример #45
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     if (Signed)
     {
         if (!string.IsNullOrWhiteSpace(Aux))
         {
             return "imul " + Arg + ", " + Src + ", " + Aux;
         }
         else if (!string.IsNullOrWhiteSpace(Src))
         {
             return "imul " + Arg + ", " + Src;
         }
         else
         {
             return "imul " + Arg;
         }
     }
     else
     {
         return "mul " + Arg;
     }
 }
Пример #46
0
        public override void CleanUpAssemblyCode(ASM.ASMBlock TheBlock, ref string ASMText)
        {
            // Create lists of extern and global labels
            TheBlock.ExternalLabels.Clear();
            List<string> ExternLines = ASMText.Replace("\r", "")
                                              .Split('\n')
                                              .Where(x => x.ToLower().Contains("extern "))
                                              .Select(x => x.Split(' ')[1].Split(':')[0])
                                              .ToList();
            TheBlock.ExternalLabels.AddRange(ExternLines);

            TheBlock.GlobalLabels.Clear();
            List<string> GlobalLines = ASMText.Replace("\r", "")
                                              .Split('\n')
                                              .Where(x => x.ToLower().Contains("global "))
                                              .Select(x => x.Split(' ')[1].Split(':')[0])
                                              .ToList();
            TheBlock.GlobalLabels.AddRange(GlobalLines);

            ASMText = ASMText.Replace("GLOBAL ", "global ");
            ASMText = ASMText.Replace("EXTERN ", "extern ");
        }
Пример #47
0
        /// <summary>
        /// Scans the specified type's methods.
        /// </summary>
        /// <param name="TheLibrary">The library currently being compiled.</param>
        /// <param name="TheTypeInfo">The type to scan the methods of.</param>
        /// <param name="MethodTablesBlock">The ASM block for the methods table for the library currently being compiled.</param>
        private static void ScanMethods(ILLibrary TheLibrary, Types.TypeInfo TheTypeInfo, ASM.ASMBlock MethodTablesBlock)
        {
            string currentTypeId = TheTypeInfo.ID;
            string currentTypeName = TheTypeInfo.UnderlyingType.FullName;

            List<Tuple<string, string>> AllMethodInfo = new List<Tuple<string, string>>();
            
            if (TheTypeInfo.UnderlyingType.BaseType == null || TheTypeInfo.UnderlyingType.BaseType.FullName != "System.Array")
            {
                foreach (Types.MethodInfo aMethodInfo in TheTypeInfo.MethodInfos)
                {
                    if (!aMethodInfo.IsStatic && !aMethodInfo.UnderlyingInfo.IsAbstract)
                    {
                        string methodID = aMethodInfo.ID;
                        string methodIDValue = aMethodInfo.IDValue.ToString();

                        MethodTablesBlock.AddExternalLabel(methodID);

                        AllMethodInfo.Add(new Tuple<string, string>(methodID, methodIDValue));
                    }
                }
            }

            string parentTypeMethodTablePtr = "0";
            bool parentPtrIsExternal = false;
            if (TheTypeInfo.UnderlyingType.BaseType != null)
            {
                if (!TheTypeInfo.UnderlyingType.BaseType.AssemblyQualifiedName.Contains("mscorlib"))
                {
                    Types.TypeInfo baseTypeInfo = TheLibrary.GetTypeInfo(TheTypeInfo.UnderlyingType.BaseType);
                    parentPtrIsExternal = (ScannedTypes.ContainsKey(baseTypeInfo.ID) && ScannedTypes[baseTypeInfo.ID] != TheLibrary) 
                        || !TheLibrary.TypeInfos.Contains(baseTypeInfo);
                    parentTypeMethodTablePtr = baseTypeInfo.ID + "_MethodTable";
                }
            }
            {
                string methodID = parentTypeMethodTablePtr;
                string methodIDValue = "0";

                if (parentPtrIsExternal)
                {
                    MethodTablesBlock.AddExternalLabel(methodID);
                }

                AllMethodInfo.Add(new Tuple<string,string>(methodID, methodIDValue));
            }

            List<Tuple<string, int>> TableEntryFieldInfos = GetSpecialClassFieldInfo(TheLibrary, typeof(Attributes.MethodInfoStructAttribute));

            ASM.ASMOp newMethodTableOp = TargetArchitecture.CreateASMOp(ASM.OpCodes.MethodTable, 
                currentTypeId, currentTypeName, AllMethodInfo, TableEntryFieldInfos);
            MethodTablesBlock.Append(newMethodTableOp);
        }
Пример #48
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return "int" + IntNum;
 }
Пример #49
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return "jal " + Target + "\r\nnop";
 }
Пример #50
0
        /// <summary>
        /// Scans the specified type (excludes fields and methods).
        /// </summary>
        /// <param name="TheLibrary">The library currently being compiled.</param>
        /// <param name="TheTypeInfo">The type to scan.</param>
        /// <param name="TypesTableBlock">The ASM block for the types table for the library currently being compiled.</param>
        private static void ScanType(ILLibrary TheLibrary, Types.TypeInfo TheTypeInfo, ASM.ASMBlock TypesTableBlock)
        {
            string TypeId = TheTypeInfo.ID;
            string SizeVal = TheTypeInfo.SizeOnHeapInBytes.ToString();
            string IdVal = (TypesScanned++).ToString();
            string StackSizeVal = TheTypeInfo.SizeOnStackInBytes.ToString();
            string IsValueTypeVal = (TheTypeInfo.IsValueType ? "1" : "0");
            string MethodTablePointer = TypeId + "_MethodTable";
            string IsPointerTypeVal = (TheTypeInfo.IsPointer ? "1" : "0");
            string BaseTypeIdVal = "0";
            if (TheTypeInfo.UnderlyingType.BaseType != null)
            {
                if (!TheTypeInfo.UnderlyingType.BaseType.AssemblyQualifiedName.Contains("mscorlib"))
                {
                    Types.TypeInfo baseTypeInfo = TheLibrary.GetTypeInfo(TheTypeInfo.UnderlyingType.BaseType);
                    BaseTypeIdVal = baseTypeInfo.ID;
                    //Declared external to this library, so won't appear in this library's type tables
                    if ((ScannedTypes.ContainsKey(baseTypeInfo.ID) &&
                         ScannedTypes[baseTypeInfo.ID] != TheLibrary) ||
                        !TheLibrary.TypeInfos.Contains(baseTypeInfo))
                    {
                        TypesTableBlock.AddExternalLabel(BaseTypeIdVal);
                    }
                }
            }
            string FieldTablePointer = TypeId + "_FieldTable";
            string TypeSignatureLiteralLabel = TheLibrary.AddStringLiteral(TheTypeInfo.UnderlyingType.FullName); // Legacy
            string TypeIdLiteralLabel = TheLibrary.AddStringLiteral(TheTypeInfo.ID);

            Types.TypeInfo typeTypeInfo = ILLibrary.SpecialClasses[typeof(Attributes.TypeClassAttribute)].First();
            List<Types.FieldInfo> OrderedFields = typeTypeInfo.FieldInfos.Where(x => !x.IsStatic).OrderBy(x => x.OffsetInBytes).ToList();
            List<Tuple<string, Types.TypeInfo>> FieldInformation = new List<Tuple<string, Types.TypeInfo>>();
            foreach (Types.FieldInfo aTypeField in OrderedFields)
            {
                Types.TypeInfo FieldTypeInfo = TheLibrary.GetTypeInfo(aTypeField.FieldType);
                FieldInformation.Add(new Tuple<string, Types.TypeInfo>(aTypeField.Name, FieldTypeInfo));
            }

            ASM.ASMOp newTypeTableOp = TargetArchitecture.CreateASMOp(ASM.OpCodes.TypeTable, 
                TypeId, SizeVal, IdVal, StackSizeVal, IsValueTypeVal, MethodTablePointer, IsPointerTypeVal, 
                BaseTypeIdVal, FieldTablePointer, TypeSignatureLiteralLabel, TypeIdLiteralLabel, FieldInformation);
            TypesTableBlock.Append(newTypeTableOp);

            TypesTableBlock.AddExternalLabel(MethodTablePointer);
            TypesTableBlock.AddExternalLabel(FieldTablePointer);
            TypesTableBlock.AddExternalLabel(TypeSignatureLiteralLabel);
            TypesTableBlock.AddExternalLabel(TypeIdLiteralLabel);
        }
Пример #51
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return "push " + ASMUtilities.GetOpSizeStr(Size) + " " + Src;
 }
Пример #52
0
 public override void CleanUpAssemblyCode(ASM.ASMBlock TheBlock, ref string ASMText)
 {
     
 }
Пример #53
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return "and " + Dest + ", " + Src;
 }
Пример #54
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return "sll " + Dest + ", " + Src + ", " + Bits;
 }
Пример #55
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return "call " + Target;
 }
Пример #56
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return "nop";
 }
Пример #57
0
        /// <summary>
        /// Scans the specified type's static fields.
        /// </summary>
        /// <param name="TheLibrary">The library currently being compiled.</param>
        /// <param name="TheTypeInfo">The type to scan the static fields of.</param>
        /// <param name="StaticFieldsBlock">The ASM block for the static fields for the library currently being compiled.</param>
        private static void ScanStaticFields(ILLibrary TheLibrary, Types.TypeInfo TheTypeInfo, ASM.ASMBlock StaticFieldsBlock)
        {
            foreach (Types.FieldInfo aFieldInfo in TheTypeInfo.FieldInfos)
            {
                if (aFieldInfo.IsStatic)
                {
                    Types.TypeInfo fieldTypeInfo = TheLibrary.GetTypeInfo(aFieldInfo.FieldType);

                    string FieldID = aFieldInfo.ID;
                    string Size = fieldTypeInfo.SizeOnStackInBytes.ToString();

                    ASM.ASMOp newStaticFieldOp = TargetArchitecture.CreateASMOp(ASM.OpCodes.StaticField, FieldID, Size);
                    StaticFieldsBlock.Append(newStaticFieldOp);
                }
            }
        }
Пример #58
0
        /// <summary>
        /// Scans the specified type's non-static fields.
        /// </summary>
        /// <param name="TheLibrary">The library currently being compiled.</param>
        /// <param name="TheTypeInfo">The type to scan the non-static fields of.</param>
        /// <param name="FieldTablesBlock">The ASM block for the fields table for the library currently being compiled.</param>
        private static void ScanFields(ILLibrary TheLibrary, Types.TypeInfo TheTypeInfo, ASM.ASMBlock FieldTablesBlock)
        {
            string currentTypeId = TheTypeInfo.ID;
            string currentTypeName = TheTypeInfo.UnderlyingType.FullName;
            List<Tuple<string, string, string>> AllFieldInfo = new List<Tuple<string, string, string>>();

            if (TheTypeInfo.UnderlyingType.BaseType == null || (TheTypeInfo.UnderlyingType.BaseType.FullName != "System.Array" &&
                                                                TheTypeInfo.UnderlyingType.BaseType.FullName != "System.MulticastDelegate"))
            {
                foreach (Types.FieldInfo anOwnField in TheTypeInfo.FieldInfos)
                {
                    if (!anOwnField.IsStatic)
                    {
                        Types.TypeInfo FieldTypeInfo = TheLibrary.GetTypeInfo(anOwnField.FieldType);

                        string fieldOffsetVal = anOwnField.OffsetInBytes.ToString();
                        string fieldSizeVal = (FieldTypeInfo.IsValueType ? FieldTypeInfo.SizeOnHeapInBytes : FieldTypeInfo.SizeOnStackInBytes).ToString();
                        string fieldTypeIdVal = FieldTypeInfo.ID;

                        FieldTablesBlock.AddExternalLabel(fieldTypeIdVal);
                        AllFieldInfo.Add(new Tuple<string, string, string>(fieldOffsetVal, fieldSizeVal, fieldTypeIdVal));
                    }
                }
            }

            string parentTypeFieldTablePtr = "0";
            bool parentPtrIsExternal = false;
            if (TheTypeInfo.UnderlyingType.BaseType != null)
            {
                if (!TheTypeInfo.UnderlyingType.BaseType.AssemblyQualifiedName.Contains("mscorlib"))
                {
                    Types.TypeInfo baseTypeInfo = TheLibrary.GetTypeInfo(TheTypeInfo.UnderlyingType.BaseType);
                    parentPtrIsExternal = (ScannedTypes.ContainsKey(baseTypeInfo.ID) &&
                         ScannedTypes[baseTypeInfo.ID] != TheLibrary) || !TheLibrary.TypeInfos.Contains(baseTypeInfo);
                    parentTypeFieldTablePtr = baseTypeInfo.ID + "_FieldTable";
                }
            }
            {
                string fieldOffsetVal = "0";
                string fieldSizeVal = "0";
                string fieldTypeIdVal = parentTypeFieldTablePtr;

                if (parentPtrIsExternal)
                {
                    FieldTablesBlock.AddExternalLabel(fieldTypeIdVal);
                }

                AllFieldInfo.Add(new Tuple<string, string, string>(fieldOffsetVal, fieldSizeVal, fieldTypeIdVal));
            }

            List<Tuple<string, int>> TableEntryFieldInfos = GetSpecialClassFieldInfo(TheLibrary, typeof(Attributes.FieldInfoStructAttribute));

            ASM.ASMOp newFieldTableOp = TargetArchitecture.CreateASMOp(ASM.OpCodes.FieldTable, 
                currentTypeId, currentTypeName, AllFieldInfo, TableEntryFieldInfos);
            FieldTablesBlock.Append(newFieldTableOp);
        }
Пример #59
0
 /// <summary>
 /// Gets the order of two ASM blocks based on their priorities.
 /// </summary>
 /// <param name="a">First block to order.</param>
 /// <param name="b">Second block to order.</param>
 /// <returns>/// -1 = a before b, 0 = a or b in either order, +1 = a after b.</returns>
 public static int GetOrder(ASM.ASMBlock a, ASM.ASMBlock b)
 {
     return a.Priority.CompareTo(b.Priority);
 }
Пример #60
0
 public override string Convert(ASM.ASMBlock theBlock)
 {
     return string.Format("GLOBAL {0}:data\r\n{0}: times {1} db 0", FieldID, Size);
 }