trunk/src/mame/drivers/atarisy4.c
| r32596 | r32597 | |
| 17 | 17 | #include "emu.h" |
| 18 | 18 | #include "cpu/m68000/m68000.h" |
| 19 | 19 | #include "cpu/tms32010/tms32010.h" |
| 20 | | #include "video/polylgcy.h" |
| 20 | #include "video/poly.h" |
| 21 | 21 | |
| 22 | 22 | |
| 23 | struct atarisy4_polydata |
| 24 | { |
| 25 | UINT16 color; |
| 26 | UINT16 *screen_ram; |
| 27 | }; |
| 28 | |
| 29 | class atarisy4_state; |
| 30 | |
| 31 | class atarisy4_renderer : public poly_manager<float, atarisy4_polydata, 2, 8192> |
| 32 | { |
| 33 | public: |
| 34 | atarisy4_renderer(atarisy4_state &state, screen_device &screen); |
| 35 | ~atarisy4_renderer() {} |
| 36 | |
| 37 | void draw_scanline(INT32 scanline, const extent_t &extent, const atarisy4_polydata &extradata, int threadid); |
| 38 | void draw_polygon(UINT16 color); |
| 39 | |
| 40 | atarisy4_state &m_state; |
| 41 | }; |
| 42 | |
| 23 | 43 | class atarisy4_state : public driver_device |
| 24 | 44 | { |
| 25 | 45 | public: |
| 26 | 46 | atarisy4_state(const machine_config &mconfig, device_type type, const char *tag) |
| 27 | 47 | : driver_device(mconfig, type, tag), |
| 28 | | m_m68k_ram(*this, "m68k_ram"), |
| 29 | | m_screen_ram(*this, "screen_ram"), |
| 30 | 48 | m_maincpu(*this, "maincpu"), |
| 31 | 49 | m_dsp0(*this, "dsp0"), |
| 32 | 50 | m_dsp1(*this, "dsp1"), |
| 33 | | m_palette(*this, "palette") { } |
| 51 | m_palette(*this, "palette"), |
| 52 | m_screen(*this, "screen"), |
| 53 | m_m68k_ram(*this, "m68k_ram"), |
| 54 | m_screen_ram(*this, "screen_ram"), |
| 55 | m_dsp0_bank1(*this, "dsp0_bank1"), |
| 56 | m_dsp1_bank1(*this, "dsp1_bank1") { } |
| 57 | |
| 58 | required_device<cpu_device> m_maincpu; |
| 59 | required_device<cpu_device> m_dsp0; |
| 60 | optional_device<cpu_device> m_dsp1; |
| 61 | required_device<palette_device> m_palette; |
| 62 | required_device<screen_device> m_screen; |
| 63 | |
| 64 | required_shared_ptr<UINT16> m_m68k_ram; |
| 65 | required_shared_ptr<UINT16> m_screen_ram; |
| 66 | |
| 67 | required_memory_bank m_dsp0_bank1; |
| 68 | optional_memory_bank m_dsp1_bank1; |
| 34 | 69 | |
| 70 | atarisy4_renderer *m_renderer; |
| 71 | |
| 35 | 72 | UINT8 m_r_color_table[256]; |
| 36 | 73 | UINT8 m_g_color_table[256]; |
| 37 | 74 | UINT8 m_b_color_table[256]; |
| 38 | 75 | UINT16 m_dsp_bank[2]; |
| 39 | 76 | UINT8 m_csr[2]; |
| 40 | | required_shared_ptr<UINT16> m_m68k_ram; |
| 41 | 77 | UINT16 *m_shared_ram[2]; |
| 42 | | required_shared_ptr<UINT16> m_screen_ram; |
| 43 | | legacy_poly_manager *m_poly; |
| 78 | |
| 44 | 79 | DECLARE_WRITE16_MEMBER(gpu_w); |
| 45 | 80 | DECLARE_READ16_MEMBER(gpu_r); |
| 46 | 81 | DECLARE_READ16_MEMBER(m68k_shared_0_r); |
| r32596 | r32597 | |
| 65 | 100 | UINT32 screen_update_atarisy4(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 66 | 101 | INTERRUPT_GEN_MEMBER(vblank_int); |
| 67 | 102 | void image_mem_to_screen( bool clip); |
| 68 | | void draw_polygon(UINT16 color); |
| 69 | 103 | void execute_gpu_command(); |
| 70 | 104 | inline UINT8 hex_to_ascii(UINT8 in); |
| 71 | 105 | void load_ldafile(address_space &space, const UINT8 *file); |
| 72 | 106 | void load_hexfile(address_space &space, const UINT8 *file); |
| 73 | | required_device<cpu_device> m_maincpu; |
| 74 | | required_device<cpu_device> m_dsp0; |
| 75 | | optional_device<cpu_device> m_dsp1; |
| 76 | | required_device<palette_device> m_palette; |
| 77 | 107 | }; |
| 78 | 108 | |
| 79 | 109 | |
| r32596 | r32597 | |
| 135 | 165 | } gpu; |
| 136 | 166 | |
| 137 | 167 | |
| 138 | | |
| 139 | | |
| 140 | | struct poly_extra_data |
| 141 | | { |
| 142 | | UINT16 color; |
| 143 | | UINT16 *screen_ram; |
| 144 | | }; |
| 145 | | |
| 146 | | |
| 147 | 168 | /************************************* |
| 148 | 169 | * |
| 149 | | * Forward declarations |
| 150 | | * |
| 151 | | *************************************/ |
| 152 | | |
| 153 | | |
| 154 | | |
| 155 | | |
| 156 | | |
| 157 | | |
| 158 | | /************************************* |
| 159 | | * |
| 160 | 170 | * Video hardware |
| 161 | 171 | * |
| 162 | 172 | *************************************/ |
| 163 | 173 | |
| 164 | | void atarisy4_state::video_start() |
| 174 | atarisy4_renderer::atarisy4_renderer(atarisy4_state &state, screen_device &screen) |
| 175 | : poly_manager<float, atarisy4_polydata, 2, 8192>(screen, POLYFLAG_NO_WORK_QUEUE), |
| 176 | m_state(state) |
| 165 | 177 | { |
| 166 | | m_poly = poly_alloc(machine(), 1024, sizeof(poly_extra_data), POLYFLAG_NO_WORK_QUEUE); |
| 167 | 178 | } |
| 168 | 179 | |
| 180 | void atarisy4_state::video_start() |
| 181 | { |
| 182 | m_renderer = auto_alloc(machine(), atarisy4_renderer(*this, *m_screen)); |
| 183 | } |
| 184 | |
| 169 | 185 | void atarisy4_state::video_reset() |
| 170 | 186 | { |
| 171 | 187 | gpu.vblank_wait = 0; |
| r32596 | r32597 | |
| 260 | 276 | } |
| 261 | 277 | } |
| 262 | 278 | |
| 263 | | static void draw_scanline(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) |
| 279 | void atarisy4_renderer::draw_scanline(INT32 scanline, const extent_t &extent, const atarisy4_polydata &extradata, int threadid) |
| 264 | 280 | { |
| 265 | | const poly_extra_data *extra = (const poly_extra_data *)extradata; |
| 266 | | UINT16 color = extra->color; |
| 281 | UINT16 color = extradata.color; |
| 267 | 282 | int x; |
| 268 | 283 | |
| 269 | | for (x = extent->startx; x < extent->stopx; ++x) |
| 284 | for (x = extent.startx; x < extent.stopx; ++x) |
| 270 | 285 | { |
| 271 | 286 | UINT32 addr = xy_to_screen_addr(x, scanline); |
| 272 | | UINT16 pix = extra->screen_ram[addr >> 1]; |
| 287 | UINT16 pix = extradata.screen_ram[addr >> 1]; |
| 273 | 288 | |
| 274 | 289 | if (x & 1) |
| 275 | 290 | pix = (pix & (0x00ff)) | color << 8; |
| 276 | 291 | else |
| 277 | 292 | pix = (pix & (0xff00)) | color; |
| 278 | 293 | |
| 279 | | extra->screen_ram[addr >> 1] = pix; |
| 294 | extradata.screen_ram[addr >> 1] = pix; |
| 280 | 295 | } |
| 281 | 296 | } |
| 282 | 297 | |
| 283 | | void atarisy4_state::draw_polygon(UINT16 color) |
| 298 | void atarisy4_renderer::draw_polygon(UINT16 color) |
| 284 | 299 | { |
| 285 | | int i; |
| 286 | 300 | rectangle clip; |
| 287 | | poly_vertex v1, v2, v3; |
| 288 | | poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(m_poly); |
| 301 | vertex_t v1, v2, v3; |
| 302 | atarisy4_polydata &extradata = object_data_alloc(); |
| 303 | render_delegate rd_scan = render_delegate(FUNC(atarisy4_renderer::draw_scanline), this); |
| 289 | 304 | |
| 290 | 305 | clip.set(0, 511, 0, 511); |
| 291 | 306 | |
| 292 | | extra->color = color; |
| 293 | | extra->screen_ram = m_screen_ram; |
| 307 | extradata.color = color; |
| 308 | extradata.screen_ram = m_state.m_screen_ram; |
| 294 | 309 | |
| 295 | 310 | v1.x = gpu.points[0].x; |
| 296 | 311 | v1.y = gpu.points[0].y; |
| r32596 | r32597 | |
| 299 | 314 | v2.y = gpu.points[1].y; |
| 300 | 315 | |
| 301 | 316 | /* Draw a triangle fan */ |
| 302 | | for (i = 2; i <= gpu.pt_idx; ++i) |
| 317 | for (int i = 2; i <= gpu.pt_idx; ++i) |
| 303 | 318 | { |
| 304 | 319 | v3.x = gpu.points[i].x; |
| 305 | 320 | v3.y = gpu.points[i].y; |
| 306 | 321 | |
| 307 | | poly_render_triangle(m_poly, 0, clip, draw_scanline, 1, &v1, &v2, &v3); |
| 322 | render_triangle(clip, rd_scan, 1, v1, v2, v3); |
| 308 | 323 | v2 = v3; |
| 309 | 324 | } |
| 310 | 325 | } |
| r32596 | r32597 | |
| 452 | 467 | } |
| 453 | 468 | case 0x2c: |
| 454 | 469 | { |
| 455 | | draw_polygon(gpu.gr[2]); |
| 456 | | poly_wait(m_poly, "Normal"); |
| 470 | m_renderer->draw_polygon(gpu.gr[2]); |
| 471 | m_renderer->wait(); |
| 457 | 472 | break; |
| 458 | 473 | } |
| 459 | 474 | default: |
| r32596 | r32597 | |
| 601 | 616 | } |
| 602 | 617 | |
| 603 | 618 | data &= 0x3800; |
| 604 | | membank("dsp0_bank1")->set_base(&m_shared_ram[0][data]); |
| 619 | m_dsp0_bank1->set_base(&m_shared_ram[0][data]); |
| 605 | 620 | m_dsp_bank[0] = data; |
| 606 | 621 | } |
| 607 | 622 | |
| r32596 | r32597 | |
| 635 | 650 | } |
| 636 | 651 | |
| 637 | 652 | data &= 0x3800; |
| 638 | | membank("dsp1_bank1")->set_base(&m_shared_ram[1][data]); |
| 653 | m_dsp1_bank1->set_base(&m_shared_ram[1][data]); |
| 639 | 654 | m_dsp_bank[1] = data; |
| 640 | 655 | } |
| 641 | 656 | |
| r32596 | r32597 | |
| 988 | 1003 | |
| 989 | 1004 | /* Set up the DSP */ |
| 990 | 1005 | membank("dsp0_bank0")->set_base(m_shared_ram[0]); |
| 991 | | membank("dsp0_bank1")->set_base(&m_shared_ram[0][0x800]); |
| 1006 | m_dsp0_bank1->set_base(&m_shared_ram[0][0x800]); |
| 992 | 1007 | load_ldafile(m_dsp0->space(AS_PROGRAM), memregion("dsp")->base()); |
| 993 | 1008 | } |
| 994 | 1009 | |
| r32596 | r32597 | |
| 1003 | 1018 | |
| 1004 | 1019 | /* Set up the first DSP */ |
| 1005 | 1020 | membank("dsp0_bank0")->set_base(m_shared_ram[0]); |
| 1006 | | membank("dsp0_bank1")->set_base(&m_shared_ram[0][0x800]); |
| 1021 | m_dsp0_bank1->set_base(&m_shared_ram[0][0x800]); |
| 1007 | 1022 | load_ldafile(m_dsp0->space(AS_PROGRAM), memregion("dsp")->base()); |
| 1008 | 1023 | |
| 1009 | 1024 | /* Set up the second DSP */ |
| 1010 | 1025 | membank("dsp1_bank0")->set_base(m_shared_ram[1]); |
| 1011 | | membank("dsp1_bank1")->set_base(&m_shared_ram[1][0x800]); |
| 1026 | m_dsp1_bank1->set_base(&m_shared_ram[1][0x800]); |
| 1012 | 1027 | load_ldafile(m_dsp1->space(AS_PROGRAM), memregion("dsp")->base()); |
| 1013 | 1028 | } |
| 1014 | 1029 | |