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