1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Midway MCR system
6 
7 **************************************************************************/
8 #ifndef MAME_INCLUDES_MCR_H
9 #define MAME_INCLUDES_MCR_H
10 
11 #pragma once
12 
13 #include "cpu/z80/z80.h"
14 #include "machine/z80daisy.h"
15 #include "machine/timer.h"
16 #include "machine/z80ctc.h"
17 #include "machine/z80pio.h"
18 #include "machine/z80sio.h"
19 #include "machine/watchdog.h"
20 #include "audio/bally.h"
21 #include "audio/midway.h"
22 #include "audio/csd.h"
23 #include "sound/samples.h"
24 #include "emupal.h"
25 #include "tilemap.h"
26 
27 /* constants */
28 #define MAIN_OSC_MCR_I      XTAL(19'968'000)
29 
30 
31 class mcr_state : public driver_device
32 {
33 public:
mcr_state(const machine_config & mconfig,device_type type,const char * tag)34 	mcr_state(const machine_config &mconfig, device_type type, const char *tag) :
35 		driver_device(mconfig, type, tag),
36 		m_maincpu(*this, "maincpu"),
37 		m_spriteram(*this, "spriteram"),
38 		m_videoram(*this, "videoram"),
39 		m_paletteram(*this, "paletteram"),
40 		m_ctc(*this, "ctc"),
41 		m_ssio(*this, "ssio"),
42 		m_cheap_squeak_deluxe(*this, "csd"),
43 		m_sounds_good(*this, "sg"),
44 		m_turbo_cheap_squeak(*this, "tcs"),
45 		m_squawk_n_talk(*this, "snt"),
46 		m_samples(*this, "samples"),
47 		m_gfxdecode(*this, "gfxdecode"),
48 		m_palette(*this, "palette")
49 	{ }
50 
51 	void mcr_control_port_w(uint8_t data);
52 	void mcr_paletteram9_w(offs_t offset, uint8_t data);
53 	void mcr_90009_videoram_w(offs_t offset, uint8_t data);
54 	void mcr_90010_videoram_w(offs_t offset, uint8_t data);
55 	uint8_t twotiger_videoram_r(offs_t offset);
56 	void twotiger_videoram_w(offs_t offset, uint8_t data);
57 	void mcr_91490_videoram_w(offs_t offset, uint8_t data);
58 	uint8_t solarfox_ip0_r();
59 	uint8_t solarfox_ip1_r();
60 	uint8_t kick_ip1_r();
61 	void wacko_op4_w(uint8_t data);
62 	uint8_t wacko_ip1_r();
63 	uint8_t wacko_ip2_r();
64 	uint8_t kroozr_ip1_r();
65 	void kroozr_op4_w(uint8_t data);
66 	void journey_op4_w(uint8_t data);
67 	void twotiger_op4_w(uint8_t data);
68 	void dotron_op4_w(uint8_t data);
69 	uint8_t demoderb_ip1_r();
70 	uint8_t demoderb_ip2_r();
71 	void demoderb_op4_w(uint8_t data);
72 
73 	void init_mcr_91490();
74 	void init_kroozr();
75 	void init_solarfox();
76 	void init_kick();
77 	void init_twotiger();
78 	void init_demoderb();
79 	void init_wacko();
80 	void init_mcr_90010();
81 	void init_dotrone();
82 	void init_journey();
83 
84 	uint32_t screen_update_mcr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
85 	TIMER_DEVICE_CALLBACK_MEMBER(mcr_interrupt);
86 
87 	void mcr_91490_tcs(machine_config &config);
88 	void mcr_91490_snt(machine_config &config);
89 	void mcr_91490(machine_config &config);
90 	void mcr_90009(machine_config &config);
91 	void mcr_90010_tt(machine_config &config);
92 	void mcr_91475(machine_config &config);
93 	void mcr_90010(machine_config &config);
94 	void cpu_90009_map(address_map &map);
95 	void cpu_90009_portmap(address_map &map);
96 	void cpu_90010_map(address_map &map);
97 	void cpu_90010_portmap(address_map &map);
98 	void cpu_91490_map(address_map &map);
99 	void cpu_91490_portmap(address_map &map);
100 protected:
101 	virtual void machine_start() override;
102 	virtual void machine_reset() override;
103 	virtual void video_start() override;
104 
105 	TILE_GET_INFO_MEMBER(mcr_90009_get_tile_info);
106 	TILE_GET_INFO_MEMBER(mcr_90010_get_tile_info);
107 	TILE_GET_INFO_MEMBER(mcr_91490_get_tile_info);
108 	void mcr_set_color(int index, int data);
109 	void journey_set_color(int index, int data);
110 	void render_sprites_91399(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
111 	void render_sprites_91464(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int primask, int sprmask, int colormask);
112 	void mcr_init(int cpuboard, int vidboard, int ssioboard);
113 
114 	int8_t m_mcr12_sprite_xoffs_flip;
115 	uint8_t m_input_mux;
116 	uint8_t m_last_op4;
117 	tilemap_t *m_bg_tilemap;
118 
119 	uint8_t m_mcr_cocktail_flip;
120 
121 	required_device<z80_device> m_maincpu;
122 	optional_shared_ptr<uint8_t> m_spriteram;
123 	optional_shared_ptr<uint8_t> m_videoram;
124 	optional_shared_ptr<uint8_t> m_paletteram;
125 
126 	required_device<z80ctc_device> m_ctc;
127 	optional_device<midway_ssio_device> m_ssio;
128 	optional_device<midway_cheap_squeak_deluxe_device> m_cheap_squeak_deluxe;
129 	optional_device<midway_sounds_good_device> m_sounds_good;
130 	optional_device<midway_turbo_cheap_squeak_device> m_turbo_cheap_squeak;
131 	optional_device<bally_squawk_n_talk_device> m_squawk_n_talk;
132 	optional_device<samples_device> m_samples;
133 	required_device<gfxdecode_device> m_gfxdecode;
134 	required_device<palette_device> m_palette;
135 
136 private:
137 	uint32_t m_mcr_cpu_board;
138 	uint32_t m_mcr_sprite_board;
139 
140 	int8_t m_mcr12_sprite_xoffs;
141 };
142 
143 class mcr_dpoker_state : public mcr_state
144 {
145 public:
mcr_dpoker_state(const machine_config & mconfig,device_type type,const char * tag)146 	mcr_dpoker_state(const machine_config &mconfig, device_type type, const char *tag) :
147 		mcr_state(mconfig, type, tag),
148 		m_coin_in_timer(*this, "coinin"),
149 		m_hopper_timer(*this, "hopper"),
150 		m_lamps(*this, "lamp%u", 0U)
151 	{ }
152 
153 	uint8_t ip0_r();
154 	void lamps1_w(uint8_t data);
155 	void lamps2_w(uint8_t data);
156 	void output_w(uint8_t data);
157 	void meters_w(uint8_t data);
158 
159 	DECLARE_INPUT_CHANGED_MEMBER(coin_in_hit);
160 
161 	TIMER_DEVICE_CALLBACK_MEMBER(hopper_callback);
162 	TIMER_DEVICE_CALLBACK_MEMBER(coin_in_callback);
163 
164 	void init_dpoker();
165 
166 	void mcr_90009_dp(machine_config &config);
167 
168 protected:
machine_start()169 	virtual void machine_start() override { mcr_state::machine_start(); m_lamps.resolve(); }
170 
171 private:
172 	uint8_t m_coin_status;
173 	uint8_t m_output;
174 
175 	required_device<timer_device> m_coin_in_timer;
176 	required_device<timer_device> m_hopper_timer;
177 	output_finder<14> m_lamps;
178 };
179 
180 class mcr_nflfoot_state : public mcr_state
181 {
182 public:
mcr_nflfoot_state(const machine_config & mconfig,device_type type,const char * tag)183 	mcr_nflfoot_state(const machine_config &mconfig, device_type type, const char *tag) :
184 		mcr_state(mconfig, type, tag),
185 		m_ipu(*this, "ipu"),
186 		m_ipu_sio(*this, "ipu_sio"),
187 		m_ipu_ctc(*this, "ipu_ctc"),
188 		m_ipu_pio0(*this, "ipu_pio0"),
189 		m_ipu_pio1(*this, "ipu_pio1")
190 	{ }
191 
192 	DECLARE_WRITE_LINE_MEMBER(sio_txda_w);
193 	DECLARE_WRITE_LINE_MEMBER(sio_txdb_w);
194 	void ipu_laserdisk_w(offs_t offset, uint8_t data);
195 	uint8_t ipu_watchdog_r();
196 	void ipu_watchdog_w(uint8_t data);
197 	uint8_t ip2_r();
198 	void op4_w(uint8_t data);
199 
200 	TIMER_CALLBACK_MEMBER(ipu_watchdog_reset);
201 	TIMER_DEVICE_CALLBACK_MEMBER(ipu_interrupt);
202 
203 	void init_nflfoot();
204 
205 	void mcr_91490_ipu(machine_config &config);
206 	void ipu_91695_map(address_map &map);
207 	void ipu_91695_portmap(address_map &map);
208 protected:
209 	virtual void machine_start() override;
210 
211 private:
212 	int m_ipu_sio_txda;
213 	int m_ipu_sio_txdb;
214 	emu_timer *m_ipu_watchdog_timer;
215 
216 	required_device<z80_device> m_ipu;
217 	required_device<z80sio_device> m_ipu_sio;
218 	required_device<z80ctc_device> m_ipu_ctc;
219 	required_device<z80pio_device> m_ipu_pio0;
220 	required_device<z80pio_device> m_ipu_pio1;
221 };
222 
223 /*----------- defined in machine/mcr.cpp -----------*/
224 
225 extern const z80_daisy_config mcr_daisy_chain[];
226 extern const z80_daisy_config mcr_ipu_daisy_chain[];
227 
228 extern const gfx_layout mcr_bg_layout;
229 extern const gfx_layout mcr_sprite_layout;
230 
231 #endif // MAME_INCLUDES_MCR_H
232