1 // license:BSD-3-Clause
2 // copyright-holders:Zsolt Vasvari
3 /***************************************************************************
4 
5     Exidy Car Polo hardware
6 
7     driver by Zsolt Vasvari
8 
9 ****************************************************************************/
10 #ifndef MAME_INCLUDES_CARPOLO_H
11 #define MAME_INCLUDES_CARPOLO_H
12 
13 #pragma once
14 
15 #include "cpu/m6502/m6502.h"
16 #include "machine/6821pia.h"
17 #include "machine/7474.h"
18 #include "machine/74148.h"
19 #include "machine/74153.h"
20 #include "machine/netlist.h"
21 #include "netlist/nl_setup.h"
22 #include "audio/nl_carpolo.h"
23 #include "emupal.h"
24 
25 class carpolo_state : public driver_device
26 {
27 public:
carpolo_state(const machine_config & mconfig,device_type type,const char * tag)28 	carpolo_state(const machine_config &mconfig, device_type type, const char *tag)
29 		: driver_device(mconfig, type, tag)
30 		, m_maincpu(*this, "maincpu")
31 		, m_ttl74148_3s(*this, "74148_3s")
32 		, m_ttl74153_1k(*this, "74153_1k")
33 		, m_ttl7474_2s_1(*this, "7474_2s_1")
34 		, m_ttl7474_2s_2(*this, "7474_2s_2")
35 		, m_ttl7474_2u_1(*this, "7474_2u_1")
36 		, m_ttl7474_2u_2(*this, "7474_2u_2")
37 		, m_ttl7474_1f_1(*this, "7474_1f_1")
38 		, m_ttl7474_1f_2(*this, "7474_1f_2")
39 		, m_ttl7474_1d_1(*this, "7474_1d_1")
40 		, m_ttl7474_1d_2(*this, "7474_1d_2")
41 		, m_ttl7474_1c_1(*this, "7474_1c_1")
42 		, m_ttl7474_1c_2(*this, "7474_1c_2")
43 		, m_ttl7474_1a_1(*this, "7474_1a_1")
44 		, m_ttl7474_1a_2(*this, "7474_1a_2")
45 		, m_gfxdecode(*this, "gfxdecode")
46 		, m_palette(*this, "palette")
47 		, m_alpharam(*this, "alpharam")
48 		, m_spriteram(*this, "spriteram")
49 		, m_user1(*this, "user1")
50 		, m_dial(*this, "DIAL%u", 0U)
51 		, m_in(*this, "IN%u", 0U)
52 		, m_pedals(*this, "PEDALS")
53 		, m_player_crash(*this, "sound_nl:player_crash%u", 1U)
54 	{ }
55 
56 	void init_carpolo();
57 	void carpolo(machine_config &config);
58 
59 protected:
60 	virtual void machine_start() override;
61 	virtual void machine_reset() override;
62 	virtual void video_start() override;
63 
64 private:
65 	uint8_t m_ball_screen_collision_cause;
66 	uint8_t m_car_ball_collision_x;
67 	uint8_t m_car_ball_collision_y;
68 	uint8_t m_car_car_collision_cause;
69 	uint8_t m_car_goal_collision_cause;
70 	uint8_t m_car_ball_collision_cause;
71 	uint8_t m_car_border_collision_cause;
72 	uint8_t m_priority_0_extension;
73 	uint8_t m_last_wheel_value[4];
74 	int m_ls153_za;
75 	int m_ls153_zb;
76 	required_device<m6502_device> m_maincpu;
77 	required_device<ttl74148_device> m_ttl74148_3s;
78 	required_device<ttl153_device> m_ttl74153_1k;
79 	required_device<ttl7474_device> m_ttl7474_2s_1;
80 	required_device<ttl7474_device> m_ttl7474_2s_2;
81 	required_device<ttl7474_device> m_ttl7474_2u_1;
82 	required_device<ttl7474_device> m_ttl7474_2u_2;
83 	required_device<ttl7474_device> m_ttl7474_1f_1;
84 	required_device<ttl7474_device> m_ttl7474_1f_2;
85 	required_device<ttl7474_device> m_ttl7474_1d_1;
86 	required_device<ttl7474_device> m_ttl7474_1d_2;
87 	required_device<ttl7474_device> m_ttl7474_1c_1;
88 	required_device<ttl7474_device> m_ttl7474_1c_2;
89 	required_device<ttl7474_device> m_ttl7474_1a_1;
90 	required_device<ttl7474_device> m_ttl7474_1a_2;
91 	required_device<gfxdecode_device> m_gfxdecode;
92 	required_device<palette_device> m_palette;
93 	required_shared_ptr<uint8_t> m_alpharam;
94 	required_shared_ptr<uint8_t> m_spriteram;
95 	required_memory_region m_user1;
96 	required_ioport_array<4> m_dial;
97 	required_ioport_array<3> m_in;
98 	required_ioport m_pedals;
99 
100 	std::unique_ptr<bitmap_ind16> m_sprite_sprite_collision_bitmap1;
101 	std::unique_ptr<bitmap_ind16> m_sprite_sprite_collision_bitmap2;
102 	std::unique_ptr<bitmap_ind16> m_sprite_goal_collision_bitmap1;
103 	std::unique_ptr<bitmap_ind16> m_sprite_goal_collision_bitmap2;
104 	std::unique_ptr<bitmap_ind16> m_sprite_border_collision_bitmap;
105 
106 	uint8_t ball_screen_collision_cause_r();
107 	uint8_t car_ball_collision_x_r();
108 	uint8_t car_ball_collision_y_r();
109 	uint8_t car_car_collision_cause_r();
110 	uint8_t car_goal_collision_cause_r();
111 	uint8_t car_ball_collision_cause_r();
112 	uint8_t car_border_collision_cause_r();
113 	uint8_t interrupt_cause_r();
114 	void ball_screen_interrupt_clear_w(uint8_t data);
115 	void car_car_interrupt_clear_w(uint8_t data);
116 	void car_goal_interrupt_clear_w(uint8_t data);
117 	void car_ball_interrupt_clear_w(uint8_t data);
118 	void car_border_interrupt_clear_w(uint8_t data);
119 	void timer_interrupt_clear_w(uint8_t data);
120 	void carpolo_palette(palette_device &palette) const;
121 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
122 	DECLARE_WRITE_LINE_MEMBER(screen_vblank);
123 	DECLARE_WRITE_LINE_MEMBER(coin1_interrupt_clear_w);
124 	DECLARE_WRITE_LINE_MEMBER(coin2_interrupt_clear_w);
125 	DECLARE_WRITE_LINE_MEMBER(coin3_interrupt_clear_w);
126 	DECLARE_WRITE_LINE_MEMBER(coin4_interrupt_clear_w);
127 	void pia_0_port_a_w(uint8_t data);
128 	void pia_0_port_b_w(uint8_t data);
129 	uint8_t pia_0_port_b_r();
130 	uint8_t pia_1_port_a_r();
131 	uint8_t pia_1_port_b_r();
132 	DECLARE_WRITE_LINE_MEMBER(ttl7474_2s_1_q_cb);
133 	DECLARE_WRITE_LINE_MEMBER(ttl7474_2s_2_q_cb);
134 	DECLARE_WRITE_LINE_MEMBER(ttl7474_2u_1_q_cb);
135 	DECLARE_WRITE_LINE_MEMBER(ttl7474_2u_2_q_cb);
136 	DECLARE_WRITE_LINE_MEMBER(ls153_za_w);
137 	DECLARE_WRITE_LINE_MEMBER(ls153_zb_w);
138 
139 	void ttl74148_3s_cb(uint8_t data);
140 
141 	void timer_tick();
142 	void remap_sprite_code(int bank, int code, int *remapped_code, int *flipy);
143 	void normalize_coordinates(int *x1, int *y1, int *x2, int *y2);
144 	int check_sprite_left_goal_collision(int x1, int y1, int code1, int flipy1, int goalpost_only);
145 	int check_sprite_right_goal_collision(int x1, int y1, int code1, int flipy1, int goalpost_only);
146 	int check_sprite_border_collision(uint8_t x1, uint8_t y1, int code1, int flipy1);
147 	void generate_ball_screen_interrupt(uint8_t cause);
148 	void generate_car_car_interrupt(int car1, int car2);
149 	void generate_car_goal_interrupt(int car, int right_goal);
150 	void generate_car_ball_interrupt(int car, int car_x, int car_y);
151 	void generate_car_border_interrupt(int car, int horizontal_border);
152 	void draw_alpha_line(bitmap_ind16 &bitmap, const rectangle &cliprect, int alpha_line, int video_line);
153 	void draw_sprite(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t x, uint8_t y, int bank, int code, int col);
154 	int check_sprite_sprite_collision(int x1, int y1, int code1, int flipy1,
155 										int x2, int y2, int code2, int flipy2,
156 										int *col_x, int *col_y);
157 	void main_map(address_map &map);
158 
159 	required_device_array<netlist_mame_logic_input_device, 4> m_player_crash;
160 };
161 
162 #endif // MAME_INCLUDES_CARPOLO_H
163