Previous 199869 Revisions Next

r23772 Tuesday 18th June, 2013 at 12:37:51 UTC by Robbbert
(MESS) A6809: added cassette
[src/mess/drivers]a6809.c

trunk/src/mess/drivers/a6809.c
r23771r23772
77    Acorn System 3 update?
88    http://acorn.chriswhy.co.uk/8bit_Upgrades/Acorn_6809_CPU.html
99
10ToDo:
11    - FDC (address A00)
12    - Cursor
13    - Scrolling
14    - Centronics Printer (VIA port A)
15
16
1017****************************************************************************/
1118
1219#include "emu.h"
r23771r23772
1522#include "machine/keyboard.h"
1623#include "video/saa5050.h"
1724#include "video/mc6845.h"
25#include "imagedev/cassette.h"
26#include "sound/wave.h"
1827
1928
2029class a6809_state : public driver_device
r23771r23772
2231public:
2332   a6809_state(const machine_config &mconfig, device_type type, const char *tag)
2433      : driver_device(mconfig, type, tag),
25         m_via(*this, "via"),
26         m_videoram(*this, "videoram")
27   ,
34      m_via(*this, "via"),
35      m_videoram(*this, "videoram"),
36      m_cass(*this, "cassette"),
2837      m_maincpu(*this, "maincpu") { }
2938
39   DECLARE_READ8_MEMBER(via_pb_r);
40   DECLARE_WRITE8_MEMBER(kb_w);
41   DECLARE_READ8_MEMBER(videoram_r);
42   DECLARE_WRITE_LINE_MEMBER(cass_w);
43   TIMER_DEVICE_CALLBACK_MEMBER(a6809_c);
44   TIMER_DEVICE_CALLBACK_MEMBER(a6809_p);
45private:
46   UINT8 m_cass_data[4];
47   bool m_cass_state;
48   UINT8 m_keydata;
49   virtual void machine_reset();
3050   required_device<via6522_device> m_via;
3151   required_shared_ptr<UINT8> m_videoram;
32
33   DECLARE_READ8_MEMBER( via_pb_r );
34   DECLARE_WRITE8_MEMBER( kb_w );
35   DECLARE_READ8_MEMBER( videoram_r );
36
37   UINT8 m_keydata;
38   virtual void machine_reset();
52   required_device<cassette_image_device> m_cass;
3953   required_device<cpu_device> m_maincpu;
4054};
4155
r23771r23772
97111
98112READ8_MEMBER( a6809_state::via_pb_r )
99113{
100   return m_keydata;
114   return m_keydata | m_cass_data[2];
101115}
102116
117WRITE_LINE_MEMBER( a6809_state::cass_w )
118{
119   m_cass_state = state;
120}
121
103122static const via6522_interface via_intf =
104123{
105124   DEVCB_NULL,
r23771r23772
113132   DEVCB_NULL,
114133   DEVCB_NULL,
115134   DEVCB_NULL,
116   DEVCB_NULL,
135   DEVCB_DRIVER_LINE_MEMBER(a6809_state, cass_w), // out CB2
117136   DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0)
118137};
119138
139TIMER_DEVICE_CALLBACK_MEMBER(a6809_state::a6809_c)
140{
141   m_cass_data[3]++;
142
143   if (m_cass_state)
144      m_cass->output(BIT(m_cass_data[3], 0) ? -1.0 : +1.0); // 2400Hz
145   else
146      m_cass->output(BIT(m_cass_data[3], 1) ? -1.0 : +1.0); // 1200Hz
147}
148
149TIMER_DEVICE_CALLBACK_MEMBER(a6809_state::a6809_p)
150{
151   /* cassette - turn 1200/2400Hz to a bit */
152   m_cass_data[1]++;
153   UINT8 cass_ws = (m_cass->input() > +0.03) ? 1 : 0;
154
155   if (cass_ws != m_cass_data[0])
156   {
157      m_cass_data[0] = cass_ws;
158      m_cass_data[2] = ((m_cass_data[1] < 12) ? 128 : 0);
159      m_cass_data[1] = 0;
160   }
161}
162
120163WRITE8_MEMBER( a6809_state::kb_w )
121164{
122   m_keydata = data;
165   m_keydata = data & 0x7f;
123166
124167   m_via->write_cb1(1);
125168   m_via->write_cb1(0);
r23771r23772
136179   MCFG_CPU_PROGRAM_MAP(a6809_mem)
137180   MCFG_CPU_IO_MAP(a6809_io)
138181
139
140182   /* video hardware */
141183   MCFG_SCREEN_ADD("screen", RASTER)
142184   MCFG_SCREEN_REFRESH_RATE(50)
r23771r23772
145187   MCFG_SCREEN_VISIBLE_AREA(0, 40 * 12 - 1, 0, 24 * 20 - 1)
146188   MCFG_SCREEN_UPDATE_DEVICE("saa5050", saa5050_device, screen_update)
147189
190
191   /* sound hardware */
192   MCFG_SPEAKER_STANDARD_MONO("mono")
193   MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
194   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
148195   MCFG_SAA5050_ADD("saa5050", 6000000, a6809_saa5050_intf)
149196
197   /* Devices */
150198   MCFG_VIA6522_ADD("via", XTAL_4MHz / 4, via_intf)
151
152199   MCFG_MC6845_ADD("mc6845", MC6845, XTAL_4MHz / 2, a6809_crtc6845_interface)
153
154200   MCFG_ASCII_KEYBOARD_ADD("keyboard", kb_intf)
201   MCFG_CASSETTE_ADD( "cassette", default_cassette_interface )
202   MCFG_TIMER_DRIVER_ADD_PERIODIC("a6809_c", a6809_state, a6809_c, attotime::from_hz(4800))
203   MCFG_TIMER_DRIVER_ADD_PERIODIC("a6809_p", a6809_state, a6809_p, attotime::from_hz(40000))
155204MACHINE_CONFIG_END
156205
157206/* ROM definition */
r23771r23772
166215/* Driver */
167216
168217/*    YEAR   NAME    PARENT  COMPAT   MACHINE    INPUT    INIT    COMPANY   FULLNAME       FLAGS */
169COMP( 1980, a6809,  0,      0,       a6809,     a6809, driver_device,   0,      "Acorn",  "System 3 (6809 CPU)", GAME_NOT_WORKING | GAME_NO_SOUND )
218COMP( 1980, a6809,  0,      0,       a6809,     a6809, driver_device,   0,      "Acorn",  "System 3 (6809 CPU)", GAME_NOT_WORKING )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team