1 // license:BSD-3-Clause
2 // copyright-holders:Pierpaolo Prazzoli
3 #ifndef MAME_INCLUDES_N8080_H
4 #define MAME_INCLUDES_N8080_H
5 
6 #pragma once
7 
8 #include "cpu/i8085/i8085.h"
9 #include "cpu/mcs48/mcs48.h"
10 #include "machine/timer.h"
11 #include "sound/dac.h"
12 #include "sound/sn76477.h"
13 #include "emupal.h"
14 #include "screen.h"
15 
16 class n8080_state : public driver_device
17 {
18 public:
n8080_state(const machine_config & mconfig,device_type type,const char * tag)19 	n8080_state(const machine_config &mconfig, device_type type, const char *tag) :
20 		driver_device(mconfig, type, tag),
21 		m_videoram(*this, "videoram"),
22 		m_maincpu(*this, "maincpu"),
23 		m_audiocpu(*this, "audiocpu"),
24 		m_n8080_dac(*this, "n8080_dac"),
25 		m_sn(*this, "snsnd"),
26 		m_screen(*this, "screen"),
27 		m_palette(*this, "palette")
28 	{ }
29 
30 protected:
31 	virtual void machine_start() override;
32 	virtual void machine_reset() override;
33 
34 	virtual void sound_pins_changed();
35 	virtual void update_SN76477_status();
36 	virtual void delayed_sound_1(int data);
37 	virtual void delayed_sound_2(int data);
38 
39 //private:
40 	/* memory pointers */
41 	required_shared_ptr<uint8_t> m_videoram;
42 
43 	/* video-related */
44 	int m_sheriff_color_mode;
45 	int m_sheriff_color_data;
46 
47 	/* sound-related */
48 	emu_timer* m_sound_timer[3];
49 	uint16_t m_prev_sound_pins;
50 	uint16_t m_curr_sound_pins;
51 	int m_mono_flop[3];
52 	uint8_t m_prev_snd_data;
53 
54 	/* other */
55 	unsigned m_shift_data;
56 	unsigned m_shift_bits;
57 	int m_inte;
58 
59 	/* devices */
60 	required_device<i8080_cpu_device> m_maincpu;
61 	required_device<i8035_device> m_audiocpu;
62 	optional_device<dac_bit_interface> m_n8080_dac;
63 	optional_device<sn76477_device> m_sn;
64 	required_device<screen_device> m_screen;
65 	required_device<palette_device> m_palette;
66 
67 	void n8080_shift_bits_w(uint8_t data);
68 	void n8080_shift_data_w(uint8_t data);
69 	uint8_t n8080_shift_r();
70 	void n8080_video_control_w(uint8_t data);
71 	void n8080_sound_1_w(uint8_t data);
72 	void n8080_sound_2_w(uint8_t data);
73 	uint8_t n8080_8035_p1_r();
74 	DECLARE_READ_LINE_MEMBER(n8080_8035_t0_r);
75 	DECLARE_READ_LINE_MEMBER(n8080_8035_t1_r);
76 	void n8080_dac_w(uint8_t data);
77 	DECLARE_WRITE_LINE_MEMBER(n8080_inte_callback);
78 	void n8080_status_callback(uint8_t data);
79 	void n8080_palette(palette_device &palette) const;
80 	TIMER_DEVICE_CALLBACK_MEMBER(rst1_tick);
81 	TIMER_DEVICE_CALLBACK_MEMBER(rst2_tick);
82 	void start_mono_flop( int n, const attotime &expire );
83 	void stop_mono_flop( int n );
84 	TIMER_CALLBACK_MEMBER( stop_mono_flop_callback );
85 	TIMER_CALLBACK_MEMBER( delayed_sound_1_callback );
86 	TIMER_CALLBACK_MEMBER( delayed_sound_2_callback );
87 
88 	void main_cpu_map(address_map &map);
89 	void main_io_map(address_map &map);
90 	void n8080_sound_cpu_map(address_map &map);
91 };
92 
93 class spacefev_state : public n8080_state
94 {
95 public:
spacefev_state(const machine_config & mconfig,device_type type,const char * tag)96 	spacefev_state(const machine_config &mconfig, device_type type, const char *tag) :
97 		n8080_state(mconfig, type, tag)
98 	{ }
99 
100 	void spacefev(machine_config &config);
101 
102 protected:
103 	virtual void machine_reset() override;
104 	virtual void sound_start() override;
105 	virtual void sound_reset() override;
106 	virtual void video_start() override;
107 
108 	virtual void sound_pins_changed() override;
109 	virtual void update_SN76477_status() override;
110 	virtual void delayed_sound_1(int data) override;
111 	virtual void delayed_sound_2(int data) override;
112 
113 private:
114 	void spacefev_sound(machine_config &config);
115 
116 	TIMER_DEVICE_CALLBACK_MEMBER(vco_voltage_timer);
117 
118 	TIMER_CALLBACK_MEMBER(stop_red_cannon);
119 	void start_red_cannon();
120 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
121 
122 	emu_timer* m_cannon_timer;
123 	int m_red_screen;
124 	int m_red_cannon;
125 };
126 
127 class sheriff_state : public n8080_state
128 {
129 public:
sheriff_state(const machine_config & mconfig,device_type type,const char * tag)130 	sheriff_state(const machine_config &mconfig, device_type type, const char *tag) :
131 		n8080_state(mconfig, type, tag)
132 	{ }
133 
134 	void sheriff(machine_config &config);
135 	void westgun2(machine_config &config);
136 
137 protected:
138 	virtual void machine_reset() override;
139 	virtual void sound_start() override;
140 	virtual void sound_reset() override;
141 	virtual void video_start() override;
142 
143 	virtual void sound_pins_changed() override;
144 	virtual void update_SN76477_status() override;
145 
146 private:
147 	void sheriff_sound(machine_config &config);
148 
149 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
150 };
151 
152 class helifire_state : public n8080_state
153 {
154 public:
helifire_state(const machine_config & mconfig,device_type type,const char * tag)155 	helifire_state(const machine_config &mconfig, device_type type, const char *tag) :
156 		n8080_state(mconfig, type, tag),
157 		m_dac(*this, "helifire_dac"),
158 		m_colorram(*this, "colorram")
159 	{ }
160 
161 	void helifire(machine_config &config);
162 
163 protected:
164 	virtual void machine_reset() override;
165 	virtual void sound_start() override;
166 	virtual void sound_reset() override;
167 	virtual void video_start() override;
168 
169 	virtual void sound_pins_changed() override;
170 	virtual void delayed_sound_2(int data) override;
171 
172 private:
173 	void helifire_sound(machine_config &config);
174 
175 	TIMER_DEVICE_CALLBACK_MEMBER(dac_volume_timer);
176 	DECLARE_READ_LINE_MEMBER(helifire_8035_t0_r);
177 	DECLARE_READ_LINE_MEMBER(helifire_8035_t1_r);
178 	uint8_t helifire_8035_external_ram_r();
179 	uint8_t helifire_8035_p2_r();
180 	void sound_ctrl_w(uint8_t data);
181 	void sound_io_map(address_map &map);
182 
183 	void helifire_palette(palette_device &palette) const;
184 	void next_line();
185 	DECLARE_WRITE_LINE_MEMBER(screen_vblank);
186 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
187 	void main_cpu_map(address_map &map);
188 
189 	required_device<dac_8bit_r2r_device> m_dac;
190 	required_shared_ptr<uint8_t> m_colorram;
191 
192 	int m_dac_phase;
193 	double m_dac_volume;
194 	double m_dac_timing;
195 
196 	int m_flash;
197 	uint8_t m_LSFR[63];
198 	unsigned m_mv;
199 	unsigned m_sc; // IC56
200 };
201 
202 
203 #endif // MAME_INCLUDES_N8080_H
204