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