summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes/jaleco.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes/jaleco.c')
-rw-r--r--src/devices/bus/nes/jaleco.c886
1 files changed, 886 insertions, 0 deletions
diff --git a/src/devices/bus/nes/jaleco.c b/src/devices/bus/nes/jaleco.c
new file mode 100644
index 00000000000..28df5250118
--- /dev/null
+++ b/src/devices/bus/nes/jaleco.c
@@ -0,0 +1,886 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+/***********************************************************************************************************
+
+
+ NES/Famicom cartridge emulation for Jaleco PCBs
+
+
+ Here we emulate the following PCBs
+
+ * Jaleco JF-11 [mapper 140]
+ * Jaleco JF-13 [mapper 86]
+ * Jaleco JF-16 [mapper 78]
+ * Jaleco JF-17 [mapper 72] + its variant with samples
+ * Jaleco JF-19 [mapper 92] + its variant with samples
+ * Jaleco SS88006 [mapper 18] + its variant(s) with samples
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "jaleco.h"
+
+#include "cpu/m6502/m6502.h"
+#include "sound/samples.h"
+
+#ifdef NES_PCB_DEBUG
+#define VERBOSE 1
+#else
+#define VERBOSE 0
+#endif
+
+#define LOG_MMC(x) do { if (VERBOSE) logerror x; } while (0)
+
+
+//-------------------------------------------------
+// constructor
+//-------------------------------------------------
+
+const device_type NES_JF11 = &device_creator<nes_jf11_device>;
+const device_type NES_JF16 = &device_creator<nes_jf16_device>;
+const device_type NES_JF17 = &device_creator<nes_jf17_device>;
+const device_type NES_JF19 = &device_creator<nes_jf19_device>;
+const device_type NES_SS88006 = &device_creator<nes_ss88006_device>;
+const device_type NES_JF13 = &device_creator<nes_jf13_device>;
+const device_type NES_JF17_ADPCM = &device_creator<nes_jf17_adpcm_device>;
+const device_type NES_JF19_ADPCM = &device_creator<nes_jf19_adpcm_device>;
+const device_type NES_JF23 = &device_creator<nes_jf23_device>;
+const device_type NES_JF24 = &device_creator<nes_jf24_device>;
+const device_type NES_JF29 = &device_creator<nes_jf29_device>;
+const device_type NES_JF33 = &device_creator<nes_jf33_device>;
+
+
+nes_jf11_device::nes_jf11_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_JF11, "NES Cart Jaleco JF-11 PCB", tag, owner, clock, "nes_jf11", __FILE__)
+{
+}
+
+nes_jf13_device::nes_jf13_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_JF13, "NES Cart Jaleco JF-13 PCB", tag, owner, clock, "nes_jf13", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+nes_jf16_device::nes_jf16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_JF16, "NES Cart Jaleco JF-16 PCB", tag, owner, clock, "nes_jf16", __FILE__)
+{
+}
+
+nes_jf17_device::nes_jf17_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : nes_nrom_device(mconfig, type, name, tag, owner, clock, shortname, source)
+{
+}
+
+nes_jf17_device::nes_jf17_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_JF17, "NES Cart Jaleco JF-17 PCB", tag, owner, clock, "nes_jf17", __FILE__)
+{
+}
+
+nes_jf17_adpcm_device::nes_jf17_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_jf17_device(mconfig, NES_JF17_ADPCM, "NES Cart Jaleco JF-17 + ADPCM (Moero!! Pro Tennis) PCB", tag, owner, clock, "nes_jf17_pcm", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+nes_jf19_device::nes_jf19_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : nes_nrom_device(mconfig, type, name, tag, owner, clock, shortname, source)
+{
+}
+
+nes_jf19_device::nes_jf19_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_JF19, "NES Cart Jaleco JF-19 (Moero!! Pro Soccer) PCB", tag, owner, clock, "nes_jf19", __FILE__)
+{
+}
+
+nes_jf19_adpcm_device::nes_jf19_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_jf19_device(mconfig, NES_JF19_ADPCM, "NES Cart Jaleco JF-19 + ADPCM (Moero!! Pro Yakyuu 88) PCB", tag, owner, clock, "nes_jf19_pcm", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+nes_ss88006_device::nes_ss88006_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : nes_nrom_device(mconfig, type, name, tag, owner, clock, shortname, source)
+{
+}
+
+nes_ss88006_device::nes_ss88006_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_SS88006, "NES Cart Jaleco SS88006 PCB", tag, owner, clock, "nes_ss88006", __FILE__)
+{
+}
+
+nes_ss88006_adpcm_device::nes_ss88006_adpcm_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : nes_ss88006_device(mconfig, type, name, tag, owner, clock, shortname, source)
+{
+}
+
+nes_jf23_device::nes_jf23_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_ss88006_adpcm_device(mconfig, NES_JF23, "NES Cart Jaleco Shin Moero Pro Yakyuu PCB", tag, owner, clock, "nes_jf23", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+nes_jf24_device::nes_jf24_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_ss88006_adpcm_device(mconfig, NES_JF24, "NES Cart Jaleco Terao no Dosukoi Oozumou PCB", tag, owner, clock, "nes_jf24", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+nes_jf29_device::nes_jf29_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_ss88006_adpcm_device(mconfig, NES_JF29, "NES Cart Jaleco Moe Pro! '90 PCB", tag, owner, clock, "nes_jf29", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+nes_jf33_device::nes_jf33_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_ss88006_adpcm_device(mconfig, NES_JF33, "NES Cart Jaleco Moe Pro! Saikyou-hen PCB", tag, owner, clock, "nes_jf33", __FILE__),
+ m_samples(*this, "samples")
+{
+}
+
+
+
+void nes_jf11_device::device_start()
+{
+ common_start();
+}
+
+void nes_jf11_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg32(0);
+ chr8(0, m_chr_source);
+}
+
+void nes_jf13_device::device_start()
+{
+ common_start();
+}
+
+void nes_jf13_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg32(0);
+ chr8(0, m_chr_source);
+}
+
+void nes_jf16_device::device_start()
+{
+ common_start();
+}
+
+void nes_jf16_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, m_chr_source);
+}
+
+void nes_jf17_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_latch));
+}
+
+void nes_jf17_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, m_chr_source);
+ m_latch = 0;
+}
+
+void nes_jf19_device::device_start()
+{
+ common_start();
+}
+
+void nes_jf19_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg32(0);
+ chr8(0, m_chr_source);
+}
+
+void nes_ss88006_device::device_start()
+{
+ common_start();
+ irq_timer = timer_alloc(TIMER_IRQ);
+ irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
+
+ save_item(NAME(m_mmc_prg_bank));
+ save_item(NAME(m_mmc_vrom_bank));
+ save_item(NAME(m_irq_enable));
+ save_item(NAME(m_irq_count));
+ save_item(NAME(m_irq_count_latch));
+ save_item(NAME(m_irq_mode));
+ save_item(NAME(m_latch));
+}
+
+void nes_ss88006_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, m_chr_source);
+
+ memset(m_mmc_prg_bank, 0, sizeof(m_mmc_prg_bank));
+ memset(m_mmc_vrom_bank, 0, sizeof(m_mmc_vrom_bank));
+ m_irq_enable = 0;
+ m_irq_mode = 0;
+ m_irq_count = 0;
+ m_irq_count_latch = 0;
+ m_latch = 0;
+}
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+/*-------------------------------------------------
+
+ Jaleco JF-11, JF-12 & JF-14 boards emulation
+
+ Games: Bio Senshi Dan, Mississippi Satsujin Jiken
+
+ iNES: mapper 140
+
+ In MESS: Supported.
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_jf11_device::write_m)
+{
+ LOG_MMC(("jf11 write_m, offset: %04x, data: %02x\n", offset, data));
+ chr8(data, CHRROM);
+ prg32(data >> 4);
+}
+
+/*-------------------------------------------------
+
+ Jaleco JF-13 board emulation
+
+ Games: Moero Pro Yakyuu
+
+ Note: we don't emulate the additional sound hardware.
+
+ iNES: mapper 86
+
+ In MESS: Supported.
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_jf13_device::write_m)
+{
+ LOG_MMC(("jf13 write_m, offset: %04x, data: %02x\n", offset, data));
+
+ if (offset < 0x1000)
+ {
+ prg32((data >> 4) & 0x03);
+ chr8(((data >> 4) & 0x04) | (data & 0x03), CHRROM);
+ }
+ else
+ {
+// printf("sample write: offset: %04x, data: %02x\n", offset, data);
+ if (data & 0x20)
+ m_samples->start(data & 0x0f, data & 0x0f);
+ else
+ m_samples->stop_all();
+ }
+}
+
+/*-------------------------------------------------
+
+ Jaleco JF-16 board emulation
+
+ iNES: mapper 78 (shared with a diff Irem board)
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_jf16_device::write_h)
+{
+ LOG_MMC(("jf16 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ // this pcb is subject to bus conflict
+ data = account_bus_conflict(offset, data);
+
+ set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
+ chr8(data >> 4, CHRROM);
+ prg16_89ab(data);
+}
+
+
+/*-------------------------------------------------
+
+ Jaleco JF-17 boards emulation
+
+ Note: we don't emulate the additional sound hardware
+ for Moero!! Pro Tennis
+
+ Games: Moero!! Juudou Warriors, Moero!! Pro Tennis, Pinball
+ Quest Jpn
+
+ iNES: mapper 72
+
+ In MESS: Supported, see below for the Moero Pro Tennis
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_jf17_device::write_h)
+{
+ LOG_MMC(("jf17 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ // this pcb is subject to bus conflict
+ data = account_bus_conflict(offset, data);
+
+ if (BIT(m_latch, 7) && !BIT(data, 7))
+ prg16_89ab(m_latch & 0x07);
+ if (BIT(m_latch, 6) && !BIT(data, 6))
+ chr8(m_latch & 0x0f, CHRROM);
+
+ m_latch = data;
+}
+
+WRITE8_MEMBER(nes_jf17_adpcm_device::write_h)
+{
+ LOG_MMC(("jf17 + ADPCM write_h, offset: %04x, data: %02x\n", offset, data));
+
+ // this pcb is subject to bus conflict
+ data = account_bus_conflict(offset, data);
+
+ if (BIT(m_latch, 7) && !BIT(data, 7))
+ prg16_89ab(m_latch & 0x07);
+ if (BIT(m_latch, 6) && !BIT(data, 6))
+ chr8(m_latch & 0x0f, CHRROM);
+ if (BIT(data, 5) && !BIT(data,4))
+ {
+// printf("sample write: offset: %04x, data: %02x\n", offset, data);
+ m_samples->start(offset & 0x1f, offset & 0x1f);
+ }
+
+ m_latch = data;
+}
+
+/*-------------------------------------------------
+
+ Jaleco JF-19 boards emulation
+
+ Note: we don't emulate the additional sound hardware.
+
+ Games: Moero Pro Soccer, Moero Pro Yakyuu '88
+
+ iNES: mapper 92
+
+ In MESS: Supported, see below for the Moero Pro Yakyuu '88
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_jf19_device::write_h)
+{
+ LOG_MMC(("jf19 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ // this pcb is subject to bus conflict
+ data = account_bus_conflict(offset, data);
+
+ if (BIT(data, 7))
+ prg16_cdef(data & 0x0f);
+ if (BIT(data, 6))
+ chr8(data & 0x0f, CHRROM);
+}
+
+WRITE8_MEMBER(nes_jf19_adpcm_device::write_h)
+{
+ LOG_MMC(("jf19 + ADPCM write_h, offset: %04x, data: %02x\n", offset, data));
+
+ // this pcb is subject to bus conflict
+ data = account_bus_conflict(offset, data);
+
+ if (BIT(data, 7))
+ prg16_cdef(data & 0x0f);
+ if (BIT(data, 6))
+ chr8(data & 0x0f, CHRROM);
+ if (BIT(data, 5) && !BIT(data,4))
+ {
+// printf("sample write: offset: %04x, data: %02x\n", offset, data);
+ m_samples->start(offset & 0x1f, offset & 0x1f);
+ }
+}
+
+/*-------------------------------------------------
+
+ Jaleco SS88006 board emulation, aka JF-27, JF-29, JF-30, ...,
+ JF-38, JF-40, JF-41
+
+ Games: Lord of King, Magic John, Moe Pro '90, Ninja Jajamaru,
+ Pizza Pop, Plasma Ball
+
+ iNES: mapper 18
+
+ In MESS: Supported, see below for the games with samples
+
+ -------------------------------------------------*/
+
+void nes_ss88006_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (id == TIMER_IRQ)
+ {
+ if (m_irq_enable)
+ {
+ if (m_irq_mode & 0x08) // 4bits counter
+ {
+ if (!(m_irq_count & 0x000f))
+ {
+ m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
+ m_irq_count = (m_irq_count & 0xfff0) | 0x000f;
+ }
+ else
+ m_irq_count = (m_irq_count & 0xfff0) | ((m_irq_count & 0x000f) - 1);
+ }
+ else if (m_irq_mode & 0x04) // 8bits counter
+ {
+ if (!(m_irq_count & 0x00ff))
+ {
+ m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
+ m_irq_count = (m_irq_count & 0xff00) | 0x00ff;
+ }
+ else
+ m_irq_count = (m_irq_count & 0xff00) | ((m_irq_count & 0x00ff) - 1);
+ }
+ else if (m_irq_mode & 0x02) // 12bits counter
+ {
+ if (!(m_irq_count & 0x0fff))
+ {
+ m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
+ m_irq_count = (m_irq_count & 0xf000) | 0x0fff;
+ }
+ else
+ m_irq_count = (m_irq_count & 0xf000) | ((m_irq_count & 0x0fff) - 1);
+ }
+ else // 16bits counter
+ {
+ if (!m_irq_count)
+ {
+ m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
+ m_irq_count = 0xffff;
+ }
+ else
+ m_irq_count = m_irq_count - 1;
+ }
+ }
+ }
+}
+
+WRITE8_MEMBER(nes_ss88006_device::ss88006_write)
+{
+ UINT8 bank;
+ LOG_MMC(("ss88006 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ switch (offset & 0x7003)
+ {
+ case 0x0000:
+ m_mmc_prg_bank[0] = (m_mmc_prg_bank[0] & 0xf0) | (data & 0x0f);
+ prg8_89(m_mmc_prg_bank[0]);
+ break;
+ case 0x0001:
+ m_mmc_prg_bank[0] = (m_mmc_prg_bank[0] & 0x0f) | (data << 4);
+ prg8_89(m_mmc_prg_bank[0]);
+ break;
+ case 0x0002:
+ m_mmc_prg_bank[1] = (m_mmc_prg_bank[1] & 0xf0) | (data & 0x0f);
+ prg8_ab(m_mmc_prg_bank[1]);
+ break;
+ case 0x0003:
+ m_mmc_prg_bank[1] = (m_mmc_prg_bank[1] & 0x0f) | (data << 4);
+ prg8_ab(m_mmc_prg_bank[1]);
+ break;
+ case 0x1000:
+ m_mmc_prg_bank[2] = (m_mmc_prg_bank[2] & 0xf0) | (data & 0x0f);
+ prg8_cd(m_mmc_prg_bank[2]);
+ break;
+ case 0x1001:
+ m_mmc_prg_bank[2] = (m_mmc_prg_bank[2] & 0x0f) | (data << 4);
+ prg8_cd(m_mmc_prg_bank[2]);
+ break;
+
+ /* $9002, 3 (1002, 3) uncaught = Jaleco Baseball writes 0 */
+ /* believe it's related to battery-backed ram enable/disable */
+
+ case 0x2000: case 0x2001: case 0x2002: case 0x2003:
+ case 0x3000: case 0x3001: case 0x3002: case 0x3003:
+ case 0x4000: case 0x4001: case 0x4002: case 0x4003:
+ case 0x5000: case 0x5001: case 0x5002: case 0x5003:
+ bank = ((offset & 0x7000) - 0x2000) / 0x0800 + ((offset & 0x0002) >> 1);
+ if (offset & 0x0001)
+ m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x0f)<< 4);
+ else
+ m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f);
+
+ chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
+ break;
+
+ case 0x6000:
+ m_irq_count_latch = (m_irq_count_latch & 0xfff0) | (data & 0x0f);
+ break;
+ case 0x6001:
+ m_irq_count_latch = (m_irq_count_latch & 0xff0f) | ((data & 0x0f) << 4);
+ break;
+ case 0x6002:
+ m_irq_count_latch = (m_irq_count_latch & 0xf0ff) | ((data & 0x0f) << 8);
+ break;
+ case 0x6003:
+ m_irq_count_latch = (m_irq_count_latch & 0x0fff) | ((data & 0x0f) << 12);
+ break;
+ case 0x7000:
+ m_irq_count = m_irq_count_latch;
+ m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
+ break;
+ case 0x7001:
+ m_irq_enable = data & 0x01;
+ m_irq_mode = data & 0x0e;
+ m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
+ break;
+
+ case 0x7002:
+ switch (data & 0x03)
+ {
+ case 0: set_nt_mirroring(PPU_MIRROR_HORZ); break;
+ case 1: set_nt_mirroring(PPU_MIRROR_VERT); break;
+ case 2: set_nt_mirroring(PPU_MIRROR_LOW); break;
+ case 3: set_nt_mirroring(PPU_MIRROR_HIGH); break;
+ }
+ break;
+
+ default:
+ logerror("Jaleco SS88006 uncaught write, addr: %04x, value: %02x\n", offset + 0x8000, data);
+ break;
+ }
+}
+
+
+// bits2-bits6 are sample number, bit1 is setup/enable/disable
+// program first write sample # + bit1 set to 'init' the sample
+// then it writes sample # + bit1 clear to 'start' the sample
+void nes_ss88006_adpcm_device::ss88006_adpcm_write(address_space &space, offs_t offset, UINT8 data, samples_device *dev)
+{
+ LOG_MMC(("ss88006 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ switch (offset & 0x7003)
+ {
+ case 0x7003:
+ if ((m_latch & 0x7c) == (data & 0x7c))
+ {
+// printf("sample write: data: %02x\n", data);
+ if ((m_latch & 2) && !(data & 2))
+ dev->start((data >> 2) & 0x1f, (data >> 2) & 0x1f);
+ }
+ m_latch = data;
+ break;
+
+ default:
+ ss88006_write(space, offset, data);
+ break;
+ }
+}
+
+/**********************************************************
+
+ Boards with external samples
+ (due to undumpable UPD7755C/UPD7756C)
+
+ JF-13 (Moero!! Pro Yakyuu) / iNES mapper 86
+ JF-17 (Moero!! Pro Tennis) / iNES mapper 72 + ADPCM
+ JF-19 (Moero!! Pro Yakyuu '88 - Kettei Ban) / iNES mapper 92 + ADPCM
+ JF-23 (Shin Moero Pro Yakyuu) / iNES mapper 18 + ADPCM
+ JF-24 (Terao no Dosukoi Oozumou) / iNES mapper 18 + ADPCM
+ JF-29 (Moe Pro 90) / iNES mapper 18 + ADPCM
+ JF-33 (Moe Pro Saikyou-hen) / iNES mapper 18 + ADPCM
+
+
+***********************************************************/
+
+static const char *const jf13_sample_names[] =
+{
+ "*moepro",
+ "00", // strike
+ "01", // ball
+ "02", // time
+ "03", // out
+ "04", // safe
+ "05", // foul
+ "06", // (catcher obtains the ball)
+ "07", // you're out
+ "08", // play ball
+ "09", // ball four
+ "10", // home run
+ "11", // new pitcher
+ "12", // ouch (pitcher hits batter)
+ "13", // ??
+ "14", // (bat hits the ball)
+ "15", // (crowd)
+ 0
+};
+
+static const char *const jf17_sample_names[] =
+{
+ "*mptennis",
+ "00", // NOT EXISTING?
+ "01", // NOT EXISTING?
+ "02", // "love" (points)
+ "03", // 15 (points)
+ "04", // 30 (points)
+ "05", // 40 (points)
+ "06", // advantage
+ "07", // (advantage) server
+ "08", // (advantage) receiver
+ "09", // all (equal points)
+ "10", // deuce
+ "11", // game
+ "12", // (racket hits ball)
+ "13", // (crowd?)
+ "14", // fault
+ "15", // net
+ "16", // out
+ "17", // ??
+ "18", // (ball hits player)
+ "19", // NOT EXISTING?
+ 0
+};
+
+static const char *const jf19_sample_names[] =
+{
+ "*moepro88",
+ "00", // out
+ "01", // safe
+ "02", // foul
+ "03", // fair
+ "04", // strike
+ "05", // ball
+ "06", // time
+ "07", // batter out
+ "08", // ball four
+ "09", // home run
+ "10", // play ball
+ "11", // new pitcher
+ "12", // pinch-hit
+ "13", // (hit by pitch)
+ "14", // (bat hits the ball)
+ "15", // (bunt)
+ "16", // NOT EXISTING?
+ "17", // (catcher obtains the ball)
+ "18", // (pitcher obtains the ball)
+ "19", // (crowd)
+ 0
+};
+
+static const char *const jf23_sample_names[] =
+{
+ "*smoepro",
+ "00", // out
+ "01", // safe
+ "02", // foul
+ "03", // NOT EXISTING?
+ "04", // strike
+ "05", // ball
+ "06", // time
+ "07", // batter out
+ "08", // ball four
+ "09", // home run
+ "10", // play ball
+ "11", // new pitcher
+ "12", // pinch-hit
+ "13", // (hit by pitch)
+ "14", // (bat hits the ball)
+ "15", // (bunt)
+ "16", // (catcher obtains the ball)
+ "17", // fair
+ "18", // (catcher obtains the ball, alt)
+ "19", // (crowd)
+ 0
+};
+
+static const char *const jf24_sample_names[] =
+{
+ "*terao",
+ "00", // (tree beating sound)
+ "01", // Hakkyoyoi
+ "02", // Nokotta
+ "03", // Matta Nashi
+ "04", // Nokotta Nokotta
+ "05", // Matta Arimasen
+ 0
+};
+
+static const char *const jf29_sample_names[] =
+{
+ "*moepro90",
+ "00", // out
+ "01", // safe
+ "02", // foul
+ "03", // Not existing?
+ "04", // strike
+ "05", // ball
+ "06", // time
+ "07", // batter out
+ "08", // ball four
+ "09", // home run
+ "10", // play ball
+ "11", // new pitcher
+ "12", // pinch-hit
+ "13", // (hit by pitch)
+ "14", // (bat hits the ball)
+ "15", // (bunt)
+ "16", // (catcher obtains the ball, alt)
+ "17", // (catcher obtains the ball)
+ "18", // (catcher obtains the ball, alt 2)
+ "19", // (crowd)
+ 0
+};
+
+static const char *const jf33_sample_names[] =
+{
+ "*mpsaikyo",
+ "00", // out
+ "01", // safe
+ "02", // foul
+ "03", // ???
+ "04", // strike
+ "05", // ball
+ "06", // time
+ "07", // batter out
+ "08", // ball four
+ "09", // home run
+ "10", // play ball
+ "11", // new pitcher
+ "12", // pinch-hit
+ "13", // (hit by pitch)
+ "14", // (bat hits the ball)
+ "15", // (bunt)
+ "16", // (catcher obtains the ball)
+ "17", // (catcher obtains the ball, alt)
+ "18", // ??
+ "19", // (crowd)
+ 0
+};
+
+//-------------------------------------------------
+// MACHINE_DRIVER
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( jf13 )
+
+ // additional sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("addon")
+
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(16)
+ MCFG_SAMPLES_NAMES(jf13_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.50)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( jf17 )
+
+ // additional sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("addon")
+
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(20)
+ MCFG_SAMPLES_NAMES(jf17_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.50)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( jf19 )
+
+ // additional sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("addon")
+
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(20)
+ MCFG_SAMPLES_NAMES(jf19_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.50)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( jf23 )
+
+ // additional sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("addon")
+
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(20)
+ MCFG_SAMPLES_NAMES(jf23_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.50)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( jf24 )
+
+ // additional sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("addon")
+
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(6)
+ MCFG_SAMPLES_NAMES(jf24_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.50)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( jf29 )
+
+ // additional sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("addon")
+
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(20)
+ MCFG_SAMPLES_NAMES(jf29_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.50)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( jf33 )
+
+ // additional sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("addon")
+
+ MCFG_SOUND_ADD("samples", SAMPLES, 0)
+ MCFG_SAMPLES_CHANNELS(20)
+ MCFG_SAMPLES_NAMES(jf33_sample_names)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 0.50)
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// machine_config_additions
+//-------------------------------------------------
+
+machine_config_constructor nes_jf13_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jf13 );
+}
+
+machine_config_constructor nes_jf17_adpcm_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jf17 );
+}
+
+machine_config_constructor nes_jf19_adpcm_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jf19 );
+}
+
+machine_config_constructor nes_jf23_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jf23 );
+}
+
+machine_config_constructor nes_jf24_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jf24 );
+}
+
+machine_config_constructor nes_jf29_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jf29 );
+}
+
+machine_config_constructor nes_jf33_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jf33 );
+}