summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/skeleton/cortex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/skeleton/cortex.cpp')
-rw-r--r--src/mame/skeleton/cortex.cpp256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/mame/skeleton/cortex.cpp b/src/mame/skeleton/cortex.cpp
new file mode 100644
index 00000000000..bc3af05065a
--- /dev/null
+++ b/src/mame/skeleton/cortex.cpp
@@ -0,0 +1,256 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert
+/***************************************************************************
+
+Powertran Cortex
+
+2012-04-20 Skeleton driver.
+
+ftp://ftp.whtech.com/Powertran Cortex/
+http://www.powertrancortex.com/index.html
+
+Uses Texas Instruments parts and similar to other TI computers.
+It was designed by TI engineers, so it may perhaps be a clone
+of another TI or the Geneve.
+
+Chips:
+TMS9995 - CPU
+TMS9929 - Video
+TMS9911 - DMA to floppy (unemulated device)
+TMS9909 - Floppy Disk Controller (unemulated device)
+TMS9902 - UART (x2) (device not usable with rs232.h)
+AY-5-2376 - Keyboard controller
+
+All input to be in uppercase. Note that "lowercase" is just smaller uppercase,
+and is not acceptable as input.
+
+There's no option in BASIC to produce sound. It will beep if an invalid key
+(usually a control key) is pressed.
+
+To clear the screen press Ctrl L.
+
+ToDo:
+- Unemulated devices
+- Cassette
+- Keyboard to use AY device
+- Memory mapping unit (74LS610)
+- Various CRU I/O
+
+****************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/tms9900/tms9995.h"
+#include "machine/74259.h"
+#include "machine/keyboard.h"
+//#include "machine/tms9902.h"
+#include "video/tms9928a.h"
+#include "sound/beep.h"
+
+#include "speaker.h"
+
+
+namespace {
+
+class cortex_state : public driver_device
+{
+public:
+ cortex_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_rom(*this, "maincpu")
+ , m_ram(*this, "mainram")
+ , m_bank1(*this, "bank1")
+ , m_beep(*this, "beeper")
+ , m_io_dsw(*this, "DSW")
+ { }
+
+ void cortex(machine_config &config);
+
+protected:
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+
+private:
+ void kbd_put(u8 data);
+ void keyboard_ack_w(int state);
+ void romsw_w(int state);
+ void vdp_int_w(int state);
+ u8 pio_r(offs_t offset);
+ u8 keyboard_r(offs_t offset);
+
+ void io_map(address_map &map) ATTR_COLD;
+ void mem_map(address_map &map) ATTR_COLD;
+
+ bool m_kbd_ack = 0;
+ bool m_vdp_int = 0;
+ u8 m_term_data = 0U;
+ required_device<tms9995_device> m_maincpu;
+ required_region_ptr<u8> m_rom;
+ required_shared_ptr<u8> m_ram;
+ required_memory_bank m_bank1;
+ required_device<beep_device> m_beep;
+ required_ioport m_io_dsw;
+};
+
+void cortex_state::mem_map(address_map &map)
+{
+ map(0x0000, 0x7fff).ram().share(m_ram).bankr(m_bank1);
+ map(0x8000, 0xefff).ram();
+ map(0xf100, 0xf11f).ram(); // memory mapping unit
+ map(0xf120, 0xf121).rw("crtc", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
+ //map(0xf140, 0xf147) // fdc tms9909
+}
+
+void cortex_state::io_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x000f).mirror(0x30).w("control", FUNC(ls259_device::write_d0));
+ map(0x0000, 0x000f).r(FUNC(cortex_state::pio_r));
+ map(0x0010, 0x001f).r(FUNC(cortex_state::keyboard_r));
+ //map(0x0080, 0x00bf).rw("uart1", FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite)); // RS232 (r12 = 80-bf)
+ //map(0x0180, 0x01bf).rw("uart2", FUNC(tms9902_device::cruread), FUNC(tms9902_device::cruwrite)); // Cassette (r12 = 180-1bf)
+ //map(0x01c0, 0x01ff).rw("dma", FUNC(tms9911_device::read), FUNC(tms9911_device::write)); // r12 = 1c0-1fe
+ //map(0x0800, 0x080f).w(cortex_state::cent_data_w)); // r12 = 800-80e
+ //map(0x0810, 0x0811).w(FUNC(cortex_state::cent_strobe_w)); // r12 = 810
+ //map(0x0812, 0x0813).r(FUNC(cortex_state::cent_stat_r)); // CRU 409 (r12 = 812)
+}
+
+/* Input ports */
+static INPUT_PORTS_START( cortex )
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x04, 0x00, "DISK SIZE")
+ PORT_DIPSETTING( 0x04, "20cm")
+ PORT_DIPSETTING( 0x00, "13cm")
+ PORT_DIPNAME( 0x08, 0x08, "DISK DENSITY")
+ PORT_DIPSETTING( 0x08, "Double")
+ PORT_DIPSETTING( 0x00, "Single")
+INPUT_PORTS_END
+
+u8 cortex_state::pio_r(offs_t offset)
+{
+ switch (offset)
+ {
+ case 5:
+ return m_kbd_ack;
+
+ case 6:
+ return m_vdp_int;
+
+ case 2:
+ case 3:
+ return BIT(m_io_dsw->read(), offset);
+
+ default:
+ return 1;
+ }
+}
+
+u8 cortex_state::keyboard_r(offs_t offset)
+{
+ return BIT(m_term_data, offset);
+}
+
+void cortex_state::keyboard_ack_w(int state)
+{
+ if (!state)
+ {
+ m_maincpu->set_input_line(INT_9995_INT4, CLEAR_LINE);
+ m_kbd_ack = 1;
+ }
+}
+
+void cortex_state::romsw_w(int state)
+{
+ m_bank1->set_entry(state ? 0 : 1);
+}
+
+void cortex_state::vdp_int_w(int state)
+{
+ m_vdp_int = state ? 0 : 1; // change polarity to match mame
+}
+
+void cortex_state::kbd_put(u8 data)
+{
+ m_term_data = data;
+ m_kbd_ack = 0;
+ m_maincpu->set_input_line(INT_9995_INT4, ASSERT_LINE);
+}
+
+void cortex_state::machine_start()
+{
+ m_bank1->configure_entry(0, m_ram);
+ m_bank1->configure_entry(1, m_rom);
+ save_item(NAME(m_kbd_ack));
+ save_item(NAME(m_vdp_int));
+ save_item(NAME(m_term_data));
+}
+
+void cortex_state::machine_reset()
+{
+ m_kbd_ack = 1;
+ m_vdp_int = 0;
+ m_beep->set_state(0);
+ m_bank1->set_entry(1);
+ m_maincpu->ready_line(ASSERT_LINE);
+ m_maincpu->reset_line(ASSERT_LINE);
+}
+
+void cortex_state::cortex(machine_config &config)
+{
+ /* basic machine hardware */
+ /* TMS9995 CPU @ 12.0 MHz */
+ // Standard variant, no overflow int
+ // No lines connected yet
+ TMS9995(config, m_maincpu, XTAL(12'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &cortex_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &cortex_state::io_map);
+
+ ls259_device &control(LS259(config, "control")); // IC64
+ //control.q_out_cb<0>().set(FUNC(cortex_state::basic_led_w));
+ control.q_out_cb<1>().set(FUNC(cortex_state::keyboard_ack_w));
+ //control.q_out_cb<2>().set(FUNC(cortex_state::ebus_int_ack_w));
+ //control.q_out_cb<3>().set(FUNC(cortex_state::ebus_to_en_w));
+ //control.q_out_cb<4>().set(FUNC(cortex_state::disk_size_w));
+ control.q_out_cb<5>().set(FUNC(cortex_state::romsw_w));
+ control.q_out_cb<6>().set("beeper", FUNC(beep_device::set_state));
+
+ /* video hardware */
+ tms9929a_device &crtc(TMS9929A(config, "crtc", XTAL(10'738'635)));
+ crtc.set_screen("screen");
+ crtc.int_callback().set_inputline(m_maincpu, INT_9995_INT1);
+ crtc.int_callback().append(FUNC(cortex_state::vdp_int_w));
+ crtc.set_vram_size(0x4000);
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
+
+ generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
+ keyboard.set_keyboard_callback(FUNC(cortex_state::kbd_put));
+
+ //TMS9902(config, "uart1", XTAL(12'000'000) / 4);
+ //TMS9902(config, "uart2", XTAL(12'000'000) / 4);
+
+ /* Sound */
+ SPEAKER(config, "mono").front_center();
+ BEEP(config, m_beep, 950); // guess
+ m_beep->add_route(ALL_OUTPUTS, "mono", 0.05);
+}
+
+/* ROM definition */
+ROM_START( cortex )
+ ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF )
+ ROM_SYSTEM_BIOS(0, "basic", "Cortex BIOS")
+ ROMX_LOAD( "cortex.ic47", 0x0000, 0x2000, CRC(bdb8c7bd) SHA1(340829dcb7a65f2e830fd5aff82a312e3ed7918f), ROM_BIOS(0))
+ ROMX_LOAD( "cortex.ic46", 0x2000, 0x2000, CRC(4de459ea) SHA1(00a42fe556d4ffe1f85b2ce369f544b07fbd06d9), ROM_BIOS(0))
+ ROMX_LOAD( "cortex.ic45", 0x4000, 0x2000, CRC(b0c9b6e8) SHA1(4e20c3f0b7546b803da4805cd3b8616f96c3d923), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "forth", "FIG-Forth")
+ ROMX_LOAD( "forth.ic47", 0x0000, 0x2000, CRC(999034be) SHA1(0dcc7404c38aa0ae913101eb0aa98da82104b5d4), ROM_BIOS(1))
+ ROMX_LOAD( "forth.ic46", 0x2000, 0x2000, CRC(8eca54cc) SHA1(0f1680e941ef60bb9bde9a4b843b78f30dff3202), ROM_BIOS(1))
+ROM_END
+
+} // anonymous namespace
+
+
+/* Driver */
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+COMP( 1982, cortex, 0, 0, cortex, cortex, cortex_state, empty_init, "Powertran Cybernetics", "Cortex", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )