summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-07-24 13:14:26 +0200
committer hap <happppp@users.noreply.github.com>2021-07-24 13:14:52 +0200
commitf349322b99831dad28d82d69fd75ccd8fd5fc943 (patch)
treebaf6b28937b2c9e10fadeda736dc2966317cffea
parentd6b13e5bfa33ac259e3293cbcd49afba25432ffe (diff)
New working machines
-------------------- Palmtronic F-31 [hap, Sean Riddle]
-rw-r--r--src/mame/drivers/hh_tms1k.cpp213
-rw-r--r--src/mame/layout/palmf31.lay30
-rw-r--r--src/mame/layout/palmmd8.lay (renamed from src/mame/layout/cmulti8.lay)0
-rw-r--r--src/mame/mame.lst3
4 files changed, 226 insertions, 20 deletions
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index 73ac4796edc..e23d392d94f 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -155,7 +155,9 @@ ROM source notes when dumped from another publisher, but confident it's the same
- gjackpot: Entex Electronic Jackpot: Gin Rummy & Black Jack
- gpoker: Entex Electronic Poker
- matchnum: LJN Electronic Concentration
+- palmf31: Toshiba BC-8018B
- ti1250: Texas Instruments TI-1200
+- ti25503: Texas Instruments TI-1265
TODO:
- verify output PLA and microinstructions PLA for MCUs that have been dumped
@@ -205,7 +207,6 @@ TODO:
#include "bigtrak.lh"
#include "bship.lh" // clickable
#include "cmsport.lh"
-#include "cmulti8.lh"
#include "cnbaskb.lh"
#include "cnfball.lh"
#include "cnfball2.lh"
@@ -248,6 +249,8 @@ TODO:
#include "merlin.lh" // clickable
#include "mmerlin.lh" // clickable
#include "monkeysee.lh"
+#include "palmf31.lh"
+#include "palmmd8.lh"
#include "pbmastm.lh"
#include "phpball.lh"
#include "qfire.lh" // clickable
@@ -953,21 +956,192 @@ ROM_END
/***************************************************************************
- Canon Multi 8 (Palmtronic MD-8) / Canon Canola MD 810
+ Canon Palmtronic F-31, Canon Canola L813, Toshiba BC-8111B, Toshiba BC-8018B,
+ Triumph-Adler 81 SN, Silver-Reed 8J, more
+ * TMS1040 MCU label TMS1045NL (die label 1040A, 1045)
+ * 9-digit cyan VFD display (leftmost may be custom)
+
+ TMS1045NL is a versatile calculator chip for 3rd party manufacturers, used
+ by Canon, Toshiba, and several smaller companies. It doesn't look like it
+ was used in any TI calculator. It was up to the manufacturer to choose which
+ functions(keys) to leave out.
+
+***************************************************************************/
+
+class palmf31_state : public hh_tms1k_state
+{
+public:
+ palmf31_state(const machine_config &mconfig, device_type type, const char *tag) :
+ hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void palmf31(machine_config &config);
+
+private:
+ void update_display();
+ void write_o(u16 data);
+ void write_r(u16 data);
+ u8 read_k();
+};
+
+// handlers
+
+void palmf31_state::update_display()
+{
+ m_display->matrix(m_r, m_o);
+}
+
+void palmf31_state::write_r(u16 data)
+{
+ // R0-R8: select digit, input mux
+ m_r = m_inp_mux = data;
+ update_display();
+}
+
+void palmf31_state::write_o(u16 data)
+{
+ // O0-O7: digit segments
+ m_o = data;
+ update_display();
+}
+
+u8 palmf31_state::read_k()
+{
+ // K: multiplexed inputs, one of the columns is K2+K8
+ u8 data = read_inputs(9);
+ if (data & 1)
+ data = (data & 0xe) | 0xa;
+
+ // switches are on K1
+ if (m_inp_mux & m_inputs[9]->read())
+ data |= 1;
+
+ return data;
+}
+
+// config
+
+static INPUT_PORTS_START( palmf31 )
+ PORT_START("IN.0") // R0
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M+") // add to memory
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change
+
+ PORT_START("IN.1") // R1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("M-") // subtract from memory
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") // reverse
+
+ PORT_START("IN.2") // R2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as M+
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as sqrt
+
+ PORT_START("IN.3") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("1/x")
+
+ PORT_START("IN.4") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT)
+
+ PORT_START("IN.5") // R5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME(UTF8_SMALL_PI)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2)
+
+ PORT_START("IN.6") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("RM/CM") // combined function (press twice)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory
+
+ PORT_START("IN.7") // R7
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE)
+
+ PORT_START("IN.8") // R8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("C") // clear (all)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME(UTF8_LEFT)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("CI") // clear indicator
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("CI/C") // combined function (press twice)
+
+ PORT_START("IN.9") // K1
+ PORT_CONFNAME( 0x1f, 0x00, "DP" ) // display point
+ PORT_CONFSETTING( 0x02, "+" )
+ PORT_CONFSETTING( 0x01, "0" )
+ PORT_CONFSETTING( 0x04, "2" )
+ PORT_CONFSETTING( 0x08, "3" )
+ PORT_CONFSETTING( 0x10, "4" )
+ PORT_CONFSETTING( 0x00, "F" )
+ PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_CONFNAME( 0x100, 0x000, "AM" ) // accumulate memory
+ PORT_CONFSETTING( 0x000, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x100, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void palmf31_state::palmf31(machine_config &config)
+{
+ /* basic machine hardware */
+ TMS1040(config, m_maincpu, 250000); // approximation
+ m_maincpu->k().set(FUNC(palmf31_state::read_k));
+ m_maincpu->o().set(FUNC(palmf31_state::write_o));
+ m_maincpu->r().set(FUNC(palmf31_state::write_r));
+
+ /* video hardware */
+ PWM_DISPLAY(config, m_display).set_size(9, 8);
+ m_display->set_segmask(0x1ff, 0xff);
+ config.set_default_layout(layout_palmf31);
+
+ /* no sound! */
+}
+
+// roms
+
+ROM_START( palmf31 )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "tms1045nl", 0x0000, 0x0400, CRC(0c42d43e) SHA1(b76d404623e3abfd0b237ee1c0b46e83f96ceb78) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_palmf31_micro.pla", 0, 867, CRC(639cbc13) SHA1(a96152406881bdfc7ddc542cf4b478525c8b0e23) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_palmf31_output.pla", 0, 365, CRC(bc295ea6) SHA1(7e7c9ed0c1e5e37173dd8f297473516c410bca8c) )
+ROM_END
+
+
+
+
+
+/***************************************************************************
+
+ Canon Palmtronic MD-8 (Multi 8) / Canon Canola MD 810
* TMS1070 MCU label TMC1079 (die label 1070B, 1079A)
* 2-line cyan VFD display, each 9-digit 7seg + 1 custom (label 20-ST-22)
* PCB label Canon EHI-0115-03
+ The only difference between MD-8 and MD 810 is the form factor. The latter
+ is a tabletop calculator.
+
***************************************************************************/
-class cmulti8_state : public hh_tms1k_state
+class palmmd8_state : public hh_tms1k_state
{
public:
- cmulti8_state(const machine_config &mconfig, device_type type, const char *tag) :
+ palmmd8_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_tms1k_state(mconfig, type, tag)
{ }
- void cmulti8(machine_config &config);
+ void palmmd8(machine_config &config);
private:
void update_display();
@@ -978,7 +1152,7 @@ private:
// handlers
-void cmulti8_state::update_display()
+void palmmd8_state::update_display()
{
// M-digit is on in memory mode, upper row is off in single mode
u32 m = (m_inputs[10]->read() & 0x10) ? 0x100000 : 0;
@@ -989,21 +1163,21 @@ void cmulti8_state::update_display()
m_display->matrix((sel & mask) | m, m_o);
}
-void cmulti8_state::write_r(u16 data)
+void palmmd8_state::write_r(u16 data)
{
// R0-R10: input mux, select digit
m_r = m_inp_mux = data;
update_display();
}
-void cmulti8_state::write_o(u16 data)
+void palmmd8_state::write_o(u16 data)
{
// O0-O7: digit segments
m_o = bitswap<8>(data,0,4,5,6,7,1,2,3);
update_display();
}
-u8 cmulti8_state::read_k()
+u8 palmmd8_state::read_k()
{
// K: multiplexed inputs
return read_inputs(11);
@@ -1011,7 +1185,7 @@ u8 cmulti8_state::read_k()
// config
-static INPUT_PORTS_START( cmulti8 )
+static INPUT_PORTS_START( palmmd8 )
PORT_START("IN.0") // R0
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-")
@@ -1084,32 +1258,32 @@ static INPUT_PORTS_START( cmulti8 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-void cmulti8_state::cmulti8(machine_config &config)
+void palmmd8_state::palmmd8(machine_config &config)
{
/* basic machine hardware */
TMS1070(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=68pf
- m_maincpu->k().set(FUNC(cmulti8_state::read_k));
- m_maincpu->o().set(FUNC(cmulti8_state::write_o));
- m_maincpu->r().set(FUNC(cmulti8_state::write_r));
+ m_maincpu->k().set(FUNC(palmmd8_state::read_k));
+ m_maincpu->o().set(FUNC(palmmd8_state::write_o));
+ m_maincpu->r().set(FUNC(palmmd8_state::write_r));
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(21, 8);
m_display->set_segmask(0xfffff, 0xff);
- config.set_default_layout(layout_cmulti8);
+ config.set_default_layout(layout_palmmd8);
/* no sound! */
}
// roms
-ROM_START( cmulti8 )
+ROM_START( palmmd8 )
ROM_REGION( 0x0400, "maincpu", 0 )
ROM_LOAD( "tmc1079nl", 0x0000, 0x0400, CRC(202c5ed8) SHA1(0143975cac20cb4a4e9f659ca0535e8a9056f5bb) )
ROM_REGION( 867, "maincpu:mpla", 0 )
ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
ROM_REGION( 365, "maincpu:opla", 0 )
- ROM_LOAD( "tms1000_cmulti8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) )
+ ROM_LOAD( "tms1000_palmmd8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) )
ROM_END
@@ -10267,7 +10441,7 @@ INPUT_PORTS_END
void ti25503_state::ti25503(machine_config &config)
{
/* basic machine hardware */
- TMS1000(config, m_maincpu, 250000); // approximation
+ TMS1040(config, m_maincpu, 250000); // approximation
m_maincpu->k().set(FUNC(ti25503_state::read_k));
m_maincpu->o().set(FUNC(ti25503_state::write_o));
m_maincpu->r().set(FUNC(ti25503_state::write_r));
@@ -12849,7 +13023,8 @@ COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, emp
CONS( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // ***
-COMP( 1977, cmulti8, 0, 0, cmulti8, cmulti8, cmulti8_state, empty_init, "Canon", "Multi 8 (Canon)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+COMP( 1977, palmf31, 0, 0, palmf31, palmf31, palmf31_state, empty_init, "Canon", "Palmtronic F-31", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
+COMP( 1977, palmmd8, 0, 0, palmmd8, palmmd8, palmmd8_state, empty_init, "Canon", "Palmtronic MD-8", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
CONS( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // ***
COMP( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac - The Astrology Computer", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/layout/palmf31.lay b/src/mame/layout/palmf31.lay
new file mode 100644
index 00000000000..51d48d850bc
--- /dev/null
+++ b/src/mame/layout/palmf31.lay
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+-->
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="0" right="90" top="0" bottom="15" />
+
+ <element name="digit8" ref="digit"><bounds x="0" y="0" width="10" height="15" /></element>
+ <element name="digit7" ref="digit"><bounds x="10" y="0" width="10" height="15" /></element>
+ <element name="digit6" ref="digit"><bounds x="20" y="0" width="10" height="15" /></element>
+ <element name="digit5" ref="digit"><bounds x="30" y="0" width="10" height="15" /></element>
+ <element name="digit4" ref="digit"><bounds x="40" y="0" width="10" height="15" /></element>
+ <element name="digit3" ref="digit"><bounds x="50" y="0" width="10" height="15" /></element>
+ <element name="digit2" ref="digit"><bounds x="60" y="0" width="10" height="15" /></element>
+ <element name="digit1" ref="digit"><bounds x="70" y="0" width="10" height="15" /></element>
+ <element name="digit0" ref="digit"><bounds x="80" y="0" width="10" height="15" /></element>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/cmulti8.lay b/src/mame/layout/palmmd8.lay
index 86d2cd68def..86d2cd68def 100644
--- a/src/mame/layout/cmulti8.lay
+++ b/src/mame/layout/palmmd8.lay
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index fc552247ed4..3e4dd292b99 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -16468,7 +16468,6 @@ bigtrak // Milton Bradley
bship // Milton Bradley
bshipb // Milton Bradley
cmsport // Conic
-cmulti8 // Canon
cnbaskb // Conic
cnfball // Conic
cnfball2 // Conic
@@ -16515,6 +16514,8 @@ mdndclab // Mattel
merlin // Parker Bros
mmerlin // Parker Bros
monkeysee // Tandy Corporation
+palmf31 // Canon
+palmmd8 // Canon
pbmastm // Parker Bros
phpball // Tomy
qfire // Electroplay