1 // license:BSD-3-Clause
2 // copyright-holders:Alex Pasadyn, Howie Cohen, Frank Palazzolo, Ernesto Corvi, Aaron Giles
3 /*************************************************************************
4 
5     Sega Z80-3D system
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_TURBO_H
9 #define MAME_INCLUDES_TURBO_H
10 
11 #pragma once
12 
13 #include "cpu/z80/z80.h"
14 #include "machine/i8255.h"
15 #include "sound/discrete.h"
16 #include "sound/samples.h"
17 #include "emupal.h"
18 #include "screen.h"
19 #include "tilemap.h"
20 
21 /* sprites are scaled in the analog domain; to give a better */
22 /* rendition of this, we scale in the X direction by this factor */
23 #define TURBO_X_SCALE       2
24 
25 
26 
27 class turbo_state : public driver_device
28 {
29 public:
turbo_state(const machine_config & mconfig,device_type type,const char * tag)30 	turbo_state(const machine_config &mconfig, device_type type, const char *tag)
31 		: driver_device(mconfig, type, tag)
32 		, m_maincpu(*this, "maincpu")
33 		, m_subcpu(*this, "subcpu")
34 		, m_i8255_0(*this, "i8255_0")
35 		, m_i8255_1(*this, "i8255_1")
36 		, m_i8255_2(*this, "i8255_2")
37 		, m_i8255_3(*this, "i8255_3")
38 		, m_spriteroms(*this, "sprites")
39 		, m_proms(*this, "proms")
40 		, m_roadroms(*this, "road")
41 		, m_bgcolorrom(*this, "bgcolor")
42 		, m_videoram(*this, "videoram")
43 		, m_spriteram(*this, "spriteram")
44 		, m_sprite_position(*this, "spritepos")
45 		, m_decrypted_opcodes(*this, "decrypted_opcodes")
46 		, m_samples(*this, "samples")
47 		, m_gfxdecode(*this, "gfxdecode")
48 		, m_screen(*this, "screen")
49 		, m_digits(*this, "digit%u", 0U)
50 		, m_lamp(*this, "lamp")
51 	{ }
52 
53 	void turbo(machine_config &config);
54 	void buckrog(machine_config &config);
55 	void buckroge(machine_config &config);
56 	void buckrogu(machine_config &config);
57 	void subroc3d(machine_config &config);
58 	void turbo_samples(machine_config &config);
59 	void subroc3d_samples(machine_config &config);
60 	void buckrog_samples(machine_config &config);
61 
62 	void init_turbo_enc();
63 	void init_turbo_noenc();
64 
65 private:
66 	/* device/memory pointers */
67 	required_device<z80_device> m_maincpu;
68 	optional_device<z80_device> m_subcpu;
69 	required_device<i8255_device> m_i8255_0;
70 	required_device<i8255_device> m_i8255_1;
71 	optional_device<i8255_device> m_i8255_2;
72 	optional_device<i8255_device> m_i8255_3;
73 
74 	required_region_ptr<uint8_t> m_spriteroms;
75 	required_region_ptr<uint8_t> m_proms;
76 	optional_region_ptr<uint8_t> m_roadroms;
77 	optional_region_ptr<uint8_t> m_bgcolorrom;
78 
79 	required_shared_ptr<uint8_t> m_videoram;
80 	optional_shared_ptr<uint8_t> m_spriteram;
81 	required_shared_ptr<uint8_t> m_sprite_position;
82 	optional_shared_ptr<uint8_t> m_decrypted_opcodes;
83 
84 	required_device<samples_device> m_samples;
85 
86 	required_device<gfxdecode_device> m_gfxdecode;
87 	required_device<screen_device> m_screen;
88 	output_finder<32> m_digits;
89 	output_finder<> m_lamp;
90 
91 	std::unique_ptr<uint8_t[]>     m_buckrog_bitmap_ram;
machine_start()92 	virtual void machine_start() override { m_digits.resolve(); m_lamp.resolve(); }
93 
94 	/* machine states */
95 	uint8_t       m_i8279_scanlines;
96 	uint8_t       m_alt_spriteram[0x80];
97 
98 	/* sound state */
99 	uint8_t       m_turbo_osel;
100 	uint8_t       m_turbo_bsel;
101 	uint8_t       m_sound_state[3];
102 
103 	/* video state */
104 	tilemap_t * m_fg_tilemap;
105 
106 	/* Turbo-specific states */
107 	uint8_t       m_turbo_opa;
108 	uint8_t       m_turbo_opb;
109 	uint8_t       m_turbo_opc;
110 	uint8_t       m_turbo_ipa;
111 	uint8_t       m_turbo_ipb;
112 	uint8_t       m_turbo_ipc;
113 	uint8_t       m_turbo_fbpla;
114 	uint8_t       m_turbo_fbcol;
115 	uint8_t       m_turbo_speed;
116 	uint8_t       m_turbo_collision;
117 	uint8_t       m_turbo_last_analog;
118 	uint8_t       m_turbo_accel;
119 
120 	/* Subroc-specific states */
121 	uint8_t       m_subroc3d_col;
122 	uint8_t       m_subroc3d_ply;
123 	uint8_t       m_subroc3d_flip;
124 	uint8_t       m_subroc3d_mdis;
125 	uint8_t       m_subroc3d_mdir;
126 	uint8_t       m_subroc3d_tdis;
127 	uint8_t       m_subroc3d_tdir;
128 	uint8_t       m_subroc3d_fdis;
129 	uint8_t       m_subroc3d_fdir;
130 	uint8_t       m_subroc3d_hdis;
131 	uint8_t       m_subroc3d_hdir;
132 
133 	/* Buck Rogers-specific states */
134 	uint8_t       m_buckrog_fchg;
135 	uint8_t       m_buckrog_mov;
136 	uint8_t       m_buckrog_obch;
137 	uint8_t       m_buckrog_command;
138 	uint8_t       m_buckrog_myship;
139 	int m_last_sound_a;
140 
141 	struct sprite_info
142 	{
143 		uint16_t  ve;                 /* VE0-15 signals for this row */
144 		uint8_t   lst;                /* LST0-7 signals for this row */
145 		uint32_t  latched[8];         /* latched pixel data */
146 		uint8_t   plb[8];             /* latched PLB state */
147 		uint32_t  offset[8];          /* current offset for this row */
148 		uint32_t  frac[8];            /* leftover fraction */
149 		uint32_t  step[8];            /* stepping value */
150 	};
151 
152 	void scanlines_w(uint8_t data);
153 	void digit_w(uint8_t data);
154 	uint8_t turbo_collision_r();
155 	void turbo_collision_clear_w(uint8_t data);
156 	void turbo_analog_reset_w(uint8_t data);
157 	DECLARE_WRITE_LINE_MEMBER(coin_meter_1_w);
158 	DECLARE_WRITE_LINE_MEMBER(coin_meter_2_w);
159 	DECLARE_WRITE_LINE_MEMBER(start_lamp_w);
160 	uint8_t buckrog_cpu2_command_r();
161 	uint8_t buckrog_port_2_r();
162 	uint8_t buckrog_port_3_r();
163 	void turbo_videoram_w(offs_t offset, uint8_t data);
164 	void buckrog_bitmap_w(offs_t offset, uint8_t data);
165 	void turbo_ppi0a_w(uint8_t data);
166 	void turbo_ppi0b_w(uint8_t data);
167 	void turbo_ppi0c_w(uint8_t data);
168 	void turbo_ppi1a_w(uint8_t data);
169 	void turbo_ppi1b_w(uint8_t data);
170 	void turbo_ppi1c_w(uint8_t data);
171 	void turbo_ppi3c_w(uint8_t data);
172 	void subroc3d_ppi0a_w(uint8_t data);
173 	void subroc3d_ppi0c_w(uint8_t data);
174 	void subroc3d_ppi0b_w(uint8_t data);
175 	void buckrog_ppi0a_w(uint8_t data);
176 	void buckrog_ppi0b_w(uint8_t data);
177 	void buckrog_ppi0c_w(uint8_t data);
178 	void buckrog_ppi1c_w(uint8_t data);
179 	uint8_t turbo_analog_r();
180 	void buckrog_i8255_0_w(offs_t offset, uint8_t data);
181 	uint8_t spriteram_r(offs_t offset);
182 	void spriteram_w(offs_t offset, uint8_t data);
183 
184 	TILE_GET_INFO_MEMBER(get_fg_tile_info);
185 	DECLARE_VIDEO_START(turbo);
186 	void turbo_palette(palette_device &palette) const;
187 	void subroc3d_palette(palette_device &palette) const;
188 	DECLARE_MACHINE_RESET(buckrog);
189 	DECLARE_VIDEO_START(buckrog);
190 	void buckrog_palette(palette_device &palette) const;
191 	uint32_t screen_update_turbo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
192 	uint32_t screen_update_subroc3d(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
193 	uint32_t screen_update_buckrog(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
194 	TIMER_CALLBACK_MEMBER(delayed_i8255_w);
195 	void turbo_sound_a_w(u8 data);
196 	void turbo_sound_b_w(u8 data);
197 	void turbo_sound_c_w(u8 data);
198 	void subroc3d_sound_a_w(u8 data);
199 	void subroc3d_sound_b_w(u8 data);
200 	void subroc3d_sound_c_w(u8 data);
201 	void buckrog_sound_a_w(u8 data);
202 	void buckrog_sound_b_w(u8 data);
203 	inline uint32_t sprite_xscale(uint8_t dacinput, double vr1, double vr2, double cext);
204 	void turbo_prepare_sprites(uint8_t y, sprite_info *info);
205 	uint32_t turbo_get_sprite_bits(uint8_t road, sprite_info *sprinfo);
206 	void subroc3d_prepare_sprites(uint8_t y, sprite_info *info);
207 	uint32_t subroc3d_get_sprite_bits(sprite_info *sprinfo, uint8_t *plb);
208 	void buckrog_prepare_sprites(uint8_t y, sprite_info *info);
209 	uint32_t buckrog_get_sprite_bits(sprite_info *sprinfo, uint8_t *plb);
210 	void turbo_rom_decode();
211 	void turbo_update_samples();
212 	inline void subroc3d_update_volume(int leftchan, uint8_t dis, uint8_t dir);
213 	void buckrog_update_samples();
214 
215 	void buckrog_cpu2_map(address_map &map);
216 	void buckrog_cpu2_portmap(address_map &map);
217 	void buckrog_map(address_map &map);
218 	void decrypted_opcodes_map(address_map &map);
219 	void subroc3d_map(address_map &map);
220 	void turbo_map(address_map &map);
221 };
222 
223 #endif // MAME_INCLUDES_TURBO_H
224