diff options
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 |
commit | 62c35fe3cec10c706792c28796a5d7d96c5164ea (patch) | |
tree | 43cbde47a9c0702a2af88c09dd1ecc1800da72ab /src/mame/includes | |
parent | c1ef4e0e24c7df1ebc79c8016d69510dff2f041b (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.h | 493 | ||||
-rw-r--r-- | src/mame/includes/mw8080bw.h | 66 |
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) \ |