1 // license:BSD-3-Clause 2 // copyright-holders:Mirko Buffoni,Nicola Salmoria,Bryan McPhail,David Haywood,R. Belmont,Alex Marshall,Angelo Salese,Luca Elia 3 // thanks-to:Richard Bush 4 #ifndef MAME_INCLUDES_NMK16_H 5 #define MAME_INCLUDES_NMK16_H 6 7 #pragma once 8 9 #include "audio/seibu.h" 10 #include "machine/gen_latch.h" 11 #include "machine/nmk004.h" 12 #include "machine/timer.h" 13 #include "sound/okim6295.h" 14 #include "video/nmk16spr.h" 15 #include "emupal.h" 16 #include "screen.h" 17 #include "tilemap.h" 18 19 class nmk16_state : public driver_device, public seibu_sound_common 20 { 21 public: nmk16_state(const machine_config & mconfig,device_type type,const char * tag)22 nmk16_state(const machine_config &mconfig, device_type type, const char *tag) : 23 driver_device(mconfig, type, tag), 24 m_maincpu(*this, "maincpu"), 25 m_audiocpu(*this, "audiocpu"), 26 m_oki(*this, "oki%u", 1U), 27 m_gfxdecode(*this, "gfxdecode"), 28 m_screen(*this, "screen"), 29 m_palette(*this, "palette"), 30 m_spritegen(*this, "spritegen"), 31 m_nmk004(*this, "nmk004"), 32 m_soundlatch(*this, "soundlatch"), 33 m_bgvideoram(*this, "bgvideoram%u", 0U), 34 m_txvideoram(*this, "txvideoram"), 35 m_mainram(*this, "mainram"), 36 m_gunnail_scrollram(*this, "scrollram"), 37 m_spriteram(*this, "spriteram"), 38 m_gunnail_scrollramy(*this, "scrollramy"), 39 m_tilemap_rom(*this, "tilerom"), 40 m_audiobank(*this, "audiobank"), 41 m_okibank(*this, "okibank%u", 1U), 42 m_dsw_io(*this, "DSW%u", 1U), 43 m_in_io(*this, "IN%u", 0U), 44 m_sprdma_base(0x8000) 45 { } 46 47 void vandyke(machine_config &config); 48 void tdragon_prot(machine_config &config); 49 void tdragon2(machine_config &config); 50 void tharrier(machine_config &config); 51 void raphero(machine_config &config); 52 void tdragon(machine_config &config); 53 void tdragonb(machine_config &config); 54 void gunnail(machine_config &config); 55 void gunnailb(machine_config &config); 56 void hachamf(machine_config &config); 57 void bjtwin(machine_config &config); 58 void ssmissin(machine_config &config); 59 void bioship(machine_config &config); 60 void macross2(machine_config &config); 61 void blkheart(machine_config &config); 62 void manybloc(machine_config &config); 63 void acrobatm(machine_config &config); 64 void strahl(machine_config &config); 65 void strahljbl(machine_config &config); 66 void tdragon3h(machine_config &config); 67 void hachamf_prot(machine_config &config); 68 void macross(machine_config &config); 69 void mustangb(machine_config &config); 70 void mustang(machine_config &config); 71 void twinactn(machine_config &config); 72 void vandykeb(machine_config &config); 73 74 void init_nmk(); 75 void init_tharrier(); 76 void init_vandykeb(); 77 void init_tdragonb(); 78 void init_ssmissin(); 79 void init_twinactn(); 80 void init_hachamf_prot(); 81 void init_tdragon_prot(); 82 void init_banked_audiocpu(); 83 void init_gunnailb(); 84 void init_bjtwin(); 85 86 protected: 87 TIMER_DEVICE_CALLBACK_MEMBER(nmk16_scanline); 88 u32 screen_update_macross(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 89 90 void txvideoram_w(offs_t offset, u16 data, u16 mem_mask = ~0); 91 void flipscreen_w(u8 data); 92 void tilebank_w(u8 data); 93 94 void macross2_sound_bank_w(u8 data); 95 96 required_device<cpu_device> m_maincpu; 97 optional_device<cpu_device> m_audiocpu; 98 optional_device_array<okim6295_device, 2> m_oki; 99 required_device<gfxdecode_device> m_gfxdecode; 100 required_device<screen_device> m_screen; 101 required_device<palette_device> m_palette; 102 required_device<nmk_16bit_sprite_device> m_spritegen; 103 optional_device<nmk004_device> m_nmk004; 104 optional_device<generic_latch_8_device> m_soundlatch; 105 106 optional_shared_ptr_array<u16, 2> m_bgvideoram; 107 optional_shared_ptr<u16> m_txvideoram; 108 required_shared_ptr<u16> m_mainram; 109 optional_shared_ptr<u16> m_gunnail_scrollram; 110 optional_shared_ptr<u8> m_spriteram; 111 optional_shared_ptr<u16> m_gunnail_scrollramy; 112 113 optional_region_ptr<u16> m_tilemap_rom; 114 optional_memory_bank m_audiobank; 115 optional_memory_bank_array<2> m_okibank; 116 117 optional_ioport_array<2> m_dsw_io; 118 optional_ioport_array<3> m_in_io; 119 120 emu_timer *m_dma_timer; 121 int m_tilerambank; 122 int m_sprdma_base; 123 int mask[4*2]; 124 std::unique_ptr<u16[]> m_spriteram_old; 125 std::unique_ptr<u16[]> m_spriteram_old2; 126 int m_bgbank; 127 int m_bioship_background_bank; 128 tilemap_t *m_bg_tilemap[2]; 129 tilemap_t *m_tx_tilemap; 130 int m_mustang_bg_xscroll; 131 u8 m_scroll[2][4]; 132 u16 m_vscroll[4]; 133 int m_prot_count; 134 u8 m_input_pressed; 135 u8 m_start_helper; 136 u8 m_coin_count[2]; 137 u8 m_coin_count_frac[2]; 138 void mainram_strange_w(offs_t offset, u16 data/*, u16 mem_mask = ~0*/); 139 u16 mainram_swapped_r(offs_t offset); 140 void mainram_swapped_w(offs_t offset, u16 data, u16 mem_mask = ~0); 141 void ssmissin_soundbank_w(u8 data); 142 void tharrier_mcu_control_w(u16 data); 143 u16 tharrier_mcu_r(offs_t offset, u16 mem_mask = ~0); 144 void macross2_sound_reset_w(u16 data); 145 template<unsigned Chip> void tharrier_oki_bankswitch_w(u8 data); 146 void hachamf_mainram_w(offs_t offset, u16 data, u16 mem_mask = ~0); 147 void tdragon_mainram_w(offs_t offset, u16 data, u16 mem_mask = ~0); 148 u16 vandykeb_r(); 149 u16 tdragonb_prot_r(); 150 template<unsigned Layer> void bgvideoram_w(offs_t offset, u16 data, u16 mem_mask = ~0); 151 void mustang_scroll_w(u16 data); 152 void raphero_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); 153 template<unsigned Layer> void scroll_w(offs_t offset, u8 data); 154 void bjtwin_scroll_w(offs_t offset, u8 data); 155 void vandyke_scroll_w(offs_t offset, u16 data); 156 void vandykeb_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); 157 void manybloc_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); 158 void bioship_bank_w(u8 data); 159 void nmk004_x0016_w(u16 data); 160 void nmk004_bioship_x0016_w(u16 data); 161 void save_protregs(); 162 163 void set_hacky_interrupt_timing(machine_config &config); 164 void set_hacky_screen_lowres(machine_config &config); 165 void set_hacky_screen_hires(machine_config &config); 166 167 TILEMAP_MAPPER_MEMBER(tilemap_scan_pages); 168 template<unsigned Layer, unsigned Gfx> TILE_GET_INFO_MEMBER(common_get_bg_tile_info); 169 TILE_GET_INFO_MEMBER(common_get_tx_tile_info); 170 TILE_GET_INFO_MEMBER(bioship_get_bg_tile_info); 171 TILE_GET_INFO_MEMBER(bjtwin_get_bg_tile_info); 172 DECLARE_VIDEO_START(macross); 173 DECLARE_VIDEO_START(bioship); 174 DECLARE_VIDEO_START(strahl); 175 DECLARE_VIDEO_START(macross2); 176 DECLARE_VIDEO_START(gunnail); 177 DECLARE_VIDEO_START(bjtwin); 178 void get_colour_4bit(u32 &colour, u32 &pri_mask); 179 void get_colour_5bit(u32 &colour, u32 &pri_mask); 180 void get_sprite_flip(u16 attr, int &flipx, int &flipy, int &code); 181 u32 screen_update_tharrier(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 182 u32 screen_update_strahl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 183 u32 screen_update_bjtwin(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 184 TIMER_CALLBACK_MEMBER(dma_callback); 185 TIMER_DEVICE_CALLBACK_MEMBER(tdragon_mcu_sim); 186 TIMER_DEVICE_CALLBACK_MEMBER(hachamf_mcu_sim); 187 TIMER_DEVICE_CALLBACK_MEMBER(manybloc_scanline); 188 void video_init(); 189 void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *src); 190 void bg_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer = 0); 191 void tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 192 void mcu_run(u8 dsw_setting); 193 u8 decode_byte(u8 src, const u8 *bitp); 194 u32 bjtwin_address_map_bg0(u32 addr); 195 u16 decode_word(u16 src, const u8 *bitp); 196 u32 bjtwin_address_map_sprites(u32 addr); 197 void decode_gfx(); 198 void decode_tdragonb(); 199 void decode_ssmissin(); 200 201 void acrobatm_map(address_map &map); 202 void bioship_map(address_map &map); 203 void bjtwin_map(address_map &map); 204 void gunnail_map(address_map &map); 205 void gunnailb_map(address_map &map); 206 void gunnailb_sound_map(address_map &map); 207 void gunnailb_sound_io_map(address_map &map); 208 void hachamf_map(address_map &map); 209 void macross2_map(address_map &map); 210 void macross2_sound_io_map(address_map &map); 211 void macross2_sound_map(address_map &map); 212 void macross_map(address_map &map); 213 void manybloc_map(address_map &map); 214 void mustang_map(address_map &map); 215 void mustangb_map(address_map &map); 216 void oki1_map(address_map &map); 217 void oki2_map(address_map &map); 218 void raphero_map(address_map &map); 219 void raphero_sound_mem_map(address_map &map); 220 void ssmissin_map(address_map &map); 221 void ssmissin_sound_map(address_map &map); 222 void strahl_map(address_map &map); 223 void strahljbl_map(address_map &map); 224 void tdragon2_map(address_map &map); 225 void tdragon3h_map(address_map &map); 226 void tdragon3h_sound_io_map(address_map &map); 227 void tdragon_map(address_map &map); 228 void tdragonb_map(address_map &map); 229 void tharrier_map(address_map &map); 230 void tharrier_sound_io_map(address_map &map); 231 void tharrier_sound_map(address_map &map); 232 void twinactn_map(address_map &map); 233 void vandyke_map(address_map &map); 234 void vandykeb_map(address_map &map); 235 }; 236 237 class afega_state : public nmk16_state 238 { 239 public: afega_state(const machine_config & mconfig,device_type type,const char * tag)240 afega_state(const machine_config &mconfig, device_type type, const char *tag) : 241 nmk16_state(mconfig, type, tag), 242 m_afega_scroll(*this, "afega_scroll_%u", 0U) 243 {} 244 245 void firehawk(machine_config &config); 246 void grdnstrm(machine_config &config); 247 void grdnstrmk(machine_config &config); 248 void popspops(machine_config &config); 249 void redhawki(machine_config &config); 250 void redhawkb(machine_config &config); 251 void stagger1(machine_config &config); 252 void spec2k(machine_config &config); 253 254 void init_bubl2000(); 255 void init_grdnstrm(); 256 void init_grdnstrmau(); 257 void init_redfoxwp2a(); 258 void init_grdnstrmg(); 259 void init_redhawk(); 260 void init_redhawkg(); 261 void init_redhawki(); 262 void init_spec2k(); 263 264 private: 265 optional_shared_ptr_array<u16, 2> m_afega_scroll; 266 267 u16 afega_unknown_r(); 268 void spec2k_oki1_banking_w(u8 data); 269 template<unsigned Scroll> void afega_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); 270 271 TILE_GET_INFO_MEMBER(get_bg_tile_info_8bit); 272 DECLARE_VIDEO_START(grdnstrm); 273 u32 screen_update_afega(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 274 u32 screen_update_firehawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 275 u32 screen_update_redhawki(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 276 u32 screen_update_redhawkb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 277 u32 screen_update_bubl2000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 278 void video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int dsw_flipscreen, int xoffset, int yoffset, int attr_mask); 279 void redhawki_video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 280 281 void afega_map(address_map &map); 282 void afega_sound_cpu(address_map &map); 283 void firehawk_map(address_map &map); 284 void firehawk_sound_cpu(address_map &map); 285 }; 286 287 class nmk16_tomagic_state : public nmk16_state 288 { 289 public: nmk16_tomagic_state(const machine_config & mconfig,device_type type,const char * tag)290 nmk16_tomagic_state(const machine_config &mconfig, device_type type, const char *tag) : 291 nmk16_state(mconfig, type, tag) 292 {} 293 294 void tomagic(machine_config &config); 295 296 void init_tomagic(); 297 298 private: 299 void tomagic_map(address_map &map); 300 void tomagic_sound_map(address_map &map); 301 void tomagic_sound_io_map(address_map &map); 302 }; 303 304 #endif //MAME_INCLUDES_NMK16_H 305