// license:BSD-3-Clause // copyright-holders:Aaron Giles /*************************************************************************** Sega System 16A/16B/18/Outrun/Hang On/X-Board/Y-Board hardware ***************************************************************************/ #include "cpu/m68000/m68000.h" #include "cpu/mcs51/mcs51.h" #include "cpu/z80/z80.h" #include "machine/gen_latch.h" #include "machine/nvram.h" #include "machine/segaic16.h" #include "machine/315_5296.h" #include "video/315_5313.h" #include "video/segaic16.h" #include "video/sega16sp.h" // ======================> segas18_state class segas18_state : public sega_16bit_common_base { public: // construction/destruction segas18_state(const machine_config &mconfig, device_type type, const char *tag) : sega_16bit_common_base(mconfig, type, tag), m_mapper(*this, "mapper"), m_maincpu(*this, "maincpu"), m_maincpu_region(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_mcu(*this, "mcu"), m_vdp(*this, "gen_vdp"), m_io(*this, "io"), m_nvram(*this, "nvram"), m_sprites(*this, "sprites"), m_segaic16vid(*this, "segaic16vid"), m_gfxdecode(*this, "gfxdecode"), m_soundlatch(*this, "soundlatch"), m_workram(*this, "workram"), m_romboard(ROM_BOARD_INVALID), m_grayscale_enable(false), m_vdp_enable(false), m_vdp_mixing(0), m_mcu_data(0), m_lghost_value(0), m_lghost_select(0) { memset(m_wwally_last_x, 0, sizeof(m_wwally_last_x)); memset(m_wwally_last_y, 0, sizeof(m_wwally_last_y)); } // driver init DECLARE_DRIVER_INIT(ddcrew); DECLARE_DRIVER_INIT(lghost); DECLARE_DRIVER_INIT(generic_shad); DECLARE_DRIVER_INIT(generic_5874); DECLARE_DRIVER_INIT(wwally); DECLARE_DRIVER_INIT(generic_5987); DECLARE_DRIVER_INIT(hamaway); // memory mapping void memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 index); UINT8 mapper_sound_r(); void mapper_sound_w(UINT8 data); // read/write handlers DECLARE_WRITE8_MEMBER( rom_5874_bank_w ); DECLARE_WRITE16_MEMBER( rom_5987_bank_w ); DECLARE_WRITE16_MEMBER( rom_837_7525_bank_w ); DECLARE_WRITE8_MEMBER( misc_outputs_w ); DECLARE_READ16_MEMBER( misc_io_r ); DECLARE_WRITE16_MEMBER( misc_io_w ); DECLARE_WRITE8_MEMBER( soundbank_w ); DECLARE_WRITE8_MEMBER( mcu_data_w ); DECLARE_WRITE_LINE_MEMBER(ym3438_irq_handler); // custom I/O DECLARE_READ16_MEMBER( ddcrew_custom_io_r ); DECLARE_READ16_MEMBER( lghost_custom_io_r ); DECLARE_WRITE8_MEMBER( lghost_gun_recoil_w ); DECLARE_WRITE16_MEMBER( lghost_custom_io_w ); DECLARE_READ16_MEMBER( wwally_custom_io_r ); DECLARE_WRITE16_MEMBER( wwally_custom_io_w ); // video rendering UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(vdp_sndirqline_callback_s18); DECLARE_WRITE_LINE_MEMBER(vdp_lv6irqline_callback_s18); DECLARE_WRITE_LINE_MEMBER(vdp_lv4irqline_callback_s18); DECLARE_READ16_MEMBER( genesis_vdp_r ) { return m_vdp->vdp_r(space, offset, mem_mask); } DECLARE_WRITE16_MEMBER( genesis_vdp_w ) { m_vdp->vdp_w(space, offset, data, mem_mask); } DECLARE_WRITE16_MEMBER( tileram_w ) { m_segaic16vid->tileram_w(space, offset, data, mem_mask); } DECLARE_WRITE16_MEMBER( textram_w ) { m_segaic16vid->textram_w(space, offset, data, mem_mask); } DECLARE_WRITE_LINE_MEMBER(set_grayscale); DECLARE_WRITE_LINE_MEMBER(set_vdp_enable); protected: // timer IDs enum { TID_INITIAL_BOOST }; // rom board types enum segas18_rom_board { ROM_BOARD_INVALID, ROM_BOARD_171_SHADOW, // 171-???? -- used by shadow dancer ROM_BOARD_171_5874, // 171-5874 ROM_BOARD_171_5987, // 171-5987 ROM_BOARD_837_7525 // Hammer Away proto }; // device overrides virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // internal helpers void init_generic(segas18_rom_board rom_board); void set_vdp_mixing(UINT8 mixing); void draw_vdp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority); // devices required_device m_mapper; required_device m_maincpu; required_memory_region m_maincpu_region; required_device m_soundcpu; optional_device m_mcu; required_device m_vdp; required_device m_io; required_device m_nvram; required_device m_sprites; required_device m_segaic16vid; required_device m_gfxdecode; required_device m_soundlatch; // memory pointers required_shared_ptr m_workram; // configuration segas18_rom_board m_romboard; read16_delegate m_custom_io_r; write16_delegate m_custom_io_w; // internal state int m_grayscale_enable; int m_vdp_enable; UINT8 m_vdp_mixing; bitmap_ind16 m_temp_bitmap; UINT8 m_mcu_data; // game-specific state UINT8 m_wwally_last_x[3]; UINT8 m_wwally_last_y[3]; UINT8 m_lghost_value; UINT8 m_lghost_select; };