1 // license:BSD-3-Clause
2 // copyright-holders:Mathis Rosenhauer
3 /*****************************************************************************
4  *
5  * includes/vectrex.h
6  *
7  ****************************************************************************/
8 #ifndef MAME_INCLUDES_VECTREX_H
9 #define MAME_INCLUDES_VECTREX_H
10 
11 #pragma once
12 
13 #include "machine/6522via.h"
14 #include "sound/dac.h"
15 #include "sound/ay8910.h"
16 #include "video/vector.h"
17 
18 #include "bus/vectrex/slot.h"
19 #include "bus/vectrex/rom.h"
20 
21 #include "screen.h"
22 
23 #define NVECT 10000
24 
25 class vectrex_base_state : public driver_device
26 {
27 public:
28 	enum
29 	{
30 		TIMER_VECTREX_IMAGER_CHANGE_COLOR,
31 		TIMER_UPDATE_LEVEL,
32 		TIMER_VECTREX_IMAGER_EYE,
33 		TIMER_LIGHTPEN_TRIGGER,
34 		TIMER_VECTREX_REFRESH,
35 		TIMER_VECTREX_ZERO_INTEGRATORS,
36 		TIMER_UPDATE_SIGNAL
37 	};
38 
39 	void vectrex_cart(device_slot_interface &device);
40 
41 protected:
vectrex_base_state(const machine_config & mconfig,device_type type,const char * tag)42 	vectrex_base_state(const machine_config &mconfig, device_type type, const char *tag) :
43 		driver_device(mconfig, type, tag),
44 		m_maincpu(*this, "maincpu"),
45 		m_cart(*this, "cartslot"),
46 		m_via6522_0(*this, "via6522_0"),
47 		m_gce_vectorram(*this, "gce_vectorram"),
48 		m_dac(*this, "dac"),
49 		m_ay8912(*this, "ay8912"),
50 		m_vector(*this, "vector"),
51 		m_io_contr(*this, {"CONTR1X", "CONTR1Y", "CONTR2X", "CONTR2Y"}),
52 		m_io_buttons(*this, "BUTTONS"),
53 		m_io_3dconf(*this, "3DCONF"),
54 		m_io_lpenconf(*this, "LPENCONF"),
55 		m_io_lpenx(*this, "LPENX"),
56 		m_io_lpeny(*this, "LPENY"),
57 		m_screen(*this, "screen")
58 	{ }
59 
60 	void vectrex_psg_port_w(uint8_t data);
61 	uint8_t vectrex_via_r(offs_t offset);
62 	void vectrex_via_w(offs_t offset, uint8_t data);
63 	virtual void driver_start() override;
64 	virtual void video_start() override;
65 	uint32_t screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
66 	TIMER_CALLBACK_MEMBER(vectrex_imager_change_color);
67 	TIMER_CALLBACK_MEMBER(update_level);
68 	TIMER_CALLBACK_MEMBER(vectrex_imager_eye);
69 	TIMER_CALLBACK_MEMBER(lightpen_trigger);
70 	TIMER_CALLBACK_MEMBER(vectrex_refresh);
71 	TIMER_CALLBACK_MEMBER(vectrex_zero_integrators);
72 	TIMER_CALLBACK_MEMBER(update_signal);
73 	uint8_t vectrex_via_pb_r();
74 	uint8_t vectrex_via_pa_r();
75 	void v_via_pb_w(uint8_t data);
76 	void v_via_pa_w(uint8_t data);
77 	DECLARE_WRITE_LINE_MEMBER(v_via_ca2_w);
78 	DECLARE_WRITE_LINE_MEMBER(v_via_cb2_w);
79 	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
80 	DECLARE_WRITE_LINE_MEMBER(vectrex_via_irq);
81 
82 	void vectrex_base(machine_config &config);
83 
84 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
85 
86 	void configure_imager(bool reset_refresh, const double *imager_angles);
87 	void vectrex_configuration();
88 	void vectrex_multiplexer(int mux);
89 	void vectrex_add_point(int x, int y, rgb_t color, int intensity);
90 	void vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity);
91 
92 	unsigned char m_via_out[2];
93 
94 	required_device<cpu_device> m_maincpu;
95 	optional_device<vectrex_cart_slot_device> m_cart;
96 
97 	double m_imager_freq;
98 	emu_timer *m_imager_timer;
99 	emu_timer *m_lp_t;
100 
101 	required_device<via6522_device> m_via6522_0;
102 
103 private:
104 
105 	struct vectrex_point
106 	{
107 		int x; int y;
108 		rgb_t col;
109 		int intensity;
110 	};
111 
112 	required_shared_ptr<uint8_t> m_gce_vectorram;
113 	int m_imager_status;
114 	uint32_t m_beam_color;
115 	int m_lightpen_port;
116 	int m_reset_refresh;
117 	const double *m_imager_angles;
118 	rgb_t m_imager_colors[6];
119 	unsigned char m_imager_pinlevel;
120 	int m_old_mcontrol;
121 	double m_sl;
122 	double m_pwl;
123 	int m_x_center;
124 	int m_y_center;
125 	int m_x_max;
126 	int m_y_max;
127 	int m_x_int;
128 	int m_y_int;
129 	int m_lightpen_down;
130 	int m_pen_x;
131 	int m_pen_y;
132 	emu_timer *m_refresh;
133 	uint8_t m_blank;
134 	uint8_t m_ramp;
135 	int8_t m_analog[5];
136 	int m_point_index;
137 	int m_display_start;
138 	int m_display_end;
139 	vectrex_point m_points[NVECT];
140 	uint16_t m_via_timer2;
141 	attotime m_vector_start_time;
142 	uint8_t m_cb2;
143 	void (vectrex_base_state::*vector_add_point_function)(int, int, rgb_t, int);
144 
145 	required_device<mc1408_device> m_dac;
146 	required_device<ay8910_device> m_ay8912;
147 	required_device<vector_device> m_vector;
148 	optional_ioport_array<4> m_io_contr;
149 	required_ioport m_io_buttons;
150 	required_ioport m_io_3dconf;
151 	required_ioport m_io_lpenconf;
152 	required_ioport m_io_lpenx;
153 	required_ioport m_io_lpeny;
154 	required_device<screen_device> m_screen;
155 };
156 
157 
158 class vectrex_state : public vectrex_base_state
159 {
160 public:
vectrex_state(const machine_config & mconfig,device_type type,const char * tag)161 	vectrex_state(const machine_config &mconfig, device_type type, const char *tag) :
162 		vectrex_base_state(mconfig, type, tag)
163 	{ }
164 
165 	void vectrex(machine_config &config);
166 
167 protected:
168 	virtual void video_start() override;
169 	virtual void machine_start() override;
170 
171 	void vectrex_map(address_map &map);
172 };
173 
174 
175 class raaspec_state : public vectrex_base_state
176 {
177 public:
raaspec_state(const machine_config & mconfig,device_type type,const char * tag)178 	raaspec_state(const machine_config &mconfig, device_type type, const char *tag) :
179 		vectrex_base_state(mconfig, type, tag),
180 		m_io_coin(*this, "COIN")
181 	{ }
182 
183 	void raaspec(machine_config &config);
184 
185 protected:
186 	void raaspec_led_w(uint8_t data);
187 	uint8_t vectrex_s1_via_pb_r();
188 
189 	void raaspec_map(address_map &map);
190 
191 private:
192 	required_ioport m_io_coin;
193 };
194 
195 #endif // MAME_INCLUDES_VECTREX_H
196