Skip to content

Commit d3bf510

Browse files
committed
swars: Remade gpoly_stb_md05p64()
Drawing gpoly is now remade, other than few small assembly inlines.
1 parent b2265bc commit d3bf510

1 file changed

Lines changed: 332 additions & 2 deletions

File tree

src/bflib_render_gpoly.c

Lines changed: 332 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,7 +1535,6 @@ void gpoly_stb_md05uni_var040_nz(struct gpoly_state *st)
15351535
if (height > vec_window_height)
15361536
height = vec_window_height;
15371537
st->var_0C0 = height - st->var_164;
1538-
15391538
if (st->var_0C0 <= 0)
15401539
break;
15411540

@@ -1687,7 +1686,6 @@ void gpoly_stb_md05uni_var040_zr(struct gpoly_state *st)
16871686
if (height > vec_window_height)
16881687
height = vec_window_height;
16891688
st->var_0C0 = height - st->var_164;
1690-
16911689
if (st->var_0C0 <= 0)
16921690
break;
16931691

@@ -1703,12 +1701,344 @@ void gpoly_stb_md05uni(struct gpoly_state *st)
17031701
gpoly_stb_md05uni_var040_zr(st);
17041702
}
17051703

1704+
void gpoly_stb_md05p64_var040_nz(struct gpoly_state *st)
1705+
{
1706+
#if 0
1707+
asm volatile (
1708+
"call ASM_gpoly_stb_md05p64_var040_nz\n"
1709+
: : "a" (st));
1710+
return;
1711+
#endif
1712+
int loc_08C;
1713+
int loc_088;
1714+
int loc_0E4;
1715+
ubyte *out_ln;
1716+
int range_beg, range_end;
1717+
int height;
1718+
1719+
st->var_104 = vec_screen_width;
1720+
st->var_180 = 2;
1721+
st->var_0CC = st->var_0A4;
1722+
st->var_0C4 = st->var_0A0;
1723+
st->var_0C8 = st->var_09C;
1724+
1725+
if (st->var_134 < 0) {
1726+
st->var_12C = st->var_1B0;
1727+
st->var_128 = st->var_1AC;
1728+
} else {
1729+
st->var_12C = st->var_1AC;
1730+
st->var_128 = st->var_1B0;
1731+
}
1732+
loc_08C = st->var_08C;
1733+
loc_088 = st->var_088;
1734+
loc_0E4 = st->var_084;
1735+
out_ln = &vec_screen[st->var_17C * vec_screen_width];
1736+
if (st->var_17C > vec_window_height)
1737+
return;
1738+
1739+
height = st->var_164;
1740+
if (height > vec_window_height)
1741+
height = vec_window_height;
1742+
st->var_0C0 = height - st->var_17C;
1743+
1744+
st->var_074 = st->var_178;
1745+
range_beg = st->var_174;
1746+
range_end = st->var_174;
1747+
1748+
if (st->var_0C0 == 0)
1749+
st->var_038 = 0;
1750+
else
1751+
st->var_038 = st->var_17C;
1752+
1753+
ubyte *o; // edi
1754+
int range_beg_scr, range_end_scr;
1755+
ubyte *v19; // edi
1756+
int range_len;
1757+
1758+
while (1)
1759+
{
1760+
for (; st->var_038 < 0; st->var_038++)
1761+
{
1762+
gpoly_stb_drw_incr1b(&loc_088, &loc_0E4, &loc_08C, st);
1763+
range_beg += st->var_12C;
1764+
range_end += st->var_128;
1765+
out_ln += st->var_104;
1766+
st->var_0C0--;
1767+
if (st->var_0C0 == 0)
1768+
break;
1769+
}
1770+
for (; st->var_0C0 > 0; st->var_0C0--)
1771+
{
1772+
st->var_0FC = range_beg;
1773+
st->var_0F8 = range_end;
1774+
st->var_0F4 = out_ln;
1775+
range_beg_scr = range_beg >> 16;
1776+
if (range_beg_scr < 0)
1777+
{
1778+
for (; st->var_074 > 0; st->var_074--) {
1779+
gpoly_stb_drw_decr4(&loc_088, &loc_0E4, &loc_08C, st);
1780+
}
1781+
for (; st->var_074 < 0; st->var_074++) {
1782+
gpoly_stb_drw_incr4(&loc_088, &loc_0E4, &loc_08C, st);
1783+
}
1784+
}
1785+
else
1786+
{
1787+
for (; st->var_074 < range_beg_scr; st->var_074++) {
1788+
gpoly_stb_drw_incr4(&loc_088, &loc_0E4, &loc_08C, st);
1789+
}
1790+
for (; st->var_074 > range_beg_scr; st->var_074--) {
1791+
gpoly_stb_drw_decr4(&loc_088, &loc_0E4, &loc_08C, st);
1792+
}
1793+
}
1794+
st->var_0E0 = loc_08C;
1795+
st->var_0E4 = loc_0E4;
1796+
st->var_0D8 = loc_088;
1797+
range_end_scr = range_end >> 16;
1798+
if (range_end_scr > vec_window_width)
1799+
range_end_scr = vec_window_width;
1800+
v19 = &st->var_0F4[st->var_074];
1801+
range_len = range_end_scr - st->var_074;
1802+
if (range_len > 0)
1803+
{
1804+
int kk_max;
1805+
1806+
kk_max = range_len & 0xF;
1807+
o = &v19[gpoly_countdown[kk_max]];
1808+
st->var_0D4 = range_len;
1809+
1810+
while ( 1 )
1811+
{
1812+
int kk;
1813+
1814+
for (kk = kk_max; kk > 0; kk--) {
1815+
o[16-kk] = gpoly_stb_drw_pixel2(&loc_088, &loc_0E4, &loc_08C, st);
1816+
}
1817+
if (kk_max != 0) {
1818+
o += 16;
1819+
st->var_0D4 -= 16;
1820+
if (st->var_0D4 <= 0)
1821+
break;
1822+
}
1823+
o[0] = gpoly_stb_drw_pixel2(&loc_088, &loc_0E4, &loc_08C, st);
1824+
kk_max = 15;
1825+
}
1826+
}
1827+
range_beg = st->var_12C + st->var_0FC;
1828+
range_end = st->var_128 + st->var_0F8;
1829+
loc_08C = st->var_0E0;
1830+
loc_0E4 = st->var_0E4;
1831+
loc_088 = st->var_0D8;
1832+
gpoly_stb_drw_incr1b(&loc_088, &loc_0E4, &loc_08C, st);
1833+
out_ln = &st->var_0F4[st->var_104];
1834+
}
1835+
1836+
st->var_180--;
1837+
if (st->var_180 == 0)
1838+
return;
1839+
1840+
st->var_0FC = range_beg;
1841+
if (st->var_134 >= 0)
1842+
{
1843+
st->var_12C = st->var_1A8;
1844+
st->var_0CC = st->var_098;
1845+
st->var_0C4 = st->var_094;
1846+
st->var_0C8 = st->var_090;
1847+
loc_08C = st->var_080;
1848+
loc_088 = st->var_07C;
1849+
loc_0E4 = st->var_078;
1850+
st->var_074 = st->var_160;
1851+
range_beg = st->var_15C;
1852+
}
1853+
else
1854+
{
1855+
st->var_128 = st->var_1A8;
1856+
range_end = st->var_15C;
1857+
range_beg = st->var_0FC;
1858+
}
1859+
1860+
height = st->var_14C;
1861+
if (height > vec_window_height)
1862+
height = vec_window_height;
1863+
st->var_0C0 = height - st->var_164;
1864+
if (st->var_0C0 <= 0)
1865+
break;
1866+
1867+
st->var_038 = st->var_164;
1868+
}
1869+
}
1870+
1871+
void gpoly_stb_md05p64_var040_zr(struct gpoly_state *st)
1872+
{
1873+
#if 0
1874+
asm volatile (
1875+
"call ASM_gpoly_stb_md05p64_var040_zr\n"
1876+
: : "a" (st));
1877+
return;
1878+
#endif
1879+
int loc_08C;
1880+
int loc_088;
1881+
int loc_0E4;
1882+
ubyte *out_ln;
1883+
int range_beg, range_end;
1884+
int height;
1885+
1886+
st->var_104 = vec_screen_width;
1887+
st->var_180 = 2;
1888+
st->var_0CC = st->var_0A4;
1889+
st->var_0C4 = st->var_0A0;
1890+
st->var_0C8 = st->var_09C;
1891+
1892+
if (st->var_134 < 0) {
1893+
st->var_12C = st->var_1B0;
1894+
st->var_128 = st->var_1AC;
1895+
} else {
1896+
st->var_12C = st->var_1AC;
1897+
st->var_128 = st->var_1B0;
1898+
}
1899+
loc_08C = st->var_08C;
1900+
loc_088 = st->var_088;
1901+
loc_0E4 = st->var_084;
1902+
out_ln = &vec_screen[st->var_17C * vec_screen_width];
1903+
if (st->var_17C > vec_window_height)
1904+
return;
1905+
1906+
height = st->var_164;
1907+
if (height > vec_window_height)
1908+
height = vec_window_height;
1909+
st->var_0C0 = height - st->var_17C;
1910+
1911+
st->var_074 = st->var_178;
1912+
range_beg = st->var_174;
1913+
range_end = st->var_174;
1914+
1915+
if (st->var_0C0 == 0)
1916+
st->var_038 = 0;
1917+
else
1918+
st->var_038 = st->var_17C;
1919+
1920+
ubyte *o; // edi
1921+
int range_beg_scr, range_end_scr;
1922+
ubyte *v19; // edi
1923+
int range_len;
1924+
1925+
while (1)
1926+
{
1927+
for (; st->var_038 < 0; st->var_038++)
1928+
{
1929+
gpoly_stb_drw_incr1b(&loc_088, &loc_0E4, &loc_08C, st);
1930+
range_beg += st->var_12C;
1931+
range_end += st->var_128;
1932+
out_ln += st->var_104;
1933+
st->var_0C0--;
1934+
if (st->var_0C0 == 0)
1935+
break;
1936+
}
1937+
for (; st->var_0C0 > 0; st->var_0C0--)
1938+
{
1939+
st->var_0FC = range_beg;
1940+
st->var_0F8 = range_end;
1941+
st->var_0F4 = out_ln;
1942+
range_beg_scr = range_beg >> 16;
1943+
if (range_beg_scr > st->var_074)
1944+
{
1945+
for (; st->var_074 < range_beg_scr; st->var_074++) {
1946+
gpoly_stb_drw_incr4(&loc_088, &loc_0E4, &loc_08C, st);
1947+
}
1948+
}
1949+
else
1950+
{
1951+
for (; st->var_074 > range_beg_scr; st->var_074--) {
1952+
gpoly_stb_drw_decr4(&loc_088, &loc_0E4, &loc_08C, st);
1953+
}
1954+
}
1955+
st->var_0E0 = loc_08C;
1956+
st->var_0E4 = loc_0E4;
1957+
st->var_0D8 = loc_088;
1958+
range_end_scr = range_end >> 16;
1959+
v19 = &st->var_0F4[st->var_074];
1960+
range_len = range_end_scr - st->var_074;
1961+
if (range_len > 0)
1962+
{
1963+
int kk_max;
1964+
1965+
kk_max = range_len & 0xF;
1966+
o = &v19[gpoly_countdown[kk_max]];
1967+
st->var_0D4 = range_len;
1968+
1969+
while ( 1 )
1970+
{
1971+
int kk;
1972+
1973+
for (kk = kk_max; kk > 0; kk--) {
1974+
o[16-kk] = gpoly_stb_drw_pixel2(&loc_088, &loc_0E4, &loc_08C, st);
1975+
}
1976+
if (kk_max != 0) {
1977+
o += 16;
1978+
st->var_0D4 -= 16;
1979+
if (st->var_0D4 <= 0)
1980+
break;
1981+
}
1982+
o[0] = gpoly_stb_drw_pixel2(&loc_088, &loc_0E4, &loc_08C, st);
1983+
kk_max = 15;
1984+
}
1985+
}
1986+
range_beg = st->var_12C + st->var_0FC;
1987+
range_end = st->var_128 + st->var_0F8;
1988+
loc_08C = st->var_0E0;
1989+
loc_0E4 = st->var_0E4;
1990+
loc_088 = st->var_0D8;
1991+
gpoly_stb_drw_incr1b(&loc_088, &loc_0E4, &loc_08C, st);
1992+
out_ln = &st->var_0F4[st->var_104];
1993+
}
1994+
1995+
st->var_180--;
1996+
if (st->var_180 == 0)
1997+
return;
1998+
1999+
st->var_0FC = range_beg;
2000+
if (st->var_134 >= 0)
2001+
{
2002+
st->var_12C = st->var_1A8;
2003+
st->var_0CC = st->var_098;
2004+
st->var_0C4 = st->var_094;
2005+
st->var_0C8 = st->var_090;
2006+
loc_08C = st->var_080;
2007+
loc_088 = st->var_07C;
2008+
loc_0E4 = st->var_078;
2009+
st->var_074 = st->var_160;
2010+
range_beg = st->var_15C;
2011+
}
2012+
else
2013+
{
2014+
st->var_128 = st->var_1A8;
2015+
range_end = st->var_15C;
2016+
range_beg = st->var_0FC;
2017+
}
2018+
2019+
height = st->var_14C;
2020+
if (height > vec_window_height)
2021+
height = vec_window_height;
2022+
st->var_0C0 = height - st->var_164;
2023+
if (st->var_0C0 <= 0)
2024+
return;
2025+
2026+
st->var_038 = st->var_164;
2027+
}
2028+
}
2029+
17062030
void gpoly_stb_md05p64(struct gpoly_state *st)
17072031
{
2032+
#if 0
17082033
asm volatile (
17092034
"call ASM_gpoly_stb_md05p64\n"
17102035
: : "a" (st));
17112036
return;
2037+
#endif
2038+
if (st->var_040 != 0)
2039+
gpoly_stb_md05p64_var040_nz(st);
2040+
else
2041+
gpoly_stb_md05p64_var040_zr(st);
17122042
}
17132043

17142044
void draw_gpoly(struct PolyPoint *point_a, struct PolyPoint *point_b, struct PolyPoint *point_c)

0 commit comments

Comments
 (0)