1 // license:BSD-3-Clause 2 // copyright-holders:Nicola Salmoria 3 4 #include "machine/taitosjsec.h" 5 6 #include "machine/input_merger.h" 7 8 #include "sound/dac.h" 9 #include "sound/discrete.h" 10 #include "sound/ay8910.h" 11 12 #include "emupal.h" 13 #include "screen.h" 14 15 16 class taitosj_state : public driver_device 17 { 18 public: taitosj_state(const machine_config & mconfig,device_type type,const char * tag)19 taitosj_state(const machine_config &mconfig, device_type type, const char *tag) 20 : driver_device(mconfig, type, tag), 21 m_videoram_1(*this, "videoram_1"), 22 m_videoram_2(*this, "videoram_2"), 23 m_videoram_3(*this, "videoram_3"), 24 m_spriteram(*this, "spriteram"), 25 m_paletteram(*this, "paletteram"), 26 m_characterram(*this, "characterram"), 27 m_scroll(*this, "scroll"), 28 m_colscrolly(*this, "colscrolly"), 29 m_gfxpointer(*this, "gfxpointer"), 30 m_colorbank(*this, "colorbank"), 31 m_video_mode(*this, "video_mode"), 32 m_video_priority(*this, "video_priority"), 33 m_collision_reg(*this, "collision_reg"), 34 m_kikstart_scrollram(*this, "kikstart_scroll"), 35 m_maincpu(*this, "maincpu"), 36 m_audiocpu(*this, "audiocpu"), 37 m_mcu(*this, "bmcu"), 38 m_soundnmi(*this, "soundnmi"), 39 m_soundnmi2(*this, "soundnmi2"), 40 m_dac(*this, "dac"), 41 m_dacvol(*this, "dacvol"), 42 m_ay1(*this, "ay1"), 43 m_ay2(*this, "ay2"), 44 m_ay3(*this, "ay3"), 45 m_ay4(*this, "ay4"), 46 m_gfxdecode(*this, "gfxdecode"), 47 m_screen(*this, "screen"), 48 m_palette(*this, "palette") { } 49 50 void mcu(machine_config &config); 51 void nomcu(machine_config &config); 52 void kikstart(machine_config &config); 53 54 void init_alpinea(); 55 void init_alpine(); 56 void init_taitosj(); 57 void init_junglhbr(); 58 void init_spacecr(); 59 60 DECLARE_CUSTOM_INPUT_MEMBER(input_port_4_f0_r); 61 template <int Player> DECLARE_CUSTOM_INPUT_MEMBER(kikstart_gear_r); 62 63 private: 64 required_shared_ptr<uint8_t> m_videoram_1; 65 required_shared_ptr<uint8_t> m_videoram_2; 66 required_shared_ptr<uint8_t> m_videoram_3; 67 required_shared_ptr<uint8_t> m_spriteram; 68 required_shared_ptr<uint8_t> m_paletteram; 69 required_shared_ptr<uint8_t> m_characterram; 70 required_shared_ptr<uint8_t> m_scroll; 71 required_shared_ptr<uint8_t> m_colscrolly; 72 required_shared_ptr<uint8_t> m_gfxpointer; 73 required_shared_ptr<uint8_t> m_colorbank; 74 required_shared_ptr<uint8_t> m_video_mode; 75 required_shared_ptr<uint8_t> m_video_priority; 76 required_shared_ptr<uint8_t> m_collision_reg; 77 optional_shared_ptr<uint8_t> m_kikstart_scrollram; 78 79 required_device<cpu_device> m_maincpu; 80 required_device<cpu_device> m_audiocpu; 81 optional_device<taito_sj_security_mcu_device> m_mcu; 82 required_device<input_merger_device> m_soundnmi; 83 required_device<input_merger_device> m_soundnmi2; 84 required_device<dac_8bit_r2r_device> m_dac; 85 required_device<discrete_sound_device> m_dacvol; 86 required_device<ay8910_device> m_ay1; 87 required_device<ay8910_device> m_ay2; 88 required_device<ay8910_device> m_ay3; 89 required_device<ay8910_device> m_ay4; 90 required_device<gfxdecode_device> m_gfxdecode; 91 required_device<screen_device> m_screen; 92 required_device<palette_device> m_palette; 93 94 typedef void (taitosj_state::*copy_layer_func_t)(bitmap_ind16 &, 95 const rectangle &, int, int *, rectangle *); 96 uint8_t m_input_port_4_f0; 97 uint8_t m_kikstart_gears[2]; 98 99 uint8_t m_spacecr_prot_value; 100 uint8_t m_protection_value; 101 uint32_t m_address; 102 uint8_t m_soundlatch_data; 103 bool m_soundlatch_flag; // 74ls74 1/2 @ GAME BOARD IC42 104 bool m_sound_semaphore2; // 74ls74 2/2 @ GAME BOARD IC42 105 bitmap_ind16 m_layer_bitmap[3]; 106 bitmap_ind16 m_sprite_sprite_collbitmap1; 107 bitmap_ind16 m_sprite_sprite_collbitmap2; 108 bitmap_ind16 m_sprite_layer_collbitmap1; 109 bitmap_ind16 m_sprite_layer_collbitmap2[3]; 110 int m_draw_order[32][4]; 111 void soundlatch_w(uint8_t data); 112 void sound_semaphore2_w(uint8_t data); 113 TIMER_CALLBACK_MEMBER(soundlatch_w_cb); 114 TIMER_CALLBACK_MEMBER(soundlatch_clear7_w_cb); 115 TIMER_CALLBACK_MEMBER(sound_semaphore2_w_cb); 116 TIMER_CALLBACK_MEMBER(sound_semaphore2_clear_w_cb); 117 uint8_t soundlatch_r(); 118 void soundlatch_clear7_w(uint8_t data); 119 uint8_t soundlatch_flags_r(); 120 void sound_semaphore2_clear_w(uint8_t data); 121 void taitosj_bankswitch_w(uint8_t data); 122 uint8_t taitosj_fake_data_r(); 123 void taitosj_fake_data_w(uint8_t data); 124 uint8_t taitosj_fake_status_r(); 125 uint8_t mcu_mem_r(offs_t offset); 126 void mcu_mem_w(offs_t offset, uint8_t data); 127 DECLARE_WRITE_LINE_MEMBER(mcu_intrq_w); 128 DECLARE_WRITE_LINE_MEMBER(mcu_busrq_w); 129 uint8_t spacecr_prot_r(); 130 void alpine_protection_w(uint8_t data); 131 void alpinea_bankswitch_w(uint8_t data); 132 uint8_t alpine_port_2_r(); 133 uint8_t taitosj_gfxrom_r(); 134 void taitosj_characterram_w(offs_t offset, uint8_t data); 135 void junglhbr_characterram_w(offs_t offset, uint8_t data); 136 void taitosj_collision_reg_clear_w(uint8_t data); 137 138 void taitosj_sndnmi_msk_w(uint8_t data); 139 void input_port_4_f0_w(uint8_t data); 140 void taitosj_dacvol_w(uint8_t data); 141 142 virtual void machine_start() override; 143 virtual void machine_reset() override; 144 virtual void video_start() override; 145 uint32_t screen_update_taitosj(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 146 uint32_t screen_update_kikstart(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 147 void init_common(); 148 void reset_common(); 149 void set_pens(); 150 void compute_draw_order(); 151 inline int get_sprite_xy(uint8_t which, uint8_t* sx, uint8_t* sy); 152 inline gfx_element *get_sprite_gfx_element(uint8_t which); 153 void check_sprite_sprite_collision(); 154 void calculate_sprite_areas(int *sprites_on, rectangle *sprite_areas); 155 int check_sprite_layer_bitpattern(int which, rectangle *sprite_areas); 156 void check_sprite_layer_collision(int *sprites_on, rectangle *sprite_areas); 157 void draw_layers(); 158 void draw_sprites(bitmap_ind16 &bitmap); 159 void check_collision(int *sprites_on, rectangle *sprite_areas); 160 int check_sprite_sprite_bitpattern(int sx1, int sy1, int which1,int sx2, int sy2, int which2); 161 void taitosj_copy_layer(bitmap_ind16 &bitmap, const rectangle &cliprect,int which, int *sprites_on, rectangle *sprite_areas); 162 void kikstart_copy_layer(bitmap_ind16 &bitmap, const rectangle &cliprect,int which, int *sprites_on, rectangle *sprite_areas); 163 void copy_layer(bitmap_ind16 &bitmap, const rectangle &cliprect,copy_layer_func_t copy_layer_func, int which, int *sprites_on, rectangle *sprite_areas); 164 void copy_layers(bitmap_ind16 &bitmap, const rectangle &cliprect,copy_layer_func_t copy_layer_func, int *sprites_on, rectangle *sprite_areas); 165 int video_update_common(bitmap_ind16 &bitmap, const rectangle &cliprect, copy_layer_func_t copy_layer_func); 166 167 void kikstart_main_map(address_map &map); 168 void taitosj_audio_map(address_map &map); 169 void taitosj_main_mcu_map(address_map &map); 170 void taitosj_main_nomcu_map(address_map &map); 171 }; 172