microvsn: simplify cart_load, add notes to xml (nw)

This commit is contained in:
hap 2020-04-09 17:16:03 +02:00
parent 7e19c6214c
commit c2c1a8757b
5 changed files with 221 additions and 289 deletions

View File

@ -2,7 +2,9 @@
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0
-->
<!--
Cartridges(MCU+ROM) for Entex Select-A-Game Machine, note that the manual and
label calls one "Select-A-Game Cartridge" and not "Select-A-Game Machine Cartridge"
-->
@ -13,8 +15,8 @@ label calls one "Select-A-Game Cartridge" and not "Select-A-Game Machine Cartrid
<description>Baseball 4</description>
<year>1981</year>
<publisher>Entex</publisher>
<part name="cart" interface="sag_cart"> <!-- HD38800 MCU -->
<dataarea name="rom" size="0x2000">
<part name="cart" interface="sag_cart">
<dataarea name="rom" size="0x2000"> <!-- HD38800 MCU -->
<rom name="b-b5_hd38800a37" offset="0x0000" size="0x1000" crc="64852bd5" sha1="fb1c24ca43934ceb6fc35ac7c35b71e6e843dbc5" />
<rom offset="0x1e80" size="0x0100" loadflag="continue" />
</dataarea>
@ -25,8 +27,8 @@ label calls one "Select-A-Game Cartridge" and not "Select-A-Game Machine Cartrid
<description>Football 4</description>
<year>1981</year>
<publisher>Entex</publisher>
<part name="cart" interface="sag_cart"> <!-- TMS1670 MCU, die label TMS1400, MP7573 -->
<dataarea name="rom" size="0x1000">
<part name="cart" interface="sag_cart">
<dataarea name="rom" size="0x1000"> <!-- TMS1670 MCU, die label TMS1400, MP7573 -->
<rom name="ftba_mp7573" size="0x1000" crc="b17dd9e3" sha1="9c9e7a56643233ef2adff7b68a6df19e6ca176c2" />
</dataarea>
<dataarea name="rom:mpla" size="867">
@ -42,8 +44,8 @@ label calls one "Select-A-Game Cartridge" and not "Select-A-Game Machine Cartrid
<description>Pinball</description>
<year>1981</year>
<publisher>Entex</publisher>
<part name="cart" interface="sag_cart"> <!-- HD38800 MCU -->
<dataarea name="rom" size="0x2000">
<part name="cart" interface="sag_cart">
<dataarea name="rom" size="0x2000"> <!-- HD38800 MCU -->
<rom name="pinb_hd38800a38" offset="0x0000" size="0x1000" crc="6e53a56b" sha1="13f057eab2e4cfbb3ef1247a041abff15ae727c9" />
<rom offset="0x1e80" size="0x0100" loadflag="continue" />
</dataarea>
@ -54,8 +56,8 @@ label calls one "Select-A-Game Cartridge" and not "Select-A-Game Machine Cartrid
<description>Space Invader 2</description>
<year>1981</year>
<publisher>Entex</publisher>
<part name="cart" interface="sag_cart"> <!-- HD38800 MCU -->
<dataarea name="rom" size="0x2000">
<part name="cart" interface="sag_cart">
<dataarea name="rom" size="0x2000"> <!-- HD38800 MCU -->
<rom name="inv2_hd38800a31" offset="0x0000" size="0x1000" crc="29c8c100" sha1="41cd413065659c6d7d5b2408de2ca6d51c49629a" status="baddump" />
<rom offset="0x1e80" size="0x0100" loadflag="continue" />
</dataarea>

View File

