public override void SyncState(Serializer ser) { base.SyncState(ser); ser.Sync("prg", ref prg); ser.Sync("chr", ref chr); ser.Sync("flash_state", ref flash_state); int tmp = (int)flash_mode; ser.Sync("flash_mode", ref tmp); flash_mode = (flashmode)tmp; ser.Sync("flash_rom", ref flash_rom, true); }
public override void SyncState(Serializer ser) { base.SyncState(ser); ser.Sync(nameof(prg), ref prg); ser.Sync(nameof(chr), ref chr); ser.Sync(nameof(flash_state), ref flash_state); int tmp = (int)flash_mode; ser.Sync(nameof(flash_mode), ref tmp); flash_mode = (flashmode)tmp; ser.Sync(nameof(flash_rom), ref flash_rom, true); }
public override bool Configure(NES.EDetectionOrigin origin) { switch (Cart.board_type) { case "MAPPER030": Cart.vram_size = 32; break; case "MAPPER0030-00": AssertVram(8, 16, 32); break; case "UNIF_UNROM-512-8": Cart.vram_size = 8; break; case "UNIF_UNROM-512-16": Cart.vram_size = 16; break; case "UNIF_UNROM-512-32": Cart.vram_size = 32; break; default: return(false); } if (Cart.wram_battery) { flash_state = 0; flash_mode = flashmode.fm_default; if (flash_rom == null) { // extra space is used to hold information about what sectors have been flashed flash_rom = new byte[Cart.prg_size * 1024 + Cart.prg_size]; } } SetMirrorType(CalculateMirrorType(Cart.pad_h, Cart.pad_v)); AssertChr(0); AssertPrg(128, 256, 512); //Flash chip sizes that fits sealie unrom-512 are 39SF010, 39SF020, 39SF040. Cart.wram_size = 0; prg_bank_mask_16k = Cart.prg_size / 16 - 1; vram_bank_mask_8k = Cart.vram_size / 8 - 1; return(true); }
public override bool Configure(NES.EDetectionOrigin origin) { switch (Cart.board_type) { case "MAPPER030": Cart.vram_size = 32; break; case "MAPPER0030-00": AssertVram(8, 16, 32); break; case "UNIF_UNROM-512-8": Cart.vram_size = 8; break; case "UNIF_UNROM-512-16": Cart.vram_size = 16; break; case "UNIF_UNROM-512-32": Cart.vram_size = 32; break; default: return false; } if (Cart.wram_battery) { flash_state = 0; flash_mode = flashmode.fm_default; if (flash_rom == null) { // extra space is used to hold information about what sectors have been flashed flash_rom = new byte[Cart.prg_size * 1024 + Cart.prg_size]; } } SetMirrorType(CalculateMirrorType(Cart.pad_h, Cart.pad_v)); AssertChr(0); AssertPrg(128, 256, 512); //Flash chip sizes that fits sealie unrom-512 are 39SF010, 39SF020, 39SF040. Cart.wram_size = 0; prg_bank_mask_16k = Cart.prg_size / 16 - 1; vram_bank_mask_8k = Cart.vram_size / 8 - 1; return true; }
public override void WritePRG(int addr, byte value) { if ((!Cart.wram_battery) || (addr >= 0x4000)) { byte value2 = value; if (!Cart.wram_battery) value2 = HandleNormalPRGConflict(addr, value); chr = value2 >> 5 & 3 & vram_bank_mask_8k; prg = value2 & prg_bank_mask_16k; if ((Cart.pad_h == 0) && (Cart.pad_v == 0)) { int mirror = (value2 & 0x80) >> 7; SetMirrorType(CalculateMirrorType(mirror, mirror)); } } else { if (flash_mode == flashmode.fm_default) { if (addr_state[flash_state] == addr && addr_bank[flash_state] == prg && addr_data[flash_state] == value) { flash_state++; if (flash_state == 5) flash_mode = flashmode.fm_erase; } else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0x90) { flash_mode = flashmode.fm_id; } else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0xA0) { flash_state++; flash_mode = flashmode.fm_write; } else { flash_state = 0; flash_mode = flashmode.fm_default; } } else if (flash_mode == flashmode.fm_erase) { if (value == 0x10) //You probably don't want to do this, as this is erase entire flash chip. :) { //Of course, we gotta emulate the behaviour. for (int i = 0; i < (Cart.prg_size / 4); i++) increment_flash_write_count(i, true); for (int i = 0; i < flash_rom.Count(); i++) flash_rom[Cart.prg_size + i] = 0xFF; } else if (value == 0x30) { increment_flash_write_count(addr); for (int i = 0; i < 0x1000; i++) flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = 0xFF; } flash_mode = 0; flash_state = 0; } else if (flash_mode == flashmode.fm_write) { if (get_flash_write_count(addr) == 0) { increment_flash_write_count(addr); for (int i = 0; i < 0x1000; i++) flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = ROM[(prg << 14 | addr & 0x3000) + i]; } flash_rom[Cart.prg_size + (prg << 14 | addr & 0x3fff)] &= value; flash_state = 0; flash_mode = 0; } if (flash_mode == flashmode.fm_id && value == 0xF0) { flash_state = 0; flash_mode = 0; } } }
public override void WritePRG(int addr, byte value) { if ((!Cart.wram_battery) || (addr >= 0x4000)) { byte value2 = value; if (!Cart.wram_battery) { value2 = HandleNormalPRGConflict(addr, value); } chr = value2 >> 5 & 3 & vram_bank_mask_8k; prg = value2 & prg_bank_mask_16k; if ((Cart.pad_h == 0) && (Cart.pad_v == 0)) { int mirror = (value2 & 0x80) >> 7; SetMirrorType(CalculateMirrorType(mirror, mirror)); } } else { if (flash_mode == flashmode.fm_default) { if (addr_state[flash_state] == addr && addr_bank[flash_state] == prg && addr_data[flash_state] == value) { flash_state++; if (flash_state == 5) { flash_mode = flashmode.fm_erase; } } else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0x90) { flash_mode = flashmode.fm_id; } else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0xA0) { flash_state++; flash_mode = flashmode.fm_write; } else { flash_state = 0; flash_mode = flashmode.fm_default; } } else if (flash_mode == flashmode.fm_erase) { if (value == 0x10) //You probably don't want to do this, as this is erase entire flash chip. :) { //Of course, we gotta emulate the behaviour. for (int i = 0; i < (Cart.prg_size / 4); i++) { increment_flash_write_count(i, true); } for (int i = 0; i < flash_rom.Count(); i++) { flash_rom[Cart.prg_size + i] = 0xFF; } } else if (value == 0x30) { increment_flash_write_count(addr); for (int i = 0; i < 0x1000; i++) { flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = 0xFF; } } flash_mode = 0; flash_state = 0; } else if (flash_mode == flashmode.fm_write) { if (get_flash_write_count(addr) == 0) { increment_flash_write_count(addr); for (int i = 0; i < 0x1000; i++) { flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = ROM[(prg << 14 | addr & 0x3000) + i]; } } flash_rom[Cart.prg_size + (prg << 14 | addr & 0x3fff)] &= value; flash_state = 0; flash_mode = 0; } if (flash_mode == flashmode.fm_id && value == 0xF0) { flash_state = 0; flash_mode = 0; } } }