trunk/src/mess/drivers/a6809.c
| r23771 | r23772 | |
| 7 | 7 | Acorn System 3 update? |
| 8 | 8 | http://acorn.chriswhy.co.uk/8bit_Upgrades/Acorn_6809_CPU.html |
| 9 | 9 | |
| 10 | ToDo: |
| 11 | - FDC (address A00) |
| 12 | - Cursor |
| 13 | - Scrolling |
| 14 | - Centronics Printer (VIA port A) |
| 15 | |
| 16 | |
| 10 | 17 | ****************************************************************************/ |
| 11 | 18 | |
| 12 | 19 | #include "emu.h" |
| r23771 | r23772 | |
| 15 | 22 | #include "machine/keyboard.h" |
| 16 | 23 | #include "video/saa5050.h" |
| 17 | 24 | #include "video/mc6845.h" |
| 25 | #include "imagedev/cassette.h" |
| 26 | #include "sound/wave.h" |
| 18 | 27 | |
| 19 | 28 | |
| 20 | 29 | class a6809_state : public driver_device |
| r23771 | r23772 | |
| 22 | 31 | public: |
| 23 | 32 | a6809_state(const machine_config &mconfig, device_type type, const char *tag) |
| 24 | 33 | : 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"), |
| 28 | 37 | m_maincpu(*this, "maincpu") { } |
| 29 | 38 | |
| 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); |
| 45 | private: |
| 46 | UINT8 m_cass_data[4]; |
| 47 | bool m_cass_state; |
| 48 | UINT8 m_keydata; |
| 49 | virtual void machine_reset(); |
| 30 | 50 | required_device<via6522_device> m_via; |
| 31 | 51 | 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; |
| 39 | 53 | required_device<cpu_device> m_maincpu; |
| 40 | 54 | }; |
| 41 | 55 | |
| r23771 | r23772 | |
| 97 | 111 | |
| 98 | 112 | READ8_MEMBER( a6809_state::via_pb_r ) |
| 99 | 113 | { |
| 100 | | return m_keydata; |
| 114 | return m_keydata | m_cass_data[2]; |
| 101 | 115 | } |
| 102 | 116 | |
| 117 | WRITE_LINE_MEMBER( a6809_state::cass_w ) |
| 118 | { |
| 119 | m_cass_state = state; |
| 120 | } |
| 121 | |
| 103 | 122 | static const via6522_interface via_intf = |
| 104 | 123 | { |
| 105 | 124 | DEVCB_NULL, |
| r23771 | r23772 | |
| 113 | 132 | DEVCB_NULL, |
| 114 | 133 | DEVCB_NULL, |
| 115 | 134 | DEVCB_NULL, |
| 116 | | DEVCB_NULL, |
| 135 | DEVCB_DRIVER_LINE_MEMBER(a6809_state, cass_w), // out CB2 |
| 117 | 136 | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0) |
| 118 | 137 | }; |
| 119 | 138 | |
| 139 | TIMER_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 | |
| 149 | TIMER_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 | |
| 120 | 163 | WRITE8_MEMBER( a6809_state::kb_w ) |
| 121 | 164 | { |
| 122 | | m_keydata = data; |
| 165 | m_keydata = data & 0x7f; |
| 123 | 166 | |
| 124 | 167 | m_via->write_cb1(1); |
| 125 | 168 | m_via->write_cb1(0); |
| r23771 | r23772 | |
| 136 | 179 | MCFG_CPU_PROGRAM_MAP(a6809_mem) |
| 137 | 180 | MCFG_CPU_IO_MAP(a6809_io) |
| 138 | 181 | |
| 139 | | |
| 140 | 182 | /* video hardware */ |
| 141 | 183 | MCFG_SCREEN_ADD("screen", RASTER) |
| 142 | 184 | MCFG_SCREEN_REFRESH_RATE(50) |
| r23771 | r23772 | |
| 145 | 187 | MCFG_SCREEN_VISIBLE_AREA(0, 40 * 12 - 1, 0, 24 * 20 - 1) |
| 146 | 188 | MCFG_SCREEN_UPDATE_DEVICE("saa5050", saa5050_device, screen_update) |
| 147 | 189 | |
| 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) |
| 148 | 195 | MCFG_SAA5050_ADD("saa5050", 6000000, a6809_saa5050_intf) |
| 149 | 196 | |
| 197 | /* Devices */ |
| 150 | 198 | MCFG_VIA6522_ADD("via", XTAL_4MHz / 4, via_intf) |
| 151 | | |
| 152 | 199 | MCFG_MC6845_ADD("mc6845", MC6845, XTAL_4MHz / 2, a6809_crtc6845_interface) |
| 153 | | |
| 154 | 200 | 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)) |
| 155 | 204 | MACHINE_CONFIG_END |
| 156 | 205 | |
| 157 | 206 | /* ROM definition */ |
| r23771 | r23772 | |
| 166 | 215 | /* Driver */ |
| 167 | 216 | |
| 168 | 217 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 169 | | COMP( 1980, a6809, 0, 0, a6809, a6809, driver_device, 0, "Acorn", "System 3 (6809 CPU)", GAME_NOT_WORKING | GAME_NO_SOUND ) |
| 218 | COMP( 1980, a6809, 0, 0, a6809, a6809, driver_device, 0, "Acorn", "System 3 (6809 CPU)", GAME_NOT_WORKING ) |