1 // license:BSD-3-Clause
2 // copyright-holders:Dan Boris, Olivier Galibert, Aaron Giles
3 /***************************************************************************
4 
5     Star Fire/Fire One system
6 
7 ***************************************************************************/
8 #ifndef MAME_INCLUDES_STARFIRE_H
9 #define MAME_INCLUDES_STARFIRE_H
10 
11 #pragma once
12 
13 #include "machine/netlist.h"
14 #include "machine/pit8253.h"
15 #include "netlist/nl_setup.h"
16 #include "audio/nl_fireone.h"
17 #include "audio/nl_starfire.h"
18 #include "sound/dac.h"
19 #include "screen.h"
20 
21 
22 #define STARFIRE_MASTER_CLOCK   (XTAL(20'000'000))
23 #define STARFIRE_CPU_CLOCK      (STARFIRE_MASTER_CLOCK / 8)
24 #define STARFIRE_PIXEL_CLOCK    (STARFIRE_MASTER_CLOCK / 4)
25 #define STARFIRE_HTOTAL         (0x13f)  /* could be 0x140, but I think this is right */
26 #define STARFIRE_HBEND          (0x000)
27 #define STARFIRE_HBSTART        (0x100)
28 #define STARFIRE_VTOTAL         (0x106)
29 #define STARFIRE_VBEND          (0x020)
30 #define STARFIRE_VBSTART        (0x100)
31 #define STARFIRE_NUM_PENS       (0x40)
32 
33 
34 class starfire_base_state : public driver_device
35 {
36 public:
starfire_base_state(const machine_config & mconfig,device_type type,const char * tag)37 	starfire_base_state(const machine_config &mconfig, device_type type, const char *tag)
38 		: driver_device(mconfig, type, tag)
39 		, m_maincpu(*this, "maincpu")
40 		, m_screen(*this, "screen")
41 		, m_colorram(*this, "colorram")
42 		, m_videoram(*this, "videoram")
43 		, m_dsw(*this, "DSW")
44 		, m_system(*this, "SYSTEM")
45 	{ }
46 
47 protected:
48 	virtual void video_start() override;
49 
50 	void base_config(machine_config &config);
51 	void main_map(address_map &map);
52 
53 	required_device<cpu_device> m_maincpu;
54 	required_device<screen_device> m_screen;
55 	required_shared_ptr<uint8_t> m_colorram;
56 	required_shared_ptr<uint8_t> m_videoram;
57 	required_ioport m_dsw;
58 	required_ioport m_system;
59 
60 	uint8_t m_vidctrl;
61 	uint8_t m_vidctrl1;
62 	uint8_t m_color;
63 	uint16_t m_colors[STARFIRE_NUM_PENS];
64 
65 	emu_timer* m_scanline_timer;
66 	bitmap_rgb32 m_screen_bitmap;
67 
68 	virtual uint8_t input_r(offs_t offset) = 0;
69 	virtual void sound_w(offs_t offset, uint8_t data) = 0;
music_w(offs_t offset,uint8_t data)70 	virtual void music_w(offs_t offset, uint8_t data) { };
71 
72 	void scratch_w(offs_t offset, uint8_t data);
73 	uint8_t scratch_r(offs_t offset);
74 	void colorram_w(offs_t offset, uint8_t data);
75 	uint8_t colorram_r(offs_t offset);
76 	void videoram_w(offs_t offset, uint8_t data);
77 	uint8_t videoram_r(offs_t offset);
78 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
79 	TIMER_CALLBACK_MEMBER(scanline_callback);
80 	void get_pens(pen_t *pens);
81 	void scanline_callback(uint32_t data);
82 };
83 
84 class starfire_state : public starfire_base_state
85 {
86 public:
starfire_state(const machine_config & mconfig,device_type type,const char * tag)87 	starfire_state(const machine_config &mconfig, device_type type, const char *tag)
88 		: starfire_base_state(mconfig, type, tag)
89 		, m_dac(*this, "dac") // just to have a sound device
90 		, m_nmi(*this, "NMI")
91 		, m_stickz(*this, "STICKZ")
92 		, m_stickx(*this, "STICKX")
93 		, m_sticky(*this, "STICKY")
94 		, m_sound_size(*this, "sound_nl:size")
95 		, m_sound_explosion(*this, "sound_nl:sexplo")
96 		, m_sound_tie(*this, "sound_nl:stie")
97 		, m_sound_laser(*this, "sound_nl:slaser")
98 		, m_sound_track(*this, "sound_nl:track")
99 		, m_sound_lock(*this, "sound_nl:lock")
100 		, m_sound_scanner(*this, "sound_nl:scanner")
101 		, m_sound_overheat(*this, "sound_nl:oheat")
102 	{ }
103 
104 	void starfire(machine_config &config);
105 
106 private:
107 	virtual void machine_start() override;
108 	virtual void machine_reset() override;
109 
110 	required_device<dac_word_interface> m_dac;
111 
112 	required_ioport m_nmi;
113 	required_ioport m_stickz;
114 	required_ioport m_stickx;
115 	required_ioport m_sticky;
116 
117 	virtual uint8_t input_r(offs_t offset) override;
118 	virtual void sound_w(offs_t offset, uint8_t data) override;
119 
120 	INTERRUPT_GEN_MEMBER(vblank_int);
121 
122 	NETDEV_ANALOG_CALLBACK_MEMBER(tieon1_cb);
123 	NETDEV_ANALOG_CALLBACK_MEMBER(laseron1_cb);
124 	NETDEV_ANALOG_CALLBACK_MEMBER(sound_out_cb);
125 
126 	uint8_t m_sound_tie_on;
127 	uint8_t m_sound_laser_on;
128 
129 	required_device<netlist_mame_logic_input_device> m_sound_size;
130 	required_device<netlist_mame_logic_input_device> m_sound_explosion;
131 	required_device<netlist_mame_logic_input_device> m_sound_tie;
132 	required_device<netlist_mame_logic_input_device> m_sound_laser;
133 	required_device<netlist_mame_logic_input_device> m_sound_track;
134 	required_device<netlist_mame_logic_input_device> m_sound_lock;
135 	required_device<netlist_mame_logic_input_device> m_sound_scanner;
136 	required_device<netlist_mame_logic_input_device> m_sound_overheat;
137 };
138 
139 class fireone_state : public starfire_base_state
140 {
141 public:
fireone_state(const machine_config & mconfig,device_type type,const char * tag)142 	fireone_state(const machine_config &mconfig, device_type type, const char *tag)
143 		: starfire_base_state(mconfig, type, tag)
144 		, m_pit(*this, "pit")
145 		, m_controls(*this, "P%u", 1U)
146 		, m_sound_left_partial_hit(*this, "sound_nl:lshpht")
147 		, m_sound_right_partial_hit(*this, "sound_nl:rshpht")
148 		, m_sound_left_torpedo(*this, "sound_nl:ltorp")
149 		, m_sound_right_torpedo(*this, "sound_nl:rtorp")
150 		, m_sound_left_boom(*this, "sound_nl:lboom")
151 		, m_sound_right_boom(*this, "sound_nl:rboom")
152 		, m_sound_torpedo_collision(*this, "sound_nl:torpcoll")
153 		, m_sound_submarine_engine(*this, "sound_nl:subeng")
154 		, m_sound_alert(*this, "sound_nl:alert")
155 		, m_sound_sonar_enable(*this, "sound_nl:sonar_enable")
156 		, m_sound_sonar_sync(*this, "sound_nl:sonar_sync")
157 		, m_sound_off_left(*this, "sound_nl:lsound_off")
158 		, m_sound_off_right(*this, "sound_nl:rsound_off")
159 		, m_music_a(*this, "sound_nl:music_a")
160 		, m_music_b(*this, "sound_nl:music_b")
161 		, m_music_c(*this, "sound_nl:music_c")
162 	{ }
163 
164 	void fireone(machine_config &config);
165 
166 private:
167 	virtual void machine_start() override;
168 	virtual void machine_reset() override;
169 
170 	required_device<pit8253_device> m_pit;
171 	required_ioport_array<2> m_controls;
172 
173 	DECLARE_WRITE_LINE_MEMBER(music_a_out_cb);
174 	DECLARE_WRITE_LINE_MEMBER(music_b_out_cb);
175 	DECLARE_WRITE_LINE_MEMBER(music_c_out_cb);
176 
177 	virtual uint8_t input_r(offs_t offset) override;
178 	virtual void sound_w(offs_t offset, uint8_t data) override;
179 	virtual void music_w(offs_t offset, uint8_t data) override;
180 
181 	uint8_t m_player_select;
182 
183 	INTERRUPT_GEN_MEMBER(vblank_int);
184 
185 	required_device<netlist_mame_logic_input_device> m_sound_left_partial_hit;
186 	required_device<netlist_mame_logic_input_device> m_sound_right_partial_hit;
187 	required_device<netlist_mame_logic_input_device> m_sound_left_torpedo;
188 	required_device<netlist_mame_logic_input_device> m_sound_right_torpedo;
189 	required_device<netlist_mame_logic_input_device> m_sound_left_boom;
190 	required_device<netlist_mame_logic_input_device> m_sound_right_boom;
191 	required_device<netlist_mame_logic_input_device> m_sound_torpedo_collision;
192 	required_device<netlist_mame_logic_input_device> m_sound_submarine_engine;
193 	required_device<netlist_mame_logic_input_device> m_sound_alert;
194 	required_device<netlist_mame_logic_input_device> m_sound_sonar_enable;
195 	required_device<netlist_mame_logic_input_device> m_sound_sonar_sync;
196 	required_device<netlist_mame_logic_input_device> m_sound_off_left;
197 	required_device<netlist_mame_logic_input_device> m_sound_off_right;
198 	required_device<netlist_mame_logic_input_device> m_music_a;
199 	required_device<netlist_mame_logic_input_device> m_music_b;
200 	required_device<netlist_mame_logic_input_device> m_music_c;
201 };
202 
203 #endif // MAME_INCLUDES_STARFIRE_H
204