1 // A.ASM replacement using C
2 // Mainly by Ken Silverman, with things melded with my port by
3 // Jonathon Fowler (jf@jonof.id.au)
4 //
5 // "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
6 // Ken Silverman's official web site: "http://www.advsys.net/ken"
7 // See the included license file "BUILDLIC.TXT" for license info.
8
9 #include "compat.h"
10 #include "a.h"
11
12 #ifdef ENGINE_USING_A_C
13
14 int krecip(int num); // from engine.c
15
16 #define BITSOFPRECISION 3
17 #define BITSOFPRECISIONPOW 8
18
19 extern int asm1, asm2, asm4, fpuasm, globalx3, globaly3;
20 extern intptr_t asm3;
21 extern void *reciptable;
22
23 static int bpl, transmode = 0;
24 static int glogx, glogy, gbxinc, gbyinc, gpinc;
25 static unsigned char *gbuf, *gpal, *ghlinepal, *gtrans;
26
27 //Global variable functions
setvlinebpl(int dabpl)28 void setvlinebpl(int dabpl) { bpl = dabpl; }
fixtransluscence(void * datransoff)29 void fixtransluscence(void *datransoff) { gtrans = (unsigned char *)datransoff; }
settransnormal(void)30 void settransnormal(void) { transmode = 0; }
settransreverse(void)31 void settransreverse(void) { transmode = 1; }
32
33
34 //Ceiling/floor horizontal line functions
sethlinesizes(int logx,int logy,void * bufplc)35 void sethlinesizes(int logx, int logy, void *bufplc)
36 { glogx = logx; glogy = logy; gbuf = (unsigned char *)bufplc; }
setpalookupaddress(void * paladdr)37 void setpalookupaddress(void *paladdr) { ghlinepal = (unsigned char *)paladdr; }
setuphlineasm4(int bxinc,int byinc)38 void setuphlineasm4(int bxinc, int byinc) { gbxinc = bxinc; gbyinc = byinc; }
hlineasm4(int cnt,int skiploadincs,int paloffs,unsigned int by,unsigned int bx,void * p)39 void hlineasm4(int cnt, int skiploadincs, int paloffs, unsigned int by, unsigned int bx, void *p)
40 {
41 unsigned char *palptr, *pp;
42
43 palptr = &ghlinepal[paloffs];
44 pp = (unsigned char *)p;
45 if (!skiploadincs) { gbxinc = asm1; gbyinc = asm2; }
46 for(;cnt>=0;cnt--)
47 {
48 *pp = palptr[gbuf[((bx>>(32-glogx))<<glogy)+(by>>(32-glogy))]];
49 bx -= gbxinc;
50 by -= gbyinc;
51 pp--;
52 }
53 }
54
55
56 //Sloped ceiling/floor vertical line functions
setupslopevlin(int logylogx,void * bufplc,int pinc)57 void setupslopevlin(int logylogx, void *bufplc, int pinc)
58 {
59 glogx = (logylogx&255); glogy = (logylogx>>8);
60 gbuf = (unsigned char *)bufplc; gpinc = pinc;
61 }
slopevlin(void * p,int i,void * slopaloffs,int cnt,int bx,int by)62 void slopevlin(void *p, int i, void *slopaloffs, int cnt, int bx, int by)
63 {
64 intptr_t *slopalptr;
65 int bz, bzinc;
66 unsigned int u, v;
67 unsigned char *pp;
68
69 bz = asm3; bzinc = (asm1>>3);
70 slopalptr = (intptr_t *)slopaloffs;
71 pp = (unsigned char *)p;
72 for(;cnt>0;cnt--)
73 {
74 i = krecip(bz>>6); bz += bzinc;
75 u = bx+globalx3*i;
76 v = by+globaly3*i;
77 *pp = *(unsigned char *)(slopalptr[0]+gbuf[((u>>(32-glogx))<<glogy)+(v>>(32-glogy))]);
78 slopalptr--;
79 pp += gpinc;
80 }
81 }
82
83
84 //Wall,face sprite/wall sprite vertical line functions
setupvlineasm(int neglogy)85 void setupvlineasm(int neglogy) { glogy = neglogy; }
vlineasm1(int vinc,void * paloffs,int cnt,unsigned int vplc,void * bufplc,void * p)86 void vlineasm1(int vinc, void *paloffs, int cnt, unsigned int vplc, void *bufplc, void *p)
87 {
88 unsigned char *pp;
89
90 gbuf = (unsigned char *)bufplc;
91 gpal = (unsigned char *)paloffs;
92 pp = (unsigned char *)p;
93 for(;cnt>=0;cnt--)
94 {
95 *pp = gpal[gbuf[vplc>>glogy]];
96 pp += bpl;
97 vplc += vinc;
98 }
99 }
100
setupmvlineasm(int neglogy)101 void setupmvlineasm(int neglogy) { glogy = neglogy; }
mvlineasm1(int vinc,void * paloffs,int cnt,unsigned int vplc,void * bufplc,void * p)102 void mvlineasm1(int vinc, void *paloffs, int cnt, unsigned int vplc, void *bufplc, void *p)
103 {
104 unsigned char ch, *pp;
105
106 gbuf = (unsigned char *)bufplc;
107 gpal = (unsigned char *)paloffs;
108 pp = (unsigned char *)p;
109 for(;cnt>=0;cnt--)
110 {
111 ch = gbuf[vplc>>glogy]; if (ch != 255) *pp = gpal[ch];
112 pp += bpl;
113 vplc += vinc;
114 }
115 }
116
setuptvlineasm(int neglogy)117 void setuptvlineasm(int neglogy) { glogy = neglogy; }
tvlineasm1(int vinc,void * paloffs,int cnt,unsigned int vplc,void * bufplc,void * p)118 void tvlineasm1(int vinc, void *paloffs, int cnt, unsigned int vplc, void *bufplc, void *p)
119 {
120 unsigned char ch, *pp;
121
122 gbuf = (unsigned char *)bufplc;
123 gpal = (unsigned char *)paloffs;
124 pp = (unsigned char *)p;
125 if (transmode)
126 {
127 for(;cnt>=0;cnt--)
128 {
129 ch = gbuf[vplc>>glogy];
130 if (ch != 255) *pp = gtrans[(*pp)+(gpal[ch]<<8)];
131 pp += bpl;
132 vplc += vinc;
133 }
134 }
135 else
136 {
137 for(;cnt>=0;cnt--)
138 {
139 ch = gbuf[vplc>>glogy];
140 if (ch != 255) *pp = gtrans[((*pp)<<8)+gpal[ch]];
141 pp += bpl;
142 vplc += vinc;
143 }
144 }
145 }
146
147 //Floor sprite horizontal line functions
msethlineshift(int logx,int logy)148 void msethlineshift(int logx, int logy) { glogx = logx; glogy = logy; }
mhline(void * bufplc,unsigned int bx,int cntup16,int UNUSED (junk),unsigned int by,void * p)149 void mhline(void *bufplc, unsigned int bx, int cntup16, int UNUSED(junk), unsigned int by, void *p)
150 {
151 unsigned char ch, *pp;
152
153 gbuf = (unsigned char *)bufplc;
154 gpal = (unsigned char *)asm3;
155 pp = (unsigned char *)p;
156 for(cntup16>>=16;cntup16>0;cntup16--)
157 {
158 ch = gbuf[((bx>>(32-glogx))<<glogy)+(by>>(32-glogy))];
159 if (ch != 255) *pp = gpal[ch];
160 bx += asm1;
161 by += asm2;
162 pp++;
163 }
164 }
165
tsethlineshift(int logx,int logy)166 void tsethlineshift(int logx, int logy) { glogx = logx; glogy = logy; }
thline(void * bufplc,unsigned int bx,int cntup16,int UNUSED (junk),unsigned int by,void * p)167 void thline(void *bufplc, unsigned int bx, int cntup16, int UNUSED(junk), unsigned int by, void *p)
168 {
169 unsigned char ch, *pp;
170
171 gbuf = (unsigned char *)bufplc;
172 gpal = (unsigned char *)asm3;
173 pp = (unsigned char *)p;
174 if (transmode)
175 {
176 for(cntup16>>=16;cntup16>0;cntup16--)
177 {
178 ch = gbuf[((bx>>(32-glogx))<<glogy)+(by>>(32-glogy))];
179 if (ch != 255) *pp = gtrans[(*pp)+(gpal[ch]<<8)];
180 bx += asm1;
181 by += asm2;
182 pp++;
183 }
184 }
185 else
186 {
187 for(cntup16>>=16;cntup16>0;cntup16--)
188 {
189 ch = gbuf[((bx>>(32-glogx))<<glogy)+(by>>(32-glogy))];
190 if (ch != 255) *pp = gtrans[((*pp)<<8)+gpal[ch]];
191 bx += asm1;
192 by += asm2;
193 pp++;
194 }
195 }
196 }
197
198
199 //Rotatesprite vertical line functions
setupspritevline(void * paloffs,int bxinc,int byinc,int ysiz)200 void setupspritevline(void *paloffs, int bxinc, int byinc, int ysiz)
201 {
202 gpal = (unsigned char *)paloffs;
203 gbxinc = bxinc;
204 gbyinc = byinc;
205 glogy = ysiz;
206 }
spritevline(int bx,int by,int cnt,void * bufplc,void * p)207 void spritevline(int bx, int by, int cnt, void *bufplc, void *p)
208 {
209 unsigned char *pp;
210
211 gbuf = (unsigned char *)bufplc;
212 pp = (unsigned char *)p;
213 for(;cnt>1;cnt--)
214 {
215 *pp = gpal[gbuf[(bx>>16)*glogy+(by>>16)]];
216 bx += gbxinc;
217 by += gbyinc;
218 pp += bpl;
219 }
220 }
221
222 //Rotatesprite vertical line functions
msetupspritevline(void * paloffs,int bxinc,int byinc,int ysiz)223 void msetupspritevline(void *paloffs, int bxinc, int byinc, int ysiz)
224 {
225 gpal = (unsigned char *)paloffs;
226 gbxinc = bxinc;
227 gbyinc = byinc;
228 glogy = ysiz;
229 }
mspritevline(int bx,int by,int cnt,void * bufplc,void * p)230 void mspritevline(int bx, int by, int cnt, void *bufplc, void *p)
231 {
232 unsigned char ch, *pp;
233
234 gbuf = (unsigned char *)bufplc;
235 pp = (unsigned char *)p;
236 for(;cnt>1;cnt--)
237 {
238 ch = gbuf[(bx>>16)*glogy+(by>>16)];
239 if (ch != 255) *pp = gpal[ch];
240 bx += gbxinc;
241 by += gbyinc;
242 pp += bpl;
243 }
244 }
245
tsetupspritevline(void * paloffs,int bxinc,int byinc,int ysiz)246 void tsetupspritevline(void *paloffs, int bxinc, int byinc, int ysiz)
247 {
248 gpal = (unsigned char *)paloffs;
249 gbxinc = bxinc;
250 gbyinc = byinc;
251 glogy = ysiz;
252 }
tspritevline(int bx,int by,int cnt,void * bufplc,void * p)253 void tspritevline(int bx, int by, int cnt, void *bufplc, void *p)
254 {
255 unsigned char ch, *pp;
256
257 gbuf = (unsigned char *)bufplc;
258 pp = (unsigned char *)p;
259 if (transmode)
260 {
261 for(;cnt>1;cnt--)
262 {
263 ch = gbuf[(bx>>16)*glogy+(by>>16)];
264 if (ch != 255) *pp = gtrans[(*pp)+(gpal[ch]<<8)];
265 bx += gbxinc;
266 by += gbyinc;
267 pp += bpl;
268 }
269 }
270 else
271 {
272 for(;cnt>1;cnt--)
273 {
274 ch = gbuf[(bx>>16)*glogy+(by>>16)];
275 if (ch != 255) *pp = gtrans[((*pp)<<8)+gpal[ch]];
276 bx += gbxinc;
277 by += gbyinc;
278 pp += bpl;
279 }
280 }
281 }
282
setupdrawslab(int dabpl,void * pal)283 void setupdrawslab (int dabpl, void *pal)
284 { bpl = dabpl; gpal = (unsigned char *)pal; }
285
drawslab(int dx,int v,int dy,int vi,void * vptr,void * p)286 void drawslab (int dx, int v, int dy, int vi, void *vptr, void *p)
287 {
288 int x;
289 unsigned char *pp, *vpptr;
290
291 pp = (unsigned char *)p;
292 vpptr = (unsigned char *)vptr;
293 while (dy > 0)
294 {
295 for(x=0;x<dx;x++) *(pp+x) = gpal[(int)(*(vpptr+(v>>16)))];
296 pp += bpl; v += vi; dy--;
297 }
298 }
299
stretchhline(void * UNUSED (p0),int u,int cnt,int uinc,void * rptr,void * p)300 void stretchhline (void * UNUSED(p0), int u, int cnt, int uinc, void *rptr, void *p)
301 {
302 unsigned char *pp, *rpptr, *np;
303
304 rpptr = (unsigned char *)rptr;
305 pp = (unsigned char *)p;
306 np = (unsigned char *)((intptr_t)p-(cnt<<2));
307 do
308 {
309 pp--;
310 *pp = *(rpptr+(u>>16)); u -= uinc;
311 } while (pp > np);
312 }
313
314
mmxoverlay()315 void mmxoverlay() { }
316
317 #endif
318 /*
319 * vim:ts=4:
320 */
321
322