duke3d/buildengine/pragmas.c

168 lines
3.4 KiB
C
Executable File

/*
* Inline assembly.
*
* Initial PLATFORM_UNIX work done by Andrew Henderson. The DOS stuff is
* Ken's original code, and was in pragmas.h
*
* Please do NOT harrass Ken Silverman about any code modifications
* (including this file) to BUILD.
*/
/*
* "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
*/
#include <string.h> // memcpy
#include <stdio.h>
#include "platform.h"
#include "pragmas.h"
#define low32(a) ((a&0xffffffff))
unsigned long getkensmessagecrc(long param) {
return(0x56c764d4);
}
long msqrtasm(int i1)
{
int retval = 0x40000000;
int temp = 0x20000000;
while (temp != 0)
{
if (i1 >= retval)
{
i1 -= retval;
retval += temp*4;
}
retval -= temp;
retval >>= 1;
temp >>= 2;
}
if (i1 >= retval) retval--;
retval >>= 1;
return(retval);
}
void clearbuf(void *buffer, int size, long fill_value) {
int i;
for (i = 0; i < size; i++) ((long*)buffer)[i] = fill_value;
}
void clearbufbyte(void *vpbuffer, int size, long fill_value) {
unsigned char *buffer = (unsigned char *) vpbuffer;
int lsize;
switch(size){
case 0: return;
case 1: *buffer = fill_value; return;
case 2: *((unsigned short*)buffer) = fill_value; return;
case 3: { buffer[2]=buffer[1]=buffer[0] = fill_value;} return;
default:
if ((int)buffer&1) {
*buffer = fill_value; size--;
buffer++;
}
if ((int)buffer&2) {
*((unsigned short*)buffer) = fill_value; size-=2;
buffer += 2;
}
lsize = size>>2;
while(lsize) {
*((unsigned int*)buffer) = fill_value;
lsize--;
buffer += 4;
}
if (size&2) {
*((unsigned short*)buffer) = fill_value;
buffer += 2;
}
if (size&1) {
*((unsigned char*)buffer) = fill_value;
buffer++;
}
}
}
void copybuf(void *source, void *dest, int size) {
int i;
for (i = 0; i < size; i++) ((long*)dest)[i] = ((long*)source)[i];
}
void copybufbyte(void *source, void *dest, int size) {
memcpy(dest,source,size);
}
void copybufreverse(void *source, void *dest, int size) {
unsigned char *s=source,*d=dest;
do {
*d++ = *s--;
} while(--size);
}
void qinterpolatedown16 (long *source, int size, int linum, int linum_inc) {
if (size == 0)
{
*source = (linum>>16);
return;
}
while (size)
{
*source = (linum>>16);
source++;
linum += linum_inc;
size--;
}
}
void qinterpolatedown16short (long *source, int size, int linum, int linum_inc)
{
if (size == 0) return;
if ((long)source & 0x2)
{
unsigned short *src = (unsigned short *) source;
*src = ((linum>>16)&0xffff);
src++;
linum += linum_inc;
source = (long *) src;
size--;
if (size == 0) return;
}
size -= 2;
if (size < 0)
{
*((unsigned short *)source) = ((linum>>16)&0xffff);
return;
}
while (size >= 0)
{
// DDOI - this fix is from the Amiga port guys
// http://www.neoscientists.org/~dante/
#ifdef PLATFORM_BIGENDIAN
int temp = linum & 0xffff0000;
linum += linum_inc;
temp |= (linum>>16);
linum += linum_inc;
#else
int temp = linum>>16;
linum += linum_inc;
temp += (linum&0xffff0000);
linum += linum_inc;
#endif
*source = temp;
source++;
size -= 2;
}
if (size & 1)
*((unsigned short *)source) = ((linum>>16)&0xffff);
}