summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2019-11-13 22:07:09 +0000
committer R. Belmont <rb6502@users.noreply.github.com>2019-11-13 17:07:09 -0500
commit78ed8c13e336dce9b8ec114b30d8f67db9253b27 (patch)
treed0d0d44c8f67de6e0a796a2da73ce9b131ca7605 /src
parent0ced158f31196b6b2fa873affcdd7f911d356cde (diff)
Plug & Play work (Tv GoGo, Poker inputs etc.) (#5898)
* vii.cpp: tvgogo, return value written on a port so that it boots (nw) also for spg2xx_io, add machine().describe_context() to more of the logging calls to make it more informative for debugging. * workaround so poker boots without debugger trick (nw) * uart read notes (nw) * not ideal, but force poker UART reads for now (nw) * improve input (nw) * clickable artwork fixes (nw) * comment (nw) * srcclean (nw) * tidy (nw)
Diffstat (limited to 'src')
-rw-r--r--src/devices/machine/spg2xx_io.cpp104
-rw-r--r--src/mame/drivers/vii.cpp156
-rw-r--r--src/mame/layout/sentx6p.lay52
3 files changed, 212 insertions, 100 deletions
diff --git a/src/devices/machine/spg2xx_io.cpp b/src/devices/machine/spg2xx_io.cpp
index 37768895396..fed6fa261c6 100644
--- a/src/devices/machine/spg2xx_io.cpp
+++ b/src/devices/machine/spg2xx_io.cpp
@@ -214,20 +214,20 @@ READ16_MEMBER(spg2xx_io_device::io_r)
break;
case 0x10: // Timebase Control
- LOGMASKED(LOG_IO_READS, "io_r: Timebase Control = %04x\n", val);
+ LOGMASKED(LOG_IO_READS, "%s: io_r: Timebase Control = %04x\n", machine().describe_context(), val);
break;
case 0x12: // Timer A Data
- LOGMASKED(LOG_IO_WRITES, "io_r: Timer A Data = %04x\n", val);
+ LOGMASKED(LOG_IO_WRITES, "%s: io_r: Timer A Data = %04x\n", machine().describe_context(), val);
break;
case 0x1c: // Video line counter
val = m_screen->vpos();
- LOGMASKED(LOG_VLINES, "io_r: Video Line = %04x\n", val);
+ LOGMASKED(LOG_VLINES, "%s: io_r: Video Line = %04x\n", machine().describe_context(), val);
break;
case 0x20: // System Control
- LOGMASKED(LOG_IO_READS, "io_r: System Control = %04x\n", val);
+ LOGMASKED(LOG_IO_READS, "%s: io_r: System Control = %04x\n", machine().describe_context(), val);
break;
case 0x21: // IRQ Control
@@ -243,7 +243,7 @@ READ16_MEMBER(spg2xx_io_device::io_r)
break;
case 0x25: // ADC Control
- LOGMASKED(LOG_IO_READS, "io_r: ADC Control = %04x\n", val);
+ LOGMASKED(LOG_IO_READS, "%s: io_r: ADC Control = %04x\n", machine().describe_context(), val);
break;
case 0x27: // ADC Data
@@ -259,13 +259,13 @@ READ16_MEMBER(spg2xx_io_device::io_r)
}
case 0x29: // Wakeup Source
- LOGMASKED(LOG_IO_READS, "io_r: Wakeup Source = %04x\n", val);
+ LOGMASKED(LOG_IO_READS, "%s: io_r: Wakeup Source = %04x\n", machine().describe_context(), val);
break;
case 0x2b:
{
uint16_t pal = m_pal_read_cb();
- LOGMASKED(LOG_IO_READS, "io_r: NTSC/PAL = %04x\n", pal);
+ LOGMASKED(LOG_IO_READS, "%s: io_r: NTSC/PAL = %04x\n", machine().describe_context(), pal);
return pal;
}
@@ -280,16 +280,16 @@ READ16_MEMBER(spg2xx_io_device::io_r)
}
case 0x2e: // FIQ Source Select
- LOGMASKED(LOG_FIQ, "io_r: FIQ Source Select = %04x\n", val);
+ LOGMASKED(LOG_FIQ, "%s: io_r: FIQ Source Select = %04x\n", machine().describe_context(), val);
break;
case 0x2f: // Data Segment
val = m_cpu->get_ds();
- LOGMASKED(LOG_SEGMENT, "io_r: Data Segment = %04x\n", val);
+ LOGMASKED(LOG_SEGMENT, "%s: io_r: Data Segment = %04x\n", machine().describe_context(), val);
break;
default:
- LOGMASKED(LOG_UNKNOWN_IO, "io_r: Unknown register %04x\n", 0x3d00 + offset);
+ LOGMASKED(LOG_UNKNOWN_IO, "%s: io_r: Unknown register %04x\n", machine().describe_context(), 0x3d00 + offset);
break;
}
@@ -311,7 +311,7 @@ READ16_MEMBER(spg2xx_io_device::io_extended_r)
break;
case 0x31: // UART Status
- //LOGMASKED(LOG_UART, "%s: io_r: UART Status = %04x\n", machine().describe_context(), val);
+ LOGMASKED(LOG_UART, "%s: io_r: UART Status = %04x\n", machine().describe_context(), val);
break;
case 0x36: // UART RX Data
@@ -354,22 +354,26 @@ READ16_MEMBER(spg2xx_io_device::io_extended_r)
case 0x37: // UART Rx FIFO Control
val &= ~0x0070;
val |= (m_uart_rx_available ? 7 : 0) << 4;
- LOGMASKED(LOG_UART, "io_r: UART Rx FIFO Control = %04x\n", machine().describe_context(), val);
+ LOGMASKED(LOG_UART, "%s: io_r: UART Rx FIFO Control = %04x\n", machine().describe_context(), val);
break;
case 0x51: // unknown, polled by ClickStart cartridges ( clikstrt )
return 0x8000;
+ case 0x58: // I2C Command ( tvgogo )
+ LOGMASKED(LOG_I2C, "%s: io_r: I2C Command = %04x\n", machine().describe_context(), val);
+ break;
+
case 0x59: // I2C Status
- LOGMASKED(LOG_I2C, "io_r: I2C Status = %04x\n", val);
+ LOGMASKED(LOG_I2C, "%s: io_r: I2C Status = %04x\n", machine().describe_context(), val);
break;
case 0x5e: // I2C Data In
- LOGMASKED(LOG_I2C, "io_r: I2C Data In = %04x\n", val);
+ LOGMASKED(LOG_I2C, "%s: io_r: I2C Data In = %04x\n", machine().describe_context(), val);
break;
default:
- LOGMASKED(LOG_UNKNOWN_IO, "io_r: Unknown register %04x\n", 0x3d00 + offset);
+ LOGMASKED(LOG_UNKNOWN_IO, "%s: io_r: Unknown register %04x\n", machine().describe_context(), 0x3d00 + offset);
break;
}
@@ -590,7 +594,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
{ 128, 256, 512, 1024 },
{ 105000, 210000, 420000, 840000 }
};
- LOGMASKED(LOG_TIMERS, "io_w: Timebase Control = %04x (Source:%s, TMB2:%s, TMB1:%s)\n", data,
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timebase Control = %04x (Source:%s, TMB2:%s, TMB1:%s)\n", machine().describe_context(), data,
BIT(data, 4) ? "27MHz" : "32768Hz", s_tmb2_sel[BIT(data, 4)][(data >> 2) & 3], s_tmb1_sel[BIT(data, 4)][data & 3]);
m_io_regs[offset] = data;
const uint8_t hifreq = BIT(data, 4);
@@ -602,11 +606,11 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
}
case 0x11: // Timebase Clear
- LOGMASKED(LOG_TIMERS, "io_w: Timebase Clear = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timebase Clear = %04x\n", machine().describe_context(), data);
break;
case 0x12: // Timer A Data
- LOGMASKED(LOG_TIMERS, "io_w: Timer A Data = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timer A Data = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
m_timer_a_preload = data;
break;
@@ -615,7 +619,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
{
static const char* const s_source_a[8] = { "0", "0", "32768Hz", "8192Hz", "4096Hz", "1", "0", "ExtClk1" };
static const char* const s_source_b[8] = { "2048Hz", "1024Hz", "256Hz", "TMB1", "4Hz", "2Hz", "1", "ExtClk2" };
- LOGMASKED(LOG_TIMERS, "io_w: Timer A Control = %04x (Source A:%s, Source B:%s)\n", data,
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timer A Control = %04x (Source A:%s, Source B:%s)\n", machine().describe_context(), data,
s_source_a[data & 7], s_source_b[(data >> 3) & 7]);
m_io_regs[offset] = data;
int timer_a_rate = 0;
@@ -673,7 +677,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
case 0x15: // Timer A IRQ Clear
{
- LOGMASKED(LOG_TIMERS, "io_w: Timer A IRQ Clear\n");
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timer A IRQ Clear\n", machine().describe_context());
const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS &= ~0x0800;
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
@@ -683,7 +687,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
}
case 0x16: // Timer B Data
- LOGMASKED(LOG_TIMERS, "io_w: Timer B Data = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timer B Data = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
m_timer_b_preload = data;
break;
@@ -691,7 +695,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
case 0x17: // Timer B Control
{
static const char* const s_source_c[8] = { "0", "0", "32768Hz", "8192Hz", "4096Hz", "1", "0", "ExtClk1" };
- LOGMASKED(LOG_TIMERS, "io_w: Timer B Control = %04x (Source C:%s)\n", data, s_source_c[data & 7]);
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timer B Control = %04x (Source C:%s)\n", machine().describe_context(), data, s_source_c[data & 7]);
m_io_regs[offset] = data;
if (m_io_regs[0x18] == 1)
{
@@ -702,7 +706,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
case 0x18: // Timer B Enable
{
- LOGMASKED(LOG_TIMERS, "io_w: Timer B Enable = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timer B Enable = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data & 1;
if (data & 1)
{
@@ -717,7 +721,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
case 0x19: // Timer B IRQ Clear
{
- LOGMASKED(LOG_TIMERS, "io_w: Timer B IRQ Clear\n");
+ LOGMASKED(LOG_TIMERS, "%s: io_w: Timer B IRQ Clear\n", machine().describe_context());
const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS &= ~0x0400;
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
@@ -731,7 +735,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
static const char* const s_sysclk[4] = { "13.5MHz", "27MHz", "27MHz NoICE", "54MHz" };
static const char* const s_lvd_voltage[4] = { "2.7V", "2.9V", "3.1V", "3.3V" };
static const char* const s_weak_strong[2] = { "Weak", "Strong" };
- LOGMASKED(LOG_IO_WRITES, "io_w: System Control = %04x (Watchdog:%d, Sleep:%d, SysClk:%s, SysClkInv:%d, LVROutEn:%d, LVREn:%d\n"
+ LOGMASKED(LOG_IO_WRITES, "%s: io_w: System Control = %04x (Watchdog:%d, Sleep:%d, SysClk:%s, SysClkInv:%d, LVROutEn:%d, LVREn:%d\n", machine().describe_context()
, data, BIT(data, 15), BIT(data, 14), s_sysclk[(data >> 12) & 3], BIT(data, 11), BIT(data, 9), BIT(data, 8));
LOGMASKED(LOG_IO_WRITES, " LVDEn:%d, LVDVoltSel:%s, 32kHzDisable:%d, StrWkMode:%s, VDACDisable:%d, ADACDisable:%d, ADACOutDisable:%d)\n"
, BIT(data, 7), s_lvd_voltage[(data >> 5) & 3], BIT(data, 4), s_weak_strong[BIT(data, 3)], BIT(data, 2), BIT(data, 1), BIT(data, 0));
@@ -741,7 +745,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
case 0x21: // IRQ Enable
{
- LOGMASKED(LOG_IRQS, "io_w: IRQ Enable = %04x\n", data);
+ LOGMASKED(LOG_IRQS, "%s: io_w: IRQ Enable = %04x\n", machine().describe_context(), data);
const uint16_t old = IO_IRQ_ENABLE;
m_io_regs[offset] = data;
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
@@ -752,7 +756,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
case 0x22: // IRQ Acknowledge
{
- LOGMASKED(LOG_IRQS, "io_w: IRQ Acknowledge = %04x\n", data);
+ LOGMASKED(LOG_IRQS, "%s: io_w: IRQ Acknowledge = %04x\n", machine().describe_context(), data);
const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS &= ~data;
const uint16_t changed = (old & IO_IRQ_ENABLE) ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE);
@@ -791,7 +795,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
"256KW, 3c0000-3fffff\n",
"512KW, 380000-3fffff\n"
};
- LOGMASKED(LOG_EXT_MEM, "io_w: Ext. Memory Control (not yet implemented) = %04x:\n", data);
+ LOGMASKED(LOG_EXT_MEM, "%s: io_w: Ext. Memory Control (not yet implemented) = %04x:\n", machine().describe_context(), data);
LOGMASKED(LOG_EXT_MEM, " WaitStates:%d, BusArbPrio:%s\n", (data >> 1) & 3, s_bus_arb[(data >> 3) & 7]);
LOGMASKED(LOG_EXT_MEM, " ROMAddrDecode:%s\n", s_addr_decode[(data >> 6) & 3]);
LOGMASKED(LOG_EXT_MEM, " RAMAddrDecode:%s\n", s_ram_decode[(data >> 8) & 15]);
@@ -801,7 +805,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
}
case 0x24: // Watchdog
- LOGMASKED(LOG_WATCHDOG, "io_w: Watchdog Pet = %04x\n", data);
+ LOGMASKED(LOG_WATCHDOG, "%s: io_w: Watchdog Pet = %04x\n", machine().describe_context(), data);
break;
case 0x25: // ADC Control
@@ -827,7 +831,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
}
case 0x28: // Sleep Mode
- LOGMASKED(LOG_IO_WRITES, "io_w: Sleep Mode (%s enter value) = %04x\n", data == 0xaa55 ? "valid" : "invalid", data);
+ LOGMASKED(LOG_IO_WRITES, "%s: io_w: Sleep Mode (%s enter value) = %04x\n", machine().describe_context(), data == 0xaa55 ? "valid" : "invalid", data);
m_io_regs[offset] = data;
break;
@@ -839,7 +843,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
"TMB1", "TMB2", "2Hz", "4Hz", "1024Hz", "2048Hz", "4096Hz", "Key"
};
- LOGMASKED(LOG_IO_WRITES, "io_w: Wakeup Source = %04x:\n", data);
+ LOGMASKED(LOG_IO_WRITES, "%s: io_w: Wakeup Source = %04x:\n", machine().describe_context(), data);
bool comma = false;
char buf[1024];
int char_idx = 0;
@@ -857,12 +861,12 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
}
case 0x2c: // PRNG 0 seed
- LOGMASKED(LOG_IO_WRITES, "io_w: PRNG 0 seed = %04x\n", data & 0x7fff);
+ LOGMASKED(LOG_IO_WRITES, "%s: io_w: PRNG 0 seed = %04x\n", machine().describe_context(), data & 0x7fff);
m_io_regs[offset] = data & 0x7fff;
break;
case 0x2d: // PRNG 1 seed
- LOGMASKED(LOG_IO_WRITES, "io_w: PRNG 1 seed = %04x\n", data & 0x7fff);
+ LOGMASKED(LOG_IO_WRITES, "%s: io_w: PRNG 1 seed = %04x\n", machine().describe_context(), data & 0x7fff);
m_io_regs[offset] = data & 0x7fff;
break;
@@ -872,18 +876,18 @@ WRITE16_MEMBER(spg2xx_io_device::io_w)
{
"PPU", "SPU Channel", "Timer A", "Timer B", "UART/SPI", "External", "Reserved", "None"
};
- LOGMASKED(LOG_FIQ, "io_w: FIQ Source Select (not yet implemented) = %04x, %s\n", data, s_fiq_select[data & 7]);
+ LOGMASKED(LOG_FIQ, "%s: io_w: FIQ Source Select (not yet implemented) = %04x, %s\n", machine().describe_context(), data, s_fiq_select[data & 7]);
m_io_regs[offset] = data;
break;
}
case 0x2f: // Data Segment
m_cpu->set_ds(data & 0x3f);
- LOGMASKED(LOG_SEGMENT, "io_w: Data Segment = %04x\n", data);
+ LOGMASKED(LOG_SEGMENT, "%s: io_w: Data Segment = %04x\n", machine().describe_context(), data);
break;
default:
- LOGMASKED(LOG_UNKNOWN_IO, "io_w: Unknown register %04x = %04x\n", 0x3d00 + offset, data);
+ LOGMASKED(LOG_UNKNOWN_IO, "%s: io_w: Unknown register %04x = %04x\n", machine().describe_context(), 0x3d00 + offset, data);
m_io_regs[offset] = data;
break;
}
@@ -994,7 +998,7 @@ WRITE16_MEMBER(spg2xx_io_device::io_extended_w)
{
static const char* const s_addr_mode[4] = { "16-bit", "None", "8-bit", "24-bit" };
static const char* const s_baud_rate[4] = { "/16", "/4", "/8", "/32" };
- LOGMASKED(LOG_SIO, "io_w: SIO Setup (not implemented) = %04x (DS301Ready:%d, Start:%d, Auto:%d, IRQEn:%d, Width:%d, Related:%d\n", data
+ LOGMASKED(LOG_SIO, "%s: io_w: SIO Setup (not implemented) = %04x (DS301Ready:%d, Start:%d, Auto:%d, IRQEn:%d, Width:%d, Related:%d\n", machine().describe_context(), data
, BIT(data, 11), BIT(data, 10), BIT(data, 9), BIT(data, 8), BIT(data, 7) ? 16 : 8, BIT(data, 6));
LOGMASKED(LOG_SIO, " (Mode:%s, RWProtocol:%d, Rate:sysclk%s, AddrMode:%s)\n"
, BIT(data, 5), BIT(data, 4), s_baud_rate[(data >> 2) & 3], s_addr_mode[data & 3]);
@@ -1002,64 +1006,64 @@ WRITE16_MEMBER(spg2xx_io_device::io_extended_w)
}
case 0x52: // SIO Start Address (low)
- LOGMASKED(LOG_SIO, "io_w: SIO Stat Address (low) (not implemented) = %04x\n", data);
+ LOGMASKED(LOG_SIO, "%s: io_w: SIO Stat Address (low) (not implemented) = %04x\n", machine().describe_context(), data);
break;
case 0x53: // SIO Start Address (hi)
- LOGMASKED(LOG_SIO, "io_w: SIO Stat Address (hi) (not implemented) = %04x\n", data);
+ LOGMASKED(LOG_SIO, "%s: io_w: SIO Stat Address (hi) (not implemented) = %04x\n", machine().describe_context(), data);
break;
case 0x54: // SIO Data
- LOGMASKED(LOG_SIO, "io_w: SIO Data (not implemented) = %04x\n", data);
+ LOGMASKED(LOG_SIO, "%s: io_w: SIO Data (not implemented) = %04x\n", machine().describe_context(), data);
break;
case 0x55: // SIO Automatic Transmit Count
- LOGMASKED(LOG_SIO, "io_w: SIO Auto Transmit Count (not implemented) = %04x\n", data);
+ LOGMASKED(LOG_SIO, "%s: io_w: SIO Auto Transmit Count (not implemented) = %04x\n", machine().describe_context(), data);
break;
case 0x58: // I2C Command
- LOGMASKED(LOG_I2C, "io_w: I2C Command = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Command = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
do_i2c();
break;
case 0x59: // I2C Status / Acknowledge
- LOGMASKED(LOG_I2C, "io_w: I2C Acknowledge = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Acknowledge = %04x\n", machine().describe_context(), data);
m_io_regs[offset] &= ~data;
break;
case 0x5a: // I2C Access Mode
- LOGMASKED(LOG_I2C, "io_w: I2C Access Mode = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Access Mode = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
break;
case 0x5b: // I2C Device Address
- LOGMASKED(LOG_I2C, "io_w: I2C Device Address = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Device Address = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
break;
case 0x5c: // I2C Sub-Address
- LOGMASKED(LOG_I2C, "io_w: I2C Sub-Address = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Sub-Address = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
break;
case 0x5d: // I2C Data Out
- LOGMASKED(LOG_I2C, "io_w: I2C Data Out = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Data Out = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
break;
case 0x5e: // I2C Data In
- LOGMASKED(LOG_I2C, "io_w: I2C Data In = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Data In = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
break;
case 0x5f: // I2C Controller Mode
- LOGMASKED(LOG_I2C, "io_w: I2C Controller Mode = %04x\n", data);
+ LOGMASKED(LOG_I2C, "%s: io_w: I2C Controller Mode = %04x\n", machine().describe_context(), data);
m_io_regs[offset] = data;
break;
default:
- LOGMASKED(LOG_UNKNOWN_IO, "io_w: Unknown register %04x = %04x\n", 0x3d00 + offset, data);
+ LOGMASKED(LOG_UNKNOWN_IO, "%s: io_w: Unknown register %04x = %04x\n", machine().describe_context(), 0x3d00 + offset, data);
m_io_regs[offset] = data;
break;
}
diff --git a/src/mame/drivers/vii.cpp b/src/mame/drivers/vii.cpp
index 48b597e06e8..e4dea7ebd22 100644
--- a/src/mame/drivers/vii.cpp
+++ b/src/mame/drivers/vii.cpp
@@ -313,6 +313,24 @@ public:
void mem_map_2m_texas(address_map &map);
+ DECLARE_INPUT_CHANGED_MEMBER(ok_latch)
+ {
+ if (newval == 1)
+ {
+ m_inputlatches[param] |= 0x02;
+ logerror("latching OK button for Player %d\n", param+1);
+ }
+ }
+
+ DECLARE_INPUT_CHANGED_MEMBER(select_latch)
+ {
+ if (newval == 1)
+ {
+ m_inputlatches[param] |= 0x01;
+ logerror("latching Select button for Player %d\n", param+1);
+ }
+ }
+
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -340,6 +358,10 @@ private:
void set_options_select(uint8_t value, int select_bits);
void set_controller_led(uint8_t value, int select_bits);
+ void controller_send_data(int which);
+
+ uint8_t m_inputlatches[6];
+
uint16_t m_porta_data;
output_finder<6> m_suite1;
@@ -514,9 +536,14 @@ public:
void tvgogo(machine_config &config);
private:
+ uint8_t m_i2cunk;
+
virtual void machine_start() override;
virtual void machine_reset() override;
+ DECLARE_WRITE8_MEMBER(tvg_i2c_w);
+ DECLARE_READ8_MEMBER(tvg_i2c_r);
+
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_tvgogo);
required_device<generic_slot_device> m_cart;
@@ -1768,13 +1795,9 @@ INPUT_PORTS_END
static INPUT_PORTS_START( tvgogo )
PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "P1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Back")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Select")
+ PORT_DIPNAME( 0x0004, 0x0004, "P1" )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
@@ -2024,7 +2047,8 @@ static INPUT_PORTS_START( sentx6p )
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, "Low Battery" ) // NOT just a battery sensor, actually needs to be high (On) in order for it to attempt to read any controllers on startup, otherwise it will hang after the VS MAXX logo with no way forward.
+ // is this really just the battery sensor, or does it have some other meaning, like data ready?
+ PORT_DIPNAME( 0x8000, 0x0000, "Low Battery" )
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
@@ -2127,29 +2151,30 @@ static INPUT_PORTS_START( sentx6p )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
// these are presuambly read through the UART as the LCD screens are driven by it, currently not hooked up
+ // using PORT_CHANGED_MEMBER because we assume the controller latches them for sending as inputs are only read every few frames
PORT_START("CTRL1")
- PORT_BIT( 0x1, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x2, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 0)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 0)
PORT_START("CTRL2")
- PORT_BIT( 0x1, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x2, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 1)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 1)
PORT_START("CTRL3")
- PORT_BIT( 0x1, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
- PORT_BIT( 0x2, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 2)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 2)
PORT_START("CTRL4")
- PORT_BIT( 0x1, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
- PORT_BIT( 0x2, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4)
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 3)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 3)
PORT_START("CTRL5")
- PORT_BIT( 0x1, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(5)
- PORT_BIT( 0x2, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(5)
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(5) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 4)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(5) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 4)
PORT_START("CTRL6")
- PORT_BIT( 0x1, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(6)
- PORT_BIT( 0x2, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(6)
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(6) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 5)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(6) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 5)
INPUT_PORTS_END
@@ -2565,6 +2590,23 @@ void icanpian_state::icanpian(machine_config &config)
SOFTWARE_LIST(config, "icanpian_cart").set_original("icanpian");
}
+WRITE8_MEMBER(tvgogo_state::tvg_i2c_w)
+{
+ // unsure what is mapped here (Camera?) but it expects to be able to read back the same byte it writes before it boots.
+ // (offset certainly isn't eeprom address as the generic spg2xx_game_state::eeprom_r / eeprom_r code expects)
+ m_i2cunk = data;
+ logerror("%s: tvg_i2c_w %04x %02x\n", machine().describe_context(), offset, data);
+ m_serial_eeprom[offset & 0x3ff] = data;
+}
+
+READ8_MEMBER(tvgogo_state::tvg_i2c_r)
+{
+ uint8_t ret = m_i2cunk;
+ logerror("%s: tvg_i2c_r %04x %02x\n", machine().describe_context(), offset, ret);
+ return ret;
+}
+
+
void tvgogo_state::tvgogo(machine_config &config)
{
SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
@@ -2581,6 +2623,9 @@ void tvgogo_state::tvgogo(machine_config &config)
m_cart->set_device_load(FUNC(tvgogo_state::cart_load_tvgogo));
m_cart->set_must_be_loaded(true);
+ m_maincpu->eeprom_w().set(FUNC(tvgogo_state::tvg_i2c_w));
+ m_maincpu->eeprom_r().set(FUNC(tvgogo_state::tvg_i2c_r));
+
SOFTWARE_LIST(config, "tvgogo_cart").set_original("tvgogo");
}
@@ -2929,6 +2974,32 @@ void sentx6p_state::machine_reset()
m_lcd_options[i] = 0x00;
m_lcd_options_select[i] = 0x00;
m_lcd_led[i] = 0x00;
+
+ m_inputlatches[i] = 0x00;
+ }
+
+ /* HACK: this address needs to contain '1' so that it thinks the first controller
+ is present, otherwise it hangs on boot. How does this get set?
+ following addresses are for the other controllers, and get set based on Port B
+ status flags */
+ address_space &mem = m_maincpu->space(AS_PROGRAM);
+ mem.write_word(0x1e08,0x0001);
+}
+
+void sentx6p_state::controller_send_data(int which)
+{
+ // 0x78 have to be set, this is probably because there is an unused space in the commands
+ // going the other way at 0x78 - 0x7f
+ // bit 3 (0x04) can also be set, doesn't care
+
+ uint8_t send = m_inputlatches[which] | 0x78;
+
+ m_maincpu->uart_rx( send );
+
+ if (m_inputlatches[which] & 0x03)
+ {
+ m_inputlatches[which] = 0x00;
+ logerror("clearing input latches for player %d\n", which + 1);
}
}
@@ -2950,12 +3021,39 @@ READ16_MEMBER(sentx6p_state::sentx_porta_r)
// the code around 029811 uses a ram value shifted left 8 times as the select bits (select_bits) on write
// then does a mask with them on the reads from this port, without shifting, comparing with 0
+
+ // the 'select bits' must also be active when the controller wants to send data, the UART read function
+ // won't proceed if they're zero, but the port is written with 0 before that
+
+ //logerror("%08x\n", m_maincpu->pc());
+
+ // regular logic for writing to the LCDs
uint16_t ret = (m_io_p1->read() & 0xffc0) | select_bits;
- //if (select_bits == 0x00)
- // ret |= 0x8000;
- //else
- // ret &= ~0x8000;
+ // hacks needed for reading from the UART to work
+
+ // the select bit must be high here to read from the controller?
+ if (m_maincpu->pc() == 0x2981e)
+ {
+ ret ^= 0x3f;
+ }
+
+ // but must be low again here after writing the select bits in order to not
+ // get stuck in a timeout loop
+ if (m_maincpu->pc() == 0x29834)
+ {
+ ret &= ~0x3f;
+
+ // presumably the inputs can only be sent once the controller is actually selected, otherwise
+ // there would be competing UART sources?
+ for (int i = 0; i < 6; i++)
+ {
+ if (select_bits & (1 << i))
+ {
+ controller_send_data(i);
+ }
+ }
+ }
return ret;
}
@@ -3151,6 +3249,8 @@ WRITE8_MEMBER(sentx6p_state::sentx_tx_w)
set_card2(data & 0x3f, select_bits);
break;
+ // cases 0x78 - 0x7f are transmissions in the other direction (from controller to main unit, used for sending buttons)
+
case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: // show selection options
case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
@@ -3171,11 +3271,11 @@ WRITE8_MEMBER(sentx6p_state::sentx_tx_w)
break;
case 0x3a:
- // reset controller?
+ // reset controller? (the input code also seems to check for 3a in one place coming in the other direction)
break;
default:
- printf("unknown LCD command %02x with controller select %02x\n", data, select_bits);
+ logerror("unknown LCD command %02x with controller select %02x\n", data, select_bits);
break;
}
@@ -3593,7 +3693,7 @@ CONS( 2006, pvmil, 0, 0, pvmil, pvmil, pvmil_state, e
// ROM is glued on the underside and soldered to the PCB, very difficult to remove without damaging.
CONS( 2007, taikeegr, 0, 0, taikeegr, taikeegr, spg2xx_game_state, init_taikeegr, "TaiKee", "Rockstar Guitar / Guitar Rock (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad music timings (too slow)
-// "go 02d1d0" "do r1 = ff" to get past initial screen
+// "go 02d1d0" "do r1 = ff" to get past initial screen (currently bypassed by setting controller sense in RAM earlier, see hack in machine_reset)
// a 'deluxe' version of this also exists with extra game modes
-CONS( 2004, sentx6p, 0, 0, sentx6p, sentx6p, sentx6p_state, empty_init, "Senario / Play Vision", "Texas Hold'em TV Poker - 6 Player Edition (UK)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a UK Play Vision branded box, values in GBP
+CONS( 2004, sentx6p, 0, 0, sentx6p, sentx6p, sentx6p_state, empty_init, "Senario / Play Vision", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (UK)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a UK Play Vision branded box, values in GBP
diff --git a/src/mame/layout/sentx6p.lay b/src/mame/layout/sentx6p.lay
index bf5b14b92b2..03971a6b198 100644
--- a/src/mame/layout/sentx6p.lay
+++ b/src/mame/layout/sentx6p.lay
@@ -2,10 +2,14 @@
<mamelayout version="2">
<element name="SELECT">
- <disk>
+ <disk state ="0">
<color red="0.8" green="0.8" blue="0.0" />
<bounds left="0.1" top="0.1" right="0.9" bottom="0.9" />
</disk>
+ <disk state ="1">
+ <color red="0.4" green="0.4" blue="0.0" />
+ <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" />
+ </disk>
<text string="SELECT" align="0">
<color red="1.0" green="1.0" blue="1.0" />
@@ -19,10 +23,14 @@
</element>
<element name="OK">
- <disk>
+ <disk state ="0">
<color red="0.0" green="0.8" blue="0.0" />
<bounds left="0.1" top="0.1" right="0.9" bottom="0.9" />
</disk>
+ <disk state ="1">
+ <color red="0.0" green="0.4" blue="0.0" />
+ <bounds left="0.1" top="0.1" right="0.9" bottom="0.9" />
+ </disk>
<text string="OK" align="0">
<color red="1.0" green="1.0" blue="1.0" />
@@ -357,19 +365,19 @@
<text state="1" string="&#x2666;" align="0"> <!-- DIAMOND -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.06" top="0.22" right="0.275" bottom="0.32" />
+ <bounds left="0.06" top="0.225" right="0.275" bottom="0.33" />
</text>
<text state="2" string="&#x2665;" align="0"> <!-- HEART -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.255" top="0.22" right="0.46" bottom="0.32" />
+ <bounds left="0.255" top="0.225" right="0.46" bottom="0.33" />
</text>
<text state="3" string="&#x2660;" align="0"> <!-- SPADE -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.06" top="0.29" right="0.275" bottom="0.39" />
+ <bounds left="0.06" top="0.295" right="0.275" bottom="0.40" />
</text>
<text state="4" string="&#x2663;" align="0"> <!-- CLUB -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.255" top="0.29" right="0.44" bottom="0.39" />
+ <bounds left="0.255" top="0.295" right="0.44" bottom="0.40" />
</text>
<rect state="1000">
@@ -451,19 +459,19 @@
<text state="1" string="&#x2666;" align="0"> <!-- DIAMOND -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.51" top="0.22" right="0.725" bottom="0.32" />
+ <bounds left="0.51" top="0.225" right="0.725" bottom="0.33" />
</text>
<text state="2" string="&#x2665;" align="0"> <!-- HEART -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.695" top="0.22" right="0.91" bottom="0.32" />
+ <bounds left="0.695" top="0.225" right="0.91" bottom="0.33" />
</text>
<text state="3" string="&#x2660;" align="0"> <!-- SPADE -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.51" top="0.29" right="0.725" bottom="0.39" />
+ <bounds left="0.51" top="0.295" right="0.725" bottom="0.40" />
</text>
<text state="4" string="&#x2663;" align="0"> <!-- CLUB -->
<color red="0.0" green="0.0" blue="0.0" />
- <bounds left="0.695" top="0.29" right="0.91" bottom="0.39" />
+ <bounds left="0.695" top="0.295" right="0.91" bottom="0.40" />
</text>
<rect state="1000">
@@ -528,10 +536,10 @@
<bezel name="OPTION_ALLIN_BZ0" element="OPTION_ALLIN">
<bounds left="4.5" top="0" right="5.0" bottom="1" />
</bezel>
- <bezel name="SELECTBTN_BZ0" element="SELECT" inputtag="CTRL0" inputmask="0x1">
+ <bezel element="SELECT" inputtag="CTRL1" inputmask="0x1">
<bounds x="4.685" y="0.685" width="0.13" height="0.13" />
</bezel>
- <bezel name="OKBTN_BZ0" element="OK" inputtag="CTRL0" inputmask="0x2">
+ <bezel element="OK" inputtag="CTRL1" inputmask="0x2">
<bounds x="4.685" y="0.81" width="0.13" height="0.13" />
</bezel>
<bezel name="REVEALTXT_BZ0" element="REVEAL">
@@ -593,10 +601,10 @@
<bezel name="OPTION_ALLIN_BZ1" element="OPTION_ALLIN">
<bounds left="4.5" top="1" right="5.0" bottom="2" />
</bezel>
- <bezel name="SELECTBTN_BZ1" element="SELECT" inputtag="CTRL1" inputmask="0x1">
+ <bezel element="SELECT" inputtag="CTRL2" inputmask="0x1">
<bounds x="4.685" y="1.685" width="0.13" height="0.13" />
</bezel>
- <bezel name="OKBTN_BZ1" element="OK" inputtag="CTRL1" inputmask="0x2">
+ <bezel element="OK" inputtag="CTRL2" inputmask="0x2">
<bounds x="4.685" y="1.81" width="0.13" height="0.13" />
</bezel>
<bezel name="REVEALTXT_BZ1" element="REVEAL">
@@ -658,10 +666,10 @@
<bezel name="OPTION_ALLIN_BZ2" element="OPTION_ALLIN">
<bounds left="4.5" top="2" right="5.0" bottom="3" />
</bezel>
- <bezel name="SELECTBTN_BZ2" element="SELECT" inputtag="CTRL2" inputmask="0x1">
+ <bezel element="SELECT" inputtag="CTRL3" inputmask="0x1">
<bounds x="4.685" y="2.685" width="0.13" height="0.13" />
</bezel>
- <bezel name="OKBTN_BZ2" element="OK" inputtag="CTRL2" inputmask="0x2">
+ <bezel element="OK" inputtag="CTRL3" inputmask="0x2">
<bounds x="4.685" y="2.81" width="0.13" height="0.13" />
</bezel>
<bezel name="REVEALTXT_BZ2" element="REVEAL">
@@ -723,10 +731,10 @@
<bezel name="OPTION_ALLIN_BZ3" element="OPTION_ALLIN">
<bounds left="0" top="2" right="0.5" bottom="3" />
</bezel>
- <bezel name="SELECTBTN_BZ3" element="SELECT" inputtag="CTRL3" inputmask="0x1">
+ <bezel element="SELECT" inputtag="CTRL4" inputmask="0x1">
<bounds x="0.185" y="2.685" width="0.13" height="0.13" />
</bezel>
- <bezel name="OKBTN_BZ3" element="OK" inputtag="CTRL3" inputmask="0x2">
+ <bezel element="OK" inputtag="CTRL4" inputmask="0x2">
<bounds x="0.185" y="2.81" width="0.13" height="0.13" />
</bezel>
<bezel name="REVEALTXT_BZ3" element="REVEAL">
@@ -788,10 +796,10 @@
<bezel name="OPTION_ALLIN_BZ4" element="OPTION_ALLIN">
<bounds left="0" top="1" right="0.5" bottom="2" />
</bezel>
- <bezel name="SELECTBTN_BZ4" element="SELECT" inputtag="CTRL4" inputmask="0x1">
+ <bezel element="SELECT" inputtag="CTRL5" inputmask="0x1">
<bounds x="0.185" y="1.685" width="0.13" height="0.13" />
</bezel>
- <bezel name="OKBTN_BZ4" element="OK" inputtag="CTRL4" inputmask="0x2">
+ <bezel element="OK" inputtag="CTRL5" inputmask="0x2">
<bounds x="0.185" y="1.81" width="0.13" height="0.13" />
</bezel>
<bezel name="REVEALTXT_BZ4" element="REVEAL">
@@ -853,10 +861,10 @@
<bezel name="OPTION_ALLIN_BZ5" element="OPTION_ALLIN">
<bounds left="0" top="0" right="0.5" bottom="1" />
</bezel>
- <bezel name="SELECTBTN_BZ5" element="SELECT" inputtag="CTRL5" inputmask="0x1">
+ <bezel element="SELECT" inputtag="CTRL6" inputmask="0x1">
<bounds x="0.185" y="0.685" width="0.13" height="0.13" />
</bezel>
- <bezel name="OKBTN_BZ5" element="OK" inputtag="CTRL5" inputmask="0x2">
+ <bezel element="OK" inputtag="CTRL6" inputmask="0x2">
<bounds x="0.185" y="0.81" width="0.13" height="0.13" />
</bezel>
<bezel name="REVEALTXT_BZ5" element="REVEAL">