1 // license:BSD-3-Clause 2 // copyright-holders:Roberto Ventura, Leandro Dardini, Yochizo, Nicola Salmoria 3 /****************************************************************************** 4 5 UPL "sprite framebuffer" hardware 6 7 ******************************************************************************/ 8 #ifndef MAME_INCLUDES_NINJAKD2_H 9 #define MAME_INCLUDES_NINJAKD2_H 10 11 #pragma once 12 13 #include "sound/samples.h" 14 #include "emupal.h" 15 #include "screen.h" 16 #include "tilemap.h" 17 18 class ninjakd2_state : public driver_device 19 { 20 public: ninjakd2_state(const machine_config & mconfig,device_type type,const char * tag)21 ninjakd2_state(const machine_config &mconfig, device_type type, const char *tag) : 22 driver_device(mconfig, type, tag), 23 m_maincpu(*this,"maincpu"), 24 m_palette(*this, "palette"), 25 m_bg_videoram(*this, "bg_videoram"), 26 m_gfxdecode(*this, "gfxdecode"), 27 m_screen(*this, "screen"), 28 m_soundcpu(*this, "soundcpu"), 29 m_pcm(*this, "pcm"), 30 m_pcm_region(*this, "pcm"), 31 m_fg_videoram(*this, "fg_videoram"), 32 m_spriteram(*this, "spriteram"), 33 m_decrypted_opcodes(*this, "decrypted_opcodes"), 34 m_mainbank(*this, "mainbank") 35 { } 36 37 void ninjakd2b(machine_config &config); 38 void ninjakd2(machine_config &config); 39 40 void init_ninjakd2(); 41 void init_bootleg(); 42 43 protected: 44 void ninjakd2_bgvideoram_w(offs_t offset, uint8_t data); 45 void ninjakd2_fgvideoram_w(offs_t offset, uint8_t data); 46 void ninjakd2_bg_ctrl_w(offs_t offset, uint8_t data); 47 void ninjakd2_sprite_overdraw_w(uint8_t data); 48 49 void ninjakd2_bankselect_w(uint8_t data); 50 void ninjakd2_soundreset_w(uint8_t data); 51 52 required_device<cpu_device> m_maincpu; 53 required_device<palette_device> m_palette; 54 optional_shared_ptr<uint8_t> m_bg_videoram; 55 required_device<gfxdecode_device> m_gfxdecode; 56 required_device<screen_device> m_screen; 57 required_device<cpu_device> m_soundcpu; 58 59 uint8_t m_vram_bank_mask; 60 int m_robokid_sprites; 61 bool (*m_stencil_compare_function) (uint16_t pal); 62 int m_sprites_updated; 63 tilemap_t* m_fg_tilemap; 64 tilemap_t* m_bg_tilemap; 65 bitmap_ind16 m_sprites_bitmap; 66 67 void video_init_common(); 68 69 void ninjakd2_pcm_play_w(uint8_t data); 70 SAMPLES_START_CB_MEMBER(ninjakd2_init_samples); 71 72 TILE_GET_INFO_MEMBER(get_fg_tile_info); 73 TILE_GET_INFO_MEMBER(ninjakd2_get_bg_tile_info); 74 uint32_t screen_update_ninjakd2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 75 DECLARE_WRITE_LINE_MEMBER(screen_vblank_ninjakd2); 76 77 void bg_ctrl(int offset, int data, tilemap_t* tilemap); 78 void gfx_unscramble(); 79 void update_sprites(); 80 81 void ninjakid_nopcm_sound_cpu(address_map &map); 82 83 virtual void machine_start() override; 84 virtual void machine_reset() override; 85 virtual void video_start() override; 86 87 void ninjakd2_core(machine_config &config); 88 89 private: 90 optional_device<samples_device> m_pcm; 91 optional_memory_region m_pcm_region; 92 required_shared_ptr<uint8_t> m_fg_videoram; 93 required_shared_ptr<uint8_t> m_spriteram; 94 optional_shared_ptr<uint8_t> m_decrypted_opcodes; 95 96 required_memory_bank m_mainbank; 97 98 const int16_t* m_sampledata; 99 int m_next_sprite_overdraw_enabled; 100 uint8_t m_rom_bank_mask; 101 102 void draw_sprites( bitmap_ind16 &bitmap); 103 void erase_sprites( bitmap_ind16 &bitmap); 104 void lineswap_gfx_roms(const char *region, const int bit); 105 void decrypted_opcodes_map(address_map &map); 106 void ninjakd2_main_cpu(address_map &map); 107 void ninjakd2_sound_cpu(address_map &map); 108 void ninjakd2_sound_io(address_map &map); 109 }; 110 111 class mnight_state : public ninjakd2_state 112 { 113 public: mnight_state(const machine_config & mconfig,device_type type,const char * tag)114 mnight_state(const machine_config &mconfig, device_type type, const char *tag) : 115 ninjakd2_state(mconfig, type, tag) 116 { } 117 118 void arkarea(machine_config &config); 119 void mnight(machine_config &config); 120 121 void init_mnight(); 122 123 private: 124 void mnight_main_cpu(address_map &map); 125 126 TILE_GET_INFO_MEMBER(mnight_get_bg_tile_info); 127 DECLARE_VIDEO_START(mnight); 128 DECLARE_VIDEO_START(arkarea); 129 130 }; 131 132 class robokid_state : public mnight_state 133 { 134 public: robokid_state(const machine_config & mconfig,device_type type,const char * tag)135 robokid_state(const machine_config &mconfig, device_type type, const char *tag) : 136 mnight_state(mconfig, type, tag) 137 { } 138 139 void robokid(machine_config &config); 140 141 void init_robokid(); 142 void init_robokidj(); 143 144 protected: 145 template<int Layer> uint8_t robokid_bg_videoram_r(offs_t offset); 146 template<int Layer> void robokid_bg_videoram_w(offs_t offset, uint8_t data); 147 template<int Layer> void robokid_bg_ctrl_w(offs_t offset, uint8_t data); 148 template<int Layer> void robokid_bg_bank_w(uint8_t data); 149 tilemap_t* m_robokid_tilemap[3]; 150 151 void video_init_banked(uint32_t vram_alloc_size); 152 TILEMAP_MAPPER_MEMBER(robokid_bg_scan); 153 template<int Layer> TILE_GET_INFO_MEMBER(robokid_get_bg_tile_info); 154 155 void robokid_main_cpu(address_map &map); 156 157 private: 158 uint8_t motion_error_verbose_r(); 159 160 DECLARE_VIDEO_START(robokid); 161 uint32_t screen_update_robokid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 162 163 void motion_error_kludge(uint16_t offset); 164 uint8_t m_robokid_bg_bank[3]; 165 std::unique_ptr<uint8_t[]> m_robokid_bg_videoram[3]; 166 }; 167 168 class omegaf_state : public robokid_state 169 { 170 public: omegaf_state(const machine_config & mconfig,device_type type,const char * tag)171 omegaf_state(const machine_config &mconfig, device_type type, const char *tag) : 172 robokid_state(mconfig, type, tag), 173 m_dsw_io(*this, "DIPSW%u", 1U), 174 m_pad_io(*this, "PAD%u", 1U) 175 { } 176 177 void omegaf(machine_config &config); 178 179 protected: 180 virtual void machine_start() override; 181 virtual void machine_reset() override; 182 183 private: 184 uint8_t unk_r(); 185 uint8_t io_protection_r(offs_t offset); 186 void io_protection_w(offs_t offset, uint8_t data); 187 188 void omegaf_main_cpu(address_map &map); 189 190 DECLARE_VIDEO_START(omegaf); 191 TILEMAP_MAPPER_MEMBER(omegaf_bg_scan); 192 uint32_t screen_update_omegaf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 193 194 required_ioport_array<2> m_dsw_io; 195 required_ioport_array<2> m_pad_io; 196 197 void io_protection_start(); 198 void io_protection_reset(); 199 200 uint8_t m_io_protection[3]; 201 uint8_t m_io_protection_input; 202 int m_io_protection_tick; 203 }; 204 205 #endif // MAME_INCLUDES_NINJAKD2_H 206