OSDN Git Service

got 8086 port of wolf3d to work and sod to work
[proj16/16.git] / 16 / sod8086 / wolfhack.c
1 // WOLFHACK.C\r
2 \r
3 #include "WL_DEF.H"\r
4 \r
5 #define MAXVIEWHEIGHT   200\r
6 \r
7 int             spanstart[MAXVIEWHEIGHT/2];\r
8 \r
9 fixed   stepscale[MAXVIEWHEIGHT/2];\r
10 fixed   basedist[MAXVIEWHEIGHT/2];\r
11 \r
12 extern  char    far     planepics[8192];        // 4k of ceiling, 4k of floor\r
13 \r
14 int             halfheight = 0;\r
15 \r
16 byte    far *planeylookup[MAXVIEWHEIGHT/2];\r
17 unsigned        mirrorofs[MAXVIEWHEIGHT/2];\r
18 \r
19 fixed   psin, pcos;\r
20 \r
21 fixed FixedMul (fixed a, fixed b)\r
22 {\r
23         return (a>>8)*(b>>8);\r
24 }\r
25 \r
26 \r
27 int             mr_rowofs;\r
28 int             mr_count;\r
29 int             mr_xstep;\r
30 int             mr_ystep;\r
31 int             mr_xfrac;\r
32 int             mr_yfrac;\r
33 int             mr_dest;\r
34 \r
35 \r
36 /*\r
37 ==============\r
38 =\r
39 = DrawSpans\r
40 =\r
41 = Height ranges from 0 (infinity) to viewheight/2 (nearest)\r
42 ==============\r
43 */\r
44 \r
45 void DrawSpans (int x1, int x2, int height)\r
46 {\r
47         fixed           length;\r
48         int                     ofs;\r
49         int                     prestep;\r
50         fixed           startxfrac, startyfrac;\r
51 \r
52         int                     x, startx, count, plane, startplane;\r
53         byte            far     *toprow, far *dest;\r
54 \r
55         toprow = planeylookup[height]+bufferofs;\r
56         mr_rowofs = mirrorofs[height];\r
57 \r
58         mr_xstep = (psin<<1)/height;\r
59         mr_ystep = (pcos<<1)/height;\r
60 \r
61         length = basedist[height];\r
62         startxfrac = (viewx + FixedMul(length,pcos));\r
63         startyfrac = (viewy - FixedMul(length,psin));\r
64 \r
65 // draw two spans simultaniously\r
66 \r
67         plane = startplane = x1&3;\r
68         prestep = viewwidth/2 - x1;\r
69         do\r
70         {\r
71                 outportb (SC_INDEX+1,1<<plane);\r
72                 mr_xfrac = startxfrac - (mr_xstep>>2)*prestep;\r
73                 mr_yfrac = startyfrac - (mr_ystep>>2)*prestep;\r
74 \r
75                 startx = x1>>2;\r
76                 mr_dest = (unsigned)toprow + startx;\r
77                 mr_count = ((x2-plane)>>2) - startx + 1;\r
78                 x1++;\r
79                 prestep--;\r
80                 if (mr_count)\r
81                         MapRow ();\r
82                 plane = (plane+1)&3;\r
83         } while (plane != startplane);\r
84 \r
85 }\r
86 \r
87 \r
88 \r
89 \r
90 /*\r
91 ===================\r
92 =\r
93 = SetPlaneViewSize\r
94 =\r
95 ===================\r
96 */\r
97 \r
98 void SetPlaneViewSize (void)\r
99 {\r
100         int             x,y;\r
101         byte    far *dest, far *src;\r
102 \r
103         halfheight = viewheight>>1;\r
104 \r
105 \r
106         for (y=0 ; y<halfheight ; y++)\r
107         {\r
108                 planeylookup[y] = (byte far *)0xa0000000l + (halfheight-1-y)*SCREENBWIDE;;\r
109                 mirrorofs[y] = (y*2+1)*SCREENBWIDE;\r
110 \r
111                 stepscale[y] = y*GLOBAL1/32;\r
112                 if (y>0)\r
113                         basedist[y] = GLOBAL1/2*scale/y;\r
114         }\r
115 \r
116         src = PM_GetPage(0);\r
117         dest = planepics;\r
118         for (x=0 ; x<4096 ; x++)\r
119         {\r
120                 *dest = *src++;\r
121                 dest += 2;\r
122         }\r
123         src = PM_GetPage(1);\r
124         dest = planepics+1;\r
125         for (x=0 ; x<4096 ; x++)\r
126         {\r
127                 *dest = *src++;\r
128                 dest += 2;\r
129         }\r
130 \r
131 }\r
132 \r
133 \r
134 /*\r
135 ===================\r
136 =\r
137 = DrawPlanes\r
138 =\r
139 ===================\r
140 */\r
141 \r
142 void DrawPlanes (void)\r
143 {\r
144         int             height, lastheight;\r
145         int             x;\r
146 \r
147         if (viewheight>>1 != halfheight)\r
148                 SetPlaneViewSize ();            // screen size has changed\r
149 \r
150 \r
151         psin = viewsin;\r
152         if (psin < 0)\r
153                 psin = -(psin&0xffff);\r
154         pcos = viewcos;\r
155         if (pcos < 0)\r
156                 pcos = -(pcos&0xffff);\r
157 \r
158 //\r
159 // loop over all columns\r
160 //\r
161         lastheight = halfheight;\r
162 \r
163         for (x=0 ; x<viewwidth ; x++)\r
164         {\r
165                 height = wallheight[x]>>3;\r
166                 if (height < lastheight)\r
167                 {       // more starts\r
168                         do\r
169                         {\r
170                                 spanstart[--lastheight] = x;\r
171                         } while (lastheight > height);\r
172                 }\r
173                 else if (height > lastheight)\r
174                 {       // draw spans\r
175                         if (height > halfheight)\r
176                                 height = halfheight;\r
177                         for ( ; lastheight < height ; lastheight++)\r
178                                 DrawSpans (spanstart[lastheight], x-1, lastheight);\r
179                 }\r
180         }\r
181 \r
182         height = halfheight;\r
183         for ( ; lastheight < height ; lastheight++)\r
184                 DrawSpans (spanstart[lastheight], x-1, lastheight);\r
185 }\r
186 \r