summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/tiger/k28m2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/tiger/k28m2.cpp')
-rw-r--r--src/mame/tiger/k28m2.cpp360
1 files changed, 0 insertions, 360 deletions
diff --git a/src/mame/tiger/k28m2.cpp b/src/mame/tiger/k28m2.cpp
deleted file mode 100644
index 7150ff9ef5d..00000000000
--- a/src/mame/tiger/k28m2.cpp
+++ /dev/null
@@ -1,360 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:hap
-// thanks-to:Sean Riddle, David Viens
-/*******************************************************************************
-
-Tiger Electronics K-2-8 (model 7-232) Sold in Hong Kong, distributed in US as:
-- Coleco: Talking Teacher (model 8100)
-- Sears: Talkatron: Learning Computer
-
-1981 K-2-8 models 7-230 and 7-231 are on different hardware, having a different
-keyboard, VFD, and the SC-01-A speech chip. --> driver k28.cpp
-
-Hardware notes:
-- PCB label: 201223A (main), REV0 ET828D (LCD)
-- TMS1400 MP7324 (die label: TMS1400, MP7324, 28L 01D D000 R100)
-- SMC1112 under epoxy (die label: SMC1112 D2N0), 8*14-seg display
-- TMS5110ANL, CM62084 VSM (16KB)
-- module slot (not compatible with the 1981 version(s))
-
-TODO:
-- dump/add module #5
-
-*******************************************************************************/
-
-#include "emu.h"
-
-#include "bus/generic/carts.h"
-#include "bus/generic/slot.h"
-#include "cpu/tms1000/smc1102.h"
-#include "cpu/tms1000/tms1400.h"
-#include "machine/tms6100.h"
-#include "sound/tms5110.h"
-
-#include "softlist_dev.h"
-#include "speaker.h"
-
-// internal artwork
-#include "k28m2.lh"
-
-
-namespace {
-
-class k28m2_state : public driver_device
-{
-public:
- k28m2_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_subcpu(*this, "subcpu"),
- m_tms5100(*this, "tms5100"),
- m_tms6100(*this, "tms6100"),
- m_cart(*this, "cartslot"),
- m_inputs(*this, "IN.%u", 0),
- m_digits(*this, "digit%u", 0U)
- { }
-
- void k28m2(machine_config &config);
-
- DECLARE_INPUT_CHANGED_MEMBER(power_on);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
-private:
- // devices/pointers
- required_device<tms1400_cpu_device> m_maincpu;
- required_device<smc1112_cpu_device> m_subcpu;
- required_device<tms5110_device> m_tms5100;
- required_device<tms6100_device> m_tms6100;
- optional_device<generic_slot_device> m_cart;
- required_ioport_array<9> m_inputs;
- output_finder<8> m_digits;
-
- bool m_power_on = false;
- u16 m_inp_mux = 0;
- u32 m_r = 0;
- u32 m_digit_data[4] = { };
-
- void power_off();
- u8 read_k();
- void write_o(u16 data);
- void write_r(u32 data);
-
- u8 sub_read_k();
- void write_segs(offs_t offset, u32 data);
-
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
-};
-
-void k28m2_state::machine_start()
-{
- m_digits.resolve();
-
- // register for savestates
- save_item(NAME(m_power_on));
- save_item(NAME(m_inp_mux));
- save_item(NAME(m_r));
- save_item(NAME(m_digit_data));
-}
-
-
-
-/*******************************************************************************
- Power
-*******************************************************************************/
-
-void k28m2_state::machine_reset()
-{
- m_power_on = true;
- m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
- m_subcpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
-}
-
-INPUT_CHANGED_MEMBER(k28m2_state::power_on)
-{
- if (newval && !m_power_on)
- machine_reset();
-}
-
-void k28m2_state::power_off()
-{
- m_power_on = false;
- m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
- m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
-
- // clear display
- for (int i = 0; i < 8; i++)
- m_digits[i] = 0;
-}
-
-
-
-/*******************************************************************************
- Cartridge
-*******************************************************************************/
-
-DEVICE_IMAGE_LOAD_MEMBER(k28m2_state::cart_load)
-{
- u32 const size = m_cart->common_get_size("rom");
-
- if (size > 0x4000)
- return std::make_pair(image_error::INVALIDLENGTH, "Invalid image file size (must be no more than 16K)");
-
- u8 *const base = memregion("tms6100")->base() + 0x4000;
- m_cart->common_load_rom(base, size, "rom");
-
- return std::make_pair(std::error_condition(), std::string());
-}
-
-
-
-/*******************************************************************************
- I/O
-*******************************************************************************/
-
-// maincpu side
-
-void k28m2_state::write_r(u32 data)
-{
- // R1234: TMS5100 CTL8421
- u32 r = bitswap<5>(data,0,1,2,3,4) | (data & ~0x1f);
- m_tms5100->ctl_w(r & 0xf);
-
- // R0: TMS5100 PDC pin
- m_tms5100->pdc_w(data & 1);
-
- // R5: input mux high bit
- m_inp_mux = (m_inp_mux & 0xff) | (data << 3 & 0x100);
-
- // R7-R10: subcpu K interrupt
- m_subcpu->set_input_line(SMC1102_INPUT_LINE_K, (data & 0x780) ? ASSERT_LINE : CLEAR_LINE);
-
- // R6: power-off request, on falling edge
- if (~data & m_r & 0x40)
- power_off();
-
- m_r = r;
-}
-
-void k28m2_state::write_o(u16 data)
-{
- // O0-O7: input mux low
- m_inp_mux = (m_inp_mux & ~0xff) | data;
-}
-
-u8 k28m2_state::read_k()
-{
- u8 data = 0;
-
- // K: multiplexed inputs
- for (int i = 0; i < 9; i++)
- if (BIT(m_inp_mux, i))
- data |= m_inputs[i]->read();
-
- // and TMS5100 CTL (also tied to R1234)
- return data | m_tms5100->ctl_r() | (m_r & 0xf);
-}
-
-
-// subcpu side
-
-void k28m2_state::write_segs(offs_t offset, u32 data)
-{
- m_digit_data[offset & 3] = data;
-
- for (int d = 0; d < 8; d++)
- {
- // 4 segments per common
- u16 segs = 0;
- for (int i = 0; i < 4; i++)
- segs = segs << 4 | (m_digit_data[i] >> (d * 4) & 0xf);
-
- m_digits[d] = bitswap<14>(segs,6,10,13,1,5,9,11,8,12,4,2,7,15,14);
- }
-}
-
-u8 k28m2_state::sub_read_k()
-{
- // K: maincpu R7-R10
- return m_r >> 7 & 0xf;
-}
-
-
-
-/*******************************************************************************
- Input Ports
-*******************************************************************************/
-
-static INPUT_PORTS_START( k28m2 )
- PORT_START("IN.0") // O0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A/1")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J/0")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
-
- PORT_START("IN.1") // O1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, k28m2_state, power_on, 0) PORT_NAME("On")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B/2")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('K') PORT_NAME("K/+")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T')
-
- PORT_START("IN.2") // O2
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Repeat")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C/3")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('L') PORT_NAME("L/-")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U')
-
- PORT_START("IN.3") // O3
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Prompt")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D/4")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('M') PORT_NAME(u8"M/×")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
-
- PORT_START("IN.4") // O4
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("Menu")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E/5")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('N') PORT_NAME(u8"N/÷")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W')
-
- PORT_START("IN.5") // O5
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("Module")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F/6")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O')
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X')
-
- PORT_START("IN.6") // O6
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Select")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G/7")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P')
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
-
- PORT_START("IN.7") // O7
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H/8")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
-
- PORT_START("IN.8") // R5
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'')
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I/9")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R')
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Enter")
-INPUT_PORTS_END
-
-
-
-/*******************************************************************************
- Machine Configs
-*******************************************************************************/
-
-void k28m2_state::k28m2(machine_config &config)
-{
- constexpr u32 MASTER_CLOCK = 640'000; // approximation
-
- // basic machine hardware
- TMS1400(config, m_maincpu, MASTER_CLOCK/2);
- m_maincpu->read_k().set(FUNC(k28m2_state::read_k));
- m_maincpu->write_o().set(FUNC(k28m2_state::write_o));
- m_maincpu->write_r().set(FUNC(k28m2_state::write_r));
-
- SMC1112(config, m_subcpu, 32.768_kHz_XTAL);
- m_subcpu->read_k().set(FUNC(k28m2_state::sub_read_k));
- m_subcpu->write_segs().set(FUNC(k28m2_state::write_segs));
-
- config.set_perfect_quantum(m_subcpu);
-
- config.set_default_layout(layout_k28m2);
-
- // sound hardware
- TMS6100(config, m_tms6100, MASTER_CLOCK/4);
-
- SPEAKER(config, "mono").front_center();
- TMS5110A(config, m_tms5100, MASTER_CLOCK);
- m_tms5100->m0().set(m_tms6100, FUNC(tms6100_device::m0_w));
- m_tms5100->m1().set(m_tms6100, FUNC(tms6100_device::m1_w));
- m_tms5100->addr().set(m_tms6100, FUNC(tms6100_device::add_w));
- m_tms5100->data().set(m_tms6100, FUNC(tms6100_device::data_line_r));
- m_tms5100->romclk().set(m_tms6100, FUNC(tms6100_device::clk_w));
- m_tms5100->add_route(ALL_OUTPUTS, "mono", 0.5);
-
- // cartridge
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "k28m2", "vsm,bin");
- m_cart->set_device_load(FUNC(k28m2_state::cart_load));
-
- SOFTWARE_LIST(config, "cart_list").set_original("k28m2");
-}
-
-
-
-/*******************************************************************************
- ROM Definitions
-*******************************************************************************/
-
-ROM_START( k28m2 )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp7324", 0x0000, 0x1000, CRC(8d304cf2) SHA1(d649b6477ea8634b3a3ba34dde7e5e913855801f) )
-
- ROM_REGION( 867, "maincpu:mpla", 0 )
- ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
- ROM_REGION( 557, "maincpu:opla", 0 )
- ROM_LOAD( "tms1400_k28m2_output.pla", 0, 557, CRC(3a5c7005) SHA1(3fe5819c138a90e7fc12817415f2622ca81b40b2) )
-
- ROM_REGION( 0x0800, "subcpu", 0 )
- ROM_LOAD( "smc1112_d2n0", 0x0000, 0x0800, CRC(e985fd67) SHA1(a0b0280920bf0ac02a1aaf02d534dddbae829433) )
-
- ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge
- ROM_LOAD( "cm62084", 0x0000, 0x4000, CRC(cd1376f7) SHA1(96fa484c392c451599bc083b8376cad9c998df7d) )
-ROM_END
-
-} // anonymous namespace
-
-
-
-/*******************************************************************************
- Drivers
-*******************************************************************************/
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
-SYST( 1985, k28m2, 0, 0, k28m2, k28m2, k28m2_state, empty_init, "Tiger Electronics", "K-2-8: Talking Learning Computer (model 7-232)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )