diff options
-rw-r--r-- | src/mame/drivers/vp101.cpp | 232 |
1 files changed, 211 insertions, 21 deletions
diff --git a/src/mame/drivers/vp101.cpp b/src/mame/drivers/vp101.cpp index 7104d1ffbb7..78216735d6e 100644 --- a/src/mame/drivers/vp101.cpp +++ b/src/mame/drivers/vp101.cpp @@ -106,6 +106,9 @@ Small outline design for easy kit retrofitting of existing cabinets. #include "imagedev/harddriv.h" #include "screen.h" +#define VERBOSE (0) +#include "logmacro.h" + class vp10x_state : public driver_device { public: @@ -113,8 +116,7 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_mainram(*this, "mainram"), - m_ata(*this, "ata"), - m_in0(*this, "IN0") + m_ata(*this, "ata") { } void vp50(machine_config &config); @@ -126,7 +128,14 @@ private: uint32_t tty_ready_r(); void tty_w(uint32_t data); - uint32_t test_r() { return 0xffffffff; } + uint32_t test_r(); + uint32_t sound_r(offs_t offset); + void sound_w(offs_t offset, uint32_t data); + void fb_base_w(uint32_t data); + uint32_t video_r(offs_t offset); + void video_w(offs_t offset, uint32_t data); + uint32_t video2_r(offs_t offset); + void video2_w(offs_t offset, uint32_t data); uint32_t pic_r(); void pic_w(uint32_t data); @@ -152,7 +161,6 @@ private: required_device<mips3_device> m_maincpu; required_shared_ptr<uint32_t> m_mainram; required_device<ata_interface_device> m_ata; - required_ioport m_in0; // driver_device overrides virtual void video_start() override; @@ -161,6 +169,9 @@ private: int m_dmarq_state; uint32_t m_dma_ptr; uint32_t m_spi_select; + uint32_t m_unk_sound_toggle; + uint32_t m_sound_cmd; + uint32_t m_fb_base; }; void vp10x_state::machine_reset() @@ -171,12 +182,19 @@ void vp10x_state::machine_reset() void vp10x_state::machine_start() { - m_maincpu->mips3drc_set_options(MIPS3DRC_FASTEST_OPTIONS); + m_maincpu->mips3drc_set_options(MIPS3DRC_FASTEST_OPTIONS | MIPS3DRC_DISABLE_INTRABLOCK); // m_maincpu->add_fastram(0x00000000, 0x03ffffff, false, m_mainram); } +uint32_t vp10x_state::test_r() +{ + LOG("%s: test_r\n", machine().describe_context()); + return 0xffffffff; +} + void vp10x_state::dmaaddr_w(uint32_t data) { + LOG("%s: dmaaddr_w: %08x\n", machine().describe_context(), data); m_dma_ptr = (data & 0x07ffffff); } @@ -228,7 +246,7 @@ uint32_t vp10x_state::pic_r() void vp10x_state::pic_w(uint32_t data) { - //printf("%02x to pic_cmd\n", data&0xff); + LOG("%s: pic_w: %08x\n", machine().describe_context(), data); if ((data & 0xff) == 0) { return; @@ -239,12 +257,13 @@ void vp10x_state::pic_w(uint32_t data) uint32_t vp10x_state::spi_r() { + LOG("%s: spi_r\n", machine().describe_context()); return 0xffffffff; } void vp10x_state::spi_w(uint32_t data) { -// printf("%d to SPI select\n", data); + LOG("%s: spi_w: %08x\n", machine().describe_context(), data); m_spi_select = data; } @@ -257,7 +276,7 @@ uint32_t vp10x_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, for (int y = 0; y < 240; y++) { uint32_t *line = &bitmap.pix32(y); - const uint32_t *video_ram = (const uint32_t *) &m_mainram[(0x7400000/4) + (y * (0x1000/4)) + 4]; + const uint32_t *video_ram = (const uint32_t *) &m_mainram[(m_fb_base/4) + (y * (0x1000/4)) + 4]; for (int x = 0; x < 320; x++) { @@ -266,6 +285,17 @@ uint32_t vp10x_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, *line++ = word; } } + + if (machine().input().code_pressed_once(KEYCODE_R)) + m_maincpu->set_input_line(MIPS3_IRQ0, ASSERT_LINE); + if (machine().input().code_pressed_once(KEYCODE_T)) + m_maincpu->set_input_line(MIPS3_IRQ1, ASSERT_LINE); + if (machine().input().code_pressed_once(KEYCODE_Y)) + m_maincpu->set_input_line(MIPS3_IRQ2, ASSERT_LINE); + if (machine().input().code_pressed_once(KEYCODE_U)) + m_maincpu->set_input_line(MIPS3_IRQ3, ASSERT_LINE); + if (machine().input().code_pressed_once(KEYCODE_I)) + m_maincpu->set_input_line(MIPS3_IRQ4, ASSERT_LINE); return 0; } @@ -294,6 +324,7 @@ uint32_t vp10x_state::vp50_screen_update(screen_device &screen, bitmap_rgb32 &bi uint32_t vp10x_state::tty_ready_r() { + LOG("%s: tty_ready_r\n", machine().describe_context()); return 0x60; // must return &0x20 for output at tty_w to continue } @@ -301,23 +332,124 @@ void vp10x_state::tty_w(uint32_t data) // set breakpoint at bfc01430 to catch w { // uncomment to see startup messages - it says "RAM OK" and "EPI RSS Ver 4.5.1" followed by "<RSS active>" and then lots of dots // Special Forces also says "<inited tv_cap> = 00000032" -// printf("%c", data); + if (data >= 0x20 || data == 0x09) + printf("%c", data); + else if (data == 0x0d) + printf("\n"); +} + +uint32_t vp10x_state::video_r(offs_t offset) +{ + uint32_t data = 0; + if (offset == (0x10 >> 2)) + { + data = 0xffffffff; + } + LOG("%s: video_r %08x: %08x\n", machine().describe_context(), 0x1a000000 + (offset << 2), data); + return data; +} + +void vp10x_state::video_w(offs_t offset, uint32_t data) +{ + LOG("%s: video_w %08x = %08x\n", machine().describe_context(), 0x1a000000 + (offset << 2), data); +} + +uint32_t vp10x_state::video2_r(offs_t offset) +{ + uint32_t data = machine().rand(); + //LOG("%s: video2_r %08x: %08x\n", machine().describe_context(), 0x1a800000 + (offset << 2), data); + return data; +} + +void vp10x_state::video2_w(offs_t offset, uint32_t data) +{ + //LOG("%s: video2_w %08x = %08x\n", machine().describe_context(), 0x1a800000 + (offset << 2), data); +} + +void vp10x_state::fb_base_w(uint32_t data) +{ + m_fb_base = data & 0x07ffffff; +} + +uint32_t vp10x_state::sound_r(offs_t offset) +{ + switch (offset) + { + case 0: + LOG("%s: sound_r: hardware flags(?): 11000000 = %08x\n", machine().describe_context(), 1 << 4); + return (1 << 4); // Flag that sound hardware is initialized + case 3: + { + uint32_t cmd_return = 0; + bool known = true; + switch (m_sound_cmd) + { + case 0xa6: + cmd_return = 0x0000000e; + break; + case 0xfc: + cmd_return = 0x00004352; // Some sort of info request? Looks like ASCII, 'CR' - codec is from Crystal Semi? + break; + default: + known = false; + break; + } + if (known) + { + LOG("%s: sound_r: sound command return value(?): 11000004 = %08x for cmd %02x\n", machine().describe_context(), cmd_return, m_sound_cmd); + } + else + { + LOG("%s: sound_r: sound command return value(?): 11000004 = %08x for unknown cmd %02x\n", machine().describe_context(), cmd_return, m_sound_cmd); + } + return cmd_return; + } + case 4: + m_unk_sound_toggle ^= 1; + LOG("%s: sound_r: unknown: 11000010 = %08x\n", machine().describe_context(), m_unk_sound_toggle); + return m_unk_sound_toggle; // Unknown + default: + LOG("%s: sound_r: %08x\n", machine().describe_context(), 0x11000000 | (offset << 2)); + return 0; + } +} + +void vp10x_state::sound_w(offs_t offset, uint32_t data) +{ + switch (offset) + { + case 1: + LOG("%s: sound_w: command(?): 11000004 = %08x\n", machine().describe_context(), data); + m_sound_cmd = data; + return; + default: + LOG("%s: sound_w: %08x = %08x\n", machine().describe_context(), 0x11000000 | (offset << 2), data); + return; + } } void vp10x_state::main_map(address_map &map) { map(0x00000000, 0x07ffffff).ram().share("mainram"); + map(0x11000000, 0x11000013).rw(FUNC(vp10x_state::sound_r), FUNC(vp10x_state::sound_w)); map(0x14000000, 0x14000003).r(FUNC(vp10x_state::test_r)); + map(0x18000010, 0x18000013).w(FUNC(vp10x_state::fb_base_w)); + map(0x1a000000, 0x1a000013).rw(FUNC(vp10x_state::video_r), FUNC(vp10x_state::video_w)); + map(0x1a800000, 0x1a800003).rw(FUNC(vp10x_state::video2_r), FUNC(vp10x_state::video2_w)); map(0x1c000000, 0x1c000003).w(FUNC(vp10x_state::tty_w)); // RSS OS code uses this one map(0x1c000014, 0x1c000017).r(FUNC(vp10x_state::tty_ready_r)); map(0x1c400000, 0x1c400003).w(FUNC(vp10x_state::tty_w)); // boot ROM code uses this one map(0x1c400014, 0x1c400017).r(FUNC(vp10x_state::tty_ready_r)); - map(0x1ca0000c, 0x1ca0000f).portr("IN0"); - map(0x1ca00010, 0x1ca00013).r(FUNC(vp10x_state::test_r)); // bits here cause various test mode stuff + map(0x1ca00000, 0x1ca00003).portr("GUNX"); + map(0x1ca00004, 0x1ca00007).portr("GUNY"); + map(0x1ca00008, 0x1ca0000b).portr("GUNBUTTONS"); + map(0x1ca0000c, 0x1ca0000f).portr("BUTTONS"); + map(0x1ca00010, 0x1ca00013).portr("DIPS"); map(0x1cf00000, 0x1cf00003).noprw().nopr(); map(0x1d000030, 0x1d000033).w(FUNC(vp10x_state::dmaaddr_w)); // ATA DMA destination address map(0x1d000040, 0x1d00005f).rw(m_ata, FUNC(ata_interface_device::cs0_r), FUNC(ata_interface_device::cs0_w)).umask32(0x0000ffff); map(0x1d000060, 0x1d00007f).rw(m_ata, FUNC(ata_interface_device::cs1_r), FUNC(ata_interface_device::cs1_w)).umask32(0x0000ffff); + map(0x1f200000, 0x1f200003).rw(FUNC(vp10x_state::pic_r), FUNC(vp10x_state::pic_w)); map(0x1f807000, 0x1f807fff).ram().share("nvram"); map(0x1fc00000, 0x1fffffff).rom().region("maincpu", 0); @@ -340,14 +472,70 @@ void vp10x_state::vp50_map(address_map &map) map(0xff1ff818, 0xff1ff81b).rw(FUNC(vp10x_state::spi_r), FUNC(vp10x_state::spi_w)); } -static INPUT_PORTS_START( vp101 ) - PORT_START("IN0") +static INPUT_PORTS_START( jnero ) + PORT_START("GUNX") + PORT_BIT( 0x1ff, 0x000, IPT_LIGHTGUN_X ) PORT_MINMAX(0x000, 0x1ff) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) + + PORT_START("GUNY") + PORT_BIT( 0xff, 0x00, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x00, 0xff) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) + + PORT_START("GUNBUTTONS") + PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Trigger") + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Sense") + PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Pump") + PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Trigger") + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Sense") + PORT_BIT( 0x00000040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Pump") + PORT_BIT( 0xffffff88, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("BUTTONS") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT (0x00000040, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT (0x00000080, IP_ACTIVE_LOW, IPT_SERVICE2 ) + PORT_BIT (0x00001000, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) + PORT_BIT (0x00002000, IP_ACTIVE_LOW, IPT_VOLUME_UP ) + PORT_BIT( 0xffffcf30, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("DIPS") + PORT_DIPNAME( 0x00000010, 0x00000010, DEF_STR( Test ) ) + PORT_DIPSETTING( 0x00000010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_BIT( 0xffffefaf, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x00001040, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END - PORT_BIT( 0xfffffff0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) +static INPUT_PORTS_START( specfrce ) + PORT_START("GUNX") + PORT_BIT( 0x1ff, 0x000, IPT_LIGHTGUN_X ) PORT_MINMAX(0x000, 0x1ff) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) + + PORT_START("GUNY") + PORT_BIT( 0xff, 0x00, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x00, 0xff) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) + + PORT_START("GUNBUTTONS") + PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Trigger") + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Sense") + PORT_BIT( 0x00000004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pump") + PORT_BIT( 0xfffffff8, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("BUTTONS") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT (0x00000040, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT (0x00000080, IP_ACTIVE_LOW, IPT_SERVICE2 ) + PORT_BIT (0x00001000, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) + PORT_BIT (0x00002000, IP_ACTIVE_LOW, IPT_VOLUME_UP ) + PORT_BIT( 0xffffcf38, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("DIPS") + PORT_DIPNAME( 0x00000010, 0x00000010, DEF_STR( Test ) ) + PORT_DIPSETTING( 0x00000010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_BIT( 0xffffefaf, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x00001040, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END static INPUT_PORTS_START( vp50 ) @@ -356,8 +544,10 @@ static INPUT_PORTS_START( vp50 ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0xfffffff0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START("IN1") + PORT_BIT( 0xffffffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) INPUT_PORTS_END void vp10x_state::vp101(machine_config &config) @@ -465,8 +655,8 @@ ROM_START(rhnation) DISK_IMAGE_READONLY("rhn010104", 0, SHA1(5bc2e5817b29bf42ec483414242795fd76d749d9) ) ROM_END -GAME( 2002, specfrce, 0, vp101, vp101, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Special Forces Elite Training (v01.02.00)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 2002, specfrceo, specfrce, vp101, vp101, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Special Forces Elite Training (v01.01.01)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 2003, rhnation, 0, vp50, vp50, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Rhythm Nation (v01.00.04, boot v3.1.5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) -GAME( 2004, jnero, 0, vp101, vp101, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Johnny Nero Action Hero (v01.01.08)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -GAME( 2006, zoofari, 0, vp50, vp50, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Zoofari", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +GAME( 2002, specfrce, 0, vp101, specfrce, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Special Forces Elite Training (v01.02.00)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +GAME( 2002, specfrceo, specfrce, vp101, specfrce, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Special Forces Elite Training (v01.01.01)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +GAME( 2003, rhnation, 0, vp50, vp50, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Rhythm Nation (v01.00.04, boot v3.1.5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +GAME( 2004, jnero, 0, vp101, jnero, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Johnny Nero Action Hero (v01.01.08)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) +GAME( 2006, zoofari, 0, vp50, vp50, vp10x_state, empty_init, ROT0, "ICE/Play Mechanix", "Zoofari", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) |