trunk/src/mame/video/model3.c
r32825 | r32826 | |
11 | 11 | #define TRI_PARAM_TEXTURE_ENABLE 0x8 |
12 | 12 | #define TRI_PARAM_ALPHA_TEST 0x10 |
13 | 13 | |
| 14 | #define TRI_BUFFER_SIZE 35000 |
| 15 | #define TRI_ALPHA_BUFFER_SIZE 15000 |
| 16 | |
14 | 17 | struct model3_polydata |
15 | 18 | { |
16 | 19 | cached_texture *texture; |
r32825 | r32826 | |
24 | 27 | { |
25 | 28 | public: |
26 | 29 | model3_renderer(model3_state &state, int width, int height) |
27 | | : poly_manager<float, model3_polydata, 6, 50000>(state.machine())//, m_state(state) |
| 30 | : poly_manager<float, model3_polydata, 6, 50000>(state.machine()) |
28 | 31 | { |
29 | 32 | m_fb = auto_bitmap_rgb32_alloc(state.machine(), width, height); |
30 | 33 | m_zb = auto_bitmap_ind32_alloc(state.machine(), width, height); |
31 | 34 | } |
32 | 35 | |
33 | 36 | void draw(bitmap_rgb32 &bitmap, const rectangle &cliprect); |
34 | | void draw_triangle(const m3_triangle* tri); |
35 | | void clear_buffers(); |
| 37 | void draw_opaque_triangles(const m3_triangle* tris, int num_tris); |
| 38 | void draw_alpha_triangles(const m3_triangle* tris, int num_tris); |
| 39 | void clear_fb(); |
| 40 | void clear_zb(); |
36 | 41 | void draw_scanline_solid(INT32 scanline, const extent_t &extent, const model3_polydata &extradata, int threadid); |
37 | 42 | void draw_scanline_tex(INT32 scanline, const extent_t &extent, const model3_polydata &extradata, int threadid); |
38 | | void draw_scanline_contour(INT32 scanline, const extent_t &extent, const model3_polydata &extradata, int threadid); |
| 43 | void draw_scanline_tex_contour(INT32 scanline, const extent_t &extent, const model3_polydata &extradata, int threadid); |
39 | 44 | void draw_scanline_tex_trans(INT32 scanline, const extent_t &extent, const model3_polydata &extradata, int threadid); |
40 | 45 | void draw_scanline_tex_alpha(INT32 scanline, const extent_t &extent, const model3_polydata &extradata, int threadid); |
| 46 | void wait_for_polys(); |
41 | 47 | |
42 | 48 | private: |
43 | | //model3_state &m_state; |
44 | 49 | bitmap_rgb32 *m_fb; |
45 | 50 | bitmap_ind32 *m_zb; |
46 | 51 | }; |
r32825 | r32826 | |
153 | 158 | |
154 | 159 | m_renderer = auto_alloc(machine(), model3_renderer(*this, width, height)); |
155 | 160 | |
| 161 | m_tri_buffer = auto_alloc_array_clear(machine(), m3_triangle, TRI_BUFFER_SIZE); |
| 162 | m_tri_alpha_buffer = auto_alloc_array_clear(machine(), m3_triangle, TRI_ALPHA_BUFFER_SIZE); |
| 163 | |
156 | 164 | machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model3_state::model3_exit), this)); |
157 | 165 | |
158 | 166 | m_m3_char_ram = auto_alloc_array_clear(machine(), UINT64, 0x100000/8); |
r32825 | r32826 | |
1007 | 1015 | } |
1008 | 1016 | m_texture_fifo_pos = 0; |
1009 | 1017 | |
1010 | | m_renderer->clear_buffers(); |
| 1018 | m_renderer->clear_fb(); |
1011 | 1019 | |
| 1020 | reset_triangle_buffers(); |
1012 | 1021 | real3d_traverse_display_list(); |
| 1022 | |
| 1023 | /* |
| 1024 | m_renderer->draw_opaque_triangles(m_tri_buffer, m_tri_buffer_ptr); |
| 1025 | m_renderer->draw_alpha_triangles(m_tri_alpha_buffer, m_tri_alpha_buffer_ptr); |
| 1026 | |
| 1027 | m_renderer->wait_for_polys(); |
| 1028 | */ |
| 1029 | |
| 1030 | for (int i=0; i < 4; i++) |
| 1031 | { |
| 1032 | int ticount, tiacount; |
| 1033 | int ti = m_viewport_tri_index[i]; |
| 1034 | int tia = m_viewport_tri_alpha_index[i]; |
| 1035 | if (i < 3) |
| 1036 | { |
| 1037 | ticount = m_viewport_tri_index[i+1] - ti; |
| 1038 | tiacount = m_viewport_tri_alpha_index[i+1] - tia; |
| 1039 | } |
| 1040 | else |
| 1041 | { |
| 1042 | ticount = m_tri_buffer_ptr - ti; |
| 1043 | tiacount = m_tri_alpha_buffer_ptr - tia; |
| 1044 | } |
| 1045 | |
| 1046 | if (ticount > 0 || tiacount > 0) |
| 1047 | { |
| 1048 | m_renderer->clear_zb(); |
| 1049 | m_renderer->draw_opaque_triangles(&m_tri_buffer[ti], ticount); |
| 1050 | m_renderer->draw_alpha_triangles(&m_tri_alpha_buffer[tia], tiacount); |
| 1051 | m_renderer->wait_for_polys(); |
| 1052 | } |
| 1053 | } |
1013 | 1054 | } |
1014 | 1055 | |
1015 | 1056 | void model3_state::real3d_display_list1_dma(UINT32 src, UINT32 dst, int length, int byteswap) |
r32825 | r32826 | |
1273 | 1314 | return clip_verts; |
1274 | 1315 | } |
1275 | 1316 | |
| 1317 | void model3_state::reset_triangle_buffers() |
| 1318 | { |
| 1319 | m_tri_buffer_ptr = 0; |
| 1320 | m_tri_alpha_buffer_ptr = 0; |
| 1321 | } |
| 1322 | |
| 1323 | m3_triangle *model3_state::push_triangle(bool alpha) |
| 1324 | { |
| 1325 | if (!alpha) |
| 1326 | { |
| 1327 | int i = m_tri_buffer_ptr; |
| 1328 | |
| 1329 | if (m_tri_buffer_ptr >= TRI_BUFFER_SIZE) |
| 1330 | { |
| 1331 | return NULL; |
| 1332 | //fatalerror("push_triangle: tri buffer max exceeded"); |
| 1333 | } |
| 1334 | |
| 1335 | m_tri_buffer_ptr++; |
| 1336 | return &m_tri_buffer[i]; |
| 1337 | } |
| 1338 | else |
| 1339 | { |
| 1340 | int i = m_tri_alpha_buffer_ptr; |
| 1341 | |
| 1342 | if (m_tri_alpha_buffer_ptr >= TRI_ALPHA_BUFFER_SIZE) |
| 1343 | { |
| 1344 | return NULL; |
| 1345 | //fatalerror("push_triangle: tri alpha buffer max exceeded"); |
| 1346 | } |
| 1347 | |
| 1348 | m_tri_alpha_buffer_ptr++; |
| 1349 | return &m_tri_alpha_buffer[i]; |
| 1350 | } |
| 1351 | } |
| 1352 | |
1276 | 1353 | void model3_state::draw_model(UINT32 addr) |
1277 | 1354 | { |
1278 | 1355 | // Polygon RAM is mapped to the low 4MB of VROM |
r32825 | r32826 | |
1311 | 1388 | VECTOR3 normal; |
1312 | 1389 | VECTOR3 sn; |
1313 | 1390 | VECTOR p[4]; |
1314 | | m3_triangle tri; |
1315 | | float dot; |
1316 | 1391 | int polygon_transparency; |
1317 | 1392 | |
1318 | 1393 | for (i = 0; i < 7; i++) |
r32825 | r32826 | |
1429 | 1504 | float intensity; |
1430 | 1505 | if ((header[6] & 0x10000) == 0) |
1431 | 1506 | { |
1432 | | dot = dot_product3(n, m_parallel_light); |
| 1507 | float dot = dot_product3(n, m_parallel_light); |
1433 | 1508 | intensity = ((dot * m_parallel_light_intensity) + m_ambient_light_intensity) * 255.0f; |
1434 | 1509 | if (intensity > 255.0f) |
1435 | 1510 | { |
r32825 | r32826 | |
1500 | 1575 | } |
1501 | 1576 | |
1502 | 1577 | for (i=2; i < num_vertices; i++) |
1503 | | { |
1504 | | memcpy(&tri.v[0], &clip_vert[0], sizeof(m3_clip_vertex)); |
1505 | | memcpy(&tri.v[1], &clip_vert[i-1], sizeof(m3_clip_vertex)); |
1506 | | memcpy(&tri.v[2], &clip_vert[i], sizeof(m3_clip_vertex)); |
| 1578 | { |
| 1579 | bool alpha = (header[6] & 0x1) || (header[6] & 0x80000000); // put to alpha buffer if there's any transparency involved |
| 1580 | m3_triangle* tri = push_triangle(alpha); |
1507 | 1581 | |
1508 | | tri.texture = texture; |
1509 | | tri.transparency = polygon_transparency; |
1510 | | tri.color = color; |
| 1582 | // bail out if tri buffer is maxed out (happens during harley boot) |
| 1583 | if (!tri) |
| 1584 | return; |
1511 | 1585 | |
1512 | | tri.param = 0; |
1513 | | tri.param |= (header[4] & 0x40) ? TRI_PARAM_TEXTURE_PAGE : 0; |
1514 | | tri.param |= (header[6] & 0x00000400) ? TRI_PARAM_TEXTURE_ENABLE : 0; |
1515 | | tri.param |= (header[2] & 0x2) ? TRI_PARAM_TEXTURE_MIRROR_U : 0; |
1516 | | tri.param |= (header[2] & 0x1) ? TRI_PARAM_TEXTURE_MIRROR_V : 0; |
1517 | | tri.param |= (header[6] & 0x80000000) ? TRI_PARAM_ALPHA_TEST : 0; |
| 1586 | memcpy(&tri->v[0], &clip_vert[0], sizeof(m3_clip_vertex)); |
| 1587 | memcpy(&tri->v[1], &clip_vert[i-1], sizeof(m3_clip_vertex)); |
| 1588 | memcpy(&tri->v[2], &clip_vert[i], sizeof(m3_clip_vertex)); |
1518 | 1589 | |
1519 | | m_renderer->draw_triangle(&tri); |
| 1590 | tri->texture = texture; |
| 1591 | tri->transparency = polygon_transparency; |
| 1592 | tri->color = color; |
| 1593 | |
| 1594 | tri->param = 0; |
| 1595 | tri->param |= (header[4] & 0x40) ? TRI_PARAM_TEXTURE_PAGE : 0; |
| 1596 | tri->param |= (header[6] & 0x00000400) ? TRI_PARAM_TEXTURE_ENABLE : 0; |
| 1597 | tri->param |= (header[2] & 0x2) ? TRI_PARAM_TEXTURE_MIRROR_U : 0; |
| 1598 | tri->param |= (header[2] & 0x1) ? TRI_PARAM_TEXTURE_MIRROR_V : 0; |
| 1599 | tri->param |= (header[6] & 0x80000000) ? TRI_PARAM_ALPHA_TEST : 0; |
1520 | 1600 | } |
1521 | 1601 | } |
1522 | 1602 | } |
r32825 | r32826 | |
1714 | 1794 | /* TODO: where does node[23] point to ? LOD table ? */ |
1715 | 1795 | |
1716 | 1796 | /* set lighting parameters */ |
1717 | | m_parallel_light[0] = -*(float *)&node[5]; |
| 1797 | m_parallel_light[0] = *(float *)&node[5]; |
1718 | 1798 | m_parallel_light[1] = *(float *)&node[6]; |
1719 | | m_parallel_light[2] = *(float *)&node[4]; |
| 1799 | m_parallel_light[2] = -*(float *)&node[4]; |
1720 | 1800 | m_parallel_light_intensity = *(float *)&node[7]; |
1721 | 1801 | m_ambient_light_intensity = (UINT8)(node[36] >> 8) / 256.0f; |
1722 | 1802 | |
r32825 | r32826 | |
1735 | 1815 | m_list_depth = 0; |
1736 | 1816 | |
1737 | 1817 | for (int pri = 0; pri < 4; pri++) |
| 1818 | { |
| 1819 | m_viewport_tri_index[pri] = m_tri_buffer_ptr; |
| 1820 | m_viewport_tri_alpha_index[pri] = m_tri_alpha_buffer_ptr; |
1738 | 1821 | draw_viewport(pri, 0x800000); |
| 1822 | } |
1739 | 1823 | } |
1740 | 1824 | |
1741 | 1825 | void model3_renderer::draw(bitmap_rgb32 &bitmap, const rectangle &cliprect) |
r32825 | r32826 | |
1757 | 1841 | } |
1758 | 1842 | } |
1759 | 1843 | |
1760 | | void model3_renderer::clear_buffers() |
| 1844 | void model3_renderer::clear_fb() |
1761 | 1845 | { |
1762 | 1846 | rectangle cliprect; |
1763 | 1847 | cliprect.min_x = 0; |
r32825 | r32826 | |
1766 | 1850 | cliprect.max_y = 383; |
1767 | 1851 | |
1768 | 1852 | m_fb->fill(0x00000000, cliprect); |
| 1853 | } |
1769 | 1854 | |
| 1855 | void model3_renderer::clear_zb() |
| 1856 | { |
| 1857 | rectangle cliprect; |
| 1858 | cliprect.min_x = 0; |
| 1859 | cliprect.min_y = 0; |
| 1860 | cliprect.max_x = 495; |
| 1861 | cliprect.max_y = 383; |
| 1862 | |
1770 | 1863 | float zvalue = 10000000000.0f; |
1771 | 1864 | m_zb->fill(*(int*)&zvalue, cliprect); |
1772 | 1865 | } |
1773 | 1866 | |
1774 | | void model3_renderer::draw_triangle(const m3_triangle *tri) |
| 1867 | void model3_renderer::wait_for_polys() |
1775 | 1868 | { |
| 1869 | wait(); |
| 1870 | } |
| 1871 | |
| 1872 | void model3_renderer::draw_opaque_triangles(const m3_triangle* tris, int num_tris) |
| 1873 | { |
1776 | 1874 | rectangle cliprect; |
1777 | 1875 | cliprect.min_x = 0; |
1778 | 1876 | cliprect.min_y = 0; |
1779 | 1877 | cliprect.max_x = 495; |
1780 | 1878 | cliprect.max_y = 383; |
1781 | 1879 | |
| 1880 | // printf("draw opaque: %d\n", num_tris); |
| 1881 | |
1782 | 1882 | vertex_t v[3]; |
1783 | 1883 | |
1784 | | if (tri->param & TRI_PARAM_TEXTURE_ENABLE) |
| 1884 | for (int t=0; t < num_tris; t++) |
1785 | 1885 | { |
1786 | | for (int i=0; i < 3; i++) |
| 1886 | const m3_triangle* tri = &tris[t]; |
| 1887 | |
| 1888 | if (tri->param & TRI_PARAM_TEXTURE_ENABLE) |
1787 | 1889 | { |
1788 | | v[i].x = tri->v[i].x; |
1789 | | v[i].y = tri->v[i].y; |
1790 | | v[i].p[0] = tri->v[i].z; |
1791 | | v[i].p[1] = 1.0f / tri->v[i].z; |
1792 | | v[i].p[2] = tri->v[i].u * 256.0f; // 8 bits of subtexel precision for bilinear filtering |
1793 | | v[i].p[3] = tri->v[i].v * 256.0f; |
1794 | | v[i].p[4] = tri->v[i].i; |
| 1890 | for (int i=0; i < 3; i++) |
| 1891 | { |
| 1892 | v[i].x = tri->v[i].x; |
| 1893 | v[i].y = tri->v[i].y; |
| 1894 | v[i].p[0] = tri->v[i].z; |
| 1895 | v[i].p[1] = 1.0f / tri->v[i].z; |
| 1896 | v[i].p[2] = tri->v[i].u * 256.0f; // 8 bits of subtexel precision for bilinear filtering |
| 1897 | v[i].p[3] = tri->v[i].v * 256.0f; |
| 1898 | v[i].p[4] = tri->v[i].i; |
| 1899 | } |
| 1900 | |
| 1901 | model3_polydata &extra = object_data_alloc(); |
| 1902 | extra.texture = tri->texture; |
| 1903 | extra.transparency = tri->transparency; |
| 1904 | extra.texture_param = tri->param; |
| 1905 | |
| 1906 | render_triangle(cliprect, render_delegate(FUNC(model3_renderer::draw_scanline_tex), this), 5, v[0], v[1], v[2]); |
1795 | 1907 | } |
| 1908 | else |
| 1909 | { |
| 1910 | for (int i=0; i < 3; i++) |
| 1911 | { |
| 1912 | v[i].x = tri->v[i].x; |
| 1913 | v[i].y = tri->v[i].y; |
| 1914 | v[i].p[0] = tri->v[i].z; |
| 1915 | v[i].p[1] = tri->v[i].i; |
| 1916 | } |
1796 | 1917 | |
1797 | | model3_polydata &extra = object_data_alloc(); |
1798 | | extra.texture = tri->texture; |
1799 | | extra.transparency = tri->transparency; |
1800 | | extra.intensity = tri->intensity; |
1801 | | extra.texture_param = tri->param; |
| 1918 | model3_polydata &extra = object_data_alloc(); |
| 1919 | extra.color = tri->color; |
1802 | 1920 | |
1803 | | render_delegate rd; |
1804 | | if (tri->param & TRI_PARAM_ALPHA_TEST) |
1805 | | { |
1806 | | rd = render_delegate(FUNC(model3_renderer::draw_scanline_contour), this); |
| 1921 | render_triangle(cliprect, render_delegate(FUNC(model3_renderer::draw_scanline_solid), this), 2, v[0], v[1], v[2]); |
1807 | 1922 | } |
1808 | | else if (extra.texture->alpha == 0xff) |
| 1923 | } |
| 1924 | } |
| 1925 | |
| 1926 | void model3_renderer::draw_alpha_triangles(const m3_triangle* tris, int num_tris) |
| 1927 | { |
| 1928 | rectangle cliprect; |
| 1929 | cliprect.min_x = 0; |
| 1930 | cliprect.min_y = 0; |
| 1931 | cliprect.max_x = 495; |
| 1932 | cliprect.max_y = 383; |
| 1933 | |
| 1934 | // printf("draw alpha: %d\n", num_tris); |
| 1935 | |
| 1936 | vertex_t v[3]; |
| 1937 | |
| 1938 | for (int t=num_tris-1; t >= 0; t--) |
| 1939 | { |
| 1940 | const m3_triangle* tri = &tris[t]; |
| 1941 | |
| 1942 | if (tri->param & TRI_PARAM_TEXTURE_ENABLE) |
1809 | 1943 | { |
1810 | | if (tri->transparency >= 32) |
1811 | | rd = render_delegate(FUNC(model3_renderer::draw_scanline_tex), this); |
| 1944 | for (int i=0; i < 3; i++) |
| 1945 | { |
| 1946 | v[i].x = tri->v[i].x; |
| 1947 | v[i].y = tri->v[i].y; |
| 1948 | v[i].p[0] = tri->v[i].z; |
| 1949 | v[i].p[1] = 1.0f / tri->v[i].z; |
| 1950 | v[i].p[2] = tri->v[i].u * 256.0f; // 8 bits of subtexel precision for bilinear filtering |
| 1951 | v[i].p[3] = tri->v[i].v * 256.0f; |
| 1952 | v[i].p[4] = tri->v[i].i; |
| 1953 | } |
| 1954 | |
| 1955 | model3_polydata &extra = object_data_alloc(); |
| 1956 | extra.texture = tri->texture; |
| 1957 | extra.transparency = tri->transparency; |
| 1958 | extra.texture_param = tri->param; |
| 1959 | |
| 1960 | if (tri->param & TRI_PARAM_ALPHA_TEST) |
| 1961 | { |
| 1962 | render_triangle(cliprect, render_delegate(FUNC(model3_renderer::draw_scanline_tex_contour), this), 5, v[0], v[1], v[2]); |
| 1963 | } |
1812 | 1964 | else |
1813 | | rd = render_delegate(FUNC(model3_renderer::draw_scanline_tex_trans), this); |
| 1965 | { |
| 1966 | render_triangle(cliprect, render_delegate(FUNC(model3_renderer::draw_scanline_tex_alpha), this), 5, v[0], v[1], v[2]); |
| 1967 | } |
1814 | 1968 | } |
1815 | 1969 | else |
1816 | 1970 | { |
1817 | | rd = render_delegate(FUNC(model3_renderer::draw_scanline_tex_alpha), this); |
1818 | | } |
| 1971 | for (int i=0; i < 3; i++) |
| 1972 | { |
| 1973 | v[i].x = tri->v[i].x; |
| 1974 | v[i].y = tri->v[i].y; |
| 1975 | v[i].p[0] = tri->v[i].z; |
| 1976 | v[i].p[1] = tri->v[i].i; |
| 1977 | } |
1819 | 1978 | |
1820 | | render_triangle(cliprect, rd, 5, v[0], v[1], v[2]); |
1821 | | } |
1822 | | else |
1823 | | { |
1824 | | for (int i=0; i < 3; i++) |
1825 | | { |
1826 | | v[i].x = tri->v[i].x; |
1827 | | v[i].y = tri->v[i].y; |
1828 | | v[i].p[0] = tri->v[i].z; |
1829 | | v[i].p[1] = tri->v[i].i; |
| 1979 | model3_polydata &extra = object_data_alloc(); |
| 1980 | extra.color = tri->color; |
| 1981 | |
| 1982 | // TODO: scanline renderer for solid /w transparency |
| 1983 | render_triangle(cliprect, render_delegate(FUNC(model3_renderer::draw_scanline_solid), this), 2, v[0], v[1], v[2]); |
1830 | 1984 | } |
1831 | | |
1832 | | model3_polydata &extra = object_data_alloc(); |
1833 | | |
1834 | | extra.intensity = tri->intensity; |
1835 | | extra.color = tri->color; |
1836 | | |
1837 | | render_triangle(cliprect, render_delegate(FUNC(model3_renderer::draw_scanline_solid), this), 2, v[0], v[1], v[2]); |
1838 | 1985 | } |
1839 | 1986 | } |
1840 | 1987 | |
r32825 | r32826 | |
1964 | 2111 | } |
1965 | 2112 | } |
1966 | 2113 | |
1967 | | void model3_renderer::draw_scanline_contour(INT32 scanline, const extent_t &extent, const model3_polydata &polydata, int threadid) |
| 2114 | void model3_renderer::draw_scanline_tex_contour(INT32 scanline, const extent_t &extent, const model3_polydata &polydata, int threadid) |
1968 | 2115 | { |
1969 | 2116 | UINT32 *fb = &m_fb->pix32(scanline); |
1970 | 2117 | float *zb = (float*)&m_zb->pix32(scanline); |
r32825 | r32826 | |
2068 | 2215 | b += ((orig & 0x000000ff) * desttrans) >> 5; |
2069 | 2216 | |
2070 | 2217 | fb[x] = 0xff000000 | (r & 0xff0000) | (g & 0xff00) | (b & 0xff); |
2071 | | zb[x] = z; |
2072 | 2218 | } |
2073 | 2219 | |
2074 | 2220 | ooz += dooz; |
r32825 | r32826 | |
2131 | 2277 | b += ((orig & 0x000000ff) * minalpha) >> 8; |
2132 | 2278 | |
2133 | 2279 | fb[x] = 0xff000000 | (r & 0xff0000) | (g & 0xff00) | (b & 0xff); |
2134 | | zb[x] = z; |
2135 | 2280 | } |
2136 | 2281 | } |
2137 | 2282 | |
trunk/src/mame/drivers/model3.c
r32825 | r32826 | |
26 | 26 | vs29815 - massive memory trashing and page faults |
27 | 27 | |
28 | 28 | vs2 - works |
29 | | harley - works, wrong textures in many places, correct textures uploaded when the game ends |
| 29 | harley - works |
30 | 30 | skichamp - boots after skipping the drive board errors, massive slowdowns |
31 | 31 | srally2/sraly2dx - works |
32 | 32 | von2/von254g - works |
33 | | fvipers2 - waiting for decrementer (same code as eca) |
| 33 | fvipers2 - crashes after player selection |
34 | 34 | vs298 - works, hangs with an onscreen error code |
35 | 35 | vs299/vs2v991 - works |
36 | 36 | oceanhun - same as daytona2 |
r32825 | r32826 | |
6005 | 6005 | /* Model 3 Step 2.1 */ |
6006 | 6006 | GAME( 1998, daytona2, 0, model3_21, daytona2, model3_state, daytona2, ROT0, "Sega", "Daytona USA 2 (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
6007 | 6007 | GAME( 1998, dayto2pe, 0, model3_21, daytona2, model3_state, dayto2pe, ROT0, "Sega", "Daytona USA 2 Power Edition", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
6008 | | GAME( 1998, dirtdvls, 0, model3_21, model3, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 1) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
6009 | | GAME( 1998, dirtdvlsa, dirtdvls, model3_21, model3, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 2) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6008 | GAME( 1998, dirtdvls, 0, model3_21, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 1) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 6009 | GAME( 1998, dirtdvlsa, dirtdvls, model3_21, scud, model3_state, dirtdvls, ROT0, "Sega", "Dirt Devils (set 2) (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
6010 | 6010 | GAME( 1998, swtrilgy, 0, model3_21, swtrilgy, model3_state, swtrilgy, ROT0, "Sega / LucasArts", "Star Wars Trilogy (Revision A)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
6011 | 6011 | GAME( 1998, swtrilgya, swtrilgy, model3_21, swtrilgy, model3_state, swtrilga, ROT0, "Sega / LucasArts", "Star Wars Trilogy", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
6012 | 6012 | GAME( 1998, spikeout, 0, model3_21, model3, model3_state, spikeout, ROT0, "Sega", "Spikeout (Revision C)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |