From 75a36e30939dad5e4084c5cafb01ec272471d960 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Fri, 25 May 2018 11:44:38 +0100 Subject: poly.cpp: Use original encrypted ROMs, and decrypt. - Implemented banking and system/user mode switching. - Added PolyBASIC 3.0, 3.1, and 3.4. New clones marked as NOT_WORKING -------------------------------- Poly 1 Educational Computer (early) [Nigel Barnes, Andrew Trotman] Poly 2 Learning System [Nigel Barnes, Andrew Trotman] Poly Development System [Nigel Barnes, Andrew Trotman] --- scripts/target/mame/mess.lua | 2 + src/mame/drivers/poly.cpp | 498 +++++++++++++++++++++++++++++++------------ src/mame/includes/poly.h | 179 ++++++++++++++++ src/mame/machine/poly.cpp | 259 ++++++++++++++++++++++ src/mame/mame.lst | 5 +- 5 files changed, 803 insertions(+), 140 deletions(-) create mode 100644 src/mame/includes/poly.h create mode 100644 src/mame/machine/poly.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index ef261429238..bbb07ada062 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2723,6 +2723,8 @@ files { createMESSProjects(_target, _subtarget, "poly") files { MAME_DIR .. "src/mame/drivers/poly.cpp", + MAME_DIR .. "src/mame/includes/poly.h", + MAME_DIR .. "src/mame/machine/poly.cpp", MAME_DIR .. "src/mame/drivers/proteus.cpp", } diff --git a/src/mame/drivers/poly.cpp b/src/mame/drivers/poly.cpp index 879e80b0c90..e0dd2d40cd7 100644 --- a/src/mame/drivers/poly.cpp +++ b/src/mame/drivers/poly.cpp @@ -1,8 +1,9 @@ // license:BSD-3-Clause -// copyright-holders:Robbbert +// copyright-holders:Robbbert,Nigel Barnes +// thanks-to:Andrew Trotman /*************************************************************************** - Poly/Proteus (New Zealand) + Poly 1/2 (New Zealand) 10/07/2011 Skeleton driver. @@ -19,214 +20,433 @@ With bios 1, after entering your userid and password, you get a black screen. This is normal, because it joins to a network which isn't there. - ToDo: - - Almost Everything! + TODO: - Connect up the device ports & lines - Find out about graphics mode and how it is selected - - Fix Keyboard so that the Enter key tells BASIC to do something + - Fix Keyboard with KR2376-12 encoder + - Poly 2 and Poly 1 (early) probably require a different keyboard matrix - Find out how to make 2nd teletext screen to display - - Banking + - Improve MC6854 emulation for network ****************************************************************************/ #include "emu.h" -#include "cpu/m6809/m6809.h" -#include "cpu/z80/z80.h" -#include "machine/6821pia.h" -#include "machine/6840ptm.h" -#include "machine/6850acia.h" -#include "machine/clock.h" -#include "machine/keyboard.h" -#include "machine/mc6854.h" -#include "sound/spkrdev.h" -#include "video/saa5050.h" -#include "screen.h" -#include "speaker.h" - - -class poly_state : public driver_device +#include "includes/poly.h" +#include "formats/flex_dsk.h" +#include "softlist.h" + + +void poly_state::poly_bank(address_map &map) { -public: - poly_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_pia0(*this, "pia0") - , m_pia1(*this, "pia1") - , m_ptm(*this, "ptm") - , m_speaker(*this, "speaker") - , m_acia_clock(*this, "acia_clock") - , m_videoram(*this, "videoram") - { } - - void kbd_put(u8 data); - DECLARE_READ8_MEMBER(pia1_b_in); - DECLARE_READ8_MEMBER(videoram_r); - DECLARE_WRITE_LINE_MEMBER( ptm_o2_callback ); - DECLARE_WRITE_LINE_MEMBER( ptm_o3_callback ); - DECLARE_WRITE8_MEMBER(baud_rate_w); - - void poly(machine_config &config); - void poly_mem(address_map &map); -protected: - virtual void machine_reset() override; - -private: - required_device m_maincpu; - required_device m_pia0; - required_device m_pia1; - required_device m_ptm; - required_device m_speaker; - required_device m_acia_clock; - required_shared_ptr m_videoram; - uint8_t m_term_data; -}; + map.unmap_value_high(); + /* System mode */ + map(0x00000, 0x0ffff).rw(this, FUNC(poly_state::logical_mem_r), FUNC(poly_state::logical_mem_w)); // Logical Memory + map(0x0e000, 0x0e003).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // Video control PIA 6821 + map(0x0e004, 0x0e005).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // Optional RS232 Interface + map(0x0e006, 0x0e006).w(this, FUNC(poly_state::baud_rate_w)); // Baud rate controller + map(0x0e00c, 0x0e00f).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // Keyboard PIA 6821 + map(0x0e020, 0x0e027).rw(m_ptm, FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)); // Timer 6840 + map(0x0e030, 0x0e036).rw(this, FUNC(poly_state::network_r), FUNC(poly_state::network_w)); // Data Link Controller 6854 + map(0x0e040, 0x0e040).w(this, FUNC(poly_state::set_protect_w)); // Set protect flip-flop after 1 E-cycle + map(0x0e050, 0x0e05f).ram().share("dat"); // Dynamic Address Translator + map(0x0e060, 0x0e060).rw(this, FUNC(poly_state::select_map_r), FUNC(poly_state::select_map1_w)); // Select Map 1 + map(0x0e070, 0x0e070).rw(this, FUNC(poly_state::select_map_r), FUNC(poly_state::select_map2_w)); // Select Map 2 + map(0x0e800, 0x0efff).ram().share("videoram"); // Teletext screens and System data + map(0x0f000, 0x0ffff).rom().region("system", 0); // System Program ROM + /* User mode */ + map(0x10000, 0x1ffff).rw(this, FUNC(poly_state::logical_mem_r), FUNC(poly_state::logical_mem_w)); // Logical Memory + map(0x1fff0, 0x1ffff).r(this, FUNC(poly_state::vector_r)); // Vector fetch (interrupt and reset) +} +void polydev_state::poly_bank(address_map &map) +{ + poly_state::poly_bank(map); + map(0x0e014, 0x0e014).rw(this, FUNC(polydev_state::drive_register_r), FUNC(polydev_state::drive_register_w)); // Drive register + map(0x0e018, 0x0e01b).rw(this, FUNC(polydev_state::fdc_inv_r), FUNC(polydev_state::fdc_inv_w)); // Floppy controller +} void poly_state::poly_mem(address_map &map) { - map.unmap_value_high(); - map(0x0000, 0x9fff).ram(); - map(0xa000, 0xcfff).rom(); - map(0xd000, 0xdfff).ram(); - map(0xe000, 0xe003).rw(m_pia0, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); //video control PIA 6821 - map(0xe004, 0xe005).rw("acia", FUNC(acia6850_device::read), FUNC(acia6850_device::write)); - map(0xe006, 0xe006).w(this, FUNC(poly_state::baud_rate_w)); - map(0xe00c, 0xe00f).rw(m_pia1, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); //keyboard PIA 6821 - map(0xe020, 0xe027).rw(m_ptm, FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)); //timer 6840 - map(0xe030, 0xe037).rw("adlc", FUNC(mc6854_device::read), FUNC(mc6854_device::write)); //Data Link Controller 6854 - map(0xe040, 0xe040).noprw(); //Set protect flip-flop after 1 E-cycle - map(0xe050, 0xe05f).ram(); //Dynamic Address Translater (arranges memory banks) - // AM_RANGE(0xe060,0xe060) Select Map 1 - // AM_RANGE(0xe070,0xe070) Select Map 2 - map(0xe800, 0xebbf).ram().share("videoram"); - map(0xebc0, 0xebff).ram(); - map(0xec00, 0xefbf).ram(); // screen 2 AM_SHARE("videoram") - map(0xefc0, 0xefff).ram(); - map(0xf000, 0xffff).rom(); + map(0x0000, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8)); } -/* Input ports */ -static INPUT_PORTS_START( poly ) +static INPUT_PORTS_START( poly1 ) + PORT_START("MODIFIERS") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + + PORT_START("X0") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Keypad 1 Red") + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Keypad 0") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_NAME("Help Calc") + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Keypad .") + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("X1") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Keypad 3 Yellow") + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Keypad 4 Blue") + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Keypad 2 Green") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_INSERT) PORT_NAME("Ins Char Line") + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Repeat Next") + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("X2") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Keypad 6 Cyan") + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Keypad 7 White") + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Keypad 5 Magenta") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_NAME("Del Char Line") + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Back Exit") + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("X3") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Keypad 9") + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Keypad 8 Flash") + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('@') PORT_CHAR(0xa3) + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_END) PORT_NAME("Pause") + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME(UTF8_UP) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME(UTF8_RIGHT) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_NAME(UTF8_DOWN) + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_NAME(UTF8_LEFT) + + PORT_START("X4") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("X5") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') + + PORT_START("X6") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("EXP \xE2\x80\x96") + + PORT_START("X7") + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') INPUT_PORTS_END +static INPUT_PORTS_START( poly1e ) + PORT_INCLUDE(poly1) + // TODO: unknown matrix, contains extra user definable keys +INPUT_PORTS_END -void poly_state::machine_reset() -{ -} +static INPUT_PORTS_START( poly2 ) + PORT_INCLUDE(poly1) + // TODO: unknown matrix, seems to differ from poly1 +INPUT_PORTS_END -READ8_MEMBER( poly_state::pia1_b_in ) -{ -// return ascii key value, bit 7 is the strobe value - uint8_t data = m_term_data; - m_term_data &= 0x7f; - return data; -} -READ8_MEMBER( poly_state::videoram_r ) +void poly_state::machine_start() { - return m_videoram[offset]; } -void poly_state::kbd_put(u8 data) + +void poly_state::machine_reset() { - m_term_data = data | 0x80; + //m_kr2376->set_input_pin(kr2376_device::KR2376_DSII, 0); + //m_kr2376->set_input_pin(kr2376_device::KR2376_PII, 0); - m_pia1->cb1_w(1); - m_pia1->cb1_w(0); + /* system mode is entered on Reset */ + m_bankdev->set_bank(0); } -WRITE_LINE_MEMBER( poly_state::ptm_o2_callback ) -{ - m_ptm->set_c1(state); -} -WRITE_LINE_MEMBER( poly_state::ptm_o3_callback ) +void poly_state::init_poly() { - m_speaker->level_w(state); + uint8_t bitswapped[0x4000]; + uint8_t *rom; + + /* basic rom region */ + rom = m_user->base() + 0xc000; + + /* decrypt rom data lines */ + for (int i = 0x0000; i<0x4000; i++) + bitswapped[i] = bitswap<8>(rom[i], 3, 4, 2, 5, 1, 6, 0, 7); + + /* decrypt rom address lines */ + for (int i = 0x0000; i<0x4000; i++) + rom[i] = bitswapped[bitswap<16>(i, 15, 14, 13, 12, 10, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 11)]; + + /* system rom region */ + rom = m_system->base(); + + /* decrypt rom data lines */ + for (int i = 0x0000; i<0x1000; i++) + bitswapped[i] = bitswap<8>(rom[i], 3, 4, 2, 5, 1, 6, 0, 7); + + /* decrypt rom address lines */ + for (int i = 0x0000; i<0x1000; i++) + rom[i] = bitswapped[bitswap<16>(i, 15, 14, 13, 12, 10, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 11)]; } -WRITE8_MEMBER(poly_state::baud_rate_w) + +FLOPPY_FORMATS_MEMBER(polydev_state::floppy_formats) + FLOPPY_FLEX_FORMAT +FLOPPY_FORMATS_END + +static void poly_floppies(device_slot_interface &device) { - // baud rate controller (0=9600,2=4800,4=2400,6=1200,8=600,A=300) - int selector = (data & 0x0e) >> 1; - m_acia_clock->set_clock_scale((selector <= 5) ? 1.0 / (1 << selector) : 0.0); + device.option_add("8dssd", FLOPPY_8_DSSD); + device.option_add("525sd", FLOPPY_525_SD); } + MACHINE_CONFIG_START(poly_state::poly) /* basic machine hardware */ - MCFG_DEVICE_ADD("maincpu", MC6809, XTAL(12'057'600) / 3) // nominally 4 MHz + MCFG_DEVICE_ADD("maincpu", MC6809, 12.0576_MHz_XTAL / 3) MCFG_DEVICE_PROGRAM_MAP(poly_mem) + MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(poly_bank) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(17) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x10000) + + MCFG_INPUT_MERGER_ANY_HIGH("irqs") + MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) MCFG_SCREEN_SIZE(40 * 12, 24 * 20) MCFG_SCREEN_VISIBLE_AREA(0, 40 * 12 - 1, 0, 24 * 20 - 1) - MCFG_SCREEN_UPDATE_DEVICE("saa5050", saa5050_device, screen_update) + MCFG_SCREEN_UPDATE_DRIVER(poly_state, screen_update) + + MCFG_DEVICE_ADD("saa5050_1", SAA5050, 12.0576_MHz_XTAL / 2) + MCFG_SAA5050_D_CALLBACK(READ8(*this, poly_state, videoram_1_r)) + MCFG_SAA5050_SCREEN_SIZE(40, 24, 40) + + MCFG_DEVICE_ADD("saa5050_2", SAA5050, 12.0576_MHz_XTAL / 2) + MCFG_SAA5050_D_CALLBACK(READ8(*this, poly_state, videoram_2_r)) + MCFG_SAA5050_SCREEN_SIZE(40, 24, 40) /* sound hardware */ SPEAKER(config, "mono").front_center(); MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) - /* Devices */ - MCFG_DEVICE_ADD("saa5050", SAA5050, XTAL(12'057'600) / 2) - MCFG_SAA5050_D_CALLBACK(READ8(*this, poly_state, videoram_r)) - MCFG_SAA5050_SCREEN_SIZE(40, 24, 40) + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("128K") + MCFG_RAM_EXTRA_OPTIONS("64K") - MCFG_DEVICE_ADD("pia0", PIA6821, 0) - MCFG_PIA_IRQA_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) - MCFG_PIA_IRQB_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) + /* network */ + MCFG_DEVICE_ADD("mc6854", MC6854, 0) + //MCFG_MC6854_OUT_TXD_CB(WRITELINE(NETWORK_TAG, poly_network_device, data_w)) + //MCFG_MC6854_OUT_IRQ_CB(WRITELINE("irqs", input_merger_device, in_w<0>)) - MCFG_DEVICE_ADD("pia1", PIA6821, 0) - MCFG_PIA_READPB_HANDLER(READ8(*this, poly_state, pia1_b_in)) - // CB1 kbd strobe - MCFG_PIA_IRQA_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) - MCFG_PIA_IRQB_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE)) + //MCFG_POLY_NETWORK_ADD() + //MCFG_POLY_NETWORK_CLK_CB(WRITELINE(*this, poly_state, network_clk_w)) + //MCFG_POLY_NETWORK_DATA_CB(WRITELINE("mc6854", mc6854_device, set_rx)) + //MCFG_POLY_NETWORK_SLOT_ADD("netup", poly_network_devices, "proteus") + //MCFG_POLY_NETWORK_SLOT_ADD("netdown", poly_network_devices, nullptr) - MCFG_DEVICE_ADD("ptm", PTM6840, XTAL(12'057'600) / 3) + /* timer */ + MCFG_DEVICE_ADD("ptm", PTM6840, 12.0576_MHz_XTAL / 3) MCFG_PTM6840_EXTERNAL_CLOCKS(0, 0, 0) MCFG_PTM6840_O2_CB(WRITELINE(*this, poly_state, ptm_o2_callback)) MCFG_PTM6840_O3_CB(WRITELINE(*this, poly_state, ptm_o3_callback)) - MCFG_PTM6840_IRQ_CB(INPUTLINE("maincpu", M6809_IRQ_LINE)) + //MCFG_PTM6840_IRQ_CB(WRITELINE("irqs", input_merger_device, in_w<1>)) + + /* keyboard encoder */ + //MCFG_DEVICE_ADD("kr2376", KR2376_12, 50000) + //MCFG_KR2376_MATRIX_X0(IOPORT("X0")) + //MCFG_KR2376_MATRIX_X1(IOPORT("X1")) + //MCFG_KR2376_MATRIX_X2(IOPORT("X2")) + //MCFG_KR2376_MATRIX_X3(IOPORT("X3")) + //MCFG_KR2376_MATRIX_X4(IOPORT("X4")) + //MCFG_KR2376_MATRIX_X5(IOPORT("X5")) + //MCFG_KR2376_MATRIX_X6(IOPORT("X6")) + //MCFG_KR2376_MATRIX_X7(IOPORT("X7")) + //MCFG_KR2376_SHIFT_CB(READLINE(*this, poly_state, kbd_shift_r)) + //MCFG_KR2376_CONTROL_CB(READLINE(*this, poly_state, kbd_control_r)) + //MCFG_KR2376_STROBE_CB(WRITELINE("pia1", pia6821_device, cb1_w)) + + /* generic keyboard until ROM in KR2376-12 is known */ + MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0) + MCFG_GENERIC_KEYBOARD_CB(PUT(poly_state, kbd_put)) + + /* video control */ + MCFG_DEVICE_ADD("pia0", PIA6821, 0) + MCFG_PIA_WRITEPA_HANDLER(WRITE8(*this, poly_state, pia0_pa_w)) + MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, poly_state, pia0_pb_w)) + MCFG_PIA_IRQA_HANDLER(WRITELINE("irqs", input_merger_device, in_w<2>)) + MCFG_PIA_IRQB_HANDLER(WRITELINE("irqs", input_merger_device, in_w<3>)) + /* keyboard PIA */ + MCFG_DEVICE_ADD("pia1", PIA6821, 0) + MCFG_PIA_READPB_HANDLER(READ8(*this, poly_state, pia1_b_in)) + MCFG_PIA_IRQA_HANDLER(WRITELINE("irqs", input_merger_device, in_w<4>)) + MCFG_PIA_IRQB_HANDLER(WRITELINE("irqs", input_merger_device, in_w<5>)) + + /* optional rs232 interface */ MCFG_DEVICE_ADD("acia", ACIA6850, 0) //MCFG_ACIA6850_TXD_HANDLER(WRITELINE("rs232", rs232_port_device, write_txd)) //MCFG_ACIA6850_RTS_HANDLER(WRITELINE("rs232", rs232_port_device, write_rts)) + MCFG_ACIA6850_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<6>)) MCFG_DEVICE_ADD("acia_clock", CLOCK, 153600) MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE("acia", acia6850_device, write_txc)) MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE("acia", acia6850_device, write_rxc)) - MCFG_DEVICE_ADD("adlc", MC6854, 0) + /* software lists */ + MCFG_SOFTWARE_LIST_ADD("flop_list", "poly_flop") + MCFG_SOFTWARE_LIST_FILTER("flop_list", "POLY1") +MACHINE_CONFIG_END + - MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0) - MCFG_GENERIC_KEYBOARD_CB(PUT(poly_state, kbd_put)) +MACHINE_CONFIG_START(poly_state::poly2) + poly(config); + + /* internal ram */ + MCFG_RAM_MODIFY(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("128K") + + /* software lists */ + MCFG_SOFTWARE_LIST_FILTER("flop_list", "POLY2") +MACHINE_CONFIG_END + + +MACHINE_CONFIG_START(polydev_state::polydev) + poly(config); + + /* fdc */ + MCFG_FD1771_ADD("fdc", 12.0_MHz_XTAL / 12) + MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(*this, polydev_state, motor_w)) + MCFG_WD_FDC_FORCE_READY + + MCFG_FLOPPY_DRIVE_ADD("fdc:0", poly_floppies, "525sd", polydev_state::floppy_formats) + MCFG_FLOPPY_DRIVE_SOUND(true) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", poly_floppies, nullptr, polydev_state::floppy_formats) + MCFG_FLOPPY_DRIVE_SOUND(true) + + /* remove devices*/ + //MCFG_DEVICE_REMOVE("netup") + //MCFG_DEVICE_REMOVE("netdown") MACHINE_CONFIG_END + /* ROM definition */ ROM_START( poly1 ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_SYSTEM_BIOS(0, "bios0", "Standalone") - ROMX_LOAD( "v3bas1.bin", 0xa000, 0x1000, CRC(2c5276cb) SHA1(897cb9c2456ddb0f316a8c3b8aa56706056cc1dd), ROM_BIOS(1) ) - ROMX_LOAD( "v3bas2.bin", 0xb000, 0x1000, CRC(30f99447) SHA1(a26170113a968ccd8df7db1b0f256a2198054037), ROM_BIOS(1) ) - ROMX_LOAD( "v3bas3.bin", 0xc000, 0x1000, CRC(89ea5b27) SHA1(e37a61d3dd78fb40bc43c70af9714ce3f75fd895), ROM_BIOS(1) ) - ROMX_LOAD( "v3bas4.bin", 0x9000, 0x1000, CRC(c16c1209) SHA1(42f3b0bce32aafab14bc0500fb13bd456730875c), ROM_BIOS(1) ) - // boot rom - ROMX_LOAD( "plrt16v3e9.bin", 0xf000, 0x1000, CRC(453c10a0) SHA1(edfbc3d83710539c01093e89fe1b47dfe1e68acd), ROM_BIOS(1) ) - - ROM_SYSTEM_BIOS(1, "bios1", "Terminal") - // supplied by Andrew Trotman, author of Poly1 emulator (PolyROM v3.4) - ROMX_LOAD( "v2bas1.bin", 0xa000, 0x1000, CRC(f8c5adc4) SHA1(b1a16d7d996909185495b15a52afa697324e1f8d), ROM_BIOS(2) ) - ROMX_LOAD( "v2bas2.bin", 0xb000, 0x1000, CRC(a2b0fa4d) SHA1(05ab723eb2e2b09325380a1a72da5ade401847d1), ROM_BIOS(2) ) - ROMX_LOAD( "v2bas3.bin", 0xc000, 0x1000, CRC(04a58be5) SHA1(729fa02c76783213e40bb179e60c09d4b439ab90), ROM_BIOS(2) ) - ROMX_LOAD( "v2bas4.bin", 0x9000, 0x1000, CRC(328fe790) SHA1(43dca92092b27627603d3588f91cf9eca24ed29f), ROM_BIOS(2) ) - ROMX_LOAD( "slrt14_00f9.bin", 0xf000, 0x1000, CRC(6559a2ce) SHA1(7c38f449ca122342732123b56992ed0c446406c2), ROM_BIOS(2) ) + ROM_REGION( 0x20000, "user", 0 ) + ROM_SYSTEM_BIOS(0, "bas34", "PolyBASIC 3.4") + ROMX_LOAD( "bas1.u92", 0xc000, 0x1000, CRC(04d96d81) SHA1(8d2d0980afb8c447cf235325e4dc15ed2a200f16), ROM_BIOS(1) ) + ROMX_LOAD( "bas2.u91", 0xd000, 0x1000, CRC(3e12f823) SHA1(0b37f2dfa241fac1bf06ca93b19e44a660c7758e), ROM_BIOS(1) ) + ROMX_LOAD( "bas3.u90", 0xe000, 0x1000, CRC(22759a84) SHA1(d22edea312567596b4ef92290ffe52a25de01487), ROM_BIOS(1) ) + ROMX_LOAD( "bas4.u89", 0xf000, 0x1000, CRC(30650d92) SHA1(4e41ea2ec127b9ed277f5a62d52cb3432d64aa84), ROM_BIOS(1) ) + + ROM_REGION( 0x1000, "system", 0 ) + ROMX_LOAD( "bios.u86", 0x0000, 0x1000, CRC(fc97cc6a) SHA1(103dce01a86a47e7e235c9d2f820fa1501ab9800), ROM_BIOS(1) ) +ROM_END + +ROM_START( poly1e ) + ROM_REGION( 0x20000, "user", 0 ) + ROM_SYSTEM_BIOS(0, "bas23", "PolyBASIC 2.3") + ROMX_LOAD( "v3bas1.u92", 0xc000, 0x1000, CRC(ee25fe89) SHA1(af1a73434c9f5524c5a1a5e19d06500ad1b643d1), ROM_BIOS(1) ) + ROMX_LOAD( "v3bas2.u91", 0xd000, 0x1000, CRC(6ca4a8b5) SHA1(54e71e34b55a5ee41a9e0da05d9c9cbcb2fb80c2), ROM_BIOS(1) ) + ROMX_LOAD( "v3bas3.u90", 0xe000, 0x1000, CRC(6021fc00) SHA1(214aab19e096ddfd417993d48c11f81ec139fef3), ROM_BIOS(1) ) + ROMX_LOAD( "v3bas4.u89", 0xf000, 0x1000, CRC(df071e52) SHA1(41482517a5dfc64f3728732b3907cee636674de4), ROM_BIOS(1) ) + + ROM_REGION( 0x1000, "system", 0 ) + ROMX_LOAD( "plrt16v3e9.u86", 0x0000, 0x1000, CRC(f7e3aa86) SHA1(b642c281e54ad9698cfaec19508ae8b4df50c296), ROM_BIOS(1) ) +ROM_END + +ROM_START( poly2 ) + ROM_REGION( 0x20000, "user", 0 ) + ROM_DEFAULT_BIOS("bas31") + ROM_SYSTEM_BIOS(0, "bas31", "PolyBASIC 3.1") + ROMX_LOAD( "bas1.u92", 0xc000, 0x1000, CRC(340b7d75) SHA1(330d31b5c90c82c08c62e2df40669ca62c8fffed), ROM_BIOS(1) ) + ROMX_LOAD( "bas2.u91", 0xd000, 0x1000, CRC(45152d26) SHA1(7da2663f253031a587705b9db9a18e93ba4db2cf), ROM_BIOS(1) ) + ROMX_LOAD( "bas3.u90", 0xe000, 0x1000, CRC(a6f70e62) SHA1(7912a9da29d682bb5922f3adf6136b4efc0494dc), ROM_BIOS(1) ) + ROMX_LOAD( "bas4.u89", 0xf000, 0x1000, CRC(72d21cea) SHA1(d413490d043845ce4a9cf5cc70bd92ddc931c837), ROM_BIOS(1) ) + + ROM_SYSTEM_BIOS(1, "bas30", "PolyBASIC 3.0") + ROMX_LOAD( "bas1-12-12-84.u92", 0xc000, 0x1000, CRC(a3791342) SHA1(e801db28419eedf6eebdbb5a7eb551ba36c43cd6), ROM_BIOS(2) ) + ROMX_LOAD( "bas2-12-12-84.u91", 0xd000, 0x1000, CRC(3bb5849e) SHA1(71c47a0d3dba096a6a79300edf56ffedce276ac6), ROM_BIOS(2) ) + ROMX_LOAD( "bas3-12-12-84.u90", 0xe000, 0x1000, CRC(a6f70e62) SHA1(7912a9da29d682bb5922f3adf6136b4efc0494dc), ROM_BIOS(2) ) + ROMX_LOAD( "bas4-12-12-84.u89", 0xf000, 0x1000, CRC(8f736cee) SHA1(3ec5cc49a426fc921bbadb2bcc1b86b4768627fa), ROM_BIOS(2) ) + + + ROM_REGION( 0x1000, "system", 0 ) + ROMX_LOAD( "sys31.u86", 0x0000, 0x1000, CRC(fb54c36e) SHA1(934f84a7a99a76b0a017379a6ecd8a8e444cd085), ROM_BIOS(1) ) + ROMX_LOAD( "plrt17-5-11-84.u86", 0x0000, 0x1000, CRC(896165dd) SHA1(005584310f1c689a9b1bb549989c5fedabead6c4), ROM_BIOS(2) ) +ROM_END + +ROM_START( polydev ) + ROM_REGION( 0x20000, "user", 0 ) + ROM_SYSTEM_BIOS(0, "bas34", "PolyBASIC 3.4") + ROMX_LOAD( "v2bas1.bin", 0xc000, 0x1000, CRC(04d96d81) SHA1(8d2d0980afb8c447cf235325e4dc15ed2a200f16), ROM_BIOS(1) ) + ROMX_LOAD( "v2bas2.bin", 0xd000, 0x1000, CRC(3e12f823) SHA1(0b37f2dfa241fac1bf06ca93b19e44a660c7758e), ROM_BIOS(1) ) + ROMX_LOAD( "v2bas3.bin", 0xe000, 0x1000, CRC(22759a84) SHA1(d22edea312567596b4ef92290ffe52a25de01487), ROM_BIOS(1) ) + ROMX_LOAD( "v2bas4.bin", 0xf000, 0x1000, CRC(30650d92) SHA1(4e41ea2ec127b9ed277f5a62d52cb3432d64aa84), ROM_BIOS(1) ) + + ROM_REGION( 0x1000, "system", 0 ) + ROMX_LOAD( "slrt15_00f9.bin", 0x0000, 0x1000, CRC(046a9aef) SHA1(c5c74b0f66e8969c12db03899244e18228be38eb), ROM_BIOS(1) ) ROM_END /* Driver */ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1981, poly1, 0, 0, poly, poly, poly_state, empty_init, "Polycorp", "Poly-1 Educational Computer", MACHINE_NOT_WORKING ) +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP( 1981, poly1, 0, 0, poly, poly1, poly_state, init_poly, "Polycorp", "Poly 1 Educational Computer", MACHINE_NOT_WORKING ) +COMP( 1981, poly1e, poly1, 0, poly, poly1e, poly_state, init_poly, "Polycorp", "Poly 1 Educational Computer (early)", MACHINE_NOT_WORKING ) +COMP( 1984, poly2, poly1, 0, poly2, poly2, poly_state, init_poly, "Polycorp", "Poly 2 Learning System", MACHINE_NOT_WORKING ) +COMP( 1983, polydev, poly1, 0, polydev, poly1, polydev_state, init_poly, "Polycorp", "Poly Development System", MACHINE_NOT_WORKING ) diff --git a/src/mame/includes/poly.h b/src/mame/includes/poly.h new file mode 100644 index 00000000000..35271ad7e84 --- /dev/null +++ b/src/mame/includes/poly.h @@ -0,0 +1,179 @@ +// license:BSD-3-Clause +// copyright-holders:Robbbert,Nigel Barnes +// thanks-to:Andrew Trotman +/*************************************************************************** + + Poly/Proteus (New Zealand) + + 10/07/2011 Skeleton driver. + + http://www.cs.otago.ac.nz/homepages/andrew/poly/Poly.htm + + Andrew has supplied the roms for -bios 1 + + It uses a 6809 for all main functions. There is a Z80 for CP/M, but all + of the roms are 6809 code. + + The keyboard controller is one of those custom XR devices. + Will use the terminal keyboard instead. + + With bios 1, after entering your userid and password, you get a black + screen. This is normal, because it joins to a network which isn't there. + + ToDo: + - Almost Everything! + - Connect up the device ports & lines + - Find out about graphics mode and how it is selected + - Fix Keyboard so that the Enter key tells BASIC to do something + - Find out how to make 2nd teletext screen to display + - Banking + +****************************************************************************/ + +#ifndef MAME_INCLUDES_POLY_H +#define MAME_INCLUDES_POLY_H + +#include "emu.h" +#include "cpu/m6809/m6809.h" +#include "machine/6821pia.h" +#include "machine/6840ptm.h" +#include "machine/6850acia.h" +#include "machine/kr2376.h" +#include "machine/clock.h" +#include "machine/mc6854.h" +#include "machine/bankdev.h" +#include "machine/ram.h" +#include "machine/input_merger.h" +#include "machine/wd_fdc.h" +#include "machine/keyboard.h" +#include "sound/spkrdev.h" +#include "video/saa5050.h" +#include "screen.h" +#include "speaker.h" + +//#include "bus/poly/network.h" + + +class poly_state : public driver_device +{ +public: + poly_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_bankdev(*this, "bankdev") + , m_trom(*this, "saa5050_%u", 1) + , m_pia(*this, "pia%u", 0) + , m_adlc(*this, "mc6854") + , m_ptm(*this, "ptm") + , m_irqs(*this, "irqs") +// , m_kr2376(*this, "kr2376") + , m_kbd(*this, "X%u", 0) + , m_modifiers(*this, "MODIFIERS") + , m_speaker(*this, "speaker") + , m_user(*this, "user") + , m_system(*this, "system") + , m_videoram(*this, "videoram") + , m_dat(*this, "dat") + , m_acia(*this, "acia") + , m_acia_clock(*this, "acia_clock") + { + } + + static constexpr feature_type imperfect_features() { return feature::KEYBOARD; } + + DECLARE_READ8_MEMBER( logical_mem_r ); + DECLARE_WRITE8_MEMBER( logical_mem_w ); + DECLARE_READ8_MEMBER( vector_r ); + void kbd_put(u8 data); // remove when KR2376 is implemented + DECLARE_READ_LINE_MEMBER( kbd_shift_r ); + DECLARE_READ_LINE_MEMBER( kbd_control_r ); + DECLARE_WRITE8_MEMBER( pia0_pa_w ); + DECLARE_WRITE8_MEMBER( pia0_pb_w ); + DECLARE_READ8_MEMBER( pia1_b_in ); + DECLARE_READ8_MEMBER( videoram_1_r ); + DECLARE_READ8_MEMBER( videoram_2_r ); + DECLARE_WRITE_LINE_MEMBER( ptm_o2_callback ); + DECLARE_WRITE_LINE_MEMBER( ptm_o3_callback ); + DECLARE_WRITE8_MEMBER( baud_rate_w ); + TIMER_CALLBACK_MEMBER( set_protect ); + DECLARE_WRITE8_MEMBER( set_protect_w ); + DECLARE_READ8_MEMBER( select_map_r ); + DECLARE_WRITE8_MEMBER( select_map1_w ); + DECLARE_WRITE8_MEMBER( select_map2_w ); + DECLARE_READ8_MEMBER( network_r ); + DECLARE_WRITE8_MEMBER( network_w ); + DECLARE_WRITE_LINE_MEMBER( network_clk_w ); + void init_poly(); + + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + virtual void poly_bank(address_map &map); + + void poly(machine_config &config); + void poly_mem(address_map &map); + void poly2(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_bankdev; + required_device_array m_trom; + required_device_array m_pia; + required_device m_adlc; + required_device m_ptm; + required_device m_irqs; + //required_device m_kr2376; + required_ioport_array<8> m_kbd; + required_ioport m_modifiers; + required_device m_speaker; + required_memory_region m_user; + required_memory_region m_system; + required_shared_ptr m_videoram; + required_shared_ptr m_dat; + optional_device m_acia; + optional_device m_acia_clock; + uint8_t m_video_pa, m_video_pb; + uint8_t m_term_data; + + inline offs_t physical(offs_t offset); + + int m_dat_bank; +}; + + +class polydev_state : public poly_state +{ +public: + polydev_state(const machine_config &mconfig, device_type type, const char *tag) + : poly_state(mconfig, type, tag) + , m_fdc(*this, "fdc") + , m_floppy(*this, "fdc:%u", 0) + , m_current_floppy(nullptr) + { + } + + static constexpr feature_type imperfect_features() { return feature::KEYBOARD; } + + DECLARE_WRITE8_MEMBER(drive_register_w); + DECLARE_READ8_MEMBER(drive_register_r); + DECLARE_WRITE_LINE_MEMBER(motor_w); + DECLARE_READ8_MEMBER(fdc_inv_r); + DECLARE_WRITE8_MEMBER(fdc_inv_w); + + void polydev(machine_config &config); + +protected: + virtual void poly_bank(address_map &map) override; + +private: + DECLARE_FLOPPY_FORMATS(floppy_formats); + + required_device m_fdc; + required_device_array m_floppy; + floppy_image_device *m_current_floppy; +}; + +#endif /* MAME_INCLUDES_POLY_H */ diff --git a/src/mame/machine/poly.cpp b/src/mame/machine/poly.cpp new file mode 100644 index 00000000000..67d5112f62f --- /dev/null +++ b/src/mame/machine/poly.cpp @@ -0,0 +1,259 @@ +// license:BSD-3-Clause +// copyright-holders:Robbbert,Nigel Barnes +// thanks-to:Andrew Trotman +/*************************************************************************** + + Poly 1/2 (New Zealand) + +****************************************************************************/ + +#include "emu.h" +#include "includes/poly.h" + + +inline offs_t poly_state::physical(offs_t offset) +{ + return (((~m_dat[(m_dat_bank << 3) | (offset >> 13)]) & 0x0f) << 13) | (offset & 0x1fff); +} + +READ8_MEMBER(poly_state::logical_mem_r) +{ + return m_user->base()[physical(offset)]; +} + +WRITE8_MEMBER(poly_state::logical_mem_w) +{ + m_user->base()[physical(offset)] = data; +} + + +READ8_MEMBER(poly_state::vector_r) +{ + /* system mode is selected by a vector fetch (interrupt and reset) */ + m_bankdev->set_bank(0); + + return m_system->base()[0x0ff0 + offset]; +} + + +TIMER_CALLBACK_MEMBER(poly_state::set_protect) +{ + m_bankdev->set_bank(1); +} + +WRITE8_MEMBER(poly_state::set_protect_w) +{ + /* set protect after 1 E cycle */ + machine().scheduler().timer_set(m_maincpu->cycles_to_attotime(2), timer_expired_delegate(FUNC(poly_state::set_protect), this)); +} + + +READ8_MEMBER(poly_state::select_map_r) +{ + return 0x00; +} + +WRITE8_MEMBER(poly_state::select_map1_w) +{ + m_dat_bank = 0; +} + +WRITE8_MEMBER(poly_state::select_map2_w) +{ + m_dat_bank = 1; +} + + +WRITE8_MEMBER(poly_state::pia0_pa_w) +{ + logerror("PIA0: Port A out: %02X\n", data); + m_video_pa = data; + m_ptm->set_g3(BIT(data, 7)); +} + +WRITE8_MEMBER(poly_state::pia0_pb_w) +{ + logerror("PIA0: Port B out: %02X\n", data); + m_video_pb = data; +} + + +READ8_MEMBER(poly_state::pia1_b_in) +{ + // B1 - D0 + // B2 - D1 + // B3 - D2 + // B4 - D3 + // B5 - D4 + // B6 + // B7 + // B8 - D6 + // STROBE - D7 + + /* return key code */ + //data = m_kr2376->data_r(space, 0) & 0x7f; + /* bit 5 is derived from data bits 5,6 and caps lock */ + //data |= !(!(BIT(m_kr2376->data_r(space, 0), 6) && !caps_lock) && !(caps_lock && BIT(m_kr2376->data_r(space, 0), 5))) << 5; + /* bit 6 is data bit 7 */ + //data |= BIT(m_kr2376->data_r(space, 0), 7) << 6; + /* caps lock needs verifying */ + //data |= ((caps_lock && BIT(m_kr2376->data_r(space, 0), 6)) ? 0 : BIT(m_kr2376->data_r(space, 0), 5)) << 5; + /* bit 7 is the strobe value */ + //data |= m_kr2376->get_output_pin(kr2376_device::KR2376_SO) << 7; + + // return ascii key value, bit 7 is the strobe value + uint8_t data = m_term_data; + m_term_data &= 0x7f; + return data; +} + + +READ8_MEMBER(poly_state::videoram_1_r) +{ + return m_videoram[offset]; +} + +READ8_MEMBER(poly_state::videoram_2_r) +{ + return m_videoram[offset + 0x400]; +} + + +void poly_state::kbd_put(u8 data) +{ + m_term_data = data | 0x80; + + m_pia[1]->cb1_w(1); + m_pia[1]->cb1_w(0); +} + +READ_LINE_MEMBER(poly_state::kbd_shift_r) +{ + return BIT(m_modifiers->read(), 1); +} + +READ_LINE_MEMBER(poly_state::kbd_control_r) +{ + return BIT(m_modifiers->read(), 0); +} + + +WRITE_LINE_MEMBER(poly_state::ptm_o2_callback) +{ + m_ptm->set_c1(state); +} + +WRITE_LINE_MEMBER(poly_state::ptm_o3_callback) +{ + m_speaker->level_w(state); +} + +WRITE8_MEMBER(poly_state::baud_rate_w ) +{ + /* baud rate controller (0=9600,2=4800,4=2400,6=1200,8=600,A=300) */ + int selector = (data & 0x0e) >> 1; + m_acia_clock->set_clock_scale((selector <= 5) ? 1.0 / (1 << selector) : 0.0); +} + +READ8_MEMBER(poly_state::network_r) +{ + return m_adlc->read(space, offset >> 1); +} + +WRITE8_MEMBER(poly_state::network_w) +{ + m_adlc->write(space, offset >> 1, data); +} + +WRITE_LINE_MEMBER(poly_state::network_clk_w) +{ + m_adlc->rxc_w(state); + m_adlc->txc_w(state); +} + + +WRITE8_MEMBER(polydev_state::drive_register_w) +{ + /* drive select */ + switch (data & 0x03) + { + case 0: + m_current_floppy = m_floppy[0]->get_device(); + break; + + case 1: + m_current_floppy = m_floppy[1]->get_device(); + break; + + default: + m_current_floppy = nullptr; + break; + } + m_fdc->set_floppy(m_current_floppy); + + if (m_current_floppy) + { + /* side select */ + m_current_floppy->ss_w(BIT(data, 6)); + } +} + +READ8_MEMBER(polydev_state::drive_register_r) +{ + /* disk change */ + return (m_current_floppy ? m_current_floppy->dskchg_r() : 1) << 1; +} + +WRITE_LINE_MEMBER(polydev_state::motor_w) +{ + if (m_current_floppy) m_current_floppy->mon_w(!state); +} + +READ8_MEMBER(polydev_state::fdc_inv_r) +{ + return m_fdc->gen_r(offset) ^ 0xff; +} + +WRITE8_MEMBER(polydev_state::fdc_inv_w) +{ + m_fdc->gen_w(offset, data ^ 0xff); +} + + +uint32_t poly_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + /* + PA0 Not used. Connected to CA2. + PA1 ( Mix colour 0) Blue 1) Green 0) Red 1) No + PA2 ( Graphics 1 0) 0) 1) 1) Mix + PA3 1 = Enable Teletext 1 screen + PA4 1 = 480 Graphics mode. 0 = 240 Graphics mode. + PA5 1 = Enable Graphics 1 screen or 480 Graphics screen. + PA6 1 = Mix Mode 0 = Priority mode + PA7 Must be 0. Connected to PA7 and timer G3. + + PB0 1 = Enable Teletext 2 screen. + PB1 1 = Enable Graphics 2 (must be 0 for 480 Graphics) + PB2 ( Mix colour 0) Blue 1) Green 0) Red 1) No + PB3 ( Graphics 2 0) 0) 1) 1) Mix + PB4 1 = Enable Red Background + PB5 1 = Enable Green Background + PB6 1 = Enable Blue Background + PB7 Not used. + + CA1 Connected to PA7 and timer G3. Must be 0. + CA2 Not used. Connected to PA0. + CB1 Not used. + CB2 Not used. + */ + + /* Enable Teletext 1 screen */ + if (BIT(m_video_pa, 3)) + m_trom[0]->screen_update(screen, bitmap, cliprect); + + /* Enable Teletext 2 screen */ + if (BIT(m_video_pb, 0)) + m_trom[1]->screen_update(screen, bitmap, cliprect); + + return 0; +} diff --git a/src/mame/mame.lst b/src/mame/mame.lst index c055dda6958..2c597782235 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -32126,7 +32126,10 @@ sshooter12 // (c) 1998 P&P Marketing sshooter17 // (c) 1998 P&P Marketing @source:poly.cpp -poly1 // +poly1 // Poly 1 +poly1e // Poly 1 (early) +poly2 // Poly 2 +polydev // Poly Development @source:poly88.cpp poly88 // -- cgit v1.2.3