trunk/src/mess/drivers/microvsn.c
| r19985 | r19986 | |
| 21 | 21 | #include "rendlay.h" |
| 22 | 22 | |
| 23 | 23 | |
| 24 | #define LOG 0 |
| 25 | |
| 24 | 26 | enum cpu_type |
| 25 | 27 | { |
| 26 | 28 | CPU_TYPE_I8021, |
| r19985 | r19986 | |
| 49 | 51 | // i8021 interface |
| 50 | 52 | DECLARE_WRITE8_MEMBER(i8021_p0_write); |
| 51 | 53 | DECLARE_WRITE8_MEMBER(i8021_p1_write); |
| 54 | DECLARE_WRITE8_MEMBER(i8021_p2_write); |
| 55 | DECLARE_READ8_MEMBER(i8021_t1_read); |
| 52 | 56 | DECLARE_READ8_MEMBER(i8021_bus_read); |
| 53 | 57 | |
| 54 | 58 | // TMS1100 interface |
| r19985 | r19986 | |
| 63 | 67 | required_device<cpu_device> m_i8021; |
| 64 | 68 | required_device<cpu_device> m_tms1100; |
| 65 | 69 | |
| 70 | // Timers |
| 71 | static const device_timer_id TIMER_PADDLE = 0; |
| 72 | emu_timer *m_paddle_timer; |
| 73 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 74 | |
| 66 | 75 | // i8021 variables |
| 67 | 76 | UINT8 m_p0; |
| 77 | UINT8 m_p2; |
| 78 | UINT8 m_t1; |
| 68 | 79 | |
| 69 | 80 | // tms1100 variables |
| 70 | 81 | UINT16 m_r; |
| r19985 | r19986 | |
| 104 | 115 | |
| 105 | 116 | MACHINE_START_MEMBER(microvision_state, microvision) |
| 106 | 117 | { |
| 118 | m_paddle_timer = timer_alloc(TIMER_PADDLE); |
| 119 | |
| 107 | 120 | save_item(NAME(m_p0)); |
| 121 | save_item(NAME(m_p2)); |
| 122 | save_item(NAME(m_t1)); |
| 108 | 123 | save_item(NAME(m_r)); |
| 109 | 124 | save_item(NAME(m_o)); |
| 110 | 125 | save_item(NAME(m_lcd_latch)); |
| r19985 | r19986 | |
| 131 | 146 | |
| 132 | 147 | m_o = 0; |
| 133 | 148 | m_r = 0; |
| 149 | m_p0 = 0; |
| 150 | m_p2 = 0; |
| 151 | m_t1 = 0; |
| 134 | 152 | |
| 153 | m_paddle_timer->adjust( attotime::never ); |
| 154 | |
| 135 | 155 | switch ( m_cpu_type ) |
| 136 | 156 | { |
| 137 | 157 | case CPU_TYPE_I8021: |
| r19985 | r19986 | |
| 198 | 218 | UINT16 row = ( m_lcd_latch[0] << 12 ) | ( m_lcd_latch[1] << 8 ) | ( m_lcd_latch[2] << 4 ) | m_lcd_latch[3]; |
| 199 | 219 | UINT16 col = ( m_lcd_latch[4] << 12 ) | ( m_lcd_latch[5] << 8 ) | ( m_lcd_latch[6] << 4 ) | m_lcd_latch[7]; |
| 200 | 220 | |
| 201 | | //logerror("row = %04x, col = %04x\n", row, col ); |
| 221 | if (LOG) logerror("row = %04x, col = %04x\n", row, col ); |
| 202 | 222 | for ( int i = 0; i < 16; i++ ) |
| 203 | 223 | { |
| 204 | 224 | UINT16 temp = row; |
| r19985 | r19986 | |
| 229 | 249 | } |
| 230 | 250 | |
| 231 | 251 | |
| 252 | void microvision_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 253 | { |
| 254 | switch ( id ) |
| 255 | { |
| 256 | case TIMER_PADDLE: |
| 257 | m_t1 = 0; |
| 258 | break; |
| 259 | } |
| 260 | } |
| 261 | |
| 262 | |
| 232 | 263 | /* |
| 233 | 264 | x--- ---- KEY3 |
| 234 | 265 | -x-- ---- KEY4 |
| r19985 | r19986 | |
| 241 | 272 | */ |
| 242 | 273 | WRITE8_MEMBER( microvision_state::i8021_p0_write ) |
| 243 | 274 | { |
| 244 | | logerror( "p0_write: %02x\n", data ); |
| 275 | if (LOG) logerror( "p0_write: %02x\n", data ); |
| 245 | 276 | |
| 246 | 277 | m_p0 = data; |
| 247 | 278 | } |
| r19985 | r19986 | |
| 257 | 288 | */ |
| 258 | 289 | WRITE8_MEMBER( microvision_state::i8021_p1_write ) |
| 259 | 290 | { |
| 260 | | logerror( "p1_write: %02x\n", data ); |
| 291 | if (LOG) logerror( "p1_write: %02x\n", data ); |
| 261 | 292 | |
| 262 | 293 | lcd_write( data & 0x03, data >> 4 ); |
| 263 | 294 | } |
| 264 | 295 | |
| 265 | 296 | |
| 297 | /* |
| 298 | ---- xx-- CAP2 (paddle) |
| 299 | ---- --x- SPKR1 |
| 300 | ---- ---x SPKR0 |
| 301 | */ |
| 302 | WRITE8_MEMBER( microvision_state::i8021_p2_write ) |
| 303 | { |
| 304 | if (LOG) logerror( "p2_write: %02x\n", data ); |
| 305 | |
| 306 | m_p2 = data; |
| 307 | |
| 308 | speaker_write( m_p2 & 0x03 ); |
| 309 | |
| 310 | if ( m_p2 & 0x0c ) |
| 311 | { |
| 312 | m_t1 = 1; |
| 313 | // Stop paddle timer |
| 314 | m_paddle_timer->adjust( attotime::never ); |
| 315 | } |
| 316 | else |
| 317 | { |
| 318 | // Start paddle timer (min is 160uS, max is 678uS) |
| 319 | UINT8 paddle = 255 - ioport("PADDLE")->read(); |
| 320 | m_paddle_timer->adjust( attotime::from_usec(160 + ( 518 * paddle ) / 255 ) ); |
| 321 | } |
| 322 | } |
| 323 | |
| 324 | |
| 325 | READ8_MEMBER( microvision_state::i8021_t1_read ) |
| 326 | { |
| 327 | return m_t1; |
| 328 | } |
| 329 | |
| 330 | |
| 266 | 331 | READ8_MEMBER( microvision_state::i8021_bus_read ) |
| 267 | 332 | { |
| 268 | 333 | UINT8 data = m_p0; |
| r19985 | r19986 | |
| 304 | 369 | { |
| 305 | 370 | UINT8 data = 0; |
| 306 | 371 | |
| 307 | | //logerror("read_k\n"); |
| 372 | if (LOG) logerror("read_k\n"); |
| 308 | 373 | |
| 309 | 374 | if ( m_r & 0x100 ) |
| 310 | 375 | { |
| r19985 | r19986 | |
| 324 | 389 | |
| 325 | 390 | WRITE16_MEMBER( microvision_state::tms1100_write_o ) |
| 326 | 391 | { |
| 327 | | logerror("write_o: %04x\n", data); |
| 392 | if (LOG) logerror("write_o: %04x\n", data); |
| 328 | 393 | |
| 329 | 394 | m_o = data; |
| 330 | 395 | |
| r19985 | r19986 | |
| 343 | 408 | */ |
| 344 | 409 | WRITE16_MEMBER( microvision_state::tms1100_write_r ) |
| 345 | 410 | { |
| 346 | | logerror("write_r: %04x\n", data); |
| 411 | if (LOG) logerror("write_r: %04x\n", data); |
| 347 | 412 | |
| 348 | 413 | m_r = data; |
| 349 | 414 | |
| r19985 | r19986 | |
| 425 | 490 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_CODE(KEYCODE_T) PORT_NAME("B06") |
| 426 | 491 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_CODE(KEYCODE_G) PORT_NAME("B09") |
| 427 | 492 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON12) PORT_CODE(KEYCODE_B) PORT_NAME("B12") |
| 493 | |
| 494 | PORT_START("PADDLE") |
| 495 | PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_PLAYER(1) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0, 255) |
| 428 | 496 | INPUT_PORTS_END |
| 429 | 497 | |
| 430 | 498 | |
| r19985 | r19986 | |
| 432 | 500 | AM_RANGE( 0x00, 0xFF ) AM_WRITE( i8021_p0_write ) |
| 433 | 501 | AM_RANGE( MCS48_PORT_P0, MCS48_PORT_P0 ) AM_WRITE( i8021_p0_write ) |
| 434 | 502 | AM_RANGE( MCS48_PORT_P1, MCS48_PORT_P1 ) AM_WRITE( i8021_p1_write ) |
| 503 | AM_RANGE( MCS48_PORT_P2, MCS48_PORT_P2 ) AM_WRITE( i8021_p2_write ) |
| 504 | AM_RANGE( MCS48_PORT_T1, MCS48_PORT_T1 ) AM_READ( i8021_t1_read ) |
| 435 | 505 | AM_RANGE( MCS48_PORT_BUS, MCS48_PORT_BUS ) AM_READ( i8021_bus_read ) |
| 436 | 506 | ADDRESS_MAP_END |
| 437 | 507 | |