1 // license:BSD-3-Clause 2 // copyright-holders:Olivier Galibert 3 /* 4 * Sega System 24 5 * 6 */ 7 #ifndef MAME_INCLUDES_SEGAS24_H 8 #define MAME_INCLUDES_SEGAS24_H 9 10 #pragma once 11 12 #include "machine/timer.h" 13 #include "video/segaic24.h" 14 #include "emupal.h" 15 #include "screen.h" 16 17 class segas24_state : public driver_device 18 { 19 public: segas24_state(const machine_config & mconfig,device_type type,const char * tag)20 segas24_state(const machine_config &mconfig, device_type type, const char *tag) 21 : driver_device(mconfig, type, tag) 22 , m_maincpu(*this, "maincpu") 23 , m_subcpu(*this, "subcpu") 24 , m_screen(*this, "screen") 25 , m_palette(*this, "palette") 26 , m_paletteram(*this, "paletteram") 27 , m_romboard(*this, "romboard") 28 , m_floppy(*this, "floppy") 29 , m_rombank(*this, "rombank%u", 1U) 30 , m_irq_timer(*this, "irq_timer") 31 , m_irq_timer_clear(*this, "irq_timer_clear") 32 , m_frc_cnt_timer(*this, "frc_timer") 33 , m_vtile(*this, "tile") 34 , m_vsprite(*this, "sprite") 35 , m_vmixer(*this, "mixer") 36 , m_gground_hack_timer(nullptr) 37 , m_p1(*this, "P1") 38 , m_p2(*this, "P2") 39 , m_p3(*this, "P3") 40 , m_paddle(*this, "PADDLE") 41 , m_mj_inputs(*this, {"MJ0", "MJ1", "MJ2", "MJ3", "MJ4", "MJ5", "P1", "P2"}) 42 { 43 } 44 45 void init_crkdown(); 46 void init_quizmeku(); 47 void init_qrouka(); 48 void init_roughrac(); 49 void init_qgh(); 50 void init_gground(); 51 void init_mahmajn2(); 52 void init_sspiritj(); 53 void init_mahmajn(); 54 void init_hotrod(); 55 void init_sspirits(); 56 void init_dcclub(); 57 void init_bnzabros(); 58 void init_dcclubfd(); 59 void init_qsww(); 60 void init_sgmast(); 61 62 void dcclub(machine_config &config); 63 void dcclubj(machine_config &config); 64 void mahmajn(machine_config &config); 65 void sgmastj(machine_config &config); 66 void system24_floppy(machine_config &config); 67 void system24_floppy_dcclub(machine_config &config); 68 void system24_floppy_fd1094(machine_config &config); 69 void system24_floppy_fd_upd(machine_config &config); 70 void system24_floppy_hotrod(machine_config &config); 71 void system24_floppy_rom(machine_config &config); 72 void system24_rom(machine_config &config); 73 void system24(machine_config &config); 74 75 protected: 76 virtual void device_post_load() override; 77 78 private: 79 required_device<cpu_device> m_maincpu; 80 required_device<cpu_device> m_subcpu; 81 required_device<screen_device> m_screen; 82 required_device<palette_device> m_palette; 83 required_shared_ptr<uint16_t> m_paletteram; 84 optional_memory_region m_romboard; 85 optional_region_ptr<uint8_t> m_floppy; 86 87 optional_memory_bank_array<2> m_rombank; 88 89 static const uint8_t s_mahmajn_mlt[8]; 90 static const uint8_t s_mahmajn2_mlt[8]; 91 static const uint8_t s_qgh_mlt[8]; 92 static const uint8_t s_bnzabros_mlt[8]; 93 static const uint8_t s_qrouka_mlt[8]; 94 static const uint8_t s_quizmeku_mlt[8]; 95 static const uint8_t s_dcclub_mlt[8]; 96 97 uint8_t m_fdc_track_side; 98 uint8_t m_fdc_mode; 99 int m_fdc_status; 100 int m_fdc_track; 101 int m_fdc_sector; 102 int m_fdc_data; 103 int m_fdc_phys_track; 104 bool m_fdc_irq; 105 bool m_fdc_drq; 106 int m_fdc_span; 107 int m_fdc_index_count; 108 uint8_t *m_fdc_pt; 109 int m_track_size; 110 int m_cur_input_line; 111 uint8_t m_curbank; 112 uint8_t m_mlatch; 113 const uint8_t *m_mlatch_table; 114 115 uint16_t m_irq_tdata, m_irq_tval; 116 uint8_t m_irq_tmode, m_irq_allow0, m_irq_allow1; 117 bool m_irq_timer_pend0; 118 bool m_irq_timer_pend1; 119 bool m_irq_yms; 120 bool m_irq_vblank; 121 bool m_irq_sprite; 122 attotime m_irq_synctime, m_irq_vsynctime; 123 required_device<timer_device> m_irq_timer; 124 required_device<timer_device> m_irq_timer_clear; 125 //timer_device *m_irq_frc; 126 required_device<timer_device> m_frc_cnt_timer; 127 uint8_t m_frc_mode; 128 129 bool m_cnt1; 130 131 required_device<segas24_tile_device> m_vtile; 132 required_device<segas24_sprite_device> m_vsprite; 133 required_device<segas24_mixer_device> m_vmixer; 134 135 DECLARE_WRITE_LINE_MEMBER(irq_ym); 136 uint16_t paletteram_r(offs_t offset); 137 void paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 138 uint16_t irq_r(offs_t offset); 139 void irq_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 140 uint16_t fdc_r(offs_t offset); 141 void fdc_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 142 uint16_t fdc_status_r(); 143 void fdc_ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 144 uint8_t curbank_r(); 145 void curbank_w(uint8_t data); 146 uint8_t frc_mode_r(); 147 void frc_mode_w(uint8_t data); 148 uint8_t frc_r(); 149 void frc_w(uint8_t data); 150 uint8_t mlatch_r(); 151 void mlatch_w(uint8_t data); 152 uint16_t iod_r(offs_t offset); 153 void iod_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 154 155 uint8_t dcclub_p1_r(); 156 uint8_t dcclub_p3_r(); 157 uint8_t mahmajn_input_line_r(); 158 uint8_t mahmajn_inputs_r(); 159 160 void mahmajn_mux_w(uint8_t data); 161 void hotrod_lamps_w(uint8_t data); 162 163 void fdc_init(); 164 void reset_reset(); 165 void reset_bank(); 166 void irq_init(); 167 void irq_timer_sync(); 168 void irq_timer_start(int old_tmode); 169 WRITE_LINE_MEMBER(cnt1); 170 virtual void machine_start() override; 171 virtual void machine_reset() override; 172 uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 173 TIMER_DEVICE_CALLBACK_MEMBER(irq_timer_cb); 174 TIMER_DEVICE_CALLBACK_MEMBER(irq_timer_clear_cb); 175 TIMER_DEVICE_CALLBACK_MEMBER(irq_frc_cb); 176 TIMER_DEVICE_CALLBACK_MEMBER(irq_vbl); 177 178 // game specific 179 TIMER_CALLBACK_MEMBER(gground_hack_timer_callback); 180 emu_timer *m_gground_hack_timer; 181 required_ioport m_p1; 182 required_ioport m_p2; 183 required_ioport m_p3; 184 optional_ioport m_paddle; 185 optional_ioport_array<8> m_mj_inputs; 186 187 void common_map(address_map &map); 188 void cpu1_map(address_map &map); 189 void cpu2_map(address_map &map); 190 void decrypted_opcodes_map(address_map &map); 191 void hotrod_common_map(address_map &map); 192 void hotrod_cpu1_map(address_map &map); 193 void hotrod_cpu2_map(address_map &map); 194 void rombd_common_map(address_map &map); 195 void rombd_cpu1_map(address_map &map); 196 void rombd_cpu2_map(address_map &map); 197 void roughrac_common_map(address_map &map); 198 void roughrac_cpu1_map(address_map &map); 199 void roughrac_cpu2_map(address_map &map); 200 void dcclubj_cpu1_map(address_map &map); 201 void dcclubj_cpu2_map(address_map &map); 202 }; 203 204 #endif // MAME_INCLUDES_SEGAS24_H 205