trunk/src/mame/drivers/dynax.c
| r32375 | r32376 | |
| 98 | 98 | |
| 99 | 99 | |
| 100 | 100 | /* It runs in IM 0, thus needs an opcode on the data bus */ |
| 101 | | void sprtmtch_update_irq( running_machine &machine ) |
| 101 | void dynax_state::sprtmtch_update_irq() |
| 102 | 102 | { |
| 103 | | dynax_state *state = machine.driver_data<dynax_state>(); |
| 104 | | int irq = (state->m_sound_irq ? 0x08 : 0) | ((state->m_vblank_irq) ? 0x10 : 0) | ((state->m_blitter_irq) ? 0x20 : 0) ; |
| 105 | | state->m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ |
| 103 | int irq = (m_sound_irq ? 0x08 : 0) | ((m_vblank_irq) ? 0x10 : 0) | ((m_blitter_irq) ? 0x20 : 0) ; |
| 104 | m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ |
| 106 | 105 | } |
| 107 | 106 | |
| 108 | 107 | WRITE8_MEMBER(dynax_state::dynax_vblank_ack_w) |
| 109 | 108 | { |
| 110 | 109 | m_vblank_irq = 0; |
| 111 | | sprtmtch_update_irq(machine()); |
| 110 | sprtmtch_update_irq(); |
| 112 | 111 | } |
| 113 | 112 | |
| 114 | 113 | WRITE8_MEMBER(dynax_state::dynax_blitter_ack_w) |
| 115 | 114 | { |
| 116 | 115 | m_blitter_irq = 0; |
| 117 | | sprtmtch_update_irq(machine()); |
| 116 | sprtmtch_update_irq(); |
| 118 | 117 | } |
| 119 | 118 | |
| 120 | 119 | INTERRUPT_GEN_MEMBER(dynax_state::sprtmtch_vblank_interrupt) |
| 121 | 120 | { |
| 122 | 121 | m_vblank_irq = 1; |
| 123 | | sprtmtch_update_irq(machine()); |
| 122 | sprtmtch_update_irq(); |
| 124 | 123 | } |
| 125 | 124 | |
| 126 | 125 | WRITE_LINE_MEMBER(dynax_state::sprtmtch_sound_callback) |
| 127 | 126 | { |
| 128 | 127 | m_sound_irq = state; |
| 129 | | sprtmtch_update_irq(machine()); |
| 128 | sprtmtch_update_irq(); |
| 130 | 129 | } |
| 131 | 130 | |
| 132 | 131 | |
| r32375 | r32376 | |
| 135 | 134 | ***************************************************************************/ |
| 136 | 135 | |
| 137 | 136 | /* It runs in IM 0, thus needs an opcode on the data bus */ |
| 138 | | void jantouki_update_irq(running_machine &machine) |
| 137 | void dynax_state::jantouki_update_irq() |
| 139 | 138 | { |
| 140 | | dynax_state *state = machine.driver_data<dynax_state>(); |
| 141 | | int irq = ((state->m_blitter_irq) ? 0x08 : 0) | ((state->m_blitter2_irq) ? 0x10 : 0) | ((state->m_vblank_irq) ? 0x20 : 0) ; |
| 142 | | state->m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ |
| 139 | int irq = ((m_blitter_irq) ? 0x08 : 0) | ((m_blitter2_irq) ? 0x10 : 0) | ((m_vblank_irq) ? 0x20 : 0) ; |
| 140 | m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ |
| 143 | 141 | } |
| 144 | 142 | |
| 145 | 143 | WRITE8_MEMBER(dynax_state::jantouki_vblank_ack_w) |
| 146 | 144 | { |
| 147 | 145 | m_vblank_irq = 0; |
| 148 | | jantouki_update_irq(machine()); |
| 146 | jantouki_update_irq(); |
| 149 | 147 | } |
| 150 | 148 | |
| 151 | 149 | WRITE8_MEMBER(dynax_state::jantouki_blitter_ack_w) |
| 152 | 150 | { |
| 153 | 151 | m_blitter_irq = data; |
| 154 | | jantouki_update_irq(machine()); |
| 152 | jantouki_update_irq(); |
| 155 | 153 | } |
| 156 | 154 | |
| 157 | 155 | WRITE8_MEMBER(dynax_state::jantouki_blitter2_ack_w) |
| 158 | 156 | { |
| 159 | 157 | m_blitter2_irq = data; |
| 160 | | jantouki_update_irq(machine()); |
| 158 | jantouki_update_irq(); |
| 161 | 159 | } |
| 162 | 160 | |
| 163 | 161 | INTERRUPT_GEN_MEMBER(dynax_state::jantouki_vblank_interrupt) |
| 164 | 162 | { |
| 165 | 163 | m_vblank_irq = 1; |
| 166 | | jantouki_update_irq(machine()); |
| 164 | jantouki_update_irq(); |
| 167 | 165 | } |
| 168 | 166 | |
| 169 | 167 | |
| r32375 | r32376 | |
| 171 | 169 | Jantouki - Sound CPU |
| 172 | 170 | ***************************************************************************/ |
| 173 | 171 | |
| 174 | | static void jantouki_sound_update_irq(running_machine &machine) |
| 172 | void dynax_state::jantouki_sound_update_irq() |
| 175 | 173 | { |
| 176 | | dynax_state *state = machine.driver_data<dynax_state>(); |
| 177 | | int irq = ((state->m_sound_irq) ? 0x08 : 0) | ((state->m_soundlatch_irq) ? 0x10 : 0) | ((state->m_sound_vblank_irq) ? 0x20 : 0) ; |
| 178 | | state->m_soundcpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ |
| 174 | int irq = ((m_sound_irq) ? 0x08 : 0) | ((m_soundlatch_irq) ? 0x10 : 0) | ((m_sound_vblank_irq) ? 0x20 : 0) ; |
| 175 | m_soundcpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ |
| 179 | 176 | } |
| 180 | 177 | |
| 181 | 178 | INTERRUPT_GEN_MEMBER(dynax_state::jantouki_sound_vblank_interrupt) |
| 182 | 179 | { |
| 183 | 180 | m_sound_vblank_irq = 1; |
| 184 | | jantouki_sound_update_irq(machine()); |
| 181 | jantouki_sound_update_irq(); |
| 185 | 182 | } |
| 186 | 183 | |
| 187 | 184 | WRITE8_MEMBER(dynax_state::jantouki_sound_vblank_ack_w) |
| 188 | 185 | { |
| 189 | 186 | m_sound_vblank_irq = 0; |
| 190 | | jantouki_sound_update_irq(machine()); |
| 187 | jantouki_sound_update_irq(); |
| 191 | 188 | } |
| 192 | 189 | |
| 193 | 190 | WRITE_LINE_MEMBER(dynax_state::jantouki_sound_callback) |
| 194 | 191 | { |
| 195 | 192 | m_sound_irq = state; |
| 196 | | jantouki_sound_update_irq(machine()); |
| 193 | jantouki_sound_update_irq(); |
| 197 | 194 | } |
| 198 | 195 | |
| 199 | 196 | |
| r32375 | r32376 | |
| 943 | 940 | m_soundlatch_full = 1; |
| 944 | 941 | m_soundlatch_irq = 1; |
| 945 | 942 | m_latch = data; |
| 946 | | jantouki_sound_update_irq(machine()); |
| 943 | jantouki_sound_update_irq(); |
| 947 | 944 | } |
| 948 | 945 | |
| 949 | 946 | READ8_MEMBER(dynax_state::jantouki_blitter_busy_r) |
| r32375 | r32376 | |
| 998 | 995 | { |
| 999 | 996 | m_soundlatch_ack = data; |
| 1000 | 997 | m_soundlatch_irq = 0; |
| 1001 | | jantouki_sound_update_irq(machine()); |
| 998 | jantouki_sound_update_irq(); |
| 1002 | 999 | } |
| 1003 | 1000 | |
| 1004 | 1001 | READ8_MEMBER(dynax_state::jantouki_soundlatch_r) |
| r32375 | r32376 | |
| 1297 | 1294 | logerror("%04x: unmapped offset %04X=%02X written with rombank=%02X\n", space.device().safe_pc(), offset, data, m_rombank); |
| 1298 | 1295 | } |
| 1299 | 1296 | |
| 1300 | | static void tenkai_show_6c( running_machine &machine ) |
| 1297 | void dynax_state::tenkai_show_6c() |
| 1301 | 1298 | { |
| 1302 | | // dynax_state *state = machine.driver_data<dynax_state>(); |
| 1303 | | // popmessage("%02x %02x", state->m_tenkai_6c, state->m_tenkai_70); |
| 1299 | // popmessage("%02x %02x", m_tenkai_6c, m_tenkai_70); |
| 1304 | 1300 | } |
| 1305 | 1301 | |
| 1306 | 1302 | WRITE8_MEMBER(dynax_state::tenkai_6c_w) |
| 1307 | 1303 | { |
| 1308 | 1304 | m_tenkai_6c = data; |
| 1309 | | tenkai_show_6c(machine()); |
| 1305 | tenkai_show_6c(); |
| 1310 | 1306 | } |
| 1311 | 1307 | |
| 1312 | 1308 | WRITE8_MEMBER(dynax_state::tenkai_70_w) |
| 1313 | 1309 | { |
| 1314 | 1310 | m_tenkai_70 = data; |
| 1315 | | tenkai_show_6c(machine()); |
| 1311 | tenkai_show_6c(); |
| 1316 | 1312 | } |
| 1317 | 1313 | |
| 1318 | 1314 | WRITE8_MEMBER(dynax_state::tenkai_blit_romregion_w) |
| r32375 | r32376 | |
| 1403 | 1399 | // popmessage("%02x %02x", gekisha_val[0], gekisha_val[1]); |
| 1404 | 1400 | } |
| 1405 | 1401 | |
| 1406 | | static void gekisha_set_rombank( running_machine &machine, UINT8 data ) |
| 1402 | void dynax_state::gekisha_set_rombank( UINT8 data ) |
| 1407 | 1403 | { |
| 1408 | | dynax_state *state = machine.driver_data<dynax_state>(); |
| 1409 | | state->m_rombank = data; |
| 1410 | | state->m_romptr = state->memregion("maincpu")->base() + 0x8000 + state->m_rombank * 0x8000; |
| 1404 | m_rombank = data; |
| 1405 | m_romptr = memregion("maincpu")->base() + 0x8000 + m_rombank * 0x8000; |
| 1411 | 1406 | } |
| 1412 | 1407 | |
| 1413 | 1408 | WRITE8_MEMBER(dynax_state::gekisha_p4_w) |
| 1414 | 1409 | { |
| 1415 | 1410 | m_gekisha_rom_enable = !BIT(data, 3); |
| 1416 | | gekisha_set_rombank(machine(), BIT(data, 2)); |
| 1411 | gekisha_set_rombank(BIT(data, 2)); |
| 1417 | 1412 | } |
| 1418 | 1413 | |
| 1419 | 1414 | READ8_MEMBER(dynax_state::gekisha_8000_r) |
| r32375 | r32376 | |
| 4313 | 4308 | else |
| 4314 | 4309 | m_sound_irq = 1; |
| 4315 | 4310 | |
| 4316 | | sprtmtch_update_irq(machine()); |
| 4311 | sprtmtch_update_irq(); |
| 4317 | 4312 | } |
| 4318 | 4313 | |
| 4319 | 4314 | static MACHINE_CONFIG_DERIVED( yarunara, hnoridur ) |
| r32375 | r32376 | |
| 4455 | 4450 | /* It runs in IM 2, thus needs a vector on the data bus: |
| 4456 | 4451 | 0xfa and 0xfc are very similar, they should be triggered by the blitter |
| 4457 | 4452 | 0xf8 is vblank */ |
| 4458 | | void mjelctrn_update_irq( running_machine &machine ) |
| 4453 | void dynax_state::mjelctrn_update_irq() |
| 4459 | 4454 | { |
| 4460 | | dynax_state *state = machine.driver_data<dynax_state>(); |
| 4461 | | state->m_blitter_irq = 1; |
| 4462 | | state->m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xfa); |
| 4455 | m_blitter_irq = 1; |
| 4456 | m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xfa); |
| 4463 | 4457 | } |
| 4464 | 4458 | |
| 4465 | 4459 | INTERRUPT_GEN_MEMBER(dynax_state::mjelctrn_vblank_interrupt) |
| r32375 | r32376 | |
| 4488 | 4482 | 0x42 and 0x44 are very similar, they should be triggered by the blitter |
| 4489 | 4483 | 0x40 is vblank |
| 4490 | 4484 | 0x46 is a periodic irq? */ |
| 4491 | | void neruton_update_irq( running_machine &machine ) |
| 4485 | void dynax_state::neruton_update_irq() |
| 4492 | 4486 | { |
| 4493 | | dynax_state *state = machine.driver_data<dynax_state>(); |
| 4494 | | state->m_blitter_irq = 1; |
| 4495 | | state->m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0x42); |
| 4487 | m_blitter_irq = 1; |
| 4488 | m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0x42); |
| 4496 | 4489 | } |
| 4497 | 4490 | |
| 4498 | 4491 | TIMER_DEVICE_CALLBACK_MEMBER(dynax_state::neruton_irq_scanline) |
| r32375 | r32376 | |
| 4627 | 4620 | |
| 4628 | 4621 | void dynax_state::gekisha_bank_postload() |
| 4629 | 4622 | { |
| 4630 | | gekisha_set_rombank(machine(), m_rombank); |
| 4623 | gekisha_set_rombank(m_rombank); |
| 4631 | 4624 | } |
| 4632 | 4625 | |
| 4633 | 4626 | MACHINE_START_MEMBER(dynax_state,gekisha) |
| r32375 | r32376 | |
| 4641 | 4634 | { |
| 4642 | 4635 | MACHINE_RESET_CALL_MEMBER(dynax); |
| 4643 | 4636 | |
| 4644 | | gekisha_set_rombank(machine(), 0); |
| 4637 | gekisha_set_rombank(0); |
| 4645 | 4638 | } |
| 4646 | 4639 | |
| 4647 | 4640 | static MACHINE_CONFIG_START( gekisha, dynax_state ) |