New working machines

--------------------
24K (Rockwell) [hap, Sean Riddle]
This commit is contained in:
hap 2022-03-29 14:11:44 +02:00
parent 70628bc225
commit bf7961cd45
6 changed files with 174 additions and 62 deletions

View File

@ -64,18 +64,21 @@ u16 b5000_cpu_device::decode_digit(u8 data)
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,
// ?, ?, newline?, -, ?, ?
0, 0, 0x80, 0x40, 0, 0
0, 0, 0x00, 0x40, 0, 0
};
u16 seg = lut_segs[data & 0xf] << 1 | BIT(data, 4);
u8 dp = BIT(data, 4);
u8 seg = lut_segs[data & 0xf];
// zero suppression logic is done in hardware
if (seg & 0x100)
m_suppress0 = true;
else if (data > 0)
if (data > 0)
m_suppress0 = false;
if (m_suppress0)
seg = 0;
if ((data & 0xf) >= 0xc)
m_suppress0 = true;
return m_suppress0 ? 0 : (seg & 0xff);
return seg << 1 | dp;
}

View File

@ -275,7 +275,7 @@ void b5000_cpu_device::op_atb_step()
{
assert(m_atb_step > 0);
// ATBZ (aka ATB on B5xxx): ATB + load strobe (multi step)
// ATB: ATB + load strobe (multi step)
switch (m_atb_step)
{
// step 1: ATB + KSEG

View File

@ -69,65 +69,16 @@ u16 b6100_cpu_device::decode_digit(u8 data)
void b6100_cpu_device::execute_one()
{
switch (m_op & 0xf0)
switch (m_op)
{
case 0x40: op_lax(); break;
case 0x60:
if (m_op != 0x6f)
op_adx();
else
op_read();
break;
case 0x1c: case 0x1d: case 0x1e: case 0x1f: op_lb(11); break;
case 0x38: case 0x39: case 0x3a: case 0x3b: op_tl(); break;
case 0x80: case 0x90: case 0xa0: case 0xb0:
case 0xc0: case 0xd0: case 0xe0: case 0xf0:
m_tra_step = 1; break;
default:
switch (m_op & 0xfc)
{
case 0x04: op_tdin(); break;
case 0x08: op_tm(); break;
case 0x10: op_sm(); break;
case 0x14: op_rsm(); break;
case 0x18: m_ret_step = 1; break;
case 0x1c: op_lb(11); break;
case 0x20: op_lb(7); break;
case 0x24: op_lb(10); break;
case 0x28: op_lb(9); break;
case 0x2c: op_lb(8); break;
case 0x3c: op_lb(0); break;
case 0x30: case 0x34: case 0x38: op_tl(); break;
case 0x50: op_lda(); break;
case 0x54: op_excp(); break;
case 0x58: op_exc0(); break;
case 0x5c: op_excm(); break;
case 0x70: op_add(); break;
case 0x78: op_comp(); break;
case 0x7c: op_tam(); break;
default:
switch (m_op)
{
case 0x00: op_nop(); break;
case 0x01: op_tc(); break;
case 0x02: op_tkb(); break;
case 0x03: op_tkbs(); break;
case 0x0c: op_sc(); break;
case 0x0d: op_rsc(); break;
case 0x74: op_kseg(); break;
case 0x76: op_atbz(); break;
case 0x77: op_atb(); break;
default: op_illegal(); break;
}
break; // 0xff
}
break; // 0xfc
// rest is same as B6000
default: b6000_cpu_device::execute_one(); break;
}
// instead of with TKBS, carry flag directly outputs to SPK

View File

@ -8,12 +8,14 @@ Mostly calculators on these MCUs, but also Mattel's first couple of handhelds.
ROM source notes when dumped from another model, but confident it's the same:
- rw18r: Rockwell 8R
- rw24k: Rockwell 14RD-II
- misatk: Mattel Space Alert
***************************************************************************/
#include "emu.h"
#include "cpu/rw5000/a5000.h"
#include "cpu/rw5000/b5000.h"
#include "cpu/rw5000/b6000.h"
#include "cpu/rw5000/b6100.h"
@ -29,6 +31,7 @@ ROM source notes when dumped from another model, but confident it's the same:
#include "mfootb.lh"
#include "misatk.lh"
#include "rw18r.lh"
#include "rw24k.lh"
//#include "hh_rw5000_test.lh" // common test-layout - use external artwork
@ -56,7 +59,7 @@ protected:
required_device<rw5000_base_device> m_maincpu;
optional_device<pwm_display_device> m_display;
optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<5> m_inputs; // max 5
optional_ioport_array<9> m_inputs; // max 9
u16 m_inp_mux = 0;
@ -610,6 +613,8 @@ ROM_END
This MCU was used in Rockwell 8R, 18R, and 9TR. It was also sold by
Tandy (Radio Shack) as EC-220.
8R/9TR doesn't have the memory store/recall buttons.
***************************************************************************/
class rw18r_state : public hh_rw5000_state
@ -707,6 +712,135 @@ ROM_END
/***************************************************************************
Rockwell 24K aka "the 24K" (see below for more)
* A5900 MCU (label A5901CA/A5903CB, die label A59__)
* 9-digit 7seg display
This MCU was used in Rockwell 14RD-II, 24RD-II, 24K, 24K II, 24MS, and
probably also in 14RD, 24RD, 22K.
14RD has 6 less buttons than 24RD, the non-II versions have LED(s) instead
of a 9th digit for minus sign and memory status. 24K has an extra button
for register exchange. The difference between 24K and 24K II is unknown.
***************************************************************************/
class rw24k_state : public hh_rw5000_state
{
public:
rw24k_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_rw5000_state(mconfig, type, tag)
{ }
void rw24k(machine_config &config);
private:
void write_str(u16 data);
void write_seg(u16 data);
u8 read_kb();
};
// handlers
void rw24k_state::write_str(u16 data)
{
// STR0-STR8: digit select, input mux
m_display->write_my(data);
m_inp_mux = data;
}
void rw24k_state::write_seg(u16 data)
{
// SEG0-SEG7: digit segment data
m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1));
}
u8 rw24k_state::read_kb()
{
// KB: multiplexed inputs
return read_inputs(9);
}
// config
static INPUT_PORTS_START( rw24k )
PORT_START("IN.0") // STR0
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // unpopulated on 14RD
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("M+") // "
PORT_START("IN.1") // STR1
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M-") // "
PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.2") // STR2
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("IN.3") // STR3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("MC") // "
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(u8"") // "
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("MR") // "
PORT_START("IN.4") // STR4
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+")
PORT_START("IN.5") // STR5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
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_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-")
PORT_START("IN.6") // STR6
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
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_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×")
PORT_START("IN.7") // STR7
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
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_SLASH_PAD) PORT_NAME(u8"÷")
PORT_START("IN.8") // STR8
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME(u8"") // register exchange - unpopulated on 14RD/24RD
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=")
INPUT_PORTS_END
void rw24k_state::rw24k(machine_config &config)
{
// basic machine hardware
A5900(config, m_maincpu, 250000); // approximation
m_maincpu->write_str().set(FUNC(rw24k_state::write_str));
m_maincpu->write_seg().set(FUNC(rw24k_state::write_seg));
m_maincpu->read_kb().set(FUNC(rw24k_state::read_kb));
// video hardware
PWM_DISPLAY(config, m_display).set_size(9, 8);
m_display->set_segmask(0x1ff, 0xff);
config.set_default_layout(layout_rw24k);
}
// roms
ROM_START( rw24k )
ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "a5901ca", 0x000, 0x200, CRC(00de7764) SHA1(0f24add4b6d2660aad63ddd4d0003d59a0e39df6) )
ROM_END
} // anonymous namespace
/***************************************************************************
@ -723,3 +857,4 @@ CONS( 1978, mbaseb, 0, 0, mbaseb, mbaseb, mbaseb_state, empty_
CONS( 1980, gravity, 0, 0, gravity, gravity, gravity_state, empty_init, "Mattel Electronics", "Gravity (Mattel)", MACHINE_SUPPORTS_SAVE )
COMP( 1975, rw18r, 0, 0, rw18r, rw18r, rw18r_state, empty_init, "Rockwell", "18R (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
COMP( 1976, rw24k, 0, 0, rw24k, rw24k, rw24k_state, empty_init, "Rockwell", "24K (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )

22
src/mame/layout/rw24k.lay Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<!--
license:CC0
-->
<mamelayout version="2">
<element name="digit" defstate="0">
<led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
</element>
<view name="Internal Layout">
<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>

View File

@ -16549,6 +16549,7 @@ mbaseb // Mattel
mfootb // Mattel
misatk // Mattel
rw18r // Rockwell
rw24k // Rockwell
@source:hh_sm510.cpp
atakaast // Elektronika