@ -3,32 +3,44 @@
<!--
license:CC0
-->
<softwarelist name="microvision" description="Milton Bradley MicroVision cartridges">
<!--
The following board types are known to exist:
4952 REV-A - used for tms1100 games, 2 varations exist, one with and one without paddle circuitry
4952-79 REV-B - used for tms1100 games, 2 variations exists, one with and one without paddle circuitry
4971-REV-C - used for i8021 based game(s). Found in Connect Four
7924952D02 - used for shrink DIP version of the tms1100. Found in Super Blockbuster
The "pcb" feature is used to indicate the board type
The "paddle" feature is used to indicate whether there is paddle circuitry on the board
The "rc" feature is used to indicate the source of the clock signal
<!--
All known games are dumped, see below for list (chronological order)
One more game "Barrage" was announced but not released.
4952 - Block Buster
4971 - Connect Four (TMS1100 and I8021 versions)
4972 - Bowling
4973 - Star Trek: Phaser Strike (aka Shooting Star in Europe)
4974 - Pinball
4975 - Vegas Slots
4976 - Mindbuster
4063 - Baseball
4064 - Sea Duel
4176 - Alien Raiders (aka Space Blitz or Blitz in Europe)
4177 - Cosmic Hunter
4241 - Super Block Buster
The "clock" feature is used to indicate MCU clock frequency
The "pla" feature is for TMS1100 output PLA type
The "paddle" feature is used to indicate whether there is paddle circuitry on the PCB
-->
<softwarelist name="microvision" description="Milton Bradley MicroVision cartridges">
<software name="alienrdr">
<description>Alien Raiders</description>
<year>1981</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="M34009" />
<info name="pcb" value="4952-79 REV-B" />
<info name="serial" value="4176" />
<part name="cart" interface="microvision_cart">
<feature name="clock" value="500000" /> <!-- RC = 100pf/23.2K -->
<feature name="pla" value="1" />
<feature name="pcb" value="4952-79 REV-B" />
<feature name="paddle" value="yes" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="m34009-n1" size="2048" crc="b1632712" sha1="515040a3bf6386590c025e12a9512c98efdd7e1e"/>
<feature name="paddle" value="1" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="m34009-n1" size="0x800" crc="b1632712" sha1="515040a3bf6386590c025e12a9512c98efdd7e1e"/>
</dataarea>
</part>
</software>
@ -37,28 +49,30 @@ The "rc" feature is used to indicate the source of the clock signal
<description>Baseball</description>
<year>1980</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3479" />
<info name="pcb" value="4952-79 REV-B" />
<info name="serial" value="4063" />
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952-79 REV-B" />
<feature name="paddle" value="yes" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="mp3479-n1nll_4063" size="2048" crc="40e3327a" sha1="c1b52a081c7fe6a51c5cfe41a4d446f1f8cfe24e"/>
<feature name="clock" value="500000" /> <!-- RC = 100pf/23.2K -->
<feature name="pla" value="0" />
<feature name="paddle" value="1" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="mp3479-n1nll_4063" size="0x800" crc="40e3327a" sha1="c1b52a081c7fe6a51c5cfe41a4d446f1f8cfe24e"/>
</dataarea>
</part>
</software>
<software name="blckbstr">
<description>Blockbuster</description>
<description>Block Buster</description>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3450A" />
<info name="pcb" value="4952 REV-A" />
<info name="serial" value="4952" /> <!-- pack-in game, serial of MicroVision console -->
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952 REV-A" />
<feature name="paddle" value="yes" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="mp3450a" size="2048" crc="fd18ea6d" sha1="30203278d7f2b0817e59bdf7e451be2d64a90f5a"/>
<feature name="clock" value="500000" /> <!-- RC = 100pf/23.2K -->
<feature name="pla" value="0" />
<feature name="paddle" value="1" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU, die label 1100B, MP3450A -->
<rom name="mp3450a" size="0x800" crc="fd18ea6d" sha1="30203278d7f2b0817e59bdf7e451be2d64a90f5a"/>
</dataarea>
</part>
</software>
@ -67,45 +81,45 @@ The "rc" feature is used to indicate the source of the clock signal
<description>Bowling</description>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3475" />
<info name="pcb" value="4952-79 REV-B" /> <!-- also seen with 4952 REV-A -->
<info name="serial" value="4972" />
<part name="cart" interface="microvision_cart">
<!-- also seen with 4952 REV-A -->
<feature name="clock" value="500000" /> <!-- RC = 100pf/23.2K -->
<feature name="pla" value="1" />
<feature name="pcb" value="4952-79 REV-B" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="mp3475nll_4972" size="2048" crc="460ac30e" sha1="93ffb75b82d1f48f451e0e1158d5a8d1cd465fe5"/>
<feature name="paddle" value="0" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU, die label 1100E, MP3475 -->
<rom name="mp3475nll_4972" size="0x800" crc="460ac30e" sha1="93ffb75b82d1f48f451e0e1158d5a8d1cd465fe5"/>
</dataarea>
</part>
</software>
<software name="connect4">
<description>Connect Four (8021)</description>
<description>Connect Four (8021 version)</description>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3481" />
<info name="pcb" value="4971-REV-C" />
<info name="serial" value="4971" />
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4971-REV-C" />
<feature name="paddle" value="yes" />
<dataarea name="rom" size="1024">
<!-- 8021 on cart has no label -->
<rom name="connect4.bin" size="1024" crc="bdd8660b" sha1="971f9117dc809f7b9796134208b47ea34990ae71"/>
<feature name="clock" value="2000000" /> <!-- LC -->
<feature name="paddle" value="1" />
<dataarea name="rom" size="0x400"> <!-- I8021 MCU -->
<rom name="4971" size="0x400" crc="bdd8660b" sha1="971f9117dc809f7b9796134208b47ea34990ae71"/>
</dataarea>
</part>
</software>
<software name="connect4t" cloneof="connect4">
<description>Connect Four (TMS1100)</description>
<description>Connect Four (TMS1100 version)</description>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3481" />
<info name="pcb" value="4952-79 REV-B" /> <!-- correct? -->
<info name="serial" value="4971" />
<part name="cart" interface="microvision_cart">
<feature name="clock" value="500000" /> <!-- correct? -->
<feature name="pla" value="1" />
<feature name="pcb" value="4952-79 REV-B" /> <!-- correct? -->
<feature name="paddle" value="yes" />
<dataarea name="rom" size="2048">
<rom name="connect4t.bin" size="2048" crc="6a4cf60b" sha1="e93d848784205ab49234ad26718e04d267b776ed"/>
<feature name="paddle" value="1" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="mp3481" size="0x800" crc="6a4cf60b" sha1="e93d848784205ab49234ad26718e04d267b776ed"/>
</dataarea>
</part>
</software>
@ -114,14 +128,14 @@ The "rc" feature is used to indicate the source of the clock signal
<description>Cosmic hunter</description>
<year>1981</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="M34017" />
<info name="pcb" value="4952-79 REV-B" />
<info name="serial" value="4177" />
<part name="cart" interface="microvision_cart">
<feature name="clock" value="500000" /> <!-- RC = 100pf/23.2K -->
<feature name="pla" value="1" />
<feature name="pcb" value="4952-79 REV-B" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="m34017-n1" size="2048" crc="d8ba1377" sha1="a8dabd296aefc46849db2b7d2d8e0de7c77b5b38"/>
<feature name="paddle" value="0" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="m34017-n1" size="0x800" crc="d8ba1377" sha1="a8dabd296aefc46849db2b7d2d8e0de7c77b5b38"/>
</dataarea>
</part>
</software>
@ -130,43 +144,46 @@ The "rc" feature is used to indicate the source of the clock signal
<description>Mindbuster</description>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3457" />
<info name="pcb" value="4952 REV-A" />
<info name="serial" value="4976" />
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952 REV-A" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/21.0K" />
<dataarea name="rom" size="2048">
<rom name="mp3457nll_4976" size="2048" crc="d5dc1f7d" sha1="9e53bd7e9b718ced3bffbdd50cf9ea1547183ea3"/>
<feature name="clock" value="550000" /> <!-- RC = 100pf/21.0K -->
<feature name="pla" value="0" />
<feature name="paddle" value="0" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="mp3457nll_4976" size="0x800" crc="d5dc1f7d" sha1="9e53bd7e9b718ced3bffbdd50cf9ea1547183ea3"/>
</dataarea>
</part>
</software>
<software name="phsrstrk">
<description>Star Trek Phaser Strike</description>
<description>Star Trek: Phaser Strike</description>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3454" />
<info name="pcb" value="4952-79 REV-B" />
<info name="serial" value="4973" />
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952-79 REV-B" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/21.0K" />
<dataarea name="rom" size="2048">
<rom name="mp3454" size="2048" crc="c7768d04" sha1="e477d49fc835649164cff5ed158ee31dcf244efc"/>
<feature name="clock" value="550000" /> <!-- RC = 100pf/21.0K -->
<feature name="pla" value="0" />
<feature name="paddle" value="0" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="mp3454" size="0x800" crc="c7768d04" sha1="e477d49fc835649164cff5ed158ee31dcf244efc"/>
</dataarea>
</part>
</software>
<software name="pinball">
<description>Pinball</description>
<year>1980</year>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3455" />
<info name="pcb" value="4952-79 REV-B" />
<info name="serial" value="4974" />
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952-79 REV-B" />
<feature name="paddle" value="yes" />
<feature name="rc" value="100pf/21.0K" />
<dataarea name="rom" size="2048">
<rom name="mp3455nll_4974" size="2048" crc="906544ea" sha1="7ba8460369e1bb0708b0ef076342774059fd03d2"/>
<feature name="clock" value="550000" /> <!-- RC = 100pf/21.0K -->
<feature name="pla" value="0" />
<feature name="paddle" value="1" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU, die label 1100E, MP3455 -->
<rom name="mp3455nll_4974" size="0x800" crc="906544ea" sha1="7ba8460369e1bb0708b0ef076342774059fd03d2"/>
</dataarea>
</part>
</software>
@ -175,30 +192,30 @@ The "rc" feature is used to indicate the source of the clock signal
<description>Sea Duel</description>
<year>1980</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3496" />
<info name="pcb" value="4952-79 REV-B" />
<info name="serial" value="4064" />
<part name="cart" interface="microvision_cart">
<feature name="clock" value="300000" /> <!-- RC = 100pf/39.4K -->
<feature name="pla" value="1" />
<feature name="pcb" value="4952-79 REV-B" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/39.4K" />
<dataarea name="rom" size="2048">
<rom name="mp3496-n1_4064" size="2048" crc="77a8f71b" sha1="1f95ecf3b1ec6a17db92e1ae903be269aa0b47d8"/>
<feature name="paddle" value="0" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="mp3496-n1_4064" size="0x800" crc="77a8f71b" sha1="1f95ecf3b1ec6a17db92e1ae903be269aa0b47d8"/>
</dataarea>
</part>
</software>
<software name="sprblock">
<description>Super Blockbuster</description>
<description>Super Block Buster</description>
<year>1982</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="M34047" />
<info name="pcb" value="7924952D02" />
<info name="serial" value="4241" />
<part name="cart" interface="microvision_cart">
<feature name="clock" value="500000" /> <!-- RC = 100pf/23.2K -->
<feature name="pla" value="1" />
<feature name="pcb" value="7924952D02" />
<feature name="paddle" value="yes" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="m34047-n2ll_4241" size="2048" crc="796660e3" sha1="1b758369849cc7dea3918774244f747895607377"/>
<feature name="paddle" value="1" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU -->
<rom name="m34047-n2ll_4241" size="0x800" crc="796660e3" sha1="1b758369849cc7dea3918774244f747895607377"/>
</dataarea>
</part>
</software>
@ -207,30 +224,29 @@ The "rc" feature is used to indicate the source of the clock signal
<description>Vegas Slots</description>
<year>1979</year>
<publisher>Milton Bradley</publisher>
<info name="serial" value="MP3474" />
<info name="pcb" value="4952 REV-A" />
<info name="serial" value="4975" />
<part name="cart" interface="microvision_cart">
<feature name="clock" value="500000" /> <!-- RC = 100pf/23.2K -->
<feature name="pla" value="1" />
<feature name="pcb" value="4952 REV-A" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="mp3474nll_4975" size="2048" crc="4500c1d9" sha1="d49522dbe265e71b86488b5533d01bc9050811c9"/>
<feature name="paddle" value="0" />
<dataarea name="rom" size="0x800"> <!-- TMS1100 MCU, die label 1100E, MP3474 -->
<rom name="mp3474nll_4975" size="0x800" crc="4500c1d9" sha1="d49522dbe265e71b86488b5533d01bc9050811c9"/>
</dataarea>
</part>
</software>
<!-- Homebrew -->
<!-- Homebrew (emulator-only, untested on real console) -->
<software name="bomber">
<description>Bomber</description>
<year>2014</year>
<publisher>Paul Robson</publisher>
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952 REV-A" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="bomber.bin" size="2048" crc="badbd0f8" sha1="3c31c24b58b1d6ac1c7313b690ec796cc5010cb7"/>
<feature name="clock" value="500000" />
<dataarea name="rom" size="0x800">
<rom name="bomber.bin" size="0x800" crc="badbd0f8" sha1="3c31c24b58b1d6ac1c7313b690ec796cc5010cb7"/>
</dataarea>
</part>
</software>
@ -240,11 +256,9 @@ The "rc" feature is used to indicate the source of the clock signal
<year>2013</year>
<publisher>Paul Robson</publisher>
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952 REV-A" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="demo.bin" size="2048" crc="54f1b288" sha1="9fcd930dff5f09979d3ed1278a928330b7000068"/>
<feature name="clock" value="500000" />
<dataarea name="rom" size="0x800">
<rom name="demo.bin" size="0x800" crc="54f1b288" sha1="9fcd930dff5f09979d3ed1278a928330b7000068"/>
</dataarea>
</part>
</software>
@ -254,11 +268,9 @@ The "rc" feature is used to indicate the source of the clock signal
<year>2014</year>
<publisher>Paul Robson</publisher>
<part name="cart" interface="microvision_cart">
<feature name="pcb" value="4952 REV-A" />
<feature name="paddle" value="no" />
<feature name="rc" value="100pf/23.2K" />
<dataarea name="rom" size="2048">
<rom name="invaders.bin" size="2048" crc="d520ff6e" sha1="c979d7004fc205ee050045f13e2d6f2c31e2083e"/>
<feature name="clock" value="500000" />
<dataarea name="rom" size="0x800">
<rom name="invaders.bin" size="0x800" crc="d520ff6e" sha1="c979d7004fc205ee050045f13e2d6f2c31e2083e"/>
</dataarea>
</part>
</software>

