void nes_exrom_device::update_prg() { int bank0, bank1, bank2, bank3; switch (m_prg_mode) { case 0: // 32k banks bank3 = m_prg_regs[3] >> 2; prg32(bank3); break; case 1: // 16k banks bank1 = m_prg_regs[1] >> 1; bank3 = m_prg_regs[3] >> 1; if (m_prg_ram_mapped[1]) { prgram_bank8_x(0, ((bank1 << 1) & 0x07)); prgram_bank8_x(1, ((bank1 << 1) & 0x07) | 1); } else prg16_89ab(bank1); prg16_cdef(bank3); break; case 2: // 16k-8k banks bank1 = m_prg_regs[1] >> 1; bank2 = m_prg_regs[2]; bank3 = m_prg_regs[3]; if (m_prg_ram_mapped[1]) { prgram_bank8_x(0, ((bank1 << 1) & 0x07)); prgram_bank8_x(1, ((bank1 << 1) & 0x07) | 1); } else prg16_89ab(bank1); if (m_prg_ram_mapped[2]) prgram_bank8_x(2, bank2 & 0x07); else prg8_cd(bank2); prg8_ef(bank3); break; case 3: // 8k banks bank0 = m_prg_regs[0]; bank1 = m_prg_regs[1]; bank2 = m_prg_regs[2]; bank3 = m_prg_regs[3]; if (m_prg_ram_mapped[0]) prgram_bank8_x(0, bank0 & 0x07); else prg8_89(bank0); if (m_prg_ram_mapped[1]) prgram_bank8_x(1, bank1 & 0x07); else prg8_ab(bank1); if (m_prg_ram_mapped[2]) prgram_bank8_x(2, bank2 & 0x07); else prg8_cd(bank2); prg8_ef(bank3); break; } }
void nes_exrom_device::update_prg() { int bank0, bank1, bank2, bank3; switch (m_prg_mode) { case 0: // 32k banks bank3 = m_prg_regs[3]; prg32(bank3 >> 2); break; case 1: // 16k banks bank1 = m_prg_regs[1]; bank3 = m_prg_regs[3]; if (!BIT(bank1, 7)) // PRG RAM { prgram_bank8_x(0, (bank1 & 0x06)); prgram_bank8_x(1, (bank1 & 0x06) + 1); } else prg16_89ab(bank1 >> 1); prg16_cdef(bank3); break; case 2: // 16k-8k banks bank1 = m_prg_regs[1]; bank2 = m_prg_regs[2]; bank3 = m_prg_regs[3]; if (!BIT(bank1, 7)) { prgram_bank8_x(0, (bank1 & 0x06)); prgram_bank8_x(1, (bank1 & 0x06) + 1); } else prg16_89ab((bank1 & 0x7f) >> 1); if (!BIT(bank2, 7)) prgram_bank8_x(2, bank2 & 0x07); else prg8_cd(bank2 & 0x7f); prg8_ef(bank3); break; case 3: // 8k banks bank0 = m_prg_regs[0]; bank1 = m_prg_regs[1]; bank2 = m_prg_regs[2]; bank3 = m_prg_regs[3]; if (!BIT(bank0, 7)) prgram_bank8_x(0, bank0 & 0x07); else prg8_89(bank0 & 0x7f); if (!BIT(bank1, 7)) prgram_bank8_x(1, bank1 & 0x07); else prg8_ab(bank1 & 0x7f); if (!BIT(bank2, 7)) prgram_bank8_x(2, bank2 & 0x07); else prg8_cd(bank2 & 0x7f); prg8_ef(bank3); break; } }