diff options
Diffstat (limited to 'src/mame/machine/xavix.cpp')
-rw-r--r-- | src/mame/machine/xavix.cpp | 420 |
1 files changed, 137 insertions, 283 deletions
diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index e761e96ea4b..f0c3b370362 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -5,11 +5,11 @@ #include "includes/xavix.h" // general DMA fro ROM, not Video DMA -WRITE8_MEMBER(xavix_state::dma_trigger_w) +WRITE8_MEMBER(xavix_state::rom_dmatrg_w) { if (data & 0x01) // namcons2 writes 0x81, most of the time things write 0x01 { - logerror("%s: dma_trigger_w (do DMA?) %02x\n", machine().describe_context(), data); + logerror("%s: rom_dmatrg_w (do DMA?) %02x\n", machine().describe_context(), data); uint32_t source = (m_rom_dmasrc_hi_data << 16) | (m_rom_dmasrc_md_data << 8) | m_rom_dmasrc_lo_data; uint16_t dest = (m_rom_dmadst_hi_data << 8) | m_rom_dmadst_lo_data; @@ -28,7 +28,7 @@ WRITE8_MEMBER(xavix_state::dma_trigger_w) } else // the interrupt routine writes 0x80 to the trigger, maybe 'clear IRQ?' { - logerror("%s: dma_trigger_w (unknown) %02x\n", machine().describe_context(), data); + logerror("%s: rom_dmatrg_w (unknown) %02x\n", machine().describe_context(), data); } } @@ -80,18 +80,18 @@ WRITE8_MEMBER(xavix_state::rom_dmalen_hi_w) logerror(" (DMA len of %02x%02x)\n", m_rom_dmalen_hi_data, m_rom_dmalen_lo_data); } -READ8_MEMBER(xavix_state::dma_trigger_r) +READ8_MEMBER(xavix_state::rom_dmatrg_r) { - logerror("%s: dma_trigger_r (operation status?)\n", machine().describe_context()); + logerror("%s: rom_dmatrg_r (operation status?)\n", machine().describe_context()); return 0x00; } -WRITE8_MEMBER(xavix_state::irq_enable_w) +WRITE8_MEMBER(xavix_state::vector_enable_w) { - logerror("%s: irq_enable_w %02x\n", machine().describe_context(), data); - m_irq_enable_data = data; + logerror("%s: vector_enable_w %02x\n", machine().describe_context(), data); + m_vectorenable = data; } WRITE8_MEMBER(xavix_state::irq_vector0_lo_w) @@ -119,19 +119,19 @@ WRITE8_MEMBER(xavix_state::irq_vector1_hi_w) } -WRITE8_MEMBER(xavix_state::xavix_7900_w) +WRITE8_MEMBER(xavix_state::extintrf_7900_w) { - logerror("%s: xavix_7900_w %02x (---FIRST WRITE ON STARTUP---)\n", machine().describe_context(), data); + logerror("%s: extintrf_7900_w %02x (---FIRST WRITE ON STARTUP---)\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7901_w) +WRITE8_MEMBER(xavix_state::extintrf_7901_w) { - logerror("%s: xavix_7901_w %02x\n", machine().describe_context(), data); + logerror("%s: extintrf_7901_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7902_w) +WRITE8_MEMBER(xavix_state::extintrf_7902_w) { - logerror("%s: xavix_7902_w %02x\n", machine().describe_context(), data); + logerror("%s: extintrf_7902_w %02x\n", machine().describe_context(), data); } WRITE8_MEMBER(xavix_state::xavix_7a80_w) @@ -139,256 +139,83 @@ WRITE8_MEMBER(xavix_state::xavix_7a80_w) logerror("%s: xavix_7a80_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7b00_w) +WRITE8_MEMBER(xavix_state::adc_7b00_w) { - logerror("%s: xavix_7b00_w %02x\n", machine().describe_context(), data); + logerror("%s: adc_7b00_w %02x\n", machine().describe_context(), data); } -READ8_MEMBER(xavix_state::xavix_7b80_r) +READ8_MEMBER(xavix_state::adc_7b80_r) { - logerror("%s: xavix_7b80_r\n", machine().describe_context()); + logerror("%s: adc_7b80_r\n", machine().describe_context()); return 0xff; } -WRITE8_MEMBER(xavix_state::xavix_7b80_w) +WRITE8_MEMBER(xavix_state::adc_7b80_w) { - logerror("%s: xavix_7b80_w %02x\n", machine().describe_context(), data); + logerror("%s: adc_7b80_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7b81_w) +WRITE8_MEMBER(xavix_state::adc_7b81_w) { - logerror("%s: xavix_7b81_w %02x\n", machine().describe_context(), data); + logerror("%s: adc_7b81_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7810_w) +WRITE8_MEMBER(xavix_state::slotreg_7810_w) { - logerror("%s: xavix_7810_w %02x\n", machine().describe_context(), data); + logerror("%s: slotreg_7810_w %02x\n", machine().describe_context(), data); } TIMER_DEVICE_CALLBACK_MEMBER(xavix_state::scanline_cb) { -/* - int scanline = param; - if (scanline == 200) - { - if (m_irq_enable_data != 0) - m_maincpu->set_input_line(INPUT_LINE_IRQ0,HOLD_LINE); - } -*/ } INTERRUPT_GEN_MEMBER(xavix_state::interrupt) { - // if (m_irq_enable_data != 0) - // m_maincpu->set_input_line(INPUT_LINE_IRQ0,HOLD_LINE); - - // this logic is clearly VERY wrong - - if (m_irq_enable_data != 0) - { - if (m_6ff8) - m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); - } + if (m_6ff8 & 0x20) + m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } -READ8_MEMBER(xavix_state::xavix_6ff0_r) -{ - //logerror("%s: xavix_6ff0_r\n", machine().describe_context()); - return m_6ff0; -} -WRITE8_MEMBER(xavix_state::xavix_6ff0_w) +WRITE8_MEMBER(xavix_state::colmix_6ff2_w) { - // expected to return data written - m_6ff0 = data; - //logerror("%s: xavix_6ff0_w %02x\n", machine().describe_context(), data); + logerror("%s: colmix_6ff2_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_6ff1_w) -{ - logerror("%s: xavix_6ff1_w %02x\n", machine().describe_context(), data); -} -WRITE8_MEMBER(xavix_state::xavix_6ff2_w) +READ8_MEMBER(xavix_state::dispctrl_6ff8_r) { - logerror("%s: xavix_6ff2_w %02x\n", machine().describe_context(), data); -} - - -READ8_MEMBER(xavix_state::xavix_6ff8_r) -{ - //logerror("%s: xavix_6ff8_r\n", machine().describe_context()); + //logerror("%s: dispctrl_6ff8_r\n", machine().describe_context()); return m_6ff8; } -WRITE8_MEMBER(xavix_state::xavix_6ff8_w) +WRITE8_MEMBER(xavix_state::dispctrl_6ff8_w) { // I think this is something to do with IRQ ack / enable m_6ff8 = data; - logerror("%s: xavix_6ff8_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_6ffa_w) -{ - logerror("%s: xavix_6ffa_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_6ffb_w) -{ - logerror("%s: xavix_6ffb_w %02x\n", machine().describe_context(), data); -} - -READ8_MEMBER(xavix_state::xavix_75f0_r) -{ - logerror("%s: xavix_75f0_r\n", machine().describe_context()); - return m_75fx[0]; -} - -READ8_MEMBER(xavix_state::xavix_75f1_r) -{ - logerror("%s: xavix_75f1_r\n", machine().describe_context()); - return m_75fx[1]; -} - -READ8_MEMBER(xavix_state::xavix_75f6_r) -{ - logerror("%s: xavix_75f6_r\n", machine().describe_context()); - return m_75fx[6]; -} - -READ8_MEMBER(xavix_state::xavix_75f8_r) -{ - logerror("%s: xavix_75f8_r\n", machine().describe_context()); - return m_75fx[8]; -} - -READ8_MEMBER(xavix_state::xavix_75f9_r) -{ - logerror("%s: xavix_75f9_r\n", machine().describe_context()); - return 0x00; -} - -READ8_MEMBER(xavix_state::xavix_75fa_r) -{ - logerror("%s: xavix_75fa_r\n", machine().describe_context()); - return m_75fx[10]; -} - -READ8_MEMBER(xavix_state::xavix_75fb_r) -{ - logerror("%s: xavix_75fb_r\n", machine().describe_context()); - return m_75fx[11]; -} - -READ8_MEMBER(xavix_state::xavix_75fc_r) -{ - logerror("%s: xavix_75fc_r\n", machine().describe_context()); - return m_75fx[12]; -} - -READ8_MEMBER(xavix_state::xavix_75fd_r) -{ - logerror("%s: xavix_75fd_r\n", machine().describe_context()); - return m_75fx[13]; -} - - - - -WRITE8_MEMBER(xavix_state::xavix_75f0_w) -{ - // expected to return data written - m_75fx[0] = data; - logerror("%s: xavix_75f0_w %02x\n", machine().describe_context(), data); -} - - -WRITE8_MEMBER(xavix_state::xavix_75f1_w) -{ - // expected to return data written - m_75fx[1] = data; - logerror("%s: xavix_75f1_w %02x\n", machine().describe_context(), data); -} - - -WRITE8_MEMBER(xavix_state::xavix_75f6_w) -{ - // expected to return data written - m_75fx[6] = data; - logerror("%s: xavix_75f6_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_75f7_w) -{ - m_75fx[7] = data; - logerror("%s: xavix_75f7_w %02x\n", machine().describe_context(), data); -} - - -WRITE8_MEMBER(xavix_state::xavix_75f8_w) -{ - // expected to return data written - m_75fx[8] = data; - logerror("%s: xavix_75f8_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_75f9_w) -{ - m_75fx[9] = data; - logerror("%s: xavix_75f9_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_75fa_w) -{ - // expected to return data written - m_75fx[10] = data; - logerror("%s: xavix_75fa_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_75fb_w) -{ - // expected to return data written - m_75fx[11] = data; - logerror("%s: xavix_75fb_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_75fc_w) -{ - // expected to return data written - m_75fx[12] = data; - logerror("%s: xavix_75fc_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::xavix_75fd_w) -{ - // expected to return data written - m_75fx[13] = data; - logerror("%s: xavix_75fd_w %02x\n", machine().describe_context(), data); + logerror("%s: dispctrl_6ff8_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_75fe_w) +WRITE8_MEMBER(xavix_state::dispctrl_6ffa_w) { - m_75fx[14] = data; - logerror("%s: xavix_75fe_w %02x\n", machine().describe_context(), data); + logerror("%s: dispctrl_6ffa_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_75ff_w) +WRITE8_MEMBER(xavix_state::dispctrl_6ffb_w) { - m_75fx[15] = data; - logerror("%s: xavix_75ff_w %02x\n", machine().describe_context(), data); + logerror("%s: dispctrl_6ffb_w %02x\n", machine().describe_context(), data); } -READ8_MEMBER(xavix_state::xavix_io_0_r) +READ8_MEMBER(xavix_state::io_0_r) { return m_in0->read(); } -READ8_MEMBER(xavix_state::xavix_io_1_r) +READ8_MEMBER(xavix_state::io_1_r) { /* int pc = m_maincpu->state_int(M6502_PC); @@ -402,103 +229,91 @@ READ8_MEMBER(xavix_state::xavix_io_1_r) return m_in1->read(); } -READ8_MEMBER(xavix_state::xavix_7a02_r) +READ8_MEMBER(xavix_state::io_2_r) { return 0xff; } -READ8_MEMBER(xavix_state::xavix_7a03_r) +READ8_MEMBER(xavix_state::io_3_r) { return 0xff; } -WRITE8_MEMBER(xavix_state::xavix_7a00_w) +WRITE8_MEMBER(xavix_state::io_0_w) { - logerror("%s: xavix_7a00_w %02x\n", machine().describe_context(), data); + logerror("%s: io_0_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7a01_w) +WRITE8_MEMBER(xavix_state::io_1_w) { - logerror("%s: xavix_7a01_w %02x\n", machine().describe_context(), data); + logerror("%s: io_1_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7a02_w) +WRITE8_MEMBER(xavix_state::io_2_w) { - logerror("%s: xavix_7a02_w %02x\n", machine().describe_context(), data); + logerror("%s: io_2_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7a03_w) +WRITE8_MEMBER(xavix_state::io_3_w) { - logerror("%s: xavix_7a03_w %02x\n", machine().describe_context(), data); + logerror("%s: io_3_w %02x\n", machine().describe_context(), data); } -READ8_MEMBER(xavix_state::xavix_6fe8_r) +READ8_MEMBER(xavix_state::arena_start_r) { - logerror("%s: xavix_6fe8_r\n", machine().describe_context()); - return m_6fe8; + //logerror("%s: arena_start_r\n", machine().describe_context()); + return m_arena_start; } -WRITE8_MEMBER(xavix_state::xavix_6fe8_w) +WRITE8_MEMBER(xavix_state::arena_start_w) { - // expected to return data written - m_6fe8 = data; - logerror("%s: xavix_6fe8_w %02x\n", machine().describe_context(), data); -} + //logerror("%s: arena_start_w %02x\n", machine().describe_context(), data); + m_arena_start = data; // expected to return data written -READ8_MEMBER(xavix_state::xavix_6fe9_r) +} +READ8_MEMBER(xavix_state::arena_end_r) { - logerror("%s: xavix_6fe9_r\n", machine().describe_context()); - return m_6fe9; + logerror("%s: arena_end_r\n", machine().describe_context()); + return m_arena_end; } -WRITE8_MEMBER(xavix_state::xavix_6fe9_w) +WRITE8_MEMBER(xavix_state::arena_end_w) { - // expected to return data written - m_6fe9 = data; - logerror("%s: xavix_6fe9_w %02x\n", machine().describe_context(), data); + //logerror("%s: arena_end_w %02x\n", machine().describe_context(), data); + m_arena_end = data; // expected to return data written } -WRITE8_MEMBER(xavix_state::xavix_6fea_w) +WRITE8_MEMBER(xavix_state::arena_control_w) { - logerror("%s: xavix_6fea_w %02x\n", machine().describe_context(), data); + //logerror("%s: arena_control_w %02x\n", machine().describe_context(), data); } -READ8_MEMBER(xavix_state::xavix_7c01_r) +READ8_MEMBER(xavix_state::timer_baseval_r) { - logerror("%s: xavix_7c01_r\n", machine().describe_context()); - return m_7c01; + logerror("%s: timer_baseval_r\n", machine().describe_context()); + return m_timer_baseval; } -WRITE8_MEMBER(xavix_state::xavix_7c00_w) +WRITE8_MEMBER(xavix_state::timer_control_w) { - logerror("%s: xavix_7c00_w %02x\n", machine().describe_context(), data); + logerror("%s: timer_control_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7c01_w) +WRITE8_MEMBER(xavix_state::timer_baseval_w) { // expected to return data written - m_7c01 = data; - logerror("%s: xavix_7c01_w %02x\n", machine().describe_context(), data); + m_timer_baseval = data; + logerror("%s: timer_baseval_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::xavix_7c02_w) +WRITE8_MEMBER(xavix_state::timer_freq_w) { - logerror("%s: xavix_7c02_w %02x\n", machine().describe_context(), data); + // 4-bit prescale + logerror("%s: timer_freq_w %02x\n", machine().describe_context(), data); } -READ8_MEMBER(xavix_state::xavix_75f4_r) -{ - // used with 75f0 - return 0xff; -} - -READ8_MEMBER(xavix_state::xavix_75f5_r) -{ - // used with 75f1 - return 0xff; -} READ8_MEMBER(xavix_state::mult_r) { @@ -507,8 +322,7 @@ READ8_MEMBER(xavix_state::mult_r) WRITE8_MEMBER(xavix_state::mult_w) { - // rad_fb writes here, why would you write to the results registers? - logerror("%s: mult_w (write to multiply RESULT registers, why?) reg: %d %02x\n", machine().describe_context(), offset, data); + // rad_madf writes here to set the base value which the multiplication result gets added to m_multresults[offset] = data; } @@ -518,13 +332,43 @@ WRITE8_MEMBER(xavix_state::mult_param_w) // there are NOPs after one of the writes, so presumably the operation is write triggerd and not intstant // see test code at 0184a4 in monster truck + // offset0 is control + + // mm-- --Ss + // mm = mode, S = sign for param1, s = sign for param2 + // modes 00 = multiply (regular?) 11 = add to previous 01 / 10 unknown (maybe subtract?) + if (offset == 2) { // assume 0 is upper bits, might be 'mode' instead, check - uint16_t param1 = (m_multparams[0]<<8) | (m_multparams[1]); - uint8_t param2 = (m_multparams[2]); + int param1 = m_multparams[1]; + int param2 = m_multparams[2]; + +#if 0 + int signparam1 = (m_multparams[0] & 0x02)>>1; + int signparam2 = (m_multparams[0] & 0x01)>>0; - uint16_t result = param1*param2; + if (signparam1) param1 = -param1; + if (signparam2) param2 = -param2; +#endif + + uint16_t result = 0; + + // rad_madf uses this mode (add to previous result) + if ((m_multparams[0] & 0xc0) == 0xc0) + { + result = param1 * param2; + uint16_t oldresult = (m_multresults[1] << 8) | m_multresults[0]; + result = oldresult + result; + } + else if ((m_multparams[0] & 0xc0) == 0x00) + { + result = param1 * param2; + } + else + { + popmessage("unknown multiplier mode %02n", m_multparams[0] & 0xc0); + } m_multresults[1] = (result>>8)&0xff; m_multresults[0] = result&0xff; @@ -534,16 +378,18 @@ WRITE8_MEMBER(xavix_state::mult_param_w) READ8_MEMBER(xavix_state::irq_source_r) { - /* the 2nd IRQ routine (regular IRQ, not NMI?) reads here before deciding what to do + /* the 2nd IRQ routine (regular IRQ) reads here before deciding what to do the following bits have been seen to be checked (active low?) - 0x40 - Monster Truck - stuff with 6ffb 6fd6 and 6ff8 - 0x20 - most games (but not Monster Truck) - DMA related? - 0x10 - card night + monster truck - 7c00 related? (increases 16-bit counter in ram stores 0xc1 at 7c00) - 0x08 - several games - Input related (ADC? - used for analog control on Monster Truck) (uses 7a80 top bit to determine direction, and 7a81 0x08 as an output, presumably to clock) - 0x04 - Monster Truck - loads/stores 7b81 + 0x80 - Sound Irq + 0x40 - Picture / Arena Irq? + 0x20 - DMA Irq + 0x10 - Timer / Counter IRQ + 0x08 - IO Irq (ADC? - used for analog control on Monster Truck) (uses 7a80 top bit to determine direction, and 7a81 0x08 as an output, presumably to clock) + 0x04 - ADC IRQ - loads/stores 7b81 */ + logerror("%s: irq_source_r\n", machine().describe_context()); return 0xff; } @@ -572,24 +418,25 @@ void xavix_state::machine_reset() m_rom_dmalen_lo_data = 0; m_rom_dmalen_hi_data = 0; - m_irq_enable_data = 0; + m_vectorenable = 0; m_irq_vector0_lo_data = 0; m_irq_vector0_hi_data = 0; m_irq_vector1_lo_data = 0; m_irq_vector1_hi_data = 0; - m_6ff0 = 0; m_6ff8 = 0; - m_75fx[0] = 0; - m_75fx[1] = 0; + m_spritereg = 0; - m_75fx[6] = 0; - m_75fx[8] = 0; - m_75fx[10] = 0; - m_75fx[11] = 0; - m_75fx[12] = 0; - m_75fx[13] = 0; + m_soundregs[0] = 0; + m_soundregs[1] = 0; + + m_soundregs[6] = 0; + m_soundregs[8] = 0; + m_soundregs[10] = 0; + m_soundregs[11] = 0; + m_soundregs[12] = 0; + m_soundregs[13] = 0; for (int i = 0; i < 3; i++) m_multparams[i] = 0; @@ -599,8 +446,8 @@ void xavix_state::machine_reset() for (int i = 0; i < 2; i++) { - m_vid_dma_param1[i] = 0; - m_vid_dma_param2[i] = 0; + m_spritefragment_dmaparam1[i] = 0; + m_spritefragment_dmaparam2[i] = 0; } for (int i = 0; i < 8; i++) @@ -609,14 +456,21 @@ void xavix_state::machine_reset() m_tmap2_regs[i] = 0; } + for (int i = 0; i < 3; i++) + { + m_txarray[i] = 0x00; + } + m_lowbus->set_bank(0); } typedef device_delegate<uint8_t (int which, int half)> xavix_interrupt_vector_delegate; -uint8_t xavix_state::get_vectors(int which, int half) +int16_t xavix_state::get_vectors(int which, int half) { // logerror("get_vectors %d %d\n", which, half); + if (m_vectorenable == 0) + return -1; if (which == 0) // irq? { |