-vp101: Fleshed out inputs, fixed sound POST hanging, found framebuffer base address register. [Ryan Holtz]

This commit is contained in:
Ryan Holtz 2020-08-20 04:21:56 +02:00
parent 0b625de8c1
commit 92925532c3

View File

@ -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_BIT( 0xfffffff0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
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( 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)