New working systems

-------------------
Super VIP (v3.7) [hap, Berger]

New working clones
------------------
Super VIP (v3.6) [hap, Berger]
Super VIP (v1.03) [hap, Berger]
Super VIP (v1.01) [hap, Berger]
This commit is contained in:
hap 2023-12-14 16:01:12 +01:00
parent e82ea152ab
commit e9ac85ca86
9 changed files with 568 additions and 19 deletions

View File

@ -795,14 +795,14 @@ void m6801_cpu_device::set_rmcr(uint8_t data)
{
case 0:
LOGSER("SCI: Using external serial clock: false\n");
m_sci_timer->enable(false);
m_sci_timer->adjust(attotime::never);
m_use_ext_serclock = false;
break;
case 3: // external clock
LOGSER("SCI: Using external serial clock: true\n");
m_use_ext_serclock = true;
m_sci_timer->enable(false);
m_sci_timer->adjust(attotime::never);
break;
case 1:
@ -831,7 +831,7 @@ void hd6301x_cpu_device::set_rmcr(uint8_t data)
case 7: // external clock
LOGSER("SCI: Using external serial clock: true\n");
m_use_ext_serclock = true;
m_sci_timer->enable(false);
m_sci_timer->adjust(attotime::never);
break;
case 1:
@ -842,7 +842,7 @@ void hd6301x_cpu_device::set_rmcr(uint8_t data)
if (BIT(m_rmcr, 5))
{
LOGSER("SCI: Using Timer 2 clock\n");
m_sci_timer->enable(false);
m_sci_timer->adjust(attotime::never);
}
else
{

View File

@ -12,7 +12,7 @@ NOTE: It triggers an NMI when the power switch is changed from ON to SAVE.
If this is not done, NVRAM won't save properly.
TODO:
- if/when MAME supports an exit callback, hook up power-off NMI to that
- if/when MAME supports an exit callback, hook up power-off switch to that
- dump/add model 210.C (it has two small LCDs like Sphinx Galaxy)
Hardware notes:

View File

@ -26,7 +26,7 @@ real one (updated MM II engine) didn't get further than a prototype.
Before Rebell 5,0, Ed Schröder's developed his Rebel engine on the more limited MM II
hardware that only has 4KB RAM. This program was never officially released in a Mephisto
chess computer, but it competed in the amateur division at the 1985 WMCCC in Amsterdam.
chess computer, but it competed in the amateur division of the 1985 WMCCC in Amsterdam.
Mephisto 4 Turbo Kit 18mhz - (mm4tk)
This is a replacement ROM combining the Turbo Kit initial ROM with the original MM IV.
@ -479,8 +479,8 @@ ROM_END
ROM_START( rebelp )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("white_l7", 0x8000, 0x4000, CRC(9a45e1d4) SHA1(26e4c9cd1afe9aea0e8cfc25bdc9138bd99d5992) )
ROM_LOAD("green_r7", 0xc000, 0x4000, CRC(2285af5e) SHA1(bea22e32b65eea5fa7617d9d1b3a824a7affe678) )
ROM_LOAD("l7", 0x8000, 0x4000, CRC(9a45e1d4) SHA1(26e4c9cd1afe9aea0e8cfc25bdc9138bd99d5992) )
ROM_LOAD("r7", 0xc000, 0x4000, CRC(2285af5e) SHA1(bea22e32b65eea5fa7617d9d1b3a824a7affe678) )
ROM_END

View File

@ -0,0 +1,200 @@
<?xml version="1.0"?>
<!--
license:CC0-1.0
-->
<mamelayout version="2">
<!-- define elements -->
<element name="grayd"><disk><color red="0.45" green="0.44" blue="0.44" /></disk></element>
<element name="redd"><disk><color red="0.85" green="0.35" blue="0.2" /></disk></element>
<element name="white"><rect><color red="0.99" green="0.97" blue="0.97" /></rect></element>
<element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element>
<element name="gray2"><rect><color red="0.34" green="0.37" blue="0.39" /></rect></element>
<element name="lcdm"><rect><color red="0.7" green="0.71" blue="0.72" /></rect></element>
<element name="triangle">
<image><data><![CDATA[
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="10" height="10">
<path d="M 5,0 10,10 0,10 z" fill="#fffdfd" stroke="none" stroke-width="0" />
</svg>
]]></data></image>
</element>
<element name="hlb" defstate="0">
<rect state="0"><color red="1" green="1" blue="1" /></rect>
<rect state="1"><color red="0.77" green="0.77" blue="0.77" /></rect>
</element>
<element name="text_b1"><text string="A 1"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_b2"><text string="B 2"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_b3"><text string="C 3"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_b4"><text string="D 4"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_b5"><text string="E 5"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_b6"><text string="F 6"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_b7"><text string="G 7"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_b8"><text string="H 8"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_bng"><text string="NG"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_bc1"><text string="C"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_bc2"><text string="C B"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_bgo"><text string="GO"><color red="0.99" green="0.97" blue="0.97" /></text></element>
<element name="text_p1"><image file="chess/wk.svg"><color alpha="0.55" /></image></element>
<element name="text_p2"><image file="chess/wq.svg"><color alpha="0.55" /></image></element>
<element name="text_p3"><image file="chess/wr.svg"><color alpha="0.55" /></image></element>
<element name="text_p4"><image file="chess/wb.svg"><color alpha="0.55" /></image></element>
<element name="text_p5"><image file="chess/wn.svg"><color alpha="0.55" /></image></element>
<element name="text_p6"><image file="chess/wp.svg"><color alpha="0.55" /></image></element>
<element name="text_w1"><text string="Verify/Setup"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w2"><text string="Color"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w3"><text string="Referee"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w4"><text string="Sound"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w5"><text string="Solvemate"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w6"><text string="Restore"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w7"><text string="Hint"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w8"><text string="Easy"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w9"><text string="Info"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w10"><text string="Random"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w11"><text string="Next Best"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_w12"><text string="Autoplay"><color red="0.86" green="0.85" blue="0.85" /></text></element>
<element name="text_r1"><text string="Video"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r2"><text string="Board"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r3"><text string="Game"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r4"><text string="Baud"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r5"><text string="Replay"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r6"><text string="Human"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r7"><text string="Moves"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r8"><text string="Echo"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r9"><text string="Level"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<element name="text_r10"><text string="Autoclock"><color red="0.85" green="0.35" blue="0.2" /></text></element>
<!-- build screen -->
<view name="Internal Layout">
<bounds left="4" right="66" top="-19" bottom="59" />
<element ref="gray2"><bounds xc="35" yc="-9" width="62" height="20" /></element>
<element ref="blackb"><bounds xc="35" yc="-9" width="40.5" height="12.81" /></element>
<screen index="0"><bounds xc="35" yc="-9" width="40" height="12.31" /></screen>
<element ref="lcdm" blend="multiply"><bounds xc="35" yc="-9" width="40.5" height="12.81" /></element>
<!-- buttons base -->
<element ref="grayd"><bounds xc="10" yc="10" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="20" yc="10" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="30" yc="10" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="40" yc="10" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="50" yc="10" width="5.3" height="5.3" /></element>
<element ref="redd"><bounds xc="60" yc="10" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="10" yc="20" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="20" yc="20" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="30" yc="20" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="40" yc="20" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="50" yc="20" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="60" yc="20" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="15" yc="30" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="25" yc="30" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="35" yc="30" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="45" yc="30" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="55" yc="30" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="20" yc="40" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="30" yc="40" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="40" yc="40" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="50" yc="40" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="25" yc="50" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="35" yc="50" width="5.3" height="5.3" /></element>
<element ref="grayd"><bounds xc="45" yc="50" width="5.3" height="5.3" /></element>
<element ref="text_b1"><bounds xc="10" yc="9.95" width="6" height="3.1" /></element>
<element ref="text_b2"><bounds xc="20" yc="9.95" width="6" height="3.1" /></element>
<element ref="text_b3"><bounds xc="30" yc="9.95" width="6" height="3.1" /></element>
<element ref="text_b4"><bounds xc="40" yc="9.95" width="6" height="3.1" /></element>
<element ref="text_b5"><bounds xc="10" yc="19.95" width="6" height="3.1" /></element>
<element ref="text_b6"><bounds xc="20" yc="19.95" width="6" height="3.1" /></element>
<element ref="text_b7"><bounds xc="30" yc="19.95" width="6" height="3.1" /></element>
<element ref="text_b8"><bounds xc="40" yc="19.95" width="6" height="3.1" /></element>
<element ref="text_bng"><bounds xc="60" yc="9.95" width="6" height="3.1" /></element>
<element ref="text_bgo"><bounds xc="45" yc="49.95" width="6" height="3.1" /></element>
<element ref="white"><bounds xc="60" yc="20" width="1.7" height="0.15" /></element>
<element ref="text_bc1"><bounds xc="60" yc="18.85" width="6" height="2.1" /></element>
<element ref="text_bc2"><bounds xc="60" yc="21.05" width="6" height="2.1" /></element>
<element ref="text_p1" blend="add"><bounds xc="15" yc="29.9" width="4" height="4" /></element>
<element ref="text_p2" blend="add"><bounds xc="25" yc="29.9" width="4" height="4" /></element>
<element ref="text_p3" blend="add"><bounds xc="35" yc="29.9" width="4" height="4" /></element>
<element ref="text_p4" blend="add"><bounds xc="20" yc="39.9" width="4" height="4" /></element>
<element ref="text_p5" blend="add"><bounds xc="30" yc="39.9" width="4" height="4" /></element>
<element ref="text_p6" blend="add"><bounds xc="40" yc="39.9" width="4" height="4" /></element>
<element ref="triangle"><bounds xc="24.6" yc="50" width="2.5" height="2.8" /><orientation rotate="270" /></element>
<element ref="triangle"><bounds xc="35.4" yc="50" width="2.5" height="2.8" /><orientation rotate="90" /></element>
<!-- button masks -->
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x01"><bounds xc="10" yc="10" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x02"><bounds xc="20" yc="10" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x04"><bounds xc="30" yc="10" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x08"><bounds xc="40" yc="10" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x20"><bounds xc="50" yc="10" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x80"><bounds xc="60" yc="10" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x10"><bounds xc="10" yc="20" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x20"><bounds xc="20" yc="20" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x40"><bounds xc="30" yc="20" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.2" inputmask="0x80"><bounds xc="40" yc="20" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x10"><bounds xc="50" yc="20" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x08"><bounds xc="60" yc="20" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x80"><bounds xc="15" yc="30" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x40"><bounds xc="25" yc="30" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x20"><bounds xc="35" yc="30" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x02"><bounds xc="45" yc="30" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x04"><bounds xc="55" yc="30" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x10"><bounds xc="20" yc="40" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x08"><bounds xc="30" yc="40" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x04"><bounds xc="40" yc="40" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x40"><bounds xc="50" yc="40" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x01"><bounds xc="25" yc="50" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.1" inputmask="0x02"><bounds xc="35" yc="50" width="6" height="6" /></element>
<element ref="hlb" blend="multiply" inputtag="IN.0" inputmask="0x01"><bounds xc="45" yc="50" width="6" height="6" /></element>
<!-- labels under -->
<element ref="text_w1"><bounds xc="50" y="13" width="10" height="1.75" /></element>
<element ref="text_w2"><bounds xc="50" y="23" width="10" height="1.75" /></element>
<element ref="text_w3"><bounds xc="15" y="33" width="10" height="1.75" /></element>
<element ref="text_w4"><bounds xc="25" y="33" width="10" height="1.75" /></element>
<element ref="text_w5"><bounds xc="35" y="33" width="10" height="1.75" /></element>
<element ref="text_w6"><bounds xc="45" y="33" width="10" height="1.75" /></element>
<element ref="text_w7"><bounds xc="55" y="33" width="10" height="1.75" /></element>
<element ref="text_w8"><bounds xc="20" y="43" width="10" height="1.75" /></element>
<element ref="text_w9"><bounds xc="30" y="43" width="10" height="1.75" /></element>
<element ref="text_w10"><bounds xc="50" y="43" width="10" height="1.75" /></element>
<element ref="text_w11"><bounds xc="25" y="53" width="10" height="1.75" /></element>
<element ref="text_w12"><bounds xc="35" y="53" width="10" height="1.75" /></element>
<element ref="text_r1"><bounds xc="50" y="24.55" width="10" height="1.75" /></element>
<element ref="text_r2"><bounds xc="15" y="34.55" width="10" height="1.75" /></element>
<element ref="text_r3"><bounds xc="25" y="34.55" width="10" height="1.75" /></element>
<element ref="text_r4"><bounds xc="35" y="34.55" width="10" height="1.75" /></element>
<element ref="text_r5"><bounds xc="45" y="34.55" width="10" height="1.75" /></element>
<element ref="text_r6"><bounds xc="55" y="34.55" width="10" height="1.75" /></element>
<element ref="text_r7"><bounds xc="20" y="44.55" width="10" height="1.75" /></element>
<element ref="text_r8"><bounds xc="30" y="44.55" width="10" height="1.75" /></element>
<element ref="text_r9"><bounds xc="40" y="43" width="10" height="1.75" /></element>
<element ref="text_r10"><bounds xc="50" y="44.55" width="10" height="1.75" /></element>
</view>
</mamelayout>

View File

@ -150,8 +150,8 @@ license:CC0-1.0
<bounds left="-0.775" right="31.775" top="20" bottom="39.3" />
<element ref="white2"><bounds x="-0.775" y="20" width="32.55" height="7.7" /></element>
<element ref="black2"><bounds x="7.85" y="20.85" width="15.3" height="6.0" /></element>
<group ref="digits"><bounds x="8" y="21" width="15" height="5.7" /></group>
<element ref="black2"><bounds xc="15.5" yc="23.85" width="15.15" height="5.85" /></element>
<group ref="digits"><bounds xc="15.5" yc="23.85" width="15" height="5.7" /></group>
<group ref="buttons"><bounds x="-1" y="28.5" width="32" height="10.1" /></group>
</view>

View File

@ -34794,6 +34794,12 @@ sfortec1 //
nsnova
supremo
@source:novag/svip.cpp
nsvip
nsvipa
nsvipb
nsvipc
@source:novation/basssta.cpp
bassstr //
sbasssta //

View File

@ -10,10 +10,10 @@ NOTE: nsnova does an NMI at power-off (or power-failure). If this isn't done,
NVRAM won't work properly (supremo doesn't have NVRAM).
TODO:
- beeps are glitchy, as if interrupted for too long
- if/when MAME supports an exit callback, hook up nsnova power-off NMI to that
- nsnova serial port isn't working, MCU emulation problem?
- nsnova unmapped reads from 0x33/0x34
- serial port isn't working, same problem as nsvip
- unmapped reads from 0x33/0x34 (nsnova) or 0x3c/0x3d (supremo)
- supremo unmapped writes to 0x2000/0x6000, always 0?
- is "Aquamarine / Super Nova" the same rom as nsnova and just a redesign?
- is the 1st version of supremo(black plastic) the same ROM?
@ -26,11 +26,14 @@ Hardware notes:
- Hitachi HD63A03YP MCU @ 16MHz (4MHz internal)
- 32KB ROM(TC57256AD-12), 8KB RAM(CXK58648P-10L)
- LCD with 4 digits and custom segments, no LCD chip
- RJ-12 port for Novag Super System (like the one in sexpertc)
- RJ-12 port for Novag Super System (like the one in nsvip/sexpertc)
- buzzer, 16 LEDs, 8*8 chessboard buttons
Older versions had a bug in the opening moves, always playing B5 after D4.
The program is very similar to Super VIP, it could be said that Super Nova is
the Super VIP combined with the Novag Super System Touch Sensory board.
================================================================================
Novag Supremo (model 881)
@ -209,7 +212,7 @@ void snova_state::p2_w(u8 data)
// P24: serial tx
if (m_rs232)
m_rs232->write_txd(BIT(~data, 4));
m_rs232->write_txd(BIT(data, 4));
// P25-P27: 4051 S0-S2
// 4051 Y0-Y7: multiplexed inputs
@ -371,7 +374,7 @@ ROM_START( nsnova ) // ID = N1.05
ROM_LOAD("n_530.u5", 0x8000, 0x8000, CRC(727a0ada) SHA1(129c1edc5c1d2e12ce97ebef81c6d5555464a11d) )
ROM_REGION( 50926, "screen", 0 )
ROM_LOAD("nsnova.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_LOAD("nprimo.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_END
ROM_START( supremo )
@ -379,7 +382,7 @@ ROM_START( supremo )
ROM_LOAD("sp_a10.u5", 0x8000, 0x8000, CRC(1db63786) SHA1(4f24452ed8955b31ba88f68cc95c357660930aa4) )
ROM_REGION( 50926, "screen", 0 )
ROM_LOAD("nsnova.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_LOAD("nprimo.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_END
} // anonymous namespace

340
src/mame/novag/svip.cpp Normal file
View File

@ -0,0 +1,340 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger
/*******************************************************************************
Novag Super VIP, aka Super V.I.P. (model 895)
NOTE: Turn the power switch off before exiting MAME, otherwise NVRAM won't save
properly.
It's a portable chess computer with keypad input, no embedded chessboard. The
chess engine is similar to other HD6301/3Y ones by David Kittinger. The 'sequels'
of this portable design (Ruby, Sapphire, ..) are on H8.
Super VIP is Novag's first chess computer with a proper serial interface. It
connects to the Novag Super System Distributor, which can then connect to an
external chessboard, TV interface, computer, etc.
Hardware notes:
- Hitachi HD63A03YF @ 9.83MHz
- 32KB ROM(TC57256AD-12), 2KB RAM(TC5517CFL-20)
- LCD with 4 digits and custom segments, no LCD chip
- RJ-12 port, 24 buttons, piezo
The LCD is the same as the one in Primo / Supremo / Super Nova.
TODO:
- if/when MAME supports an exit callback, hook up power-off switch to that
- serial port isn't working, MCU emulation problem? (it has nothing to do with
the distributor box, that's just a dumb expander)
- unmapped reads from 0x3* range, same as snova driver
- is (non-super) VIP on the same hardware? minus EPROM or RS232
BTANB:
- just for fun, I'll mention that on many (not all) batches of Super VIP, the
white text label under the Knight button says "Into" instead of "Info"
*******************************************************************************/
#include "emu.h"
#include "bus/rs232/rs232.h"
#include "cpu/m6800/m6801.h"
#include "machine/nvram.h"
#include "machine/sensorboard.h"
#include "sound/dac.h"
#include "video/pwm.h"
#include "screen.h"
#include "speaker.h"
// internal artwork
#include "novag_svip.lh"
namespace {
class svip_state : public driver_device
{
public:
svip_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_lcd_pwm(*this, "lcd_pwm"),
m_dac(*this, "dac"),
m_rs232(*this, "rs232"),
m_inputs(*this, "IN.%u", 0),
m_out_lcd(*this, "s%u.%u", 0U, 0U)
{ }
void svip(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(power_off) { if (newval) m_power = false; }
DECLARE_CUSTOM_INPUT_MEMBER(power_r) { return m_power ? 1 : 0; }
protected:
virtual void machine_start() override;
virtual void machine_reset() override { m_power = true; }
private:
// devices/pointers
required_device<hd6301y0_cpu_device> m_maincpu;
required_device<pwm_display_device> m_lcd_pwm;
required_device<dac_2bit_ones_complement_device> m_dac;
required_device<rs232_port_device> m_rs232;
required_ioport_array<4> m_inputs;
output_finder<4, 10> m_out_lcd;
bool m_power = false;
bool m_lcd_strobe = false;
u8 m_inp_mux = 0;
u8 m_select = 0;
void main_map(address_map &map);
void lcd_pwm_w(offs_t offset, u8 data);
u8 p2_r();
void p2_w(u8 data);
void p5_w(u8 data);
void p6_w(u8 data);
};
void svip_state::machine_start()
{
m_out_lcd.resolve();
// register for savestates
save_item(NAME(m_power));
save_item(NAME(m_lcd_strobe));
save_item(NAME(m_inp_mux));
save_item(NAME(m_select));
}
/*******************************************************************************
I/O
*******************************************************************************/
void svip_state::lcd_pwm_w(offs_t offset, u8 data)
{
m_out_lcd[offset & 0x3f][offset >> 6] = data;
}
u8 svip_state::p2_r()
{
u8 data = 0;
// P20,P22: switch state
data |= m_inputs[3]->read() & 5;
// P23: serial rx
if (m_rs232)
data |= m_rs232->rxd_r() << 3;
// P25-P27: multiplexed inputs
for (int i = 0; i < 3; i++)
if (m_inp_mux & m_inputs[i]->read())
data |= 0x20 << i;
return ~data;
}
void svip_state::p2_w(u8 data)
{
// P21: 4066 in/out to LCD
if (m_lcd_strobe && ~data & 2)
{
u16 lcd_data = (~m_select << 2 & 0x300) | m_inp_mux;
m_lcd_pwm->matrix(m_select & 0xf, lcd_data);
}
m_lcd_strobe = bool(data & 2);
// P24: serial tx
if (m_rs232)
m_rs232->write_txd(BIT(data, 4));
}
void svip_state::p5_w(u8 data)
{
// P50-P53: 4066 control to LCD
// P56,P57: lcd data
m_select = data;
// P54,P55: speaker out
m_dac->write(data >> 4 & 3);
}
void svip_state::p6_w(u8 data)
{
// P60-P67: input mux, lcd data
m_inp_mux = ~data;
}
/*******************************************************************************
Address Maps
*******************************************************************************/
void svip_state::main_map(address_map &map)
{
map(0x2000, 0x27ff).mirror(0x1800).ram().share("nvram");
map(0x4000, 0xbfff).rom().region("eprom", 0);
}
/*******************************************************************************
Input Ports
*******************************************************************************/
static INPUT_PORTS_START( svip )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SLASH) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("GO")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Restore / Replay")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Hint / Human")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/CB")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Color / Video")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Verify/Setup")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COLON) PORT_NAME("Random / Autoclock")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("NG")
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Left / Next Best")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("Right / Autoplay")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Pawn / Level")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("Knight / Info / Echo")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Bishop / Easy / Moves")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Rook / Solvemate / Baud")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Queen / Sound / Game")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("King / Referee / Board")
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A 1")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B 2")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C 3")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D 4")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E 5")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F 6")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G 7")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H 8")
PORT_START("IN.3")
PORT_CONFNAME( 0x01, 0x00, "Keyboard Lock")
PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
PORT_CONFSETTING( 0x01, DEF_STR( On ) )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(svip_state, power_r)
PORT_START("POWER") // needs to be triggered for nvram to work
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, svip_state, power_off, 0) PORT_NAME("Power Off")
INPUT_PORTS_END
/*******************************************************************************
Machine Configs
*******************************************************************************/
void svip_state::svip(machine_config &config)
{
// basic machine hardware
HD6301Y0(config, m_maincpu, 9.8304_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &svip_state::main_map);
m_maincpu->nvram_enable_backup(true);
m_maincpu->standby_cb().set(m_maincpu, FUNC(hd6301y0_cpu_device::nvram_set_battery));
m_maincpu->standby_cb().append([this](int state) { if (state) m_lcd_pwm->clear(); });
m_maincpu->in_p2_cb().set(FUNC(svip_state::p2_r));
m_maincpu->out_p2_cb().set(FUNC(svip_state::p2_w));
m_maincpu->out_p5_cb().set(FUNC(svip_state::p5_w));
m_maincpu->out_p6_cb().set(FUNC(svip_state::p6_w));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
// video hardware
PWM_DISPLAY(config, m_lcd_pwm).set_size(4, 10);
m_lcd_pwm->output_x().set(FUNC(svip_state::lcd_pwm_w));
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_refresh_hz(60);
screen.set_size(1920/3, 591/3);
screen.set_visarea_full();
config.set_default_layout(layout_novag_svip);
// rs232 (configure after video)
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
// sound hardware
SPEAKER(config, "speaker").front_center();
DAC_2BIT_ONES_COMPLEMENT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.125);
}
/*******************************************************************************
ROM Definitions
*******************************************************************************/
ROM_START( nsvip ) // serial 7604xx
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD("novag_895_31y0rk75f", 0x0000, 0x4000, CRC(11a3894e) SHA1(fa455181043ac3ee89412aae563171d87ac55596) )
ROM_REGION( 0x8000, "eprom", 0 ) // ID = V3.7
ROM_LOAD("yellow", 0x4000, 0x4000, CRC(278e98f0) SHA1(a080e2300c90b6daf42fef960642885eb00ee607) ) // no label
ROM_CONTINUE( 0x0000, 0x4000 )
ROM_REGION( 50926, "screen", 0 )
ROM_LOAD("nprimo.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_END
ROM_START( nsvipa ) // serial 7569xx
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD("novag_895_31y0rk75f", 0x0000, 0x4000, CRC(11a3894e) SHA1(fa455181043ac3ee89412aae563171d87ac55596) )
ROM_REGION( 0x8000, "eprom", 0 ) // ID = V3.6
ROM_LOAD("v_117", 0x4000, 0x4000, CRC(2a60a474) SHA1(5dd0a1871fcbbb2a6271f284562a62f98bf9bf93) )
ROM_CONTINUE( 0x0000, 0x4000 )
ROM_REGION( 50926, "screen", 0 )
ROM_LOAD("nprimo.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_END
ROM_START( nsvipb ) // serial 7545xx
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD("novag_895_31y0rk75f", 0x0000, 0x4000, CRC(11a3894e) SHA1(fa455181043ac3ee89412aae563171d87ac55596) )
ROM_REGION( 0x8000, "eprom", 0 ) // I = V1.03
ROM_LOAD("sv_111", 0x4000, 0x4000, CRC(4be9a23f) SHA1(1fb8ccec112e485eedd899cbe8c0c2cb99e840a4) )
ROM_CONTINUE( 0x0000, 0x4000 )
ROM_REGION( 50926, "screen", 0 )
ROM_LOAD("nprimo.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_END
ROM_START( nsvipc ) // serial 7524xx
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD("novag_895_31y0rk75f", 0x0000, 0x4000, CRC(11a3894e) SHA1(fa455181043ac3ee89412aae563171d87ac55596) )
ROM_REGION( 0x8000, "eprom", 0 ) // I = V1.01
ROM_LOAD("s_vip_920", 0x4000, 0x4000, CRC(6f61b1e1) SHA1(df74a599eb59b113ef60c9fc23f9c603a5de4f9e) )
ROM_CONTINUE( 0x0000, 0x4000 )
ROM_REGION( 50926, "screen", 0 )
ROM_LOAD("nprimo.svg", 0, 50926, CRC(5ffa1b53) SHA1(8b1f862bfdf0be837a4e8dc94fea592d6ffff629) )
ROM_END
} // anonymous namespace
/*******************************************************************************
Drivers
*******************************************************************************/
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
SYST( 1989, nsvip, 0, 0, svip, svip, svip_state, empty_init, "Novag", "Super VIP (v3.7)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1989, nsvipa, nsvip, 0, svip, svip, svip_state, empty_init, "Novag", "Super VIP (v3.6)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1989, nsvipb, nsvip, 0, svip, svip, svip_state, empty_init, "Novag", "Super VIP (v1.03)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1989, nsvipc, nsvip, 0, svip, svip, svip_state, empty_init, "Novag", "Super VIP (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -12,7 +12,7 @@ NOTE: It triggers an NMI when the power switch is changed from ON to MEMORY.
If this is not done, NVRAM won't save properly.
TODO:
- if/when MAME supports an exit callback, hook up power-off NMI to that
- if/when MAME supports an exit callback, hook up power-off switch to that
- verify Concord II MCU speed, the only videos online (for hearing sound pitch)
are from the Tandy 1650 ones
@ -283,7 +283,7 @@ static INPUT_PORTS_START( enterp )
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("POWER")
PORT_START("POWER") // needs to be triggered for nvram to work
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, compan2_state, power_off, 0) PORT_NAME("Power Off")
INPUT_PORTS_END