diff options
author | Nigel Barnes <Pernod70@users.noreply.github.com> | 2018-05-25 11:44:38 +0100 |
---|---|---|
committer | Nigel Barnes <Pernod70@users.noreply.github.com> | 2018-05-25 11:44:38 +0100 |
commit | 75a36e30939dad5e4084c5cafb01ec272471d960 (patch) | |
tree | 65bc3acc171c66752b75d31b7d909f6b4e7a9ca9 /src/mame/drivers | |
parent | 28826c39fae5768dd7763322d5c4276ae95b278c (diff) |
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]
Diffstat (limited to 'src/mame/drivers')
-rw-r--r-- | src/mame/drivers/poly.cpp | 498 |
1 files changed, 359 insertions, 139 deletions
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<cpu_device> m_maincpu; - required_device<pia6821_device> m_pia0; - required_device<pia6821_device> m_pia1; - required_device<ptm6840_device> m_ptm; - required_device<speaker_sound_device> m_speaker; - required_device<clock_device> m_acia_clock; - required_shared_ptr<uint8_t> 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 ) |