duke3d/buildengine/a.c

1091 lines
26 KiB
C
Executable File

// "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
// Ken Silverman's official web site: "http://www.advsys.net/ken"
// See the included license file "BUILDLIC.TXT" for license info.
// This file has been modified from Ken Silverman's original release
/* DDOI - This file is an attempt to reimplement a_nasm.asm in C */
#include "platform.h"
#include "build.h"
#define shrd(a,b,c) (((b)<<(32-(c))) | ((a)>>(c)))
#define shld(a,b,c) (((b)>>(32-(c))) | ((a)<<(c)))
extern long asm1;
extern long asm2;
extern long asm3;
extern long asm4;
long is_vmware_running(void)
{
return 0;
} /* is_vmware_running */
/* #pragma aux mmxoverlay modify [eax ebx ecx edx] */
long mmxoverlay(void)
{
return 0;
} /* mmxoverlay */
/* #pragma aux sethlinesizes parm [eax][ebx][ecx] */
static unsigned char machxbits_al;
static unsigned char machxbits_bl;
static long machxbits_ecx;
void sethlinesizes(long i1, long i2, long i3)
{
machxbits_al = i1;
machxbits_bl = i2;
machxbits_ecx = i3;
} /* sethlinesizes */
static unsigned char* pal_eax;
void setuphlineasm4(long i1, long i2) { }
void setpalookupaddress(unsigned char *i1) { pal_eax = i1; }
void hlineasm4(long _count, unsigned long unused_source, long _shade, unsigned long _i4, unsigned long _i5, long i6)
{
/* force into registers (probably only useful on PowerPC)... */
register unsigned char *dest = (unsigned char *) i6;
register unsigned long i4 = _i4;
register unsigned long i5 = _i5;
register int shifter = ((256-machxbits_al) & 0x1f);
register unsigned long source;
register long shade = _shade & 0xffffff00;
register long count = _count + 1;
register unsigned char bits = machxbits_bl;
register unsigned char *lookup = (unsigned char *) machxbits_ecx;
register unsigned char *pal = (unsigned char *) pal_eax;
register long _asm1 = asm1;
register long _asm2 = asm2;
while (count) {
source = i5 >> shifter;
source = shld(source,i4,bits);
source = lookup[source];
*dest = pal[shade|source];
dest--;
i5 -= _asm1;
i4 -= _asm2;
count--;
}
}
static long rmach_eax;
static long rmach_ebx;
static long rmach_ecx;
static long rmach_edx;
static long rmach_esi;
void setuprhlineasm4(long i1, long i2, long i3, long i4, long i5, long i6)
{
rmach_eax = i1;
rmach_ebx = i2;
rmach_ecx = i3;
rmach_edx = i4;
rmach_esi = i5;
} /* setuprhlineasm4 */
void rhlineasm4(long i1, long i2, long i3, unsigned long i4, unsigned long i5, long i6)
{
unsigned long ebp = i6 - i1;
unsigned long rmach6b = ebp-1;
if (i1 <= 0) return;
i6 = i1;
do {
i3 = ((i3&0xffffff00)|(*((unsigned char *)i2)));
i4 -= rmach_eax;
ebp = (((i4+rmach_eax) < i4) ? -1 : 0);
i5 -= rmach_ebx;
if ((i5 + rmach_ebx) < i5) i2 -= (rmach_ecx+1);
else i2 -= rmach_ecx;
ebp &= rmach_esi;
i1 = ((i1&0xffffff00)|(((unsigned char *)i3)[rmach_edx]));
((unsigned char *)rmach6b)[i6] = (i1&0xff);
i2 -= ebp;
i6--;
} while (i6);
} /* rhlineasm4 */
static long rmmach_eax;
static long rmmach_ebx;
static long rmmach_ecx;
static long rmmach_edx;
static long rmmach_esi;
void setuprmhlineasm4(long i1, long i2, long i3, long i4, long i5, long i6)
{
rmmach_eax = i1;
rmmach_ebx = i2;
rmmach_ecx = i3;
rmmach_edx = i4;
rmmach_esi = i5;
} /* setuprmhlineasm4 */
/* #pragma aux rmhlineasm4 parm [eax][ebx][ecx][edx][esi][edi] */
void rmhlineasm4(long i1, long i2, long i3, long i4, long i5, long i6)
{
unsigned long ebp = i6 - i1;
unsigned long rmach6b = ebp-1;
if (i1 <= 0) return;
i6 = i1;
do {
i3 = ((i3&0xffffff00)|(*((unsigned char *)i2)));
i4 -= rmmach_eax;
ebp = (((i4+rmmach_eax) < i4) ? -1 : 0);
i5 -= rmmach_ebx;
if ((i5 + rmmach_ebx) < i5) i2 -= (rmmach_ecx+1);
else i2 -= rmmach_ecx;
ebp &= rmmach_esi;
if ((i3&0xff) != 255) {
i1 = ((i1&0xffffff00)|(((unsigned char *)i3)[rmmach_edx]));
((unsigned char *)rmach6b)[i6] = (i1&0xff);
}
i2 -= ebp;
i6--;
} while (i6);
} /* rmhlineasm4 */
/* #pragma aux setupqrhlineasm4 parm [eax][ebx][ecx][edx][esi][edi] */
void setupqrhlineasm4(long i1, long i2, long i3, long i4, long i5, long i6)
{
setuprhlineasm4(i1,i2,i3,i4,i5,i6);
} /* setupqrhlineasm4 */
/* #pragma aux qrhlineasm4 parm [eax][ebx][ecx][edx][esi][edi] */
void qrhlineasm4(long i1, long i2, long i3, long i4, long i5, long i6)
{
rhlineasm4(i1,i2,i3,i4,i5,i6);
} /* qrhlineasm4 */
/* #pragma aux setvlinebpl parm [eax] */
static long fixchain;
void setvlinebpl(long i1)
{
fixchain = i1;
} /* setvlinebpl */
/* #pragma aux fixtransluscence parm [eax] */
static long tmach;
void fixtransluscence(long i1)
{
tmach = i1;
} /* fixtransluscence */
long vlineasm1(long i1, long i2, long i3, long i4, long i5, long i6);
/* #pragma aux prevlineasm1 parm [eax][ebx][ecx][edx][esi][edi] */
static unsigned char mach3_al;
long prevlineasm1(long i1, long i2, long i3, long i4, long i5, long i6)
{
unsigned char *source = (unsigned char *)i5;
unsigned char *dest = (unsigned char *)i6;
if (i3 == 0)
{
i1 += i4;
i4 = (long) (((unsigned long)i4) >> mach3_al);
i4 = (i4&0xffffff00) | (source[i4]&0xff);
*dest = ((unsigned char*)i2)[i4];
return i1;
} else {
return vlineasm1(i1,i2,i3,i4,i5,i6);
}
} /* prevlineasm1 */
/* #pragma aux vlineasm1 parm [eax][ebx][ecx][edx][esi][edi] */
long vlineasm1(long vince, long palookupoffse, long i3, long vplce, long bufplce, long i6)
{
unsigned long temp;
unsigned char *dest = (unsigned char *)i6;
i3++;
while (i3)
{
temp = ((unsigned)vplce) >> mach3_al;
temp = ((unsigned char *)bufplce)[temp];
*dest = ((unsigned char*)palookupoffse)[temp];
vplce += vince;
dest += fixchain;
i3--;
}
return vplce;
} /* vlineasm1 */
/* #pragma aux setuptvlineasm parm [eax] */
static unsigned char transmach3_al = 32;
void setuptvlineasm(long i1)
{
transmach3_al = (i1 & 0x1f);
} /* setuptvlineasm */
/* #pragma aux tvlineasm1 parm [eax][ebx][ecx][edx][esi][edi] */
static int transrev = 0;
long tvlineasm1(long i1, long i2, long i3, long i4, long i5, long i6)
{
unsigned char *source = (unsigned char *)i5;
unsigned char *dest = (unsigned char *)i6;
i3++;
while (i3)
{
unsigned long temp = i4;
temp >>= transmach3_al;
temp = source[temp];
if (temp != 255)
{
unsigned short val;
val = ((unsigned char *)i2)[temp];
val |= ((*dest)<<8);
if (transrev) val = ((val>>8)|(val<<8));
*dest = ((unsigned char *)tmach)[val];
}
i4 += i1;
dest += fixchain;
i3--;
}
return i4;
} /* tvlineasm1 */
/* #pragma aux setuptvlineasm2 parm [eax][ebx][ecx] */
static unsigned char tran2shr;
static unsigned long tran2pal_ebx;
static unsigned long tran2pal_ecx;
void setuptvlineasm2(long i1, long i2, long i3)
{
tran2shr = (i1&0x1f);
tran2pal_ebx = i2;
tran2pal_ecx = i3;
} /* */
/* #pragma aux tvlineasm2 parm [eax][ebx][ecx][edx][esi][edi] */
void tvlineasm2(unsigned long i1, unsigned long i2, unsigned long i3, unsigned long i4, unsigned long i5, unsigned long i6)
{
unsigned long ebp = i1;
unsigned long tran2inca = i2;
unsigned long tran2incb = asm1;
unsigned long tran2bufa = i3;
unsigned long tran2bufb = i4;
unsigned long tran2edi = asm2;
unsigned long tran2edi1 = asm2 + 1;
i6 -= asm2;
do {
i1 = i5 >> tran2shr;
i2 = ebp >> tran2shr;
i5 += tran2inca;
ebp += tran2incb;
i3 = ((unsigned char *)tran2bufa)[i1];
i4 = ((unsigned char *)tran2bufb)[i2];
if (i3 == 255) { // skipdraw1
if (i4 != 255) { // skipdraw3
unsigned short val;
val = ((unsigned char *)tran2pal_ecx)[i4];
val |= (((unsigned char *)i6)[tran2edi1]<<8);
if (transrev) val = ((val>>8)|(val<<8));
((unsigned char *)i6)[tran2edi1] =
((unsigned char *)tmach)[val];
}
} else if (i4 == 255) { // skipdraw2
unsigned short val;
val = ((unsigned char *)tran2pal_ebx)[i3];
val |= (((unsigned char *)i6)[tran2edi]<<8);
if (transrev) val = ((val>>8)|(val<<8));
((unsigned char *)i6)[tran2edi] =
((unsigned char *)tmach)[val];
} else {
unsigned short l = ((unsigned char *)i6)[tran2edi]<<8;
unsigned short r = ((unsigned char *)i6)[tran2edi1]<<8;
l |= ((unsigned char *)tran2pal_ebx)[i3];
r |= ((unsigned char *)tran2pal_ecx)[i4];
if (transrev) {
l = ((l>>8)|(l<<8));
r = ((r>>8)|(r<<8));
}
((unsigned char *)i6)[tran2edi] =
((unsigned char *)tmach)[l];
((unsigned char *)i6)[tran2edi1] =
((unsigned char *)tmach)[r];
}
i6 += fixchain;
} while (i6 > i6 - fixchain);
asm1 = i5;
asm2 = ebp;
} /* tvlineasm2 */
/* #pragma aux mvlineasm1 parm [eax][ebx][ecx][edx][esi][edi] */
static unsigned char machmv;
long mvlineasm1(long vince, long palookupoffse, long i3, long vplce, long bufplce, long i6)
{
unsigned long temp;
unsigned char *dest = (unsigned char *)i6;
while (i3)
{
temp = ((unsigned)vplce) >> machmv;
temp = ((unsigned char *)bufplce)[temp];
if (temp != 255) *dest = ((unsigned char*)palookupoffse)[temp];
vplce += vince;
dest += fixchain;
i3--;
}
return vplce;
} /* mvlineasm1 */
/* #pragma aux setupvlineasm parm [eax] */
void setupvlineasm(long i1)
{
mach3_al = (i1&0x1f);
} /* setupvlineasm */
extern long vplce[4], vince[4], palookupoffse[4], bufplce[4];
#if HAVE_POWERPC
/* About 25% faster than the scalar version on my 12" Powerbook. --ryan. */
static void vlineasm4_altivec(long i1, long i2)
{
unsigned int mach_array[4] = { (unsigned int) mach3_al,
(unsigned int) mach3_al,
(unsigned int) mach3_al,
(unsigned int) mach3_al };
unsigned int temp[4];
unsigned long index = (i2 + ylookup[i1]);
unsigned char *dest = (unsigned char*)(-ylookup[i1]);
register vector unsigned int vec_temp;
register vector signed int vec_vplce;
register vector signed int vec_vince;
register vector signed int vec_bufplce;
register vector unsigned int vec_shifter;
register unsigned char *pal0 = (unsigned char *) palookupoffse[0];
register unsigned char *pal1 = (unsigned char *) palookupoffse[1];
register unsigned char *pal2 = (unsigned char *) palookupoffse[2];
register unsigned char *pal3 = (unsigned char *) palookupoffse[3];
vec_shifter = vec_ld(0, mach_array);
vec_vplce = vec_ld(0, vplce);
vec_vince = vec_ld(0, vince);
vec_bufplce = vec_ld(0, bufplce);
do {
vec_temp = (vector unsigned int) vec_sr(vec_vplce, vec_shifter);
vec_temp = (vector unsigned int) vec_add(vec_bufplce, (vector signed int) vec_temp);
vec_st(vec_temp, 0x00, temp);
vec_vplce = vec_add(vec_vplce, vec_vince);
dest[index] = pal0[*((unsigned char *) temp[0])];
dest[index+1] = pal1[*((unsigned char *) temp[1])];
dest[index+2] = pal2[*((unsigned char *) temp[2])];
dest[index+3] = pal3[*((unsigned char *) temp[3])];
dest += fixchain;
} while (((unsigned)dest - fixchain) < ((unsigned)dest));
vec_st(vec_vplce, 0, vplce);
}
#endif
/* #pragma aux vlineasm4 parm [ecx][edi] modify [eax ebx ecx edx esi edi] */
void vlineasm4(long i1, long i2)
{
#if HAVE_POWERPC
if (has_altivec)
vlineasm4_altivec(i1, i2);
else
#endif
{
int i;
unsigned long temp;
unsigned long index = (i2 + ylookup[i1]);
unsigned char *dest = (unsigned char*)(-ylookup[i1]);
do {
for (i = 0; i < 4; i++)
{
temp = ((unsigned)vplce[i]) >> mach3_al;
temp = (((unsigned char*)(bufplce[i]))[temp]);
dest[index+i] = ((unsigned char*)(palookupoffse[i]))[temp];
vplce[i] += vince[i];
}
dest += fixchain;
} while (((unsigned)dest - fixchain) < ((unsigned)dest));
}
} /* vlineasm4 */
/* #pragma aux setupmvlineasm parm [eax] */
void setupmvlineasm(long i1)
{
machmv = (i1&0x1f);
} /* setupmvlineasm */
/* #pragma aux mvlineasm4 parm [ecx][edi] modify [eax ebx ecx edx esi edi] */
void mvlineasm4(long i1, long i2)
{
int i;
unsigned long temp;
unsigned long index = (i2 + ylookup[i1]);
unsigned char *dest = (unsigned char*)(-ylookup[i1]);
do {
for (i = 0; i < 4; i++)
{
temp = ((unsigned)vplce[i]) >> machmv;
temp = (((unsigned char*)(bufplce[i]))[temp]);
if (temp != 255)
dest[index+i] = ((unsigned char*)(palookupoffse[i]))[temp];
vplce[i] += vince[i];
}
dest += fixchain;
} while (((unsigned)dest - fixchain) < ((unsigned)dest));
} /* mvlineasm4 */
/* #pragma aux setupspritevline parm [eax][ebx][ecx][edx][esi][edi] */
static long spal_eax;
static long smach_eax;
static long smach2_eax;
static long smach5_eax;
static long smach_ecx;
void setupspritevline(long i1, long i2, long i3, long i4, long i5, long i6)
{
spal_eax = i1;
smach_eax = (i5<<16);
smach2_eax = (i5>>16)+i2;
smach5_eax = smach2_eax + i4;
smach_ecx = i3;
} /* setupspritevline */
/* #pragma aux spritevline parm [eax][ebx][ecx][edx][esi][edi] */
void spritevline(long i1, unsigned long i2, long i3, unsigned long i4, long i5, long i6)
{
unsigned char *source = (unsigned char *)i5;
unsigned char *dest = (unsigned char *)i6;
dumblabel1:
i2 += smach_eax;
i1 = (i1&0xffffff00) | (*source&0xff);
if ((i2 - smach_eax) > i2) source += smach2_eax + 1;
else source += smach2_eax;
dumblabel2:
i1 = (i1&0xffffff00) | (((unsigned char *)spal_eax)[i1]&0xff);
*dest = i1;
dest += fixchain;
i4 += smach_ecx;
i4--;
if (!((i4 - smach_ecx) > i4) && i4 != 0)
goto dumblabel1;
if (i4 == 0) return;
i2 += smach_eax;
i1 = (i1&0xffffff00) | (*source&0xff);
if ((i2 - smach_eax) > i2) source += smach5_eax + 1;
else source += smach5_eax;
goto dumblabel2;
} /* spritevline */
/* #pragma aux msetupspritevline parm [eax][ebx][ecx][edx][esi][edi] */
static long mspal_eax;
static long msmach_eax;
static long msmach2_eax;
static long msmach5_eax;
static long msmach_ecx;
void msetupspritevline(long i1, long i2, long i3, long i4, long i5, long i6)
{
mspal_eax = i1;
msmach_eax = (i5<<16);
msmach2_eax = (i5>>16)+i2;
msmach5_eax = smach2_eax + i4;
msmach_ecx = i3;
} /* msetupspritevline */
/* #pragma aux mspritevline parm [eax][ebx][ecx][edx][esi][edi] */
void mspritevline(long i1, long i2, long i3, long i4, long i5, long i6)
{
unsigned char *source = (unsigned char *)i5;
unsigned char *dest = (unsigned char *)i6;
msdumblabel1:
i2 += smach_eax;
i1 = (i1&0xffffff00) | (*source&0xff);
if ((i2 - smach_eax) > i2) source += smach2_eax + 1;
else source += smach2_eax;
msdumblabel2:
if ((i1&0xff) != 255)
{
i1 = (i1&0xffffff00) | (((unsigned char *)spal_eax)[i1]&0xff);
*dest = i1;
}
dest += fixchain;
i4 += smach_ecx;
i4--;
if (!((i4 - smach_ecx) > i4) && i4 != 0)
goto msdumblabel1;
if (i4 == 0) return;
i2 += smach_eax;
i1 = (i1&0xffffff00) | (*source&0xff);
if ((i2 - smach_eax) > i2) source += smach5_eax + 1;
else source += smach5_eax;
goto msdumblabel2;
} /* mspritevline */
/* #pragma aux tsetupspritevline parm [eax][ebx][ecx][edx][esi][edi] */
unsigned long tspal;
unsigned long tsmach_eax1;
unsigned long tsmach_eax2;
unsigned long tsmach_eax3;
unsigned long tsmach_ecx;
void tsetupspritevline(long i1, long i2, long i3, long i4, long i5, long i6)
{
tspal = i1;
tsmach_eax1 = i5 << 16;
tsmach_eax2 = (i5 >> 16) + i2;
tsmach_eax3 = tsmach_eax2 + i4;
tsmach_ecx = i3;
} /* tsetupspritevline */
/* #pragma aux tspritevline parm [eax][ebx][ecx][edx][esi][edi] */
void tspritevline(long i1, long i2, long i3, unsigned long i4, long i5, long i6)
{
while (i3)
{
i3--;
if (i3 != 0)
{
unsigned long adder = tsmach_eax2;
i4 += tsmach_ecx;
if (i4 < (i4 - tsmach_ecx)) adder = tsmach_eax3;
i1 = *((unsigned char *)i5);
i2 += tsmach_eax1;
if (i2 < (i2 - tsmach_eax1)) i5++;
i5 += adder;
// tstartsvline
if (i1 != 0xff)
{
unsigned short val;
val = ((unsigned char*)tspal)[i1];
val |= ((*((unsigned char *)i6))<<8);
if (transrev) val = ((val>>8)|(val<<8));
i1 = ((unsigned char *)tmach)[val];
*((unsigned char *)i6) = (i1&0xff);
}
i6 += fixchain;
}
}
} /* tspritevline */
/* #pragma aux mhline parm [eax][ebx][ecx][edx][esi][edi] */
static long mmach_eax;
static long mmach_asm3;
static long mmach_asm1;
static long mmach_asm2;
void mhlineskipmodify(long i1, unsigned long i2, unsigned long i3, long i4, long i5, long i6);
void mhline(long i1, long i2, long i3, long i4, long i5, long i6)
{
mmach_eax = i1;
mmach_asm3 = asm3;
mmach_asm1 = asm1;
mmach_asm2 = asm2;
mhlineskipmodify(asm2,i2,i3,i4,i5,i6);
} /* mhline */
/* #pragma aux mhlineskipmodify parm [eax][ebx][ecx][edx][esi][edi] */
static unsigned char mshift_al = 26;
static unsigned char mshift_bl = 6;
void mhlineskipmodify(long i1, unsigned long i2, unsigned long i3, long i4, long i5, long i6)
{
unsigned long ebx;
int counter = (i3>>16);
while (counter >= 0)
{
ebx = i2 >> mshift_al;
ebx = shld (ebx, (unsigned)i5, mshift_bl);
i1 = ((unsigned char *)mmach_eax)[ebx];
if ((i1&0xff) != 0xff)
*((unsigned char *)i6) = (((unsigned char*)mmach_asm3)[i1]);
i2 += mmach_asm1;
i5 += mmach_asm2;
i6++;
counter--;
}
} /* mhlineskipmodify */
/* #pragma aux msethlineshift parm [eax][ebx] */
void msethlineshift(long i1, long i2)
{
i1 = 256-i1;
mshift_al = (i1&0x1f);
mshift_bl = (i2&0x1f);
} /* msethlineshift */
/* #pragma aux thline parm [eax][ebx][ecx][edx][esi][edi] */
static long tmach_eax;
static long tmach_asm3;
static long tmach_asm1;
static long tmach_asm2;
void thlineskipmodify(long i1, unsigned long i2, unsigned long i3, long i4, long i5, long i6);
void thline(long i1, long i2, long i3, long i4, long i5, long i6)
{
tmach_eax = i1;
tmach_asm3 = asm3;
tmach_asm1 = asm1;
tmach_asm2 = asm2;
thlineskipmodify(asm2,i2,i3,i4,i5,i6);
} /* thline */
/* #pragma aux thlineskipmodify parm [eax][ebx][ecx][edx][esi][edi] */
static unsigned char tshift_al = 26;
static unsigned char tshift_bl = 6;
void thlineskipmodify(long i1, unsigned long i2, unsigned long i3, long i4, long i5, long i6)
{
unsigned long ebx;
int counter = (i3>>16);
while (counter >= 0)
{
ebx = i2 >> tshift_al;
ebx = shld (ebx, (unsigned)i5, tshift_bl);
i1 = ((unsigned char *)tmach_eax)[ebx];
if ((i1&0xff) != 0xff)
{
unsigned short val = (((unsigned char*)tmach_asm3)[i1]);
val |= (*((unsigned char *)i6)<<8);
if (transrev) val = ((val>>8)|(val<<8));
*((unsigned char *)i6) = (((unsigned char*)tmach)[val]);
}
i2 += tmach_asm1;
i5 += tmach_asm2;
i6++;
counter--;
}
} /* thlineskipmodify */
/* #pragma aux tsethlineshift parm [eax][ebx] */
void tsethlineshift(long i1, long i2)
{
i1 = 256-i1;
tshift_al = (i1&0x1f);
tshift_bl = (i2&0x1f);
} /* tsethlineshift */
/* #pragma aux setupslopevlin parm [eax][ebx][ecx] modify [edx] */
static long slopemach_ebx;
static long slopemach_ecx;
static long slopemach_edx;
static unsigned char slopemach_ah1;
static unsigned char slopemach_ah2;
static float asm2_f;
typedef union { unsigned int i; float f; } bitwisef2i;
void setupslopevlin(long i1, long i2, long i3)
{
bitwisef2i c;
slopemach_ebx = i2;
slopemach_ecx = i3;
slopemach_edx = (1<<(i1&0x1f)) - 1;
slopemach_edx <<= ((i1&0x1f00)>>8);
slopemach_ah1 = 32-((i1&0x1f00)>>8);
slopemach_ah2 = (slopemach_ah1 - (i1&0x1f)) & 0x1f;
c.f = asm2_f = (float)asm1;
asm2 = c.i;
} /* setupslopevlin */
extern long reciptable[2048];
extern long globalx3, globaly3;
extern long fpuasm;
#define low32(a) ((a&0xffffffff))
#define high32(a) ((int)(((__int64)a&(__int64)0xffffffff00000000)>>32))
/* #pragma aux slopevlin parm [eax][ebx][ecx][edx][esi][edi] */
void slopevlin(long i1, unsigned long i2, long i3, long i4, long i5, long i6)
{
bitwisef2i c;
unsigned long ecx,eax,ebx,edx,esi,edi;
float a = (float) asm3 + asm2_f;
i1 -= slopemach_ecx;
esi = i5 + low32((__int64)globalx3 * (__int64)(i2<<3));
edi = i6 + low32((__int64)globaly3 * (__int64)(i2<<3));
ebx = i4;
do {
// -------------
// All this is calculating a fixed point approx. of 1/a
c.f = a;
fpuasm = eax = c.i;
edx = (((long)eax) < 0) ? 0xffffffff : 0;
eax = eax << 1;
ecx = (eax>>24); // exponent
eax = ((eax&0xffe000)>>11);
ecx = ((ecx&0xffffff00)|((ecx-2)&0xff));
eax = reciptable[eax/4];
eax >>= (ecx&0x1f);
eax ^= edx;
// -------------
edx = i2;
i2 = eax;
eax -= edx;
ecx = low32((__int64)globalx3 * (__int64)eax);
eax = low32((__int64)globaly3 * (__int64)eax);
a += asm2_f;
asm4 = ebx;
ecx = ((ecx&0xffffff00)|(ebx&0xff));
if (ebx >= 8) ecx = ((ecx&0xffffff00)|8);
ebx = esi;
edx = edi;
while ((ecx&0xff))
{
ebx >>= slopemach_ah2;
esi += ecx;
edx >>= slopemach_ah1;
ebx &= slopemach_edx;
edi += eax;
i1 += slopemach_ecx;
edx = ((edx&0xffffff00)|((((unsigned char *)(ebx+edx))[slopemach_ebx])));
ebx = *((unsigned long*)i3); // register trickery
i3 -= 4;
eax = ((eax&0xffffff00)|(*((unsigned char *)(ebx+edx))));
ebx = esi;
*((unsigned char *)i1) = (eax&0xff);
edx = edi;
ecx = ((ecx&0xffffff00)|((ecx-1)&0xff));
}
ebx = asm4;
ebx -= 8; // BITSOFPRECISIONPOW
} while ((long)ebx > 0);
} /* slopevlin */
/* #pragma aux settransnormal parm */
void settransnormal(void)
{
transrev = 0;
} /* settransnormal */
/* #pragma aux settransreverse parm */
void settransreverse(void)
{
transrev = 1;
} /* settransreverse */
/* #pragma aux setupdrawslab parm [eax][ebx] */
long setupdrawslab(long i1, long i2)
{
long retval = 0;
/*
__asm__ __volatile__ (
"call _asm_setupdrawslab \n\t"
: "=a" (retval)
: "a" (i1), "b" (i2)
: "cc", "memory");
*/
return(retval);
/*
_asm_setupdrawslab:
mov dword [voxbpl1+2], eax
mov dword [voxbpl2+2], eax
mov dword [voxbpl3+2], eax
mov dword [voxbpl4+2], eax
mov dword [voxbpl5+2], eax
mov dword [voxbpl6+2], eax
mov dword [voxbpl7+2], eax
mov dword [voxbpl8+2], eax
mov dword [voxpal1+2], ebx
mov dword [voxpal2+2], ebx
mov dword [voxpal3+2], ebx
mov dword [voxpal4+2], ebx
mov dword [voxpal5+2], ebx
mov dword [voxpal6+2], ebx
mov dword [voxpal7+2], ebx
mov dword [voxpal8+2], ebx
ret
*/
} /* setupdrawslab */
/* #pragma aux drawslab parm [eax][ebx][ecx][edx][esi][edi] */
long drawslab(long i1, long i2, long i3, long i4, long i5, long i6)
{
long retval = 0;
/*
__asm__ __volatile__ (
"call _asm_drawslab \n\t"
: "=a" (retval)
: "a" (i1), "b" (i2), "c" (i3), "d" (i4), "S" (i5), "D" (i6)
: "cc", "memory");
*/
return(retval);
/*
_asm_drawslab:
push ebp
cmp eax, 2
je voxbegdraw2
ja voxskip2
xor eax, eax
voxbegdraw1:
mov ebp, ebx
shr ebp, 16
add ebx, edx
dec ecx
mov al, byte [esi+ebp]
voxpal1: mov al, byte [eax+88888888h]
mov byte [edi], al
voxbpl1: lea edi, [edi+88888888h]
jnz voxbegdraw1
pop ebp
ret
voxbegdraw2:
mov ebp, ebx
shr ebp, 16
add ebx, edx
xor eax, eax
dec ecx
mov al, byte [esi+ebp]
voxpal2: mov al, byte [eax+88888888h]
mov ah, al
mov word [edi], ax
voxbpl2: lea edi, [edi+88888888h]
jnz voxbegdraw2
pop ebp
ret
voxskip2:
cmp eax, 4
jne voxskip4
xor eax, eax
voxbegdraw4:
mov ebp, ebx
add ebx, edx
shr ebp, 16
xor eax, eax
mov al, byte [esi+ebp]
voxpal3: mov al, byte [eax+88888888h]
mov ah, al
shl eax, 8
mov al, ah
shl eax, 8
mov al, ah
mov dword [edi], eax
voxbpl3: add edi, 88888888h
dec ecx
jnz voxbegdraw4
pop ebp
ret
voxskip4:
add eax, edi
test edi, 1
jz voxskipslab1
cmp edi, eax
je voxskipslab1
push eax
push ebx
push ecx
push edi
voxbegslab1:
mov ebp, ebx
add ebx, edx
shr ebp, 16
xor eax, eax
mov al, byte [esi+ebp]
voxpal4: mov al, byte [eax+88888888h]
mov byte [edi], al
voxbpl4: add edi, 88888888h
dec ecx
jnz voxbegslab1
pop edi
pop ecx
pop ebx
pop eax
inc edi
voxskipslab1:
push eax
test edi, 2
jz voxskipslab2
dec eax
cmp edi, eax
jge voxskipslab2
push ebx
push ecx
push edi
voxbegslab2:
mov ebp, ebx
add ebx, edx
shr ebp, 16
xor eax, eax
mov al, byte [esi+ebp]
voxpal5: mov al, byte [eax+88888888h]
mov ah, al
mov word [edi], ax
voxbpl5: add edi, 88888888h
dec ecx
jnz voxbegslab2
pop edi
pop ecx
pop ebx
add edi, 2
voxskipslab2:
mov eax, [esp]
sub eax, 3
cmp edi, eax
jge voxskipslab3
voxprebegslab3:
push ebx
push ecx
push edi
voxbegslab3:
mov ebp, ebx
add ebx, edx
shr ebp, 16
xor eax, eax
mov al, byte [esi+ebp]
voxpal6: mov al, byte [eax+88888888h]
mov ah, al
shl eax, 8
mov al, ah
shl eax, 8
mov al, ah
mov dword [edi], eax
voxbpl6: add edi, 88888888h
dec ecx
jnz voxbegslab3
pop edi
pop ecx
pop ebx
add edi, 4
mov eax, [esp]
sub eax, 3
cmp edi, eax
jl voxprebegslab3
voxskipslab3:
mov eax, [esp]
dec eax
cmp edi, eax
jge voxskipslab4
push ebx
push ecx
push edi
voxbegslab4:
mov ebp, ebx
add ebx, edx
shr ebp, 16
xor eax, eax
mov al, byte [esi+ebp]
voxpal7: mov al, byte [eax+88888888h]
mov ah, al
mov word [edi], ax
voxbpl7: add edi, 88888888h
dec ecx
jnz voxbegslab4
pop edi
pop ecx
pop ebx
add edi, 2
voxskipslab4:
pop eax
cmp edi, eax
je voxskipslab5
voxbegslab5:
mov ebp, ebx
add ebx, edx
shr ebp, 16
xor eax, eax
mov al, byte [esi+ebp]
voxpal8: mov al, byte [eax+88888888h]
mov byte [edi], al
voxbpl8: add edi, 88888888h
dec ecx
jnz voxbegslab5
voxskipslab5:
pop ebp
ret
*/
} /* drawslab */
/* #pragma aux stretchhline parm [eax][ebx][ecx][edx][esi][edi] */
long stretchhline(long i1, long i2, long i3, long i4, long i5, long i6)
{
long retval = 0;
/*
__asm__ __volatile__ (
"call _asm_stretchhline \n\t"
: "=a" (retval)
: "a" (i1), "b" (i2), "c" (i3), "d" (i4), "S" (i5), "D" (i6)
: "cc", "memory");
*/
return(retval);
/*
_asm_stretchhline:
push ebp
mov eax, ebx
shl ebx, 16
sar eax, 16
and ecx, 0000ffffh
or ecx, ebx
add esi, eax
mov eax, edx
mov edx, esi
mov ebp, eax
shl eax, 16
sar ebp, 16
add ecx, eax
adc esi, ebp
add eax, eax
adc ebp, ebp
mov dword [loinc1+2], eax
mov dword [loinc2+2], eax
mov dword [loinc3+2], eax
mov dword [loinc4+2], eax
inc ch
jmp begloop
begloop:
mov al, [edx]
loinc1: sub ebx, 88888888h
sbb edx, ebp
mov ah, [esi]
loinc2: sub ecx, 88888888h
sbb esi, ebp
sub edi, 4
shl eax, 16
loinc3: sub ebx, 88888888h
mov al, [edx]
sbb edx, ebp
mov ah, [esi]
loinc4: sub ecx, 88888888h
sbb esi, ebp
mov [edi], eax
dec cl
jnz begloop
dec ch
jnz begloop
pop ebp
ret
*/
} /* stretchhline */