1 // license:BSD-3-Clause 2 // copyright-holders:Luca Elia, David Haywood 3 /************************************************************************* 4 5 Metro Games 6 7 *************************************************************************/ 8 #ifndef MAME_INCLUDES_METRO_H 9 #define MAME_INCLUDES_METRO_H 10 11 #pragma once 12 13 #include "sound/okim6295.h" 14 #include "sound/ym2151.h" 15 #include "sound/es8712.h" 16 #include "video/k053936.h" 17 #include "video/imagetek_i4100.h" 18 #include "machine/eepromser.h" 19 #include "machine/gen_latch.h" 20 #include "machine/timer.h" 21 #include "screen.h" 22 #include "tilemap.h" 23 24 class metro_state : public driver_device 25 { 26 public: metro_state(const machine_config & mconfig,device_type type,const char * tag)27 metro_state(const machine_config &mconfig, device_type type, const char *tag) 28 : driver_device(mconfig, type, tag) 29 , m_maincpu(*this, "maincpu") 30 , m_audiocpu(*this, "audiocpu") 31 , m_oki(*this, "oki") 32 , m_ymsnd(*this, "ymsnd") 33 , m_essnd(*this, "essnd") 34 , m_vdp(*this, "vdp") 35 , m_vdp2(*this, "vdp2") 36 , m_vdp3(*this, "vdp3") 37 , m_k053936(*this, "k053936") 38 , m_eeprom(*this, "eeprom") 39 , m_gfxdecode(*this, "gfxdecode") 40 , m_screen(*this, "screen") 41 , m_soundlatch(*this, "soundlatch") 42 , m_irq_enable(*this, "irq_enable") 43 , m_irq_levels(*this, "irq_levels") 44 , m_irq_vectors(*this, "irq_vectors") 45 , m_input_sel(*this, "input_sel") 46 , m_k053936_ram(*this, "k053936_ram") 47 , m_audiobank(*this, "audiobank") 48 , m_okibank(*this, "okibank") 49 { } 50 51 void i4100_config(machine_config &config); 52 void i4100_config_360x224(machine_config &config); 53 void i4220_config(machine_config &config); 54 void i4220_config_320x240(machine_config &config); 55 void i4220_config_304x224(machine_config &config); 56 void i4300_config(machine_config &config); 57 void i4300_config_384x224(machine_config &config); 58 void i4300_config_320x240(machine_config &config); 59 void metro_upd7810_sound(machine_config &config); 60 void daitorid_upd7810_sound(machine_config &config); 61 void poitto(machine_config &config); 62 void blzntrnd(machine_config &config); 63 void sankokushi(machine_config &config); 64 void mouja(machine_config &config); 65 void toride2g(machine_config &config); 66 void karatour(machine_config &config); 67 void skyalert(machine_config &config); 68 void gakusai(machine_config &config); 69 void batlbubl(machine_config &config); 70 void pururun(machine_config &config); 71 void vmetal(machine_config &config); 72 void daitorid(machine_config &config); 73 void puzzli(machine_config &config); 74 void puzzlia(machine_config &config); 75 void pangpoms(machine_config &config); 76 void dokyusp(machine_config &config); 77 void dokyusei(machine_config &config); 78 void daitoa(machine_config &config); 79 void lastfort(machine_config &config); 80 void puzzlet(machine_config &config); 81 void gakusai2(machine_config &config); 82 void balcube(machine_config &config); 83 void msgogo(machine_config &config); 84 void gstrik2(machine_config &config); 85 void lastforg(machine_config &config); 86 void bangball(machine_config &config); 87 void dharma(machine_config &config); 88 89 void init_karatour(); 90 void init_blzntrnd(); 91 void init_vmetal(); 92 void init_mouja(); 93 void init_balcube(); 94 void init_gakusai(); 95 void init_dharmak(); 96 void init_puzzlet(); 97 void init_metro(); 98 void init_lastfortg(); 99 100 DECLARE_READ_LINE_MEMBER(custom_soundstatus_r); 101 102 private: 103 enum 104 { 105 TIMER_KARATOUR_IRQ, 106 TIMER_MOUJA_IRQ 107 }; 108 109 u8 irq_cause_r(offs_t offset); 110 void irq_cause_w(offs_t offset, u8 data); 111 u8 irq_vector_r(offs_t offset); 112 void mouja_irq_timer_ctrl_w(uint16_t data); 113 void sound_data_w(u8 data); 114 TIMER_CALLBACK_MEMBER(sound_data_sync); 115 u8 soundstatus_r(); 116 void soundstatus_w(u8 data); 117 template<int Mask> void upd7810_rombank_w(u8 data); 118 u8 upd7810_porta_r(); 119 void upd7810_porta_w(u8 data); 120 void upd7810_portb_w(u8 data); 121 void daitorid_portb_w(u8 data); 122 void coin_lockout_1word_w(u8 data); 123 void coin_lockout_4words_w(offs_t offset, uint16_t data); 124 uint16_t balcube_dsw_r(offs_t offset); 125 uint16_t gakusai_input_r(); 126 void blzntrnd_sh_bankswitch_w(u8 data); 127 void puzzlet_irq_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 128 void puzzlet_portb_w(uint16_t data); 129 void k053936_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 130 void gakusai_oki_bank_hi_w(u8 data); 131 void gakusai_oki_bank_lo_w(u8 data); 132 u8 gakusai_eeprom_r(); 133 void gakusai_eeprom_w(u8 data); 134 u8 dokyusp_eeprom_r(); 135 void dokyusp_eeprom_bit_w(u8 data); 136 void dokyusp_eeprom_reset_w(u8 data); 137 void mouja_sound_rombank_w(u8 data); 138 DECLARE_WRITE_LINE_MEMBER(vdp_blit_end_w); 139 140 // vmetal 141 void vmetal_control_w(u8 data); 142 void es8712_reset_w(u8 data); 143 DECLARE_WRITE_LINE_MEMBER(vmetal_es8712_irq); 144 145 TILE_GET_INFO_MEMBER(k053936_get_tile_info); 146 TILE_GET_INFO_MEMBER(k053936_gstrik2_get_tile_info); 147 TILEMAP_MAPPER_MEMBER(tilemap_scan_gstrik2); 148 DECLARE_VIDEO_START(blzntrnd); 149 DECLARE_VIDEO_START(gstrik2); 150 uint32_t screen_update_psac_vdp2_mix(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 151 DECLARE_WRITE_LINE_MEMBER(vblank_irq); 152 INTERRUPT_GEN_MEMBER(periodic_interrupt); 153 TIMER_DEVICE_CALLBACK_MEMBER(bangball_scanline); 154 DECLARE_WRITE_LINE_MEMBER(karatour_vblank_irq); 155 DECLARE_WRITE_LINE_MEMBER(puzzlet_vblank_irq); 156 DECLARE_READ_LINE_MEMBER(rxd_r); 157 158 void balcube_map(address_map &map); 159 void bangball_map(address_map &map); 160 void batlbubl_map(address_map &map); 161 void blzntrnd_map(address_map &map); 162 void blzntrnd_sound_io_map(address_map &map); 163 void blzntrnd_sound_map(address_map &map); 164 void cpu_space_map(address_map &map); 165 void daitoa_map(address_map &map); 166 void daitorid_map(address_map &map); 167 void dharma_map(address_map &map); 168 void dokyusei_map(address_map &map); 169 void dokyusp_map(address_map &map); 170 void gakusai2_map(address_map &map); 171 void gakusai_map(address_map &map); 172 void karatour_map(address_map &map); 173 void kokushi_map(address_map &map); 174 void lastforg_map(address_map &map); 175 void lastfort_map(address_map &map); 176 void upd7810_map(address_map &map); 177 void mouja_map(address_map &map); 178 void mouja_okimap(address_map &map); 179 void msgogo_map(address_map &map); 180 void pangpoms_map(address_map &map); 181 void poitto_map(address_map &map); 182 void pururun_map(address_map &map); 183 void puzzlet_io_map(address_map &map); 184 void puzzlet_map(address_map &map); 185 void skyalert_map(address_map &map); 186 void toride2g_map(address_map &map); 187 void vmetal_map(address_map &map); 188 void ymf278_map(address_map &map); 189 190 virtual void machine_start() override; 191 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 192 193 /* devices */ 194 required_device<cpu_device> m_maincpu; 195 optional_device<cpu_device> m_audiocpu; 196 optional_device<okim6295_device> m_oki; 197 optional_device<device_t> m_ymsnd; // TODO set correct type 198 optional_device<es8712_device> m_essnd; 199 optional_device<imagetek_i4100_device> m_vdp; 200 optional_device<imagetek_i4220_device> m_vdp2; 201 optional_device<imagetek_i4300_device> m_vdp3; 202 203 optional_device<k053936_device> m_k053936; 204 optional_device<eeprom_serial_93cxx_device> m_eeprom; 205 optional_device<gfxdecode_device> m_gfxdecode; 206 required_device<screen_device> m_screen; 207 optional_device<generic_latch_8_device> m_soundlatch; 208 209 /* memory pointers */ 210 optional_shared_ptr<uint16_t> m_irq_enable; 211 optional_shared_ptr<uint16_t> m_irq_levels; 212 optional_shared_ptr<uint16_t> m_irq_vectors; 213 optional_shared_ptr<uint16_t> m_input_sel; 214 optional_shared_ptr<uint16_t> m_k053936_ram; 215 216 optional_memory_bank m_audiobank; 217 optional_memory_bank m_okibank; 218 219 /* video-related */ 220 tilemap_t *m_k053936_tilemap; 221 222 /* irq_related */ 223 int m_vblank_bit; 224 int m_blitter_bit; 225 int m_irq_line; 226 u8 m_requested_int[8]; 227 emu_timer *m_mouja_irq_timer; 228 emu_timer *m_karatour_irq_timer; 229 230 /* sound related */ 231 u8 m_sound_data; 232 uint16_t m_soundstatus; 233 int m_porta; 234 int m_portb; 235 int m_busy_sndcpu; 236 int m_essnd_bank; 237 bool m_essnd_gate; 238 239 /* misc */ 240 int m_gakusai_oki_bank_lo; 241 int m_gakusai_oki_bank_hi; 242 243 void update_irq_state(); 244 void metro_common(); 245 void gakusai_oki_bank_set(); 246 }; 247 248 #endif // MAME_INCLUDES_METRO_H 249