summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2020-01-11 16:48:23 +0000
committer ajrhacker <ajrhacker@users.noreply.github.com>2020-01-11 11:48:23 -0500
commite9d61d68cda9bd9e253762b23185cb2694d92403 (patch)
treeaeaeead1116be656d7afdd5fed9be35a9e13df42
parent0c783d89f126310fea85913384453ea52d9460c1 (diff)
new NOT WORKING (plug and play systems) (#6156)
* new NOT WORKING ---- 4 Player System - 10 in 1 [Sean Riddle, David Haywood] boots, several of the games are fully playable without sound, several have significant issues, helps provide evidence tho. * new NOT WORKING ---- Excite Bowling (Japan) [Sean Riddle, Peter Wilhelmsen] * a few sunplus bits (nw) * get y-flip out of the way (nw) * sunplus stuff (nw) * new NOT WORKING --- Exciting Stadium DX (Japan) [Sean Ruddle, Peter Wilhelmsen, ShouTime] * note updates (nw) * exciting -> excite (nw) * sunplus (nw) * sunplus improved logging (nw) * (nw) * notes based on other sunplus types (nw) * notes (nw) * (nw) * naming imrpovements (nw) * naming improvments (nw)
-rw-r--r--src/devices/cpu/unsp/unsp_fxxx.cpp50
-rw-r--r--src/devices/machine/spg2xx_video.cpp4
-rw-r--r--src/devices/machine/sunplus_gcm394.cpp299
-rw-r--r--src/devices/machine/sunplus_gcm394.h70
-rw-r--r--src/devices/machine/sunplus_gcm394_video.cpp105
-rw-r--r--src/devices/machine/sunplus_gcm394_video.h28
-rw-r--r--src/mame/drivers/sunplus_gcm394.cpp88
-rw-r--r--src/mame/drivers/trkfldch.cpp128
-rw-r--r--src/mame/drivers/xavix.cpp63
-rw-r--r--src/mame/mame.lst3
10 files changed, 614 insertions, 224 deletions
diff --git a/src/devices/cpu/unsp/unsp_fxxx.cpp b/src/devices/cpu/unsp/unsp_fxxx.cpp
index 8a62d05476b..eed523c5568 100644
--- a/src/devices/cpu/unsp/unsp_fxxx.cpp
+++ b/src/devices/cpu/unsp/unsp_fxxx.cpp
@@ -102,13 +102,55 @@ inline void unsp_device::execute_fxxx_001_group(uint16_t op)
if (d)
{
- logerror("%s ds:[%04x],%d\n", bitops[bitop], imm16, offset);
- unimplemented_opcode(op);
+ switch (bitop)
+ {
+ case 0x0: // tstb
+ logerror("tstb ds:[%04x],%d\n", imm16, offset);
+ unimplemented_opcode(op);
+ break;
+
+ case 0x1: // setb
+ logerror("setb ds:[%04x],%d\n", imm16, offset);
+ unimplemented_opcode(op);
+ break;
+
+ case 0x2: // clrb
+ logerror("clrb ds:[%04x],%d\n", imm16, offset);
+ unimplemented_opcode(op);
+ break;
+
+ case 0x3: // invb
+ logerror("invb ds:[%04x],%d\n", imm16, offset);
+ unimplemented_opcode(op);
+ break;
+ }
}
else
{
- logerror("%s [%04x],%d\n", bitops[bitop], imm16, offset);
- unimplemented_opcode(op);
+ switch (bitop)
+ {
+ case 0x0: // tstb
+ logerror("tstb [%04x],%d\n", imm16, offset);
+ unimplemented_opcode(op);
+ break;
+
+ case 0x1: // setb (bkrankp uses this)
+ {
+ uint16_t temp = read16(imm16);
+ temp |= (1 << offset);
+ write16(imm16, temp);
+ break;
+ }
+ case 0x2: // clrb
+ logerror("clrb [%04x],%d\n", imm16, offset);
+ unimplemented_opcode(op);
+ break;
+
+ case 0x3: // invb
+ logerror("invb [%04x],%d\n", imm16, offset);
+ unimplemented_opcode(op);
+ break;
+ }
}
return;
diff --git a/src/devices/machine/spg2xx_video.cpp b/src/devices/machine/spg2xx_video.cpp
index 72dde8f2c1c..614a87cd49c 100644
--- a/src/devices/machine/spg2xx_video.cpp
+++ b/src/devices/machine/spg2xx_video.cpp
@@ -234,6 +234,8 @@ void spg2xx_video_device::draw_bitmap(const rectangle& cliprect, uint32_t scanli
palette = space.read_word(palette_map + realline / 2);
if (scanline & 1)
palette >>= 8;
+ else
+ palette &= 0x00ff;
//const int linewidth = 320 / 2;
int sourcebase = tile | (palette << 16); // this is correct for Texas Hold'em - TODO: get from a register?
@@ -318,6 +320,8 @@ void spg2xx_video_device::draw_page(const rectangle &cliprect, uint32_t scanline
palette = (ctrl & PAGE_WALLPAPER_MASK) ? space.read_word(palette_map) : space.read_word(palette_map + tile_address / 2);
if (x0 & 1)
palette >>= 8;
+ else
+ palette &= 0x00ff;
uint32_t tileattr = attr;
uint32_t tilectrl = ctrl;
diff --git a/src/devices/machine/sunplus_gcm394.cpp b/src/devices/machine/sunplus_gcm394.cpp
index 05e74a259a4..501147b5eba 100644
--- a/src/devices/machine/sunplus_gcm394.cpp
+++ b/src/devices/machine/sunplus_gcm394.cpp
@@ -85,6 +85,17 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::system_dma_params_channel1_w)
write_dma_params(1, offset, data);
}
+READ16_MEMBER(sunplus_gcm394_base_device::system_dma_params_channel2_r)
+{
+ return read_dma_params(2, offset);
+}
+
+WRITE16_MEMBER(sunplus_gcm394_base_device::system_dma_params_channel2_w)
+{
+ write_dma_params(2, offset, data);
+}
+
+
READ16_MEMBER(sunplus_gcm394_base_device::system_dma_status_r)
@@ -174,8 +185,15 @@ void sunplus_gcm394_base_device::trigger_systemm_dma(address_space &space, int c
WRITE16_MEMBER(sunplus_gcm394_base_device::system_dma_trigger_w)
{
- if (data & 0x01) trigger_systemm_dma(space, 0, data);
- if (data & 0x02) trigger_systemm_dma(space, 1, data);
+ // trigger is value based, not bit based, how many channels are there?
+
+ if (data == 1) trigger_systemm_dma(space, 0, data);
+ else if (data == 2) trigger_systemm_dma(space, 1, data);
+ else if (data == 3) trigger_systemm_dma(space, 2, data);
+ else
+ {
+ fatalerror("unknown DMA trigger type\n");
+ }
}
READ16_MEMBER(sunplus_gcm394_base_device::system_dma_memtype_r)
@@ -186,10 +204,40 @@ READ16_MEMBER(sunplus_gcm394_base_device::system_dma_memtype_r)
WRITE16_MEMBER(sunplus_gcm394_base_device::system_dma_memtype_w)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::system_dma_memtype_w %04x\n", machine().describe_context(), data);
+ static char const* const types[16] =
+ {
+ "Unused / USB",
+ "DAC CHA",
+ "UART TX",
+ "UART RX",
+ "SD/MMC",
+ "NAND Flash",
+ "Serial Interface",
+ "DAC CHB",
+ "ADC Audo Sample Full",
+ "SPI TX",
+ "SPI RX",
+ "RESERVED (c)",
+ "RESERVED (d)",
+ "RESERVED (e)",
+ "RESERVED (f)"
+ };
+
m_system_dma_memtype = data;
+
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::system_dma_memtype_w %04x (CH3: %s | CH2: %s | CH1: %s | CH0: %s )\n", machine().describe_context(), data,
+ types[((m_system_dma_memtype>>12)&0xf)],
+ types[((m_system_dma_memtype>>8)&0xf)],
+ types[((m_system_dma_memtype>>4)&0xf)],
+ types[((m_system_dma_memtype)&0xf)]);
+
}
+READ16_MEMBER(sunplus_gcm394_base_device::system_7a3a_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::system_7a3a_r\n", machine().describe_context());
+ return machine().rand();
+}
// **************************************** 78xx region with some handling *************************************************
@@ -212,9 +260,6 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7819_w) { LOGMASKED(LOG_GCM39
// **************************************** 78xx region stubs *************************************************
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7868_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7868_r\n", machine().describe_context()); return machine().rand(); }
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7869_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7869_r\n", machine().describe_context()); return machine().rand(); }
-
READ16_MEMBER(sunplus_gcm394_base_device::unkarea_782d_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_782d_r\n", machine().describe_context()); return m_782d; }
WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_782d_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_782d_w %04x\n", machine().describe_context(), data); m_782d = data; }
@@ -288,6 +333,8 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7835_w) { LOGMASKED(LOG_GCM39
// IO here?
+// Port A
+
READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7860_porta_r)
{
LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7860_porta_r\n", machine().describe_context());
@@ -300,59 +347,123 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7860_porta_w)
m_porta_out(data);
}
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7861_r)
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7861_porta_buffer_r)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7861_r\n", machine().describe_context());
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7861_porta_buffer_r\n", machine().describe_context());
return 0x0000;// 0xffff;// m_7861;
}
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7862_r)
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7862_porta_direction_r)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7862_r\n", machine().describe_context());
- return 0x0000;// m_7862;
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7862_porta_direction_r\n", machine().describe_context());
+ return m_7862_porta_direction;
}
-WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7862_w)
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7862_porta_direction_w)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7862_w %04x\n", machine().describe_context(), data);
- m_7862 = data;
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7862_porta_direction_w %04x\n", machine().describe_context(), data);
+ m_7862_porta_direction = data;
}
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7863_r)
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7863_porta_attribute_r)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7863_r\n", machine().describe_context());
- return 0x0000; //0xffff;// m_7863;
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7863_porta_attribute_r\n", machine().describe_context());
+ return m_7863_porta_attribute;
}
-WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7863_w)
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7863_porta_attribute_w)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7863_w %04x\n", machine().describe_context(), data);
- m_7863 = data;
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7863_porta_attribute_w %04x\n", machine().describe_context(), data);
+ m_7863_porta_attribute = data;
}
-// similar read/write pattern to above, 2nd group?
+// Port B
-READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7870_portb_r)
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7868_portb_r)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7870_portb_r\n", machine().describe_context());
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7868_portb_r\n", machine().describe_context());
return m_portb_in();
}
-WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7870_portb_w)
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7869_portb_buffer_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7869_portb_buffer_r\n", machine().describe_context());
+ return machine().rand();
+}
+
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7868_portb_w)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7868_portb_w %04x\n", machine().describe_context(), data);
+ //m_portb_out(data);
+}
+
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_786a_portb_direction_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_786a_portb_direction_r\n", machine().describe_context());
+ return m_786a_portb_direction;
+}
+
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_786a_portb_direction_w)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_786a_portb_direction_w %04x\n", machine().describe_context(), data);
+ m_786a_portb_direction = data;
+}
+
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_786b_portb_attribute_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_786b_portb_attribute_r\n", machine().describe_context());
+ return m_786b_portb_attribute;
+}
+
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_786b_portb_attribute_w)
{
- LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7870_portb_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_786b_portb_attribute_w %04x\n", machine().describe_context(), data);
+ m_786b_portb_attribute = data;
+}
+
+// Port C
+
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7870_portc_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7870_portc_r\n", machine().describe_context());
+ return m_portc_in();
+}
+
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7870_portc_w)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7870_portc_w %04x\n", machine().describe_context(), data);
m_7870 = data;
}
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7871_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7871_r\n", machine().describe_context()); return 0xffff;// m_7871;
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7871_portc_buffer_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7871_portc_buffer_r\n", machine().describe_context());
+ return 0xffff;// m_7871;
}
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7872_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7872_r\n", machine().describe_context()); return 0xffff;// m_7872;
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7872_portc_direction_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7872_portc_direction_r\n", machine().describe_context());
+ return m_7872_portc_direction;
}
-WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7872_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7872_w %04x\n", machine().describe_context(), data); m_7872 = data; }
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7873_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7873_r\n", machine().describe_context()); return 0xffff;// m_7873;
+
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7872_portc_direction_w)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7872_portc_direction_w %04x\n", machine().describe_context(), data);
+ m_7872_portc_direction = data;
+}
+
+READ16_MEMBER(sunplus_gcm394_base_device::ioarea_7873_portc_attribute_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7873_portc_attribute_r\n", machine().describe_context());
+ return m_7873_portc_attribute;
+}
+
+WRITE16_MEMBER(sunplus_gcm394_base_device::ioarea_7873_portc_attribute_w)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::ioarea_7873_portc_attribute_w %04x\n", machine().describe_context(), data);
+ m_7873_portc_attribute = data;
}
-WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7873_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7873_w %04x\n", machine().describe_context(), data); m_7873 = data; }
@@ -368,7 +479,7 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_78a0_w) { LOGMASKED(LOG_GCM39
READ16_MEMBER(sunplus_gcm394_base_device::unkarea_78a0_r)
{
LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_78a0_r\n", machine().describe_context());
- return machine().rand();
+ return 0x0000;// machine().rand();
}
READ16_MEMBER(sunplus_gcm394_base_device::unkarea_78a1_r)
@@ -398,7 +509,11 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_78b2_w) { LOGMASKED(LOG_GCM39
WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_78b8_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_78b8_w %04x\n", machine().describe_context(), data); m_78b8 = data; }
WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_78f0_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_78f0_w %04x\n", machine().describe_context(), data); m_78f0 = data; }
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_78d0_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_78d0_r\n", machine().describe_context()); return machine().rand(); }
+READ16_MEMBER(sunplus_gcm394_base_device::unkarea_78d0_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_78d0_r\n", machine().describe_context());
+ return machine().rand();
+}
// **************************************** 79xx region stubs *************************************************
@@ -415,8 +530,18 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7935_w)
//checkirq6();
}
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7944_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7944_r\n", machine().describe_context()); return machine().rand(); }
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7945_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7945_r\n", machine().describe_context()); return machine().rand(); }
+// these are related to the accelerometer values on jak_g500 (8-bit signed) and also the SPI reads for bkrankp
+READ16_MEMBER(sunplus_gcm394_base_device::spi_7944_rxdata_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::spi_7944_rxdata_r\n", machine().describe_context());
+ return machine().rand();
+}
+
+READ16_MEMBER(sunplus_gcm394_base_device::spi_7945_misc_control_reg_r)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::spi_7945_misc_control_reg_r\n", machine().describe_context());
+ return machine().rand();// &0x0007;
+}
READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7936_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7936_r\n", machine().describe_context()); return 0x0000; }
@@ -470,21 +595,23 @@ void sunplus_gcm394_base_device::base_internal_map(address_map &map)
map(0x007010, 0x007015).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap0_regs_r), FUNC(gcm394_base_video_device::tmap0_regs_w));
map(0x007016, 0x00701b).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap1_regs_r), FUNC(gcm394_base_video_device::tmap1_regs_w));
+ map(0x00701c, 0x00701c).w(m_spg_video, FUNC(gcm394_base_video_device::video_701c_w));
+
// tilebase LSBs
- map(0x007020, 0x007020).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap0_tilebase_lsb_r), FUNC(gcm394_base_video_device::tmap0_tilebase_lsb_w)); // tilebase, written with other tmap0 regs
- map(0x007021, 0x007021).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap1_tilebase_lsb_r), FUNC(gcm394_base_video_device::tmap1_tilebase_lsb_w)); // tilebase, written with other tmap1 regs
+ map(0x007020, 0x007020).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap0_tilebase_lsb_r), FUNC(gcm394_base_video_device::tmap0_tilebase_lsb_w)); // tilebase, written with other tmap0 regs
+ map(0x007021, 0x007021).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap1_tilebase_lsb_r), FUNC(gcm394_base_video_device::tmap1_tilebase_lsb_w)); // tilebase, written with other tmap1 regs
map(0x007022, 0x007022).rw(m_spg_video, FUNC(gcm394_base_video_device::sprite_7022_gfxbase_lsb_r), FUNC(gcm394_base_video_device::sprite_7022_gfxbase_lsb_w)); // sprite tilebase written as 7022, 702d and 7042 group
- map(0x007023, 0x007023).rw(m_spg_video, FUNC(gcm394_base_video_device::unk_vid1_gfxbase_lsb_r), FUNC(gcm394_base_video_device::unk_vid1_gfxbase_lsb_w)); // written with other unknown_video_device1 regs (roz layer or line layer?)
- map(0x007024, 0x007024).rw(m_spg_video, FUNC(gcm394_base_video_device::unk_vid2_gfxbase_lsb_r), FUNC(gcm394_base_video_device::unk_vid2_gfxbase_lsb_w)); // written with other unknown_video_device2 regs (roz layer or line layer?)
+ map(0x007023, 0x007023).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap2_tilebase_lsb_r), FUNC(gcm394_base_video_device::tmap2_tilebase_lsb_w)); // written with other tmap2 regs (roz layer or line layer?)
+ map(0x007024, 0x007024).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap3_tilebase_lsb_r), FUNC(gcm394_base_video_device::tmap3_tilebase_lsb_w)); // written with other tmap3 regs (roz layer or line layer?)
map(0x00702a, 0x00702a).w(m_spg_video, FUNC(gcm394_base_video_device::video_702a_w)); // blend level control
// tilebase MSBs
- map(0x00702b, 0x00702b).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap0_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap0_tilebase_msb_w)); // written with other tmap0 regs
- map(0x00702c, 0x00702c).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap1_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap1_tilebase_msb_w)); // written with other tmap1 regs
+ map(0x00702b, 0x00702b).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap0_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap0_tilebase_msb_w)); // written with other tmap0 regs
+ map(0x00702c, 0x00702c).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap1_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap1_tilebase_msb_w)); // written with other tmap1 regs
map(0x00702d, 0x00702d).rw(m_spg_video, FUNC(gcm394_base_video_device::sprite_702d_gfxbase_msb_r), FUNC(gcm394_base_video_device::sprite_702d_gfxbase_msb_w)); // sprites, written as 7022, 702d and 7042 group
- map(0x00702e, 0x00702e).rw(m_spg_video, FUNC(gcm394_base_video_device::unk_vid1_gfxbase_msb_r), FUNC(gcm394_base_video_device::unk_vid1_gfxbase_msb_w)); // written with other unknown_video_device1 regs (roz layer or line layer?)
- map(0x00702f, 0x00702f).rw(m_spg_video, FUNC(gcm394_base_video_device::unk_vid2_gfxbase_msb_r), FUNC(gcm394_base_video_device::unk_vid2_gfxbase_msb_w)); // written with other unknown_video_device2 regs (roz layer or line layer?)
+ map(0x00702e, 0x00702e).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap2_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap2_tilebase_msb_w)); // written with other tmap2 regs (roz layer or line layer?)
+ map(0x00702f, 0x00702f).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap3_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap3_tilebase_msb_w)); // written with other tmap3 regs (roz layer or line layer?)
map(0x007030, 0x007030).rw(m_spg_video, FUNC(gcm394_base_video_device::video_7030_brightness_r), FUNC(gcm394_base_video_device::video_7030_brightness_w));
map(0x007038, 0x007038).r(m_spg_video, FUNC(gcm394_base_video_device::video_curline_r));
@@ -504,7 +631,7 @@ void sunplus_gcm394_base_device::base_internal_map(address_map &map)
map(0x007072, 0x007072).rw(m_spg_video, FUNC(gcm394_base_video_device::video_dma_size_busy_r), FUNC(gcm394_base_video_device::video_dma_size_trigger_w)); //
// these don't exist on older SPG
- map(0x00707c, 0x00707c).r(m_spg_video, FUNC(gcm394_base_video_device::video_707c_r)); // wrlshunt polls this waiting for 0x8000, is this some kind of manual port based data upload?
+ map(0x00707c, 0x00707c).r(m_spg_video, FUNC(gcm394_base_video_device::video_707c_r)); // wrlshunt polls this waiting for 0x8000, is this some kind of manual port-based data upload?
map(0x00707e, 0x00707e).w(m_spg_video, FUNC(gcm394_base_video_device::video_dma_unk_w)); // written around same time as DMA, seems to select alt sprite bank
map(0x00707f, 0x00707f).rw(m_spg_video, FUNC(gcm394_base_video_device::video_707f_r), FUNC(gcm394_base_video_device::video_707f_w));
@@ -524,8 +651,8 @@ void sunplus_gcm394_base_device::base_internal_map(address_map &map)
// 73xx-77xx = video ram
// ######################################################################################################################################################################################
- map(0x007100, 0x0071ff).ram().share("unkram1"); // maybe a line table? (assuming DMA isn't writing to wrong place)
- map(0x007200, 0x0072ff).ram().share("unkram2"); // ^^
+ map(0x007100, 0x0071ff).ram().share("rowscroll"); // based on jak_s500
+ map(0x007200, 0x0072ff).ram().share("rowzoom"); // ^^
map(0x007300, 0x0073ff).rw(m_spg_video, FUNC(gcm394_base_video_device::palette_r), FUNC(gcm394_base_video_device::palette_w));
@@ -581,40 +708,36 @@ void sunplus_gcm394_base_device::base_internal_map(address_map &map)
// ######################################################################################################################################################################################
map(0x007860, 0x007860).rw(FUNC(sunplus_gcm394_base_device::ioarea_7860_porta_r), FUNC(sunplus_gcm394_base_device::ioarea_7860_porta_w)); // 7860 I/O PortA Data Register
- map(0x007861, 0x007861).r(FUNC(sunplus_gcm394_base_device::unkarea_7861_r)); // 7861 I/O PortA Buffer Register
- map(0x007862, 0x007862).rw(FUNC(sunplus_gcm394_base_device::unkarea_7862_r), FUNC(sunplus_gcm394_base_device::unkarea_7862_w)); // 7862 I/O PortA Direction Register
- map(0x007863, 0x007863).rw(FUNC(sunplus_gcm394_base_device::unkarea_7863_r), FUNC(sunplus_gcm394_base_device::unkarea_7863_w)); // 7863 I/O PortA Attribute Register
-
- map(0x007868, 0x007868).r(FUNC(sunplus_gcm394_base_device::unkarea_7868_r)); // on startup // 7868 I/O PortB Data Register
- map(0x007869, 0x007869).r(FUNC(sunplus_gcm394_base_device::unkarea_7869_r)); // 7869 I/O PortB Buffer Register // jak_s500
- // 786a I/O PortB Direction Register
- // 786b I/O PortB Attribute Register
- // 786a I/O PortB Direction Register
+ map(0x007861, 0x007861).r(FUNC(sunplus_gcm394_base_device::ioarea_7861_porta_buffer_r)); // 7861 I/O PortA Buffer Register
+ map(0x007862, 0x007862).rw(FUNC(sunplus_gcm394_base_device::ioarea_7862_porta_direction_r), FUNC(sunplus_gcm394_base_device::ioarea_7862_porta_direction_w)); // 7862 I/O PortA Direction Register
+ map(0x007863, 0x007863).rw(FUNC(sunplus_gcm394_base_device::ioarea_7863_porta_attribute_r), FUNC(sunplus_gcm394_base_device::ioarea_7863_porta_attribute_w)); // 7863 I/O PortA Attribute Register
+
+ map(0x007868, 0x007868).rw(FUNC(sunplus_gcm394_base_device::ioarea_7868_portb_r), FUNC(sunplus_gcm394_base_device::ioarea_7868_portb_w)); // on startup // 7868 I/O PortB Data Register
+ map(0x007869, 0x007869).r(FUNC(sunplus_gcm394_base_device::ioarea_7869_portb_buffer_r)); // 7869 I/O PortB Buffer Register // jak_s500
+ map(0x00786a, 0x00786a).rw(FUNC(sunplus_gcm394_base_device::ioarea_786a_portb_direction_r), FUNC(sunplus_gcm394_base_device::ioarea_786a_portb_direction_w)); // 786a I/O PortB Direction Register
+ map(0x00786b, 0x00786b).rw(FUNC(sunplus_gcm394_base_device::ioarea_786b_portb_attribute_r), FUNC(sunplus_gcm394_base_device::ioarea_786b_portb_attribute_w)); // 786b I/O PortB Attribute Register
// 786c I/O PortB Latch / Wakeup
- map(0x007870, 0x007870).rw(FUNC(sunplus_gcm394_base_device::ioarea_7870_portb_r) ,FUNC(sunplus_gcm394_base_device::ioarea_7870_portb_w)); // 7870 I/O PortC Data Register
- map(0x007871, 0x007871).r(FUNC(sunplus_gcm394_base_device::unkarea_7871_r)); // 7871 I/O PortC Buffer Register
- map(0x007872, 0x007872).rw(FUNC(sunplus_gcm394_base_device::unkarea_7872_r), FUNC(sunplus_gcm394_base_device::unkarea_7872_w)); // 7872 I/O PortC Direction Register
- map(0x007873, 0x007873).rw(FUNC(sunplus_gcm394_base_device::unkarea_7873_r), FUNC(sunplus_gcm394_base_device::unkarea_7873_w)); // 7873 I/O PortC Attribute Register
- // 7874 (data 0x1249)
- // 787c (data 0x1249)
- // 787e (data 0x1249)
+ map(0x007870, 0x007870).rw(FUNC(sunplus_gcm394_base_device::ioarea_7870_portc_r) ,FUNC(sunplus_gcm394_base_device::ioarea_7870_portc_w)); // 7870 I/O PortC Data Register
+ map(0x007871, 0x007871).r(FUNC(sunplus_gcm394_base_device::ioarea_7871_portc_buffer_r)); // 7871 I/O PortC Buffer Register
+ map(0x007872, 0x007872).rw(FUNC(sunplus_gcm394_base_device::ioarea_7872_portc_direction_r), FUNC(sunplus_gcm394_base_device::ioarea_7872_portc_direction_w)); // 7872 I/O PortC Direction Register
+ map(0x007873, 0x007873).rw(FUNC(sunplus_gcm394_base_device::ioarea_7873_portc_attribute_r), FUNC(sunplus_gcm394_base_device::ioarea_7873_portc_attribute_w)); // 7873 I/O PortC Attribute Register
+
+ // 7874 (data 0x1249) (bkrankp data 0x36db)
+ // 787c (data 0x1249) (bkrankp data 0x36db)
+ // 787e (data 0x1249) (bkrankp data 0x36db)
// 7878 I/O PortD Data Register
// 7879 I/O PortD Buffer Register
// 787a I/O PortD Direction Register
// 787b I/O PortD Attribute Register
- // ######################################################################################################################################################################################
- // 788x - more IO?
- // ######################################################################################################################################################################################
-
// 7880
map(0x007882, 0x007882).rw(FUNC(sunplus_gcm394_base_device::unkarea_7882_r), FUNC(sunplus_gcm394_base_device::unkarea_7882_w));
map(0x007883, 0x007883).rw(FUNC(sunplus_gcm394_base_device::unkarea_7883_r), FUNC(sunplus_gcm394_base_device::unkarea_7883_w));
- // 0x7888 (data 0x1249)
+ // 0x7888 (data 0x1249) (bkrankp data 0x36db), written with 7874 / 787c / 787e above
// ######################################################################################################################################################################################
// 78ax - interrupt controller?
@@ -659,8 +782,12 @@ void sunplus_gcm394_base_device::base_internal_map(address_map &map)
map(0x007935, 0x007935).rw(FUNC(sunplus_gcm394_base_device::unkarea_7935_r), FUNC(sunplus_gcm394_base_device::unkarea_7935_w));
map(0x007936, 0x007936).rw(FUNC(sunplus_gcm394_base_device::unkarea_7936_r), FUNC(sunplus_gcm394_base_device::unkarea_7936_w));
- map(0x007944, 0x007944).r(FUNC(sunplus_gcm394_base_device::unkarea_7945_r)); // jak_s500
- map(0x007945, 0x007945).r(FUNC(sunplus_gcm394_base_device::unkarea_7945_r)); // jak_s500
+ //7940 P_SPI_Ctrl - SPI Control Register
+ //7941 P_SPI_TXStatus - SPI Transmit Status Register
+ //7942 P_SPI_TXData - SPI Transmit FIFO Register
+ //7943 P_SPI_RXStatus - SPI Receive Status Register
+ map(0x007944, 0x007944).r(FUNC(sunplus_gcm394_base_device::spi_7944_rxdata_r)); // 7944 P_SPI_RXData - SPI Receive FIFO Register (jak_s500 accelerometer) (also the SPI ROM DMA input port for bkrankp?)
+ map(0x007945, 0x007945).r(FUNC(sunplus_gcm394_base_device::spi_7945_misc_control_reg_r)); // 7945 P_SPI_Misc - SPI Misc Control Register (jak_s500 accelerometer)
// possible adc?
map(0x007960, 0x007960).w(FUNC(sunplus_gcm394_base_device::unkarea_7960_w));
@@ -670,9 +797,13 @@ void sunplus_gcm394_base_device::base_internal_map(address_map &map)
// 7axx region = system (including dma)
// ######################################################################################################################################################################################
- map(0x007a3a, 0x007a3a).r(FUNC(sunplus_gcm394_base_device::system_7a3a_r));
+ map(0x007a3a, 0x007a3a).r(FUNC(sunplus_gcm394_base_device::system_7a3a_r)); // ?
+
map(0x007a80, 0x007a86).rw(FUNC(sunplus_gcm394_base_device::system_dma_params_channel0_r), FUNC(sunplus_gcm394_base_device::system_dma_params_channel0_w));
map(0x007a88, 0x007a8e).rw(FUNC(sunplus_gcm394_base_device::system_dma_params_channel1_r), FUNC(sunplus_gcm394_base_device::system_dma_params_channel1_w)); // jak_tsm writes here
+ map(0x007a90, 0x007a96).rw(FUNC(sunplus_gcm394_base_device::system_dma_params_channel2_r), FUNC(sunplus_gcm394_base_device::system_dma_params_channel2_w)); // bkrankp writes here (is this on all types or just SPI?)
+ //map(0x007a98, 0x007a9e).rw(FUNC(sunplus_gcm394_base_device::system_dma_params_channel3_r), FUNC(sunplus_gcm394_base_device::system_dma_params_channel3_w)); // not seen, but probably
+
map(0x007abe, 0x007abe).rw(FUNC(sunplus_gcm394_base_device::system_dma_memtype_r), FUNC(sunplus_gcm394_base_device::system_dma_memtype_w)); // 7abe - written with DMA stuff (source type for each channel so that device handles timings properly?)
map(0x007abf, 0x007abf).rw(FUNC(sunplus_gcm394_base_device::system_dma_status_r), FUNC(sunplus_gcm394_base_device::system_dma_trigger_w));
@@ -1062,6 +1193,7 @@ void sunplus_gcm394_base_device::device_start()
m_porta_in.resolve_safe(0);
m_portb_in.resolve_safe(0);
+ m_portc_in.resolve_safe(0);
m_porta_out.resolve();
@@ -1087,12 +1219,16 @@ void sunplus_gcm394_base_device::device_start()
save_item(NAME(m_7835));
save_item(NAME(m_7860));
save_item(NAME(m_7861));
- save_item(NAME(m_7862));
- save_item(NAME(m_7863));
+ save_item(NAME(m_7862_porta_direction));
+ save_item(NAME(m_7863_porta_attribute));
+
+ save_item(NAME(m_786a_portb_direction));
+ save_item(NAME(m_786b_portb_attribute));
+
save_item(NAME(m_7870));
- save_item(NAME(m_7871));
- save_item(NAME(m_7872));
- save_item(NAME(m_7873));
+ //save_item(NAME(m_7871));
+ save_item(NAME(m_7872_portc_direction));
+ save_item(NAME(m_7873_portc_attribute));
save_item(NAME(m_7882));
save_item(NAME(m_7883));
save_item(NAME(m_78a0));
@@ -1120,7 +1256,7 @@ void sunplus_gcm394_base_device::device_reset()
{
unsp_20_device::device_reset();
- for (int j = 0; j < 2; j++)
+ for (int j = 0; j < 3; j++)
{
for (int i = 0; i < 7; i++)
{
@@ -1154,15 +1290,18 @@ void sunplus_gcm394_base_device::device_reset()
m_7861 = 0x0000;
- m_7862 = 0x0000;
- m_7863 = 0x0000;
+ m_7862_porta_direction = 0x0000;
+ m_7863_porta_attribute = 0x0000;
+
+ m_786a_portb_direction = 0x0000;
+ m_786b_portb_attribute = 0x0000;
m_7870 = 0x0000;
- m_7871 = 0x0000;
+ //m_7871 = 0x0000;
- m_7872 = 0x0000;
- m_7873 = 0x0000;
+ m_7872_portc_direction = 0x0000;
+ m_7873_portc_attribute = 0x0000;
m_7882 = 0x0000;
m_7883 = 0x0000;
diff --git a/src/devices/machine/sunplus_gcm394.h b/src/devices/machine/sunplus_gcm394.h
index 9fa294e4e27..932646e2609 100644
--- a/src/devices/machine/sunplus_gcm394.h
+++ b/src/devices/machine/sunplus_gcm394.h
@@ -36,6 +36,7 @@ public:
m_internalrom(*this, "internal"),
m_porta_in(*this),
m_portb_in(*this),
+ m_portc_in(*this),
m_porta_out(*this),
m_nand_read_cb(*this),
m_csbase(0x20000),
@@ -51,6 +52,7 @@ public:
auto porta_in() { return m_porta_in.bind(); }
auto portb_in() { return m_portb_in.bind(); }
+ auto portc_in() { return m_portc_in.bind(); }
auto porta_out() { return m_porta_out.bind(); }
@@ -92,10 +94,11 @@ protected:
devcb_read16 m_porta_in;
devcb_read16 m_portb_in;
+ devcb_read16 m_portc_in;
devcb_write16 m_porta_out;
- uint16_t m_dma_params[7][2];
+ uint16_t m_dma_params[7][3];
// unk 78xx
uint16_t m_7803;
@@ -120,15 +123,18 @@ protected:
uint16_t m_7861;
- uint16_t m_7862;
- uint16_t m_7863;
+ uint16_t m_7862_porta_direction;
+ uint16_t m_7863_porta_attribute;
+
+ uint16_t m_786a_portb_direction;
+ uint16_t m_786b_portb_attribute;
uint16_t m_7870;
- uint16_t m_7871;
+ //uint16_t m_7871;
- uint16_t m_7872;
- uint16_t m_7873;
+ uint16_t m_7872_portc_direction;
+ uint16_t m_7873_portc_attribute;
uint16_t m_7882;
uint16_t m_7883;
@@ -189,6 +195,8 @@ private:
DECLARE_WRITE16_MEMBER(system_dma_params_channel0_w);
DECLARE_READ16_MEMBER(system_dma_params_channel1_r);
DECLARE_WRITE16_MEMBER(system_dma_params_channel1_w);
+ DECLARE_READ16_MEMBER(system_dma_params_channel2_r);
+ DECLARE_WRITE16_MEMBER(system_dma_params_channel2_w);
DECLARE_READ16_MEMBER(system_dma_status_r);
DECLARE_WRITE16_MEMBER(system_dma_trigger_w);
DECLARE_READ16_MEMBER(system_dma_memtype_r);
@@ -217,31 +225,38 @@ private:
DECLARE_WRITE16_MEMBER(unkarea_7835_w);
- DECLARE_READ16_MEMBER(unkarea_7868_r);
- DECLARE_READ16_MEMBER(unkarea_7869_r);
+ // Port A
+ DECLARE_READ16_MEMBER(ioarea_7860_porta_r);
+ DECLARE_WRITE16_MEMBER(ioarea_7860_porta_w);
+ DECLARE_READ16_MEMBER(ioarea_7861_porta_buffer_r);
+ DECLARE_READ16_MEMBER(ioarea_7862_porta_direction_r);
+ DECLARE_WRITE16_MEMBER(ioarea_7862_porta_direction_w);
+ DECLARE_READ16_MEMBER(ioarea_7863_porta_attribute_r);
+ DECLARE_WRITE16_MEMBER(ioarea_7863_porta_attribute_w);
+
+ // Port B
+ DECLARE_READ16_MEMBER(ioarea_7868_portb_r);
+ DECLARE_WRITE16_MEMBER(ioarea_7868_portb_w);
+ DECLARE_READ16_MEMBER(ioarea_7869_portb_buffer_r);
+ DECLARE_READ16_MEMBER(ioarea_786a_portb_direction_r);
+ DECLARE_WRITE16_MEMBER(ioarea_786a_portb_direction_w);
+ DECLARE_READ16_MEMBER(ioarea_786b_portb_attribute_r);
+ DECLARE_WRITE16_MEMBER(ioarea_786b_portb_attribute_w);
DECLARE_READ16_MEMBER(unkarea_782d_r);
DECLARE_WRITE16_MEMBER(unkarea_782d_w);
- DECLARE_READ16_MEMBER(ioarea_7860_porta_r);
- DECLARE_WRITE16_MEMBER(ioarea_7860_porta_w);
-
- DECLARE_READ16_MEMBER(unkarea_7861_r);
- DECLARE_READ16_MEMBER(unkarea_7862_r);
- DECLARE_WRITE16_MEMBER(unkarea_7862_w);
- DECLARE_READ16_MEMBER(unkarea_7863_r);
- DECLARE_WRITE16_MEMBER(unkarea_7863_w);
- DECLARE_READ16_MEMBER(ioarea_7870_portb_r);
- DECLARE_WRITE16_MEMBER(ioarea_7870_portb_w);
+ DECLARE_READ16_MEMBER(ioarea_7870_portc_r);
+ DECLARE_WRITE16_MEMBER(ioarea_7870_portc_w);
- DECLARE_READ16_MEMBER(unkarea_7871_r);
+ DECLARE_READ16_MEMBER(ioarea_7871_portc_buffer_r);
- DECLARE_READ16_MEMBER(unkarea_7872_r);
- DECLARE_WRITE16_MEMBER(unkarea_7872_w);
- DECLARE_READ16_MEMBER(unkarea_7873_r);
- DECLARE_WRITE16_MEMBER(unkarea_7873_w);
+ DECLARE_READ16_MEMBER(ioarea_7872_portc_direction_r);
+ DECLARE_WRITE16_MEMBER(ioarea_7872_portc_direction_w);
+ DECLARE_READ16_MEMBER(ioarea_7873_portc_attribute_r);
+ DECLARE_WRITE16_MEMBER(ioarea_7873_portc_attribute_w);
DECLARE_READ16_MEMBER(unkarea_7882_r);
DECLARE_WRITE16_MEMBER(unkarea_7882_w);
@@ -280,8 +295,8 @@ private:
DECLARE_READ16_MEMBER(unkarea_7936_r);
DECLARE_WRITE16_MEMBER(unkarea_7936_w);
- DECLARE_READ16_MEMBER(unkarea_7944_r);
- DECLARE_READ16_MEMBER(unkarea_7945_r);
+ DECLARE_READ16_MEMBER(spi_7944_rxdata_r);
+ DECLARE_READ16_MEMBER(spi_7945_misc_control_reg_r);
DECLARE_WRITE16_MEMBER(unkarea_7960_w);
DECLARE_READ16_MEMBER(unkarea_7961_r);
@@ -291,10 +306,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(videoirq_w);
DECLARE_WRITE_LINE_MEMBER(audioirq_w);
- DECLARE_READ16_MEMBER(system_7a3a_r)
- {
- return machine().rand();
- }
+ DECLARE_READ16_MEMBER(system_7a3a_r);
void checkirq6();
diff --git a/src/devices/machine/sunplus_gcm394_video.cpp b/src/devices/machine/sunplus_gcm394_video.cpp
index 1d1b1e9431c..26f602cbf6d 100644
--- a/src/devices/machine/sunplus_gcm394_video.cpp
+++ b/src/devices/machine/sunplus_gcm394_video.cpp
@@ -33,6 +33,8 @@ gcm394_base_video_device::gcm394_base_video_device(const machine_config &mconfig
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
m_space_read_cb(*this),
+ m_rowscroll(*this, "^rowscroll"),
+ m_rowzoom(*this, "^rowzoom"),
m_global_y_mask(0x1ff),
m_pal_displaybank_high(0),
m_alt_tile_addressing(0)
@@ -256,10 +258,10 @@ void gcm394_base_video_device::device_start()
save_item(NAME(m_7088));
save_item(NAME(m_sprite_7022_gfxbase_lsb));
save_item(NAME(m_sprite_702d_gfxbase_msb));
- save_item(NAME(m_unk_vid1_gfxbase_lsb));
- save_item(NAME(m_unk_vid1_gfxbase_msb));
- save_item(NAME(m_unk_vid2_gfxbase_lsb));
- save_item(NAME(m_unk_vid2_gfxbase_msb));
+ save_item(NAME(m_page2_addr_lsb));
+ save_item(NAME(m_page2_addr_msb));
+ save_item(NAME(m_page3_addr_lsb));
+ save_item(NAME(m_page3_addr_msb));
save_item(NAME(m_video_irq_status));
save_item(NAME(m_spriteram));
save_item(NAME(m_spriteextra));
@@ -328,10 +330,10 @@ void gcm394_base_video_device::device_reset()
m_sprite_7022_gfxbase_lsb = 0;
m_sprite_702d_gfxbase_msb = 0;
- m_unk_vid1_gfxbase_lsb = 0;
- m_unk_vid1_gfxbase_msb = 0;
- m_unk_vid2_gfxbase_lsb = 0;
- m_unk_vid2_gfxbase_msb = 0;
+ m_page2_addr_lsb = 0;
+ m_page2_addr_msb = 0;
+ m_page3_addr_lsb = 0;
+ m_page3_addr_msb = 0;
}
@@ -407,6 +409,7 @@ void gcm394_base_video_device::draw(const rectangle &cliprect, uint32_t line, ui
else if (nc_bpp < 8)
{
// 6bpp
+ // current_palette_offset |= 0x0800;
}
else
@@ -471,33 +474,44 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca
return;
}
- if (ctrl_reg & 0x01) // bitmap mode jak_car2 uses this ingame
+ if (ctrl_reg & 0x01) // bitmap mode jak_car2 and jak_s500 use for the ingame race sections, also have a bitmap test in test mode
{
- popmessage("bitmap mode %08x\n", bitmap_addr);
+ if (ctrl_reg & 0x10)
+ popmessage("bitmap mode %08x with rowscroll\n", bitmap_addr);
+ else
+ popmessage("bitmap mode %08x\n", bitmap_addr);
+
+ // note, in interlace modes it appears every other line is unused? (480 entry table, but with blank values)
+ // and furthermore the rowscroll and rowzoom tables only have 240 entries, not enough for every line
+ // the end of the rowscroll table (entries 240-255) contain something else, maybe garbage data as it's offscreen, maybe not
uint32_t linebase = space.read_word(tilemap + scanline); // every other word is unused, but there are only enough entries for 240 lines then, sometimes to do with interlace mode?
uint16_t palette = space.read_word(palette_map + (scanline / 2));
if (scanline & 1)
palette >>= 8;
+ else
+ palette &= 0xff;
- //if (linebase != 0)
- // printf("scanline %d linebase %04x palette %04x\n", scanline, linebase, palette);
+ if (!linebase)
+ return;
- linebase |= ((palette >> 8) << 16);
+ linebase = linebase | (palette << 16);
- int gfxbase = bitmap_addr + linebase;
+ // this logic works for jak_s500 and the test modes to get the correct base, doesn't seem to work for jak_car2 ingame, maybe data is copied to wrong place?
+ int gfxbase = (bitmap_addr&0x7ffffff) + (linebase&0x7ffffff);
- for (int i = 0; i < 160; i++) // will have to be 320 for jak_car2 ingame
+ for (int i = 0; i < 160; i++) // will have to be 320 for jak_car2 ingame, jak_s500 lines are wider than screen, and zoomed
{
- uint16_t pix = m_space_read_cb((gfxbase++)&0xffffff);
+ uint16_t pix = m_space_read_cb((gfxbase++)&0x7ffffff);
int xx;
int y_index = scanline * m_screen->width();
uint16_t pal;
if ((scanline >= 0) && (scanline < 480))
{
- xx = (i * 2);
+ xx = i * 2;
+
pal = (pix & 0xff) | 0x100;
if (xx >= 0 && xx <= cliprect.max_x)
@@ -777,8 +791,8 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
{
draw_page(cliprect, scanline, i, (m_page0_addr_lsb | (m_page0_addr_msb<<16)), m_tmap0_regs, m_tmap0_scroll);
draw_page(cliprect, scanline, i, (m_page1_addr_lsb | (m_page1_addr_msb<<16)), m_tmap1_regs, m_tmap1_scroll);
- draw_page(cliprect, scanline, i, (m_unk_vid1_gfxbase_lsb | (m_unk_vid1_gfxbase_msb<<16)), m_tmap2_regs, m_tmap2_scroll);
- draw_page(cliprect, scanline, i, (m_unk_vid2_gfxbase_lsb | (m_unk_vid2_gfxbase_msb<<16)), m_tmap3_regs, m_tmap3_scroll);
+ draw_page(cliprect, scanline, i, (m_page2_addr_lsb | (m_page2_addr_msb<<16)), m_tmap2_regs, m_tmap2_scroll);
+ draw_page(cliprect, scanline, i, (m_page3_addr_lsb | (m_page3_addr_msb<<16)), m_tmap3_regs, m_tmap3_scroll);
}
draw_sprites(cliprect, scanline, i);
@@ -1001,29 +1015,29 @@ WRITE16_MEMBER(gcm394_base_video_device::tmap2_regs_w)
}
}
-READ16_MEMBER(gcm394_base_video_device::unk_vid1_gfxbase_lsb_r)
+READ16_MEMBER(gcm394_base_video_device::tmap2_tilebase_lsb_r)
{
- return m_unk_vid1_gfxbase_lsb;
+ return m_page2_addr_lsb;
}
-WRITE16_MEMBER(gcm394_base_video_device::unk_vid1_gfxbase_lsb_w)
+WRITE16_MEMBER(gcm394_base_video_device::tmap2_tilebase_lsb_w)
{
- LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unk_vid1_gfxbase_lsb_w %04x\n", machine().describe_context(), data);
- m_unk_vid1_gfxbase_lsb = data;
- LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid1 tilegfxbase is now %04x%04x)\n", m_unk_vid1_gfxbase_msb, m_unk_vid1_gfxbase_lsb);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::tmap2_tilebase_lsb_w %04x\n", machine().describe_context(), data);
+ m_page2_addr_lsb = data;
+ LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid1 tilegfxbase is now %04x%04x)\n", m_page2_addr_msb, m_page2_addr_lsb);
}
-READ16_MEMBER(gcm394_base_video_device::unk_vid1_gfxbase_msb_r)
+READ16_MEMBER(gcm394_base_video_device::tmap2_tilebase_msb_r)
{
- return m_unk_vid1_gfxbase_msb;
+ return m_page2_addr_msb;
}
-WRITE16_MEMBER(gcm394_base_video_device::unk_vid1_gfxbase_msb_w)
+WRITE16_MEMBER(gcm394_base_video_device::tmap2_tilebase_msb_w)
{
- LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unk_vid1_gfxbase_msb_w %04x\n", machine().describe_context(), data);
- m_unk_vid1_gfxbase_msb = data;
- LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid1 tilegfxbase is now %04x%04x)\n", m_unk_vid1_gfxbase_msb, m_unk_vid1_gfxbase_lsb);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::tmap2_tilebase_msb_w %04x\n", machine().describe_context(), data);
+ m_page2_addr_msb = data;
+ LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid1 tilegfxbase is now %04x%04x)\n", m_page2_addr_msb, m_page2_addr_lsb);
}
// **************************************** unknown video device 2 (another tilemap? roz? lines? zooming sprite layer?) *************************************************
@@ -1053,30 +1067,30 @@ WRITE16_MEMBER(gcm394_base_video_device::tmap3_regs_w)
}
}
-READ16_MEMBER(gcm394_base_video_device::unk_vid2_gfxbase_lsb_r)
+READ16_MEMBER(gcm394_base_video_device::tmap3_tilebase_lsb_r)
{
- return m_unk_vid2_gfxbase_lsb;
+ return m_page3_addr_lsb;
}
-WRITE16_MEMBER(gcm394_base_video_device::unk_vid2_gfxbase_lsb_w)
+WRITE16_MEMBER(gcm394_base_video_device::tmap3_tilebase_lsb_w)
{
- LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unk_vid2_gfxbase_lsb_w %04x\n", machine().describe_context(), data);
- m_unk_vid2_gfxbase_lsb = data;
- LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid2 tilegfxbase is now %04x%04x)\n", m_unk_vid2_gfxbase_msb, m_unk_vid2_gfxbase_lsb);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::tmap3_tilebase_lsb_w %04x\n", machine().describe_context(), data);
+ m_page3_addr_lsb = data;
+ LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid2 tilegfxbase is now %04x%04x)\n", m_page3_addr_msb, m_page3_addr_lsb);
}
-READ16_MEMBER(gcm394_base_video_device::unk_vid2_gfxbase_msb_r)
+READ16_MEMBER(gcm394_base_video_device::tmap3_tilebase_msb_r)
{
- return m_unk_vid2_gfxbase_msb;
+ return m_page3_addr_msb;
}
-WRITE16_MEMBER(gcm394_base_video_device::unk_vid2_gfxbase_msb_w)
+WRITE16_MEMBER(gcm394_base_video_device::tmap3_tilebase_msb_w)
{
- LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unk_vid2_gfxbase_msb_w %04x\n", machine().describe_context(), data);
- m_unk_vid2_gfxbase_msb = data;
- LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid2 tilegfxbase is now %04x%04x)\n", m_unk_vid2_gfxbase_msb, m_unk_vid2_gfxbase_lsb);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::tmap3_tilebase_msb_w %04x\n", machine().describe_context(), data);
+ m_page3_addr_msb = data;
+ LOGMASKED(LOG_GCM394_TMAP, "\t(unk_vid2 tilegfxbase is now %04x%04x)\n", m_page3_addr_msb, m_page3_addr_lsb);
}
// **************************************** sprite control registers *************************************************
@@ -1398,6 +1412,11 @@ READ16_MEMBER(gcm394_base_video_device::palette_r)
}
}
+WRITE16_MEMBER(gcm394_base_video_device::video_701c_w)
+{
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_701c_w %04x\n", machine().describe_context(), data);
+}
+
void gcm394_base_video_device::check_video_irq()
{
diff --git a/src/devices/machine/sunplus_gcm394_video.h b/src/devices/machine/sunplus_gcm394_video.h
index 72193ecc74f..00805a94d2c 100644
--- a/src/devices/machine/sunplus_gcm394_video.h
+++ b/src/devices/machine/sunplus_gcm394_video.h
@@ -49,17 +49,17 @@ public:
DECLARE_READ16_MEMBER(tmap2_regs_r);
DECLARE_WRITE16_MEMBER(tmap2_regs_w);
- DECLARE_READ16_MEMBER(unk_vid1_gfxbase_lsb_r);
- DECLARE_READ16_MEMBER(unk_vid1_gfxbase_msb_r);
- DECLARE_WRITE16_MEMBER(unk_vid1_gfxbase_lsb_w);
- DECLARE_WRITE16_MEMBER(unk_vid1_gfxbase_msb_w);
+ DECLARE_READ16_MEMBER(tmap2_tilebase_lsb_r);
+ DECLARE_READ16_MEMBER(tmap2_tilebase_msb_r);
+ DECLARE_WRITE16_MEMBER(tmap2_tilebase_lsb_w);
+ DECLARE_WRITE16_MEMBER(tmap2_tilebase_msb_w);
DECLARE_READ16_MEMBER(tmap3_regs_r);
DECLARE_WRITE16_MEMBER(tmap3_regs_w);
- DECLARE_READ16_MEMBER(unk_vid2_gfxbase_lsb_r);
- DECLARE_READ16_MEMBER(unk_vid2_gfxbase_msb_r);
- DECLARE_WRITE16_MEMBER(unk_vid2_gfxbase_lsb_w);
- DECLARE_WRITE16_MEMBER(unk_vid2_gfxbase_msb_w);
+ DECLARE_READ16_MEMBER(tmap3_tilebase_lsb_r);
+ DECLARE_READ16_MEMBER(tmap3_tilebase_msb_r);
+ DECLARE_WRITE16_MEMBER(tmap3_tilebase_lsb_w);
+ DECLARE_WRITE16_MEMBER(tmap3_tilebase_msb_w);
DECLARE_READ16_MEMBER(sprite_7022_gfxbase_lsb_r);
DECLARE_READ16_MEMBER(sprite_702d_gfxbase_msb_r);
@@ -114,6 +114,7 @@ public:
DECLARE_READ16_MEMBER(spriteram_r);
DECLARE_READ16_MEMBER(video_7051_r);
+ DECLARE_WRITE16_MEMBER(video_701c_w);
auto write_video_irq_callback() { return m_video_irq_cb.bind(); };
@@ -230,10 +231,10 @@ protected:
uint16_t m_sprite_7022_gfxbase_lsb;
uint16_t m_sprite_702d_gfxbase_msb;
- uint16_t m_unk_vid1_gfxbase_lsb;
- uint16_t m_unk_vid1_gfxbase_msb;
- uint16_t m_unk_vid2_gfxbase_lsb;
- uint16_t m_unk_vid2_gfxbase_msb;
+ uint16_t m_page2_addr_lsb;
+ uint16_t m_page2_addr_msb;
+ uint16_t m_page3_addr_lsb;
+ uint16_t m_page3_addr_msb;
void unk_vid_regs_w(int which, int offset, uint16_t data);
@@ -246,6 +247,9 @@ protected:
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
devcb_read16 m_space_read_cb;
+
+ required_shared_ptr<uint16_t> m_rowscroll;
+ required_shared_ptr<uint16_t> m_rowzoom;
int m_maxgfxelement;
void decodegfx(const char* tag);
diff --git a/src/mame/drivers/sunplus_gcm394.cpp b/src/mame/drivers/sunplus_gcm394.cpp
index ba61226e905..89e9038e13b 100644
--- a/src/mame/drivers/sunplus_gcm394.cpp
+++ b/src/mame/drivers/sunplus_gcm394.cpp
@@ -141,8 +141,7 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
- m_io_p1(*this, "P1"),
- m_io_p2(*this, "P2"),
+ m_io(*this, "IN%u", 0U),
m_romregion(*this, "maincpu"),
m_memory(*this, "memory")
{
@@ -174,8 +173,7 @@ protected:
required_device<screen_device> m_screen;
- required_ioport m_io_p1;
- required_ioport m_io_p2;
+ required_ioport_array<3> m_io;
optional_region_ptr<uint16_t> m_romregion;
@@ -183,6 +181,7 @@ protected:
virtual DECLARE_READ16_MEMBER(porta_r);
virtual DECLARE_READ16_MEMBER(portb_r);
+ virtual DECLARE_READ16_MEMBER(portc_r);
virtual DECLARE_WRITE16_MEMBER(porta_w);
virtual DECLARE_READ16_MEMBER(read_external_space);
@@ -382,6 +381,7 @@ protected:
virtual void machine_reset() override;
virtual DECLARE_READ16_MEMBER(porta_r) override;
+ virtual DECLARE_READ16_MEMBER(portb_r) override;
private:
};
@@ -428,11 +428,19 @@ void wrlshunt_game_state::machine_reset()
READ16_MEMBER(jak_s500_game_state::porta_r)
{
- uint16_t data = m_io_p1->read();
- logerror("Port A Read: %04x\n", data);
+ uint16_t data = m_io[0]->read();
+ logerror("%s: Port A Read: %04x\n", machine().describe_context(), data);
return data;
}
+READ16_MEMBER(jak_s500_game_state::portb_r)
+{
+ uint16_t data = m_io[1]->read();
+ logerror("%s: Port B Read: %04x\n", machine().describe_context(), data);
+ return data;
+}
+
+
void jak_s500_game_state::machine_reset()
{
cs_callback(0x00, 0x00, 0x00, 0x00, 0x00);
@@ -503,18 +511,25 @@ WRITE16_MEMBER(gcm394_game_state::write_external_space)
READ16_MEMBER(gcm394_game_state::porta_r)
{
- uint16_t data = m_io_p1->read();
+ uint16_t data = m_io[0]->read();
logerror("Port A Read: %04x\n", data);
return data;
}
READ16_MEMBER(gcm394_game_state::portb_r)
{
- uint16_t data = m_io_p2->read();
+ uint16_t data = m_io[1]->read();
logerror("Port B Read: %04x\n", data);
return data;
}
+READ16_MEMBER(gcm394_game_state::portc_r)
+{
+ uint16_t data = m_io[2]->read();
+ logerror("Port C Read: %04x\n", data);
+ return data;
+}
+
WRITE16_MEMBER(gcm394_game_state::porta_w)
{
logerror("%s: Port A:WRITE %04x\n", machine().describe_context(), data);
@@ -529,6 +544,7 @@ void gcm394_game_state::base(machine_config &config)
GCM394(config, m_maincpu, 96000000/2, m_screen);
m_maincpu->porta_in().set(FUNC(gcm394_game_state::porta_r));
m_maincpu->portb_in().set(FUNC(gcm394_game_state::portb_r));
+ m_maincpu->portc_in().set(FUNC(gcm394_game_state::portc_r));
m_maincpu->porta_out().set(FUNC(gcm394_game_state::porta_w));
m_maincpu->space_read_callback().set(FUNC(gcm394_game_state::read_external_space));
m_maincpu->space_write_callback().set(FUNC(gcm394_game_state::write_external_space));
@@ -564,7 +580,7 @@ void wrlshunt_game_state::wrlshunt(machine_config &config)
READ16_MEMBER(wrlshunt_game_state::porta_r)
{
- uint16_t data = m_io_p1->read();
+ uint16_t data = m_io[0]->read();
logerror("%s: Port A Read: %04x\n", machine().describe_context(), data);
return data;
}
@@ -585,6 +601,7 @@ void generalplus_gpac800_game_state::generalplus_gpac800(machine_config &config)
GPAC800(config, m_maincpu, 96000000/2, m_screen);
m_maincpu->porta_in().set(FUNC(generalplus_gpac800_game_state::porta_r));
m_maincpu->portb_in().set(FUNC(generalplus_gpac800_game_state::portb_r));
+ m_maincpu->portc_in().set(FUNC(generalplus_gpac800_game_state::portc_r));
m_maincpu->porta_out().set(FUNC(generalplus_gpac800_game_state::porta_w));
m_maincpu->space_read_callback().set(FUNC(generalplus_gpac800_game_state::read_external_space));
m_maincpu->space_write_callback().set(FUNC(generalplus_gpac800_game_state::write_external_space));
@@ -694,6 +711,7 @@ void generalplus_gpspispi_game_state::generalplus_gpspispi(machine_config &confi
GP_SPISPI(config, m_maincpu, 96000000/2, m_screen);
m_maincpu->porta_in().set(FUNC(generalplus_gpspispi_game_state::porta_r));
m_maincpu->portb_in().set(FUNC(generalplus_gpspispi_game_state::portb_r));
+ m_maincpu->portc_in().set(FUNC(generalplus_gpspispi_game_state::portc_r));
m_maincpu->porta_out().set(FUNC(generalplus_gpspispi_game_state::porta_w));
m_maincpu->space_read_callback().set(FUNC(generalplus_gpspispi_game_state::read_external_space));
m_maincpu->space_write_callback().set(FUNC(generalplus_gpspispi_game_state::write_external_space));
@@ -738,12 +756,13 @@ void generalplus_gpspispi_bkrankp_game_state::generalplus_gpspispi_bkrankp(machi
}
static INPUT_PORTS_START( gcm394 )
- PORT_START("P1")
- PORT_START("P2")
+ PORT_START("IN0")
+ PORT_START("IN1")
+ PORT_START("IN2")
INPUT_PORTS_END
static INPUT_PORTS_START( smartfp )
- PORT_START("P1")
+ PORT_START("IN0")
// entirely non-standard mat based controller (0-11 are where your feet are placed normally, row of selection places to step above those)
// no sensible default mapping unless forced
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_Q) PORT_NAME("0")
@@ -764,8 +783,11 @@ static INPUT_PORTS_START( smartfp )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_D) PORT_NAME("Triangle / Yellow")
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CODE(KEYCODE_F) PORT_NAME("Star / Blue")
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_START("IN1")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN2" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
@@ -814,13 +836,14 @@ static INPUT_PORTS_START( smartfp )
INPUT_PORTS_END
static INPUT_PORTS_START( wrlshunt )
- PORT_START("P1")
- PORT_START("P2")
+ PORT_START("IN0")
+ PORT_START("IN1")
+ PORT_START("IN2")
INPUT_PORTS_END
static INPUT_PORTS_START( jak_car2 )
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "P1" )
+ PORT_START("IN0")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
@@ -855,8 +878,11 @@ static INPUT_PORTS_START( jak_car2 )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_START("IN1")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN2" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
@@ -907,8 +933,8 @@ static INPUT_PORTS_START( jak_car2 )
INPUT_PORTS_END
static INPUT_PORTS_START( jak_gtg )
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "P1" )
+ PORT_START("IN0")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
@@ -949,8 +975,11 @@ static INPUT_PORTS_START( jak_gtg )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_START("IN1")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN2" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
@@ -1002,8 +1031,8 @@ INPUT_PORTS_END
static INPUT_PORTS_START( jak_s500 )
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "P1" )
+ PORT_START("IN0")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
@@ -1042,8 +1071,11 @@ static INPUT_PORTS_START( jak_s500 )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON3 )
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_START("IN1")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN2" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
diff --git a/src/mame/drivers/trkfldch.cpp b/src/mame/drivers/trkfldch.cpp
index 12c88d3a3b0..a9b35eaaf4e 100644
--- a/src/mame/drivers/trkfldch.cpp
+++ b/src/mame/drivers/trkfldch.cpp
@@ -20,6 +20,16 @@ The G65816 code on these is VERY ugly and difficult to follow, many redundant st
One of the vectors points to 0x6000, there is nothing mapped there, could it be a small internal ROM or some debug trap for development?
+
+---
+
+4 Player System notes:
+
+Mountain Bike Rally uses scrolling / split (helps confirm the same row skip logic seen in other games when using split)
+Turn and Whack (cards) game runs far too quickly (might show us where timer config is)
+The Power Game game also appears to run far too quickly
+Territory Pursuit uses y-flipped sprites
+
*/
#include "emu.h"
@@ -43,7 +53,8 @@ public:
m_mainram(*this, "mainram"),
m_spriteram(*this, "spriteram"),
m_palram(*this, "palram"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_in(*this, "IN%u", 0U)
{ }
void trkfldch(machine_config &config);
@@ -63,6 +74,7 @@ private:
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_palram;
required_device<palette_device> m_palette;
+ required_ioport_array<4> m_in;
void draw_sprites(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, int pri);
void render_text_tile_layer(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, uint16_t base);
@@ -280,14 +292,26 @@ void trkfldch_state::draw_sprites(screen_device& screen, bitmap_ind16& bitmap, c
{
int priority = (m_spriteram[i + 4] & 0x20)>>5;
- // list is NOT drawn but instead z sorted, see shadows in trkfldch
+ // list is NOT drawn in order, but instead z sorted, see shadows in trkfldch
if (priority != pri)
continue;
// logerror("entry %02x %02x %02x %02x %02x\n", m_spriteram[i + 0], m_spriteram[i + 1], m_spriteram[i + 2], m_spriteram[i + 3], m_spriteram[i + 4]);
int tilegfxbase = (m_modebank[0x05] * 0x800);
- // --pp tt-y yyyy yyyy tttt tttt yyyy yyyy --zf -t-x
+ /* m_spriteram[i + 0] --pp tt-y
+ m_spriteram[i + 1] yyyy yyyy
+ m_spriteram[i + 2] tttt tttt
+ m_spriteram[i + 3] xxxx xxxx
+ m_spriteram[i + 4] --zfF-t-x
+
+ p = palette bits
+ t = tile bites
+ y = y pos bits
+ x = x pos bits
+ z = priority
+ fF = x/y flip
+ */
int y = m_spriteram[i + 1];
int x = m_spriteram[i + 3];
@@ -300,6 +324,7 @@ void trkfldch_state::draw_sprites(screen_device& screen, bitmap_ind16& bitmap, c
int pal = 0;
int flipx = m_spriteram[i + 4] & 0x10;
+ int flipy = m_spriteram[i + 4] & 0x08;
if (tilehigh)
tile += 0x100;
@@ -337,7 +362,7 @@ void trkfldch_state::draw_sprites(screen_device& screen, bitmap_ind16& bitmap, c
}
- gfx->transpen(bitmap, cliprect, tile + tilegfxbase, pal, flipx, 0, x, y, 0);
+ gfx->transpen(bitmap, cliprect, tile + tilegfxbase, pal, flipx, flipy, x, y, 0);
}
}
@@ -511,6 +536,18 @@ WRITE8_MEMBER(trkfldch_state::tmap1_scroll_window_w)
READ8_MEMBER(trkfldch_state::dmaregs_r)
{
uint8_t ret = m_dmaregs[offset];
+
+ switch (offset)
+ {
+ case 0x05: // abl4play polls this expecting it to be 0 to continue (probably becomes after DMA is complete, or can show the status in realtime?)
+ ret = 0x00;
+ break;
+
+ case 0x06: // abl4play polls this expecting it to be 0 to continue (probably becomes after DMA is complete, or can show the status in realtime?)
+ ret = 0x00;
+ break;
+ }
+
logerror("%s: dmaregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
return ret;
}
@@ -728,7 +765,7 @@ void trkfldch_state::trkfldch_map(address_map &map)
map(0x007870, 0x0078ff).rw(FUNC(trkfldch_state::unkregs_r), FUNC(trkfldch_state::unkregs_w));
- map(0x008000, 0x3fffff).rom().region("maincpu", 0x000000); // good for code mapped at 008000 and 050000 at least
+ map(0x008000, 0x7fffff).rom().region("maincpu", 0x000000); // good for code mapped at 008000 and 050000 at least
}
void trkfldch_state::vectors_map(address_map &map)
@@ -863,6 +900,9 @@ static INPUT_PORTS_START( trkfldch )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_START("IN3")
INPUT_PORTS_END
static INPUT_PORTS_START( my1stddr )
@@ -905,6 +945,51 @@ static INPUT_PORTS_START( my1stddr )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_START("IN3")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( abl4play )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Select")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(3)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(4)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
@@ -1092,17 +1177,19 @@ READ8_MEMBER(trkfldch_state::unkregs_r)
{
case 0x00: // read in irq (inputs?)
- ret = ioport("IN0")->read();
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
+ ret = m_in[0]->read();
+ logerror("%s: unkregs_r %04x (returning %02x) (Player 1 inputs)\n", machine().describe_context(), offset, ret);
break;
case 0x01:
- ret = ioport("IN1")->read();
logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
break;
+ // 0x02
+
case 0x03:
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
+ ret = m_in[1]->read();
+ logerror("%s: unkregs_r %04x (returning %02x) (Player 2 inputs)\n", machine().describe_context(), offset, ret);
break;
case 0x04:
@@ -1118,9 +1205,20 @@ READ8_MEMBER(trkfldch_state::unkregs_r)
break;
case 0x07:
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
+ ret = m_in[2]->read();
+ logerror("%s: unkregs_r %04x (returning %02x) (Player 3 inputs)\n", machine().describe_context(), offset, ret);
break;
+ // 0x08
+ // 0x09
+ // 0x0a
+
+ case 0x0b:
+ ret = m_in[3]->read();
+ logerror("%s: unkregs_r %04x (returning %02x) (Player 4 inputs)\n", machine().describe_context(), offset, ret);
+ break;
+
+
case 0x0f:
logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
break;
@@ -1328,16 +1426,22 @@ void trkfldch_state::trkfldch(machine_config &config)
}
ROM_START( trkfldch )
- ROM_REGION( 0x400000, "maincpu", 0 )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "trackandfield.bin", 0x000000, 0x400000, CRC(f4f1959d) SHA1(344dbfe8df1897adf77da6e5ca0435c4d47d6842) )
ROM_END
ROM_START( my1stddr )
- ROM_REGION( 0x400000, "maincpu", 0 )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "myfirstddr.bin", 0x000000, 0x400000, CRC(2ef57bfc) SHA1(9feea5adb9de8fe17e915f3a037e8ddd70e58ae7) )
ROM_END
+ROM_START( abl4play )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "abl4play.bin", 0x000000, 0x800000, CRC(5d57fb70) SHA1(34cdf80dc8cb08e5cd98c724268e4c5f483780d7) )
+ROM_END
+
CONS( 2007, trkfldch, 0, 0, trkfldch, trkfldch,trkfldch_state, empty_init, "Konami", "Track & Field Challenge", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
CONS( 2006, my1stddr, 0, 0, trkfldch, my1stddr,trkfldch_state, empty_init, "Konami", "My First Dance Dance Revolution (US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // Japan version has different songs
+CONS( 200?, abl4play, 0, 0, trkfldch, abl4play,trkfldch_state, empty_init, "Advance Bright Ltd", "4 Player System - 10 in 1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp
index 257124e6239..8de87d92bf2 100644
--- a/src/mame/drivers/xavix.cpp
+++ b/src/mame/drivers/xavix.cpp
@@ -38,7 +38,7 @@
2007 Tokyo Friend park? perfect! mezase! grand slam!/EPOCH/Japan - - - - - - -
2006 1 Let's TV Play series "Kamen Rider Kabuto" /EPOCH/Japan - - - - - - -
2 Let's TV Play series "Bo-kenger" /EPOCH/Japan - - - - - - -
- 3 Challenge Ai-chan! Exciting Ping-pong /TAKARATOMY/Japan - - - - - - -
+ 3 Challenge Ai-chan! Exciting Ping-pong /TAKARATOMY/Japan - - - - - - dumped
4 Sasuke & Sportsman Tournament /BANDAI/Japan - - - - - - -
5 Hyper resque, I am a resque team /BANDAI/Japan - - - - - - -
6 Let's TV Play series "Ultraman" /BANDAI/Japan - - - - - - -
@@ -69,7 +69,7 @@
17 Toinohgi Onmyo-daisenki /BANDAI/Japan - - - - - - -
2004 1 Accessory cartridge for Super TV computer "Double mouse party"/EPOCH/Japan - - - - - - -
2 Printer for TV computer /EPOCH/Japan - - - - - - -
- 3 Virtual punching battle of "One Piece" /BANDAI/Japan - - - - - - -
+ 3 Virtual punching battle of "One Piece" /BANDAI/Japan - - - - - - dumped
4 Accessory cartridge for Super TV computer "Doraemon"/EPOCH/Japan - - - - - - -
5 Accessory cartridge for Super TV computer "Hamutaro"/EPOCH/Japan - - - - - - -
6 Super TV computer /EPOCH/Japan - - - - - - -
@@ -88,7 +88,7 @@
19 Play TV Madden Football /RADICA/USA 74021 x8 48 4M none SSD 98 PL7351-181 dumped
20 Play TV SSX Snowboarder (and Snowboarder white?) /RADICA/USA 74023 none dumped
21 Disney Princess "Kira-Kira magical lesson" /TOMY/Japan - - - - - - -
- 22 Mermaid Melody "pichi-pichi Pitch" e-pitch microcomputer pure starter set /TAKARA/Japan - - - - - - -
+ 22 Mermaid Melody "pichi-pichi Pitch" e-pitch microcomputer pure starter set /TAKARA/Japan - - - - - - dumped (same as e-kara Japan)
23 Hello Kitty TV computer /EPOCH/Japan - - - - - - -
24 Gan-Gan Revoultion /TAKARA/Japan - - - - - - -
2003 1 Tokyo Friend Park II /EPOCH/Japan - - - - - - -
@@ -100,7 +100,7 @@
7 Croquette! Win a medal! /EPOCH/Japan - - - - - - -
8 Taiko Popira /TAKARA/Japan - - - - - - dumped
9 Together Minimoni, Dancing' Stage! plus /EPOCH/Japan - - - - - - -
- 10 Evio /TOMY/Japan - - - - - - -
+ 10 Evio /TOMY/Japan - - - - - - dumped (some carts not dumped tho)
11 Together Minimoni,Jumping Party! /EPOCH/Japan - - - - - - -
12 Hamutaro TV computer /EPOCH/Japan - - - - - - -
13 Jara-Ja Land /TAKARA/Japan - - - - - - - (is this the home release of Jala Jaland /atlus/Japan above?)
@@ -111,9 +111,9 @@
18 Cartridge for Slot machine TV "King of wild animal" /TAKARA/Japan - - - - - - -
19 ChyoroQ "Burning up Racer /TAKARA/Japan - - - - - - -
20 Super shot! Exciting golf /EPOCH/Japan - - - - - - -
- 21 PichiPichi Pitchi /TAKARA/Japan - - - - - - -
+ 21 PichiPichi Pitchi /TAKARA/Japan - - - - - - dumped (same as e-kara Japan)
22 Dual Station /TAKARA/Japan - - - - - - -
- 23 Gei-Geki GoGo! Shooting /TAKARA/Japan - - - - - - -
+ 23 Gei-Geki GoGo! Shooting /TAKARA/Japan - - - - - - dumped
24 Let's fish a big one. Exciting fishing! /EPOCH/Japan - - - - - - -
25 Champion Pinball /TOMY/Japan - - - - - - -
26 Excite Fishing DX EF2J x8 48 4M 24C08 SSD 98 PL7351-181 dumped
@@ -121,18 +121,18 @@
2 Wildest computer robot "Daigander" (Korean version) /TAKARA/Korea - - - - - - -
3 Hamutaro's circus /EPOCH/Japan - - - - - - -
4 Doraemon Wakuwaku Kuukihou /EPOCH/Japan - x8 - - - - dumped
- 5 Strike! Exciting bowling /EPOCH/Japan - - - - - - -
- 6 e-kara /Hasbro/Spain - - - - - - -
+ 5 Strike! Exciting bowling /EPOCH/Japan - - - - - - dumped
+ 6 e-kara /Hasbro/Spain - - - - - - dumped (has 3 Spanish songs)
7 Starter set for e-kara H.S," Morning sisters" /TAKARA/Japan - - - - - - -
8 e-kara H.S.(headphones set) /TAKARA/Japan - - - - - - -
- 9 Accessory cartridge for Slot machine TV," Aladdin TV" /TAKARA/Japan - - - - - - -
- 10 Accessory cartridge for Slot machine TV "Businessman Kintaro/TAKARA/Japan - - - - - - -
+ 9 Accessory cartridge for Slot machine TV," Aladdin TV" /TAKARA/Japan - - - - - - dumped (cart)
+ 10 Accessory cartridge for Slot machine TV "Businessman Kintaro/TAKARA/Japan - - - - - - dumped (cart)
11 Poko-poko Hammers /TAKARA/Japan - - - - - - -
12 e-kara N Angel blue special set /TAKARA/Japan - - - - - - -
13 Together Minimoni,Dancing Stage! /EPOCH/Japan - - - - - - -
14 King of shooting /TOMY/Japan - - - - - - -
- 15 Knock them out! Exciting boxing /EPOCH/Japan - - - - - - -
- 16 Popira2 /TAKARA/Japan - - - - - - -
+ 15 Knock them out! Exciting boxing /EPOCH/Japan - - - - - - dumped
+ 16 Popira2 /TAKARA/Japan - - - - - - dumped
17 Zuba-Zuba Blade /TAKARA/Japan - - - - - - -
18 Starter set for e-kara N "Morning sisters" /TAKARA/Japan - - - - - - -
19 e-kara /Hasbro/England - - - - - - dumped? (if same as one of the 'US' sets?)
@@ -142,12 +142,12 @@
23 PLAY TV Boxing /RADICA/Japan 72039 x8 48 2M none SSD 98 PA7351-107 dumped
24 PLAY TV Baseball 2 /RADICA/USA 72042 x8 48 2M none SSD 98 PL7351-181 dumped
25 Barbie Dance Party /RADICA/USA,EU - x8 none - - - dumped
- 26 Compete! Exciting stadium DX /EPOCH/Japan - - - - - - -
+ 26 Compete! Exciting stadium DX /EPOCH/Japan - - - - - - dumped
27 e-kara N /EPOCH/Japan - - - - - - -
28 Who's the ace? Excite Tennis /EPOCH/Japan - - - - - - -
29 Wildest computer robot, "Daigander" /TAKARA/Japan - - - - - - -
- 30 Cartridge for Slot machine TV "King of wild animal Jr." /TAKARA/Japan - - - - - - -
- 31 Gachinko Contest! Slot machine TV /DCT/Japan - - - - - - -
+ 30 Cartridge for Slot machine TV "King of wild animal Jr." /TAKARA/Japan - - - - - - dumped? (cart)
+ 31 Gachinko Contest! Slot machine TV /DCT/Japan - - - - - - dumped
32 Beyblade Ultimate shooter /TAKARA/Japan - - - - - - -
2001 1 Ping-pong(Chinese version) /Tenpon/China - - - - - - -
2 TV hockey /TOMY/Japan - - - - - - -
@@ -169,7 +169,7 @@
18 Let's construct the town! /TAKARA/Japan - - - - - - -
19 Let's fish black bass! Exciting Fishing /EPOCH/Japan - - - - - - -
20 Baseball Korean version /SONOKONG/Korea - - - - - - -
- 21 Ping-pong Korean version /SONOKONG/Korea - - - - - - -
+ 21 Ping-pong Korean version /SONOKONG/Korea - - - - - - dumped ('Reeal Ping Pong')
22 e-kara Hello Kitty /TAKARA/Japan - - - - - - -
23 Special box "Morning sisters" /TAKARA/Japan - - - - - - -
24 Gan-Gan Adventure /TAKARA/Japan - - - - - - -
@@ -546,6 +546,22 @@ static INPUT_PORTS_START( xavix_i2c )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", i2cmem_device, read_sda)
INPUT_PORTS_END
+static INPUT_PORTS_START( epo_bowl )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", i2cmem_device, read_sda)
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( ttv_lotr )
PORT_INCLUDE(xavix)
@@ -1788,6 +1804,16 @@ ROM_START( epo_efdx )
ROM_LOAD("excitefishing.bin", 0x000000, 0x400000, CRC(9c85b261) SHA1(6a363faed2ec89c5176e46554a98ca1e20132579) )
ROM_END
+ROM_START( epo_bowl )
+ ROM_REGION(0x200000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("bowling.bin", 0x000000, 0x200000, CRC(d34f8d9e) SHA1(ebe3792172dc43904b9226beb27f1da89d2388cc) )
+ROM_END
+
+ROM_START( epo_esdx )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("baseballdx.bin", 0x000000, 0x400000, CRC(fe2e832e) SHA1(e6343f5e5f52316538d918d0d67c15764aa40f65) )
+ROM_END
+
ROM_START( epo_epp )
ROM_REGION(0x100000, "bios", ROMREGION_ERASE00)
ROM_LOAD("excitepingpong.bin", 0x000000, 0x100000, CRC(1fdb9cbd) SHA1(8ed0c1f6d2708ab6e79f0b9553e587c6446e8338) )
@@ -2010,6 +2036,8 @@ CONS( 2002, rad_bdp, 0, 0, xavix, rad_bdp, xavix_state,
CONS( 2002, rad_socr, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Radica / Epoch / SSD Company LTD", "Play TV Soccer", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2002, epo_esdx, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Stadium DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
CONS( 2000, epo_epp, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 2000, epo_eppk, epo_epp, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD / Sonokong", "Real Ping Pong (Korea)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
@@ -2113,6 +2141,9 @@ ROM_START( ban_onep )
ROM_END
CONS( 2002, epo_ebox, 0, 0, xavix2000_nv, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Boxing (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // doesn't use XaviX2000 extra opcodes, but had that type of CPU
+ // die not confirmed, but uses extra opcodes. (hangs on title screen due to combination of freq_timer_done nested interrupts tripping, and waiting on bits in input ports to change
+CONS( 2002, epo_bowl, 0, 0, xavix2000_i2c_24c02, epo_bowl, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Bowling (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
CONS( 2004, epo_sdb, 0, 0, xavix2000_nv_sdb, epo_sdb, xavix_2000_nv_sdb_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND )
CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index df9880ed187..139a3df6333 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -39135,6 +39135,7 @@ trivrus // 2009 AGT. Trivia R Us
@source:trkfldch.cpp
trkfldch // (c) 2007 Konami
my1stddr // (c) 2006 Konami
+abl4play
@source:trs80.cpp
ht108064 // Hradstechnika Szvetkezet HT-1080Z/64
@@ -40991,6 +40992,8 @@ rad_snowp //
rad_madf //
rad_fb //
rad_socr //
+epo_bowl //
+epo_esdx //
epo_epp //
epo_eppk //
epo_epp3 //