Ejemplo n.º 1
0
        public static void TestYazSimple(IExperimentFace face, List <string> filePath)
        {
            StringBuilder sb  = new StringBuilder();
            ORom          rom = new ORom(filePath[0], ORom.Build.N0);

            RomFile rfile       = rom.Files.GetFile(ORom.FileList.code);
            var     dmarec_code = rfile.Record;

            BinaryReader compressed   = new BinaryReader((MemoryStream)rom.Files.GetPhysicalFile(dmarec_code.VRom));
            BinaryReader decompressed = new BinaryReader(rfile);

            byte[] decompressedbuffer = decompressed.ReadBytes(rfile.Record.VRom.Size);

            //var buffer = new MemoryStream(0x20_0000);
            var buffer = new byte[0];

            Stopwatch stopwatch = Stopwatch.StartNew();
            //int compressedSize = Yaz.Encode(decompressedbuffer, rfile.Record.VirtualAddress.Size, buffer);
            int compressedSize = Yaz.Encode(decompressedbuffer, rfile.Record.VRom.Size, out buffer);

            Yaz.GetEncodingData(buffer, compressedSize, out int metaSize);

            stopwatch.Stop();

            sb.AppendLine($"Compression time: {stopwatch.Elapsed.Seconds}.{stopwatch.Elapsed.Milliseconds:D3}");
            sb.AppendLine($"Compressed Size: {compressedSize:X6}, Meta Size {metaSize:X6}");

            decompressed.Seek(0);
            //buffer.Position = 0;

            //compare compressed output
            if (compressedSize != dmarec_code.Rom.Size)
            {
                sb.AppendLine($"Compression size mismatch: Original {dmarec_code.Rom.Size:X6} || New {compressedSize:X6}");
            }

            int mismatchMax = 8;

            for (int i = 0; i < dmarec_code.Rom.Size; i++)
            {
                byte a = compressed.ReadByte();
                //byte b = (byte)buffer.ReadByte();
                byte b = buffer[i];
                if (a == b)
                {
                    continue;
                }

                mismatchMax--;
                sb.AppendLine($"COMPRESS MISMATCH {i:X6}: {a:X2} {b:X2}");
                if (mismatchMax <= 0)
                {
                    break;
                }
            }
            compressed.Seek(0);
            //buffer.Position = 0;

            byte[] dbuffer = Yaz.Decode(new MemoryStream(buffer), compressedSize);
            decompressed.BaseStream.Position = 0;

            for (int i = 0; i < dbuffer.Length; i++)
            {
                if (dbuffer[i] != decompressed.ReadByte())
                {
                    sb.AppendLine($"File Size: {dbuffer.Length:X}, Compressed: {compressedSize:X}, Failed Match: {i:X}");
                    break;
                }
            }

            sb.AppendLine("Test Complete");
            face.OutputText(sb.ToString());
        }