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