1 // license:BSD-3-Clause 2 // copyright-holders:Philip Bennett 3 /************************************************************************* 4 5 Microprose Games 3D hardware 6 7 *************************************************************************/ 8 #ifndef MAME_INCLUDES_MICRO3D_H 9 #define MAME_INCLUDES_MICRO3D_H 10 11 #pragma once 12 13 #include "cpu/tms34010/tms34010.h" 14 #include "cpu/mcs51/mcs51.h" 15 #include "sound/upd7759.h" 16 #include "machine/adc0844.h" 17 #include "machine/mc68681.h" 18 #include "machine/scn_pci.h" 19 #include "emupal.h" 20 21 22 #define HOST_MONITOR_DISPLAY 0 23 #define VGB_MONITOR_DISPLAY 0 24 #define DRMATH_MONITOR_DISPLAY 0 25 26 27 class micro3d_sound_device; 28 29 class micro3d_state : public driver_device 30 { 31 public: micro3d_state(const machine_config & mconfig,device_type type,const char * tag)32 micro3d_state(const machine_config &mconfig, device_type type, const char *tag) : 33 driver_device(mconfig, type, tag), 34 m_maincpu(*this, "maincpu"), 35 m_audiocpu(*this, "audiocpu"), 36 m_upd7759(*this, "upd7759"), 37 m_drmath(*this, "drmath"), 38 m_vgb(*this, "vgb"), 39 m_palette(*this, "palette"), 40 m_duart(*this, "duart"), 41 m_noise_1(*this, "noise_1"), 42 m_noise_2(*this, "noise_2"), 43 m_adc(*this, "adc"), 44 m_vertex(*this, "vertex"), 45 m_sound_sw(*this, "SOUND_SW"), 46 m_volume(*this, "VOLUME"), 47 m_joystick_x(*this, "JOYSTICK_X"), 48 m_joystick_y(*this, "JOYSTICK_Y"), 49 m_shared_ram(*this, "shared_ram"), 50 m_mac_sram(*this, "mac_sram"), 51 m_sprite_vram(*this, "sprite_vram"), 52 m_vgb_uart(*this, "uart") 53 { } 54 55 void micro3d(machine_config &config); 56 void botss11(machine_config &config); 57 58 void init_micro3d(); 59 void init_botss(); 60 61 DECLARE_READ_LINE_MEMBER(botss_hwchk_r); 62 63 protected: 64 enum 65 { 66 TIMER_MAC_DONE 67 }; 68 69 virtual void machine_reset() override; 70 virtual void video_start() override; 71 virtual void video_reset() override; 72 73 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 74 75 private: 76 enum planes 77 { 78 CLIP_Z_MIN, 79 CLIP_Z_MAX, 80 CLIP_X_MIN, 81 CLIP_X_MAX, 82 CLIP_Y_MIN, 83 CLIP_Y_MAX 84 }; 85 86 struct micro3d_vtx 87 { 88 int32_t x, y, z; 89 90 constexpr int64_t dot_product(micro3d_vtx const &that) const; 91 }; 92 93 required_device<cpu_device> m_maincpu; 94 required_device<i8051_device> m_audiocpu; 95 required_device<upd7759_device> m_upd7759; 96 required_device<cpu_device> m_drmath; 97 required_device<tms34010_device> m_vgb; 98 required_device<palette_device> m_palette; 99 required_device<mc68681_device> m_duart; 100 required_device<micro3d_sound_device> m_noise_1; 101 required_device<micro3d_sound_device> m_noise_2; 102 optional_device<adc0844_device> m_adc; 103 required_memory_region m_vertex; 104 105 required_ioport m_sound_sw; 106 required_ioport m_volume; 107 optional_ioport m_joystick_x; 108 optional_ioport m_joystick_y; 109 110 required_shared_ptr<uint16_t> m_shared_ram; 111 uint8_t m_m68681_tx0; 112 113 /* Sound */ 114 uint8_t m_sound_port_latch[4]; 115 116 /* Hardware version-check latch for BOTSS 1.1a */ 117 uint8_t m_botss_latch; 118 119 /* MAC */ 120 required_shared_ptr<uint32_t> m_mac_sram; 121 uint32_t m_sram_r_addr; 122 uint32_t m_sram_w_addr; 123 uint32_t m_vtx_addr; 124 uint32_t m_mrab11; 125 uint32_t m_mac_stat; 126 uint32_t m_mac_inst; 127 128 /* 2D video */ 129 required_shared_ptr<uint16_t> m_sprite_vram; 130 uint16_t m_creg; 131 uint16_t m_xfer3dk; 132 133 /* 3D pipeline */ 134 uint32_t m_pipe_data; 135 uint32_t m_pipeline_state; 136 int32_t m_vtx_fifo[512]; 137 uint32_t m_fifo_idx; 138 uint32_t m_draw_cmd; 139 int m_draw_state; 140 int32_t m_x_min; 141 int32_t m_x_max; 142 int32_t m_y_min; 143 int32_t m_y_max; 144 int32_t m_z_min; 145 int32_t m_z_max; 146 int32_t m_x_mid; 147 int32_t m_y_mid; 148 int m_dpram_bank; 149 uint32_t m_draw_dpram[1024]; 150 std::unique_ptr<uint16_t[]> m_frame_buffers[2]; 151 std::unique_ptr<uint16_t[]> m_tmp_buffer; 152 int m_drawing_buffer; 153 int m_display_buffer; 154 155 void vgb_uart_w(offs_t offset, uint8_t data); 156 uint8_t vgb_uart_r(offs_t offset); 157 void micro3d_mac1_w(uint32_t data); 158 uint32_t micro3d_mac2_r(); 159 void micro3d_mac2_w(uint32_t data); 160 uint16_t micro3d_encoder_h_r(); 161 uint16_t micro3d_encoder_l_r(); 162 uint8_t adc_volume_r(); 163 uint16_t botss_140000_r(); 164 uint16_t botss_180000_r(); 165 void micro3d_reset_w(uint16_t data); 166 void host_drmath_int_w(uint16_t data); 167 void micro3d_shared_w(offs_t offset, uint32_t data); 168 uint32_t micro3d_shared_r(offs_t offset); 169 void drmath_int_w(uint32_t data); 170 void drmath_intr2_ack(uint32_t data); 171 void micro3d_creg_w(uint16_t data); 172 void micro3d_xfer3dk_w(uint16_t data); 173 void micro3d_fifo_w(uint32_t data); 174 void micro3d_alt_fifo_w(uint32_t data); 175 uint32_t micro3d_pipe_r(); 176 void micro3d_snd_dac_a(uint8_t data); 177 void micro3d_snd_dac_b(uint8_t data); 178 void micro3d_sound_p1_w(uint8_t data); 179 void micro3d_sound_p3_w(uint8_t data); 180 uint8_t micro3d_sound_p1_r(); 181 uint8_t micro3d_sound_p3_r(); 182 INTERRUPT_GEN_MEMBER(micro3d_vblank); 183 TIMER_CALLBACK_MEMBER(mac_done_callback); 184 void micro3d_upd7759_w(uint8_t data); 185 void data_from_i8031(uint8_t data); 186 uint8_t data_to_i8031(); 187 DECLARE_WRITE_LINE_MEMBER(duart_irq_handler); 188 uint8_t duart_input_r(); 189 void duart_output_w(uint8_t data); 190 DECLARE_WRITE_LINE_MEMBER(duart_txb); 191 DECLARE_WRITE_LINE_MEMBER(tms_interrupt); 192 TMS340X0_SCANLINE_IND16_CB_MEMBER(scanline_update); 193 194 /* 3D graphics */ 195 int inside(micro3d_vtx *v, enum planes plane); 196 micro3d_vtx intersect(micro3d_vtx *v1, micro3d_vtx *v2, enum planes plane); 197 inline void write_span(uint32_t y, uint32_t x); 198 void draw_line(uint32_t x1, uint32_t y1, uint32_t x2, uint32_t y2); 199 void rasterise_spans(uint32_t min_y, uint32_t max_y, uint32_t attr); 200 int clip_triangle(micro3d_vtx *v, micro3d_vtx *vout, int num_vertices, enum planes plane); 201 void draw_triangles(uint32_t attr); 202 203 void cpu_space_map(address_map &map); 204 void drmath_data(address_map &map); 205 void drmath_prg(address_map &map); 206 void hostmem(address_map &map); 207 void soundmem_io(address_map &map); 208 void soundmem_prg(address_map &map); 209 void vgbmem(address_map &map); 210 211 required_device<scn2651_device> m_vgb_uart; 212 }; 213 214 #endif // MAME_INCLUDES_MICRO3D_H 215