summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mess/drivers/a6809.c83
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 )