1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Incredible Technologies/Strata system
6     (8-bit blitter variant)
7 
8 **************************************************************************/
9 
10 #include "machine/gen_latch.h"
11 #include "machine/ticket.h"
12 #include "machine/timer.h"
13 #include "video/tlc34076.h"
14 #include "video/tms34061.h"
15 #include "screen.h"
16 
17 
18 class itech8_state : public driver_device
19 {
20 public:
itech8_state(const machine_config & mconfig,device_type type,const char * tag)21 	itech8_state(const machine_config &mconfig, device_type type, const char *tag) :
22 		driver_device(mconfig, type, tag),
23 		m_maincpu(*this, "maincpu"),
24 		m_soundcpu(*this, "soundcpu"),
25 		m_subcpu(*this, "sub"),
26 		m_soundlatch(*this, "soundlatch"),
27 		m_tms34061(*this, "tms34061"),
28 		m_tlc34076(*this, "tlc34076"),
29 		m_screen(*this, "screen"),
30 		m_ticket(*this, "ticket"),
31 		m_grom(*this, "grom"),
32 		m_mainbank(*this, "mainbank"),
33 		m_fixed(*this, "fixed"),
34 		m_an(*this, { { "AN_C", "AN_D", "AN_E", "AN_F" } }),
35 		m_fakex(*this, "FAKEX"),
36 		m_fakey(*this, "FAKEY"),
37 		m_p1(*this, "P1"),
38 		m_p2(*this, "P2"),
39 		m_visarea(0, 0, 0, 0),
40 		m_bankxor(0)
41 	{}
42 
43 	void rimrockn(machine_config &config);
44 	void gtg2(machine_config &config);
45 	void slikshot_lo(machine_config &config);
46 	void slikshot_lo_noz80(machine_config &config);
47 	void ninclown(machine_config &config);
48 	void sstrike(machine_config &config);
49 	void stratab_hi(machine_config &config);
50 	void hstennis_lo(machine_config &config);
51 	void wfortune(machine_config &config);
52 	void stratab_lo(machine_config &config);
53 	void slikshot_hi(machine_config &config);
54 	void hstennis_hi(machine_config &config);
55 
56 	void init_invbank();
57 	void init_peggle();
58 	void init_slikshot();
59 	void init_neckneck();
60 	void init_arligntn();
61 	void init_hstennis();
62 
63 	DECLARE_READ_LINE_MEMBER(special_r);
64 	DECLARE_CUSTOM_INPUT_MEMBER(gtg_mux);
65 
66 protected:
67 	static constexpr uint32_t YBUFFER_COUNT = 15;
68 	static constexpr uint32_t VRAM_SIZE = 0x40000;
69 	static constexpr uint32_t VRAM_MASK = VRAM_SIZE - 1;
70 
71 	enum
72 	{
73 		TIMER_IRQ_OFF,
74 		TIMER_BEHIND_BEAM_UPDATE,
75 		TIMER_BLITTER_DONE,
76 		TIMER_DELAYED_Z80_CONTROL,
77 		TIMER_BASE_LAST = TIMER_DELAYED_Z80_CONTROL
78 	};
79 
80 	required_device<cpu_device> m_maincpu;
81 	required_device<cpu_device> m_soundcpu;
82 	optional_device<cpu_device> m_subcpu;
83 	required_device<generic_latch_8_device> m_soundlatch;
84 	required_device<tms34061_device> m_tms34061;
85 	required_device<tlc34076_device> m_tlc34076;
86 	required_device<screen_device> m_screen;
87 	required_device<ticket_dispenser_device> m_ticket;
88 	required_region_ptr<uint8_t> m_grom;
89 	optional_memory_bank m_mainbank;
90 	optional_memory_bank m_fixed;
91 	optional_ioport_array<4> m_an;
92 	optional_ioport m_fakex;
93 	optional_ioport m_fakey;
94 	optional_ioport m_p1;
95 	optional_ioport m_p2;
96 
97 	rectangle m_visarea;
98 
99 	uint8_t m_grom_bank;
100 	uint8_t m_blitter_int;
101 	uint8_t m_tms34061_int;
102 	uint8_t m_periodic_int;
103 	uint8_t m_pia_porta_data;
104 	uint8_t m_pia_portb_data;
105 	uint8_t m_z80_ctrl;
106 	uint8_t m_z80_port_val;
107 	uint8_t m_z80_clear_to_send;
108 	uint16_t m_sensor0;
109 	uint16_t m_sensor1;
110 	uint16_t m_sensor2;
111 	uint16_t m_sensor3;
112 	uint8_t m_curvx;
113 	uint8_t m_curvy;
114 	uint8_t m_curx;
115 	int8_t m_xbuffer[YBUFFER_COUNT];
116 	int8_t m_ybuffer[YBUFFER_COUNT];
117 	int m_ybuffer_next;
118 	int m_curxpos;
119 	int m_last_ytotal;
120 	uint8_t m_crosshair_vis;
121 	uint8_t m_blitter_data[16];
122 	uint8_t m_blit_in_progress;
123 	uint8_t m_page_select;
124 	offs_t m_fetch_offset;
125 	uint8_t m_fetch_rle_count;
126 	uint8_t m_fetch_rle_value;
127 	uint8_t m_fetch_rle_literal;
128 	emu_timer *m_irq_off_timer;
129 	emu_timer *m_behind_beam_update_timer;
130 	emu_timer *m_blitter_done_timer;
131 	emu_timer *m_delayed_z80_control_timer;
132 	int m_bankxor;
133 
134 	// common
135 	DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
136 	void nmi_ack_w(uint8_t data);
137 	void blitter_bank_w(offs_t offset, uint8_t data);
138 	void rimrockn_bank_w(uint8_t data);
139 	void pia_portb_out(uint8_t data);
140 	void gtg2_sound_data_w(uint8_t data);
141 	void grom_bank_w(uint8_t data);
142 	void palette_w(offs_t offset, uint8_t data);
143 	void page_w(u8 data);
144 	uint8_t blitter_r(offs_t offset);
145 	void blitter_w(offs_t offset, uint8_t data);
146 	void tms34061_w(offs_t offset, uint8_t data);
147 	uint8_t tms34061_r(offs_t offset);
148 	void pia_porta_out(uint8_t data);
149 	void ym2203_portb_out(uint8_t data);
150 
151 	virtual void machine_start() override;
152 	virtual void machine_reset() override;
153 	virtual void video_start() override;
154 	DECLARE_VIDEO_START(slikshot);
155 	DECLARE_MACHINE_START(sstrike);
156 
157 	uint32_t screen_update_2layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
158 	uint32_t screen_update_slikshot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
159 	uint32_t screen_update_2page(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
160 	uint32_t screen_update_2page_large(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
161 
162 	DECLARE_WRITE_LINE_MEMBER(generate_nmi);
163 	DECLARE_WRITE_LINE_MEMBER(ninclown_irq);
164 	TIMER_CALLBACK_MEMBER(irq_off);
165 	TIMER_CALLBACK_MEMBER(behind_the_beam_update);
166 	TIMER_CALLBACK_MEMBER(blitter_done);
167 
168 	inline uint8_t fetch_next_raw();
169 	inline void consume_raw(int count);
170 	inline uint8_t fetch_next_rle();
171 	inline void consume_rle(int count);
172 	void perform_blit();
173 	void update_interrupts(int periodic, int tms34061, int blitter);
174 
175 	/*----------- defined in machine/itech8.cpp -----------*/
176 
177 	uint8_t slikz80_port_r();
178 	void slikz80_port_w(uint8_t data);
179 
180 	uint8_t slikshot_z80_r();
181 	uint8_t slikshot_z80_control_r();
182 	void slikshot_z80_control_w(uint8_t data);
183 
184 	void inters_to_vels(uint16_t inter1, uint16_t inter2, uint16_t inter3, uint8_t beams,
185 							uint8_t *xres, uint8_t *vxres, uint8_t *vyres);
186 	void vels_to_inters(uint8_t x, uint8_t vx, uint8_t vy,
187 							uint16_t *inter1, uint16_t *inter2, uint16_t *inter3, uint8_t *beams);
188 	void inters_to_words(uint16_t inter1, uint16_t inter2, uint16_t inter3, uint8_t *beams,
189 							uint16_t *word1, uint16_t *word2, uint16_t *word3);
190 
191 	void words_to_sensors(uint16_t word1, uint16_t word2, uint16_t word3, uint8_t beams,
192 							uint16_t *sens0, uint16_t *sens1, uint16_t *sens2, uint16_t *sens3);
193 	void compute_sensors();
194 	TIMER_CALLBACK_MEMBER( delayed_z80_control_w );
195 
196 	// ninja clowns
197 	uint16_t rom_constant_r(offs_t offset);
198 	uint8_t ninclown_palette_r(offs_t offset);
199 	void ninclown_palette_w(offs_t offset, uint8_t data);
200 
201 	void itech8_sound_ym2203(machine_config &config);
202 	void itech8_sound_ym2608b(machine_config &config);
203 	void itech8_sound_ym3812(machine_config &config);
204 	void itech8_sound_ym3812_external(machine_config &config);
205 	void itech8_core_devices(machine_config &config);
206 	void itech8_core_lo(machine_config &config);
207 	void itech8_core_hi(machine_config &config);
208 	void common_hi_map(address_map &map);
209 	void common_lo_map(address_map &map);
210 	void gtg2_map(address_map &map);
211 	void ninclown_map(address_map &map);
212 	void rimrockn_map(address_map &map);
213 	void slikshot_map(address_map &map);
214 	void slikz80_io_map(address_map &map);
215 	void slikz80_mem_map(address_map &map);
216 	void sound2203_map(address_map &map);
217 	void sound2608b_map(address_map &map);
218 	void sound3812_external_map(address_map &map);
219 	void sound3812_map(address_map &map);
220 	void sstrike_map(address_map &map);
221 
222 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
223 };
224 
225 class grmatch_state : public itech8_state
226 {
227 public:
grmatch_state(const machine_config & mconfig,device_type type,const char * tag)228 	grmatch_state(const machine_config &mconfig, device_type type, const char *tag) :
229 		itech8_state(mconfig, type, tag),
230 		m_palette_timer(nullptr)
231 	{
232 	}
233 
234 	void grmatch(machine_config &config);
235 
236 	void driver_init() override;
237 
238 protected:
239 	void machine_start() override;
240 	void machine_reset() override;
241 
242 	enum
243 	{
244 		TIMER_PALETTE = TIMER_BASE_LAST+1,
245 	};
246 
247 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
248 
249 	void palette_w(uint8_t data);
250 	void xscroll_w(uint8_t data);
251 
252 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
253 
254 	void palette_update();
255 
256 	emu_timer *m_palette_timer;
257 	uint8_t m_palcontrol;
258 	uint8_t m_xscroll;
259 	rgb_t m_palette[2][16];
260 
261 	void grmatch_map(address_map &map);
262 };
263