Previous 199869 Revisions Next

r30813 Tuesday 3rd June, 2014 at 17:08:51 UTC by Fabio Priuli
(MESS) nes.c: fixed WRAM banking for MMC5, so that Bandit Kings of Ancient China
(and Suikoden - Tenmei no Chikai) can be considered as working. Also fixed wrong
battery size for Aoki Ookami to Shiroki Mejika - Genchou Hishi in xml, which was causing
a "Memory Over" error message ingame. [Fabio Priuli]

out of whatsnew: apparently the current WRAM mirroring (based on nesdev wiki notes)
causes glitches in some of these games. I hope to improve this soonish.
[hash]nes.xml
[src/emu/bus/nes]mmc5.c mmc5.h nes_slot.c
[src/mess/machine]nes.c

trunk/src/emu/bus/nes/mmc5.c
r30812r30813
8383   save_item(NAME(m_split_bank));
8484   save_item(NAME(m_vcount));
8585   save_item(NAME(m_exram));
86   save_item(NAME(m_ram_hi_banks));
87
8688}
8789
8890void nes_exrom_device::pcb_reset()
r30812r30813
129131   m_prg_ram_mapped[1] = 0;
130132   m_prg_ram_mapped[2] = 0;
131133   m_prg_ram_mapped[3] = 0;
134
135   m_ram_hi_banks[0] = 0;
136   m_ram_hi_banks[1] = 0;
137   m_ram_hi_banks[2] = 0;
138   m_ram_hi_banks[3] = 0;
132139}
133140
134141
r30812r30813
144151
145152 iNES: mapper 5
146153
147 MESS status: Mostly Unsupported
154 MESS status: Partially supported
148155
149156 -------------------------------------------------*/
150157
151/* MMC5 can map PRG RAM to 0x8000-0xdfff */
152void nes_exrom_device::prgram_bank8_x(int start, int bank)
153{
154   assert(start < 4);
155   assert(bank >= 0);
156   assert(m_prgram.count() + m_battery.count());
157
158   // currently we use 4x8k BWRAM + 4x8k WRAM banks, independently from the actual PRG-RAM size
159   // mirroring of the actual size is taken care of at bank setup (even if no known commercial game relies on it!)
160   //bank &= (m_prgram.count() / 0x2000) - 1;
161   if (!m_prgram.count() || !m_battery.count())
162      bank &= 3;
163
164   // PRG RAM is mapped after PRG ROM
165   m_prg_bank[start] = m_prg_chunks + bank;
166   m_prg_bank_mem[start]->set_entry(m_prg_bank[start]);
167}
168
169
170158void nes_exrom_device::update_prg()
171159{
172160   int bank0, bank1, bank2, bank3;
r30812r30813
184172
185173         if (m_prg_ram_mapped[1])
186174         {
187            prgram_bank8_x(0, ((bank1 << 1) & 0x07));
188            prgram_bank8_x(1, ((bank1 << 1) & 0x07) | 1);
175            m_ram_hi_banks[0] = ((bank1 << 1) & 0x07);
176            m_ram_hi_banks[1] = ((bank1 << 1) & 0x07) | 1;
189177         }
190178         else
191179            prg16_89ab(bank1);
r30812r30813
200188
201189         if (m_prg_ram_mapped[1])
202190         {
203            prgram_bank8_x(0, ((bank1 << 1) & 0x07));
204            prgram_bank8_x(1, ((bank1 << 1) & 0x07) | 1);
191            m_ram_hi_banks[0] = ((bank1 << 1) & 0x07);
192            m_ram_hi_banks[1] = ((bank1 << 1) & 0x07) | 1;
205193         }
206194         else
207195            prg16_89ab(bank1);
208196
209197         if (m_prg_ram_mapped[2])
210            prgram_bank8_x(2, bank2 & 0x07);
198            m_ram_hi_banks[2] = (bank2 & 0x07);
211199         else
212200            prg8_cd(bank2);
213201
r30812r30813
221209         bank3 = m_prg_regs[3];
222210
223211         if (m_prg_ram_mapped[0])
224            prgram_bank8_x(0, bank0 & 0x07);
212            m_ram_hi_banks[0] = (bank0 & 0x07);
225213         else
226214            prg8_89(bank0);
227215
228216         if (m_prg_ram_mapped[1])
229            prgram_bank8_x(1, bank1 & 0x07);
217            m_ram_hi_banks[1] = (bank1 & 0x07);
230218         else
231219            prg8_ab(bank1);
232220
233221         if (m_prg_ram_mapped[2])
234            prgram_bank8_x(2, bank2 & 0x07);
222            m_ram_hi_banks[2] = (bank2 & 0x07);
235223         else
236224            prg8_cd(bank2);
237225
r30812r30813
631619// 3bits are used to access the "WRAM" banks
632620// bit3 select the chip (2 of them can be accessed, each up to 32KB)
633621// bit1 & bit2 select the 8KB banks inside the chip
634// same mechanism is used also when "WRAM" is mapped in higher banks, but there we setup the bank map in a smart
635// way so to access the correct bank as if the 3 bits were directly selecting the bank in a 64KB RAM area
622// same mechanism is used also when "WRAM" is mapped in higher banks
636623READ8_MEMBER(nes_exrom_device::read_m)
637624{
625   LOG_MMC(("exrom read_m, offset: %04x\n", offset));
638626   if (m_battery && m_prgram)  // 2 chips present: first is BWRAM, second is WRAM
639627   {
640628      if (m_wram_base & 0x04)
r30812r30813
652640
653641WRITE8_MEMBER(nes_exrom_device::write_m)
654642{
643   LOG_MMC(("exrom write_m, offset: %04x, data: %02x\n", offset, data));
655644   if (m_wram_protect_1 != 0x02 || m_wram_protect_2 != 0x01)
656645      return;
657646
r30812r30813
662651}
663652
664653// some games (e.g. Bandit Kings of Ancient China) write to PRG-RAM through 0x8000-0xdfff
665// it does not work well yet!
654READ8_MEMBER(nes_exrom_device::read_h)
655{
656   LOG_MMC(("exrom read_h, offset: %04x\n", offset));
657   int bank = offset / 0x2000;
658
659   if (bank < 3 && offset >= bank * 0x2000 && offset < (bank + 1) * 0x2000 && m_prg_ram_mapped[bank])
660   {
661      if (m_battery && m_ram_hi_banks[bank] < 4)
662         return m_battery[((m_ram_hi_banks[bank] * 0x2000) + (offset & 0x1fff)) & (m_battery.count() - 1)];
663      else if (m_prgram)
664         return m_prgram[(((m_ram_hi_banks[bank] & 3) * 0x2000) + (offset & 0x1fff)) & (m_prgram.count() - 1)];
665   }
666
667   return hi_access_rom(offset);
668}
669
666670WRITE8_MEMBER(nes_exrom_device::write_h)
667671{
672   LOG_MMC(("exrom write_h, offset: %04x, data: %02x\n", offset, data));
668673   int bank = offset / 0x2000;
669674   if (m_wram_protect_1 != 0x02 || m_wram_protect_2 != 0x01 || bank == 3 || !m_prg_ram_mapped[bank])
670675      return;
671676
672   bank = m_prg_bank[bank] - m_prg_chunks;
673   if (m_battery && m_prg_bank[bank] < m_prg_chunks + 4)
674      m_battery[((bank * 0x2000) + (offset & 0x1fff)) & (m_battery.count() - 1)] = data;
677   if (m_battery && m_ram_hi_banks[bank] < 4)
678      m_battery[((m_ram_hi_banks[bank] * 0x2000) + (offset & 0x1fff)) & (m_battery.count() - 1)] = data;
675679   else if (m_prgram)
676      m_prgram[(((bank & 3) * 0x2000) + (offset & 0x1fff)) & (m_prgram.count() - 1)] = data;
680      m_prgram[(((m_ram_hi_banks[bank] & 3) * 0x2000) + (offset & 0x1fff)) & (m_prgram.count() - 1)] = data;
677681}
trunk/src/emu/bus/nes/mmc5.h
r30812r30813
1616   virtual void device_start();
1717   virtual DECLARE_READ8_MEMBER(read_l);
1818   virtual DECLARE_READ8_MEMBER(read_m);
19   virtual DECLARE_READ8_MEMBER(read_h);
1920   virtual DECLARE_WRITE8_MEMBER(write_l);
2021   virtual DECLARE_WRITE8_MEMBER(write_m);
2122   virtual DECLARE_WRITE8_MEMBER(write_h);
r30812r30813
2930
3031protected:
3132   void set_mirror(int page, int src);
32   void prgram_bank8_x(int start, int bank);
3333   void update_render_mode();
3434   void update_prg();
3535
r30812r30813
7878
7979   // MMC-5 contains 1K of internal ram
8080   UINT8 m_exram[0x400];
81   
82   UINT8 m_ram_hi_banks[4];
8183
8284   //  int m_nes_vram_sprite[8];
8385};
trunk/src/emu/bus/nes/nes_slot.c
r30812r30813
672672   m_prg_bank_mem[3] = machine.root_device().membank("prg3");
673673   for (int i = 0; i < 4; i++)
674674   {
675      int next_bank = m_prg.count() / 0x2000;
676675      m_prg_bank_mem[i]->configure_entries(0, m_prg.count() / 0x2000, m_prg, 0x2000);
677      // MMC5 (and a few other PCBs) can also map WRAM/BWRAM in these banks, so we add here 4x8K banks for each RAM chip
678      // No boards with 64Kb of WRAM/BWRAM has been found so far, otherwise the code has to be updated!
679      if (m_battery)
680      {
681         if (m_battery.count() / 0x2000 == 4)
682         {
683            m_prg_bank_mem[i]->configure_entries(next_bank, 4, m_battery, 0x2000);
684         }
685         if (m_battery.count() / 0x2000 == 2)
686         {
687            m_prg_bank_mem[i]->configure_entries(next_bank + 0, 2, m_battery, 0x2000);
688            m_prg_bank_mem[i]->configure_entries(next_bank + 2, 2, m_battery, 0x2000);
689         }
690         if (m_battery.count() / 0x2000 == 1)
691         {
692            m_prg_bank_mem[i]->configure_entries(next_bank + 0, 1, m_battery, 0x2000);
693            m_prg_bank_mem[i]->configure_entries(next_bank + 1, 1, m_battery, 0x2000);
694            m_prg_bank_mem[i]->configure_entries(next_bank + 2, 1, m_battery, 0x2000);
695            m_prg_bank_mem[i]->configure_entries(next_bank + 3, 1, m_battery, 0x2000);
696         }
697         next_bank += 4;
698      }
699      if (m_prgram)
700      {
701         if (m_prgram.count() / 0x2000 == 4)
702         {
703            m_prg_bank_mem[i]->configure_entries(next_bank, 4, m_prgram, 0x2000);
704         }
705         if (m_prgram.count() / 0x2000 == 2)
706         {
707            m_prg_bank_mem[i]->configure_entries(next_bank + 0, 2, m_prgram, 0x2000);
708            m_prg_bank_mem[i]->configure_entries(next_bank + 2, 2, m_prgram, 0x2000);
709         }
710         if (m_prgram.count() / 0x2000 == 1)
711         {
712            m_prg_bank_mem[i]->configure_entries(next_bank + 0, 1, m_prgram, 0x2000);
713            m_prg_bank_mem[i]->configure_entries(next_bank + 1, 1, m_prgram, 0x2000);
714            m_prg_bank_mem[i]->configure_entries(next_bank + 2, 1, m_prgram, 0x2000);
715            m_prg_bank_mem[i]->configure_entries(next_bank + 3, 1, m_prgram, 0x2000);
716         }
717         next_bank += 4;
718      }
719
720      // ...but we always map the banks to PRG at start
721676      m_prg_bank_mem[i]->set_entry(i);
722677      m_prg_bank[i] = i;
723678   }
trunk/src/mess/machine/nes.c
r30812r30813
158158      m_ppu->set_latch(ppu2c0x_latch_delegate(FUNC(device_nes_cart_interface::ppu_latch),m_cartslot->m_cart));
159159
160160      // install additional handlers (read_h, read_ex, write_ex)
161      if (m_cartslot->get_pcb_id() == STD_NROM368 || m_cartslot->get_pcb_id() == GG_NROM || m_cartslot->get_pcb_id() == CAMERICA_ALADDIN || m_cartslot->get_pcb_id() == SUNSOFT_DCS
161      if (m_cartslot->get_pcb_id() == STD_EXROM || m_cartslot->get_pcb_id() == STD_NROM368
162         || m_cartslot->get_pcb_id() == GG_NROM || m_cartslot->get_pcb_id() == CAMERICA_ALADDIN || m_cartslot->get_pcb_id() == SUNSOFT_DCS
162163         || m_cartslot->get_pcb_id() == BANDAI_DATACH || m_cartslot->get_pcb_id() == BANDAI_KARAOKE || m_cartslot->get_pcb_id() == BTL_2A03_PURITANS || m_cartslot->get_pcb_id() == AVE_MAXI15
163164         || m_cartslot->get_pcb_id() == KAISER_KS7022 || m_cartslot->get_pcb_id() == KAISER_KS7031 || m_cartslot->get_pcb_id() == BMC_VT5201
164165         || m_cartslot->get_pcb_id() == UNL_LH32 || m_cartslot->get_pcb_id() == UNL_LH10 || m_cartslot->get_pcb_id() == UNL_2708
trunk/hash/nes.xml
r30812r30813
17011701      </part>
17021702   </software>
17031703
1704   <software name="genchohi" supported="no">
1704   <software name="genchohi">
17051705      <description>Aoki Ookami to Shiroki Mejika - Genchou Hishi (Jpn)</description>
17061706      <year>1993</year>
17071707      <publisher>Koei</publisher>
r30812r30813
17181718            <rom name="koe-gg-0 chr" size="262144" crc="28e1a2c7" sha1="3c644d6d11f7eef992c314d7822216cd00de9293" offset="00000" />
17191719         </dataarea>
17201720         <!-- 8k WRAM on cartridge, battery backed up -->
1721         <dataarea name="bwram" size="8192">
1722            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
1721         <dataarea name="bwram" size="32768">
17231722         </dataarea>
17241723         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
17251724         <dataarea name="mapper_ram" size="1024">
r30812r30813
27562755      </part>
27572756   </software>
27582757
2759   <software name="bandking" supported="no">
2758   <software name="bandking">
27602759      <description>Bandit Kings of Ancient China (USA)</description>
27612760      <year>1990</year>
27622761      <publisher>Koei</publisher>
r30812r30813
27732772         </dataarea>
27742773         <!-- 8k WRAM on cartridge, battery backed up -->
27752774         <dataarea name="bwram" size="8192">
2776            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
27772775         </dataarea>
27782776         <!-- 8k WRAM on cartridge -->
27792777         <dataarea name="wram" size="8192">
r30812r30813
76387636         </dataarea>
76397637         <!-- 8k WRAM on cartridge, battery backed up -->
76407638         <dataarea name="bwram" size="8192">
7641            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
76427639         </dataarea>
76437640         <!-- 8k WRAM on cartridge -->
76447641         <dataarea name="wram" size="8192">
r30812r30813
1404014037         </dataarea>
1404114038         <!-- 8k WRAM on cartridge, battery backed up -->
1404214039         <dataarea name="bwram" size="8192">
14043            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
1404414040         </dataarea>
1404514041         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
1404614042         <dataarea name="mapper_ram" size="1024">
r30812r30813
1802218018         </dataarea>
1802318019         <!-- 8k WRAM on cartridge, battery backed up -->
1802418020         <dataarea name="bwram" size="8192">
18025            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
1802618021         </dataarea>
1802718022         <!-- 8k WRAM on cartridge -->
1802818023         <dataarea name="wram" size="8192">
r30812r30813
1900018995         </dataarea>
1900118996         <!-- 8k WRAM on cartridge, battery backed up -->
1900218997         <dataarea name="bwram" size="8192">
19003            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
1900418998         </dataarea>
1900518999         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
1900619000         <dataarea name="mapper_ram" size="1024">
r30812r30813
2091820912         </dataarea>
2091920913         <!-- 8k WRAM on cartridge, battery backed up -->
2092020914         <dataarea name="bwram" size="8192">
20921            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
2092220915         </dataarea>
2092320916         <!-- 8k WRAM on cartridge -->
2092420917         <dataarea name="wram" size="8192">
r30812r30813
2094720940         </dataarea>
2094820941         <!-- 8k WRAM on cartridge, battery backed up -->
2094920942         <dataarea name="bwram" size="8192">
20950            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
2095120943         </dataarea>
2095220944         <!-- 8k WRAM on cartridge -->
2095320945         <dataarea name="wram" size="8192">
r30812r30813
2668026672         </dataarea>
2668126673         <!-- 32k WRAM on cartridge, battery backed up -->
2668226674         <dataarea name="bwram" size="32768">
26683            <rom value="0x00" size="32768" offset="0" loadflag="fill" />
2668426675         </dataarea>
2668526676         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
2668626677         <dataarea name="mapper_ram" size="1024">
r30812r30813
2670626697         </dataarea>
2670726698         <!-- 8k WRAM on cartridge, battery backed up -->
2670826699         <dataarea name="bwram" size="8192">
26709            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
2671026700         </dataarea>
2671126701         <!-- 8k WRAM on cartridge -->
2671226702         <dataarea name="wram" size="8192">
r30812r30813
2678726777         </dataarea>
2678826778         <!-- 8k WRAM on cartridge, battery backed up -->
2678926779         <dataarea name="bwram" size="8192">
26790            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
2679126780         </dataarea>
2679226781         <!-- 8k WRAM on cartridge -->
2679326782         <dataarea name="wram" size="8192">
r30812r30813
3116231151         </dataarea>
3116331152         <!-- 32k WRAM on cartridge, battery backed up -->
3116431153         <dataarea name="bwram" size="32768">
31165            <rom value="0x00" size="32768" offset="0" loadflag="fill" />
3116631154         </dataarea>
3116731155         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
3116831156         <dataarea name="mapper_ram" size="1024">
r30812r30813
3193331921         </dataarea>
3193431922         <!-- 32k WRAM on cartridge, battery backed up -->
3193531923         <dataarea name="bwram" size="32768">
31936            <rom value="0x00" size="32768" offset="0" loadflag="fill" />
3193731924         </dataarea>
3193831925         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
3193931926         <dataarea name="mapper_ram" size="1024">
r30812r30813
3195931946         </dataarea>
3196031947         <!-- 32k WRAM on cartridge, battery backed up -->
3196131948         <dataarea name="bwram" size="32768">
31962            <rom value="0x00" size="32768" offset="0" loadflag="fill" />
3196331949         </dataarea>
3196431950         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
3196531951         <dataarea name="mapper_ram" size="1024">
r30812r30813
3295732943         </dataarea>
3295832944         <!-- 8k WRAM on cartridge, battery backed up -->
3295932945         <dataarea name="bwram" size="8192">
32960            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
3296132946         </dataarea>
3296232947         <!-- 1k Internal RAM in the MMC5 chip (ExRAM) -->
3296332948         <dataarea name="mapper_ram" size="1024">
r30812r30813
3550735492      </part>
3550835493   </software>
3550935494
35510   <software name="suikoden" cloneof="bandking" supported="no">
35495   <software name="suikoden" cloneof="bandking">
3551135496      <description>Suikoden - Tenmei no Chikai (Jpn)</description>
3551235497      <year>1990</year>
3551335498      <publisher>Koei</publisher>
r30812r30813
3552535510         </dataarea>
3552635511         <!-- 8k WRAM on cartridge, battery backed up -->
3552735512         <dataarea name="bwram" size="8192">
35528            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
3552935513         </dataarea>
3553035514         <!-- 8k WRAM on cartridge -->
3553135515         <dataarea name="wram" size="8192">
r30812r30813
4036440348         </dataarea>
4036540349         <!-- 8k WRAM on cartridge, battery backed up -->
4036640350         <dataarea name="bwram" size="8192">
40367            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
4036840351         </dataarea>
4036940352         <!-- 8k WRAM on cartridge -->
4037040353         <dataarea name="wram" size="8192">
r30812r30813
4332443307         </dataarea>
4332543308         <!-- 32k WRAM on cartridge (or 40k? readme mentions 5x16k srams!) no batteries? -->
4332643309         <dataarea name="bwram" size="32768">
43327            <rom value="0x00" size="32768" offset="0" loadflag="fill" />
4332843310         </dataarea>
4332943311         <dataarea name="wram" size="8192">
4333043312         </dataarea>
r30812r30813
4785847840         </dataarea>
4785947841         <!-- 8k WRAM on cartridge, battery backed up -->
4786047842         <dataarea name="bwram" size="8192">
47861            <rom value="0x00" size="8192" offset="0" loadflag="fill" />
4786247843         </dataarea>
4786347844         <!-- 8k WRAM on cartridge -->
4786447845         <dataarea name="wram" size="8192">

Previous 199869 Revisions Next


© 1997-2024 The MAME Team