2006-04-23 06:44:19 +00:00
|
|
|
// A.ASM replacement using C
|
|
|
|
// Mainly by Ken Silverman, with things melded with my port by
|
2012-03-12 04:47:04 +00:00
|
|
|
// Jonathon Fowler (jf@jonof.id.au)
|
2006-04-23 06:44:19 +00:00
|
|
|
//
|
|
|
|
// "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.
|
|
|
|
|
|
|
|
#include "a.h"
|
|
|
|
|
2006-09-10 17:40:34 +00:00
|
|
|
#ifdef ENGINE_USING_A_C
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t krecip(int32_t num); // from engine.c
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
#define BITSOFPRECISION 3
|
|
|
|
#define BITSOFPRECISIONPOW 8
|
|
|
|
|
2013-11-16 18:47:11 +00:00
|
|
|
// Compile code to saturate vplc for sprites to prevent stray lines at the
|
|
|
|
// bottom of non-y-flipped ones?
|
|
|
|
#define USE_SATURATE_VPLC
|
|
|
|
// Also for translucent masks?
|
|
|
|
//#define USE_SATURATE_VPLC_TRANS
|
|
|
|
|
2008-04-25 11:21:08 +00:00
|
|
|
extern intptr_t asm1, asm2, asm3, asm4;
|
2009-01-09 09:29:17 +00:00
|
|
|
extern int32_t fpuasm, globalx3, globaly3;
|
2006-04-23 06:44:19 +00:00
|
|
|
extern void *reciptable;
|
|
|
|
|
2013-09-21 13:37:31 +00:00
|
|
|
#ifdef USE_ASM64
|
|
|
|
# define A64_ASSIGN(var, val) var=val
|
|
|
|
#else
|
|
|
|
# define A64_ASSIGN(var, val)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef USE_ASM64
|
|
|
|
// variables for a64.yasm
|
|
|
|
int32_t a64_bpl, a64_transmode, a64_glogy;
|
|
|
|
intptr_t a64_paloffs;
|
|
|
|
char *a64_gtrans;
|
|
|
|
#endif
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
static int32_t bpl, transmode = 0;
|
|
|
|
static int32_t glogx, glogy, gbxinc, gbyinc, gpinc;
|
2006-04-23 06:44:19 +00:00
|
|
|
static char *gbuf, *gpal, *ghlinepal, *gtrans;
|
2012-03-18 23:17:17 +00:00
|
|
|
static char *gpal2;
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
//Global variable functions
|
2013-09-21 13:37:31 +00:00
|
|
|
void setvlinebpl(int32_t dabpl) { A64_ASSIGN(a64_bpl, dabpl); bpl = dabpl;}
|
|
|
|
void fixtransluscence(intptr_t datransoff)
|
|
|
|
{
|
|
|
|
A64_ASSIGN(a64_gtrans, (char *)datransoff);
|
|
|
|
gtrans = (char *)datransoff;
|
|
|
|
}
|
|
|
|
void settransnormal(void) { A64_ASSIGN(a64_transmode, 0); transmode = 0; }
|
|
|
|
void settransreverse(void) { A64_ASSIGN(a64_transmode, 1); transmode = 1; }
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
|
2012-03-04 20:12:30 +00:00
|
|
|
///// Ceiling/floor horizontal line functions /////
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void sethlinesizes(int32_t logx, int32_t logy, intptr_t bufplc)
|
2006-04-24 19:04:22 +00:00
|
|
|
{ glogx = logx; glogy = logy; gbuf = (char *)bufplc; }
|
2006-04-23 06:44:19 +00:00
|
|
|
void setpalookupaddress(char *paladdr) { ghlinepal = paladdr; }
|
2009-01-09 09:29:17 +00:00
|
|
|
void setuphlineasm4(int32_t bxinc, int32_t byinc) { gbxinc = bxinc; gbyinc = byinc; }
|
|
|
|
void hlineasm4(int32_t cnt, int32_t skiploadincs, int32_t paloffs, uint32_t by, uint32_t bx, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
if (!skiploadincs) { gbxinc = asm1; gbyinc = asm2; }
|
2012-03-04 20:12:30 +00:00
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
2012-03-04 20:12:30 +00:00
|
|
|
const char *const palptr = &ghlinepal[paloffs];
|
|
|
|
const char *const buf = gbuf;
|
|
|
|
const int32_t bxinc = gbxinc, byinc = gbyinc;
|
|
|
|
const int32_t logx = glogx, logy = glogy;
|
|
|
|
char *pp = (char *)p;
|
|
|
|
|
|
|
|
for (; cnt>=0; cnt--)
|
|
|
|
{
|
|
|
|
*pp = palptr[buf[((bx>>(32-logx))<<logy)+(by>>(32-logy))]];
|
|
|
|
bx -= bxinc;
|
|
|
|
by -= byinc;
|
|
|
|
pp--;
|
|
|
|
}
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-03-04 20:12:30 +00:00
|
|
|
///// Sloped ceiling/floor vertical line functions /////
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void setupslopevlin(int32_t logylogx, intptr_t bufplc, int32_t pinc)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
glogx = (logylogx&255); glogy = (logylogx>>8);
|
|
|
|
gbuf = (char *)bufplc; gpinc = pinc;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
2009-01-09 09:29:17 +00:00
|
|
|
void slopevlin(intptr_t p, int32_t i, intptr_t slopaloffs, int32_t cnt, int32_t bx, int32_t by)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2011-01-16 02:50:27 +00:00
|
|
|
intptr_t *slopalptr;
|
2009-11-04 08:11:21 +00:00
|
|
|
int32_t bz, bzinc;
|
2009-01-09 09:29:17 +00:00
|
|
|
uint32_t u, v;
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
bz = asm3; bzinc = (asm1>>3);
|
2011-01-16 02:50:27 +00:00
|
|
|
slopalptr = (intptr_t *)slopaloffs;
|
2009-02-19 16:47:54 +00:00
|
|
|
for (; cnt>0; cnt--)
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
i = krecip(bz>>6); bz += bzinc;
|
Integer Overflow Offensive continued: first round of -ftrapv - cleanness.
That is, "clang -ftrapv" builds don't abort almost immediately after entering
a level.
There are various classes of overflow bugs, needing different handling:
- Some texture mapping code was written with signed integer wrapping semantics
in mind. In some places, we're able to get away with unsigned casts.
- sometimes, we really need a wider range, like when calculating distances or
dot products
- negating INT_MIN. Here, we cast to int64_t temporarily. Note that if the
result is 32-bit wide, no 64-bit code may actually need to be generated.
- shifting into a signed integer's sign bit. We cast to uint32 here.
- in hitscan(), at the "abyss crash prevention code" comment, it's clearly
the other code that is better...
This is not merely done for pedantry, but rather makes it easier to track down
overflow bugs having a real impact on the game.
git-svn-id: https://svn.eduke32.com/eduke32@2784 1a8010ca-5511-0410-912e-c29ae57300e0
2012-06-26 19:49:53 +00:00
|
|
|
u = bx+(int64_t)globalx3*i;
|
|
|
|
v = by+(int64_t)globaly3*i;
|
2008-04-25 11:21:08 +00:00
|
|
|
(*(char *)p) = *(char *)(((intptr_t)slopalptr[0])+gbuf[((u>>(32-glogx))<<glogy)+(v>>(32-glogy))]);
|
2006-04-24 19:04:22 +00:00
|
|
|
slopalptr--;
|
|
|
|
p += gpinc;
|
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-03-04 20:12:30 +00:00
|
|
|
///// Wall,face sprite/wall sprite vertical line functions /////
|
|
|
|
|
2012-07-06 11:26:24 +00:00
|
|
|
|
|
|
|
extern int32_t globaltilesizy;
|
|
|
|
|
|
|
|
static inline uint32_t ourmulscale32(uint32_t a, uint32_t b)
|
|
|
|
{
|
|
|
|
return ((uint64_t)a*b)>>32;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int32_t getpix(int32_t logy, const char *buf, uint32_t vplc)
|
|
|
|
{
|
|
|
|
if (logy != 0)
|
|
|
|
return buf[vplc>>logy];
|
|
|
|
else
|
|
|
|
return buf[ourmulscale32(vplc,globaltilesizy)];
|
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void setupvlineasm(int32_t neglogy) { glogy = neglogy; }
|
2012-03-04 20:12:30 +00:00
|
|
|
// cnt+1 loop iterations!
|
2012-03-18 23:16:57 +00:00
|
|
|
int32_t vlineasm1(int32_t vinc, intptr_t paloffs, int32_t cnt, uint32_t vplc, intptr_t bufplc, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2012-03-04 20:12:30 +00:00
|
|
|
const char *const buf = (char *)bufplc;
|
|
|
|
const char *const pal = (char *)paloffs;
|
|
|
|
const int32_t logy = glogy, ourbpl = bpl;
|
|
|
|
char *pp = (char *)p;
|
|
|
|
|
|
|
|
cnt++;
|
|
|
|
|
|
|
|
do
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
if (logy != 0)
|
|
|
|
*pp = pal[buf[vplc>>logy]];
|
|
|
|
else
|
|
|
|
*pp = pal[buf[ourmulscale32(vplc,globaltilesizy)]];
|
|
|
|
|
2012-03-04 20:12:30 +00:00
|
|
|
pp += ourbpl;
|
2006-04-24 19:04:22 +00:00
|
|
|
vplc += vinc;
|
|
|
|
}
|
2012-03-04 20:12:30 +00:00
|
|
|
while (--cnt);
|
2012-03-18 23:16:57 +00:00
|
|
|
|
|
|
|
return vplc;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
extern intptr_t palookupoffse[4];
|
2012-11-15 14:28:11 +00:00
|
|
|
extern uint32_t vplce[4];
|
|
|
|
extern int32_t vince[4];
|
2012-03-18 23:16:57 +00:00
|
|
|
extern intptr_t bufplce[4];
|
|
|
|
|
2013-11-28 21:18:07 +00:00
|
|
|
#if !defined __has_extension
|
|
|
|
# define __has_extension(x) 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if (defined __GNUC__ && __GNUC_MINOR__ >= 7) || (defined __clang__ && __has_extension(attribute_ext_vector_type))
|
2013-11-16 18:47:12 +00:00
|
|
|
# if defined _WIN64 || defined __amd64 || defined __x86_64 || defined __x86_64__
|
|
|
|
# define USE_VECTOR_EXT
|
|
|
|
# endif
|
2013-11-16 18:47:07 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef USE_VECTOR_EXT
|
|
|
|
typedef uint32_t uint32_vec4 __attribute__ ((vector_size (16)));
|
|
|
|
#endif
|
|
|
|
|
2013-11-16 18:47:11 +00:00
|
|
|
#ifdef USE_SATURATE_VPLC
|
|
|
|
# define saturate_vplc(vplc, vinc) vplc |= g_saturate & -(vplc < (uint32_t)vinc)
|
|
|
|
// NOTE: the vector types yield -1 for logical "true":
|
|
|
|
# define saturate_vplc_vec(vplc, vinc) vplc |= g_saturate & (vplc < vinc)
|
|
|
|
# ifdef USE_SATURATE_VPLC_TRANS
|
|
|
|
# define saturate_vplc_trans(vplc, vinc) saturate_vplc(vplc, vinc)
|
|
|
|
# else
|
|
|
|
# define saturate_vplc_trans(vplc, vinc)
|
|
|
|
# endif
|
|
|
|
#else
|
|
|
|
# define saturate_vplc(vplc, vinc)
|
|
|
|
# define saturate_vplc_vec(vplc, vinc)
|
|
|
|
# define saturate_vplc_trans(vplc, vinc)
|
|
|
|
#endif
|
|
|
|
|
2012-03-18 23:16:57 +00:00
|
|
|
// cnt >= 1
|
|
|
|
void vlineasm4(int32_t cnt, char *p)
|
|
|
|
{
|
|
|
|
char ch;
|
|
|
|
int32_t i;
|
2013-11-16 18:47:07 +00:00
|
|
|
|
2012-03-18 23:16:57 +00:00
|
|
|
char *const pal[4] = {(char *)palookupoffse[0], (char *)palookupoffse[1], (char *)palookupoffse[2], (char *)palookupoffse[3]};
|
|
|
|
char *const buf[4] = {(char *)bufplce[0], (char *)bufplce[1], (char *)bufplce[2], (char *)bufplce[3]};
|
2013-11-16 18:47:07 +00:00
|
|
|
#ifdef USE_VECTOR_EXT
|
|
|
|
uint32_vec4 vinc = {vince[0], vince[1], vince[2], vince[3]};
|
|
|
|
uint32_vec4 vplc = {vplce[0], vplce[1], vplce[2], vplce[3]};
|
|
|
|
#else
|
2012-03-18 23:16:57 +00:00
|
|
|
const int32_t vinc[4] = {vince[0], vince[1], vince[2], vince[3]};
|
|
|
|
uint32_t vplc[4] = {vplce[0], vplce[1], vplce[2], vplce[3]};
|
|
|
|
#endif
|
|
|
|
const int32_t logy = glogy, ourbpl = bpl;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
for (i=0; i<4; i++)
|
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf[i], vplc[i]);
|
|
|
|
p[i] = pal[i][ch];
|
2013-11-16 18:47:07 +00:00
|
|
|
#if !defined USE_VECTOR_EXT
|
2012-03-18 23:16:57 +00:00
|
|
|
vplc[i] += vinc[i];
|
2013-11-16 18:47:07 +00:00
|
|
|
#endif
|
2012-03-18 23:16:57 +00:00
|
|
|
}
|
2013-11-16 18:47:07 +00:00
|
|
|
#ifdef USE_VECTOR_EXT
|
|
|
|
vplc += vinc;
|
|
|
|
#endif
|
2012-03-18 23:16:57 +00:00
|
|
|
p += ourbpl;
|
|
|
|
}
|
|
|
|
while (--cnt);
|
|
|
|
|
2013-11-16 18:47:07 +00:00
|
|
|
for (i=0; i<4; i++)
|
|
|
|
vplce[i] = vplc[i];
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2013-11-16 18:47:11 +00:00
|
|
|
#ifdef USE_SATURATE_VPLC
|
|
|
|
static int32_t g_saturate; // -1 if saturating vplc is requested, 0 else
|
|
|
|
# define set_saturate(dosaturate) g_saturate = -!!dosaturate
|
|
|
|
#else
|
|
|
|
# define set_saturate(dosaturate) UNREFERENCED_PARAMETER(dosaturate)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void setupmvlineasm(int32_t neglogy, int32_t dosaturate)
|
|
|
|
{
|
|
|
|
glogy = neglogy;
|
|
|
|
set_saturate(dosaturate);
|
|
|
|
}
|
|
|
|
|
2012-03-04 20:12:30 +00:00
|
|
|
// cnt+1 loop iterations!
|
2012-03-18 23:16:57 +00:00
|
|
|
int32_t mvlineasm1(int32_t vinc, intptr_t paloffs, int32_t cnt, uint32_t vplc, intptr_t bufplc, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
char ch;
|
|
|
|
|
2012-03-04 20:12:30 +00:00
|
|
|
const char *const buf = (char *)bufplc;
|
|
|
|
const char *const pal = (char *)paloffs;
|
|
|
|
const int32_t logy = glogy, ourbpl = bpl;
|
|
|
|
char *pp = (char *)p;
|
|
|
|
|
|
|
|
cnt++;
|
|
|
|
|
|
|
|
do
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf, vplc);
|
|
|
|
if (ch != 255) *pp = pal[ch];
|
2012-03-04 20:12:30 +00:00
|
|
|
pp += ourbpl;
|
2006-04-24 19:04:22 +00:00
|
|
|
vplc += vinc;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc(vplc, vinc);
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2012-03-04 20:12:30 +00:00
|
|
|
while (--cnt);
|
2012-03-18 23:16:57 +00:00
|
|
|
|
|
|
|
return vplc;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2012-03-18 23:16:57 +00:00
|
|
|
// cnt >= 1
|
|
|
|
void mvlineasm4(int32_t cnt, char *p)
|
|
|
|
{
|
|
|
|
char ch;
|
|
|
|
int32_t i;
|
|
|
|
|
|
|
|
char *const pal[4] = {(char *)palookupoffse[0], (char *)palookupoffse[1], (char *)palookupoffse[2], (char *)palookupoffse[3]};
|
|
|
|
char *const buf[4] = {(char *)bufplce[0], (char *)bufplce[1], (char *)bufplce[2], (char *)bufplce[3]};
|
2013-11-16 18:47:07 +00:00
|
|
|
#ifdef USE_VECTOR_EXT
|
|
|
|
uint32_vec4 vinc = {vince[0], vince[1], vince[2], vince[3]};
|
|
|
|
uint32_vec4 vplc = {vplce[0], vplce[1], vplce[2], vplce[3]};
|
|
|
|
#else
|
2012-03-18 23:16:57 +00:00
|
|
|
const int32_t vinc[4] = {vince[0], vince[1], vince[2], vince[3]};
|
|
|
|
uint32_t vplc[4] = {vplce[0], vplce[1], vplce[2], vplce[3]};
|
2013-11-16 18:47:07 +00:00
|
|
|
#endif
|
2012-03-18 23:16:57 +00:00
|
|
|
const int32_t logy = glogy, ourbpl = bpl;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
for (i=0; i<4; i++)
|
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf[i], vplc[i]);
|
|
|
|
if (ch != 255) p[i] = pal[i][ch];
|
2013-11-16 18:47:07 +00:00
|
|
|
#if !defined USE_VECTOR_EXT
|
2012-03-18 23:16:57 +00:00
|
|
|
vplc[i] += vinc[i];
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc(vplc[i], vinc[i]);
|
2013-11-16 18:47:07 +00:00
|
|
|
#endif
|
2012-03-18 23:16:57 +00:00
|
|
|
}
|
2013-11-16 18:47:07 +00:00
|
|
|
#ifdef USE_VECTOR_EXT
|
|
|
|
vplc += vinc;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc_vec(vplc, vinc);
|
2013-11-16 18:47:07 +00:00
|
|
|
#endif
|
2012-03-18 23:16:57 +00:00
|
|
|
p += ourbpl;
|
|
|
|
}
|
|
|
|
while (--cnt);
|
|
|
|
|
2013-11-16 18:47:07 +00:00
|
|
|
for (i=0; i<4; i++)
|
|
|
|
vplce[i] = vplc[i];
|
2012-03-18 23:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-09-21 13:37:31 +00:00
|
|
|
#ifdef USE_ASM64
|
|
|
|
# define GLOGY a64_glogy
|
|
|
|
#else
|
|
|
|
# define GLOGY glogy
|
|
|
|
#endif
|
|
|
|
|
2013-11-16 18:47:11 +00:00
|
|
|
void setuptvlineasm(int32_t neglogy, int32_t dosaturate)
|
2013-09-21 13:37:31 +00:00
|
|
|
{
|
|
|
|
GLOGY = neglogy;
|
2013-11-16 18:47:11 +00:00
|
|
|
set_saturate(dosaturate);
|
2013-09-21 13:37:31 +00:00
|
|
|
}
|
2012-03-18 23:16:57 +00:00
|
|
|
|
2013-09-21 13:37:31 +00:00
|
|
|
#if !defined USE_ASM64
|
2012-03-04 20:12:30 +00:00
|
|
|
// cnt+1 loop iterations!
|
2012-03-18 23:17:17 +00:00
|
|
|
int32_t tvlineasm1(int32_t vinc, intptr_t paloffs, int32_t cnt, uint32_t vplc, intptr_t bufplc, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
char ch;
|
|
|
|
|
2012-03-04 20:12:30 +00:00
|
|
|
const char *const buf = (char *)bufplc;
|
|
|
|
const char *const pal = (char *)paloffs;
|
|
|
|
const char *const trans = (char *)gtrans;
|
|
|
|
const int32_t logy = glogy, ourbpl = bpl, transm = transmode;
|
|
|
|
char *pp = (char *)p;
|
|
|
|
|
|
|
|
cnt++;
|
|
|
|
|
|
|
|
if (transm)
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
2012-03-04 20:12:30 +00:00
|
|
|
do
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf, vplc);
|
2012-03-04 20:12:30 +00:00
|
|
|
if (ch != 255) *pp = trans[(*pp)|(pal[ch]<<8)];
|
|
|
|
pp += ourbpl;
|
2006-04-24 19:04:22 +00:00
|
|
|
vplc += vinc;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc_trans(vplc, vinc);
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2012-03-04 20:12:30 +00:00
|
|
|
while (--cnt);
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-03-04 20:12:30 +00:00
|
|
|
do
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf, vplc);
|
2012-03-04 20:12:30 +00:00
|
|
|
if (ch != 255) *pp = trans[((*pp)<<8)|pal[ch]];
|
|
|
|
pp += ourbpl;
|
2006-04-24 19:04:22 +00:00
|
|
|
vplc += vinc;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc_trans(vplc, vinc);
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2012-03-04 20:12:30 +00:00
|
|
|
while (--cnt);
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2012-03-18 23:17:17 +00:00
|
|
|
|
|
|
|
return vplc;
|
|
|
|
}
|
2013-09-21 13:37:31 +00:00
|
|
|
#endif
|
2012-03-18 23:17:17 +00:00
|
|
|
|
|
|
|
void setuptvlineasm2(int32_t neglogy, intptr_t paloffs1, intptr_t paloffs2)
|
|
|
|
{
|
2013-09-21 13:37:31 +00:00
|
|
|
GLOGY = neglogy;
|
|
|
|
A64_ASSIGN(a64_paloffs, paloffs1);
|
2012-03-18 23:17:17 +00:00
|
|
|
gpal = (char *)paloffs1;
|
|
|
|
gpal2 = (char *)paloffs2;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
2013-09-21 13:37:31 +00:00
|
|
|
|
|
|
|
#if !defined USE_ASM64
|
2012-03-18 23:17:17 +00:00
|
|
|
// Pass: asm1=vinc2, asm2=pend
|
|
|
|
// Return: asm1=vplc1, asm2=vplc2
|
|
|
|
void tvlineasm2(uint32_t vplc2, int32_t vinc1, intptr_t bufplc1, intptr_t bufplc2, uint32_t vplc1, intptr_t p)
|
|
|
|
{
|
|
|
|
char ch;
|
|
|
|
|
|
|
|
int32_t cnt = (asm2-p-1)/bpl; // >= 1
|
|
|
|
const int32_t vinc2 = asm1;
|
|
|
|
|
|
|
|
const char *const buf1 = (char *)bufplc1;
|
|
|
|
const char *const buf2 = (char *)bufplc2;
|
|
|
|
const int32_t logy = glogy, ourbpl = bpl, transm = transmode;
|
|
|
|
|
|
|
|
char *pp = (char *)p;
|
|
|
|
|
|
|
|
cnt++;
|
|
|
|
|
|
|
|
if (transm)
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf1, vplc1);
|
2012-03-18 23:17:17 +00:00
|
|
|
if (ch != 255) pp[0] = gtrans[pp[0]|(gpal[ch]<<8)];
|
|
|
|
vplc1 += vinc1;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc_trans(vplc1, vinc1);
|
2012-03-18 23:17:17 +00:00
|
|
|
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf2, vplc2);
|
2012-03-18 23:17:17 +00:00
|
|
|
if (ch != 255) pp[1] = gtrans[pp[1]|(gpal2[ch]<<8)];
|
|
|
|
vplc2 += vinc2;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc_trans(vplc2, vinc2);
|
2012-03-18 23:17:17 +00:00
|
|
|
|
|
|
|
pp += ourbpl;
|
|
|
|
}
|
|
|
|
while (--cnt > 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf1, vplc1);
|
2012-03-18 23:17:17 +00:00
|
|
|
if (ch != 255) pp[0] = gtrans[(pp[0]<<8)|gpal[ch]];
|
|
|
|
vplc1 += vinc1;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc_trans(vplc1, vinc1);
|
2012-03-18 23:17:17 +00:00
|
|
|
|
2012-07-06 11:26:24 +00:00
|
|
|
ch = getpix(logy, buf2, vplc2);
|
2012-03-18 23:17:17 +00:00
|
|
|
if (ch != 255) pp[1] = gtrans[(pp[1]<<8)|gpal2[ch]];
|
|
|
|
vplc2 += vinc2;
|
2013-11-16 18:47:11 +00:00
|
|
|
saturate_vplc_trans(vplc2, vinc2);
|
2012-03-18 23:17:17 +00:00
|
|
|
|
|
|
|
pp += ourbpl;
|
|
|
|
}
|
|
|
|
while (--cnt);
|
|
|
|
}
|
|
|
|
|
|
|
|
asm1 = vplc1;
|
|
|
|
asm2 = vplc2;
|
|
|
|
}
|
2013-09-21 13:37:31 +00:00
|
|
|
#endif
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
//Floor sprite horizontal line functions
|
2009-01-09 09:29:17 +00:00
|
|
|
void msethlineshift(int32_t logx, int32_t logy) { glogx = logx; glogy = logy; }
|
2012-03-07 19:42:37 +00:00
|
|
|
// cntup16>>16 + 1 iterations
|
2009-01-09 09:29:17 +00:00
|
|
|
void mhline(intptr_t bufplc, uint32_t bx, int32_t cntup16, int32_t junk, uint32_t by, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
char ch;
|
|
|
|
|
2012-03-07 19:42:37 +00:00
|
|
|
const int32_t xinc = asm1, yinc = asm2;
|
|
|
|
|
2011-04-14 20:48:08 +00:00
|
|
|
UNREFERENCED_PARAMETER(junk);
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
gbuf = (char *)bufplc;
|
|
|
|
gpal = (char *)asm3;
|
2012-03-07 19:42:37 +00:00
|
|
|
|
|
|
|
cntup16>>=16;
|
|
|
|
cntup16++;
|
|
|
|
do
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
ch = gbuf[((bx>>(32-glogx))<<glogy)+(by>>(32-glogy))];
|
|
|
|
if (ch != 255) *((char *)p) = gpal[ch];
|
2012-03-07 19:42:37 +00:00
|
|
|
bx += xinc;
|
|
|
|
by += yinc;
|
2006-04-24 19:04:22 +00:00
|
|
|
p++;
|
|
|
|
}
|
2012-03-07 19:42:37 +00:00
|
|
|
while (--cntup16);
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void tsethlineshift(int32_t logx, int32_t logy) { glogx = logx; glogy = logy; }
|
2012-03-07 19:42:37 +00:00
|
|
|
// cntup16>>16 + 1 iterations
|
2009-01-09 09:29:17 +00:00
|
|
|
void thline(intptr_t bufplc, uint32_t bx, int32_t cntup16, int32_t junk, uint32_t by, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
char ch;
|
|
|
|
|
2012-03-07 19:42:37 +00:00
|
|
|
const int32_t xinc = asm1, yinc = asm2;
|
|
|
|
|
2011-04-14 20:48:08 +00:00
|
|
|
UNREFERENCED_PARAMETER(junk);
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
gbuf = (char *)bufplc;
|
|
|
|
gpal = (char *)asm3;
|
2012-03-07 19:42:37 +00:00
|
|
|
|
|
|
|
cntup16>>=16;
|
|
|
|
cntup16++;
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
if (transmode)
|
|
|
|
{
|
2012-03-07 19:42:37 +00:00
|
|
|
do
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
ch = gbuf[((bx>>(32-glogx))<<glogy)+(by>>(32-glogy))];
|
2012-03-07 19:42:37 +00:00
|
|
|
if (ch != 255) *((char *)p) = gtrans[(*((char *)p))|(gpal[ch]<<8)];
|
|
|
|
bx += xinc;
|
|
|
|
by += yinc;
|
2006-04-24 19:04:22 +00:00
|
|
|
p++;
|
|
|
|
}
|
2012-03-07 19:42:37 +00:00
|
|
|
while (--cntup16);
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-03-07 19:42:37 +00:00
|
|
|
do
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
ch = gbuf[((bx>>(32-glogx))<<glogy)+(by>>(32-glogy))];
|
2012-03-07 19:42:37 +00:00
|
|
|
if (ch != 255) *((char *)p) = gtrans[((*((char *)p))<<8)|gpal[ch]];
|
|
|
|
bx += xinc;
|
|
|
|
by += yinc;
|
2006-04-24 19:04:22 +00:00
|
|
|
p++;
|
|
|
|
}
|
2012-03-07 19:42:37 +00:00
|
|
|
while (--cntup16);
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
//Rotatesprite vertical line functions
|
2009-01-09 09:29:17 +00:00
|
|
|
void setupspritevline(intptr_t paloffs, int32_t bxinc, int32_t byinc, int32_t ysiz)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
gpal = (char *)paloffs;
|
|
|
|
gbxinc = bxinc;
|
|
|
|
gbyinc = byinc;
|
|
|
|
glogy = ysiz;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
2009-01-09 09:29:17 +00:00
|
|
|
void spritevline(int32_t bx, int32_t by, int32_t cnt, intptr_t bufplc, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
gbuf = (char *)bufplc;
|
2009-02-19 16:47:54 +00:00
|
|
|
for (; cnt>1; cnt--)
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
(*(char *)p) = gpal[gbuf[(bx>>16)*glogy+(by>>16)]];
|
|
|
|
bx += gbxinc;
|
|
|
|
by += gbyinc;
|
|
|
|
p += bpl;
|
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2006-04-24 19:04:22 +00:00
|
|
|
//Rotatesprite vertical line functions
|
2009-01-09 09:29:17 +00:00
|
|
|
void msetupspritevline(intptr_t paloffs, int32_t bxinc, int32_t byinc, int32_t ysiz)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
gpal = (char *)paloffs;
|
|
|
|
gbxinc = bxinc;
|
|
|
|
gbyinc = byinc;
|
|
|
|
glogy = ysiz;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
2009-01-09 09:29:17 +00:00
|
|
|
void mspritevline(int32_t bx, int32_t by, int32_t cnt, intptr_t bufplc, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
char ch;
|
|
|
|
|
|
|
|
gbuf = (char *)bufplc;
|
2009-02-19 16:47:54 +00:00
|
|
|
for (; cnt>1; cnt--)
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
ch = gbuf[(bx>>16)*glogy+(by>>16)];
|
2007-12-12 17:42:14 +00:00
|
|
|
if (ch != 255)(*(char *)p) = gpal[ch];
|
2006-04-24 19:04:22 +00:00
|
|
|
bx += gbxinc;
|
|
|
|
by += gbyinc;
|
|
|
|
p += bpl;
|
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void tsetupspritevline(intptr_t paloffs, int32_t bxinc, int32_t byinc, int32_t ysiz)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
gpal = (char *)paloffs;
|
|
|
|
gbxinc = bxinc;
|
|
|
|
gbyinc = byinc;
|
|
|
|
glogy = ysiz;
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
2009-01-09 09:29:17 +00:00
|
|
|
void tspritevline(int32_t bx, int32_t by, int32_t cnt, intptr_t bufplc, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
char ch;
|
|
|
|
|
|
|
|
gbuf = (char *)bufplc;
|
|
|
|
if (transmode)
|
|
|
|
{
|
2009-02-19 16:47:54 +00:00
|
|
|
for (; cnt>1; cnt--)
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
ch = gbuf[(bx>>16)*glogy+(by>>16)];
|
|
|
|
if (ch != 255) *((char *)p) = gtrans[(*((char *)p))+(gpal[ch]<<8)];
|
|
|
|
bx += gbxinc;
|
|
|
|
by += gbyinc;
|
|
|
|
p += bpl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-02-19 16:47:54 +00:00
|
|
|
for (; cnt>1; cnt--)
|
2006-04-24 19:04:22 +00:00
|
|
|
{
|
|
|
|
ch = gbuf[(bx>>16)*glogy+(by>>16)];
|
|
|
|
if (ch != 255) *((char *)p) = gtrans[((*((char *)p))<<8)+gpal[ch]];
|
|
|
|
bx += gbxinc;
|
|
|
|
by += gbyinc;
|
|
|
|
p += bpl;
|
|
|
|
}
|
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void setupdrawslab(int32_t dabpl, intptr_t pal)
|
2006-04-24 19:04:22 +00:00
|
|
|
{ bpl = dabpl; gpal = (char *)pal; }
|
2006-04-23 06:44:19 +00:00
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void drawslab(int32_t dx, int32_t v, int32_t dy, int32_t vi, intptr_t vptr, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t x;
|
2006-04-24 19:04:22 +00:00
|
|
|
|
|
|
|
while (dy > 0)
|
|
|
|
{
|
2012-05-01 12:37:32 +00:00
|
|
|
char c = gpal[(int32_t)(*(char *)((v>>16)+vptr))];
|
|
|
|
for (x=0; x < dx; x++)
|
|
|
|
((char*)p)[x] = c;
|
|
|
|
p += bpl;
|
|
|
|
v += vi;
|
|
|
|
dy--;
|
2006-04-24 19:04:22 +00:00
|
|
|
}
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
|
|
|
|
2012-03-11 17:36:49 +00:00
|
|
|
#if 0
|
2009-01-09 09:29:17 +00:00
|
|
|
void stretchhline(intptr_t p0, int32_t u, int32_t cnt, int32_t uinc, intptr_t rptr, intptr_t p)
|
2006-04-23 06:44:19 +00:00
|
|
|
{
|
2006-04-24 19:04:22 +00:00
|
|
|
p0 = p-(cnt<<2);
|
|
|
|
do
|
|
|
|
{
|
|
|
|
p--;
|
|
|
|
*(char *)p = *(char *)((u>>16)+rptr); u -= uinc;
|
2007-12-12 17:42:14 +00:00
|
|
|
}
|
|
|
|
while (p > p0);
|
2006-04-23 06:44:19 +00:00
|
|
|
}
|
2012-03-11 17:36:49 +00:00
|
|
|
#endif
|
2006-04-23 06:44:19 +00:00
|
|
|
|
|
|
|
void mmxoverlay() { }
|
|
|
|
|
2006-09-10 17:40:34 +00:00
|
|
|
#endif
|
2006-04-23 06:44:19 +00:00
|
|
|
/*
|
|
|
|
* vim:ts=4:
|
|
|
|
*/
|
|
|
|
|