diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mess/drivers/a6809.c | 83 |
1 files changed, 66 insertions, 17 deletions
diff --git a/src/mess/drivers/a6809.c b/src/mess/drivers/a6809.c index 403ee8a9437..21fe94d0f5a 100644 --- a/src/mess/drivers/a6809.c +++ b/src/mess/drivers/a6809.c @@ -7,6 +7,13 @@ Acorn System 3 update? http://acorn.chriswhy.co.uk/8bit_Upgrades/Acorn_6809_CPU.html +ToDo: + - FDC (address A00) + - Cursor + - Scrolling + - Centronics Printer (VIA port A) + + ****************************************************************************/ #include "emu.h" @@ -15,6 +22,8 @@ #include "machine/keyboard.h" #include "video/saa5050.h" #include "video/mc6845.h" +#include "imagedev/cassette.h" +#include "sound/wave.h" class a6809_state : public driver_device @@ -22,20 +31,25 @@ class a6809_state : public driver_device public: a6809_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_via(*this, "via"), - m_videoram(*this, "videoram") - , + m_via(*this, "via"), + m_videoram(*this, "videoram"), + m_cass(*this, "cassette"), m_maincpu(*this, "maincpu") { } - required_device<via6522_device> m_via; - required_shared_ptr<UINT8> m_videoram; - - DECLARE_READ8_MEMBER( via_pb_r ); - DECLARE_WRITE8_MEMBER( kb_w ); - DECLARE_READ8_MEMBER( videoram_r ); - + DECLARE_READ8_MEMBER(via_pb_r); + DECLARE_WRITE8_MEMBER(kb_w); + DECLARE_READ8_MEMBER(videoram_r); + DECLARE_WRITE_LINE_MEMBER(cass_w); + TIMER_DEVICE_CALLBACK_MEMBER(a6809_c); + TIMER_DEVICE_CALLBACK_MEMBER(a6809_p); +private: + UINT8 m_cass_data[4]; + bool m_cass_state; UINT8 m_keydata; virtual void machine_reset(); + required_device<via6522_device> m_via; + required_shared_ptr<UINT8> m_videoram; + required_device<cassette_image_device> m_cass; required_device<cpu_device> m_maincpu; }; @@ -97,7 +111,12 @@ static SAA5050_INTERFACE( a6809_saa5050_intf ) READ8_MEMBER( a6809_state::via_pb_r ) { - return m_keydata; + return m_keydata | m_cass_data[2]; +} + +WRITE_LINE_MEMBER( a6809_state::cass_w ) +{ + m_cass_state = state; } static const via6522_interface via_intf = @@ -113,13 +132,37 @@ static const via6522_interface via_intf = DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, - DEVCB_NULL, + DEVCB_DRIVER_LINE_MEMBER(a6809_state, cass_w), // out CB2 DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0) }; +TIMER_DEVICE_CALLBACK_MEMBER(a6809_state::a6809_c) +{ + m_cass_data[3]++; + + if (m_cass_state) + m_cass->output(BIT(m_cass_data[3], 0) ? -1.0 : +1.0); // 2400Hz + else + m_cass->output(BIT(m_cass_data[3], 1) ? -1.0 : +1.0); // 1200Hz +} + +TIMER_DEVICE_CALLBACK_MEMBER(a6809_state::a6809_p) +{ + /* cassette - turn 1200/2400Hz to a bit */ + m_cass_data[1]++; + UINT8 cass_ws = (m_cass->input() > +0.03) ? 1 : 0; + + if (cass_ws != m_cass_data[0]) + { + m_cass_data[0] = cass_ws; + m_cass_data[2] = ((m_cass_data[1] < 12) ? 128 : 0); + m_cass_data[1] = 0; + } +} + WRITE8_MEMBER( a6809_state::kb_w ) { - m_keydata = data; + m_keydata = data & 0x7f; m_via->write_cb1(1); m_via->write_cb1(0); @@ -136,7 +179,6 @@ static MACHINE_CONFIG_START( a6809, a6809_state ) MCFG_CPU_PROGRAM_MAP(a6809_mem) MCFG_CPU_IO_MAP(a6809_io) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) @@ -145,13 +187,20 @@ static MACHINE_CONFIG_START( a6809, a6809_state ) 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_WAVE_ADD(WAVE_TAG, "cassette") + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MCFG_SAA5050_ADD("saa5050", 6000000, a6809_saa5050_intf) + /* Devices */ MCFG_VIA6522_ADD("via", XTAL_4MHz / 4, via_intf) - MCFG_MC6845_ADD("mc6845", MC6845, XTAL_4MHz / 2, a6809_crtc6845_interface) - MCFG_ASCII_KEYBOARD_ADD("keyboard", kb_intf) + MCFG_CASSETTE_ADD( "cassette", default_cassette_interface ) + MCFG_TIMER_DRIVER_ADD_PERIODIC("a6809_c", a6809_state, a6809_c, attotime::from_hz(4800)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("a6809_p", a6809_state, a6809_p, attotime::from_hz(40000)) MACHINE_CONFIG_END /* ROM definition */ @@ -166,4 +215,4 @@ ROM_END /* Driver */ /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ -COMP( 1980, a6809, 0, 0, a6809, a6809, driver_device, 0, "Acorn", "System 3 (6809 CPU)", GAME_NOT_WORKING | GAME_NO_SOUND ) +COMP( 1980, a6809, 0, 0, a6809, a6809, driver_device, 0, "Acorn", "System 3 (6809 CPU)", GAME_NOT_WORKING ) |