trunk/src/emu/machine/aakart.c
| r19208 | r19209 | |
| 2 | 2 | |
| 3 | 3 | Acorn Archimedes KART interface |
| 4 | 4 | |
| 5 | TODO: |
| 6 | - FIFO |
| 7 | |
| 5 | 8 | ***************************************************************************/ |
| 6 | 9 | |
| 7 | 10 | #include "emu.h" |
| r19208 | r19209 | |
| 16 | 19 | // device type definition |
| 17 | 20 | const device_type AAKART = &device_creator<aakart_device>; |
| 18 | 21 | |
| 22 | #define HRST 0xff |
| 23 | #define RAK1 0xfe |
| 24 | #define RAK2 0xfd |
| 25 | #define BACK 0x3f |
| 26 | #define SMAK 0x33 /* keyboard + mouse ack */ |
| 27 | #define MACK 0x32 /* mouse ack */ |
| 28 | #define SACK 0x31 /* keyboard ack */ |
| 29 | #define NACK 0x30 /* no data ack */ |
| 30 | #define RQID 0x20 |
| 19 | 31 | |
| 20 | 32 | //************************************************************************** |
| 21 | 33 | // LIVE DEVICE |
| r19208 | r19209 | |
| 48 | 60 | |
| 49 | 61 | void aakart_device::device_start() |
| 50 | 62 | { |
| 63 | m_out_tx_func.resolve(m_out_tx_cb, *this); |
| 64 | m_out_rx_func.resolve(m_out_rx_cb, *this); |
| 65 | m_rxtimer = timer_alloc(RX_TIMER); |
| 66 | m_rxtimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock())); |
| 67 | m_txtimer = timer_alloc(TX_TIMER); |
| 68 | m_txtimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock())); |
| 69 | m_mousetimer = timer_alloc(MOUSE_TIMER); |
| 70 | m_mousetimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock())); |
| 71 | m_keybtimer = timer_alloc(KEYB_TIMER); |
| 72 | m_keybtimer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock())); |
| 73 | } |
| 51 | 74 | |
| 75 | //------------------------------------------------- |
| 76 | // device_config_complete - perform any |
| 77 | // operations now that the configuration is |
| 78 | // complete |
| 79 | //------------------------------------------------- |
| 80 | |
| 81 | void aakart_device::device_config_complete() |
| 82 | { |
| 83 | // inherit a copy of the static data |
| 84 | const aakart_interface *intf = reinterpret_cast<const aakart_interface *>(static_config()); |
| 85 | if (intf != NULL) |
| 86 | *static_cast<aakart_interface *>(this) = *intf; |
| 87 | |
| 88 | // or initialize to defaults if none provided |
| 89 | else |
| 90 | { |
| 91 | memset(&m_out_tx_cb, 0, sizeof(m_out_tx_cb)); |
| 92 | memset(&m_out_rx_cb, 0, sizeof(m_out_rx_cb)); |
| 93 | } |
| 52 | 94 | } |
| 53 | 95 | |
| 54 | | |
| 55 | 96 | //------------------------------------------------- |
| 56 | 97 | // device_reset - device-specific reset |
| 57 | 98 | //------------------------------------------------- |
| 58 | 99 | |
| 59 | 100 | void aakart_device::device_reset() |
| 60 | 101 | { |
| 102 | m_status = STATUS_NORMAL; |
| 103 | m_new_command = 0; |
| 104 | m_rx = -1; |
| 61 | 105 | } |
| 62 | 106 | |
| 107 | //------------------------------------------------- |
| 108 | // device_timer - handler timer events |
| 109 | //------------------------------------------------- |
| 63 | 110 | |
| 111 | void aakart_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 112 | { |
| 113 | #if 0 |
| 114 | if(id == KEYB_TIMER && m_keyb_enable && m_status == STATUS_NORMAL) |
| 115 | { |
| 116 | m_new_command |= 2; |
| 117 | m_rx_latch = 0xd0 | 0; // keyb scancode (0xd0=up 0xc0=down, bits 3-0 row) |
| 118 | m_status = STATUS_KEYUP; |
| 119 | //m_ff ^= 1; |
| 120 | return; |
| 121 | } |
| 122 | #endif |
| 123 | |
| 124 | if(id == MOUSE_TIMER && m_mouse_enable && m_status == STATUS_NORMAL) |
| 125 | { |
| 126 | m_new_command |= 2; |
| 127 | m_rx_latch = 0; // mouse X position |
| 128 | m_status = STATUS_MOUSE; |
| 129 | //m_ff ^= 1; |
| 130 | return; |
| 131 | } |
| 132 | |
| 133 | if(m_new_command == 0) |
| 134 | return; |
| 135 | |
| 136 | if(id == RX_TIMER && m_new_command & 2) |
| 137 | { |
| 138 | m_out_rx_func(ASSERT_LINE); |
| 139 | m_new_command &= ~2; |
| 140 | m_rx = m_rx_latch; |
| 141 | return; |
| 142 | } |
| 143 | |
| 144 | if(id == TX_TIMER && m_new_command & 1) |
| 145 | { |
| 146 | switch(m_status) |
| 147 | { |
| 148 | case STATUS_NORMAL: |
| 149 | { |
| 150 | switch(m_tx_latch) |
| 151 | { |
| 152 | case 0x00: // set leds |
| 153 | break; |
| 154 | case RQID: |
| 155 | m_rx_latch = 0x81; //keyboard ID |
| 156 | break; |
| 157 | case SMAK: |
| 158 | case MACK: |
| 159 | case SACK: |
| 160 | case NACK: |
| 161 | if(m_tx_latch & 2) { m_mouse_enable = 1; } |
| 162 | if(m_tx_latch & 1) { m_keyb_enable = 1; } |
| 163 | break; |
| 164 | case HRST: |
| 165 | m_rx_latch = HRST; |
| 166 | m_status = STATUS_HRST; |
| 167 | break; |
| 168 | default: |
| 169 | //printf("%02x\n",m_tx_latch); |
| 170 | break; |
| 171 | } |
| 172 | break; |
| 173 | } |
| 174 | case STATUS_KEYDOWN: |
| 175 | { |
| 176 | switch(m_tx_latch) |
| 177 | { |
| 178 | case BACK: |
| 179 | m_rx_latch = 0xc0 | 0; // keyb scancode (0xd0=up 0xc0=down, bits 3-0 col) |
| 180 | m_status = STATUS_NORMAL; |
| 181 | break; |
| 182 | case HRST: |
| 183 | m_rx_latch = HRST; |
| 184 | m_status = STATUS_HRST; |
| 185 | break; |
| 186 | } |
| 187 | break; |
| 188 | } |
| 189 | case STATUS_KEYUP: |
| 190 | { |
| 191 | switch(m_tx_latch) |
| 192 | { |
| 193 | case BACK: |
| 194 | m_rx_latch = 0xd0 | 0; // keyb scancode (0xd0=up 0xc0=down, bits 3-0 col) |
| 195 | m_status = STATUS_NORMAL; |
| 196 | break; |
| 197 | case HRST: |
| 198 | m_rx_latch = HRST; |
| 199 | m_status = STATUS_HRST; |
| 200 | break; |
| 201 | } |
| 202 | break; |
| 203 | } |
| 204 | case STATUS_MOUSE: |
| 205 | { |
| 206 | switch(m_tx_latch) |
| 207 | { |
| 208 | case BACK: |
| 209 | m_rx_latch = 0; // mouse Y |
| 210 | m_status = STATUS_NORMAL; |
| 211 | break; |
| 212 | case HRST: |
| 213 | m_rx_latch = HRST; |
| 214 | m_status = STATUS_HRST; |
| 215 | break; |
| 216 | } |
| 217 | break; |
| 218 | } |
| 219 | case STATUS_HRST: |
| 220 | { |
| 221 | switch(m_tx_latch) |
| 222 | { |
| 223 | case HRST: { m_rx_latch = HRST; m_keyb_enable = m_mouse_enable = 0; break; } |
| 224 | case RAK1: { m_rx_latch = RAK1; m_keyb_enable = m_mouse_enable = 0; break; } |
| 225 | case RAK2: { m_rx_latch = RAK2; m_status = STATUS_NORMAL; break; } |
| 226 | } |
| 227 | break; |
| 228 | } |
| 229 | } |
| 230 | m_out_tx_func(ASSERT_LINE); |
| 231 | m_new_command &= ~1; |
| 232 | m_new_command |= 2; |
| 233 | } |
| 234 | } |
| 235 | |
| 64 | 236 | //************************************************************************** |
| 65 | 237 | // READ/WRITE HANDLERS |
| 66 | 238 | //************************************************************************** |
| 67 | 239 | |
| 68 | 240 | READ8_MEMBER( aakart_device::read ) |
| 69 | 241 | { |
| 70 | | return 0; |
| 242 | m_out_tx_func(CLEAR_LINE); |
| 243 | return m_rx; |
| 71 | 244 | } |
| 72 | 245 | |
| 73 | 246 | WRITE8_MEMBER( aakart_device::write ) |
| 74 | 247 | { |
| 248 | if(m_new_command) |
| 249 | printf("skip cmd %02x\n",data); |
| 250 | |
| 251 | m_tx_latch = data; |
| 252 | m_new_command |= 1; |
| 253 | m_out_rx_func(CLEAR_LINE); |
| 75 | 254 | } |
trunk/src/emu/machine/aakart.h
| r19208 | r19209 | |
| 15 | 15 | // INTERFACE CONFIGURATION MACROS |
| 16 | 16 | //************************************************************************** |
| 17 | 17 | |
| 18 | | #define MCFG_AAKART_ADD(_tag,_freq) \ |
| 18 | #define MCFG_AAKART_ADD(_tag, _freq, _config) \ |
| 19 | 19 | MCFG_DEVICE_ADD(_tag, AAKART, _freq) \ |
| 20 | MCFG_DEVICE_CONFIG(_config) \ |
| 20 | 21 | |
| 22 | #define AAKART_INTERFACE(name) \ |
| 23 | const aakart_interface (name) = |
| 21 | 24 | |
| 25 | struct aakart_interface |
| 26 | { |
| 27 | devcb_write_line m_out_tx_cb; |
| 28 | devcb_write_line m_out_rx_cb; |
| 29 | }; |
| 30 | |
| 31 | enum{ |
| 32 | STATUS_NORMAL = 0, |
| 33 | STATUS_KEYUP, |
| 34 | STATUS_KEYDOWN, |
| 35 | STATUS_MOUSE, |
| 36 | STATUS_HRST, |
| 37 | STATUS_UNDEFINED |
| 38 | }; |
| 39 | |
| 22 | 40 | //************************************************************************** |
| 23 | 41 | // TYPE DEFINITIONS |
| 24 | 42 | //************************************************************************** |
| 25 | 43 | |
| 26 | 44 | // ======================> aakart_device |
| 27 | 45 | |
| 28 | | class aakart_device : public device_t |
| 46 | class aakart_device : public device_t, |
| 47 | public aakart_interface |
| 29 | 48 | { |
| 30 | 49 | public: |
| 31 | 50 | // construction/destruction |
| r19208 | r19209 | |
| 40 | 59 | virtual void device_validity_check(validity_checker &valid) const; |
| 41 | 60 | virtual void device_start(); |
| 42 | 61 | virtual void device_reset(); |
| 62 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 63 | virtual void device_config_complete(); |
| 64 | |
| 65 | private: |
| 66 | static const device_timer_id RX_TIMER = 1; |
| 67 | static const device_timer_id TX_TIMER = 2; |
| 68 | static const device_timer_id MOUSE_TIMER = 3; |
| 69 | static const device_timer_id KEYB_TIMER = 4; |
| 70 | emu_timer * m_rxtimer; |
| 71 | emu_timer * m_txtimer; |
| 72 | emu_timer * m_mousetimer; |
| 73 | emu_timer * m_keybtimer; |
| 74 | |
| 75 | devcb_resolved_write_line m_out_tx_func; |
| 76 | devcb_resolved_write_line m_out_rx_func; |
| 77 | int m_tx_latch, m_rx_latch; |
| 78 | int m_rx; |
| 79 | int m_new_command; |
| 80 | int m_status; |
| 81 | int m_mouse_enable; |
| 82 | int m_keyb_enable; |
| 43 | 83 | }; |
| 44 | 84 | |
| 45 | 85 | |
trunk/src/mess/drivers/a310.c
| r19208 | r19209 | |
| 62 | 62 | #include "sound/dac.h" |
| 63 | 63 | #include "includes/archimds.h" |
| 64 | 64 | #include "machine/i2cmem.h" |
| 65 | | #include "machine/aakart.h" |
| 65 | //#include "machine/aakart.h" |
| 66 | 66 | #include "machine/ram.h" |
| 67 | 67 | |
| 68 | 68 | |
| r19208 | r19209 | |
| 268 | 268 | I2CMEM_SLAVE_ADDRESS, 0, 0x100 |
| 269 | 269 | }; |
| 270 | 270 | |
| 271 | WRITE_LINE_MEMBER( archimedes_state::a310_kart_tx_w ) |
| 272 | { |
| 273 | if(state) |
| 274 | archimedes_request_irq_b(ARCHIMEDES_IRQB_KBD_RECV_FULL); |
| 275 | else |
| 276 | archimedes_clear_irq_b(ARCHIMEDES_IRQB_KBD_RECV_FULL); |
| 277 | } |
| 278 | |
| 279 | WRITE_LINE_MEMBER( archimedes_state::a310_kart_rx_w ) |
| 280 | { |
| 281 | if(state) |
| 282 | archimedes_request_irq_b(ARCHIMEDES_IRQB_KBD_XMIT_EMPTY); |
| 283 | else |
| 284 | archimedes_clear_irq_b(ARCHIMEDES_IRQB_KBD_XMIT_EMPTY); |
| 285 | } |
| 286 | |
| 287 | static AAKART_INTERFACE( kart_interface ) |
| 288 | { |
| 289 | DEVCB_DRIVER_LINE_MEMBER(archimedes_state, a310_kart_tx_w), |
| 290 | DEVCB_DRIVER_LINE_MEMBER(archimedes_state, a310_kart_rx_w) |
| 291 | }; |
| 292 | |
| 271 | 293 | static MACHINE_CONFIG_START( a310, a310_state ) |
| 272 | 294 | /* basic machine hardware */ |
| 273 | 295 | MCFG_CPU_ADD("maincpu", ARM, 8000000) /* 8 MHz */ |
| 274 | 296 | MCFG_CPU_PROGRAM_MAP(a310_mem) |
| 275 | 297 | |
| 276 | | MCFG_AAKART_ADD("kart", 8000000) // TODO: frequency |
| 298 | MCFG_AAKART_ADD("kart", 8000000/128, kart_interface) // TODO: frequency |
| 277 | 299 | MCFG_I2CMEM_ADD("i2cmem",i2cmem_interface) |
| 278 | 300 | |
| 279 | 301 | /* video hardware */ |