Exemplo n.º 1
0
        public static int CFGtoD64(string set_cfg, string set_rom, string set_ipladdr, string set_iplsize, string set_o)
        {
            //Make Disk from CFG and ROM
            int cfg_disktype = -1;
            int cfg_destcode = 0;

            byte[] cfg_diskid;
            Util.ProcessCfg(set_cfg, out cfg_disktype, out cfg_destcode, out cfg_diskid);

            uint cfg_ipladdr = uint.Parse(set_ipladdr, System.Globalization.NumberStyles.HexNumber);
            int  cfg_iplsize = Leo.ByteToLBA(cfg_disktype, int.Parse(set_iplsize), 24);

            //Take ROM size
            FileStream file_rom = new FileStream(set_rom, FileMode.Open);

            if (cfg_disktype == -1)
            {
                if (file_rom.Length < 26014080)
                {
                    cfg_disktype = 0;
                }
                else if (file_rom.Length < 34957440)
                {
                    cfg_disktype = 1;
                }
                else if (file_rom.Length < 43155520)
                {
                    cfg_disktype = 2;
                }
                else if (file_rom.Length < 50608320)
                {
                    cfg_disktype = 3;
                }
                else if (file_rom.Length < 57315840)
                {
                    cfg_disktype = 4;
                }
                else if (file_rom.Length < 62516480)
                {
                    cfg_disktype = 5;
                }
                else if (file_rom.Length < 64458560)
                {
                    cfg_disktype = 6;
                }
            }

            if (file_rom.Length > 64458560)
            {
                //TOO BIG!
                Console.WriteLine("ERROR: ROM FILE IS TOO BIG! (MAX SIZE 64458560 bytes)");
                return(-1);
            }

            int block_rom_size      = Leo.ByteToLBA(cfg_disktype, (int)file_rom.Length, 24);
            int block_rom_byte_size = Leo.LBAToByte(cfg_disktype, block_rom_size, 24);

            byte[] rom_data = new byte[block_rom_byte_size];
            Array.Fill <byte>(rom_data, 0xFF);

            file_rom.Read(rom_data, 0, (int)file_rom.Length);

            //Make D64 file
            FileStream file_out = new FileStream(set_o, FileMode.Create);

            byte[] d64_sys_data = new byte[256];
            byte[] d64_sys_id   = new byte[256];
            d64_sys_data[0x05] = (byte)cfg_disktype;
            d64_sys_data[0x06] = (byte)(cfg_iplsize >> 8);
            d64_sys_data[0x07] = (byte)(cfg_iplsize & 0xFF);

            d64_sys_data[0x1C] = (byte)(cfg_ipladdr >> 24);
            d64_sys_data[0x1D] = (byte)(cfg_ipladdr >> 16);
            d64_sys_data[0x1E] = (byte)(cfg_ipladdr >> 8);
            d64_sys_data[0x1F] = (byte)(cfg_ipladdr & 0xFF);

            d64_sys_data[0xE0] = (byte)((block_rom_size - 1) >> 8);
            d64_sys_data[0xE1] = (byte)((block_rom_size - 1) & 0xFF);
            d64_sys_data[0xE2] = 0xFF;
            d64_sys_data[0xE3] = 0xFF;
            d64_sys_data[0xE4] = 0xFF;
            d64_sys_data[0xE5] = 0xFF;

            Array.Copy(cfg_diskid, d64_sys_id, cfg_diskid.Length);
            d64_sys_id[0xE8] = (byte)cfg_destcode;

            file_out.Write(d64_sys_data, 0, d64_sys_data.Length);
            file_out.Write(d64_sys_id, 0, d64_sys_id.Length);
            file_out.Write(rom_data, 0, rom_data.Length);

            file_out.Close();
            return(0);
        }