trunk/src/mess/drivers/geniusiq.c
| r17684 | r17685 | |
| 95 | 95 | |
| 96 | 96 | #define MACHINE_RESET_MEMBER(name) void name::machine_reset() |
| 97 | 97 | |
| 98 | | #define KEYBOARD_QUEUE_SIZE 8 |
| 98 | #define KEYBOARD_QUEUE_SIZE 0x8 |
| 99 | 99 | |
| 100 | 100 | class geniusiq_state : public driver_device |
| 101 | 101 | { |
| r17684 | r17685 | |
| 120 | 120 | DECLARE_READ16_MEMBER(input_r); |
| 121 | 121 | DECLARE_WRITE16_MEMBER(mouse_pos_w); |
| 122 | 122 | DECLARE_INPUT_CHANGED_MEMBER(send_input); |
| 123 | DECLARE_INPUT_CHANGED_MEMBER(send_mouse_input); |
| 123 | 124 | DECLARE_WRITE16_MEMBER(gfx_base_w); |
| 124 | 125 | DECLARE_WRITE16_MEMBER(gfx_dest_w); |
| 125 | 126 | DECLARE_WRITE16_MEMBER(gfx_color_w); |
| 126 | 127 | DECLARE_WRITE16_MEMBER(gfx_idx_w); |
| 128 | void queue_input(UINT16 data); |
| 127 | 129 | |
| 128 | 130 | DECLARE_READ16_MEMBER(unk0_r) { return 0; } |
| 129 | 131 | DECLARE_READ16_MEMBER(unk_r) { return machine().rand(); } |
| r17684 | r17685 | |
| 133 | 135 | UINT16 m_gfx_x; |
| 134 | 136 | UINT32 m_gfx_base; |
| 135 | 137 | UINT8 m_gfx_color[2]; |
| 136 | | UINT16 m_mouse_posx; |
| 137 | | UINT16 m_mouse_posy; |
| 138 | UINT8 m_mouse_posx; |
| 139 | UINT8 m_mouse_posy; |
| 140 | UINT16 m_mouse_gfx_posx; |
| 141 | UINT16 m_mouse_gfx_posy; |
| 138 | 142 | struct |
| 139 | 143 | { |
| 140 | 144 | UINT16 buffer[KEYBOARD_QUEUE_SIZE]; |
| r17684 | r17685 | |
| 196 | 200 | UINT8 pen = (data>>12) & 0x0f; |
| 197 | 201 | |
| 198 | 202 | // I assume color 0 is transparent |
| 199 | | if(pen != 0 && screen.visible_area().contains(m_mouse_posx + x*2 + b, m_mouse_posy + y)) |
| 200 | | bitmap.pix16(m_mouse_posy + y, m_mouse_posx + x*2 + b) = pen; |
| 203 | if(pen != 0 && screen.visible_area().contains(m_mouse_gfx_posx + x*2 + b, m_mouse_gfx_posy + y)) |
| 204 | bitmap.pix16(m_mouse_gfx_posy + y, m_mouse_gfx_posx + x*2 + b) = pen; |
| 201 | 205 | data <<= 4; |
| 202 | 206 | } |
| 203 | 207 | } |
| r17684 | r17685 | |
| 217 | 221 | |
| 218 | 222 | WRITE16_MEMBER( geniusiq_state::mouse_pos_w ) |
| 219 | 223 | { |
| 220 | | switch (offset) |
| 221 | | { |
| 222 | | case 0: m_mouse_posx = data; break; |
| 223 | | case 1: m_mouse_posy = data; break; |
| 224 | | } |
| 224 | if (offset) |
| 225 | m_mouse_gfx_posy = data; |
| 226 | else |
| 227 | m_mouse_gfx_posx = data; |
| 225 | 228 | } |
| 226 | 229 | |
| 227 | 230 | WRITE16_MEMBER(geniusiq_state::gfx_color_w) |
| r17684 | r17685 | |
| 293 | 296 | return data; |
| 294 | 297 | } |
| 295 | 298 | |
| 299 | void geniusiq_state::queue_input(UINT16 data) |
| 300 | { |
| 301 | m_keyboard.buffer[m_keyboard.tail] = data; |
| 302 | |
| 303 | m_keyboard.tail = (m_keyboard.tail+1) % KEYBOARD_QUEUE_SIZE; |
| 304 | |
| 305 | // new data in queue |
| 306 | m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); |
| 307 | } |
| 308 | |
| 309 | INPUT_CHANGED_MEMBER( geniusiq_state::send_mouse_input ) |
| 310 | { |
| 311 | UINT8 new_mouse_x = ioport("MOUSEX")->read(); |
| 312 | UINT8 new_mouse_y = ioport("MOUSEY")->read(); |
| 313 | UINT8 mouse_buttons = ioport("MOUSE")->read(); |
| 314 | |
| 315 | UINT8 delta_x = (UINT8)(new_mouse_x - m_mouse_posx); |
| 316 | UINT8 delta_y = (UINT8)(new_mouse_y - m_mouse_posy); |
| 317 | m_mouse_posx = new_mouse_x; |
| 318 | m_mouse_posy = new_mouse_y; |
| 319 | |
| 320 | queue_input(0x1000 | 0x40 | mouse_buttons | ((delta_y>>4) & 0x0c) | ((delta_x>>6) & 0x03)); |
| 321 | queue_input(0x1000 | (delta_x & 0x3f)); |
| 322 | queue_input(0x1000 | (delta_y & 0x3f)); |
| 323 | } |
| 324 | |
| 296 | 325 | INPUT_CHANGED_MEMBER( geniusiq_state::send_input ) |
| 297 | 326 | { |
| 298 | | m_keyboard.buffer[m_keyboard.tail] = (UINT8)(FPTR)param; |
| 327 | UINT16 data = (UINT16)(FPTR)param; |
| 299 | 328 | |
| 300 | 329 | // set bit 7 if the key is released |
| 301 | 330 | if (!newval) |
| 302 | | m_keyboard.buffer[m_keyboard.tail] |= 0x80; |
| 331 | data |= 0x80; |
| 303 | 332 | |
| 304 | | m_keyboard.tail = (m_keyboard.tail+1) % KEYBOARD_QUEUE_SIZE; |
| 305 | | |
| 306 | | // new input from keyboard |
| 307 | | m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE); |
| 333 | queue_input(data); |
| 308 | 334 | } |
| 309 | 335 | |
| 310 | 336 | |
| r17684 | r17685 | |
| 335 | 361 | |
| 336 | 362 | static INPUT_CHANGED( trigger_irq ) |
| 337 | 363 | { |
| 338 | | cputag_set_input_line(field.machine(), "maincpu", (int)(FPTR)param, newval ? HOLD_LINE : CLEAR_LINE); |
| 364 | //cputag_set_input_line(field.machine(), "maincpu", (int)(FPTR)param, newval ? HOLD_LINE : CLEAR_LINE); |
| 339 | 365 | } |
| 340 | 366 | |
| 341 | 367 | /* Input ports */ |
| r17684 | r17685 | |
| 378 | 404 | |
| 379 | 405 | PORT_START( "IN2" ) |
| 380 | 406 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_0 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x20 ) |
| 381 | | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_F2 ) PORT_NAME("Enter") PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x21 ) |
| 407 | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_ENTER ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x21 ) |
| 382 | 408 | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_BACKSPACE ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x22 ) |
| 383 | 409 | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_L ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x23 ) |
| 384 | 410 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_O ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x24 ) |
| r17684 | r17685 | |
| 392 | 418 | PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_COLON ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x2c ) |
| 393 | 419 | PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_K ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x2d ) |
| 394 | 420 | PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_I ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x2e ) |
| 395 | | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Button 1") PORT_CODE( KEYCODE_ENTER ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x2f ) |
| 421 | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Button 1 (keyboard)") PORT_CODE( KEYCODE_F2 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x2f ) |
| 396 | 422 | |
| 397 | 423 | PORT_START( "IN3" ) |
| 398 | 424 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_8 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x30 ) |
| r17684 | r17685 | |
| 428 | 454 | PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_V ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x4c ) |
| 429 | 455 | PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_F ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x4d ) |
| 430 | 456 | PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_R ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x4e ) |
| 431 | | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Up") PORT_CODE( KEYCODE_UP ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x4f ) |
| 457 | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Up Button") PORT_CODE( KEYCODE_UP ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x4f ) |
| 432 | 458 | |
| 433 | 459 | PORT_START( "IN5" ) |
| 434 | 460 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_4 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x50 ) |
| r17684 | r17685 | |
| 438 | 464 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_3 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x54 ) |
| 439 | 465 | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x55 ) |
| 440 | 466 | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x56 ) |
| 441 | | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Down") PORT_CODE( KEYCODE_DOWN ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x57 ) |
| 467 | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Down Button") PORT_CODE( KEYCODE_DOWN ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x57 ) |
| 442 | 468 | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_INSERT ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x58 ) |
| 443 | 469 | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_X ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x59 ) |
| 444 | 470 | PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_S ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x5a ) |
| r17684 | r17685 | |
| 446 | 472 | PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_2 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x5c ) |
| 447 | 473 | PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x5d ) |
| 448 | 474 | PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x5e ) |
| 449 | | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Left") PORT_CODE( KEYCODE_LEFT ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x5f ) |
| 475 | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Left Button") PORT_CODE( KEYCODE_LEFT ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x5f ) |
| 450 | 476 | |
| 451 | 477 | PORT_START( "IN6" ) |
| 452 | 478 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Help") PORT_CODE( KEYCODE_F1 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x60 ) |
| r17684 | r17685 | |
| 456 | 482 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_Q ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x64 ) |
| 457 | 483 | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_A ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x65 ) |
| 458 | 484 | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_1 ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x66 ) |
| 459 | | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Right") PORT_CODE( KEYCODE_RIGHT ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x67 ) |
| 485 | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mouse Right Button") PORT_CODE( KEYCODE_RIGHT ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x67 ) |
| 460 | 486 | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x68 ) |
| 461 | 487 | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_0_PAD ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x69 ) |
| 462 | 488 | PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_DEL_PAD ) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x6a ) |
| r17684 | r17685 | |
| 484 | 510 | PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x7e ) |
| 485 | 511 | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) // PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x7f ) |
| 486 | 512 | |
| 513 | PORT_START("MOUSEX") |
| 514 | PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_mouse_input, 0 ) |
| 515 | |
| 516 | PORT_START("MOUSEY") |
| 517 | PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_mouse_input, 0 ) |
| 518 | |
| 519 | PORT_START("MOUSE") |
| 520 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Mouse Button 2") PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_mouse_input, 0 ) |
| 521 | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Mouse Button 1") PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_mouse_input, 0 ) |
| 522 | |
| 487 | 523 | PORT_START( "DEBUG" ) // for debug purposes, to be removed in the end |
| 488 | 524 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_1 ) PORT_NAME( "IRQ 1" ) PORT_CHANGED( trigger_irq, 1 ) |
| 489 | 525 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_2 ) PORT_NAME( "IRQ 2" ) PORT_CHANGED( trigger_irq, 2 ) |
| r17684 | r17685 | |
| 505 | 541 | m_gfx_color[0] = m_gfx_color[1] = 0; |
| 506 | 542 | m_mouse_posx = 0; |
| 507 | 543 | m_mouse_posy = 0; |
| 544 | m_mouse_gfx_posx = 0; |
| 545 | m_mouse_gfx_posy = 0; |
| 508 | 546 | } |
| 509 | 547 | |
| 510 | 548 | static MACHINE_CONFIG_START( geniusiq, geniusiq_state ) |