summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/bert.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/bert.cpp')
-rw-r--r--src/mame/drivers/bert.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/mame/drivers/bert.cpp b/src/mame/drivers/bert.cpp
new file mode 100644
index 00000000000..5e279573349
--- /dev/null
+++ b/src/mame/drivers/bert.cpp
@@ -0,0 +1,121 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*******************************************************************************
+
+ BERT apparently stands for "Basic Einplatinen Rechner für TV-Serie." It is
+ a small educational single-board computer manufactured by the West German
+ firm Thomsen-Elektronik, based on the Z8671 microcontroller with a built-in
+ BASIC/DEBUG ROM.
+
+ Besides a 5-pin DIN connector for the terminal or PC, the board makes four
+ generic input and/or output ports available to the user through pin headers.
+ The first two ports, including the fully bidirectional port A, are directly
+ wired to the processor. Two other ports are read or written through memory-
+ mapped latches, and a fifth port represents the onboard DIP switches.
+
+*******************************************************************************/
+
+#include "emu.h"
+#include "bus/rs232/rs232.h"
+#include "cpu/z8/z8.h"
+#include "machine/ram.h"
+
+class bert_state : public driver_device
+{
+public:
+ bert_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_mpu(*this, "mpu")
+ , m_ram(*this, RAM_TAG)
+ , m_serial(*this, "serial")
+ {
+ }
+
+ void bert(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void portb_w(u8 data);
+ void portd_w(u8 data);
+
+ void mem_map(address_map &map);
+
+ required_device<z8_device> m_mpu;
+ required_device<ram_device> m_ram;
+ required_device<rs232_port_device> m_serial;
+};
+
+void bert_state::machine_start()
+{
+ m_mpu->space(AS_PROGRAM).install_ram(0x2000, 0x2000 + m_ram->size() - 1, 0x8000, m_ram->pointer());
+}
+
+void bert_state::portb_w(u8 data)
+{
+ m_serial->write_txd(BIT(data, 7));
+}
+
+void bert_state::portd_w(u8 data)
+{
+}
+
+void bert_state::mem_map(address_map &map)
+{
+ // A15 (P07) is only decoded internally
+ map(0x0800, 0x0fff).mirror(0x8000).noprw();
+ map(0x1000, 0x1fff).mirror(0x8000).rom().region("eprom", 0).nopw(); // 2732
+ map(0x5000, 0x5000).mirror(0x8fff).portr("PORTC"); // 74LS373
+ map(0x6000, 0x6000).mirror(0x8fff).w(FUNC(bert_state::portd_w)); // 74LS373
+ map(0x7000, 0x7000).mirror(0x8fff).portr("PORTE"); // 74LS368
+}
+
+static INPUT_PORTS_START(bert)
+ PORT_START("PORTA")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("PORTC")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("PORTE")
+ PORT_DIPNAME(0x07, 0x02, "Baud Rate") PORT_DIPLOCATION("E:!1,!2,!3")
+ PORT_DIPSETTING(0x06, "110")
+ PORT_DIPSETTING(0x00, "150")
+ PORT_DIPSETTING(0x07, "300")
+ PORT_DIPSETTING(0x05, "1200")
+ PORT_DIPSETTING(0x04, "2400")
+ PORT_DIPSETTING(0x03, "4800")
+ PORT_DIPSETTING(0x02, "9600")
+ PORT_DIPSETTING(0x01, "19200")
+ PORT_DIPNAME(0x08, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("E:!4")
+ PORT_DIPSETTING(0x00, DEF_STR(Off))
+ PORT_DIPSETTING(0x08, DEF_STR(On))
+ PORT_DIPNAME(0x10, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("E:!5")
+ PORT_DIPSETTING(0x00, DEF_STR(Off))
+ PORT_DIPSETTING(0x10, DEF_STR(On))
+ PORT_DIPNAME(0x20, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("E:!6")
+ PORT_DIPSETTING(0x00, DEF_STR(Off))
+ PORT_DIPSETTING(0x20, DEF_STR(On))
+ PORT_BIT(0xc0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+void bert_state::bert(machine_config &config)
+{
+ Z8671(config, m_mpu, 7.3728_MHz_XTAL);
+ m_mpu->set_addrmap(AS_PROGRAM, &bert_state::mem_map);
+ m_mpu->p2_in_cb().set_ioport("PORTA");
+ m_mpu->p3_out_cb().set(FUNC(bert_state::portb_w));
+
+ RAM(config, m_ram).set_default_size("2K").set_extra_options("4K"); // two 6116 sockets
+
+ RS232_PORT(config, m_serial, default_rs232_devices, "terminal"); // TTL-level, not EIA/CCITT ±12V
+ m_serial->rxd_handler().set_inputline(m_mpu, INPUT_LINE_IRQ3).invert(); // no actual inverter
+}
+
+ROM_START(bert)
+ ROM_REGION(0x1000, "eprom", 0)
+ ROM_LOAD("bert.bin", 0x0000, 0x1000, CRC(52ece0e7) SHA1(d39cc9b6248547cfa8fd49d43532abf9399348a5))
+ROM_END
+
+COMP(1987, bert, 0, 0, bert, bert, bert_state, empty_init, "VGS Verlagsgesellschaft", "BERT", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW)