summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/poly.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/poly.c')
-rw-r--r--src/mame/drivers/poly.c229
1 files changed, 229 insertions, 0 deletions
diff --git a/src/mame/drivers/poly.c b/src/mame/drivers/poly.c
new file mode 100644
index 00000000000..0ae7749316b
--- /dev/null
+++ b/src/mame/drivers/poly.c
@@ -0,0 +1,229 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert
+/***************************************************************************
+
+ 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
+
+****************************************************************************/
+
+#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/mc6854.h"
+#include "video/saa5050.h"
+#include "machine/keyboard.h"
+#include "sound/speaker.h"
+
+#define KEYBOARD_TAG "keyboard"
+
+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_pia0(*this, "pia0"),
+ m_pia1(*this, "pia1"),
+ m_acia(*this, "acia"),
+ m_ptm(*this, "ptm"),
+ m_speaker(*this, "speaker"),
+ m_videoram(*this, "videoram")
+ {
+ }
+
+ DECLARE_WRITE8_MEMBER(kbd_put);
+ DECLARE_READ8_MEMBER(pia1_b_in);
+ DECLARE_READ8_MEMBER(videoram_r);
+ DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
+ DECLARE_WRITE8_MEMBER( ptm_o2_callback );
+ DECLARE_WRITE8_MEMBER( ptm_o3_callback );
+
+protected:
+ virtual void machine_reset();
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<pia6821_device> m_pia0;
+ required_device<pia6821_device> m_pia1;
+ required_device<acia6850_device> m_acia;
+ required_device<ptm6840_device> m_ptm;
+ required_device<speaker_sound_device> m_speaker;
+ required_shared_ptr<UINT8> m_videoram;
+ UINT8 m_term_data;
+};
+
+
+static ADDRESS_MAP_START(poly_mem, AS_PROGRAM, 8, poly_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x0000,0x9fff) AM_RAM
+ AM_RANGE(0xa000,0xcfff) AM_ROM
+ AM_RANGE(0xd000,0xdfff) AM_RAM
+ AM_RANGE(0xe000,0xe003) AM_DEVREADWRITE("pia0", pia6821_device, read, write) //video control PIA 6821
+ AM_RANGE(0xe004,0xe004) AM_DEVREADWRITE("acia", acia6850_device, status_r, control_w)
+ AM_RANGE(0xe005,0xe005) AM_DEVREADWRITE("acia", acia6850_device, data_r, data_w)
+ //AM_RANGE(0xe006, 0xe006) // baud rate controller (0=9600,2=4800,4=2400,6=1200,8=600,A=300)
+ AM_RANGE(0xe00c,0xe00f) AM_DEVREADWRITE("pia1", pia6821_device, read, write) //keyboard PIA 6821
+ AM_RANGE(0xe020,0xe027) AM_DEVREADWRITE("ptm", ptm6840_device, read, write) //timer 6840
+ AM_RANGE(0xe030,0xe037) AM_DEVREADWRITE("adlc", mc6854_device, read, write) //Data Link Controller 6854
+ AM_RANGE(0xe040,0xe040) AM_NOP //Set protect flip-flop after 1 E-cycle
+ AM_RANGE(0xe050,0xe05f) AM_RAM //Dynamic Address Translater (arranges memory banks)
+ // AM_RANGE(0xe060,0xe060) Select Map 1
+ // AM_RANGE(0xe070,0xe070) Select Map 2
+ AM_RANGE(0xe800,0xebbf) AM_RAM AM_SHARE("videoram")
+ AM_RANGE(0xebc0,0xebff) AM_RAM
+ AM_RANGE(0xec00,0xefbf) AM_RAM // screen 2 AM_SHARE("videoram")
+ AM_RANGE(0xefc0,0xefff) AM_RAM
+ AM_RANGE(0xf000,0xffff) AM_ROM
+ADDRESS_MAP_END
+
+
+/* Input ports */
+static INPUT_PORTS_START( poly )
+INPUT_PORTS_END
+
+
+void poly_state::machine_reset()
+{
+}
+
+READ8_MEMBER( poly_state::pia1_b_in )
+{
+// return ascii key value, bit 7 is the strobe value
+ UINT8 data = m_term_data;
+ m_term_data &= 0x7f;
+ return data;
+}
+
+READ8_MEMBER( poly_state::videoram_r )
+{
+ return m_videoram[offset];
+}
+
+WRITE8_MEMBER( poly_state::kbd_put )
+{
+ m_term_data = data | 0x80;
+
+ m_pia1->cb1_w(1);
+ m_pia1->cb1_w(0);
+}
+
+WRITE_LINE_MEMBER( poly_state::write_acia_clock )
+{
+ m_acia->write_txc(state);
+ m_acia->write_rxc(state);
+}
+
+WRITE8_MEMBER( poly_state::ptm_o2_callback )
+{
+ m_ptm->set_c1(data);
+}
+
+WRITE8_MEMBER( poly_state::ptm_o3_callback )
+{
+ m_speaker->level_w(data);
+}
+
+static MACHINE_CONFIG_START( poly, poly_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M6809E, XTAL_12MHz / 3) // 12.0576MHz
+ MCFG_CPU_PROGRAM_MAP(poly_mem)
+
+ /* 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)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+
+ /* Devices */
+ MCFG_DEVICE_ADD("saa5050", SAA5050, 6000000)
+ MCFG_SAA5050_D_CALLBACK(READ8(poly_state, videoram_r))
+ MCFG_SAA5050_SCREEN_SIZE(40, 24, 40)
+
+ MCFG_DEVICE_ADD("pia0", PIA6821, 0)
+ MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line))
+ MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line))
+
+ MCFG_DEVICE_ADD("pia1", PIA6821, 0)
+ MCFG_PIA_READPB_HANDLER(READ8(poly_state, pia1_b_in))
+ // CB1 kbd strobe
+ MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line))
+ MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line))
+
+ MCFG_DEVICE_ADD("ptm", PTM6840, 0)
+ MCFG_PTM6840_INTERNAL_CLOCK(XTAL_12MHz / 3)
+ MCFG_PTM6840_EXTERNAL_CLOCKS(0, 0, 0)
+ MCFG_PTM6840_OUT1_CB(WRITE8(poly_state, ptm_o2_callback))
+ MCFG_PTM6840_OUT2_CB(WRITE8(poly_state, ptm_o3_callback))
+ MCFG_PTM6840_IRQ_CB(INPUTLINE("maincpu", M6809_IRQ_LINE))
+
+ MCFG_DEVICE_ADD("acia", ACIA6850, 0)
+ //MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
+ //MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))
+
+ //MCFG_DEVICE_ADD("acia_clock", CLOCK, 1)
+ //MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(poly_state, write_acia_clock))
+
+ MCFG_DEVICE_ADD("adlc", MC6854, 0)
+
+ MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
+ MCFG_GENERIC_KEYBOARD_CB(WRITE8(poly_state, kbd_put))
+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_END
+
+/* Driver */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1981, poly1, 0, 0, poly, poly, driver_device, 0, "Polycorp", "Poly-1 Educational Computer", MACHINE_NOT_WORKING )