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.cpp637
1 files changed, 637 insertions, 0 deletions
diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp
new file mode 100644
index 00000000000..ff02466b516
--- /dev/null
+++ b/src/mame/machine/xavix.cpp
@@ -0,0 +1,637 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "emu.h"
+#include "includes/xavix.h"
+
+// general DMA fro ROM, not Video DMA
+WRITE8_MEMBER(xavix_state::dma_trigger_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);
+
+ 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;
+ uint16_t len = (m_rom_dmalen_hi_data << 8) | m_rom_dmalen_lo_data;
+
+ source &= m_rgnlen - 1;
+ logerror(" (possible DMA op SRC %08x DST %04x LEN %04x)\n", source, dest, len);
+
+ address_space& destspace = m_maincpu->space(AS_PROGRAM);
+
+ for (int i = 0; i < len; i++)
+ {
+ uint8_t dat = m_rgn[(source + i) & (m_rgnlen - 1)];
+ destspace.write_byte(dest + i, dat);
+ }
+ }
+ else // the interrupt routine writes 0x80 to the trigger, maybe 'clear IRQ?'
+ {
+ logerror("%s: dma_trigger_w (unknown) %02x\n", machine().describe_context(), data);
+ }
+}
+
+WRITE8_MEMBER(xavix_state::rom_dmasrc_lo_w)
+{
+ logerror("%s: rom_dmasrc_lo_w %02x\n", machine().describe_context(), data);
+ m_rom_dmasrc_lo_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::rom_dmasrc_md_w)
+{
+ logerror("%s: rom_dmasrc_md_w %02x\n", machine().describe_context(), data);
+ m_rom_dmasrc_md_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::rom_dmasrc_hi_w)
+{
+ logerror("%s: rom_dmasrc_hi_w %02x\n", machine().describe_context(), data);
+ m_rom_dmasrc_hi_data = data;
+ // this would mean Taito Nostalgia relies on mirroring tho, as it has the high bits set... so could just be wrong
+ logerror(" (DMA ROM source of %02x%02x%02x)\n", m_rom_dmasrc_hi_data, m_rom_dmasrc_md_data, m_rom_dmasrc_lo_data);
+}
+
+WRITE8_MEMBER(xavix_state::rom_dmadst_lo_w)
+{
+ logerror("%s: rom_dmadst_lo_w %02x\n", machine().describe_context(), data);
+ m_rom_dmadst_lo_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::rom_dmadst_hi_w)
+{
+ logerror("%s: rom_dmadst_hi_w %02x\n", machine().describe_context(), data);
+ m_rom_dmadst_hi_data = data;
+
+ logerror(" (DMA dest of %02x%02x)\n", m_rom_dmadst_hi_data, m_rom_dmadst_lo_data);
+}
+
+WRITE8_MEMBER(xavix_state::rom_dmalen_lo_w)
+{
+ logerror("%s: rom_dmalen_lo_w %02x\n", machine().describe_context(), data);
+ m_rom_dmalen_lo_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::rom_dmalen_hi_w)
+{
+ logerror("%s: rom_dmalen_hi_w %02x\n", machine().describe_context(), data);
+ m_rom_dmalen_hi_data = data;
+
+ logerror(" (DMA len of %02x%02x)\n", m_rom_dmalen_hi_data, m_rom_dmalen_lo_data);
+}
+
+READ8_MEMBER(xavix_state::dma_trigger_r)
+{
+ logerror("%s: dma_trigger_r (operation status?)\n", machine().describe_context());
+ return 0x00;
+}
+
+
+
+WRITE8_MEMBER(xavix_state::irq_enable_w)
+{
+ logerror("%s: irq_enable_w %02x\n", machine().describe_context(), data);
+ m_irq_enable_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::irq_vector0_lo_w)
+{
+ logerror("%s: irq_vector0_lo_w %02x\n", machine().describe_context(), data);
+ m_irq_vector0_lo_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::irq_vector0_hi_w)
+{
+ logerror("%s: irq_vector0_hi_w %02x\n", machine().describe_context(), data);
+ m_irq_vector0_hi_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::irq_vector1_lo_w)
+{
+ logerror("%s: irq_vector1_lo_w %02x\n", machine().describe_context(), data);
+ m_irq_vector1_lo_data = data;
+}
+
+WRITE8_MEMBER(xavix_state::irq_vector1_hi_w)
+{
+ logerror("%s: irq_vector1_hi_w %02x\n", machine().describe_context(), data);
+ m_irq_vector1_hi_data = data;
+}
+
+
+WRITE8_MEMBER(xavix_state::xavix_7900_w)
+{
+ logerror("%s: xavix_7900_w %02x (---FIRST WRITE ON STARTUP---)\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7901_w)
+{
+ logerror("%s: xavix_7901_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7902_w)
+{
+ logerror("%s: xavix_7902_w %02x\n", machine().describe_context(), data);
+}
+
+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)
+{
+ logerror("%s: xavix_7b00_w %02x\n", machine().describe_context(), data);
+}
+
+READ8_MEMBER(xavix_state::xavix_7b80_r)
+{
+ logerror("%s: xavix_7b80_r\n", machine().describe_context());
+ return 0xff;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7b80_w)
+{
+ logerror("%s: xavix_7b80_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7b81_w)
+{
+ logerror("%s: xavix_7b81_w %02x\n", machine().describe_context(), data);
+}
+
+
+WRITE8_MEMBER(xavix_state::xavix_7810_w)
+{
+ logerror("%s: xavix_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->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+ }
+}
+
+
+
+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)
+{
+ // expected to return data written
+ m_6ff0 = data;
+ //logerror("%s: xavix_6ff0_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)
+{
+ 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());
+ return m_6ff8;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_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);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_75fe_w)
+{
+ m_75fx[14] = data;
+ logerror("%s: xavix_75fe_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_75ff_w)
+{
+ m_75fx[15] = data;
+ logerror("%s: xavix_75ff_w %02x\n", machine().describe_context(), data);
+}
+
+READ8_MEMBER(xavix_state::xavix_io_0_r)
+{
+ return m_in0->read();
+}
+
+READ8_MEMBER(xavix_state::xavix_io_1_r)
+{
+ /*
+ int pc = m_maincpu->state_int(M6502_PC);
+
+ if (pc == 0x3acc) return 0x08;
+ if (pc == 0x3ae0) return 0x08;
+ if (pc == 0xfcb0) return 0xff;
+
+ logerror("%04x: in1 read\n", pc);
+ */
+ return m_in1->read();
+}
+
+READ8_MEMBER(xavix_state::xavix_7a02_r)
+{
+ return 0xff;
+}
+
+READ8_MEMBER(xavix_state::xavix_7a03_r)
+{
+ return 0xff;
+}
+
+
+WRITE8_MEMBER(xavix_state::xavix_7a00_w)
+{
+ logerror("%s: xavix_7a00_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7a01_w)
+{
+ logerror("%s: xavix_7a01_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7a02_w)
+{
+ logerror("%s: xavix_7a02_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7a03_w)
+{
+ logerror("%s: xavix_7a03_w %02x\n", machine().describe_context(), data);
+}
+
+READ8_MEMBER(xavix_state::xavix_6fe8_r)
+{
+ logerror("%s: xavix_6fe8_r\n", machine().describe_context());
+ return m_6fe8;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_6fe8_w)
+{
+ // expected to return data written
+ m_6fe8 = data;
+ logerror("%s: xavix_6fe8_w %02x\n", machine().describe_context(), data);
+}
+
+READ8_MEMBER(xavix_state::xavix_6fe9_r)
+{
+ logerror("%s: xavix_6fe9_r\n", machine().describe_context());
+ return m_6fe9;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_6fe9_w)
+{
+ // expected to return data written
+ m_6fe9 = data;
+ logerror("%s: xavix_6fe9_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_6fea_w)
+{
+ logerror("%s: xavix_6fea_w %02x\n", machine().describe_context(), data);
+}
+
+
+READ8_MEMBER(xavix_state::xavix_7c01_r)
+{
+ logerror("%s: xavix_7c01_r\n", machine().describe_context());
+ return m_7c01;
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7c00_w)
+{
+ logerror("%s: xavix_7c00_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7c01_w)
+{
+ // expected to return data written
+ m_7c01 = data;
+ logerror("%s: xavix_7c01_w %02x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(xavix_state::xavix_7c02_w)
+{
+ logerror("%s: xavix_7c02_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)
+{
+ return m_multresults[offset];
+}
+
+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);
+ m_multresults[offset] = data;
+}
+
+WRITE8_MEMBER(xavix_state::mult_param_w)
+{
+ COMBINE_DATA(&m_multparams[offset]);
+ // 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
+
+ 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]);
+
+ uint16_t result = param1*param2;
+
+ m_multresults[1] = (result>>8)&0xff;
+ m_multresults[0] = result&0xff;
+ }
+}
+
+
+READ8_MEMBER(xavix_state::irq_source_r)
+{
+ /* the 2nd IRQ routine (regular IRQ, not NMI?) 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
+ */
+ logerror("%s: irq_source_r\n", machine().describe_context());
+ return 0xff;
+}
+
+WRITE8_MEMBER(xavix_state::irq_source_w)
+{
+ logerror("%s: irq_source_w %02x\n", machine().describe_context(), data);
+ // cleared on startup in monster truck, no purpose?
+}
+
+
+void xavix_state::machine_start()
+{
+
+}
+
+void xavix_state::machine_reset()
+{
+ m_rom_dmasrc_lo_data = 0;
+ m_rom_dmasrc_md_data = 0;
+ m_rom_dmasrc_hi_data = 0;
+
+ m_rom_dmadst_lo_data = 0;
+ m_rom_dmadst_hi_data = 0;
+
+ m_rom_dmalen_lo_data = 0;
+ m_rom_dmalen_hi_data = 0;
+
+ m_irq_enable_data = 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_75fx[6] = 0;
+ m_75fx[8] = 0;
+ m_75fx[10] = 0;
+ m_75fx[11] = 0;
+ m_75fx[12] = 0;
+ m_75fx[13] = 0;
+
+ for (int i = 0; i < 3; i++)
+ m_multparams[i] = 0;
+
+ for (int i = 0; i < 2; i++)
+ m_multresults[i] = 0;
+
+ for (int i = 0; i < 2; i++)
+ {
+ m_vid_dma_param1[i] = 0;
+ m_vid_dma_param2[i] = 0;
+ }
+
+ for (int i = 0; i < 8; i++)
+ {
+ m_tmap1_regs[i] = 0;
+ m_tmap2_regs[i] = 0;
+ }
+
+ 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)
+{
+// logerror("get_vectors %d %d\n", which, half);
+
+ if (which == 0) // irq?
+ {
+ if (half == 0)
+ return m_irq_vector0_hi_data;
+ else
+ return m_irq_vector0_lo_data;
+ }
+ else
+ {
+ if (half == 0)
+ return m_irq_vector1_hi_data;
+ else
+ return m_irq_vector1_lo_data;
+ }
+}
+
+