Previous 199869 Revisions Next

r17600 Sunday 2nd September, 2012 at 22:35:44 UTC by Angelo Salese
(MESS) Fixed incorrect SPC700 IPL ROM behaviour in SNES driver(s), fixes some (not all) crashes at soft reset [Angelo Salese]
[src/mame/audio]snes_snd.c snes_snd.h
[src/mame/drivers]nss.c sfcbox.c snesb.c
[src/mess/drivers]snes.c

trunk/src/mame/audio/snes_snd.c
r17599r17600
11811181            spc700->port_in[3] = 0;
11821182         }
11831183
1184         if ((data & 0x80) != (spc700->ram[0xf1] & 0x80))
1185         {
1186            if (data & 0x80)
1187               memcpy(spc700->ipl_region, device->machine().root_device().memregion("sound_ipl")->base(), 64);
1188            else
1189               memcpy(spc700->ipl_region, &spc700->ram[0xffc0], 64);
1190         }
1184         /* bit 7 = IPL ROM enable */
11911185         break;
11921186      case 0x2:      /* Register address */
11931187         break;
r17599r17600
12211215READ8_DEVICE_HANDLER( spc_ram_r )
12221216{
12231217   snes_sound_state *spc700 = get_safe_token(device);
1218
1219   /* IPL ROM enabled */
1220   if(offset >= 0xffc0 && spc700->ram[0xf1] & 0x80)
1221      return spc700->ipl_region[offset & 0x3f];
1222
12241223   return spc700->ram[offset];
12251224}
12261225
r17599r17600
12291228   snes_sound_state *spc700 = get_safe_token(device);
12301229
12311230   spc700->ram[offset] = data;
1232
1233   /* if RAM is mapped in, mirror accordingly */
1234   if ((!(spc700->ram[0xf1] & 0x80)) && (offset >= 0xffc0))
1235      spc700->ipl_region[offset - 0xffc0] = data;
12361231}
12371232
1238READ8_DEVICE_HANDLER( spc_ipl_r )
1239{
1240   snes_sound_state *spc700 = get_safe_token(device);
1241   return spc700->ipl_region[offset];
1242}
12431233
1244
12451234READ8_DEVICE_HANDLER( spc_port_out )
12461235{
12471236   snes_sound_state *spc700 = get_safe_token(device);
r17599r17600
13281317
13291318   spc700->ram = auto_alloc_array_clear(device->machine(), UINT8, SNES_SPCRAM_SIZE);
13301319
1331   /* default to ROM visible */
1332   spc700->ram[0xf1] = 0x80;
1333
13341320   /* put IPL image at the top of RAM */
13351321   memcpy(spc700->ipl_region, machine.root_device().memregion("sound_ipl")->base(), 64);
13361322
r17599r17600
13541340   snes_sound_state *spc700 = get_safe_token(device);
13551341   int ii;
13561342
1343   /* default to ROM visible */
1344   spc700->ram[0xf1] = 0x80;
1345
13571346   /* Sort out the ports */
13581347   for (ii = 0; ii < 4; ii++)
13591348   {
trunk/src/mame/audio/snes_snd.h
r17599r17600
2727WRITE8_DEVICE_HANDLER( spc_io_w );
2828READ8_DEVICE_HANDLER( spc_ram_r );
2929WRITE8_DEVICE_HANDLER( spc_ram_w );
30READ8_DEVICE_HANDLER( spc_ipl_r );
3130READ8_DEVICE_HANDLER( spc_port_out );
3231WRITE8_DEVICE_HANDLER( spc_port_in );
3332
trunk/src/mame/drivers/sfcbox.c
r17599r17600
180180static ADDRESS_MAP_START( spc_mem, AS_PROGRAM, 8, sfcbox_state )
181181   AM_RANGE(0x0000, 0x00ef) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_r, spc_ram_w)   /* lower 32k ram */
182182   AM_RANGE(0x00f0, 0x00ff) AM_DEVREADWRITE_LEGACY("spc700", spc_io_r, spc_io_w)   /* spc io */
183   AM_RANGE(0x0100, 0xffff) AM_DEVWRITE_LEGACY("spc700", spc_ram_100_w)
184   AM_RANGE(0x0100, 0xffbf) AM_DEVREAD_LEGACY("spc700", spc_ram_100_r)
185   AM_RANGE(0xffc0, 0xffff) AM_DEVREAD_LEGACY("spc700", spc_ipl_r)
183   AM_RANGE(0x0100, 0xffff) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_100_r, spc_ram_100_w)
186184ADDRESS_MAP_END
187185
188186static ADDRESS_MAP_START( sfcbox_map, AS_PROGRAM, 8, sfcbox_state )
trunk/src/mame/drivers/snesb.c
r17599r17600
246246ADDRESS_MAP_END
247247
248248
249READ8_MEMBER(snesb_state::spc_ram_100_r)
250{
251   device_t *device = machine().device("spc700");
252   return spc_ram_r(device, offset + 0x100);
253}
254
255WRITE8_MEMBER(snesb_state::spc_ram_100_w)
256{
257   device_t *device = machine().device("spc700");
258   spc_ram_w(device, offset + 0x100, data);
259}
260
261249static ADDRESS_MAP_START( spc_mem, AS_PROGRAM, 8, snesb_state )
262250   AM_RANGE(0x0000, 0x00ef) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_r, spc_ram_w)   /* lower 32k ram */
263251   AM_RANGE(0x00f0, 0x00ff) AM_DEVREADWRITE_LEGACY("spc700", spc_io_r, spc_io_w)   /* spc io */
264   AM_RANGE(0x0100, 0xffff) AM_WRITE(spc_ram_100_w)
265   AM_RANGE(0x0100, 0xffbf) AM_READ(spc_ram_100_r)
266   AM_RANGE(0xffc0, 0xffff) AM_DEVREAD_LEGACY("spc700", spc_ipl_r)
252   AM_RANGE(0x0100, 0xffff) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_100_r, spc_ram_100_w)
267253ADDRESS_MAP_END
268254
269255static INPUT_PORTS_START( snes_common )
trunk/src/mame/drivers/nss.c
r17599r17600
311311   UINT8 m_cart_sel;
312312   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
313313
314   DECLARE_READ8_MEMBER(spc_ram_100_r);
315   DECLARE_WRITE8_MEMBER(spc_ram_100_w);
316314   DECLARE_READ8_MEMBER(ram_wp_r);
317315   DECLARE_WRITE8_MEMBER(ram_wp_w);
318316   DECLARE_READ8_MEMBER(nss_prot_r);
r17599r17600
352350   AM_RANGE(0xc00000, 0xffffff) AM_READWRITE_LEGACY(snes_r_bank7, snes_w_bank7)   /* Mirror and ROM */
353351ADDRESS_MAP_END
354352
355READ8_MEMBER(nss_state::spc_ram_100_r)
356{
357   device_t *device = machine().device("spc700");
358   return spc_ram_r(device, offset + 0x100);
359}
360353
361WRITE8_MEMBER(nss_state::spc_ram_100_w)
362{
363   device_t *device = machine().device("spc700");
364   spc_ram_w(device, offset + 0x100, data);
365}
366
367354static ADDRESS_MAP_START( spc_mem, AS_PROGRAM, 8, nss_state )
368355   AM_RANGE(0x0000, 0x00ef) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_r, spc_ram_w)   /* lower 32k ram */
369356   AM_RANGE(0x00f0, 0x00ff) AM_DEVREADWRITE_LEGACY("spc700", spc_io_r, spc_io_w)   /* spc io */
370   AM_RANGE(0x0100, 0xffff) AM_WRITE(spc_ram_100_w)
371   AM_RANGE(0x0100, 0xffbf) AM_READ(spc_ram_100_r)
372   AM_RANGE(0xffc0, 0xffff) AM_DEVREAD_LEGACY("spc700", spc_ipl_r)
357   AM_RANGE(0x0100, 0xffff) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_100_r, spc_ram_100_w)
373358ADDRESS_MAP_END
374359
375360/* NSS specific */
trunk/src/mess/drivers/snes.c
r17599r17600
8484static ADDRESS_MAP_START( spc_map, AS_PROGRAM, 8, snes_state )
8585   AM_RANGE(0x0000, 0x00ef) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_r, spc_ram_w)   /* lower 32k ram */
8686   AM_RANGE(0x00f0, 0x00ff) AM_DEVREADWRITE_LEGACY("spc700", spc_io_r, spc_io_w)   /* spc io */
87   AM_RANGE(0x0100, 0xffff) AM_DEVWRITE_LEGACY("spc700", spc_ram_100_w)
88   AM_RANGE(0x0100, 0xffbf) AM_DEVREAD_LEGACY("spc700", spc_ram_100_r)
89   AM_RANGE(0xffc0, 0xffff) AM_DEVREAD_LEGACY("spc700", spc_ipl_r)
87   AM_RANGE(0x0100, 0xffff) AM_DEVREADWRITE_LEGACY("spc700", spc_ram_100_r, spc_ram_100_w)
9088ADDRESS_MAP_END
9189
9290static ADDRESS_MAP_START( dsp_prg_map, AS_PROGRAM, 32, snes_state )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team