1 // license:GPL-2.0+
2 // copyright-holders:Peter Trauner, Robbbert
3 // thanks-to:Manfred Schneider
4 /*****************************************************************************
5  *
6  * includes/vc4000.h
7  *
8  ****************************************************************************/
9 #ifndef MAME_INCLUDES_VC4000_H
10 #define MAME_INCLUDES_VC4000_H
11 
12 #pragma once
13 
14 #include "audio/vc4000.h"
15 #include "cpu/s2650/s2650.h"
16 #include "imagedev/snapquik.h"
17 #include "imagedev/cassette.h"
18 
19 #include "bus/vc4000/slot.h"
20 #include "bus/vc4000/rom.h"
21 
22 #include "emupal.h"
23 #include "screen.h"
24 
25 // define this to use digital inputs instead of the slow
26 // autocentering analog mame joys
27 #define ANALOG_HACK
28 
29 
30 class vc4000_state : public driver_device
31 {
32 public:
vc4000_state(const machine_config & mconfig,device_type type,const char * tag)33 	vc4000_state(const machine_config &mconfig, device_type type, const char *tag) :
34 		driver_device(mconfig, type, tag),
35 		m_maincpu(*this, "maincpu"),
36 		m_screen(*this, "screen"),
37 		m_cassette(*this, "cassette"),
38 		m_cart(*this, "cartslot"),
39 		m_custom(*this, "custom"),
40 		m_keypad1_1(*this, "KEYPAD1_1"),
41 		m_keypad1_2(*this, "KEYPAD1_2"),
42 		m_keypad1_3(*this, "KEYPAD1_3"),
43 		m_panel(*this, "PANEL"),
44 		m_keypad2_1(*this, "KEYPAD2_1"),
45 		m_keypad2_2(*this, "KEYPAD2_2"),
46 		m_keypad2_3(*this, "KEYPAD2_3"),
47 #ifndef ANALOG_HACK
48 		m_io_joy1_x(*this, "JOY1_X"),
49 		m_io_joy1_y(*this, "JOY1_Y"),
50 		m_io_joy2_x(*this, "JOY2_X"),
51 		m_io_joy2_y(*this, "JOY2_Y")
52 #else
53 		m_joys(*this, "JOYS"),
54 		m_config(*this, "CONFIG")
55 #endif
56 	{ }
57 
58 	void cx3000tc(machine_config &config);
59 	void mpu1000(machine_config &config);
60 	void vc4000(machine_config &config);
61 	void database(machine_config &config);
62 	void h21(machine_config &config);
63 	void rwtrntcs(machine_config &config);
64 	void elektor(machine_config &config);
65 
66 private:
67 	struct SPRITE_HELPER
68 	{
69 		uint8_t bitmap[10],x1,x2,y1,y2, res1, res2;
70 	};
71 
72 	struct SPRITE
73 	{
74 		const SPRITE_HELPER *data;
75 		int mask;
76 		int state;
77 		int delay;
78 		int size;
79 		int y;
80 		uint8_t scolor;
81 		int finished;
82 		int finished_now;
83 	};
84 
85 	struct vc4000_video_t
86 	{
87 		SPRITE sprites[4];
88 		int line;
89 		uint8_t sprite_collision;
90 		uint8_t background_collision;
91 		union
92 		{
93 			uint8_t data[0x100];
94 			struct
95 			{
96 				SPRITE_HELPER sprites[3];
97 				uint8_t res[0x10];
98 				SPRITE_HELPER sprite4;
99 				uint8_t res2[0x30];
100 				uint8_t grid[20][2];
101 				uint8_t grid_control[5];
102 				uint8_t res3[0x13];
103 				uint8_t sprite_sizes;
104 				uint8_t sprite_colors[2];
105 				uint8_t score_control;
106 				uint8_t res4[2];
107 				uint8_t background;
108 				uint8_t sound;
109 				uint8_t bcd[2];
110 				uint8_t background_collision;
111 				uint8_t sprite_collision;
112 			} d;
113 		} reg;
114 	} ;
115 
116 	void vc4000_sound_ctl(offs_t offset, uint8_t data);
117 	uint8_t vc4000_key_r(offs_t offset);
118 	uint8_t vc4000_video_r(offs_t offset);
119 	void vc4000_video_w(offs_t offset, uint8_t data);
120 	DECLARE_READ_LINE_MEMBER(vc4000_vsync_r);
121 	uint8_t elektor_cass_r();
122 	void elektor_cass_w(uint8_t data);
123 	vc4000_video_t m_video;
124 	uint8_t m_sprite_collision[0x20];
125 	uint8_t m_background_collision[0x20];
126 	uint8_t m_joy1_x;
127 	uint8_t m_joy1_y;
128 	uint8_t m_joy2_x;
129 	uint8_t m_joy2_y;
130 	uint8_t m_objects[512];
131 	uint8_t m_irq_pause;
132 	std::unique_ptr<bitmap_ind16> m_bitmap;
133 	virtual void machine_start() override;
134 	virtual void video_start() override;
135 	void vc4000_palette(palette_device &palette) const;
136 	uint32_t screen_update_vc4000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
137 	INTERRUPT_GEN_MEMBER(vc4000_video_line);
138 	DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
139 
140 	void elektor_mem(address_map &map);
141 	void vc4000_mem(address_map &map);
142 
143 	required_device<s2650_device> m_maincpu;
144 	required_device<screen_device> m_screen;
145 	optional_device<cassette_image_device> m_cassette;
146 	required_device<vc4000_cart_slot_device> m_cart;
147 	required_device<vc4000_sound_device> m_custom;
148 	required_ioport m_keypad1_1;
149 	required_ioport m_keypad1_2;
150 	required_ioport m_keypad1_3;
151 	required_ioport m_panel;
152 	required_ioport m_keypad2_1;
153 	required_ioport m_keypad2_2;
154 	required_ioport m_keypad2_3;
155 #ifndef ANALOG_HACK
156 	required_ioport m_io_joy1_x;
157 	required_ioport m_io_joy1_y;
158 	required_ioport m_io_joy2_x;
159 	required_ioport m_io_joy2_y;
160 #else
161 	required_ioport m_joys;
162 	required_ioport m_config;
163 #endif
164 	inline uint8_t vc4000_joystick_return_to_centre(uint8_t joy);
165 	void vc4000_draw_digit(bitmap_ind16 &bitmap, int x, int y, int d, int line);
166 	inline void vc4000_collision_plot(uint8_t *collision, uint8_t data, uint8_t color, int scale);
167 	void vc4000_sprite_update(bitmap_ind16 &bitmap, uint8_t *collision, SPRITE *This);
168 	inline void vc4000_draw_grid(uint8_t *collision);
169 };
170 
171 #endif // MAME_INCLUDES_VC4000_H
172