View File

@ -88,7 +88,7 @@
@MP3415 TMS1100 1978, Coleco Electronic Quarterback
@MP3435 TMS1100 1979, Coleco Zodiac
@MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command
MP3450A TMS1100 1979, MicroVision cartridge: Blockbuster
MP3450A TMS1100 1979, MicroVision cartridge: Block Buster
MP3454 TMS1100 1979, MicroVision cartridge: Star Trek Phaser Strike
MP3455 TMS1100 1980, MicroVision cartridge: Pinball
MP3457 TMS1100 1979, MicroVision cartridge: Mindbuster

View File

@ -1,18 +1,29 @@
// license:BSD-3-Clause
// copyright-holders:Wilbert Pol
// thanks-to:Kevin Horton, Sean Riddle
/***************************************************************************
Milton Bradley MicroVision
Milton Bradley MicroVision, handheld game console
To Do:
* Add support for the paddle control
* Finish support for i8021 based cartridges
Hardware notes:
- SCUS0488(Hughes HLCD0488) LCD, 16*16 screen
- piezo, 12 buttons under membrane + analog dial
- no CPU on console, it is on the cartridge
12 games were released, all of them have a TMS1100 MCU, with the exception
of Connect Four which has a TMS1100 version and I8021 version.
Since the microcontrollers were on the cartridges it was possible to have
different clocks on different games.
The Connect Four I8021 game is clocked at around 2MHz. The TMS1100 versions
of the games were clocked at around 500KHz, 550KHz, or 300KHz.
Each game came with a screen- and keypad overlay, MAME artwork is recommended.
TODO:
- Add support for the paddle control
- Finish support for i8021 based cartridges
****************************************************************************/
#include "emu.h"
@ -76,34 +87,6 @@ private:
DECLARE_WRITE16_MEMBER(tms1100_write_r);
u32 tms1100_decode_micro(offs_t offset);
// enums
enum cpu_type
{
CPU_TYPE_I8021,
CPU_TYPE_TMS1100
};
enum pcb_type
{
PCB_TYPE_4952_REV_A,
PCB_TYPE_4952_9_REV_B,
PCB_TYPE_4971_REV_C,
PCB_TYPE_7924952D02,
PCB_TYPE_UNKNOWN
};
enum rc_type
{
RC_TYPE_100PF_21_0K,
RC_TYPE_100PF_23_2K,
RC_TYPE_100PF_39_4K,
RC_TYPE_UNKNOWN
};
cpu_type m_cpu_type;
pcb_type m_pcb_type;
rc_type m_rc_type;
required_device<dac_byte_interface> m_dac;
optional_device<i8021_device> m_i8021;
optional_device<tms1100_cpu_device> m_tms1100;
@ -124,7 +107,8 @@ private:
// generic variables
void update_lcd();
void lcd_write(uint8_t control, uint8_t data);
bool m_pla;
int m_pla;
bool m_paddle;
uint8_t m_lcd_latch[8];
uint8_t m_lcd_holding_latch[8];
@ -510,119 +494,49 @@ u32 microvision_state::tms1100_decode_micro(offs_t offset)
DEVICE_IMAGE_LOAD_MEMBER(microvision_state::cart_load)
{
uint8_t *rom1 = memregion("i8021_cpu")->base();
uint8_t *rom2 = memregion("tms1100_cpu")->base();
uint32_t file_size = m_cart->common_get_size("rom");
u32 size = m_cart->common_get_size("rom");
if ( file_size != 1024 && file_size != 2048 )
if (size != 0x400 && size != 0x800)
{
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid rom file size");
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid ROM file size");
return image_init_result::FAIL;
}
// Set default settings
m_pcb_type = microvision_state::PCB_TYPE_UNKNOWN;
m_rc_type = microvision_state::RC_TYPE_UNKNOWN;
m_pla = 0;
m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
// Read cartridge
if (!image.loaded_through_softlist())
// set default settings
u32 clock = (size == 0x400) ? 2000000 : 500000;
m_pla = 0;
m_paddle = false;
if (image.loaded_through_softlist())
{
if (image.fread(rom1, file_size) != file_size)
{
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file");
return image_init_result::FAIL;
}
// MCU clock
u32 sclock = strtoul(image.get_feature("clock"), nullptr, 0);
if (sclock != 0)
clock = sclock;
// output PLA type (TMS1100 only)
m_pla = strtoul(image.get_feature("pla"), nullptr, 0) ? 1 : 0;
// PCB has paddle circuit
m_paddle = bool(strtoul(image.get_feature("paddle"), nullptr, 0) ? 1 : 0);
}
// detect MCU on file size
if (size == 0x400)
{
// I8021 MCU
memcpy(memregion("i8021_cpu")->base(), m_cart->get_rom_base(), size);
m_i8021->set_clock(clock);
}
else
{
// Copy rom contents
memcpy(rom1, image.get_software_region("rom"), file_size);
// Get PLA type
const char *pla = image.get_feature("pla");
if (pla)
m_pla = 1;
// TMS1100 MCU
memcpy(memregion("tms1100_cpu")->base(), m_cart->get_rom_base(), size);
m_tms1100->set_clock(clock);
m_tms1100->set_output_pla(microvision_output_pla[m_pla]);
// Detect settings for PCB type
const char *pcb = image.get_feature("pcb");
if (pcb)
{
static const struct { const char *pcb_name; microvision_state::pcb_type pcbtype; } pcb_types[] =
{
{ "4952 REV-A", microvision_state::PCB_TYPE_4952_REV_A },
{ "4952-79 REV-B", microvision_state::PCB_TYPE_4952_9_REV_B },
{ "4971-REV-C", microvision_state::PCB_TYPE_4971_REV_C },
{ "7924952D02", microvision_state::PCB_TYPE_7924952D02 }
};
for (int i = 0; i < ARRAY_LENGTH(pcb_types) && m_pcb_type == microvision_state::PCB_TYPE_UNKNOWN; i++)
{
if (!core_stricmp(pcb, pcb_types[i].pcb_name))
{
m_pcb_type = pcb_types[i].pcbtype;
}
}
}
// Detect settings for RC types
const char *rc = image.get_feature("rc");
if (rc)
{
static const struct { const char *rc_name; microvision_state::rc_type rctype; } rc_types[] =
{
{ "100pf/21.0K", microvision_state::RC_TYPE_100PF_21_0K },
{ "100pf/23.2K", microvision_state::RC_TYPE_100PF_23_2K },
{ "100pf/39.4K", microvision_state::RC_TYPE_100PF_39_4K }
};
for (int i = 0; i < ARRAY_LENGTH(rc_types) && m_rc_type == microvision_state::RC_TYPE_UNKNOWN; i++)
{
if (!core_stricmp(rc, rc_types[i].rc_name))
{
m_rc_type = rc_types[i].rctype;
}
}
}
}
// Mirror rom data to tms1100_cpu region
memcpy(rom2, rom1, file_size);
// Based on file size select cpu:
// - 1024 -> I8021
// - 2048 -> TI TMS1100
switch (file_size)
{
case 1024:
m_cpu_type = microvision_state::CPU_TYPE_I8021;
m_i8021->set_clock(2000000);
break;
case 2048:
m_cpu_type = microvision_state::CPU_TYPE_TMS1100;
switch (m_rc_type)
{
case RC_TYPE_100PF_21_0K:
m_tms1100->set_clock(550000);
break;
case RC_TYPE_100PF_23_2K:
case RC_TYPE_UNKNOWN: // Default to most occurring setting
m_tms1100->set_clock(500000);
break;
case RC_TYPE_100PF_39_4K:
m_tms1100->set_clock(300000);
break;
}
break;
}
return image_init_result::PASS;
@ -700,11 +614,11 @@ void microvision_state::microvision(machine_config &config)
ROM_START( microvsn )
// nothing here yet, ROM is on the cartridge
ROM_REGION( 0x800, "i8021_cpu", ROMREGION_ERASE00 )
ROM_REGION( 0x400, "i8021_cpu", ROMREGION_ERASE00 )
ROM_REGION( 0x800, "tms1100_cpu", ROMREGION_ERASE00 )
ROM_REGION( 867, "tms1100_cpu:mpla", ROMREGION_ERASE00 )
ROM_REGION( 365, "tms1100_cpu:opla", ROMREGION_ERASE00 )
ROM_END
CONS( 1979, microvsn, 0, 0, microvision, microvision, microvision_state, empty_init, "Milton Bradley", "MicroVision", MACHINE_NOT_WORKING )
CONS( 1979, microvsn, 0, 0, microvision, microvision, microvision_state, empty_init, "Milton Bradley", "MicroVision", MACHINE_NOT_WORKING | MACHINE_REQUIRES_ARTWORK )

View File

@ -103,41 +103,9 @@ void sag_state::machine_start()
/******************************************************************************
I/O
Cartridge Init
******************************************************************************/
// main unit
void sag_state::update_display()
{
// grid 0-7 are the 'pixels'
m_display->matrix_partial(0, 8, m_grid, m_plate, false);
// grid 8-13 are 7segs
u8 seg = bitswap<7>(m_plate,4,5,6,7,8,9,10);
m_display->matrix_partial(8, 6, m_grid >> 8, seg);
}
u8 sag_state::input_r()
{
u8 data = 0;
// grid 1-6 double as input mux
for (int i = 0; i < 6; i++)
if (BIT(m_grid, i + 1))
data |= m_inputs[i]->read();
return data;
}
void sag_state::speaker_w(int state)
{
m_speaker->level_w(state);
}
// cartridge loading
DEVICE_IMAGE_LOAD_MEMBER(sag_state::cart_load)
{
u32 size = m_cart->common_get_size("rom");
@ -151,6 +119,7 @@ DEVICE_IMAGE_LOAD_MEMBER(sag_state::cart_load)
m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
// detect MCU on file size
if (size == 0x1000)
{
// TMS1670 MCU
@ -200,6 +169,41 @@ DEVICE_IMAGE_LOAD_MEMBER(sag_state::cart_load)
}
/******************************************************************************
I/O
******************************************************************************/
// main unit
void sag_state::update_display()
{
// grid 0-7 are the 'pixels'
m_display->matrix_partial(0, 8, m_grid, m_plate, false);
// grid 8-13 are 7segs
u8 seg = bitswap<7>(m_plate,4,5,6,7,8,9,10);
m_display->matrix_partial(8, 6, m_grid >> 8, seg);
}
u8 sag_state::input_r()
{
u8 data = 0;
// grid 1-6 double as input mux
for (int i = 0; i < 6; i++)
if (BIT(m_grid, i + 1))
data |= m_inputs[i]->read();
return data;
}
void sag_state::speaker_w(int state)
{
m_speaker->level_w(state);
}
// cartridge type 1: HD38800
WRITE8_MEMBER(sag_state::hmcs40_write_r)