diff --git a/src/mame/drivers/nss.c b/src/mame/drivers/nss.c index ad3e71903f7..10e9b3c467a 100644 --- a/src/mame/drivers/nss.c +++ b/src/mame/drivers/nss.c @@ -295,7 +295,6 @@ Contra III CONTRA_III_1 TC574000 CONTRA_III_0 TC574000 GAME1_NSSU #include "emu.h" #include "cpu/z80/z80.h" -#include "cpu/upd7725/upd7725.h" #include "includes/snes.h" static ADDRESS_MAP_START( snes_map, ADDRESS_SPACE_PROGRAM, 8) @@ -484,14 +483,6 @@ static ADDRESS_MAP_START( bios_io_map, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_END -static ADDRESS_MAP_START( dsp_prg_map, ADDRESS_SPACE_PROGRAM, 32 ) - AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION("dspprg", 0) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( dsp_data_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x0000, 0x03ff) AM_ROM AM_REGION("dspdata", 0) -ADDRESS_MAP_END - static MACHINE_START( nss ) { UINT8 *ROM = machine->region("bios")->base(); @@ -657,10 +648,6 @@ static MACHINE_CONFIG_START( snes, snes_state ) MCFG_CPU_ADD("soundcpu", SPC700, 2048000/2) /* 2.048 Mhz, but internal divider */ MCFG_CPU_PROGRAM_MAP(spc_mem) - MCFG_CPU_ADD("dsp", UPD7725, 8000000) - MCFG_CPU_PROGRAM_MAP(dsp_prg_map) - MCFG_CPU_DATA_MAP(dsp_data_map) - // MCFG_QUANTUM_TIME(HZ(24000)) MCFG_QUANTUM_PERFECT_CPU("maincpu") @@ -704,7 +691,7 @@ MACHINE_CONFIG_END #define NSS_BIOS \ ROM_REGION(0x100, "user5", 0) /* IPL ROM */ \ ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) \ - ROM_REGION(0x10000, "addons", ROMREGION_ERASE00) /* add-on chip ROMs (DSP1 could be needed if we dump smk). the second 0x800 host DSP3 ROM in MESS */\ + ROM_REGION(0x10000, "addons", ROMREGION_ERASE00) /* add-on chip ROMs (DSP1 will be needed if we dump the NSS version of Super Mario Kart)*/\ ROM_LOAD( "dsp1b.bin", SNES_DSP1B_OFFSET, 0x002800, CRC(453557e0) SHA1(3a218b0e4572a8eba6d0121b17fdac9529609220) ) \ ROM_REGION(0x20000, "bios", 0) /* Bios CPU (what is it?) */ \ ROM_LOAD("nss-c.dat" , 0x10000, 0x8000, CRC(a8e202b3) SHA1(b7afcfe4f5cf15df53452dc04be81929ced1efb2) ) /* bios */ \ diff --git a/src/mame/includes/snes.h b/src/mame/includes/snes.h index 418d51d5c8e..51c0bb256de 100644 --- a/src/mame/includes/snes.h +++ b/src/mame/includes/snes.h @@ -6,6 +6,7 @@ #include "streams.h" #include "cpu/spc700/spc700.h" #include "cpu/g65816/g65816.h" +#include "cpu/upd7725/upd7725.h" #include "audio/snes_snd.h" /* @@ -469,6 +470,7 @@ public: spc700_device *soundcpu; snes_sound_device *spc700; cpu_device *superfx; + upd7725_device *upd7725; }; /* Special chips, checked at init and used in memory handlers */ diff --git a/src/mame/machine/snes.c b/src/mame/machine/snes.c index c93045b3ff7..1ab3b2793cc 100644 --- a/src/mame/machine/snes.c +++ b/src/mame/machine/snes.c @@ -36,6 +36,12 @@ static WRITE8_HANDLER(snes_io_dma_w); struct snes_cart_info snes_cart; +// DSP accessors +#define dsp_get_sr() state->upd7725->snesdsp_read(false) +#define dsp_get_dr() state->upd7725->snesdsp_read(true) +#define dsp_set_sr(data) state->upd7725->snesdsp_write(false, data) +#define dsp_set_dr(data) state->upd7725->snesdsp_write(true, data) + // add-on chip emulators #include "machine/snesobc1.c" #include "machine/snescx4.c" @@ -278,40 +284,6 @@ static TIMER_CALLBACK(snes_mult_callback) snes_ram[RDMPYH] = (c >> 8) & 0xff; } - -/************************************* - - DSP I/O - -*************************************/ -static UINT8 dsp_get_sr(running_machine *machine) -{ - upd7725_device *upd7725 = machine->device("dsp"); - - return upd7725->snesdsp_read(false); -} - -static UINT8 dsp_get_dr(running_machine *machine) -{ - upd7725_device *upd7725 = machine->device("dsp"); - - return upd7725->snesdsp_read(true); -} - -static void dsp_set_sr(running_machine *machine, UINT8 data) -{ - upd7725_device *upd7725 = machine->device("dsp"); - - upd7725->snesdsp_write(false, data); -} - -static void dsp_set_dr(running_machine *machine, UINT8 data) -{ - upd7725_device *upd7725 = machine->device("dsp"); - - upd7725->snesdsp_write(true, data); -} - /************************************* Input Handlers @@ -968,7 +940,7 @@ READ8_HANDLER( snes_r_bank1 ) else if (state->has_addon_chip == HAS_OBC1) value = obc1_read(space, offset); else if ((state->cart[0].mode == SNES_MODE_21) && (state->has_addon_chip == HAS_DSP1) && (offset < 0x100000)) - value = (address < 0x7000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0x7000) ? dsp_get_dr() : dsp_get_sr(); else if (state->has_addon_chip == HAS_CX4) value = CX4_read(address - 0x6000); else if (state->has_addon_chip == HAS_SPC7110 || state->has_addon_chip == HAS_SPC7110_RTC) @@ -983,11 +955,11 @@ READ8_HANDLER( snes_r_bank1 ) } } else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP1) && (offset >= 0x200000)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP2) && (offset >= 0x200000)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if ((state->has_addon_chip == HAS_DSP3) && (offset >= 0x200000)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else value = snes_ram[offset]; @@ -1047,13 +1019,13 @@ READ8_HANDLER( snes_r_bank2 ) } /* some dsp1 games use these banks 0x30 to 0x3f at address 0x8000 */ else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP1)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP2)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if (state->has_addon_chip == HAS_DSP3) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if (state->has_addon_chip == HAS_DSP4) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else value = snes_ram[0x300000 + offset]; @@ -1130,7 +1102,7 @@ READ8_HANDLER( snes_r_bank4 ) value = snes_ram[0x600000 + offset]; /* some other dsp1 games use these banks 0x60 to 0x6f at address 0x0000 */ else if (state->has_addon_chip == HAS_DSP1) - value = (address >= 0x4000) ? dsp_get_sr(space->machine) : dsp_get_dr(space->machine); + value = (address >= 0x4000) ? dsp_get_sr() : dsp_get_dr(); else { logerror("(PC=%06x) snes_r_bank4: Unmapped external chip read: %04x\n",cpu_get_pc(space->cpu),address); @@ -1218,13 +1190,13 @@ READ8_HANDLER( snes_r_bank6 ) } } else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP1) && (offset >= 0x200000)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP2) && (offset >= 0x200000)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if ((state->has_addon_chip == HAS_DSP3) && (offset >= 0x200000)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else if ((state->has_addon_chip == HAS_DSP4) && (offset >= 0x300000)) - value = (address < 0xc000) ? dsp_get_dr(space->machine) : dsp_get_sr(space->machine); + value = (address < 0xc000) ? dsp_get_dr() : dsp_get_sr(); else value = snes_ram[0x800000 + offset]; @@ -1314,7 +1286,7 @@ WRITE8_HANDLER( snes_w_bank1 ) else if (state->has_addon_chip == HAS_OBC1) obc1_write(space, offset, data); else if ((state->cart[0].mode == SNES_MODE_21) && (state->has_addon_chip == HAS_DSP1) && (offset < 0x100000)) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else if (state->has_addon_chip == HAS_CX4) CX4_write(space->machine, address - 0x6000, data); else if (state->has_addon_chip == HAS_SPC7110 || state->has_addon_chip == HAS_SPC7110_RTC) @@ -1326,19 +1298,19 @@ WRITE8_HANDLER( snes_w_bank1 ) logerror("snes_w_bank1: Attempt to write to reserved address: %x = %02x\n", offset, data); } else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP1) && (offset >= 0x200000)) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP2) && (offset >= 0x200000)) { if (address < 0xc000) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else - dsp_set_sr(space->machine, data); + dsp_set_sr(data); } else if ((state->has_addon_chip == HAS_DSP3) && (offset >= 0x200000)) if (address < 0xc000) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else - dsp_set_sr(space->machine, data); + dsp_set_sr(data); else logerror( "(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset ); @@ -1387,24 +1359,19 @@ WRITE8_HANDLER( snes_w_bank2 ) } /* some dsp1 games use these banks 0x30 to 0x3f at address 0x8000 */ else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP1)) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP2)) { if (address < 0xc000) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else - dsp_set_sr(space->machine, data); + dsp_set_sr(data); } - else if (state->has_addon_chip == HAS_DSP3) + else if ((state->has_addon_chip == HAS_DSP3) || (state->has_addon_chip == HAS_DSP4)) if (address < 0xc000) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else - dsp_set_sr(space->machine, data); - else if (state->has_addon_chip == HAS_DSP4) - if (address < 0xc000) - dsp_set_dr(space->machine, data); - else - dsp_set_sr(space->machine, data); + dsp_set_sr(data); else logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x300000); @@ -1429,7 +1396,7 @@ WRITE8_HANDLER( snes_w_bank4 ) if (address >= 0x8000) logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x600000); else if (state->has_addon_chip == HAS_DSP1) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else logerror("snes_w_bank4: Attempt to write to reserved address: %X = %02x\n", offset + 0x600000, data); } @@ -1498,24 +1465,24 @@ WRITE8_HANDLER( snes_w_bank6 ) } } else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP1) && (offset >= 0x200000)) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else if ((state->cart[0].mode == SNES_MODE_20) && (state->has_addon_chip == HAS_DSP2) && (offset >= 0x200000)) { if (address < 0xc000) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else - dsp_set_sr(space->machine, data); + dsp_set_sr(data); } else if ((state->has_addon_chip == HAS_DSP3) && (offset >= 0x200000)) if (address < 0xc000) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else - dsp_set_sr(space->machine, data); + dsp_set_sr(data); else if ((state->has_addon_chip == HAS_DSP4) && (offset >= 0x300000)) if (address < 0xc000) - dsp_set_dr(space->machine, data); + dsp_set_dr(data); else - dsp_set_sr(space->machine, data); + dsp_set_sr(data); else logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x800000); @@ -1708,8 +1675,14 @@ static void snes_init_ram( running_machine *machine ) snes_ram[WRIO] = 0xff; snes_ram[VMAIN] = 0x80; - // assume no DSP and halt it... - cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, ASSERT_LINE); + // see if there's a uPD7725 DSP in the machine config + state->upd7725 = machine->device("dsp"); + + // if we have a DSP, halt it for the moment + if (state->upd7725) + { + cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, ASSERT_LINE); + } switch (state->has_addon_chip) { @@ -1717,8 +1690,15 @@ static void snes_init_ram( running_machine *machine ) case HAS_DSP2: case HAS_DSP3: case HAS_DSP4: - // we do have a DSP, let 'er rip - cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, CLEAR_LINE); + // cartridge uses the DSP, let 'er rip + if (state->upd7725) + { + cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, CLEAR_LINE); + } + else + { + logerror("SNES: We have a DSP, but the machine driver is missing the uPD7725!\n"); + } break; case HAS_RTC: