summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes
diff options
context:
space:
mode:
author Vas Crabb <cuavas@users.noreply.github.com>2022-06-05 23:37:21 +1000
committer GitHub <noreply@github.com>2022-06-05 23:37:21 +1000
commit62c35fe3cec10c706792c28796a5d7d96c5164ea (patch)
tree43cbde47a9c0702a2af88c09dd1ecc1800da72ab /src/mame/includes
parentc1ef4e0e24c7df1ebc79c8016d69510dff2f041b (diff)
8080bw.cpp, mw8080bw.cpp: Some cleanup/untangling: (#9884)
Updated Space Invaders C.V. and Space Invaders Part II input definitions based on schematics and manuals. Got Space Invaders specific stuff out of the Midway 8080 B/W base class. Got some of the game-specific stuff out of the _8080bw_state class. It's still a bit of a mess because sound hardware is implemented in the driver classes so some games pull in a more derived class than they really should just for sound handlers. Got rid of the duplicate joystick inputs in rollingc. Fixed cocktail mode input and DIP switches in a few games.
Diffstat (limited to 'src/mame/includes')
-rw-r--r--src/mame/includes/8080bw.h493
-rw-r--r--src/mame/includes/mw8080bw.h66
2 files changed, 417 insertions, 142 deletions
diff --git a/src/mame/includes/8080bw.h b/src/mame/includes/8080bw.h
index 62a680c18d9..806b7c1385d 100644
--- a/src/mame/includes/8080bw.h
+++ b/src/mame/includes/8080bw.h
@@ -28,41 +28,75 @@
#define CABINET_PORT_TAG "CAB"
-class _8080bw_state : public mw8080bw_state
+// TODO: turn the "Space Invaders samples" audio into a device and get rid of this class
+class invaders_clone_state : public invaders_state
+{
+public:
+ DECLARE_CUSTOM_INPUT_MEMBER(sicv_in2_control_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(invadpt2_in1_control_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(invadpt2_in2_control_r);
+
+protected:
+ invaders_clone_state(const machine_config &mconfig, device_type type, const char *tag) :
+ invaders_state(mconfig, type, tag),
+ m_sn(*this, "snsnd"),
+ m_samples(*this, "samples")
+ {
+ }
+
+ void invaders_samples_audio(machine_config &config);
+
+ optional_device<sn76477_device> m_sn;
+ optional_device<samples_device> m_samples;
+};
+
+
+class sisv_state : public invaders_clone_state // only using invaders_clone_state for the custom input handler
+{
+public:
+ sisv_state(const machine_config &mconfig, device_type type, const char *tag) :
+ invaders_clone_state(mconfig, type, tag)
+ {
+ }
+};
+
+
+class invaders_clone_palette_state : public invaders_clone_state
+{
+protected:
+ invaders_clone_palette_state(const machine_config &mconfig, device_type type, const char *tag) :
+ invaders_clone_state(mconfig, type, tag),
+ m_palette(*this, "palette")
+ {
+ }
+
+ void set_pixel( bitmap_rgb32 &bitmap, uint8_t y, uint8_t x, int color );
+ void set_8_pixels(bitmap_rgb32 &bitmap, uint8_t y, uint8_t x, uint8_t data, int fore_color, int back_color);
+ void clear_extra_columns( bitmap_rgb32 &bitmap, int color );
+
+ optional_device<palette_device> m_palette; // TODO: make this required when things are untangled more
+};
+
+
+class _8080bw_state : public invaders_clone_palette_state
{
public:
_8080bw_state(const machine_config &mconfig, device_type type, const char *tag)
- : mw8080bw_state(mconfig, type, tag)
- , m_audiocpu(*this, "audiocpu")
+ : invaders_clone_palette_state(mconfig, type, tag)
, m_schaser_effect_555_timer(*this, "schaser_sh_555")
- , m_claybust_gun_on(*this, "claybust_gun")
- , m_sn(*this, "snsnd")
- , m_samples(*this, "samples")
, m_speaker(*this, "speaker")
- , m_eeprom(*this, "eeprom")
- , m_palette(*this, "palette")
, m_colorram(*this, "colorram")
- , m_gunx(*this, "GUNX")
- , m_guny(*this, "GUNY")
- , m_timer_state(1)
{ }
void indianbtbr(machine_config &config);
- void claybust(machine_config &config);
- void shuttlei(machine_config &config);
void spcewarla(machine_config &config);
void escmars(machine_config &config);
void lrescue(machine_config &config);
void lrescuem2(machine_config &config);
- void invmulti(machine_config &config);
- void yosakdon(machine_config &config);
void polaris(machine_config &config);
void attackfc(machine_config &config);
void attackfcu(machine_config &config);
void astropal(machine_config &config);
- void rollingc(machine_config &config);
- void vortex(machine_config &config);
- void invrvnge(machine_config &config);
void sflush(machine_config &config);
void invadpt2(machine_config &config);
void lupin3a(machine_config &config);
@@ -71,9 +105,7 @@ public:
void cosmo(machine_config &config);
void spcewars(machine_config &config);
void cosmicmo(machine_config &config);
- void darthvdr(machine_config &config);
void ballbomb(machine_config &config);
- void spacecom(machine_config &config);
void crashrd(machine_config &config);
void schasercv(machine_config &config);
void lupin3(machine_config &config);
@@ -81,78 +113,57 @@ public:
void steelwkr(machine_config &config);
void schaser(machine_config &config);
- void init_invmulti();
- void init_spacecom();
- void init_vortex();
void init_attackfc();
- void init_invrvnge();
+ DECLARE_READ_LINE_MEMBER(cosmicmo_cab_r);
DECLARE_READ_LINE_MEMBER(sflush_80_r);
- uint8_t sflush_in0_r();
- DECLARE_INPUT_CHANGED_MEMBER(claybust_gun_trigger);
- DECLARE_READ_LINE_MEMBER(claybust_gun_on_r);
protected:
- virtual void video_start() override { m_color_map = m_screen_red = m_flip_screen = 0; }
- void clear_extra_columns( bitmap_rgb32 &bitmap, int color );
- inline void set_8_pixels( bitmap_rgb32 &bitmap, uint8_t y, uint8_t x, uint8_t data, int fore_color, int back_color );
+ virtual void video_start() override { m_color_map = m_screen_red = 0; }
+
+ void invadpt2_sh_port_1_w(uint8_t data);
+ void invadpt2_sh_port_2_w(uint8_t data);
+
+ DECLARE_MACHINE_START(extra_8080bw_vh);
+ DECLARE_MACHINE_START(extra_8080bw_sh);
+
+ uint32_t screen_update_invadpt2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
/* devices/memory pointers */
- optional_device<cpu_device> m_audiocpu;
optional_device<timer_device> m_schaser_effect_555_timer;
- optional_device<timer_device> m_claybust_gun_on;
- optional_device<sn76477_device> m_sn;
- optional_device<samples_device> m_samples;
optional_device<speaker_sound_device> m_speaker;
- optional_device<eeprom_serial_93cxx_device> m_eeprom;
- optional_device<palette_device> m_palette;
optional_shared_ptr<uint8_t> m_colorram;
-private:
/* misc game specific */
- optional_ioport m_gunx;
- optional_ioport m_guny;
-
uint8_t m_color_map = 0;
uint8_t m_screen_red = 0;
- uint8_t m_fleet_step = 0;
+private:
std::unique_ptr<uint8_t[]> m_scattered_colorram;
- std::unique_ptr<uint8_t[]> m_scattered_colorram2;
/* sound-related */
uint8_t m_port_1_last_extra = 0;
uint8_t m_port_2_last_extra = 0;
- uint8_t m_port_3_last_extra = 0;
attotime m_schaser_effect_555_time_remain;
int32_t m_schaser_effect_555_time_remain_savable = 0;
int m_schaser_effect_555_is_low = 0;
int m_schaser_explosion = 0;
int m_schaser_last_effect = 0;
+
uint8_t m_polaris_cloud_speed = 0;
uint8_t m_polaris_cloud_pos = 0;
uint8_t m_schaser_background_disable = 0;
uint8_t m_schaser_background_select = 0;
- uint16_t m_claybust_gun_pos = 0;
- u8 m_sound_data = 0;
- bool m_timer_state = false;
- TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer);
uint8_t indianbt_r();
uint8_t polaris_port00_r();
void steelwkr_sh_port_3_w(uint8_t data);
- void invadpt2_sh_port_1_w(uint8_t data);
- void invadpt2_sh_port_2_w(uint8_t data);
void spacerng_sh_port_2_w(uint8_t data);
void spcewars_sh_port_w(uint8_t data);
void lrescue_sh_port_1_w(uint8_t data);
void lrescue_sh_port_2_w(uint8_t data);
void cosmo_sh_port_2_w(uint8_t data);
- uint8_t darthvdr_01_r();
- void darthvdr_00_w(uint8_t data);
- void darthvdr_08_w(uint8_t data);
- IRQ_CALLBACK_MEMBER(darthvdr_interrupt_vector);
void ballbomb_01_w(uint8_t data);
void ballbomb_sh_port_1_w(uint8_t data);
void ballbomb_sh_port_2_w(uint8_t data);
@@ -160,13 +171,10 @@ private:
void indianbt_sh_port_2_w(uint8_t data);
void indianbtbr_sh_port_1_w(uint8_t data);
void indianbtbr_sh_port_2_w(uint8_t data);
- uint8_t indianbtbr_01_r();
+ uint8_t indianbt_01_r();
void schaser_sh_port_1_w(uint8_t data);
void schaser_sh_port_2_w(uint8_t data);
- void rollingc_sh_port_w(uint8_t data);
- uint8_t invrvnge_02_r();
- void invrvnge_port03_w(uint8_t data);
- void invrvnge_port05_w(uint8_t data);
+ uint8_t sflush_in0_r();
void lupin3_00_w(uint8_t data);
void lupin3_sh_port_1_w(uint8_t data);
void lupin3_sh_port_2_w(uint8_t data);
@@ -175,46 +183,22 @@ private:
void schasercv_sh_port_2_w(uint8_t data);
void crashrd_port03_w(uint8_t data);
void crashrd_port05_w(uint8_t data);
- void yosakdon_sh_port_1_w(uint8_t data);
- void yosakdon_sh_port_2_w(uint8_t data);
- uint8_t shuttlei_ff_r();
- void shuttlei_ff_w(uint8_t data);
- void shuttlei_sh_port_1_w(uint8_t data);
- void shuttlei_sh_port_2_w(uint8_t data);
- uint8_t claybust_gun_lo_r();
- uint8_t claybust_gun_hi_r();
- uint8_t invmulti_eeprom_r();
- void invmulti_eeprom_w(uint8_t data);
- void invmulti_bank_w(uint8_t data);
-
- uint8_t rollingc_scattered_colorram_r(offs_t offset);
- void rollingc_scattered_colorram_w(offs_t offset, uint8_t data);
- uint8_t rollingc_scattered_colorram2_r(offs_t offset);
- void rollingc_scattered_colorram2_w(offs_t offset, uint8_t data);
+
uint8_t schaser_scattered_colorram_r(offs_t offset);
void schaser_scattered_colorram_w(offs_t offset, uint8_t data);
DECLARE_MACHINE_START(extra_8080bw);
- DECLARE_MACHINE_START(rollingc);
DECLARE_MACHINE_START(sflush);
DECLARE_MACHINE_START(schaser);
DECLARE_MACHINE_START(schasercv);
DECLARE_MACHINE_RESET(schaser);
DECLARE_MACHINE_START(polaris);
- DECLARE_MACHINE_START(darthvdr);
- DECLARE_MACHINE_RESET(darthvdr);
- DECLARE_MACHINE_START(extra_8080bw_sh);
- DECLARE_MACHINE_START(extra_8080bw_vh);
DECLARE_MACHINE_START(schaser_sh);
DECLARE_MACHINE_RESET(schaser_sh);
- DECLARE_MACHINE_START(claybust);
- void rollingc_palette(palette_device &palette) const;
void sflush_palette(palette_device &palette) const;
- uint32_t screen_update_invadpt2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_cosmo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_rollingc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_schaser(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_schasercv(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_sflush(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -222,12 +206,8 @@ private:
uint32_t screen_update_lupin3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_polaris(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_ballbomb(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_shuttlei(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_spacecom(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_vortex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(polaris_60hz_w);
- TIMER_DEVICE_CALLBACK_MEMBER(claybust_gun_callback);
TIMER_DEVICE_CALLBACK_MEMBER(schaser_effect_555_cb);
void indianbt_sh_port_3_w(uint8_t data);
void polaris_sh_port_1_w(uint8_t data);
@@ -235,50 +215,32 @@ private:
void polaris_sh_port_3_w(uint8_t data);
void schaser_reinit_555_time_remain();
- inline void set_pixel( bitmap_rgb32 &bitmap, uint8_t y, uint8_t x, int color );
-
- void invaders_samples_audio(machine_config &config);
void astropal_io_map(address_map &map);
void attackfc_io_map(address_map &map);
void attackfcu_io_map(address_map &map);
void ballbomb_io_map(address_map &map);
- void claybust_io_map(address_map &map);
void cosmicmo_io_map(address_map &map);
void cosmo_io_map(address_map &map);
void cosmo_map(address_map &map);
void crashrd_io_map(address_map &map);
- void darthvdr_io_map(address_map &map);
- void darthvdr_map(address_map &map);
void escmars_map(address_map &map);
void indianbt_io_map(address_map &map);
void indianbtbr_io_map(address_map &map);
void invadpt2_io_map(address_map &map);
- void invmulti_map(address_map &map);
- void invrvnge_io_map(address_map &map);
- void invrvnge_sound_map(address_map &map);
void lrescue_io_map(address_map &map);
void lrescuem2_io_map(address_map &map);
void lupin3_io_map(address_map &map);
void polaris_io_map(address_map &map);
- void rollingc_io_map(address_map &map);
- void rollingc_map(address_map &map);
void schaser_io_map(address_map &map);
void schaser_map(address_map &map);
void schasercv_io_map(address_map &map);
void sflush_map(address_map &map);
- void shuttlei_io_map(address_map &map);
- void shuttlei_map(address_map &map);
- void spacecom_io_map(address_map &map);
- void spacecom_map(address_map &map);
void spacerng_io_map(address_map &map);
void spcewarla_io_map(address_map &map);
void spcewars_io_map(address_map &map);
void starw1_io_map(address_map &map);
void steelwkr_io_map(address_map &map);
- void vortex_io_map(address_map &map);
- void yosakdon_io_map(address_map &map);
- void yosakdon_map(address_map &map);
};
@@ -291,16 +253,280 @@ DISCRETE_SOUND_EXTERN( indianbt_discrete );
DISCRETE_SOUND_EXTERN( polaris_discrete );
DISCRETE_SOUND_EXTERN( schaser_discrete );
+
+/*******************************************************/
+/* Darth Vader bootleg */
+/*******************************************************/
+
+class darthvdr_state : public invaders_clone_state
+{
+public:
+ darthvdr_state(machine_config const &mconfig, device_type type, char const *tag) :
+ invaders_clone_state(mconfig, type, tag)
+ {
+ }
+
+ void darthvdr(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ void darthvdr_00_w(uint8_t data);
+ void darthvdr_08_w(uint8_t data);
+ IRQ_CALLBACK_MEMBER(darthvdr_interrupt_vector);
+
+ void main_map(address_map &map);
+ void io_map(address_map &map);
+
+ uint8_t m_port_1_last = 0;
+ uint8_t m_fleet_step = 0;
+};
+
+
+/*******************************************************/
+/* Space Combat bootleg */
+/*******************************************************/
+
+class spacecom_state : public invaders_state
+{
+public:
+ spacecom_state(machine_config const &mconfig, device_type type, char const *tag) :
+ invaders_state(mconfig, type, tag),
+ m_palette(*this, "palette")
+ {
+ }
+
+ void spacecom(machine_config &config);
+
+ void init_spacecom();
+
+private:
+ uint32_t screen_update_spacecom(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void main_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_device<palette_device> m_palette;
+};
+
+
+/*******************************************************/
+/* Zenitone-Microsec Invader's Revenge */
+/*******************************************************/
+
+class invrvnge_state : public _8080bw_state
+{
+public:
+ invrvnge_state(machine_config const &mconfig, device_type type, char const *tag) :
+ _8080bw_state(mconfig, type, tag),
+ m_audiocpu(*this, "audiocpu")
+ {
+ }
+
+ void invrvnge(machine_config &config);
+
+ void init_invrvnge();
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void port03_w(uint8_t data);
+ void port05_w(uint8_t data);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer);
+
+ void io_map(address_map &map);
+ void sound_map(address_map &map);
+
+ required_device<cpu_device> m_audiocpu;
+
+ uint8_t m_sound_data = 0;
+ uint8_t m_timer_state = 1;
+};
+
+
+/*******************************************************/
+/* Zilec Vortex */
+/*******************************************************/
+
+class vortex_state : public invaders_state
+{
+public:
+ vortex_state(machine_config const &mconfig, device_type type, char const *tag) :
+ invaders_state(mconfig, type, tag)
+ {
+ }
+
+ void vortex(machine_config &config);
+
+ void init_vortex();
+
+private:
+ uint32_t screen_update_vortex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void io_map(address_map &map);
+};
+
+
+/*******************************************************/
+/* Nichibutsu Rolling Crash / Moon Base */
+/*******************************************************/
+
+class rollingc_state : public _8080bw_state // TODO: untangle the invadpt2 sounds from _8080bw_state
+{
+public:
+ rollingc_state(machine_config const &mconfig, device_type type, char const *tag) :
+ _8080bw_state(mconfig, type, tag)
+ {
+ }
+
+ void rollingc(machine_config &config);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(game_select_r);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void rollingc_sh_port_w(uint8_t data);
+
+ uint8_t scattered_colorram_r(offs_t offset);
+ void scattered_colorram_w(offs_t offset, uint8_t data);
+ uint8_t scattered_colorram2_r(offs_t offset);
+ void scattered_colorram2_w(offs_t offset, uint8_t data);
+
+ void rollingc_palette(palette_device &palette) const;
+
+ uint32_t screen_update_rollingc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void main_map(address_map &map);
+ void io_map(address_map &map);
+
+ std::unique_ptr<uint8_t []> m_scattered_colorram;
+ std::unique_ptr<uint8_t []> m_scattered_colorram2;
+ uint8_t m_port_3_last = 0;
+};
+
+
+/*******************************************************/
+/* Wing Yosaku to Donbei */
+/*******************************************************/
+
+class yosakdon_state : public invaders_clone_state
+{
+public:
+ yosakdon_state(machine_config const &mconfig, device_type type, char const *tag) :
+ invaders_clone_state(mconfig, type, tag)
+ {
+ }
+
+ void yosakdon(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void sh_port_1_w(uint8_t data);
+ void sh_port_2_w(uint8_t data);
+
+ void main_map(address_map &map);
+ void io_map(address_map &map);
+
+ uint8_t m_port_1_last;
+ uint8_t m_port_2_last;
+};
+
+
+/*******************************************************/
+/* Omori Shuttle Invader */
+/*******************************************************/
+
+class shuttlei_state : public invaders_clone_state
+{
+public:
+ shuttlei_state(machine_config const &mconfig, device_type type, char const *tag) :
+ invaders_clone_state(mconfig, type, tag),
+ m_inputs(*this, "INPUTS"),
+ m_p2(*this, "P2"),
+ m_palette(*this, "palette")
+ {
+ }
+
+ void shuttlei(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ uint8_t port_ff_r();
+ void port_ff_w(uint8_t data);
+ void sh_port_1_w(uint8_t data);
+ void sh_port_2_w(uint8_t data);
+
+ uint32_t screen_update_shuttlei(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void main_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_ioport m_inputs;
+ required_ioport m_p2;
+ required_device<palette_device> m_palette;
+
+ uint8_t m_port_1_last = 0;
+};
+
+
+/*******************************************************/
+/* Model Racing Claybuster */
+/*******************************************************/
+
+class claybust_state : public invaders_state
+{
+public:
+ claybust_state(machine_config const &mconfig, device_type type, char const *tag) :
+ invaders_state(mconfig, type, tag),
+ m_gunx(*this, "GUNX"),
+ m_guny(*this, "GUNY"),
+ m_gun_on(*this, "claybust_gun")
+ {
+ }
+
+ void claybust(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(gun_trigger);
+
+ DECLARE_READ_LINE_MEMBER(gun_on_r);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ uint8_t gun_lo_r();
+ uint8_t gun_hi_r();
+ TIMER_DEVICE_CALLBACK_MEMBER(gun_callback);
+
+ void io_map(address_map &map);
+
+ required_ioport m_gunx;
+ required_ioport m_guny;
+ required_device<timer_device> m_gun_on;
+
+ uint16_t m_gun_pos = 0;
+};
+
+
/*******************************************************/
-/* */
/* Cane (Model Racing) */
-/* */
/*******************************************************/
-class cane_state : public _8080bw_state
+
+class cane_state : public mw8080bw_state
{
public:
cane_state(machine_config const &mconfig, device_type type, char const *tag) :
- _8080bw_state(mconfig, type, tag)
+ mw8080bw_state(mconfig, type, tag)
{
}
@@ -317,16 +543,16 @@ private:
DISCRETE_SOUND_EXTERN( cane_discrete );
+
/*******************************************************/
-/* */
-/* Model Racing "Orbite" */
-/* */
+/* Model Racing Orbite */
/*******************************************************/
-class orbite_state : public _8080bw_state
+
+class orbite_state : public invaders_clone_palette_state
{
public:
orbite_state(machine_config const &mconfig, device_type type, char const *tag) :
- _8080bw_state(mconfig, type, tag),
+ invaders_clone_palette_state(mconfig, type, tag),
m_main_ram(*this, "main_ram")
{
}
@@ -334,9 +560,6 @@ public:
void orbite(machine_config &config);
protected:
- required_shared_ptr<uint8_t> m_main_ram;
- std::unique_ptr<uint8_t[]> m_scattered_colorram;
-
virtual void machine_start() override;
u8 orbite_scattered_colorram_r(address_space &space, offs_t offset, u8 mem_mask = 0xff);
@@ -347,6 +570,42 @@ private:
void orbite_map(address_map &map);
u32 screen_update_orbite(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ required_shared_ptr<uint8_t> m_main_ram;
+ std::unique_ptr<uint8_t []> m_scattered_colorram;
+};
+
+
+/*******************************************************/
+/* Braze Technologies Space Invaders Multigame hacks */
+/*******************************************************/
+
+class invmulti_state : public invaders_state
+{
+public:
+ invmulti_state(machine_config const &mconfig, device_type type, char const *tag) :
+ invaders_state(mconfig, type, tag),
+ m_banks(*this, "bank%u", 1U),
+ m_eeprom(*this, "eeprom")
+ {
+ }
+
+ void invmulti(machine_config &config);
+
+ void init_invmulti();
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ uint8_t eeprom_r();
+ void eeprom_w(uint8_t data);
+ void bank_w(uint8_t data);
+
+ void main_map(address_map &map);
+
+ required_memory_bank_array<2> m_banks;
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
};
#endif // MAME_INCLUDES_8080BW_H
diff --git a/src/mame/includes/mw8080bw.h b/src/mame/includes/mw8080bw.h
index ad6e14f5efa..a96e61de592 100644
--- a/src/mame/includes/mw8080bw.h
+++ b/src/mame/includes/mw8080bw.h
@@ -60,7 +60,6 @@ public:
void checkmat(machine_config &config);
void dogpatch(machine_config &config);
void invad2ct(machine_config &config);
- void invaders(machine_config &config);
void maze(machine_config &config);
void mw8080bw_root(machine_config &config);
void phantom2(machine_config &config);
@@ -76,26 +75,16 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(tornbase_score_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(blueshrk_coin_input_r);
- DECLARE_CUSTOM_INPUT_MEMBER(invaders_sw6_sw7_r);
- DECLARE_CUSTOM_INPUT_MEMBER(invaders_sw5_r);
- DECLARE_CUSTOM_INPUT_MEMBER(invaders_in0_control_r);
- DECLARE_CUSTOM_INPUT_MEMBER(invaders_in1_control_r);
- DECLARE_CUSTOM_INPUT_MEMBER(invaders_in2_control_r);
-
- DECLARE_MACHINE_RESET(mw8080bw);
-
IRQ_CALLBACK_MEMBER(interrupt_vector);
protected:
virtual void machine_start() override;
+ virtual void machine_reset() override;
DECLARE_WRITE_LINE_MEMBER(int_enable_w);
u8 mw8080bw_shift_result_rev_r();
- int invaders_is_cabinet_cocktail();
-
- uint32_t screen_update_invaders(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_mw8080bw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
// device/memory pointers
@@ -106,9 +95,6 @@ protected:
optional_device<discrete_sound_device> m_discrete;
required_device<screen_device> m_screen;
- // misc game specific
- uint8_t m_flip_screen = 0;
-
private:
// misc game specific
uint16_t m_phantom2_cloud_counter = 0;
@@ -136,7 +122,6 @@ private:
void bowler_audio_6_w(uint8_t data);
DECLARE_MACHINE_START(maze);
DECLARE_MACHINE_START(phantom2);
- DECLARE_MACHINE_START(invaders);
uint32_t screen_update_phantom2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank_phantom2);
TIMER_CALLBACK_MEMBER(maze_tone_timing_timer_callback);
@@ -151,8 +136,6 @@ private:
void maze_write_discrete(uint8_t maze_tone_timing_state);
uint8_t vpos_to_vysnc_chain_counter(int vpos);
int vysnc_chain_counter_to_vpos(uint8_t counter, int vblank);
- void mw8080bw_create_interrupt_timer();
- void mw8080bw_start_interrupt_timer();
uint8_t tornbase_get_cabinet_type();
void blueshrk_audio(machine_config &config);
@@ -167,7 +150,6 @@ private:
void checkmat_io_map(address_map &map);
void dogpatch_io_map(address_map &map);
void invad2ct_io_map(address_map &map);
- void invaders_io_map(address_map &map);
void main_map(address_map &map);
void maze_io_map(address_map &map);
void phantom2_io_map(address_map &map);
@@ -400,16 +382,51 @@ private:
};
-#define TORNBASE_CAB_TYPE_UPRIGHT_OLD (0)
-#define TORNBASE_CAB_TYPE_UPRIGHT_NEW (1)
-#define TORNBASE_CAB_TYPE_COCKTAIL (2)
-
#define INVADERS_CAB_TYPE_PORT_TAG ("CAB")
#define INVADERS_P1_CONTROL_PORT_TAG ("CONTP1")
#define INVADERS_P2_CONTROL_PORT_TAG ("CONTP2")
#define INVADERS_SW6_SW7_PORT_TAG ("SW6SW7")
#define INVADERS_SW5_PORT_TAG ("SW5")
+class invaders_state : public mw8080bw_state
+{
+public:
+ invaders_state(machine_config const &mconfig, device_type type, char const *tag) :
+ mw8080bw_state(mconfig, type, tag),
+ m_player_controls(*this, "CONTP%u", 1U),
+ m_cabinet_type(*this, INVADERS_CAB_TYPE_PORT_TAG)
+ {
+ }
+
+ void invaders(machine_config &config);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(invaders_sw6_sw7_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(invaders_sw5_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(invaders_in0_control_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(invaders_in1_control_r);
+ DECLARE_CUSTOM_INPUT_MEMBER(invaders_in2_control_r);
+
+protected:
+ void machine_start() override;
+
+ bool is_cabinet_cocktail();
+
+ uint32_t screen_update_invaders(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ optional_ioport_array<2> m_player_controls;
+ optional_ioport m_cabinet_type;
+
+ uint8_t m_flip_screen = 0;
+
+private:
+ void io_map(address_map &map);
+};
+
+
+#define TORNBASE_CAB_TYPE_UPRIGHT_OLD (0)
+#define TORNBASE_CAB_TYPE_UPRIGHT_NEW (1)
+#define TORNBASE_CAB_TYPE_COCKTAIL (2)
+
#define BLUESHRK_SPEAR_PORT_TAG ("IN0")
#define INVADERS_CONTROL_PORT_P1 \
@@ -423,8 +440,7 @@ private:
#define INVADERS_CONTROL_PORT_PLAYER(player) \
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(player) \
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(player) \
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(player) \
- PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(player)
#define INVADERS_CAB_TYPE_PORT \
PORT_START(INVADERS_CAB_TYPE_PORT_TAG) \