1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 Sega System 32/Multi 32 hardware 6 7 ***************************************************************************/ 8 #ifndef MAME_INCLUDES_SEGAS32_H 9 #define MAME_INCLUDES_SEGAS32_H 10 11 #pragma once 12 13 #include "sound/multipcm.h" 14 #include "machine/s32comm.h" 15 #include "machine/timer.h" 16 #include "emupal.h" 17 #include "screen.h" 18 #include "tilemap.h" 19 20 21 22 23 class segas32_state : public device_t 24 { 25 public: 26 segas32_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 27 28 void init_alien3(); 29 void init_arescue(int m_hasdsp); 30 void init_arabfgt(); 31 void init_brival(); 32 void init_darkedge(); 33 void init_dbzvrvs(); 34 void init_f1en(); 35 void init_f1lap(); 36 void init_f1lapt(); 37 void init_ga2(); 38 void init_harddunk(); 39 void init_holo(); 40 void init_jpark(); 41 void init_orunners(); 42 void init_radm(); 43 void init_radr(); 44 void init_scross(); 45 void init_slipstrm(); 46 void init_sonic(); 47 void init_sonicp(); 48 void init_spidman(); 49 void init_svf(); 50 void init_jleague(); 51 void init_titlef(); 52 maincpu()53 cpu_device* maincpu() { return m_maincpu; } 54 55 uint32_t screen_update_system32(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 56 uint32_t screen_update_multi32_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 57 uint32_t screen_update_multi32_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 58 59 DECLARE_WRITE_LINE_MEMBER(ym3438_irq_handler); 60 TIMER_DEVICE_CALLBACK_MEMBER(signal_v60_irq_callback); 61 INTERRUPT_GEN_MEMBER(start_of_vblank_int); 62 63 void misc_output_0_w(uint8_t data); 64 void misc_output_1_w(uint8_t data); 65 void sw2_output_0_w(uint8_t data); 66 void sw2_output_1_w(uint8_t data); 67 template<int Which> DECLARE_WRITE_LINE_MEMBER(display_enable_w); 68 void tilebank_external_w(uint8_t data); 69 70 protected: 71 segas32_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_multi32); 72 73 typedef void (segas32_state::*sys32_output_callback)(int which, uint16_t data); 74 75 struct layer_info 76 { 77 bitmap_ind16 bitmap; 78 std::unique_ptr<uint8_t[]> transparent; 79 int num; 80 }; 81 82 struct extents_list 83 { 84 uint8_t scan_extent[256]; 85 uint16_t extent[32][16]; 86 }; 87 88 89 struct cache_entry 90 { 91 cache_entry * next = nullptr; 92 tilemap_t * tmap = nullptr; 93 uint8_t page = 0; 94 uint8_t bank = 0; 95 }; 96 97 void sonic_level_load_protection(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 98 uint16_t brival_protection_r(offs_t offset, uint16_t mem_mask = ~0); 99 void brival_protection_w(offs_t offset, uint16_t data); 100 void darkedge_protection_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 101 uint16_t darkedge_protection_r(offs_t offset, uint16_t mem_mask = ~0); 102 void dbzvrvs_protection_w(address_space &space, uint16_t data); 103 uint16_t dbzvrvs_protection_r(); 104 void jleague_protection_w(address_space &space, offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 105 uint16_t arescue_dsp_r(offs_t offset); 106 void arescue_dsp_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 107 template<int Which> uint16_t paletteram_r(offs_t offset); 108 template<int Which> void paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 109 uint16_t videoram_r(offs_t offset); 110 void videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 111 uint8_t sprite_control_r(offs_t offset); 112 void sprite_control_w(offs_t offset, uint8_t data); 113 uint16_t spriteram_r(offs_t offset); 114 void spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 115 template<int Which> uint16_t mixer_r(offs_t offset); 116 template<int Which> void mixer_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 117 uint8_t int_control_r(offs_t offset); 118 void int_control_w(offs_t offset, uint8_t data); 119 120 void random_number_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 121 uint16_t random_number_r(); 122 uint8_t shared_ram_r(offs_t offset); 123 void shared_ram_w(offs_t offset, uint8_t data); 124 void sound_int_control_lo_w(offs_t offset, uint8_t data); 125 void sound_int_control_hi_w(offs_t offset, uint8_t data); 126 void sound_bank_lo_w(uint8_t data); 127 void sound_bank_hi_w(uint8_t data); 128 uint8_t sound_dummy_r(); 129 void sound_dummy_w(uint8_t data); 130 131 void multipcm_bank_w(uint8_t data); 132 void scross_bank_w(uint8_t data); 133 134 TILE_GET_INFO_MEMBER(get_tile_info); 135 136 TIMER_CALLBACK_MEMBER(end_of_vblank_int); 137 TIMER_CALLBACK_MEMBER(update_sprites); 138 139 void system32_set_vblank(int state); 140 inline uint16_t xBBBBBGGGGGRRRRR_to_xBGRBBBBGGGGRRRR(uint16_t value); 141 inline uint16_t xBGRBBBBGGGGRRRR_to_xBBBBBGGGGGRRRRR(uint16_t value); 142 inline void update_color(int offset, uint16_t data); 143 tilemap_t *find_cache_entry(int page, int bank); 144 inline void get_tilemaps(int bgnum, tilemap_t **tilemaps); 145 uint8_t update_tilemaps(screen_device &screen, const rectangle &cliprect); 146 void sprite_erase_buffer(); 147 void sprite_swap_buffers(); 148 int draw_one_sprite(uint16_t const *data, int xoffs, int yoffs, const rectangle &clipin, const rectangle &clipout); 149 void sprite_render_list(); 150 inline uint8_t compute_color_offsets(int which, int layerbit, int layerflag); 151 inline uint16_t compute_sprite_blend(uint8_t encoding); 152 inline uint16_t *get_layer_scanline(int layer, int scanline); 153 void mix_all_layers(int which, int xoffs, bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t enablemask); 154 void print_mixer_data(int which); 155 uint32_t multi32_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int index); 156 void update_irq_state(); 157 void signal_v60_irq(int which); 158 void update_sound_irq_state(); 159 void segas32_common_init(); 160 void radm_sw1_output( int which, uint16_t data ); 161 void radm_sw2_output( int which, uint16_t data ); 162 void radr_sw2_output( int which, uint16_t data ); 163 void alien3_sw1_output( int which, uint16_t data ); 164 void arescue_sw1_output( int which, uint16_t data ); 165 void f1lap_sw1_output( int which, uint16_t data ); 166 void jpark_sw1_output( int which, uint16_t data ); 167 void orunners_sw1_output( int which, uint16_t data ); 168 void orunners_sw2_output( int which, uint16_t data ); 169 void harddunk_sw1_output( int which, uint16_t data ); 170 void harddunk_sw2_output( int which, uint16_t data ); 171 void harddunk_sw3_output( int which, uint16_t data ); 172 void titlef_sw1_output( int which, uint16_t data ); 173 void titlef_sw2_output( int which, uint16_t data ); 174 void scross_sw1_output( int which, uint16_t data ); 175 void scross_sw2_output( int which, uint16_t data ); 176 int compute_clipping_extents(screen_device &screen, int enable, int clipout, int clipmask, const rectangle &cliprect, extents_list *list); 177 void compute_tilemap_flips(int bgnum, int &flipx, int &flipy); 178 void update_tilemap_zoom(screen_device &screen, layer_info &layer, const rectangle &cliprect, int bgnum); 179 void update_tilemap_rowscroll(screen_device &screen, layer_info &layer, const rectangle &cliprect, int bgnum); 180 void update_tilemap_text(screen_device &screen, layer_info &layer, const rectangle &cliprect); 181 void update_bitmap(screen_device &screen, layer_info &layer, const rectangle &cliprect); 182 void update_background(layer_info &layer, const rectangle &cliprect); 183 184 void signal_sound_irq(int which); 185 void clear_sound_irq(int which); 186 void darkedge_fd1149_vblank(); 187 void f1lap_fd1149_vblank(); 188 189 void ga2_main_map(address_map &map); 190 void multi32_6player_map(address_map &map); 191 void multi32_map(address_map &map); 192 void multi32_sound_map(address_map &map); 193 void multi32_sound_portmap(address_map &map); 194 void multipcm_map(address_map &map); 195 void rf5c68_map(address_map &map); 196 void system32_4player_map(address_map &map); 197 void system32_analog_map(address_map &map); 198 void system32_cd_map(address_map &map); 199 void system32_map(address_map &map); 200 void system32_sound_map(address_map &map); 201 void system32_sound_portmap(address_map &map); 202 void upd7725_data_map(address_map &map); 203 void upd7725_prg_map(address_map &map); 204 void v25_map(address_map &map); 205 206 virtual void device_add_mconfig(machine_config &config) override; 207 virtual void device_start() override; 208 virtual void device_reset() override; 209 210 required_shared_ptr<uint8_t> m_z80_shared_ram; 211 optional_shared_ptr<uint16_t> m_system32_workram; 212 required_shared_ptr<uint16_t> m_videoram; 213 required_shared_ptr<uint16_t> m_spriteram; 214 optional_shared_ptr<uint8_t> m_soundram; 215 optional_shared_ptr_array<uint16_t, 2> m_paletteram; 216 217 required_device<cpu_device> m_maincpu; 218 required_device<cpu_device> m_soundcpu; 219 optional_device<multipcm_device> m_multipcm; 220 required_device<gfxdecode_device> m_gfxdecode; 221 required_device<screen_device> m_screen; 222 required_device<palette_device> m_palette; 223 224 required_device<timer_device> m_irq_timer_0; 225 required_device<timer_device> m_irq_timer_1; 226 optional_device<s32comm_device> m_s32comm; 227 228 required_region_ptr<uint32_t> m_sprite_region; 229 required_memory_region m_maincpu_region; 230 required_memory_bank m_soundrom_bank; 231 optional_memory_bank m_multipcm_bank_hi; 232 optional_memory_bank m_multipcm_bank_lo; 233 234 const bool m_is_multi32; 235 236 uint8_t m_v60_irq_control[0x10]; 237 timer_device *m_v60_irq_timer[2]; 238 uint8_t m_sound_irq_control[4]; 239 uint8_t m_sound_irq_input; 240 uint8_t m_sound_dummy_value; 241 uint16_t m_sound_bank; 242 sys32_output_callback m_sw1_output; 243 sys32_output_callback m_sw2_output; 244 sys32_output_callback m_sw3_output; 245 std::unique_ptr<uint16_t[]> m_system32_protram; 246 uint16_t m_system32_displayenable[2]; 247 uint16_t m_system32_tilebank_external; 248 uint16_t m_arescue_dsp_io[6]; 249 std::unique_ptr<cache_entry[]> m_tmap_cache; 250 cache_entry *m_cache_head; 251 layer_info m_layer_data[11]; 252 uint16_t m_mixer_control[2][0x40]; 253 std::unique_ptr<uint16_t[]> m_solid_0000; 254 std::unique_ptr<uint16_t[]> m_solid_ffff; 255 uint8_t m_sprite_render_count; 256 uint8_t m_sprite_control_latched[8]; 257 uint8_t m_sprite_control[8]; 258 std::unique_ptr<uint32_t[]> m_spriteram_32bit; 259 typedef void (segas32_state::*prot_vblank_func)(); 260 prot_vblank_func m_system32_prot_vblank; 261 int m_print_count; 262 emu_timer *m_vblank_end_int_timer; 263 emu_timer *m_update_sprites_timer; 264 }; 265 266 class segas32_regular_state : public segas32_state 267 { 268 public: 269 segas32_regular_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 270 }; 271 272 class segas32_analog_state : public segas32_state 273 { 274 public: 275 segas32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 276 277 protected: 278 segas32_analog_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 279 280 virtual void device_add_mconfig(machine_config &config) override; 281 }; 282 283 class segas32_trackball_state : public segas32_state 284 { 285 public: 286 segas32_trackball_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 287 288 void system32_trackball_map(address_map &map); 289 protected: 290 virtual void device_add_mconfig(machine_config &config) override; 291 }; 292 293 class segas32_4player_state : public segas32_state 294 { 295 public: 296 segas32_4player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 297 298 protected: 299 segas32_4player_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 300 301 virtual void device_add_mconfig(machine_config &config) override; 302 }; 303 304 class segas32_v25_state : public segas32_4player_state 305 { 306 public: 307 segas32_v25_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 308 309 static const uint8_t arf_opcode_table[256]; 310 static const uint8_t ga2_opcode_table[256]; 311 312 protected: 313 virtual void device_add_mconfig(machine_config &config) override; 314 virtual void device_start() override; 315 316 private: 317 void decrypt_protrom(); 318 }; 319 320 class segas32_upd7725_state : public segas32_analog_state 321 { 322 public: 323 segas32_upd7725_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 324 325 protected: 326 virtual void device_add_mconfig(machine_config &config) override; 327 }; 328 329 class segas32_cd_state : public segas32_state 330 { 331 public: 332 segas32_cd_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 333 334 void lamps1_w(uint8_t data); 335 void lamps2_w(uint8_t data); 336 DECLARE_WRITE_LINE_MEMBER(scsi_irq_w); 337 DECLARE_WRITE_LINE_MEMBER(scsi_drq_w); 338 339 static void cdrom_config(device_t *device); 340 protected: 341 virtual void device_add_mconfig(machine_config &config) override; 342 virtual void device_start() override; 343 344 private: 345 output_finder<16> m_lamps; 346 }; 347 348 class sega_multi32_state : public segas32_state 349 { 350 public: 351 sega_multi32_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 352 353 protected: 354 sega_multi32_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 355 356 virtual void device_add_mconfig(machine_config &config) override; 357 }; 358 359 class sega_multi32_analog_state : public sega_multi32_state 360 { 361 public: 362 sega_multi32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 363 364 ioport_value in2_analog_read(); 365 ioport_value in3_analog_read(); 366 void analog_bank_w(uint8_t data); 367 368 void multi32_analog_map(address_map &map); 369 protected: 370 virtual void device_add_mconfig(machine_config &config) override; 371 virtual void device_start() override; 372 373 private: 374 optional_ioport_array<8> m_analog_ports; 375 uint8_t m_analog_bank; 376 }; 377 378 class sega_multi32_6player_state : public sega_multi32_state 379 { 380 public: 381 sega_multi32_6player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 382 383 protected: 384 virtual void device_add_mconfig(machine_config &config) override; 385 }; 386 387 DECLARE_DEVICE_TYPE(SEGA_S32_PCB, segas32_state) 388 389 #endif // MAME_INCLUDES_SEGAS32_H 390