summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/vp101.cpp232
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)