src/mess/drivers/px4.c
| r8640 | r8641 | |
| 22 | 22 | CONSTANTS |
| 23 | 23 | ***************************************************************************/ |
| 24 | 24 | |
| 25 | #define VERBOSE 0 |
| 26 | |
| 25 | 27 | /* interrupt sources */ |
| 26 | 28 | #define INT0_7508 0x01 |
| 27 | 29 | #define INT1_ART 0x02 |
| r8640 | r8641 | |
| 137 | 139 | |
| 138 | 140 | static WRITE_LINE_DEVICE_HANDLER( px4_sio_txd ) |
| 139 | 141 | { |
| 140 | | logerror("px4_sio_txd: %d\n", state); |
| 142 | if (VERBOSE) |
| 143 | logerror("px4_sio_txd: %d\n", state); |
| 141 | 144 | |
| 142 | 145 | if (device != NULL) |
| 143 | 146 | tf20_txs_w(device, state); |
| r8640 | r8641 | |
| 145 | 148 | |
| 146 | 149 | static READ_LINE_DEVICE_HANDLER( px4_sio_rxd ) |
| 147 | 150 | { |
| 148 | | logerror("px4_sio_rxd\n"); |
| 151 | if (VERBOSE) |
| 152 | logerror("px4_sio_rxd\n"); |
| 149 | 153 | |
| 150 | 154 | if (device != NULL) |
| 151 | 155 | return tf20_rxs_r(device); |
| r8640 | r8641 | |
| 155 | 159 | |
| 156 | 160 | static READ_LINE_DEVICE_HANDLER( px4_sio_pin ) |
| 157 | 161 | { |
| 158 | | logerror("px4_sio_pin\n"); |
| 162 | if (VERBOSE) |
| 163 | logerror("px4_sio_pin\n"); |
| 159 | 164 | |
| 160 | 165 | if (device != NULL) |
| 161 | 166 | return tf20_pins_r(device); |
| r8640 | r8641 | |
| 165 | 170 | |
| 166 | 171 | static WRITE_LINE_DEVICE_HANDLER( px4_sio_pout ) |
| 167 | 172 | { |
| 168 | | logerror("px4_sio_pout: %d\n", state); |
| 173 | if (VERBOSE) |
| 174 | logerror("px4_sio_pout: %d\n", state); |
| 169 | 175 | |
| 170 | 176 | if (device != NULL) |
| 171 | 177 | tf20_pouts_w(device, state); |
| r8640 | r8641 | |
| 180 | 186 | |
| 181 | 187 | static WRITE_LINE_DEVICE_HANDLER( px4_rs232c_txd ) |
| 182 | 188 | { |
| 183 | | logerror("px4_rs232c_txd: %d\n", state); |
| 189 | if (VERBOSE) |
| 190 | logerror("px4_rs232c_txd: %d\n", state); |
| 184 | 191 | } |
| 185 | 192 | |
| 186 | 193 | #ifdef UNUSED_FUNCTION |
| 187 | 194 | static READ_LINE_DEVICE_HANDLER( px4_rs232c_rxd ) |
| 188 | 195 | { |
| 189 | | logerror("px4_rs232c_rxd\n"); |
| 196 | if (VERBOSE) |
| 197 | logerror("px4_rs232c_rxd\n"); |
| 190 | 198 | return ASSERT_LINE; |
| 191 | 199 | } |
| 192 | 200 | #endif |
| 193 | 201 | |
| 194 | 202 | static WRITE_LINE_DEVICE_HANDLER( px4_rs232c_rts ) |
| 195 | 203 | { |
| 196 | | logerror("px4_rs232c_rts: %d\n", state); |
| 204 | if (VERBOSE) |
| 205 | logerror("px4_rs232c_rts: %d\n", state); |
| 197 | 206 | } |
| 198 | 207 | |
| 199 | 208 | static READ_LINE_DEVICE_HANDLER( px4_rs232c_cts ) |
| 200 | 209 | { |
| 201 | | logerror("px4_rs232c_cts\n"); |
| 210 | if (VERBOSE) |
| 211 | logerror("px4_rs232c_cts\n"); |
| 212 | |
| 202 | 213 | return ASSERT_LINE; |
| 203 | 214 | } |
| 204 | 215 | |
| 205 | 216 | static READ_LINE_DEVICE_HANDLER( px4_rs232c_dsr ) |
| 206 | 217 | { |
| 207 | | logerror("px4_rs232c_dsr\n"); |
| 218 | if (VERBOSE) |
| 219 | logerror("px4_rs232c_dsr\n"); |
| 220 | |
| 208 | 221 | return ASSERT_LINE; |
| 209 | 222 | } |
| 210 | 223 | |
| 211 | 224 | static WRITE_LINE_DEVICE_HANDLER( px4_rs232c_dtr ) |
| 212 | 225 | { |
| 213 | | logerror("px4_rs232c_dtr: %d\n", state); |
| 226 | if (VERBOSE) |
| 227 | logerror("px4_rs232c_dtr: %d\n", state); |
| 214 | 228 | } |
| 215 | 229 | |
| 216 | 230 | static READ_LINE_DEVICE_HANDLER( px4_rs232c_dcd ) |
| 217 | 231 | { |
| 218 | | logerror("px4_rs232c_dcd\n"); |
| 232 | if (VERBOSE) |
| 233 | logerror("px4_rs232c_dcd\n"); |
| 234 | |
| 219 | 235 | return ASSERT_LINE; |
| 220 | 236 | } |
| 221 | 237 | |
| r8640 | r8641 | |
| 304 | 320 | static READ8_HANDLER( px4_icrlc_r ) |
| 305 | 321 | { |
| 306 | 322 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 307 | | logerror("%s: px4_icrlc_r\n", cpuexec_describe_context(space->machine)); |
| 308 | 323 | |
| 324 | if (VERBOSE) |
| 325 | logerror("%s: px4_icrlc_r\n", cpuexec_describe_context(space->machine)); |
| 326 | |
| 309 | 327 | /* latch value */ |
| 310 | 328 | px4->frc_latch = px4->frc_value; |
| 311 | 329 | |
| r8640 | r8641 | |
| 318 | 336 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 319 | 337 | int baud; |
| 320 | 338 | |
| 321 | | logerror("%s: px4_ctrl1_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 339 | if (VERBOSE) |
| 340 | logerror("%s: px4_ctrl1_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 322 | 341 | |
| 323 | 342 | /* baudrate generator */ |
| 324 | 343 | baud = data >> 4; |
| r8640 | r8641 | |
| 337 | 356 | { |
| 338 | 357 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 339 | 358 | |
| 340 | | logerror("%s: px4_icrhc_r\n", cpuexec_describe_context(space->machine)); |
| 359 | if (VERBOSE) |
| 360 | logerror("%s: px4_icrhc_r\n", cpuexec_describe_context(space->machine)); |
| 341 | 361 | |
| 342 | 362 | return (px4->frc_latch >> 8) & 0xff; |
| 343 | 363 | } |
| r8640 | r8641 | |
| 347 | 367 | { |
| 348 | 368 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 349 | 369 | |
| 350 | | logerror("%s: px4_cmdr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 370 | if (VERBOSE) |
| 371 | logerror("%s: px4_cmdr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 351 | 372 | |
| 352 | 373 | /* clear overflow interrupt? */ |
| 353 | 374 | if (BIT(data, 2)) |
| r8640 | r8641 | |
| 362 | 383 | { |
| 363 | 384 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 364 | 385 | |
| 365 | | logerror("%s: px4_icrlb_r\n", cpuexec_describe_context(space->machine)); |
| 386 | if (VERBOSE) |
| 387 | logerror("%s: px4_icrlb_r\n", cpuexec_describe_context(space->machine)); |
| 366 | 388 | |
| 367 | 389 | return px4->icrb & 0xff; |
| 368 | 390 | } |
| r8640 | r8641 | |
| 372 | 394 | { |
| 373 | 395 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 374 | 396 | |
| 375 | | logerror("%s: px4_ctrl2_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 397 | if (VERBOSE) |
| 398 | logerror("%s: px4_ctrl2_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 376 | 399 | |
| 377 | 400 | /* bit 0, MIC, cassette output */ |
| 378 | 401 | cassette_output(px4->ext_cas, BIT(data, 0) ? -1.0 : +1.0); |
| r8640 | r8641 | |
| 394 | 417 | static READ8_HANDLER( px4_icrhb_r ) |
| 395 | 418 | { |
| 396 | 419 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 397 | | logerror("%s: px4_icrhb_r\n", cpuexec_describe_context(space->machine)); |
| 398 | 420 | |
| 421 | if (VERBOSE) |
| 422 | logerror("%s: px4_icrhb_r\n", cpuexec_describe_context(space->machine)); |
| 423 | |
| 399 | 424 | /* clear icf interrupt */ |
| 400 | 425 | px4->isr &= ~INT2_ICF; |
| 401 | 426 | gapnit_interrupt(space->machine); |
| r8640 | r8641 | |
| 407 | 432 | static READ8_HANDLER( px4_isr_r ) |
| 408 | 433 | { |
| 409 | 434 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 410 | | logerror("%s: px4_isr_r\n", cpuexec_describe_context(space->machine)); |
| 411 | 435 | |
| 436 | if (VERBOSE) |
| 437 | logerror("%s: px4_isr_r\n", cpuexec_describe_context(space->machine)); |
| 438 | |
| 412 | 439 | return px4->isr; |
| 413 | 440 | } |
| 414 | 441 | |
| r8640 | r8641 | |
| 416 | 443 | static WRITE8_HANDLER( px4_ier_w ) |
| 417 | 444 | { |
| 418 | 445 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 419 | | logerror("%s: px4_ier_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 420 | 446 | |
| 447 | if (VERBOSE) |
| 448 | logerror("%s: px4_ier_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 449 | |
| 421 | 450 | px4->ier = data; |
| 422 | 451 | gapnit_interrupt(space->machine); |
| 423 | 452 | } |
| r8640 | r8641 | |
| 428 | 457 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 429 | 458 | UINT8 result = 0; |
| 430 | 459 | |
| 431 | | logerror("%s: px4_str_r\n", cpuexec_describe_context(space->machine)); |
| 460 | if (VERBOSE) |
| 461 | logerror("%s: px4_str_r\n", cpuexec_describe_context(space->machine)); |
| 432 | 462 | |
| 433 | 463 | result |= cassette_input(px4->ext_cas) > 0 ? 1 : 0; |
| 434 | 464 | result |= 1 << 1; /* BCRD, barcode reader input */ |
| r8640 | r8641 | |
| 472 | 502 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 473 | 503 | const address_space *space_program = cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM); |
| 474 | 504 | |
| 475 | | logerror("%s: px4_bankr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 505 | if (VERBOSE) |
| 506 | logerror("%s: px4_bankr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 476 | 507 | |
| 477 | 508 | px4->bankr = data; |
| 478 | 509 | |
| r8640 | r8641 | |
| 502 | 533 | case 0x0e: install_rom_capsule(space_program, 0x8000, "capsule2"); break; |
| 503 | 534 | |
| 504 | 535 | default: |
| 505 | | logerror("invalid bank switch value: 0x%02x\n", data >> 4); |
| 536 | if (VERBOSE) |
| 537 | logerror("invalid bank switch value: 0x%02x\n", data >> 4); |
| 506 | 538 | |
| 507 | 539 | } |
| 508 | 540 | } |
| r8640 | r8641 | |
| 511 | 543 | static READ8_HANDLER( px4_sior_r ) |
| 512 | 544 | { |
| 513 | 545 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 514 | | logerror("%s: px4_sior_r\n", cpuexec_describe_context(space->machine)); |
| 515 | | logerror("sior = 0x%02x\n", px4->sior); |
| 516 | 546 | |
| 547 | if (VERBOSE) |
| 548 | logerror("%s: px4_sior_r 0x%02x\n", cpuexec_describe_context(space->machine), px4->sior); |
| 549 | |
| 517 | 550 | return px4->sior; |
| 518 | 551 | } |
| 519 | 552 | |
| r8640 | r8641 | |
| 521 | 554 | static WRITE8_HANDLER( px4_sior_w ) |
| 522 | 555 | { |
| 523 | 556 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 524 | | logerror("%s: px4_sior_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 525 | 557 | |
| 558 | if (VERBOSE) |
| 559 | logerror("%s: px4_sior_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 560 | |
| 526 | 561 | px4->sior = data; |
| 527 | 562 | |
| 528 | 563 | switch (data) |
| 529 | 564 | { |
| 530 | | case 0x01: logerror("7508 cmd: Power OFF\n"); break; |
| 565 | case 0x01: |
| 531 | 566 | |
| 567 | if (VERBOSE) |
| 568 | logerror("7508 cmd: Power OFF\n"); |
| 569 | |
| 570 | break; |
| 571 | |
| 532 | 572 | case 0x02: |
| 533 | | logerror("7508 cmd: Read Status\n"); |
| 534 | 573 | |
| 574 | if (VERBOSE) |
| 575 | logerror("7508 cmd: Read Status\n"); |
| 576 | |
| 535 | 577 | if (px4->interrupt_status != 0) |
| 536 | 578 | { |
| 537 | | logerror("> 7508 has interrupts pending: 0x%02x\n", px4->interrupt_status); |
| 579 | if (VERBOSE) |
| 580 | logerror("> 7508 has interrupts pending: 0x%02x\n", px4->interrupt_status); |
| 538 | 581 | |
| 539 | 582 | /* signal the interrupt(s) */ |
| 540 | 583 | px4->sior = 0xc1 | px4->interrupt_status; |
| r8640 | r8641 | |
| 553 | 596 | |
| 554 | 597 | break; |
| 555 | 598 | |
| 556 | | case 0x03: logerror("7508 cmd: KB Reset\n"); break; |
| 557 | | case 0x04: logerror("7508 cmd: KB Repeat Timer 1 Set\n"); break; |
| 558 | | case 0x14: logerror("7508 cmd: KB Repeat Timer 2 Set\n"); break; |
| 559 | | case 0x24: logerror("7508 cmd: KB Repeat Timer 1 Read\n"); break; |
| 560 | | case 0x34: logerror("7508 cmd: KB Repeat Timer 2 Read\n"); break; |
| 561 | | case 0x05: logerror("7508 cmd: KB Repeat OFF\n"); break; |
| 562 | | case 0x15: logerror("7508 cmd: KB Repeat ON\n"); break; |
| 599 | case 0x03: if (VERBOSE) logerror("7508 cmd: KB Reset\n"); break; |
| 600 | case 0x04: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 1 Set\n"); break; |
| 601 | case 0x14: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 2 Set\n"); break; |
| 602 | case 0x24: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 1 Read\n"); break; |
| 603 | case 0x34: if (VERBOSE) logerror("7508 cmd: KB Repeat Timer 2 Read\n"); break; |
| 604 | case 0x05: if (VERBOSE) logerror("7508 cmd: KB Repeat OFF\n"); break; |
| 605 | case 0x15: if (VERBOSE) logerror("7508 cmd: KB Repeat ON\n"); break; |
| 563 | 606 | |
| 564 | 607 | case 0x06: |
| 565 | | logerror("7508 cmd: KB Interrupt OFF\n"); |
| 608 | |
| 609 | if (VERBOSE) |
| 610 | logerror("7508 cmd: KB Interrupt OFF\n"); |
| 611 | |
| 566 | 612 | px4->key_int_enabled = FALSE; |
| 567 | 613 | break; |
| 568 | 614 | |
| 569 | 615 | case 0x16: |
| 570 | | logerror("7508 cmd: KB Interrupt ON\n"); |
| 616 | |
| 617 | if (VERBOSE) |
| 618 | logerror("7508 cmd: KB Interrupt ON\n"); |
| 619 | |
| 571 | 620 | px4->key_int_enabled = TRUE; |
| 572 | 621 | break; |
| 573 | 622 | |
| 574 | | case 0x07: logerror("7508 cmd: Clock Read\n"); break; |
| 575 | | case 0x17: logerror("7508 cmd: Clock Write\n"); break; |
| 623 | case 0x07: if (VERBOSE) logerror("7508 cmd: Clock Read\n"); break; |
| 624 | case 0x17: if (VERBOSE) logerror("7508 cmd: Clock Write\n"); break; |
| 576 | 625 | |
| 577 | 626 | case 0x08: |
| 578 | | logerror("7508 cmd: Power Switch Read\n"); |
| 579 | 627 | |
| 628 | if (VERBOSE) |
| 629 | logerror("7508 cmd: Power Switch Read\n"); |
| 630 | |
| 580 | 631 | /* indicate that the power switch is in the "ON" position */ |
| 581 | 632 | px4->sior = 0x01; |
| 582 | 633 | break; |
| 583 | 634 | |
| 584 | | case 0x09: logerror("7508 cmd: Alarm Read\n"); break; |
| 585 | | case 0x19: logerror("7508 cmd: Alarm Set\n"); break; |
| 586 | | case 0x29: logerror("7508 cmd: Alarm OFF\n"); break; |
| 587 | | case 0x39: logerror("7508 cmd: Alarm ON\n"); break; |
| 635 | case 0x09: if (VERBOSE) logerror("7508 cmd: Alarm Read\n"); break; |
| 636 | case 0x19: if (VERBOSE) logerror("7508 cmd: Alarm Set\n"); break; |
| 637 | case 0x29: if (VERBOSE) logerror("7508 cmd: Alarm OFF\n"); break; |
| 638 | case 0x39: if (VERBOSE) logerror("7508 cmd: Alarm ON\n"); break; |
| 588 | 639 | |
| 589 | 640 | case 0x0a: |
| 590 | | logerror("7508 cmd: DIP Switch Read\n"); |
| 641 | |
| 642 | if (VERBOSE) |
| 643 | logerror("7508 cmd: DIP Switch Read\n"); |
| 591 | 644 | px4->sior = input_port_read(space->machine, "dips"); |
| 592 | 645 | break; |
| 593 | 646 | |
| 594 | | case 0x0b: logerror("7508 cmd: Stop Key Interrupt disable\n"); break; |
| 595 | | case 0x1b: logerror("7508 cmd: Stop Key Interrupt enable\n"); break; |
| 596 | | case 0x0c: logerror("7508 cmd: 7 chr. Buffer\n"); break; |
| 597 | | case 0x1c: logerror("7508 cmd: 1 chr. Buffer\n"); break; |
| 647 | case 0x0b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt disable\n"); break; |
| 648 | case 0x1b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt enable\n"); break; |
| 649 | case 0x0c: if (VERBOSE) logerror("7508 cmd: 7 chr. Buffer\n"); break; |
| 650 | case 0x1c: if (VERBOSE) logerror("7508 cmd: 1 chr. Buffer\n"); break; |
| 598 | 651 | |
| 599 | 652 | case 0x0d: |
| 600 | | logerror("7508 cmd: 1 sec. Interrupt OFF\n"); |
| 653 | |
| 654 | if (VERBOSE) |
| 655 | logerror("7508 cmd: 1 sec. Interrupt OFF\n"); |
| 656 | |
| 601 | 657 | px4->one_sec_int_enabled = FALSE; |
| 602 | 658 | break; |
| 603 | 659 | |
| 604 | 660 | case 0x1d: |
| 605 | | logerror("7508 cmd: 1 sec. Interrupt ON\n"); |
| 661 | |
| 662 | if (VERBOSE) |
| 663 | logerror("7508 cmd: 1 sec. Interrupt ON\n"); |
| 664 | |
| 606 | 665 | px4->one_sec_int_enabled = TRUE; |
| 607 | 666 | break; |
| 608 | 667 | |
| 609 | 668 | case 0x0e: |
| 610 | | logerror("7508 cmd: KB Clear\n"); |
| 669 | |
| 670 | if (VERBOSE) |
| 671 | logerror("7508 cmd: KB Clear\n"); |
| 672 | |
| 611 | 673 | px4->sior = 0xbf; |
| 612 | 674 | break; |
| 613 | 675 | |
| 614 | | case 0x0f: logerror("7508 cmd: System Reset\n"); break; |
| 676 | case 0x0f: if (VERBOSE) logerror("7508 cmd: System Reset\n"); break; |
| 615 | 677 | } |
| 616 | 678 | } |
| 617 | 679 | |
| r8640 | r8641 | |
| 624 | 686 | static WRITE8_HANDLER( px4_vadr_w ) |
| 625 | 687 | { |
| 626 | 688 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 627 | | logerror("%s: px4_vadr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 628 | 689 | |
| 690 | if (VERBOSE) |
| 691 | logerror("%s: px4_vadr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 692 | |
| 629 | 693 | px4->vadr = data; |
| 630 | 694 | } |
| 631 | 695 | |
| r8640 | r8641 | |
| 633 | 697 | static WRITE8_HANDLER( px4_yoff_w ) |
| 634 | 698 | { |
| 635 | 699 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 636 | | logerror("%s: px4_yoff_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 637 | 700 | |
| 701 | if (VERBOSE) |
| 702 | logerror("%s: px4_yoff_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 703 | |
| 638 | 704 | px4->yoff = data; |
| 639 | 705 | } |
| 640 | 706 | |
| 641 | 707 | /* frame register */ |
| 642 | 708 | static WRITE8_HANDLER( px4_fr_w ) |
| 643 | 709 | { |
| 644 | | logerror("%s: px4_fr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 710 | if (VERBOSE) |
| 711 | logerror("%s: px4_fr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 645 | 712 | } |
| 646 | 713 | |
| 647 | 714 | /* speed-up register */ |
| 648 | 715 | static WRITE8_HANDLER( px4_spur_w ) |
| 649 | 716 | { |
| 650 | | logerror("%s: px4_spur_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 717 | if (VERBOSE) |
| 718 | logerror("%s: px4_spur_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 651 | 719 | } |
| 652 | 720 | |
| 653 | 721 | |
| r8640 | r8641 | |
| 678 | 746 | /* cartridge interface */ |
| 679 | 747 | static READ8_HANDLER( px4_ctgif_r ) |
| 680 | 748 | { |
| 681 | | logerror("%s: px4_ctgif_r @ 0x%02x\n", cpuexec_describe_context(space->machine), offset); |
| 749 | if (VERBOSE) |
| 750 | logerror("%s: px4_ctgif_r @ 0x%02x\n", cpuexec_describe_context(space->machine), offset); |
| 751 | |
| 682 | 752 | return 0xff; |
| 683 | 753 | } |
| 684 | 754 | |
| 685 | 755 | /* cartridge interface */ |
| 686 | 756 | static WRITE8_HANDLER( px4_ctgif_w ) |
| 687 | 757 | { |
| 688 | | logerror("%s: px4_ctgif_w (0x%02x @ 0x%02x)\n", cpuexec_describe_context(space->machine), data, offset); |
| 758 | if (VERBOSE) |
| 759 | logerror("%s: px4_ctgif_w (0x%02x @ 0x%02x)\n", cpuexec_describe_context(space->machine), data, offset); |
| 689 | 760 | } |
| 690 | 761 | |
| 691 | 762 | /* art data input register */ |
| 692 | 763 | static READ8_HANDLER( px4_artdir_r ) |
| 693 | 764 | { |
| 694 | 765 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 695 | | logerror("%s: px4_artdir_r\n", cpuexec_describe_context(space->machine)); |
| 696 | 766 | |
| 767 | if (VERBOSE) |
| 768 | logerror("%s: px4_artdir_r\n", cpuexec_describe_context(space->machine)); |
| 769 | |
| 697 | 770 | return px4->artdir; |
| 698 | 771 | } |
| 699 | 772 | |
| r8640 | r8641 | |
| 701 | 774 | static WRITE8_HANDLER( px4_artdor_w ) |
| 702 | 775 | { |
| 703 | 776 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 704 | | logerror("%s: px4_artdor_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 705 | 777 | |
| 778 | if (VERBOSE) |
| 779 | logerror("%s: px4_artdor_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 780 | |
| 706 | 781 | /* clear ready */ |
| 707 | 782 | px4->artsr &= ~ART_TXRDY; |
| 708 | 783 | |
| r8640 | r8641 | |
| 715 | 790 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 716 | 791 | UINT8 result = 0; |
| 717 | 792 | |
| 718 | | logerror("%s: px4_artsr_r\n", cpuexec_describe_context(space->machine)); |
| 793 | if (VERBOSE) |
| 794 | logerror("%s: px4_artsr_r\n", cpuexec_describe_context(space->machine)); |
| 719 | 795 | |
| 720 | 796 | result |= px4_rs232c_dsr(px4->rs232c_device) << 7; |
| 721 | 797 | |
| r8640 | r8641 | |
| 726 | 802 | static WRITE8_HANDLER( px4_artmr_w ) |
| 727 | 803 | { |
| 728 | 804 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 729 | | logerror("%s: px4_artmr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 730 | 805 | |
| 806 | if (VERBOSE) |
| 807 | logerror("%s: px4_artmr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 808 | |
| 731 | 809 | px4->artmr = data; |
| 732 | 810 | } |
| 733 | 811 | |
| r8640 | r8641 | |
| 737 | 815 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 738 | 816 | UINT8 result = 0; |
| 739 | 817 | |
| 740 | | logerror("%s: px4_iostr_r\n", cpuexec_describe_context(space->machine)); |
| 818 | if (VERBOSE) |
| 819 | logerror("%s: px4_iostr_r\n", cpuexec_describe_context(space->machine)); |
| 741 | 820 | |
| 742 | 821 | result |= centronics_busy_r(px4->printer) << 0; |
| 743 | 822 | result |= !centronics_pe_r(px4->printer) << 1; |
| r8640 | r8641 | |
| 755 | 834 | static WRITE8_HANDLER( px4_artcr_w ) |
| 756 | 835 | { |
| 757 | 836 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 758 | | logerror("%s: px4_artcr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 759 | 837 | |
| 838 | if (VERBOSE) |
| 839 | logerror("%s: px4_artcr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 840 | |
| 760 | 841 | px4->artcr = data; |
| 761 | 842 | |
| 762 | 843 | /* bit 0, txe - transmit enable */ |
| r8640 | r8641 | |
| 787 | 868 | static WRITE8_HANDLER( px4_swr_w ) |
| 788 | 869 | { |
| 789 | 870 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 790 | | logerror("%s: px4_swr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 791 | 871 | |
| 872 | if (VERBOSE) |
| 873 | logerror("%s: px4_swr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 874 | |
| 792 | 875 | px4->swr = data; |
| 793 | 876 | } |
| 794 | 877 | |
| r8640 | r8641 | |
| 797 | 880 | { |
| 798 | 881 | px4_state *px4 = (px4_state *)space->machine->driver_data; |
| 799 | 882 | |
| 800 | | logerror("%s: px4_ioctlr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 883 | if (VERBOSE) |
| 884 | logerror("%s: px4_ioctlr_w (0x%02x)\n", cpuexec_describe_context(space->machine), data); |
| 801 | 885 | |
| 802 | 886 | centronics_strobe_w(px4->printer, !BIT(data, 0)); |
| 803 | 887 | centronics_prime_w(px4->printer, BIT(data, 1)); |
| r8640 | r8641 | |
| 851 | 935 | if ((scancode & 0xa0) == 0xa0) |
| 852 | 936 | scancode |= down; |
| 853 | 937 | |
| 854 | | logerror("upd7508: key callback, key=0x%02x\n", scancode); |
| 938 | if (VERBOSE) |
| 939 | logerror("upd7508: key callback, key=0x%02x\n", scancode); |
| 855 | 940 | |
| 856 | 941 | break; |
| 857 | 942 | } |
| r8640 | r8641 | |
| 863 | 948 | |
| 864 | 949 | if (px4->key_int_enabled) |
| 865 | 950 | { |
| 866 | | logerror("upd7508: key interrupt\n"); |
| 951 | if (VERBOSE) |
| 952 | logerror("upd7508: key interrupt\n"); |
| 953 | |
| 867 | 954 | px4->isr |= INT0_7508; |
| 868 | 955 | gapnit_interrupt(field->port->machine); |
| 869 | 956 | } |
| r8640 | r8641 | |
| 1100 | 1187 | PORT_START("dips") |
| 1101 | 1188 | |
| 1102 | 1189 | PORT_DIPNAME(0x0f, 0x0f, "Character set") |
| 1103 | | PORT_DIPLOCATION("DIP:8,7,6,5") |
| 1190 | PORT_DIPLOCATION("PX-4 DIP:8,7,6,5") |
| 1104 | 1191 | PORT_DIPSETTING(0x0f, "ASCII") |
| 1105 | 1192 | PORT_DIPSETTING(0x0e, "France") |
| 1106 | 1193 | PORT_DIPSETTING(0x0d, "Germany") |
| r8640 | r8641 | |
| 1135 | 1222 | /* US ASCII keyboard */ |
| 1136 | 1223 | static INPUT_PORTS_START( px4_h450a ) |
| 1137 | 1224 | PORT_INCLUDE(px4_dips) |
| 1225 | PORT_INCLUDE(tf20) |
| 1138 | 1226 | |
| 1139 | 1227 | PORT_START("keyboard_0") |
| 1140 | 1228 | PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CHANGED(key_callback, (void *)0) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(ESC)) // 00 |
| r8640 | r8641 | |
| 1235 | 1323 | /* item keyboard */ |
| 1236 | 1324 | static INPUT_PORTS_START( px4_h421a ) |
| 1237 | 1325 | PORT_INCLUDE(px4_dips) |
| 1326 | PORT_INCLUDE(tf20) |
| 1238 | 1327 | INPUT_PORTS_END |
| 1239 | 1328 | |
| 1240 | 1329 | |
| r8640 | r8641 | |
| 1311 | 1400 | MDRV_CARTSLOT_NOT_MANDATORY |
| 1312 | 1401 | |
| 1313 | 1402 | /* tf20 floppy drive */ |
| 1314 | | // MDRV_TF20_ADD("floppy") |
| 1403 | MDRV_TF20_ADD("floppy") |
| 1315 | 1404 | MACHINE_DRIVER_END |
| 1316 | 1405 | |
| 1317 | 1406 | static MACHINE_DRIVER_START( px4p ) |