summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/xavix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/xavix.cpp')
-rw-r--r--src/mame/machine/xavix.cpp420
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?
{