foo
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 25 Nov 2023 09:59:36 +0000 (11:59 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 25 Nov 2023 09:59:36 +0000 (11:59 +0200)
src/3dgfx.c
src/lut.asm
src/polyfill.c
src/types.h
src/util.h

index 535fa98..f53ead6 100644 (file)
@@ -70,10 +70,12 @@ void g3d_draw(int prim, struct g3d_vertex *varr, int vcount)
 int32_t vpscale(int32_t x, int32_t s, int32_t shift);
 #pragma aux vpscale = \
        "add eax, 0x100" \
-       "mul ebx" \
+       "imul ebx" \
        "shrd eax, edx, cl" \
        parm [eax] [ebx] [ecx] \
-       value [eax];
+       value [eax] \
+       modify [eax edx];
+
 
 void g3d_draw_prim(int prim, struct g3d_vertex *varr)
 {
@@ -97,6 +99,9 @@ void g3d_draw_prim(int prim, struct g3d_vertex *varr)
                if(v[i].w != 0) {
                        v[i].x = (v[i].x << 4) / (v[i].w >> 4);
                        v[i].y = (v[i].y << 4) / (v[i].w >> 4);
+               } else {
+                       v[i].x >>= 8;
+                       v[i].y >>= 8;
                }
 
                /* viewport transform */
index 0501467..c4db165 100644 (file)
@@ -1,59 +1,59 @@
-       bits 32\r
-       section .rodata\r
-\r
-       global _sintab\r
-_sintab:\r
-       dw 0, 100, 201, 301, 401, 502, 602, 702, 802, 902, 1002, 1102, 1202\r
-       dw 1301, 1400, 1499, 1598, 1696, 1794, 1892, 1990, 2087, 2184, 2281\r
-       dw 2378, 2474, 2569, 2664, 2759, 2854, 2948, 3041, 3134, 3227, 3319\r
-       dw 3411, 3502, 3593, 3683, 3772, 3861, 3950, 4037, 4124, 4211, 4297\r
-       dw 4382, 4467, 4551, 4634, 4717, 4798, 4879, 4960, 5039, 5118, 5196\r
-       dw 5274, 5350, 5426, 5501, 5575, 5648, 5721, 5792, 5863, 5933, 6001\r
-       dw 6069, 6136, 6203, 6268, 6332, 6395, 6458, 6519, 6579, 6639, 6697\r
-       dw 6755, 6811, 6866, 6921, 6974, 7026, 7077, 7127, 7176, 7224, 7271\r
-       dw 7317, 7361, 7405, 7447, 7489, 7529, 7568, 7606, 7643, 7678, 7713\r
-       dw 7746, 7778, 7809, 7839, 7867, 7895, 7921, 7946, 7970, 7992, 8014\r
-       dw 8034, 8053, 8071, 8087, 8103, 8117, 8130, 8142, 8152, 8161, 8169\r
-       dw 8176, 8182, 8186, 8189, 8191, 8192, 8191, 8189, 8186, 8182, 8176\r
-       dw 8169, 8161, 8152, 8142, 8130, 8117, 8103, 8087, 8071, 8053, 8034\r
-       dw 8014, 7992, 7970, 7946, 7921, 7895, 7867, 7839, 7809, 7778, 7746\r
-       dw 7713, 7678, 7643, 7606, 7568, 7529, 7489, 7447, 7405, 7361, 7317\r
-       dw 7271, 7224, 7176, 7127, 7077, 7026, 6974, 6921, 6866, 6811, 6755\r
-       dw 6697, 6639, 6579, 6519, 6458, 6395, 6332, 6268, 6203, 6136, 6069\r
-       dw 6001, 5933, 5863, 5792, 5721, 5648, 5575, 5501, 5426, 5350, 5274\r
-       dw 5196, 5118, 5039, 4960, 4879, 4798, 4717, 4634, 4551, 4467, 4382\r
-       dw 4297, 4211, 4124, 4037, 3950, 3861, 3772, 3683, 3593, 3502, 3411\r
-       dw 3319, 3227, 3134, 3041, 2948, 2854, 2759, 2664, 2569, 2474, 2378\r
-       dw 2281, 2184, 2087, 1990, 1892, 1794, 1696, 1598, 1499, 1400, 1301\r
-       dw 1202, 1102, 1002, 902, 802, 702, 602, 502, 401, 301, 201, 100\r
-       dw 0, -100, -201, -301, -401, -502, -602, -702, -802, -902, -1002\r
-       dw -1102, -1202, -1301, -1400, -1499, -1598, -1696, -1794, -1892\r
-       dw -1990, -2087, -2184, -2281, -2378, -2474, -2569, -2664, -2759\r
-       dw -2854, -2948, -3041, -3134, -3227, -3319, -3411, -3502, -3593\r
-       dw -3683, -3772, -3861, -3950, -4037, -4124, -4211, -4297, -4382\r
-       dw -4467, -4551, -4634, -4717, -4798, -4879, -4960, -5039, -5118\r
-       dw -5196, -5274, -5350, -5426, -5501, -5575, -5648, -5721, -5792\r
-       dw -5863, -5933, -6001, -6069, -6136, -6203, -6268, -6332, -6395\r
-       dw -6458, -6519, -6579, -6639, -6697, -6755, -6811, -6866, -6921\r
-       dw -6974, -7026, -7077, -7127, -7176, -7224, -7271, -7317, -7361\r
-       dw -7405, -7447, -7489, -7529, -7568, -7606, -7643, -7678, -7713\r
-       dw -7746, -7778, -7809, -7839, -7867, -7895, -7921, -7946, -7970\r
-       dw -7992, -8014, -8034, -8053, -8071, -8087, -8103, -8117, -8130\r
-       dw -8142, -8152, -8161, -8169, -8176, -8182, -8186, -8189, -8191\r
-       dw -8192, -8191, -8189, -8186, -8182, -8176, -8169, -8161, -8152\r
-       dw -8142, -8130, -8117, -8103, -8087, -8071, -8053, -8034, -8014\r
-       dw -7992, -7970, -7946, -7921, -7895, -7867, -7839, -7809, -7778\r
-       dw -7746, -7713, -7678, -7643, -7606, -7568, -7529, -7489, -7447\r
-       dw -7405, -7361, -7317, -7271, -7224, -7176, -7127, -7077, -7026\r
-       dw -6974, -6921, -6866, -6811, -6755, -6697, -6639, -6579, -6519\r
-       dw -6458, -6395, -6332, -6268, -6203, -6136, -6069, -6001, -5933\r
-       dw -5863, -5792, -5721, -5648, -5575, -5501, -5426, -5350, -5274\r
-       dw -5196, -5118, -5039, -4960, -4879, -4798, -4717, -4634, -4551\r
-       dw -4467, -4382, -4297, -4211, -4124, -4037, -3950, -3861, -3772\r
-       dw -3683, -3593, -3502, -3411, -3319, -3227, -3134, -3041, -2948\r
-       dw -2854, -2759, -2664, -2569, -2474, -2378, -2281, -2184, -2087\r
-       dw -1990, -1892, -1794, -1696, -1598, -1499, -1400, -1301, -1202\r
-       dw -1102, -1002, -902, -802, -702, -602, -502, -401, -301, -201, -100\r
-\r
-\r
-; vi:ft=nasm ts=8 sts=8 sw=8:\r
+       bits 32
+       section .rodata
+
+       global _sintab
+_sintab:
+       dw 0, 100, 201, 301, 401, 502, 602, 702, 802, 902, 1002, 1102, 1202
+       dw 1301, 1400, 1499, 1598, 1696, 1794, 1892, 1990, 2087, 2184, 2281
+       dw 2378, 2474, 2569, 2664, 2759, 2854, 2948, 3041, 3134, 3227, 3319
+       dw 3411, 3502, 3593, 3683, 3772, 3861, 3950, 4037, 4124, 4211, 4297
+       dw 4382, 4467, 4551, 4634, 4717, 4798, 4879, 4960, 5039, 5118, 5196
+       dw 5274, 5350, 5426, 5501, 5575, 5648, 5721, 5792, 5863, 5933, 6001
+       dw 6069, 6136, 6203, 6268, 6332, 6395, 6458, 6519, 6579, 6639, 6697
+       dw 6755, 6811, 6866, 6921, 6974, 7026, 7077, 7127, 7176, 7224, 7271
+       dw 7317, 7361, 7405, 7447, 7489, 7529, 7568, 7606, 7643, 7678, 7713
+       dw 7746, 7778, 7809, 7839, 7867, 7895, 7921, 7946, 7970, 7992, 8014
+       dw 8034, 8053, 8071, 8087, 8103, 8117, 8130, 8142, 8152, 8161, 8169
+       dw 8176, 8182, 8186, 8189, 8191, 8192, 8191, 8189, 8186, 8182, 8176
+       dw 8169, 8161, 8152, 8142, 8130, 8117, 8103, 8087, 8071, 8053, 8034
+       dw 8014, 7992, 7970, 7946, 7921, 7895, 7867, 7839, 7809, 7778, 7746
+       dw 7713, 7678, 7643, 7606, 7568, 7529, 7489, 7447, 7405, 7361, 7317
+       dw 7271, 7224, 7176, 7127, 7077, 7026, 6974, 6921, 6866, 6811, 6755
+       dw 6697, 6639, 6579, 6519, 6458, 6395, 6332, 6268, 6203, 6136, 6069
+       dw 6001, 5933, 5863, 5792, 5721, 5648, 5575, 5501, 5426, 5350, 5274
+       dw 5196, 5118, 5039, 4960, 4879, 4798, 4717, 4634, 4551, 4467, 4382
+       dw 4297, 4211, 4124, 4037, 3950, 3861, 3772, 3683, 3593, 3502, 3411
+       dw 3319, 3227, 3134, 3041, 2948, 2854, 2759, 2664, 2569, 2474, 2378
+       dw 2281, 2184, 2087, 1990, 1892, 1794, 1696, 1598, 1499, 1400, 1301
+       dw 1202, 1102, 1002, 902, 802, 702, 602, 502, 401, 301, 201, 100
+       dw 0, -100, -201, -301, -401, -502, -602, -702, -802, -902, -1002
+       dw -1102, -1202, -1301, -1400, -1499, -1598, -1696, -1794, -1892
+       dw -1990, -2087, -2184, -2281, -2378, -2474, -2569, -2664, -2759
+       dw -2854, -2948, -3041, -3134, -3227, -3319, -3411, -3502, -3593
+       dw -3683, -3772, -3861, -3950, -4037, -4124, -4211, -4297, -4382
+       dw -4467, -4551, -4634, -4717, -4798, -4879, -4960, -5039, -5118
+       dw -5196, -5274, -5350, -5426, -5501, -5575, -5648, -5721, -5792
+       dw -5863, -5933, -6001, -6069, -6136, -6203, -6268, -6332, -6395
+       dw -6458, -6519, -6579, -6639, -6697, -6755, -6811, -6866, -6921
+       dw -6974, -7026, -7077, -7127, -7176, -7224, -7271, -7317, -7361
+       dw -7405, -7447, -7489, -7529, -7568, -7606, -7643, -7678, -7713
+       dw -7746, -7778, -7809, -7839, -7867, -7895, -7921, -7946, -7970
+       dw -7992, -8014, -8034, -8053, -8071, -8087, -8103, -8117, -8130
+       dw -8142, -8152, -8161, -8169, -8176, -8182, -8186, -8189, -8191
+       dw -8192, -8191, -8189, -8186, -8182, -8176, -8169, -8161, -8152
+       dw -8142, -8130, -8117, -8103, -8087, -8071, -8053, -8034, -8014
+       dw -7992, -7970, -7946, -7921, -7895, -7867, -7839, -7809, -7778
+       dw -7746, -7713, -7678, -7643, -7606, -7568, -7529, -7489, -7447
+       dw -7405, -7361, -7317, -7271, -7224, -7176, -7127, -7077, -7026
+       dw -6974, -6921, -6866, -6811, -6755, -6697, -6639, -6579, -6519
+       dw -6458, -6395, -6332, -6268, -6203, -6136, -6069, -6001, -5933
+       dw -5863, -5792, -5721, -5648, -5575, -5501, -5426, -5350, -5274
+       dw -5196, -5118, -5039, -4960, -4879, -4798, -4717, -4634, -4551
+       dw -4467, -4382, -4297, -4211, -4124, -4037, -3950, -3861, -3772
+       dw -3683, -3593, -3502, -3411, -3319, -3227, -3134, -3041, -2948
+       dw -2854, -2759, -2664, -2569, -2474, -2378, -2281, -2184, -2087
+       dw -1990, -1892, -1794, -1696, -1598, -1499, -1400, -1301, -1202
+       dw -1102, -1002, -902, -802, -702, -602, -502, -401, -301, -201, -100
+
+
+; vi:ft=nasm ts=8 sts=8 sw=8:
index c5298d4..ff62225 100644 (file)
-#include <stdio.h>\r
-#include <string.h>\r
-#include "3dgfx.h"\r
-#include "util.h"\r
-\r
-static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);\r
-static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);\r
-\r
-void g3d_polyfill(struct g3d_vertex *verts)\r
-{\r
-       int i, topidx, botidx, mididx;\r
-       int32_t dx, dy, dym;\r
-       struct g3d_vertex vtmp;\r
-\r
-       topidx = botidx = 0;\r
-       for(i=1; i<3; i++) {\r
-               if(verts[i].y < verts[topidx].y) {\r
-                       topidx = i;\r
-               }\r
-               if(verts[i].y > verts[botidx].y) {\r
-                       botidx = i;\r
-               }\r
-       }\r
-       mididx = (topidx + 1) % 3;\r
-       if(mididx == botidx) mididx = (mididx + 1) % 3;\r
-\r
-       dy = verts[botidx].y - verts[topidx].y;\r
-       if(dy == 0) return;\r
-\r
-       dx = verts[botidx].x - verts[topidx].x;\r
-       dym = verts[mididx].y - verts[topidx].y;\r
-       vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */\r
-       vtmp.y = verts[mididx].y;\r
-\r
-       if(verts[topidx].y != verts[mididx].y) {\r
-               filltop(verts + topidx, verts + mididx, &vtmp);\r
-       }\r
-       if(verts[mididx].y != verts[botidx].y) {\r
-               fillbot(verts + mididx, &vtmp, verts + botidx);\r
-       }\r
-}\r
-\r
-static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)\r
-{\r
-       struct g3d_vertex *vtmp;\r
-       int x, xn, y, endy, len;\r
-       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;\r
-       unsigned char *fbptr;\r
-\r
-       if(v1->x > v2->x) {\r
-               vtmp = v1;\r
-               v1 = v2;\r
-               v2 = vtmp;\r
-       }\r
-\r
-       y = v0->y >> 8;\r
-       endy = v1->y >> 8;\r
-       x = v0->x >> 8;\r
-\r
-       fbptr = g3d_fbpixels + y * XRES + x;\r
-\r
-       xl = xr = v0->x;\r
-       dy = v1->y - v0->y;\r
-       dxl = v1->x - v0->x;\r
-       dxr = v2->x - v0->x;\r
-       dxldy = (dxl << 8) / dy;\r
-       dxrdy = (dxr << 8) / dy;\r
-\r
-       while(y++ < endy) {\r
-               len = (xr - xl) >> 8;\r
-               if(len > 0) memset(fbptr, g3d_curcidx, len);\r
-\r
-               xl += dxldy;\r
-               xr += dxrdy;\r
-               xn = xl >> 8;\r
-               fbptr += XRES + (xn - x);\r
-               x = xn;\r
-       }\r
-}\r
-\r
-static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)\r
-{\r
-       struct g3d_vertex *vtmp;\r
-       int x, xn, y, endy, len;\r
-       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;\r
-       unsigned char *fbptr;\r
-\r
-       if(v0->x > v1->x) {\r
-               vtmp = v0;\r
-               v0 = v1;\r
-               v1 = vtmp;\r
-       }\r
-\r
-       y = v0->y >> 8;\r
-       endy = v2->y >> 8;\r
-       x = v0->x >> 8;\r
-\r
-       fbptr = g3d_fbpixels + y * XRES + x;\r
-\r
-       xl = v0->x;\r
-       xr = v1->x;\r
-       dy = v2->y - v0->y;\r
-       dxl = v2->x - v0->x;\r
-       dxr = v2->x - v1->x;\r
-       dxldy = (dxl << 8) / dy;\r
-       dxrdy = (dxr << 8) / dy;\r
-\r
-       while(y++ < endy) {\r
-               len = (xr - xl) >> 8;\r
-               if(len > 0) memset(fbptr, g3d_curcidx, len);\r
-\r
-               xl += dxldy;\r
-               xr += dxrdy;\r
-               xn = xl >> 8;\r
-               fbptr += XRES + (xn - x);\r
-               x = xn;\r
-       }\r
-}\r
+#include <stdio.h>
+#include <string.h>
+#include "3dgfx.h"
+#include "util.h"
+
+static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
+static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
+
+void g3d_polyfill(struct g3d_vertex *verts)
+{
+       int i, topidx, botidx, mididx;
+       int32_t dx, dy, dym;
+       struct g3d_vertex vtmp;
+
+       topidx = botidx = 0;
+       for(i=1; i<3; i++) {
+               if(verts[i].y < verts[topidx].y) {
+                       topidx = i;
+               }
+               if(verts[i].y > verts[botidx].y) {
+                       botidx = i;
+               }
+       }
+       mididx = (topidx + 1) % 3;
+       if(mididx == botidx) mididx = (mididx + 1) % 3;
+
+       dy = verts[botidx].y - verts[topidx].y;
+       if(dy == 0) return;
+
+       dx = verts[botidx].x - verts[topidx].x;
+       dym = verts[mididx].y - verts[topidx].y;
+       vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */
+       vtmp.y = verts[mididx].y;
+
+       if(verts[topidx].y != verts[mididx].y) {
+               filltop(verts + topidx, verts + mididx, &vtmp);
+       }
+       if(verts[mididx].y != verts[botidx].y) {
+               fillbot(verts + mididx, &vtmp, verts + botidx);
+       }
+}
+
+static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
+{
+       struct g3d_vertex *vtmp;
+       int x, xn, y, endy, len;
+       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
+       unsigned char *fbptr;
+
+       if(v1->x > v2->x) {
+               vtmp = v1;
+               v1 = v2;
+               v2 = vtmp;
+       }
+
+       y = v0->y >> 8;
+       endy = v1->y >> 8;
+       if(endy > YRES) endy = YRES;
+       x = v0->x >> 8;
+
+       fbptr = g3d_fbpixels + y * XRES + x;
+
+       xl = xr = v0->x;
+       dy = v1->y - v0->y;
+       dxl = v1->x - v0->x;
+       dxr = v2->x - v0->x;
+       dxldy = (dxl << 8) / dy;
+       dxrdy = (dxr << 8) / dy;
+
+       while(y++ < endy) {
+               if(y > 0) {
+                       len = (xr - xl) >> 8;
+                       if(len > 0) memset(fbptr, g3d_curcidx, len);
+               }
+
+               xl += dxldy;
+               xr += dxrdy;
+               xn = xl >> 8;
+               fbptr += XRES + (xn - x);
+               x = xn;
+       }
+}
+
+static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
+{
+       struct g3d_vertex *vtmp;
+       int x, xn, y, endy, len;
+       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
+       unsigned char *fbptr;
+
+       if(v0->x > v1->x) {
+               vtmp = v0;
+               v0 = v1;
+               v1 = vtmp;
+       }
+
+       y = v0->y >> 8;
+       endy = v2->y >> 8;
+       if(endy > YRES) endy = YRES;
+       x = v0->x >> 8;
+
+       fbptr = g3d_fbpixels + y * XRES + x;
+
+       xl = v0->x;
+       xr = v1->x;
+       dy = v2->y - v0->y;
+       dxl = v2->x - v0->x;
+       dxr = v2->x - v1->x;
+       dxldy = (dxl << 8) / dy;
+       dxrdy = (dxr << 8) / dy;
+
+       while(y++ < endy) {
+               if(y > 0) {
+                       len = (xr - xl) >> 8;
+                       if(len > 0) memset(fbptr, g3d_curcidx, len);
+               }
+
+               xl += dxldy;
+               xr += dxrdy;
+               xn = xl >> 8;
+               fbptr += XRES + (xn - x);
+               x = xn;
+       }
+}
index 2a747c3..fd0b235 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef TYPES_H_
 #define TYPES_H_
 
