src/mame/drivers/namcos22.c
| r14745 | r14746 | |
| 2459 | 2459 | static WRITE32_HANDLER( namcos22_mcuram_w ) |
| 2460 | 2460 | { |
| 2461 | 2461 | namcos22_state *state = space->machine().driver_data<namcos22_state>(); |
| 2462 | | |
| 2463 | | if ( ACCESSING_BITS_0_15 ) |
| 2464 | | { |
| 2465 | | if (state->m_sw1_output) |
| 2466 | | { |
| 2467 | | state->m_sw1_output(offset, data); |
| 2468 | | } |
| 2469 | | } |
| 2470 | | else |
| 2471 | | { |
| 2472 | | if (state->m_sw2_output) |
| 2473 | | { |
| 2474 | | state->m_sw2_output(offset, data>>16); |
| 2475 | | } |
| 2476 | | } |
| 2477 | | |
| 2478 | 2462 | COMBINE_DATA(&state->m_shareram[offset]); |
| 2479 | | |
| 2480 | 2463 | } |
| 2481 | 2464 | |
| 2482 | | |
| 2483 | 2465 | static READ32_HANDLER( namcos22_gun_r ) |
| 2484 | 2466 | { |
| 2485 | 2467 | int xpos = input_port_read_safe(space->machine(), "LIGHTX", 0) * 640 / 0xff; |
| r14745 | r14746 | |
| 2706 | 2688 | return 0; |
| 2707 | 2689 | } |
| 2708 | 2690 | |
| 2691 | static WRITE8_HANDLER( propcycle_mcu_port5_w ) |
| 2692 | { |
| 2693 | // prop cycle outputs: |
| 2694 | // bit 1 = fan |
| 2695 | // bit 2 = button light |
| 2696 | |
| 2697 | output_set_value("fan0", data & 1); |
| 2698 | set_led_status(space->machine(), 0, data & 2); |
| 2699 | } |
| 2700 | |
| 2709 | 2701 | static READ8_HANDLER( propcycle_mcu_adc_r ) |
| 2710 | 2702 | { |
| 2711 | 2703 | // H+L = horizontal, 1 H+L = vertical |
| r14745 | r14746 | |
| 5516 | 5508 | machine.device("mcu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x82, 0x83, FUNC(mcu141_speedup_r), FUNC(mcu_speedup_w)); |
| 5517 | 5509 | } |
| 5518 | 5510 | |
| 5519 | | /*****************************************************************************************************/ |
| 5520 | | // Some of the data is stored visually, with the leftmost bit corresponding to the least significant bit. |
| 5521 | | // As a result the values must be un-reversed before being used. |
| 5522 | | // Taken from http://www-graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv |
| 5523 | | static unsigned char reverse(UINT16 b) |
| 5524 | | { |
| 5525 | | return ((unsigned char)b * 0x0202020202ULL & 0x010884422010ULL) % 1023; |
| 5526 | | } |
| 5527 | | |
| 5528 | | static void acedrvr_sw1_output( int offset , UINT16 data ) |
| 5529 | | { |
| 5530 | | if (offset == 16) |
| 5531 | | { |
| 5532 | | //These LEDs are arranged in a figure 8. |
| 5533 | | output_set_value("Uknown_led", BIT(data,0) ^ 0x01); |
| 5534 | | output_set_value("Middle_led", BIT(data,1) ^ 0x01); |
| 5535 | | output_set_value("Top_left_led", BIT(data,2) ^ 0x01); |
| 5536 | | output_set_value("Bottom_left_led", BIT(data,3) ^ 0x01); |
| 5537 | | output_set_value("Bottom_led", BIT(data,4) ^ 0x01); |
| 5538 | | output_set_value("Bottom_right_led", BIT(data,5) ^ 0x01); |
| 5539 | | output_set_value("Top_led", BIT(data,6) ^ 0x01); |
| 5540 | | output_set_value("Top_right_led", BIT(data,7) ^ 0x01); |
| 5541 | | } |
| 5542 | | } |
| 5543 | | |
| 5544 | | static void acedrvr_sw2_output( int offset , UINT16 data ) |
| 5545 | | { |
| 5546 | | switch ( offset ) |
| 5547 | | { |
| 5548 | | case 8: |
| 5549 | | output_set_value("Signal_Green_lamp", BIT(data,0)); |
| 5550 | | output_set_value("Base_vibration", BIT(data,2)); |
| 5551 | | output_set_value("Wheel_force", BIT(data,3)); |
| 5552 | | output_set_value("Top_lamp", BIT(data,4)); |
| 5553 | | output_set_value("Signal_Red_lamp", BIT(data,5)); |
| 5554 | | break; |
| 5555 | | case 16: |
| 5556 | | output_set_value("Wheel_force_direction", BIT(data,1)); |
| 5557 | | output_set_value("Wheel_force_magnitude",((reverse(data) & 0x3F) ^ 0x3F)); |
| 5558 | | break; |
| 5559 | | default: |
| 5560 | | break; |
| 5561 | | } |
| 5562 | | } |
| 5563 | | |
| 5564 | | static void airco22_sw1_output( int offset , UINT16 data ) |
| 5565 | | { |
| 5566 | | if ( offset == 8011) |
| 5567 | | output_set_value("Start_lamp", BIT(data,1)); |
| 5568 | | |
| 5569 | | } |
| 5570 | | |
| 5571 | | static void cybrcomm_sw2_output( int offset , UINT16 data ) |
| 5572 | | { |
| 5573 | | if ( offset == 8) |
| 5574 | | output_set_value("View_switch_lamp", BIT(data,4)); |
| 5575 | | |
| 5576 | | } |
| 5577 | | |
| 5578 | | static void propcycl_sw1_output( int offset , UINT16 data ) |
| 5579 | | { |
| 5580 | | if ( offset == 8011) |
| 5581 | | { |
| 5582 | | output_set_value("Fan_motor", BIT(data,1)); |
| 5583 | | output_set_value("Button_lamp", BIT(data,2)); |
| 5584 | | } |
| 5585 | | } |
| 5586 | | |
| 5587 | | static void raveracw_sw2_output( int offset , UINT16 data ) |
| 5588 | | { |
| 5589 | | if ( offset == 16) |
| 5590 | | { |
| 5591 | | output_set_value("Wheel_force_direction", BIT(data,1)); |
| 5592 | | output_set_value("Wheel_force_magnitude",((reverse(data) & 0x3F) ^ 0x3F)); |
| 5593 | | } |
| 5594 | | } |
| 5595 | | |
| 5596 | | static void dirtdash_sw1_output( int offset , UINT16 data ) |
| 5597 | | { |
| 5598 | | if ( offset >= 7680 && offset <= 7695) |
| 5599 | | { |
| 5600 | | /* |
| 5601 | | The wheel force direction and magnitude interact with the wheel |
| 5602 | | position in a way that isn't fully understood. This causes |
| 5603 | | what appear to be spurious changes in direction and magnitude. |
| 5604 | | */ |
| 5605 | | output_set_value("Wheel_force_direction", BIT(data,1)); |
| 5606 | | output_set_value("Wheel_force_magnitude",((reverse(data) & 0x3F) ^ 0x3F)); |
| 5607 | | } |
| 5608 | | else if ( offset == 8011) |
| 5609 | | { |
| 5610 | | output_set_value("Wheel_force", BIT(data,1)); |
| 5611 | | output_set_value("Valve_front_left", BIT(data,4)); |
| 5612 | | output_set_value("Valve_front_right", BIT(data,5)); |
| 5613 | | output_set_value("Valve_rear_left", BIT(data,6)); |
| 5614 | | output_set_value("Valve_rear_right", BIT(data,7)); |
| 5615 | | } |
| 5616 | | } |
| 5617 | | |
| 5618 | | static void alpiner_sw1_output( int offset , UINT16 data ) |
| 5619 | | { |
| 5620 | | if ( offset == 8011) |
| 5621 | | { |
| 5622 | | //Direction 0 is locking and 1 is freeing. |
| 5623 | | output_set_value("Motor_direction", BIT(data,1)); |
| 5624 | | output_set_value("Motor_power", BIT(data,2)); |
| 5625 | | output_set_value("Decision_lamp", BIT(data,4)); |
| 5626 | | output_set_value("Left_selection_lamp", BIT(data,5)); |
| 5627 | | output_set_value("Right_selection_lamp", BIT(data,6)); |
| 5628 | | } |
| 5629 | | } |
| 5630 | | |
| 5631 | | static void alpiner2_sw1_output( int offset , UINT16 data ) |
| 5632 | | { |
| 5633 | | if ( offset == 8011) |
| 5634 | | { |
| 5635 | | //Direction 0 is locking and 1 is freeing. |
| 5636 | | output_set_value("Motor_direction", BIT(data,1)); |
| 5637 | | output_set_value("Motor_power", BIT(data,2)); |
| 5638 | | output_set_value("View_switch_lamp", BIT(data,4)); |
| 5639 | | output_set_value("Left_selection_lamp", BIT(data,5)); |
| 5640 | | output_set_value("Right_selection_lamp", BIT(data,6)); |
| 5641 | | } |
| 5642 | | } |
| 5643 | | |
| 5644 | | static void aquajet_sw1_output( int offset , UINT16 data ) |
| 5645 | | { |
| 5646 | | if ( offset == 8011) |
| 5647 | | { |
| 5648 | | output_set_value("Start_lamp", BIT(data,1)); |
| 5649 | | output_set_value("Fan_motor", BIT(data,2)); |
| 5650 | | output_set_value("Air_spring", BIT(data,7)); |
| 5651 | | } |
| 5652 | | } |
| 5653 | | |
| 5654 | | static void cybrcyc_sw1_output( int offset , UINT16 data ) |
| 5655 | | { |
| 5656 | | if ( offset == 8011) |
| 5657 | | { |
| 5658 | | output_set_value("bit0", BIT(data,0)); |
| 5659 | | output_set_value("1_lamp", BIT(data,1)); |
| 5660 | | output_set_value("2_lamp", BIT(data,2)); |
| 5661 | | output_set_value("3_lamp", BIT(data,3)); |
| 5662 | | output_set_value("4_lamp", BIT(data,4)); |
| 5663 | | output_set_value("Red_lamp", BIT(data,5)); |
| 5664 | | output_set_value("Yellow_lamp", BIT(data,6)); |
| 5665 | | output_set_value("Blue_lamp", BIT(data,7)); |
| 5666 | | output_set_value("Green_lamp", BIT(data,8)); |
| 5667 | | output_set_value("View_switch_lamp", BIT(data,9)); |
| 5668 | | } |
| 5669 | | } |
| 5670 | | |
| 5671 | | static void timecris_sw1_output( int offset , UINT16 data ) |
| 5672 | | { |
| 5673 | | if ( offset == 8011) |
| 5674 | | output_set_value("Gun_recoil", BIT(data,1)); |
| 5675 | | } |
| 5676 | | |
| 5677 | | static void tokyowar_sw1_output( int offset , UINT16 data ) |
| 5678 | | { |
| 5679 | | if ( offset == 8011) |
| 5680 | | { |
| 5681 | | output_set_value("View_switch_lamp", BIT(data,1)); |
| 5682 | | output_set_value("Credit_available_lamp", BIT(data,2)); |
| 5683 | | } |
| 5684 | | } |
| 5685 | | |
| 5686 | | /*****************************************************************************************************/ |
| 5687 | | |
| 5688 | 5511 | static void namcos22_init( running_machine &machine, int game_type ) |
| 5689 | 5512 | { |
| 5690 | 5513 | namcos22_state *state = machine.driver_data<namcos22_state>(); |
| r14745 | r14746 | |
| 5696 | 5519 | state->m_p4 = 0; |
| 5697 | 5520 | state->m_old_coin_state = 0; |
| 5698 | 5521 | state->m_credits1 = state->m_credits2 = 0; |
| 5699 | | state->m_sw1_output = NULL; |
| 5700 | | state->m_sw2_output = NULL; |
| 5701 | 5522 | |
| 5702 | 5523 | state->m_mpPointRAM = auto_alloc_array(machine, UINT32, 0x20000); |
| 5703 | 5524 | } |
| r14745 | r14746 | |
| 5723 | 5544 | install_130_speedup(machine); |
| 5724 | 5545 | |
| 5725 | 5546 | state->m_keycus_id = 0x0187; |
| 5726 | | state->m_sw1_output = alpiner_sw1_output; |
| 5727 | 5547 | } |
| 5728 | 5548 | |
| 5729 | 5549 | static DRIVER_INIT( alpiner2 ) |
| r14745 | r14746 | |
| 5734 | 5554 | install_130_speedup(machine); |
| 5735 | 5555 | |
| 5736 | 5556 | state->m_keycus_id = 0x0187; |
| 5737 | | state->m_sw1_output = alpiner2_sw1_output; |
| 5738 | 5557 | } |
| 5739 | 5558 | |
| 5740 | 5559 | static DRIVER_INIT( alpinesa ) |
| r14745 | r14746 | |
| 5747 | 5566 | install_141_speedup(machine); |
| 5748 | 5567 | |
| 5749 | 5568 | state->m_keycus_id = 0x01a9; |
| 5750 | | state->m_sw1_output = alpiner2_sw1_output; |
| 5751 | 5569 | } |
| 5752 | 5570 | |
| 5753 | 5571 | static DRIVER_INIT( airco22 ) |
| 5754 | 5572 | { |
| 5755 | | namcos22_state *state = machine.driver_data<namcos22_state>(); |
| 5756 | 5573 | namcos22_init(machine, NAMCOS22_AIR_COMBAT22); |
| 5757 | 5574 | |
| 5758 | 5575 | // S22-BIOS ver1.20 namco all rights reserved 94/12/21 |
| 5759 | 5576 | machine.device("mcu")->memory().space(AS_IO)->install_legacy_read_handler(M37710_ADC0_L, M37710_ADC7_H, FUNC(airco22_mcu_adc_r)); |
| 5760 | | |
| 5761 | | state->m_sw1_output = airco22_sw1_output; |
| 5762 | 5577 | } |
| 5763 | 5578 | |
| 5764 | 5579 | static DRIVER_INIT( propcycl ) |
| 5765 | 5580 | { |
| 5766 | | namcos22_state *state = machine.driver_data<namcos22_state>(); |
| 5767 | | UINT32 *pROM = (UINT32 *)machine.region("maincpu")->base(); |
| 5581 | UINT32 *pROM = (UINT32 *)machine.region("maincpu")->base(); |
| 5768 | 5582 | |
| 5769 | 5583 | /* patch out strange routine (uninitialized-eprom related?) */ |
| 5770 | 5584 | pROM[0x1992C/4] = 0x4E754E75; |
| r14745 | r14746 | |
| 5783 | 5597 | |
| 5784 | 5598 | namcos22_init(machine, NAMCOS22_PROP_CYCLE); |
| 5785 | 5599 | |
| 5786 | | machine.device("mcu")->memory().space(AS_IO)->install_legacy_read_handler(M37710_ADC0_L, M37710_ADC7_H, FUNC(propcycle_mcu_adc_r)); |
| 5600 | machine.device("mcu")->memory().space(AS_IO)->install_legacy_read_handler(M37710_ADC0_L, M37710_ADC7_H, FUNC(propcycle_mcu_adc_r)); |
| 5601 | machine.device("mcu")->memory().space(AS_IO)->install_legacy_write_handler(M37710_PORT5, M37710_PORT5, FUNC(propcycle_mcu_port5_w)); |
| 5787 | 5602 | install_141_speedup(machine); |
| 5788 | | state->m_sw1_output = propcycl_sw1_output; |
| 5789 | 5603 | } |
| 5790 | 5604 | |
| 5791 | 5605 | static DRIVER_INIT( ridgeraj ) |
| r14745 | r14746 | |
| 5816 | 5630 | install_c74_speedup(machine); |
| 5817 | 5631 | |
| 5818 | 5632 | state->m_keycus_id = 0x0173; |
| 5819 | | state->m_sw1_output = acedrvr_sw1_output; |
| 5820 | | state->m_sw2_output = acedrvr_sw2_output; |
| 5821 | 5633 | } |
| 5822 | 5634 | |
| 5823 | 5635 | static DRIVER_INIT( victlap ) |
| r14745 | r14746 | |
| 5828 | 5640 | install_c74_speedup(machine); |
| 5829 | 5641 | |
| 5830 | 5642 | state->m_keycus_id = 0x0188; |
| 5831 | | state->m_sw2_output = acedrvr_sw2_output; |
| 5832 | | state->m_sw1_output = acedrvr_sw1_output; |
| 5833 | 5643 | } |
| 5834 | 5644 | |
| 5835 | 5645 | static DRIVER_INIT( raveracw ) |
| 5836 | 5646 | { |
| 5837 | | namcos22_state *state = machine.driver_data<namcos22_state>(); |
| 5838 | 5647 | namcos22_init(machine, NAMCOS22_RAVE_RACER); |
| 5839 | 5648 | |
| 5840 | 5649 | install_c74_speedup(machine); |
| 5841 | | state->m_sw2_output = raveracw_sw2_output; |
| 5842 | 5650 | } |
| 5843 | 5651 | |
| 5844 | 5652 | static DRIVER_INIT( cybrcomm ) |
| r14745 | r14746 | |
| 5849 | 5657 | install_c74_speedup(machine); |
| 5850 | 5658 | |
| 5851 | 5659 | state->m_keycus_id = 0x0185; |
| 5852 | | state->m_sw2_output = cybrcomm_sw2_output; |
| 5853 | 5660 | } |
| 5854 | 5661 | |
| 5855 | 5662 | static DRIVER_INIT( cybrcyc ) |
| r14745 | r14746 | |
| 5861 | 5668 | install_130_speedup(machine); |
| 5862 | 5669 | |
| 5863 | 5670 | state->m_keycus_id = 0x0387; |
| 5864 | | state->m_sw1_output = cybrcyc_sw1_output; |
| 5865 | 5671 | } |
| 5866 | 5672 | |
| 5867 | 5673 | static DRIVER_INIT( timecris ) |
| 5868 | 5674 | { |
| 5869 | | namcos22_state *state = machine.driver_data<namcos22_state>(); |
| 5870 | 5675 | namcos22_init(machine, NAMCOS22_TIME_CRISIS); |
| 5871 | 5676 | |
| 5872 | 5677 | install_130_speedup(machine); |
| 5873 | | state->m_sw1_output = timecris_sw1_output; |
| 5874 | 5678 | } |
| 5875 | 5679 | |
| 5876 | 5680 | static DRIVER_INIT( tokyowar ) |
| r14745 | r14746 | |
| 5882 | 5686 | install_141_speedup(machine); |
| 5883 | 5687 | |
| 5884 | 5688 | state->m_keycus_id = 0x01a8; |
| 5885 | | state->m_sw1_output = tokyowar_sw1_output; |
| 5886 | 5689 | } |
| 5887 | 5690 | |
| 5888 | 5691 | static DRIVER_INIT( aquajet ) |
| 5889 | 5692 | { |
| 5890 | | namcos22_state *state = machine.driver_data<namcos22_state>(); |
| 5891 | 5693 | namcos22_init(machine, NAMCOS22_AQUA_JET); |
| 5892 | 5694 | |
| 5893 | 5695 | machine.device("mcu")->memory().space(AS_IO)->install_legacy_read_handler(M37710_ADC0_L, M37710_ADC7_H, FUNC(aquajet_mcu_adc_r)); |
| 5894 | 5696 | install_141_speedup(machine); |
| 5895 | | state->m_sw1_output = aquajet_sw1_output; |
| 5896 | | |
| 5897 | 5697 | } |
| 5898 | 5698 | |
| 5899 | 5699 | static DRIVER_INIT( dirtdash ) |
| r14745 | r14746 | |
| 5905 | 5705 | install_141_speedup(machine); |
| 5906 | 5706 | |
| 5907 | 5707 | state->m_keycus_id = 0x01a2; |
| 5908 | | state->m_sw1_output = dirtdash_sw1_output; |
| 5909 | 5708 | } |
| 5910 | 5709 | |
| 5911 | 5710 | /************************************************************************************/ |
src/emu/cpu/powerpc/ppcdrc.c
| r14745 | r14746 | |
| 3072 | 3072 | return TRUE; |
| 3073 | 3073 | |
| 3074 | 3074 | case 0x1eb: /* DIVWx */ |
| 3075 | | case 0x3eb: /* DIVWOx */ |
| 3075 | case 0x3eb: /* DIVWOx */ |
| 3076 | UML_CMP(block, R32(G_RB(op)), 0x0); // cmp rb, #0 |
| 3077 | UML_JMPc(block, COND_NE, compiler->labelnum); // bne 0: |
| 3078 | UML_CMP(block, R32(G_RA(op)), 0x80000000); // cmp rb, #80000000 |
| 3079 | UML_JMPc(block, COND_AE, compiler->labelnum); // bae 0: |
| 3080 | |
| 3081 | UML_MOV(block, R32(G_RD(op)), 0x0); // move rd, #0 |
| 3082 | if (op & M_OE) |
| 3083 | { |
| 3084 | UML_OR(block, XERSO32, XERSO32, 0x1); // SO = 1 |
| 3085 | } |
| 3086 | UML_JMP(block, compiler->labelnum+3); // jmp 3: |
| 3087 | |
| 3088 | UML_LABEL(block, compiler->labelnum++); // 0: |
| 3089 | |
| 3090 | UML_CMP(block, R32(G_RB(op)), 0x0); // cmp rb, #0 |
| 3091 | UML_JMPc(block, COND_Z, compiler->labelnum); // beq 1: |
| 3092 | |
| 3093 | UML_CMP(block, R32(G_RB(op)), 0xffffffff); // cmp rb, #ffffffff |
| 3094 | UML_JMPc(block, COND_NE, compiler->labelnum+1); // bne 2: |
| 3095 | UML_CMP(block, R32(G_RA(op)), 0x80000000); // cmp ra, #80000000 |
| 3096 | UML_JMPc(block, COND_NE, compiler->labelnum+1); // bne 2: |
| 3097 | |
| 3098 | UML_LABEL(block, compiler->labelnum++); // 1: |
| 3099 | // do second branch |
| 3100 | UML_MOV(block, R32(G_RD(op)), 0xffffffff); // move rd, #ffffffff |
| 3101 | if (op & M_OE) |
| 3102 | { |
| 3103 | UML_OR(block, XERSO32, XERSO32, 0x1); // SO = 1 |
| 3104 | } |
| 3105 | UML_JMP(block, compiler->labelnum+1); // jmp 3: |
| 3106 | |
| 3107 | UML_LABEL(block, compiler->labelnum++); // 2: |
| 3076 | 3108 | UML_DIVS(block, R32(G_RD(op)), R32(G_RD(op)), R32(G_RA(op)), R32(G_RB(op))); // divs rd,rd,ra,rb |
| 3077 | | generate_compute_flags(ppc, block, desc, op & M_RC, ((op & M_OE) ? XER_OV : 0), FALSE);// <update flags> |
| 3078 | | return TRUE; |
| 3109 | generate_compute_flags(ppc, block, desc, op & M_RC, ((op & M_OE) ? XER_OV : 0), FALSE);// <update flags> |
| 3079 | 3110 | |
| 3111 | UML_LABEL(block, compiler->labelnum++); // 3: |
| 3112 | return TRUE; |
| 3113 | |
| 3080 | 3114 | case 0x01c: /* ANDx */ |
| 3081 | 3115 | UML_AND(block, R32(G_RA(op)), R32(G_RS(op)), R32(G_RB(op))); // and ra,rs,rb |
| 3082 | 3116 | generate_compute_flags(ppc, block, desc, op & M_RC, 0, FALSE); // <update flags> |