示例#1
0
        public void WriteFirmware(bool TransferVIN = true)
        {
            firmware_image             = new SCP_FLASH_IMAGE(RomSize._216k);
            firmware_image.SCTBINImage = System.IO.File.ReadAllBytes("read.bin");

            if (IVFERHandshake())
            {
                if (ProbeMemLayout() != firmware_image.FlashSize)
                {
                    throw new Exception("Loaded firmware image does not match target hardware!");
                }

                SCP_VIN_Parser PCM_VIN = new SCP_VIN_Parser(ReadVINBlock());
                //Write Vin to disk

                if (TransferVIN)
                {
                    firmware_image.VIN.PATS_Key = PCM_VIN.PATS_Key;
                    firmware_image.VIN.VIN      = PCM_VIN.VIN;
                }

                EraseFlash();

                switch (firmware_image.FlashSize)
                {
                case RomSize._88k:
                    ProgramBank(0x12000, firmware_image.GetBank(1));
                    ProgramBank(0x82000, firmware_image.GetBank(8));
                    break;

                case RomSize._112k:
                    ProgramBank(0x12000, firmware_image.GetBank(1));
                    ProgramBank(0x82000, firmware_image.GetBank(8));
                    break;

                case RomSize._216k:
                    ProgramBank(0x02000, firmware_image.GetBank(0));
                    ProgramBank(0x12000, firmware_image.GetBank(1));
                    ProgramBank(0x92000, firmware_image.GetBank(9));
                    ProgramBank(0x82000, firmware_image.GetBank(8));
                    break;
                }
                if (!Checksum())
                {
                    throw new Exception("Checksum of firmware write failed!");
                }
            }
        }
        public SCP_FLASH_IMAGE(RomSize FlashSize)
        {
            switch (FlashSize)
            {
            case RomSize._88k:
                bank1 = new byte[0x8000];
                break;

            case RomSize._112k:
                bank1 = new byte[0xE000];
                break;

            case RomSize._216k:
                bank1 = new byte[0xC000];
                break;

            default:
                throw new ArgumentOutOfRangeException("Invalid romsize when constructing SCP_FLASH_IMAGE");
            }
            flash_size = FlashSize;
            vin        = new SCP_VIN_Parser();
        }