// license:BSD-3-Clause // copyright-holders:Bryan McPhail #ifndef MAME_INCLUDES_TAITO_F3_H #define MAME_INCLUDES_TAITO_F3_H #pragma once #include "audio/taito_en.h" #include "machine/eepromser.h" #include "machine/watchdog.h" #include "sound/okim6295.h" #include "emupal.h" #include "screen.h" #include "tilemap.h" struct F3config; /* This it the best way to allow game specific kludges until the system is fully understood */ enum { /* Early F3 class games, these are not cartridge games and system features may be different */ RINGRAGE=0, /* D21 */ ARABIANM, /* D29 */ RIDINGF, /* D34 */ GSEEKER, /* D40 */ TRSTAR, /* D53 */ GUNLOCK, /* D66 */ TWINQIX, UNDRFIRE, /* D67 - Heavily modified F3 hardware (different memory map) */ SCFINALS, LIGHTBR, /* D69 */ /* D77 - F3 motherboard proms, all following games are 'F3 package system' */ /* D78 I CUP */ KAISERKN, /* D84 */ DARIUSG, /* D87 */ BUBSYMPH, /* D90 */ SPCINVDX, /* D93 */ HTHERO95, /* D94 */ QTHEATER, /* D95 */ EACTION2, /* E02 */ SPCINV95, /* E06 */ QUIZHUHU, /* E08 */ PBOBBLE2, /* E10 */ GEKIRIDO, /* E11 */ KTIGER2, /* E15 */ BUBBLEM, /* E21 */ CLEOPATR, /* E28 */ PBOBBLE3, /* E29 */ ARKRETRN, /* E36 */ KIRAMEKI, /* E44 */ PUCHICAR, /* E46 */ PBOBBLE4, /* E49 */ POPNPOP, /* E51 */ LANDMAKR, /* E61 */ RECALH, /* prototype */ COMMANDW, /* prototype */ TMDRILL }; class taito_f3_state : public driver_device { public: taito_f3_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_watchdog(*this, "watchdog"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), m_palette(*this, "palette"), m_eeprom(*this, "eeprom"), m_textram(*this, "textram", 0), m_spriteram(*this, "spriteram", 0), m_charram(*this, "charram", 0), m_line_ram(*this, "line_ram", 0), m_pf_ram(*this, "pf_ram", 0), m_pivot_ram(*this, "pivot_ram", 0), m_input(*this, "IN.%u", 0), m_dial(*this, "DIAL.%u", 0), m_eepromin(*this, "EEPROMIN"), m_eepromout(*this, "EEPROMOUT"), m_audiocpu(*this, "taito_en:audiocpu"), m_taito_en(*this, "taito_en"), m_oki(*this, "oki"), m_paletteram32(*this, "paletteram"), m_okibank(*this, "okibank") { } void f3_eeprom(machine_config &config); void f3(machine_config &config); void f3_224a(machine_config &config); void bubsympb(machine_config &config); void f3_224b(machine_config &config); void f3_224c(machine_config &config); void f3_224b_eeprom(machine_config &config); void init_commandw(); void init_pbobble2(); void init_puchicar(); void init_intcup94(); void init_landmakr(); void init_twinqix(); void init_elvactr(); void init_arabianm(); void init_bubsympb(); void init_ktiger2(); void init_lightbr(); void init_gekirido(); void init_arkretrn(); void init_kirameki(); void init_qtheater(); void init_popnpop(); void init_spcinvdj(); void init_pbobbl2p(); void init_landmkrp(); void init_bubblem(); void init_ridingf(); void init_gseeker(); void init_bubsymph(); void init_hthero95(); void init_gunlock(); void init_pbobble4(); void init_dariusg(); void init_recalh(); void init_kaiserkn(); void init_spcinv95(); void init_trstaroj(); void init_ringrage(); void init_cupfinal(); void init_quizhuhu(); void init_pbobble3(); void init_cleopatr(); void init_scfinals(); void init_pbobbl2x(); template DECLARE_CUSTOM_INPUT_MEMBER(f3_analog_r); template DECLARE_CUSTOM_INPUT_MEMBER(f3_coin_r); DECLARE_CUSTOM_INPUT_MEMBER(eeprom_read); protected: enum { TIMER_F3_INTERRUPT3 }; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void device_post_load(void) override; virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; required_device m_maincpu; optional_device m_watchdog; required_device m_gfxdecode; required_device m_screen; required_device m_palette; optional_device m_eeprom; required_shared_ptr m_textram; required_shared_ptr m_spriteram; required_shared_ptr m_charram; required_shared_ptr m_line_ram; required_shared_ptr m_pf_ram; required_shared_ptr m_pivot_ram; optional_ioport_array<6> m_input; optional_ioport_array<2> m_dial; optional_ioport m_eepromin; optional_ioport m_eepromout; emu_timer *m_interrupt3_timer; u32 m_coin_word[2]; struct tempsprite { int code, color; int flipx, flipy; int x, y; int zoomx, zoomy; int pri; }; struct f3_playfield_line_inf { int alpha_mode[256]; int pri[256]; /* use for draw_scanlines */ u16 *src[256], *src_s[256], *src_e[256]; u8 *tsrc[256], *tsrc_s[256]; int x_count[256]; u32 x_zoom[256]; u32 clip0[256]; u32 clip1[256]; }; struct f3_spritealpha_line_inf { u16 alpha_level[256]; u16 spri[256]; u16 sprite_alpha[256]; u32 sprite_clip0[256]; u32 sprite_clip1[256]; s16 clip0_l[256]; s16 clip0_r[256]; s16 clip1_l[256]; s16 clip1_r[256]; }; int m_game; tilemap_t *m_tilemap[8]; tilemap_t *m_pixel_layer; tilemap_t *m_vram_layer; std::unique_ptr m_spriteram16_buffered; u16 m_control_0[8]; u16 m_control_1[8]; int m_flipscreen; u8 m_sprite_extra_planes; u8 m_sprite_pen_mask; u16 *m_pf_data[8]; int m_sprite_lag; u8 m_sprite_pri_usage; bitmap_ind8 m_pri_alp_bitmap; int m_alpha_level_2as; int m_alpha_level_2ad; int m_alpha_level_3as; int m_alpha_level_3ad; int m_alpha_level_2bs; int m_alpha_level_2bd; int m_alpha_level_3bs; int m_alpha_level_3bd; int m_alpha_level_last; int m_width_mask; int m_twidth_mask; int m_twidth_mask_bit; std::unique_ptr m_tile_opaque_sp; std::unique_ptr m_tile_opaque_pf[8]; u8 m_add_sat[256][256]; int m_alpha_s_1_1; int m_alpha_s_1_2; int m_alpha_s_1_4; int m_alpha_s_1_5; int m_alpha_s_1_6; int m_alpha_s_1_8; int m_alpha_s_1_9; int m_alpha_s_1_a; int m_alpha_s_2a_0; int m_alpha_s_2a_4; int m_alpha_s_2a_8; int m_alpha_s_2b_0; int m_alpha_s_2b_4; int m_alpha_s_2b_8; int m_alpha_s_3a_0; int m_alpha_s_3a_1; int m_alpha_s_3a_2; int m_alpha_s_3b_0; int m_alpha_s_3b_1; int m_alpha_s_3b_2; u32 m_dval; u8 m_pval; u8 m_tval; u8 m_pdest_2a; u8 m_pdest_2b; int m_tr_2a; int m_tr_2b; u8 m_pdest_3a; u8 m_pdest_3b; int m_tr_3a; int m_tr_3b; u16 *m_src[5]; u16 *m_src_s[5]; u16 *m_src_e[5]; u16 m_clip_al[5]; u16 m_clip_ar[5]; u16 m_clip_bl[5]; u16 m_clip_br[5]; u8 *m_tsrc[5]; u8 *m_tsrc_s[5]; u32 m_x_count[5]; u32 m_x_zoom[5]; std::unique_ptr m_spritelist; const tempsprite *m_sprite_end; std::unique_ptr m_pf_line_inf; std::unique_ptr m_sa_line_inf; const F3config *m_game_config; int (taito_f3_state::*m_dpix_n[8][16])(u32 s_pix); int (taito_f3_state::**m_dpix_lp[5])(u32 s_pix); int (taito_f3_state::**m_dpix_sp[9])(u32 s_pix); u16 pf_ram_r(offs_t offset); void pf_ram_w(offs_t offset, u16 data, u16 mem_mask = ~0); void control_0_w(offs_t offset, u16 data, u16 mem_mask = ~0); void control_1_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 spriteram_r(offs_t offset); void spriteram_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 textram_r(offs_t offset); void textram_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 charram_r(offs_t offset); void charram_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 pivot_r(offs_t offset); void pivot_w(offs_t offset, u16 data, u16 mem_mask = ~0); u16 lineram_r(offs_t offset); void lineram_w(offs_t offset, u16 data, u16 mem_mask = ~0); template TILE_GET_INFO_MEMBER(get_tile_info); TILE_GET_INFO_MEMBER(get_tile_info_text); TILE_GET_INFO_MEMBER(get_tile_info_pixel); u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(screen_vblank); void bubsympb_map(address_map &map); void f3_map(address_map &map); void tile_decode(); inline void f3_drawgfx(bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, int code, int color, int flipx, int flipy, int sx, int sy, u8 pri_dst); inline void f3_drawgfxzoom(bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, int code, int color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, u8 pri_dst); void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect); void get_sprite_info(const u16 *spriteram16_ptr); void print_debug_info(bitmap_rgb32 &bitmap); inline void alpha_set_level(); inline void alpha_blend32_s(int alphas, u32 s); inline void alpha_blend32_d(int alphas, u32 s); inline void alpha_blend_1_1(u32 s); inline void alpha_blend_1_2(u32 s); inline void alpha_blend_1_4(u32 s); inline void alpha_blend_1_5(u32 s); inline void alpha_blend_1_6(u32 s); inline void alpha_blend_1_8(u32 s); inline void alpha_blend_1_9(u32 s); inline void alpha_blend_1_a(u32 s); inline void alpha_blend_2a_0(u32 s); inline void alpha_blend_2a_4(u32 s); inline void alpha_blend_2a_8(u32 s); inline void alpha_blend_2b_0(u32 s); inline void alpha_blend_2b_4(u32 s); inline void alpha_blend_2b_8(u32 s); inline void alpha_blend_3a_0(u32 s); inline void alpha_blend_3a_1(u32 s); inline void alpha_blend_3a_2(u32 s); inline void alpha_blend_3b_0(u32 s); inline void alpha_blend_3b_1(u32 s); inline void alpha_blend_3b_2(u32 s); int dpix_1_noalpha(u32 s_pix); int dpix_ret1(u32 s_pix); int dpix_ret0(u32 s_pix); int dpix_1_1(u32 s_pix); int dpix_1_2(u32 s_pix); int dpix_1_4(u32 s_pix); int dpix_1_5(u32 s_pix); int dpix_1_6(u32 s_pix); int dpix_1_8(u32 s_pix); int dpix_1_9(u32 s_pix); int dpix_1_a(u32 s_pix); int dpix_2a_0(u32 s_pix); int dpix_2a_4(u32 s_pix); int dpix_2a_8(u32 s_pix); int dpix_3a_0(u32 s_pix); int dpix_3a_1(u32 s_pix); int dpix_3a_2(u32 s_pix); int dpix_2b_0(u32 s_pix); int dpix_2b_4(u32 s_pix); int dpix_2b_8(u32 s_pix); int dpix_3b_0(u32 s_pix); int dpix_3b_1(u32 s_pix); int dpix_3b_2(u32 s_pix); int dpix_2_0(u32 s_pix); int dpix_2_4(u32 s_pix); int dpix_2_8(u32 s_pix); int dpix_3_0(u32 s_pix); int dpix_3_1(u32 s_pix); int dpix_3_2(u32 s_pix); inline void dpix_1_sprite(u32 s_pix); inline void dpix_bg(u32 bgcolor); void init_alpha_blend_func(); inline void draw_scanlines(bitmap_rgb32 &bitmap, int xsize, s16 *draw_line_num, const f3_playfield_line_inf **line_t, const int *sprite, u32 orient, int skip_layer_num); void visible_tile_check(f3_playfield_line_inf *line_t, int line, u32 x_index_fx, u32 y_index, u16 *pf_data_n); void calculate_clip(int y, u16 pri, u32* clip0, u32* clip1, int *line_enable); void get_spritealphaclip_info(); void get_line_ram_info(tilemap_t *tmap, int sx, int sy, int pos, u16 *pf_data_n); void get_vram_info(tilemap_t *vram_tilemap, tilemap_t *pixel_tilemap, int sx, int sy); void scanline_draw(bitmap_rgb32 &bitmap, const rectangle &cliprect); private: optional_device m_audiocpu; optional_device m_taito_en; optional_device m_oki; optional_shared_ptr m_paletteram32; optional_memory_bank m_okibank; void bubsympb_oki_w(u8 data); u32 f3_control_r(offs_t offset); void f3_control_w(offs_t offset, u32 data, u32 mem_mask = ~0); void f3_unk_w(offs_t offset, u16 data); void sound_reset_0_w(u32 data); void sound_reset_1_w(u32 data); void sound_bankswitch_w(offs_t offset, u32 data, u32 mem_mask = ~0); void palette_24bit_w(offs_t offset, u32 data, u32 mem_mask = ~0); INTERRUPT_GEN_MEMBER(interrupt2); void bubsympb_oki_map(address_map &map); }; #endif // MAME_INCLUDES_TAITO_F3_H