1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /************************************************************************* 4 5 Driver for Midway V-Unit games 6 7 **************************************************************************/ 8 9 #include "audio/dcs.h" 10 #include "bus/ata/ataintf.h" 11 #include "machine/adc0844.h" 12 #include "machine/midwayic.h" 13 #include "machine/timer.h" 14 #include "machine/watchdog.h" 15 #include "video/poly.h" 16 #include "emupal.h" 17 #include "screen.h" 18 19 #define MIDVUNIT_VIDEO_CLOCK 33000000 20 21 struct midvunit_object_data 22 { 23 uint16_t * destbase; 24 uint8_t * texbase; 25 uint16_t pixdata; 26 uint8_t dither; 27 }; 28 29 class midvunit_state; 30 31 class midvunit_renderer : public poly_manager<float, midvunit_object_data, 2, 4000> 32 { 33 public: 34 midvunit_renderer(midvunit_state &state); 35 void process_dma_queue(); 36 void make_vertices_inclusive(vertex_t *vert); 37 38 private: 39 midvunit_state &m_state; 40 41 void render_flat(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); 42 void render_tex(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); 43 void render_textrans(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); 44 void render_textransmask(int32_t scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); 45 }; 46 47 class midvunit_state : public driver_device 48 { 49 public: midvunit_state(const machine_config & mconfig,device_type type,const char * tag)50 midvunit_state(const machine_config &mconfig, device_type type, const char *tag) 51 : driver_device(mconfig, type, tag), 52 m_videoram(*this, "videoram", 32), 53 m_textureram(*this, "textureram"), 54 m_screen(*this, "screen"), 55 m_nvram(*this, "nvram"), 56 m_ram_base(*this, "ram_base"), 57 m_fastram_base(*this, "fastram_base"), 58 m_tms32031_control(*this, "32031_control"), 59 m_midvplus_misc(*this, "midvplus_misc"), 60 m_maincpu(*this, "maincpu"), 61 m_watchdog(*this, "watchdog"), 62 m_palette(*this, "palette"), 63 m_adc(*this, "adc"), 64 m_midway_serial_pic2(*this, "serial_pic2"), 65 m_midway_ioasic(*this, "ioasic"), 66 m_ata(*this, "ata"), 67 m_timer(*this, "timer%u", 0U), 68 m_dcs(*this, "dcs"), 69 m_generic_paletteram_32(*this, "paletteram"), 70 m_optional_drivers(*this, "lamp%u", 0U), 71 m_in1(*this, "IN1"), 72 m_dsw(*this, "DSW"), 73 m_motion(*this, "MOTION") { } 74 75 void midvcommon(machine_config &config); 76 void crusnwld(machine_config &config); 77 void midvplus(machine_config &config); 78 void offroadc(machine_config &config); 79 void midvunit(machine_config &config); 80 81 void init_crusnu40(); 82 void init_crusnu21(); 83 void init_crusnwld(); 84 void init_wargods(); 85 void init_offroadc(); 86 void init_crusnusa(); 87 88 uint16_t m_page_control; 89 uint16_t m_dma_data[16]; 90 uint8_t m_video_changed; 91 92 required_shared_ptr<uint16_t> m_videoram; 93 required_shared_ptr<uint32_t> m_textureram; 94 required_device<screen_device> m_screen; 95 96 DECLARE_CUSTOM_INPUT_MEMBER(motion_r); 97 98 private: 99 enum 100 { 101 TIMER_SCANLINE 102 }; 103 104 optional_shared_ptr<uint32_t> m_nvram; 105 required_shared_ptr<uint32_t> m_ram_base; 106 optional_shared_ptr<uint32_t> m_fastram_base; 107 required_shared_ptr<uint32_t> m_tms32031_control; 108 optional_shared_ptr<uint32_t> m_midvplus_misc; 109 110 uint8_t m_cmos_protected; 111 uint16_t m_control_data; 112 uint8_t m_adc_shift; 113 uint16_t m_last_port0; 114 uint8_t m_shifter_state; 115 double m_timer_rate; 116 uint16_t m_bit_index; 117 int m_lastval; 118 uint32_t *m_generic_speedup; 119 uint16_t m_video_regs[16]; 120 uint8_t m_dma_data_index; 121 emu_timer *m_scanline_timer; 122 std::unique_ptr<midvunit_renderer> m_poly; 123 uint8_t m_galil_input_index; 124 uint8_t m_galil_input_length; 125 const char *m_galil_input; 126 uint8_t m_galil_output_index; 127 char m_galil_output[450]; 128 uint8_t m_wheel_board_output; 129 uint32_t m_wheel_board_last; 130 uint32_t m_wheel_board_u8_latch; 131 uint8_t m_comm_flags; 132 uint16_t m_comm_data; 133 void midvunit_dma_queue_w(uint32_t data); 134 uint32_t midvunit_dma_queue_entries_r(); 135 uint32_t midvunit_dma_trigger_r(offs_t offset); 136 void midvunit_page_control_w(uint32_t data); 137 uint32_t midvunit_page_control_r(); 138 void midvunit_video_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 139 uint32_t midvunit_scanline_r(); 140 void midvunit_videoram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 141 uint32_t midvunit_videoram_r(offs_t offset); 142 void midvunit_paletteram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 143 void midvunit_textureram_w(offs_t offset, uint32_t data); 144 uint32_t midvunit_textureram_r(offs_t offset); 145 uint32_t port0_r(); 146 uint32_t adc_r(); 147 void adc_w(uint32_t data); 148 void midvunit_cmos_protect_w(uint32_t data); 149 void midvunit_cmos_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 150 uint32_t midvunit_cmos_r(offs_t offset); 151 void midvunit_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 152 void crusnwld_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 153 void midvunit_sound_w(uint32_t data); 154 uint32_t tms32031_control_r(offs_t offset); 155 void tms32031_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 156 uint32_t crusnwld_serial_status_r(); 157 uint32_t crusnwld_serial_data_r(); 158 void crusnwld_serial_data_w(uint32_t data); 159 uint32_t bit_data_r(offs_t offset); 160 void bit_reset_w(uint32_t data); 161 uint32_t midvplus_misc_r(offs_t offset); 162 void midvplus_misc_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); 163 void midvplus_xf1_w(uint8_t data); 164 uint32_t generic_speedup_r(offs_t offset); 165 uint32_t midvunit_wheel_board_r(); 166 void midvunit_wheel_board_w(uint32_t data); 167 uint32_t midvunit_intcs_r(); 168 uint32_t midvunit_comcs_r(offs_t offset); 169 void midvunit_comcs_w(offs_t offset, uint32_t data); 170 void set_input(const char *s); 171 void init_crusnwld_common(offs_t speedup); 172 void init_crusnusa_common(offs_t speedup); 173 virtual void machine_start() override; 174 virtual void machine_reset() override; 175 virtual void video_start() override; 176 DECLARE_MACHINE_RESET(midvplus); 177 uint32_t screen_update_midvunit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 178 TIMER_CALLBACK_MEMBER(scanline_timer_cb); 179 required_device<tms32031_device> m_maincpu; 180 required_device<watchdog_timer_device> m_watchdog; 181 required_device<palette_device> m_palette; 182 optional_device<adc0844_device> m_adc; 183 optional_device<midway_serial_pic2_device> m_midway_serial_pic2; 184 optional_device<midway_ioasic_device> m_midway_ioasic; 185 optional_device<ata_interface_device> m_ata; 186 required_device_array<timer_device, 2> m_timer; 187 required_device<dcs_audio_device> m_dcs; 188 required_shared_ptr<uint32_t> m_generic_paletteram_32; 189 output_finder<8> m_optional_drivers; 190 optional_ioport m_in1; 191 optional_ioport m_dsw; 192 optional_ioport m_motion; 193 void postload(); 194 195 uint16_t comm_bus_out(); 196 uint16_t comm_bus_in(); 197 198 void midvplus_map(address_map &map); 199 void midvunit_map(address_map &map); 200 201 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 202 }; 203