]> 4ch.mooo.com Git - 16.git/blobdiff - 16/sod8086/wolfhack.c
got 8086 port of wolf3d to work and sod to work
[16.git] / 16 / sod8086 / wolfhack.c
diff --git a/16/sod8086/wolfhack.c b/16/sod8086/wolfhack.c
new file mode 100755 (executable)
index 0000000..343d3b9
--- /dev/null
@@ -0,0 +1,186 @@
+// WOLFHACK.C\r
+\r
+#include "WL_DEF.H"\r
+\r
+#define        MAXVIEWHEIGHT   200\r
+\r
+int            spanstart[MAXVIEWHEIGHT/2];\r
+\r
+fixed  stepscale[MAXVIEWHEIGHT/2];\r
+fixed  basedist[MAXVIEWHEIGHT/2];\r
+\r
+extern char    far     planepics[8192];        // 4k of ceiling, 4k of floor\r
+\r
+int            halfheight = 0;\r
+\r
+byte   far *planeylookup[MAXVIEWHEIGHT/2];\r
+unsigned       mirrorofs[MAXVIEWHEIGHT/2];\r
+\r
+fixed  psin, pcos;\r
+\r
+fixed FixedMul (fixed a, fixed b)\r
+{\r
+       return (a>>8)*(b>>8);\r
+}\r
+\r
+\r
+int            mr_rowofs;\r
+int            mr_count;\r
+int            mr_xstep;\r
+int            mr_ystep;\r
+int            mr_xfrac;\r
+int            mr_yfrac;\r
+int            mr_dest;\r
+\r
+\r
+/*\r
+==============\r
+=\r
+= DrawSpans\r
+=\r
+= Height ranges from 0 (infinity) to viewheight/2 (nearest)\r
+==============\r
+*/\r
+\r
+void DrawSpans (int x1, int x2, int height)\r
+{\r
+       fixed           length;\r
+       int                     ofs;\r
+       int                     prestep;\r
+       fixed           startxfrac, startyfrac;\r
+\r
+       int                     x, startx, count, plane, startplane;\r
+       byte            far     *toprow, far *dest;\r
+\r
+       toprow = planeylookup[height]+bufferofs;\r
+       mr_rowofs = mirrorofs[height];\r
+\r
+       mr_xstep = (psin<<1)/height;\r
+       mr_ystep = (pcos<<1)/height;\r
+\r
+       length = basedist[height];\r
+       startxfrac = (viewx + FixedMul(length,pcos));\r
+       startyfrac = (viewy - FixedMul(length,psin));\r
+\r
+// draw two spans simultaniously\r
+\r
+       plane = startplane = x1&3;\r
+       prestep = viewwidth/2 - x1;\r
+       do\r
+       {\r
+               outportb (SC_INDEX+1,1<<plane);\r
+               mr_xfrac = startxfrac - (mr_xstep>>2)*prestep;\r
+               mr_yfrac = startyfrac - (mr_ystep>>2)*prestep;\r
+\r
+               startx = x1>>2;\r
+               mr_dest = (unsigned)toprow + startx;\r
+               mr_count = ((x2-plane)>>2) - startx + 1;\r
+               x1++;\r
+               prestep--;\r
+               if (mr_count)\r
+                       MapRow ();\r
+               plane = (plane+1)&3;\r
+       } while (plane != startplane);\r
+\r
+}\r
+\r
+\r
+\r
+\r
+/*\r
+===================\r
+=\r
+= SetPlaneViewSize\r
+=\r
+===================\r
+*/\r
+\r
+void SetPlaneViewSize (void)\r
+{\r
+       int             x,y;\r
+       byte    far *dest, far *src;\r
+\r
+       halfheight = viewheight>>1;\r
+\r
+\r
+       for (y=0 ; y<halfheight ; y++)\r
+       {\r
+               planeylookup[y] = (byte far *)0xa0000000l + (halfheight-1-y)*SCREENBWIDE;;\r
+               mirrorofs[y] = (y*2+1)*SCREENBWIDE;\r
+\r
+               stepscale[y] = y*GLOBAL1/32;\r
+               if (y>0)\r
+                       basedist[y] = GLOBAL1/2*scale/y;\r
+       }\r
+\r
+       src = PM_GetPage(0);\r
+       dest = planepics;\r
+       for (x=0 ; x<4096 ; x++)\r
+       {\r
+               *dest = *src++;\r
+               dest += 2;\r
+       }\r
+       src = PM_GetPage(1);\r
+       dest = planepics+1;\r
+       for (x=0 ; x<4096 ; x++)\r
+       {\r
+               *dest = *src++;\r
+               dest += 2;\r
+       }\r
+\r
+}\r
+\r
+\r
+/*\r
+===================\r
+=\r
+= DrawPlanes\r
+=\r
+===================\r
+*/\r
+\r
+void DrawPlanes (void)\r
+{\r
+       int             height, lastheight;\r
+       int             x;\r
+\r
+       if (viewheight>>1 != halfheight)\r
+               SetPlaneViewSize ();            // screen size has changed\r
+\r
+\r
+       psin = viewsin;\r
+       if (psin < 0)\r
+               psin = -(psin&0xffff);\r
+       pcos = viewcos;\r
+       if (pcos < 0)\r
+               pcos = -(pcos&0xffff);\r
+\r
+//\r
+// loop over all columns\r
+//\r
+       lastheight = halfheight;\r
+\r
+       for (x=0 ; x<viewwidth ; x++)\r
+       {\r
+               height = wallheight[x]>>3;\r
+               if (height < lastheight)\r
+               {       // more starts\r
+                       do\r
+                       {\r
+                               spanstart[--lastheight] = x;\r
+                       } while (lastheight > height);\r
+               }\r
+               else if (height > lastheight)\r
+               {       // draw spans\r
+                       if (height > halfheight)\r
+                               height = halfheight;\r
+                       for ( ; lastheight < height ; lastheight++)\r
+                               DrawSpans (spanstart[lastheight], x-1, lastheight);\r
+               }\r
+       }\r
+\r
+       height = halfheight;\r
+       for ( ; lastheight < height ; lastheight++)\r
+               DrawSpans (spanstart[lastheight], x-1, lastheight);\r
+}\r
+\r