コード例 #1
0
ファイル: ASMWriter.cs プロジェクト: anttirt/roads.editor
        public static int Write(Level level, Stream file, string fileName, string guid)
        {
            string result;
            fileName += "_data_";
            guid = "data_" + guid;
            int length = 0;
            using (MemoryStream memStream = new MemoryStream())
            {
                StringBuilder builder = new StringBuilder();

                using (BinaryWriter writer = new BinaryWriter(memStream))
                {
                    level.Write(writer);
                    length = (int)memStream.Length;
                    memStream.Seek(0, SeekOrigin.Begin);

                    builder.Append("\n@{{BLOCK(" + guid + ")\n\n");
                    builder.Append("\t.section .rodata\n");
                    builder.Append("\t.align 2\n");
                    builder.Append("\t.global " + guid + " @ " + memStream.Length + " bytes\n");
                    builder.Append(guid + ":\n");

                    long dqwords = memStream.Length / 16;
                    long mod = memStream.Length % 16;

                    for (long i = 0; i < dqwords; ++i)
                    {
                        builder.Append("\t.byte ");
                        int read = memStream.ReadByte();
                        byte tempByte = (byte)(read & 0xFF);
                        builder.Append("0x" + tempByte.ToString("X02"));

                        for (int j = 1; j < 16; ++j)
                        {
                            builder.Append(",0x" + ((byte)memStream.ReadByte()).ToString("X02"));
                        }
                        builder.Append('\n');
                    }

                    if (mod > 0)
                    {
                        builder.Append("\t.byte 0x" + ((byte)memStream.ReadByte()).ToString("X02"));
                        for (int i = 1; i < mod; ++i)
                            builder.Append(",0x" + ((byte)memStream.ReadByte()).ToString("X02"));
                    }
                    builder.Append("\n\n@}}BLOCK(" + guid + ")\n");
                }
                result = builder.ToString();
            }

            byte[] arr = Encoding.ASCII.GetBytes(result);
            file.Write(arr, 0, arr.Length);

            return length;
        }