+#if defined(__WATCOMC__) && __WATCOMC__ < 1200
 typedef signed char int8_t;
 typedef short int16_t;
 typedef long int32_t;
@@ -11,5 +12,8 @@ typedef unsigned long uint32_t;
 
 typedef long intptr_t;
 typedef unsigned long uintptr_t;
+#else
+#include <stdint.h>
+#endif
 
 #endif /* TYPES_H_ */
index 9488b9b..0cb3da2 100644 (file)
@@ -1,25 +1,25 @@
-#ifndef UTIL_H_\r
-#define UTIL_H_\r
-\r
-#include "types.h"\r
-\r
-#define SINLUT_SIZE            512\r
-#define SINLUT_MASK            (SINLUT_SIZE - 1)\r
-#define SINLUT_SCALE   8192\r
-\r
-extern int16_t sintab[];\r
-\r
-/* sin(x) lookup -> 16.16 fixed point */\r
-#define XSIN(x)        (sintab[(x) & SINLUT_MASK] << 3)\r
-#define XCOS(x)        (sintab[((x) + SINLUT_SIZE / 4) & SINLUT_MASK] << 3)\r
-\r
-/* perform x * s / d without loss of precision */\r
-int32_t muldiv(int32_t x, int32_t s, int32_t d);\r
-#pragma aux muldiv = \\r
-       "imul ebx" \\r
-       "idiv ecx" \\r
-       parm [eax] [ebx] [ecx] \\r
-       value [eax] \\r
-       modify [eax edx];\r
-\r
-#endif /* UTIL_H_ */\r
+#ifndef UTIL_H_
+#define UTIL_H_
+
+#include "types.h"
+
+#define SINLUT_SIZE            512
+#define SINLUT_MASK            (SINLUT_SIZE - 1)
+#define SINLUT_SCALE   8192
+
+extern int16_t sintab[];
+
+/* sin(x) lookup -> 16.16 fixed point */
+#define XSIN(x)        (sintab[(x) & SINLUT_MASK] << 3)
+#define XCOS(x)        (sintab[((x) + SINLUT_SIZE / 4) & SINLUT_MASK] << 3)
+
+/* perform x * s / d without loss of precision */
+int32_t muldiv(int32_t x, int32_t s, int32_t d);
+#pragma aux muldiv = \
+       "imul ebx" \
+       "idiv ecx" \
+       parm [eax] [ebx] [ecx] \
+       value [eax] \
+       modify [eax edx];
+
+#endif /* UTIL_H_ */