summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/xavix.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/includes/xavix.h')
-rw-r--r--src/mame/includes/xavix.h315
1 files changed, 261 insertions, 54 deletions
diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h
index 2d8a20b796b..cdc0c1d79d4 100644
--- a/src/mame/includes/xavix.h
+++ b/src/mame/includes/xavix.h
@@ -13,6 +13,8 @@
#include "machine/i2cmem.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
+#include "bus/ekara/slot.h"
+#include "machine/nvram.h"
#include "machine/xavix_mtrk_wheel.h"
#include "machine/xavix_madfb_ball.h"
@@ -68,8 +70,11 @@ public:
: driver_device(mconfig, type, tag),
m_in0(*this, "IN0"),
m_in1(*this, "IN1"),
+ m_an_in(*this, "AN%u", 0U),
m_maincpu(*this, "maincpu"),
+ m_nvram(*this, "nvram"),
m_screen(*this, "screen"),
+ m_lowbus(*this, "lowbus"),
m_sprite_xhigh_ignore_hack(true),
m_mainram(*this, "mainram"),
m_fragment_sprite(*this, "fragment_sprite"),
@@ -90,7 +95,6 @@ public:
m_palette(*this, "palette"),
m_region(*this, "REGION"),
m_gfxdecode(*this, "gfxdecode"),
- m_lowbus(*this, "lowbus"),
m_sound(*this, "xavix_sound")
{ }
@@ -105,43 +109,9 @@ public:
DECLARE_WRITE_LINE_MEMBER(ioevent_trg04);
DECLARE_WRITE_LINE_MEMBER(ioevent_trg08);
-protected:
-
- virtual uint8_t read_io0(uint8_t direction);
- virtual uint8_t read_io1(uint8_t direction);
- virtual void write_io0(uint8_t data, uint8_t direction);
- virtual void write_io1(uint8_t data, uint8_t direction);
- required_ioport m_in0;
- required_ioport m_in1;
- required_device<xavix_device> m_maincpu;
- required_device<screen_device> m_screen;
-
-private:
-
- // screen updates
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- void xavix_map(address_map &map);
-
- void xavix_lowbus_map(address_map &map);
- void xavix_extbus_map(address_map &map);
- void superxavix_lowbus_map(address_map &map);
-
- INTERRUPT_GEN_MEMBER(interrupt);
- TIMER_DEVICE_CALLBACK_MEMBER(scanline_cb);
-
- // driver_device overrides
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- virtual void video_start() override;
-
- DECLARE_READ8_MEMBER(opcodes_000000_r);
- DECLARE_READ8_MEMBER(opcodes_800000_r);
-
- DECLARE_READ8_MEMBER(extbus_r) { return m_rgn[(offset) & (m_rgnlen - 1)]; }
- DECLARE_WRITE8_MEMBER(extbus_w) { logerror("write to external bus %06x %02x\n", offset, data); }
+ int m_rgnlen;
+ uint8_t* m_rgn;
/* this is just a quick memory system bypass for video reads etc. because going through the
memory system is slow and also pollutes logs significantly with unmapped reads if the games
@@ -189,12 +159,73 @@ private:
return 0x00;
}
+protected:
+
+ virtual uint8_t read_io0(uint8_t direction);
+ virtual uint8_t read_io1(uint8_t direction);
+ virtual void write_io0(uint8_t data, uint8_t direction);
+ virtual void write_io1(uint8_t data, uint8_t direction);
+ required_ioport m_in0;
+ required_ioport m_in1;
+ required_ioport_array<8> m_an_in;
+ required_device<xavix_device> m_maincpu;
+ optional_device<nvram_device> m_nvram;
+ required_device<screen_device> m_screen;
+ required_device<address_map_bank_device> m_lowbus;
+ address_space* m_cpuspace;
+ uint8_t m_extbusctrl[3];
+
+private:
+
+ // screen updates
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void xavix_map(address_map &map);
+
+ void xavix_lowbus_map(address_map &map);
+ void xavix_extbus_map(address_map &map);
+ void superxavix_lowbus_map(address_map &map);
+
+ INTERRUPT_GEN_MEMBER(interrupt);
+ TIMER_DEVICE_CALLBACK_MEMBER(scanline_cb);
+
+ // driver_device overrides
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ virtual void video_start() override;
+
+ virtual DECLARE_READ8_MEMBER(opcodes_000000_r)
+ {
+ if (offset & 0x8000)
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ else
+ {
+ return m_lowbus->read8(space, offset & 0x7fff);
+ }
+ }
+
+ virtual DECLARE_READ8_MEMBER(opcodes_800000_r)
+ {
+ // rad_fb, rad_madf confirm that for >0x800000 the CPU only sees ROM when executing opcodes
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+
+ virtual DECLARE_READ8_MEMBER(extbus_r) { return m_rgn[(offset) & (m_rgnlen - 1)]; }
+ virtual DECLARE_WRITE8_MEMBER(extbus_w)
+ {
+ logerror("%s: write to external bus %06x %02x\n", machine().describe_context(), offset, data);
+ }
+
+
DECLARE_READ8_MEMBER(sample_read)
{
return read_full_data_sp_bypass(offset);
};
- inline uint8_t read_full_data_sp_bypass(uint32_t adr)
+ virtual inline uint8_t read_full_data_sp_bypass(uint32_t adr)
{
uint8_t databank = adr >> 16;
@@ -215,9 +246,8 @@ private:
}
}
- DECLARE_WRITE8_MEMBER(extintrf_7900_w);
- DECLARE_WRITE8_MEMBER(extintrf_7901_w);
- DECLARE_WRITE8_MEMBER(extintrf_7902_w);
+ DECLARE_READ8_MEMBER(extintrf_790x_r);
+ DECLARE_WRITE8_MEMBER(extintrf_790x_w);
DECLARE_READ8_MEMBER(ioevent_enable_r);
DECLARE_WRITE8_MEMBER(ioevent_enable_w);
@@ -266,6 +296,11 @@ private:
uint8_t m_io0_direction;
uint8_t m_io1_direction;
+ uint8_t m_adc_inlatch;
+
+ DECLARE_READ8_MEMBER(nmi_vector_lo_r);
+ DECLARE_READ8_MEMBER(nmi_vector_hi_r);
+
DECLARE_WRITE8_MEMBER(vector_enable_w);
DECLARE_WRITE8_MEMBER(nmi_vector_lo_w);
DECLARE_WRITE8_MEMBER(nmi_vector_hi_w);
@@ -434,8 +469,8 @@ private:
uint8_t m_mastervol;
uint8_t m_unk_snd75f8;
- uint8_t m_unksnd75f9;
- uint8_t m_unksnd75ff;
+ uint8_t m_unk_snd75f9;
+ uint8_t m_unk_snd75ff;
uint8_t m_sndtimer[4];
uint8_t m_timer_baseval;
@@ -489,9 +524,6 @@ private:
uint8_t m_spritereg;
- int m_rgnlen;
- uint8_t* m_rgn;
-
// variables used by rendering
int m_tmp_dataaddress;
int m_tmp_databit;
@@ -502,7 +534,6 @@ private:
uint8_t get_next_byte();
int get_current_address_byte();
- required_device<address_map_bank_device> m_lowbus;
required_device<xavix_sound_device> m_sound;
DECLARE_READ8_MEMBER(sound_regram_read_cb);
@@ -518,6 +549,7 @@ public:
hackaddress2(-1)
{ }
+ void xavix_i2c_24lc02(machine_config &config);
void xavix_i2c_24lc04(machine_config &config);
void xavix_i2c_24c08(machine_config &config);
@@ -587,24 +619,198 @@ protected:
};
-class xavix_ekara_state : public xavix_state
+class xavix_cart_state : public xavix_state
{
public:
- xavix_ekara_state(const machine_config &mconfig, device_type type, const char *tag)
+ xavix_cart_state(const machine_config &mconfig, device_type type, const char *tag)
: xavix_state(mconfig, type, tag),
- m_cart(*this, "cartslot"),
+ m_cartslot(*this, "cartslot")
+ { }
+
+ void xavix_cart(machine_config &config);
+ void xavix_cart_ekara(machine_config &config);
+ void xavix_cart_popira(machine_config &config);
+ void xavix_cart_ddrfammt(machine_config &config);
+
+protected:
+
+ // for Cart cases this memory bypass becomes more complex
+
+ virtual DECLARE_READ8_MEMBER(opcodes_000000_r) override
+ {
+ if (offset & 0x8000)
+ {
+ if (offset & 0x400000)
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ else
+ {
+ if (m_cartslot->has_cart())
+ {
+ return m_cartslot->read_cart(*m_cpuspace, offset);
+ }
+ else
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ }
+ }
+ else
+ {
+ return m_lowbus->read8(space, offset & 0x7fff);
+ }
+ }
+
+ virtual DECLARE_READ8_MEMBER(opcodes_800000_r) override
+ {
+ if (offset & 0x400000)
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ else
+ {
+ if (m_cartslot->has_cart())
+ {
+ return m_cartslot->read_cart(*m_cpuspace, offset);
+ }
+ else
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ }
+ }
+
+ virtual DECLARE_READ8_MEMBER(extbus_r) override
+ {
+ if (m_extbusctrl[1] & 0x08)
+ {
+ logerror("%s: read from external bus %06x (SEEPROM READ?)\n", machine().describe_context(), offset);
+ return m_cartslot->read_extra(*m_cpuspace, offset);
+ }
+ else
+ {
+ if (offset & 0x400000)
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ else
+ {
+ if (m_cartslot->has_cart())
+ {
+ return m_cartslot->read_cart(*m_cpuspace, offset);
+ }
+ else
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ }
+ }
+ }
+ virtual DECLARE_WRITE8_MEMBER(extbus_w) override
+ {
+ if (m_extbusctrl[0] & 0x08)
+ {
+ logerror("%s: write to external bus %06x %02x (SEEPROM WRITE?)\n", machine().describe_context(), offset, data);
+ return m_cartslot->write_extra(*m_cpuspace, offset, data);
+ }
+ else
+ {
+ if (m_cartslot->has_cart())
+ {
+ return m_cartslot->write_cart(*m_cpuspace, offset, data);
+ }
+ else
+ {
+ logerror("%s: write to external bus %06x %02x\n", machine().describe_context(), offset, data);
+ }
+ }
+ }
+
+ virtual inline uint8_t read_full_data_sp_bypass(uint32_t offset) override
+ {
+ uint8_t databank = offset >> 16;
+
+ if (databank >= 0x80)
+ {
+ if (offset & 0x400000)
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ else
+ {
+ if (m_cartslot->has_cart())
+ {
+ return m_cartslot->read_cart(*m_cpuspace, offset);
+ }
+ else
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ }
+ }
+ else
+ {
+ if ((offset & 0xffff) >= 0x8000)
+ {
+ if (offset & 0x400000)
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ else
+ {
+ if (m_cartslot->has_cart())
+ {
+ return m_cartslot->read_cart(*m_cpuspace, offset);
+ }
+ else
+ {
+ return m_rgn[(offset) & (m_rgnlen - 1)];
+ }
+ }
+ }
+ else
+ {
+ return read_full_data_sp_lowbus_bypass(offset);
+ }
+ }
+ }
+
+ required_device<ekara_cart_slot_device> m_cartslot;
+};
+
+class xavix_i2c_cart_state : public xavix_cart_state
+{
+public:
+ xavix_i2c_cart_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_cart_state(mconfig,type,tag),
+ m_i2cmem(*this, "i2cmem")
+ { }
+
+ void xavix_i2c_taiko(machine_config &config);
+
+protected:
+ virtual uint8_t read_io1(uint8_t direction) override;
+ virtual void write_io1(uint8_t data, uint8_t direction) override;
+
+ required_device<i2cmem_device> m_i2cmem;
+};
+
+
+class xavix_ekara_state : public xavix_cart_state
+{
+public:
+ xavix_ekara_state(const machine_config &mconfig, device_type type, const char *tag)
+ : xavix_cart_state(mconfig, type, tag),
m_extra0(*this, "EXTRA0"),
m_extra1(*this, "EXTRA1"),
m_extraioselect(0),
m_extraiowrite(0)
{ }
- void xavix_ekara(machine_config &config);
+// void xavix_ekara(machine_config &config);
protected:
- required_device<generic_slot_device> m_cart;
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(ekara_cart);
- //READ8_MEMBER(cart_r) { return m_cart->read_rom(space, offset); }
required_ioport m_extra0;
required_ioport m_extra1;
@@ -617,4 +823,5 @@ protected:
uint8_t m_extraiowrite;
};
+
#endif // MAME_INCLUDES_XAVIX_H