1 // license:BSD-3-Clause 2 // copyright-holders:R. Belmont, Ville Linde 3 #ifndef MAME_INCLUDES_MODEL3_H 4 #define MAME_INCLUDES_MODEL3_H 5 6 #pragma once 7 8 #include "cpu/powerpc/ppc.h" 9 #include "video/poly.h" 10 #include "bus/scsi/scsi.h" 11 #include "machine/53c810.h" 12 #include "audio/dsbz80.h" 13 #include "machine/eepromser.h" 14 #include "machine/i8251.h" 15 #include "sound/scsp.h" 16 #include "machine/315_5649.h" 17 #include "machine/315-5881_crypt.h" 18 #include "machine/segabill.h" 19 #include "machine/msm6242.h" 20 #include "machine/timer.h" 21 #include "emupal.h" 22 #include "screen.h" 23 #include "tilemap.h" 24 25 typedef float MATRIX[4][4]; 26 typedef float VECTOR[4]; 27 typedef float VECTOR3[3]; 28 29 struct cached_texture 30 { 31 cached_texture *next; 32 uint8_t width; 33 uint8_t height; 34 uint8_t format; 35 uint8_t alpha; 36 rgb_t data[1]; 37 }; 38 39 struct m3_vertex 40 { 41 float x; 42 float y; 43 float z; 44 float u; 45 float v; 46 float nx; 47 float ny; 48 float nz; 49 }; 50 51 typedef frustum_clip_vertex<float, 4> m3_clip_vertex; 52 53 struct m3_triangle 54 { 55 m3_clip_vertex v[3]; 56 57 cached_texture *texture; 58 int param; 59 int transparency; 60 int color; 61 }; 62 63 class model3_renderer; 64 65 class model3_state : public driver_device 66 { 67 public: model3_state(const machine_config & mconfig,device_type type,const char * tag)68 model3_state(const machine_config &mconfig, device_type type, const char *tag) : 69 driver_device(mconfig, type, tag), 70 m_maincpu(*this,"maincpu"), 71 m_lsi53c810(*this, "lsi53c810"), 72 m_audiocpu(*this, "audiocpu"), 73 m_scsp1(*this, "scsp1"), 74 m_eeprom(*this, "eeprom"), 75 m_screen(*this, "screen"), 76 m_rtc(*this, "rtc"), 77 m_io(*this, "io"), 78 m_work_ram(*this, "work_ram"), 79 m_paletteram64(*this, "paletteram64"), 80 m_dsbz80(*this, DSBZ80_TAG), 81 m_uart(*this, "uart"), 82 m_soundram(*this, "soundram"), 83 m_gfxdecode(*this, "gfxdecode"), 84 m_palette(*this, "palette"), 85 m_cryptdevice(*this, "315_5881"), 86 m_billboard(*this, "billboard") 87 { 88 m_step15_with_mpc106 = false; 89 m_step20_with_old_real3d = false; 90 } 91 92 void add_cpu_66mhz(machine_config &config); 93 void add_cpu_100mhz(machine_config &config); 94 void add_cpu_166mhz(machine_config &config); 95 96 void add_base_devices(machine_config &config); 97 void add_scsi_devices(machine_config &config); 98 void add_crypt_devices(machine_config &config); 99 100 void model3_21_5881(machine_config &config); 101 void model3_20_5881(machine_config &config); 102 void model3_15(machine_config &config); 103 void model3_10(machine_config &config); 104 void model3_20(machine_config &config); 105 void model3_21(machine_config &config); 106 107 void getbass(machine_config &config); 108 void scud(machine_config &config); 109 void lostwsga(machine_config &config); 110 111 void init_lemans24(); 112 void init_vs298(); 113 void init_vs299(); 114 void init_swtrilgy(); 115 void init_scudplus(); 116 void init_model3_20(); 117 void init_bass(); 118 void init_vs2(); 119 void init_daytona2(); 120 void init_eca(); 121 void init_srally2(); 122 void init_harleya(); 123 void init_skichamp(); 124 void init_spikeofe(); 125 void init_scud(); 126 void init_harley(); 127 void init_swtrilga(); 128 void init_swtrilgp(); 129 void init_vs29815(); 130 void init_model3_10(); 131 void init_vs215(); 132 void init_getbass(); 133 void init_scudplusa(); 134 void init_dirtdvls(); 135 void init_vf3(); 136 void init_von2(); 137 void init_lostwsga(); 138 void init_oceanhun(); 139 void init_dayto2pe(); 140 void init_spikeout(); 141 void init_magtruck(); 142 void init_lamachin(); 143 void init_model3_15(); 144 145 private: 146 required_device<ppc_device> m_maincpu; 147 optional_device<lsi53c810_device> m_lsi53c810; 148 required_device<cpu_device> m_audiocpu; 149 required_device<scsp_device> m_scsp1; 150 required_device<eeprom_serial_93cxx_device> m_eeprom; 151 required_device<screen_device> m_screen; 152 required_device<rtc72421_device> m_rtc; 153 required_device<sega_315_5649_device> m_io; 154 155 required_shared_ptr<uint64_t> m_work_ram; 156 required_shared_ptr<uint64_t> m_paletteram64; 157 optional_device<dsbz80_device> m_dsbz80; // Z80-based MPEG Digital Sound Board 158 optional_device<i8251_device> m_uart; 159 required_shared_ptr<uint16_t> m_soundram; 160 161 required_device<gfxdecode_device> m_gfxdecode; 162 required_device<palette_device> m_palette; 163 optional_device<sega_315_5881_crypt_device> m_cryptdevice; 164 165 required_device<sega_billboard_device> m_billboard; 166 167 tilemap_t *m_layer4[4]; 168 tilemap_t *m_layer8[4]; 169 170 int m_sound_irq_enable; 171 emu_timer *m_sound_timer; 172 emu_timer *m_real3d_dma_timer; 173 emu_timer *m_scan_timer; 174 uint8_t m_irq_enable; 175 uint8_t m_irq_state; 176 uint8_t m_scsi_irq_state; 177 int m_crom_bank; 178 int m_controls_bank; 179 bool m_step15_with_mpc106; 180 bool m_step20_with_old_real3d; 181 uint32_t m_real3d_device_id; 182 int m_pci_bus; 183 int m_pci_device; 184 int m_pci_function; 185 int m_pci_reg; 186 uint32_t m_mpc105_regs[0x40]; 187 uint32_t m_mpc105_addr; 188 uint32_t m_mpc106_regs[0x40]; 189 uint32_t m_mpc106_addr; 190 uint32_t m_dma_data; 191 uint32_t m_dma_status; 192 uint32_t m_dma_source; 193 uint32_t m_dma_dest; 194 uint32_t m_dma_endian; 195 uint32_t m_dma_irq; 196 uint32_t m_dma_busy; 197 uint64_t m_controls_2; 198 uint64_t m_controls_3; 199 uint8_t m_serial_fifo1; 200 uint8_t m_serial_fifo2; 201 int m_lightgun_reg_sel; 202 int m_adc_channel; 203 uint64_t m_real3d_status; 204 int m_prot_data_ptr; 205 std::unique_ptr<uint32_t[]> m_vrom; 206 int m_step; 207 int m_m3_step; 208 int32_t m_tap_state; 209 uint64_t m_ir; 210 uint8_t m_id_data[32]; 211 int32_t m_id_size; 212 int m_tdo; 213 uint16_t m_layer_priority; 214 uint32_t m_layer_modulate_r; 215 uint32_t m_layer_modulate_g; 216 uint32_t m_layer_modulate_b; 217 uint32_t m_layer_modulate1; 218 uint32_t m_layer_modulate2; 219 uint64_t m_layer_scroll[2]; 220 std::unique_ptr<uint64_t[]> m_m3_char_ram; 221 std::unique_ptr<uint64_t[]> m_m3_tile_ram; 222 std::unique_ptr<uint32_t[]> m_texture_fifo; 223 int m_texture_fifo_pos; 224 std::unique_ptr<uint16_t[]> m_texture_ram[2]; 225 std::unique_ptr<uint32_t[]> m_display_list_ram; 226 std::unique_ptr<uint32_t[]> m_culling_ram; 227 std::unique_ptr<uint32_t[]> m_polygon_ram; 228 int m_real3d_display_list; 229 rectangle m_clip3d; 230 rectangle *m_screen_clip; 231 VECTOR3 m_parallel_light; 232 float m_parallel_light_intensity; 233 float m_ambient_light_intensity; 234 uint64_t m_vid_reg0; 235 int m_matrix_stack_ptr; 236 int m_list_depth; 237 MATRIX *m_matrix_stack; 238 MATRIX m_coordinate_system; 239 MATRIX m_projection_matrix; 240 float m_viewport_x; 241 float m_viewport_y; 242 float m_viewport_width; 243 float m_viewport_height; 244 float m_viewport_near; 245 float m_viewport_far; 246 uint32_t m_matrix_base_address; 247 cached_texture *m_texcache[2][1024/32][2048/32]; 248 249 model3_renderer *m_renderer; 250 m3_triangle* m_tri_buffer; 251 m3_triangle* m_tri_alpha_buffer; 252 int m_tri_buffer_ptr; 253 int m_tri_alpha_buffer_ptr; 254 int m_viewport_tri_index[4]; 255 int m_viewport_tri_alpha_index[4]; 256 257 uint32_t rtc72421_r(offs_t offset); 258 void rtc72421_w(offs_t offset, uint32_t data); 259 uint64_t model3_char_r(offs_t offset); 260 void model3_char_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 261 uint64_t model3_tile_r(offs_t offset); 262 void model3_tile_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 263 uint64_t model3_vid_reg_r(offs_t offset); 264 void model3_vid_reg_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 265 void model3_palette_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 266 uint64_t model3_palette_r(offs_t offset); 267 void real3d_display_list_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 268 void real3d_polygon_ram_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 269 void real3d_cmd_w(uint64_t data); 270 uint64_t mpc105_addr_r(offs_t offset, uint64_t mem_mask = ~0); 271 void mpc105_addr_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 272 uint64_t mpc105_data_r(); 273 void mpc105_data_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 274 uint64_t mpc105_reg_r(offs_t offset); 275 void mpc105_reg_w(offs_t offset, uint64_t data); 276 void mpc105_init(); 277 uint64_t mpc106_addr_r(offs_t offset, uint64_t mem_mask = ~0); 278 void mpc106_addr_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 279 uint64_t mpc106_data_r(offs_t offset, uint64_t mem_mask = ~0); 280 void mpc106_data_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 281 uint64_t mpc106_reg_r(offs_t offset); 282 void mpc106_reg_w(offs_t offset, uint64_t data); 283 void mpc106_init(); 284 uint64_t scsi_r(offs_t offset, uint64_t mem_mask = ~0); 285 void scsi_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 286 uint64_t real3d_dma_r(offs_t offset, uint64_t mem_mask = ~0); 287 void real3d_dma_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 288 289 void eeprom_w(uint8_t data); 290 uint8_t input_r(); 291 void lostwsga_ser1_w(uint8_t data); 292 uint8_t lostwsga_ser2_r(); 293 void lostwsga_ser2_w(uint8_t data); 294 295 uint64_t model3_sys_r(offs_t offset, uint64_t mem_mask = ~0); 296 void model3_sys_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 297 uint64_t model3_rtc_r(offs_t offset, uint64_t mem_mask = ~0); 298 void model3_rtc_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 299 uint64_t real3d_status_r(offs_t offset); 300 uint8_t model3_sound_r(offs_t offset); 301 void model3_sound_w(offs_t offset, uint8_t data); 302 303 void daytona2_rombank_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); 304 void model3snd_ctrl(uint16_t data); 305 uint32_t pci_device_get_reg(); 306 void pci_device_set_reg(uint32_t value); 307 void configure_fast_ram(); 308 void interleave_vroms(); 309 310 DECLARE_MACHINE_START(model3_10); 311 DECLARE_MACHINE_RESET(model3_10); 312 DECLARE_MACHINE_START(model3_15); 313 DECLARE_MACHINE_RESET(model3_15); 314 DECLARE_MACHINE_START(model3_20); 315 DECLARE_MACHINE_RESET(model3_20); 316 DECLARE_MACHINE_START(model3_21); 317 DECLARE_MACHINE_RESET(model3_21); 318 TIMER_CALLBACK_MEMBER(model3_sound_timer_tick); 319 TIMER_CALLBACK_MEMBER(real3d_dma_timer_callback); 320 TIMER_CALLBACK_MEMBER(model3_scan_timer_tick); 321 TIMER_DEVICE_CALLBACK_MEMBER(model3_interrupt); 322 void model3_exit(); 323 void scsp_irq(offs_t offset, uint8_t data); 324 void real3d_dma_callback(uint32_t src, uint32_t dst, int length, int byteswap); 325 uint32_t scsi_fetch(uint32_t dsp); 326 void scsi_irq_callback(int state); 327 void update_irq_state(); 328 void set_irq_line(uint8_t bit, int line); 329 void model3_init(int step); 330 // video 331 virtual void video_start() override; 332 uint32_t screen_update_model3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 333 TILE_GET_INFO_MEMBER(tile_info_layer0_4bit); 334 TILE_GET_INFO_MEMBER(tile_info_layer1_4bit); 335 TILE_GET_INFO_MEMBER(tile_info_layer2_4bit); 336 TILE_GET_INFO_MEMBER(tile_info_layer3_4bit); 337 TILE_GET_INFO_MEMBER(tile_info_layer0_8bit); 338 TILE_GET_INFO_MEMBER(tile_info_layer1_8bit); 339 TILE_GET_INFO_MEMBER(tile_info_layer2_8bit); 340 TILE_GET_INFO_MEMBER(tile_info_layer3_8bit); 341 void reset_triangle_buffers(); 342 m3_triangle* push_triangle(bool alpha); 343 void draw_layer(bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, int sx, int sy, int prio); 344 void invalidate_texture(int page, int texx, int texy, int texwidth, int texheight); 345 cached_texture *get_texture(int page, int texx, int texy, int texwidth, int texheight, int format); 346 inline void write_texture16(int xpos, int ypos, int width, int height, int page, uint16_t *data); 347 inline void write_texture8(int xpos, int ypos, int width, int height, int page, int upper, int lower, uint16_t *data); 348 void real3d_upload_texture(uint32_t header, uint32_t *data); 349 void init_matrix_stack(); 350 void get_top_matrix(MATRIX *out); 351 void push_matrix_stack(); 352 void pop_matrix_stack(); 353 void multiply_matrix_stack(MATRIX matrix); 354 void translate_matrix_stack(float x, float y, float z); 355 void draw_model(uint32_t addr); 356 uint32_t *get_memory_pointer(uint32_t address); 357 void set_projection(float left, float right, float top, float bottom, float near, float far); 358 void load_matrix(int matrix_num, MATRIX *out); 359 void traverse_list4(int lod_num, uint32_t address); 360 void traverse_list(uint32_t address); 361 inline void process_link(uint32_t address, uint32_t link); 362 void draw_block(uint32_t address); 363 void draw_viewport(int pri, uint32_t address); 364 void real3d_traverse_display_list(); 365 void real3d_display_list_end(); 366 void real3d_display_list1_dma(uint32_t src, uint32_t dst, int length, int byteswap); 367 void real3d_display_list2_dma(uint32_t src, uint32_t dst, int length, int byteswap); 368 void real3d_vrom_texture_dma(uint32_t src, uint32_t dst, int length, int byteswap); 369 void real3d_texture_fifo_dma(uint32_t src, int length, int byteswap); 370 void real3d_polygon_ram_dma(uint32_t src, uint32_t dst, int length, int byteswap); 371 // machine 372 void insert_id(uint32_t id, int32_t start_bit); 373 int tap_read(); 374 void tap_write(int tck, int tms, int tdi, int trst); 375 void tap_reset(); 376 void tap_set_asic_ids(); 377 378 uint16_t crypt_read_callback(uint32_t addr); 379 380 void model3_5881_mem(address_map &map); 381 void model3_10_mem(address_map &map); 382 void model3_mem(address_map &map); 383 void model3_snd(address_map &map); 384 void scsp1_map(address_map &map); 385 void scsp2_map(address_map &map); 386 void getbass_iocpu_mem(address_map &map); 387 void getbass_iocpu_io(address_map &map); 388 }; 389 390 #endif // MAME_INCLUDES_MODEL3_H 391