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