summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/emma2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/emma2.cpp')
-rw-r--r--src/mame/drivers/emma2.cpp232
1 files changed, 0 insertions, 232 deletions
diff --git a/src/mame/drivers/emma2.cpp b/src/mame/drivers/emma2.cpp
deleted file mode 100644
index 8ccad2e2f96..00000000000
--- a/src/mame/drivers/emma2.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Robbbert
-/***************************************************************************
-
-Emma and Emma II by L.J.Technical Systems
-These were produced by L.J.Electronics Ltd, Norwich in 1979.
-
-2018-09-20 Working driver.
-
-We don't have roms for the Emma, so only the Emma II is emulated.
-
-Keys:
-0-9,A-F: hex input
-M : memory mode (modify address, or modify data)
-G : go
-R : single step (not emulated)
-P : insert a forced break
-S : save to cassette
-L : load from cassette
-+ : up (use UP-arrow key)
-- : down (use DOWN-arrow key)
-
-Pasting example:
-M0020M01^02^03^04^05^06^07^08^09^M000020
-Press up arrow to see your input.
-
-To save, press S, enter beginning address, press S, enter end address+1,
-press S, start the recorder, press 0 for 300 baud or 1 for 1200 baud. The
-data is saved.
-
-To load, press L, press play, while leader is playing press 0 or 1 as above.
-When a row of dots appears, the data has been loaded.
-
-
-There's an expansion unit with its own rom, a 8255, an eprom programmer,
-and 16k of static RAM.
-
-
-
-To Do:
-- Cassette LED doesn't work.
-- Code up the expansion unit (rom is there but no schematic exists)
-- Need software.
-
-
-****************************************************************************/
-
-#include "emu.h"
-#include "cpu/m6502/m6502.h"
-#include "machine/6522via.h"
-#include "machine/6821pia.h"
-#include "imagedev/cassette.h"
-#include "speaker.h"
-#include "video/pwm.h"
-#include "emma2.lh"
-
-
-class emma2_state : public driver_device
-{
-public:
- emma2_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_cassette(*this, "cassette")
- , m_via(*this, "via")
- , m_pia(*this, "pia")
- , m_display(*this, "display")
- , m_io_keyboard(*this, "X%u", 0U)
- { }
-
- void emma2(machine_config &config);
-
-private:
- void segment_w(uint8_t data);
- void digit_w(uint8_t data);
- uint8_t keyboard_r();
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- void mem_map(address_map &map);
-
- uint8_t m_digit;
- uint8_t m_seg;
- required_device<cpu_device> m_maincpu;
- required_device<cassette_image_device> m_cassette;
- required_device<via6522_device> m_via;
- required_device<pia6821_device> m_pia;
- required_device<pwm_display_device> m_display;
- required_ioport_array<8> m_io_keyboard;
-};
-
-void emma2_state::mem_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x03ff).ram();
- map(0x0900, 0x090f).mirror(0x02f0).m(m_via, FUNC(via6522_device::map));
- map(0x0a00, 0x0a03).mirror(0x00fc).rw(m_pia, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0x0c00, 0x0fff).ram();
- map(0x9000, 0x97ff).rom().region("maincpu", 0);
- map(0xd800, 0xdfff).mirror(0x2000).rom().region("maincpu", 0x0800);
-}
-
-
-/* Input ports */
-static INPUT_PORTS_START( emma2 )
-/*
-M L 0 4 8 C
-G R 1 5 9 D
-P + 2 6 A E
-S - 3 7 B F
-*/
-
- PORT_START("X0")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
-
- PORT_START("X1")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1')
-
- PORT_START("X2")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2')
-
- PORT_START("X3")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3')
-
- PORT_START("X4")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
-
- PORT_START("X5")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5')
-
- PORT_START("X6")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR('^')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6')
-
- PORT_START("X7")
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('V')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7')
-INPUT_PORTS_END
-
-
-void emma2_state::digit_w(uint8_t data)
-{
- m_cassette->output( BIT(data, 6) ? +1.0 : -1.0);
-
- m_digit = data & 7;
- m_display->matrix(1 << m_digit, m_seg);
-}
-
-void emma2_state::segment_w(uint8_t data)
-{
- m_seg = data;
- m_display->matrix(1 << m_digit, m_seg);
-}
-
-uint8_t emma2_state::keyboard_r()
-{
- u8 data = m_io_keyboard[m_digit]->read();
- data |= ((m_cassette)->input() < 0.0) ? 0x80 : 0;
- return data;
-}
-
-void emma2_state::machine_reset()
-{
- m_seg = 0;
- m_digit = 0;
-}
-
-void emma2_state::machine_start()
-{
- save_item(NAME(m_digit));
- save_item(NAME(m_seg));
-}
-
-void emma2_state::emma2(machine_config &config)
-{
- /* basic machine hardware */
- M6502(config, m_maincpu, 1'000'000);
- m_maincpu->set_addrmap(AS_PROGRAM, &emma2_state::mem_map);
-
- /* video hardware */
- config.set_default_layout(layout_emma2);
- PWM_DISPLAY(config, m_display).set_size(8, 8);
- m_display->set_segmask(0xff, 0xff);
-
- /* Devices */
- MOS6522(config, m_via, 1'000'000); // #2 from cpu
- m_via->irq_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE);
-
- PIA6821(config, m_pia, 0);
- m_pia->writepa_handler().set(FUNC(emma2_state::segment_w));
- m_pia->writepb_handler().set(FUNC(emma2_state::digit_w));
- m_pia->readpb_handler().set(FUNC(emma2_state::keyboard_r));
- m_pia->ca2_handler().set_output("led0");
- m_pia->irqa_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE);
- m_pia->irqb_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
-
- /* cassette */
- CASSETTE(config, m_cassette);
- m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
- m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
-}
-
-
-/* ROM definition */
-ROM_START( emma2 )
- ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "se118a_90-97", 0x0000, 0x0800, CRC(32d36938) SHA1(910fd1c18c7deae83933c7c4f397103a35bf574a) ) // 0x9000
- ROM_LOAD( "se116a_d8-dd_fe-ff", 0x0800, 0x0800, CRC(ef0f1513) SHA1(46089ba0402828b4204812a04134b313d9be0f93) ) // 0xd800
-ROM_END
-
-
-/* Driver */
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1979, emma2, 0, 0, emma2, emma2, emma2_state, empty_init, "L.J.Technical Systems", "Emma II trainer", MACHINE_SUPPORTS_SAVE )