mirror of
https://git.code.sf.net/p/quake/quakeforge-old
synced 2024-11-22 20:02:09 +00:00
damnit
This commit is contained in:
parent
404afdad37
commit
736ded3bfb
8 changed files with 3130 additions and 0 deletions
158
common/wins/common_quakedef.h
Normal file
158
common/wins/common_quakedef.h
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
Copyright (C) 1999,2000 contributors of the QuakeForge project
|
||||||
|
Please see the file "AUTHORS" for a list of contributors
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
// quakedef.h -- primary header for client
|
||||||
|
|
||||||
|
#define QUAKE_GAME // as opposed to utilities
|
||||||
|
|
||||||
|
#include <config.h> // generated from config.h.in
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#if defined(_WIN32) && !defined(WINDED) && !defined(GLQUAKE)
|
||||||
|
void VID_LockBuffer (void);
|
||||||
|
void VID_UnlockBuffer (void);
|
||||||
|
#else
|
||||||
|
#define VID_LockBuffer()
|
||||||
|
#define VID_UnlockBuffer()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "bspfile.h"
|
||||||
|
#include "vid.h"
|
||||||
|
#include "sys.h"
|
||||||
|
#include "zone.h"
|
||||||
|
#include "mathlib.h"
|
||||||
|
#include "wad.h"
|
||||||
|
#include "draw.h"
|
||||||
|
#include "cvar.h"
|
||||||
|
#include "screen.h"
|
||||||
|
#include "net.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "cmd.h"
|
||||||
|
#include "sbar.h"
|
||||||
|
#include "sound.h"
|
||||||
|
#include "render.h"
|
||||||
|
#include "client.h"
|
||||||
|
|
||||||
|
#ifdef GLQUAKE
|
||||||
|
#include "gl_model.h"
|
||||||
|
#else
|
||||||
|
#include "model.h"
|
||||||
|
#include "d_iface.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "input.h"
|
||||||
|
#include "keys.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "view.h"
|
||||||
|
#ifndef QUAKEWORLD
|
||||||
|
#include "menu.h"
|
||||||
|
#elif !defined(SERVERONLY)
|
||||||
|
#include "menu.h"
|
||||||
|
#endif
|
||||||
|
#include "crc.h"
|
||||||
|
#include "cdaudio.h"
|
||||||
|
|
||||||
|
#ifdef GLQUAKE
|
||||||
|
#include "glquake.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef max
|
||||||
|
#define max(a,b) ((a) > (b) ? (a) : (b))
|
||||||
|
#define min(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This fixes warnings when compiling with -pedantic */
|
||||||
|
#if defined(__GNUC__) && !defined(inline)
|
||||||
|
# define inline __inline__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Win32 have these underscored... */
|
||||||
|
#if !defined(HAVE_SNPRINTF) && defined(HAVE__SNPRINTF)
|
||||||
|
# define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
#if !defined(HAVE_VSNPRINTF) && defined(HAVE__VSNPRINTF)
|
||||||
|
# define vsnprintf _vsnprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
// the host system specifies the base of the directory tree, the
|
||||||
|
// command line parms passed to the program, and the amount of memory
|
||||||
|
// available for the program to use
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char *basedir;
|
||||||
|
char *cachedir; // for development over ISDN lines
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
void *membase;
|
||||||
|
int memsize;
|
||||||
|
} quakeparms_t;
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
#define MAX_NUM_ARGVS 50
|
||||||
|
|
||||||
|
|
||||||
|
extern qboolean noclip_anglehack;
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// host
|
||||||
|
//
|
||||||
|
extern quakeparms_t host_parms;
|
||||||
|
|
||||||
|
extern cvar_t sys_ticrate;
|
||||||
|
extern cvar_t sys_nostdout;
|
||||||
|
extern cvar_t developer;
|
||||||
|
|
||||||
|
extern qboolean host_initialized;// true if into command execution
|
||||||
|
extern double host_frametime;
|
||||||
|
extern byte *host_basepal;
|
||||||
|
extern byte *host_colormap;
|
||||||
|
extern int host_framecount;// incremented every frame, never reset
|
||||||
|
extern double realtime; // not bounded in any way, changed at
|
||||||
|
// start of every frame, never reset
|
||||||
|
|
||||||
|
void Host_ServerFrame (void);
|
||||||
|
void Host_InitCommands (void);
|
||||||
|
void Host_Init (quakeparms_t *parms);
|
||||||
|
void Host_Shutdown(void);
|
||||||
|
void Host_Error (char *error, ...);
|
||||||
|
void Host_EndGame (char *message, ...);
|
||||||
|
void Host_Frame (float time);
|
||||||
|
void Host_Quit_f (void);
|
||||||
|
void Host_ClientCommands (char *fmt, ...);
|
||||||
|
void Host_ShutdownServer (qboolean crash);
|
||||||
|
|
||||||
|
extern qboolean msg_suppress_1;
|
||||||
|
// suppresses resolution and cache size console output
|
||||||
|
// an fullscreen DIB focus gain/loss
|
222
common/wins/config.h
Normal file
222
common/wins/config.h
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
/* common/config.h.in. Generated automatically from configure.in by autoheader. */
|
||||||
|
|
||||||
|
/* Define to empty if the keyword does not work. */
|
||||||
|
#undef const
|
||||||
|
|
||||||
|
/* Define if you don't have vprintf but do have _doprnt. */
|
||||||
|
#undef HAVE_DOPRNT
|
||||||
|
|
||||||
|
/* Define if you have a working `mmap' system call. */
|
||||||
|
#undef HAVE_MMAP
|
||||||
|
|
||||||
|
/* Define if you have the vprintf function. */
|
||||||
|
#undef HAVE_VPRINTF
|
||||||
|
|
||||||
|
/* Define as __inline if that's what the C compiler calls it. */
|
||||||
|
#undef inline
|
||||||
|
|
||||||
|
/* Define if you can safely include both <sys/time.h> and <time.h>. */
|
||||||
|
#undef TIME_WITH_SYS_TIME
|
||||||
|
|
||||||
|
/* Define if your <sys/time.h> declares struct tm. */
|
||||||
|
#undef TM_IN_SYS_TIME
|
||||||
|
|
||||||
|
/* Define if your processor stores words with the most significant
|
||||||
|
byte first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||||
|
#undef WORDS_BIGENDIAN
|
||||||
|
|
||||||
|
/* Define if the X Window System is missing or not being used. */
|
||||||
|
#undef X_DISPLAY_MISSING
|
||||||
|
|
||||||
|
/* Version string */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* Define if you have the XFree86 DGA extension */
|
||||||
|
#undef HAS_DGA
|
||||||
|
|
||||||
|
/* If your version of OpenGL uses APIENTRY, define GLAPIENTRY to be APIENTRY*/
|
||||||
|
#define GLAPIENTRY APIENTRY
|
||||||
|
|
||||||
|
/* Define this to something sane if you don't have stricmp */
|
||||||
|
#undef stricmp
|
||||||
|
|
||||||
|
/* Define this if you are using Mesa */
|
||||||
|
#undef XMESA
|
||||||
|
|
||||||
|
/* Define this if you have GL_COLOR_INDEX8_EXT in GL/gl.h */
|
||||||
|
#undef HAVE_GL_COLOR_INDEX8_EXT
|
||||||
|
|
||||||
|
/* Define this if C symbols are prefixed with an underscore */
|
||||||
|
#undef HAVE_SYM_PREFIX_UNDERSCORE
|
||||||
|
|
||||||
|
/* Define this if you have a Linux-style CD-ROM API */
|
||||||
|
#undef USE_LINUX_CD
|
||||||
|
|
||||||
|
/* Define this if you have a BSD-style CD-ROM API */
|
||||||
|
#undef USE_BSD_CD
|
||||||
|
|
||||||
|
/* Define if you have the _ftime function. */
|
||||||
|
#define HAVE__FTIME
|
||||||
|
|
||||||
|
/* Define if you have the _snprintf function. */
|
||||||
|
#define HAVE__SNPRINTF
|
||||||
|
|
||||||
|
/* Define if you have the _vsnprintf function. */
|
||||||
|
#define HAVE__VSNPRINTF
|
||||||
|
|
||||||
|
/* Define if you have the connect function. */
|
||||||
|
#define HAVE_CONNECT
|
||||||
|
|
||||||
|
/* Define if you have the fcntl function. */
|
||||||
|
#undef HAVE_FCNTL
|
||||||
|
|
||||||
|
/* Define if you have the ftime function. */
|
||||||
|
#define HAVE_FTIME
|
||||||
|
|
||||||
|
/* Define if you have the gethostbyname function. */
|
||||||
|
#define HAVE_GETHOSTBYNAME
|
||||||
|
|
||||||
|
/* Define if you have the gethostname function. */
|
||||||
|
#define HAVE_GETHOSTNAME
|
||||||
|
|
||||||
|
/* Define if you have the getpagesize function. */
|
||||||
|
#undef HAVE_GETPAGESIZE
|
||||||
|
|
||||||
|
/* Define if you have the gettimeofday function. */
|
||||||
|
#undef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
/* Define if you have the getwd function. */
|
||||||
|
#undef HAVE_GETWD
|
||||||
|
|
||||||
|
/* Define if you have the mkdir function. */
|
||||||
|
#undef HAVE_MKDIR
|
||||||
|
|
||||||
|
/* Define if you have the putenv function. */
|
||||||
|
#undef HAVE_PUTENV
|
||||||
|
|
||||||
|
/* Define if you have the select function. */
|
||||||
|
#define HAVE_SELECT
|
||||||
|
|
||||||
|
/* Define if you have the snprintf function. */
|
||||||
|
#undef HAVE_SNPRINTF
|
||||||
|
|
||||||
|
/* Define if you have the socket function. */
|
||||||
|
#define HAVE_SOCKET
|
||||||
|
|
||||||
|
/* Define if you have the stat function. */
|
||||||
|
#undef HAVE_STAT
|
||||||
|
|
||||||
|
/* Define if you have the strerror function. */
|
||||||
|
#undef HAVE_STRERROR
|
||||||
|
|
||||||
|
/* Define if you have the strstr function. */
|
||||||
|
#undef HAVE_STRSTR
|
||||||
|
|
||||||
|
/* Define if you have the vsnprintf function. */
|
||||||
|
#undef HAVE_VSNPRINTF
|
||||||
|
|
||||||
|
/* Define if you have the <arpa/inet.h> header file. */
|
||||||
|
#undef HAVE_ARPA_INET_H
|
||||||
|
|
||||||
|
/* Define if you have the <dsound.h> header file. */
|
||||||
|
#define HAVE_DSOUND_H
|
||||||
|
|
||||||
|
/* Define if you have the <fcntl.h> header file. */
|
||||||
|
#undef HAVE_FCNTL_H
|
||||||
|
|
||||||
|
/* Define if you have the <initguid.h> header file. */
|
||||||
|
#undef HAVE_INITGUID_H
|
||||||
|
|
||||||
|
/* Define if you have the <linux/soundcard.h> header file. */
|
||||||
|
#undef HAVE_LINUX_SOUNDCARD_H
|
||||||
|
|
||||||
|
/* Define if you have the <machine/soundcard.h> header file. */
|
||||||
|
#undef HAVE_MACHINE_SOUNDCARD_H
|
||||||
|
|
||||||
|
/* Define if you have the <mme/mme_public.h> header file. */
|
||||||
|
#undef HAVE_MME_MME_PUBLIC_H
|
||||||
|
|
||||||
|
/* Define if you have the <mme/mmsystem.h> header file. */
|
||||||
|
#undef HAVE_MME_MMSYSTEM_H
|
||||||
|
|
||||||
|
/* Define if you have the <mmsystem.h> header file. */
|
||||||
|
#define HAVE_MMSYSTEM_H
|
||||||
|
|
||||||
|
/* Define if you have the <netdb.h> header file. */
|
||||||
|
#undef HAVE_NETDB_H
|
||||||
|
|
||||||
|
/* Define if you have the <netinet/in.h> header file. */
|
||||||
|
#undef HAVE_NETINET_IN_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/asoundlib.h> header file. */
|
||||||
|
#undef HAVE_SYS_ASOUNDLIB_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/audioio.h> header file. */
|
||||||
|
#undef HAVE_SYS_AUDIOIO_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/filio.h> header file. */
|
||||||
|
#undef HAVE_SYS_FILIO_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/ioctl.h> header file. */
|
||||||
|
#undef HAVE_SYS_IOCTL_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/mman.h> header file. */
|
||||||
|
#undef HAVE_SYS_MMAN_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/socket.h> header file. */
|
||||||
|
#undef HAVE_SYS_SOCKET_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/soundcard.h> header file. */
|
||||||
|
#undef HAVE_SYS_SOUNDCARD_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/time.h> header file. */
|
||||||
|
#undef HAVE_SYS_TIME_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/timeb.h> header file. */
|
||||||
|
#define HAVE_SYS_TIMEB_H
|
||||||
|
|
||||||
|
/* Define if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define if you have the <windows.h> header file. */
|
||||||
|
#define HAVE_WINDOWS_H
|
||||||
|
|
||||||
|
/* Define if you have the Xxf86dga library (-lXxf86dga). */
|
||||||
|
#undef HAVE_LIBXXF86DGA
|
||||||
|
|
||||||
|
/* Define if you have the Xxf86vm library (-lXxf86vm). */
|
||||||
|
#undef HAVE_LIBXXF86VM
|
||||||
|
|
||||||
|
/* Define if you have the db library (-ldb). */
|
||||||
|
#undef HAVE_LIBDB
|
||||||
|
|
||||||
|
/* Define if you have the m library (-lm). */
|
||||||
|
#undef HAVE_LIBM
|
||||||
|
|
||||||
|
#define VERSION "0.1.0-pre"
|
||||||
|
#define QF_VERSION "0.1.0-pre"
|
||||||
|
#define HAVE_FCNTL_H 1
|
||||||
|
#define HAVE_SYS_IOCTL_H 1
|
||||||
|
#define HAVE_SYS_MMAN_H 1
|
||||||
|
#define HAVE_SYS_STAT_H 1
|
||||||
|
#define HAVE_SYS_SOCKET_H 1
|
||||||
|
#define HAVE_NETINET_IN_H 1
|
||||||
|
#define HAVE_NETDB_H 1
|
||||||
|
#define HAVE_ARPA_INET_H 1
|
||||||
|
#define TIME_WITH_SYS_TIME 1
|
||||||
|
#define HAVE_SYM_PREFIX_UNDERSCORE 1
|
||||||
|
#define HAVE_GETPAGESIZE 1
|
||||||
|
#define HAVE_VPRINTF 1
|
||||||
|
#define HAVE_GETWD 1
|
||||||
|
#define HAVE_MKDIR 1
|
||||||
|
#define HAVE_FCNTL 1
|
||||||
|
#define HAVE_STAT 1
|
||||||
|
#define HAVE_PUTENV 1
|
||||||
|
#define HAVE_STRERROR 1
|
||||||
|
#define HAVE_STRSTR 1
|
||||||
|
#define HAVE_LIBM 1
|
||||||
|
#define X_DISPLAY_MISSING 1
|
||||||
|
#define HAVE_GL_COLOR_INDEX8_EXT 1
|
477
common/wins/d_parta.s
Normal file
477
common/wins/d_parta.s
Normal file
|
@ -0,0 +1,477 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
//
|
||||||
|
// d_parta.s
|
||||||
|
// x86 assembly-language 8-bpp particle-drawing code.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "asm_i386.h"
|
||||||
|
#include "quakeasm.h"
|
||||||
|
#include "d_ifacea.h"
|
||||||
|
#include "asm_draw.h"
|
||||||
|
|
||||||
|
#if id386
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// 8-bpp particle drawing code.
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
//FIXME: comments, full optimization
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// 8-bpp particle queueing code.
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
#define P 12+4
|
||||||
|
|
||||||
|
.align 4
|
||||||
|
.globl C(D_DrawParticle)
|
||||||
|
C(D_DrawParticle):
|
||||||
|
pushl %ebp // preserve caller's stack frame
|
||||||
|
pushl %edi // preserve register variables
|
||||||
|
pushl %ebx
|
||||||
|
|
||||||
|
movl P(%esp),%edi
|
||||||
|
|
||||||
|
// FIXME: better FP overlap in general here
|
||||||
|
|
||||||
|
// transform point
|
||||||
|
// VectorSubtract (p->org, r_origin, local);
|
||||||
|
flds C(r_origin)
|
||||||
|
fsubrs pt_org(%edi)
|
||||||
|
flds pt_org+4(%edi)
|
||||||
|
fsubs C(r_origin)+4
|
||||||
|
flds pt_org+8(%edi)
|
||||||
|
fsubs C(r_origin)+8
|
||||||
|
fxch %st(2) // local[0] | local[1] | local[2]
|
||||||
|
|
||||||
|
// transformed[2] = DotProduct(local, r_ppn);
|
||||||
|
flds C(r_ppn) // r_ppn[0] | local[0] | local[1] | local[2]
|
||||||
|
fmul %st(1),%st(0) // dot0 | local[0] | local[1] | local[2]
|
||||||
|
flds C(r_ppn)+4 // r_ppn[1] | dot0 | local[0] | local[1] | local[2]
|
||||||
|
fmul %st(3),%st(0) // dot1 | dot0 | local[0] | local[1] | local[2]
|
||||||
|
flds C(r_ppn)+8 // r_ppn[2] | dot1 | dot0 | local[0] |
|
||||||
|
// local[1] | local[2]
|
||||||
|
fmul %st(5),%st(0) // dot2 | dot1 | dot0 | local[0] | local[1] | local[2]
|
||||||
|
fxch %st(2) // dot0 | dot1 | dot2 | local[0] | local[1] | local[2]
|
||||||
|
faddp %st(0),%st(1) // dot0 + dot1 | dot2 | local[0] | local[1] |
|
||||||
|
// local[2]
|
||||||
|
faddp %st(0),%st(1) // z | local[0] | local[1] | local[2]
|
||||||
|
fld %st(0) // z | z | local[0] | local[1] |
|
||||||
|
// local[2]
|
||||||
|
fdivrs float_1 // 1/z | z | local[0] | local[1] | local[2]
|
||||||
|
fxch %st(1) // z | 1/z | local[0] | local[1] | local[2]
|
||||||
|
|
||||||
|
// if (transformed[2] < PARTICLE_Z_CLIP)
|
||||||
|
// return;
|
||||||
|
fcomps float_particle_z_clip // 1/z | local[0] | local[1] | local[2]
|
||||||
|
fxch %st(3) // local[2] | local[0] | local[1] | 1/z
|
||||||
|
|
||||||
|
flds C(r_pup) // r_pup[0] | local[2] | local[0] | local[1] | 1/z
|
||||||
|
fmul %st(2),%st(0) // dot0 | local[2] | local[0] | local[1] | 1/z
|
||||||
|
flds C(r_pup)+4 // r_pup[1] | dot0 | local[2] | local[0] |
|
||||||
|
// local[1] | 1/z
|
||||||
|
|
||||||
|
fnstsw %ax
|
||||||
|
testb $1,%ah
|
||||||
|
jnz LPop6AndDone
|
||||||
|
|
||||||
|
// transformed[1] = DotProduct(local, r_pup);
|
||||||
|
fmul %st(4),%st(0) // dot1 | dot0 | local[2] | local[0] | local[1] | 1/z
|
||||||
|
flds C(r_pup)+8 // r_pup[2] | dot1 | dot0 | local[2] |
|
||||||
|
// local[0] | local[1] | 1/z
|
||||||
|
fmul %st(3),%st(0) // dot2 | dot1 | dot0 | local[2] | local[0] |
|
||||||
|
// local[1] | 1/z
|
||||||
|
fxch %st(2) // dot0 | dot1 | dot2 | local[2] | local[0] |
|
||||||
|
// local[1] | 1/z
|
||||||
|
faddp %st(0),%st(1) // dot0 + dot1 | dot2 | local[2] | local[0] |
|
||||||
|
// local[1] | 1/z
|
||||||
|
faddp %st(0),%st(1) // y | local[2] | local[0] | local[1] | 1/z
|
||||||
|
fxch %st(3) // local[1] | local[2] | local[0] | y | 1/z
|
||||||
|
|
||||||
|
// transformed[0] = DotProduct(local, r_pright);
|
||||||
|
fmuls C(r_pright)+4 // dot1 | local[2] | local[0] | y | 1/z
|
||||||
|
fxch %st(2) // local[0] | local[2] | dot1 | y | 1/z
|
||||||
|
fmuls C(r_pright) // dot0 | local[2] | dot1 | y | 1/z
|
||||||
|
fxch %st(1) // local[2] | dot0 | dot1 | y | 1/z
|
||||||
|
fmuls C(r_pright)+8 // dot2 | dot0 | dot1 | y | 1/z
|
||||||
|
fxch %st(2) // dot1 | dot0 | dot2 | y | 1/z
|
||||||
|
faddp %st(0),%st(1) // dot1 + dot0 | dot2 | y | 1/z
|
||||||
|
|
||||||
|
faddp %st(0),%st(1) // x | y | 1/z
|
||||||
|
fxch %st(1) // y | x | 1/z
|
||||||
|
|
||||||
|
// project the point
|
||||||
|
fmul %st(2),%st(0) // y/z | x | 1/z
|
||||||
|
fxch %st(1) // x | y/z | 1/z
|
||||||
|
fmul %st(2),%st(0) // x/z | y/z | 1/z
|
||||||
|
fxch %st(1) // y/z | x/z | 1/z
|
||||||
|
fsubrs C(ycenter) // v | x/z | 1/z
|
||||||
|
fxch %st(1) // x/z | v | 1/z
|
||||||
|
fadds C(xcenter) // u | v | 1/z
|
||||||
|
// FIXME: preadjust xcenter and ycenter
|
||||||
|
fxch %st(1) // v | u | 1/z
|
||||||
|
fadds float_point5 // v | u | 1/z
|
||||||
|
fxch %st(1) // u | v | 1/z
|
||||||
|
fadds float_point5 // u | v | 1/z
|
||||||
|
fxch %st(2) // 1/z | v | u
|
||||||
|
fmuls DP_32768 // 1/z * 0x8000 | v | u
|
||||||
|
fxch %st(2) // u | v | 1/z * 0x8000
|
||||||
|
|
||||||
|
// FIXME: use Terje's fp->int trick here?
|
||||||
|
// FIXME: check we're getting proper rounding here
|
||||||
|
fistpl DP_u // v | 1/z * 0x8000
|
||||||
|
fistpl DP_v // 1/z * 0x8000
|
||||||
|
|
||||||
|
movl DP_u,%eax
|
||||||
|
movl DP_v,%edx
|
||||||
|
|
||||||
|
// if ((v > d_vrectbottom_particle) ||
|
||||||
|
// (u > d_vrectright_particle) ||
|
||||||
|
// (v < d_vrecty) ||
|
||||||
|
// (u < d_vrectx))
|
||||||
|
// {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
|
movl C(d_vrectbottom_particle),%ebx
|
||||||
|
movl C(d_vrectright_particle),%ecx
|
||||||
|
cmpl %ebx,%edx
|
||||||
|
jg LPop1AndDone
|
||||||
|
cmpl %ecx,%eax
|
||||||
|
jg LPop1AndDone
|
||||||
|
movl C(d_vrecty),%ebx
|
||||||
|
movl C(d_vrectx),%ecx
|
||||||
|
cmpl %ebx,%edx
|
||||||
|
jl LPop1AndDone
|
||||||
|
|
||||||
|
cmpl %ecx,%eax
|
||||||
|
jl LPop1AndDone
|
||||||
|
|
||||||
|
flds pt_color(%edi) // color | 1/z * 0x8000
|
||||||
|
// FIXME: use Terje's fast fp->int trick?
|
||||||
|
fistpl DP_Color // 1/z * 0x8000
|
||||||
|
|
||||||
|
movl C(d_viewbuffer),%ebx
|
||||||
|
|
||||||
|
addl %eax,%ebx
|
||||||
|
movl C(d_scantable)(,%edx,4),%edi // point to the pixel
|
||||||
|
|
||||||
|
imull C(d_zrowbytes),%edx // point to the z pixel
|
||||||
|
|
||||||
|
leal (%edx,%eax,2),%edx
|
||||||
|
movl C(d_pzbuffer),%eax
|
||||||
|
|
||||||
|
fistpl izi
|
||||||
|
|
||||||
|
addl %ebx,%edi
|
||||||
|
addl %eax,%edx
|
||||||
|
|
||||||
|
// pix = izi >> d_pix_shift;
|
||||||
|
|
||||||
|
movl izi,%eax
|
||||||
|
movl C(d_pix_shift),%ecx
|
||||||
|
shrl %cl,%eax
|
||||||
|
movl izi,%ebp
|
||||||
|
|
||||||
|
// if (pix < d_pix_min)
|
||||||
|
// pix = d_pix_min;
|
||||||
|
// else if (pix > d_pix_max)
|
||||||
|
// pix = d_pix_max;
|
||||||
|
|
||||||
|
movl C(d_pix_min),%ebx
|
||||||
|
movl C(d_pix_max),%ecx
|
||||||
|
cmpl %ebx,%eax
|
||||||
|
jnl LTestPixMax
|
||||||
|
movl %ebx,%eax
|
||||||
|
jmp LTestDone
|
||||||
|
|
||||||
|
LTestPixMax:
|
||||||
|
cmpl %ecx,%eax
|
||||||
|
jng LTestDone
|
||||||
|
movl %ecx,%eax
|
||||||
|
LTestDone:
|
||||||
|
|
||||||
|
movb DP_Color,%ch
|
||||||
|
|
||||||
|
movl C(d_y_aspect_shift),%ebx
|
||||||
|
testl %ebx,%ebx
|
||||||
|
jnz LDefault
|
||||||
|
|
||||||
|
cmpl $4,%eax
|
||||||
|
ja LDefault
|
||||||
|
|
||||||
|
jmp DP_EntryTable-4(,%eax,4)
|
||||||
|
|
||||||
|
// 1x1
|
||||||
|
.globl DP_1x1
|
||||||
|
DP_1x1:
|
||||||
|
cmpw %bp,(%edx) // just one pixel to do
|
||||||
|
jg LDone
|
||||||
|
movw %bp,(%edx)
|
||||||
|
movb %ch,(%edi)
|
||||||
|
jmp LDone
|
||||||
|
|
||||||
|
// 2x2
|
||||||
|
.globl DP_2x2
|
||||||
|
DP_2x2:
|
||||||
|
pushl %esi
|
||||||
|
movl C(screenwidth),%ebx
|
||||||
|
movl C(d_zrowbytes),%esi
|
||||||
|
|
||||||
|
cmpw %bp,(%edx)
|
||||||
|
jg L2x2_1
|
||||||
|
movw %bp,(%edx)
|
||||||
|
movb %ch,(%edi)
|
||||||
|
L2x2_1:
|
||||||
|
cmpw %bp,2(%edx)
|
||||||
|
jg L2x2_2
|
||||||
|
movw %bp,2(%edx)
|
||||||
|
movb %ch,1(%edi)
|
||||||
|
L2x2_2:
|
||||||
|
cmpw %bp,(%edx,%esi,1)
|
||||||
|
jg L2x2_3
|
||||||
|
movw %bp,(%edx,%esi,1)
|
||||||
|
movb %ch,(%edi,%ebx,1)
|
||||||
|
L2x2_3:
|
||||||
|
cmpw %bp,2(%edx,%esi,1)
|
||||||
|
jg L2x2_4
|
||||||
|
movw %bp,2(%edx,%esi,1)
|
||||||
|
movb %ch,1(%edi,%ebx,1)
|
||||||
|
L2x2_4:
|
||||||
|
|
||||||
|
popl %esi
|
||||||
|
jmp LDone
|
||||||
|
|
||||||
|
// 3x3
|
||||||
|
.globl DP_3x3
|
||||||
|
DP_3x3:
|
||||||
|
pushl %esi
|
||||||
|
movl C(screenwidth),%ebx
|
||||||
|
movl C(d_zrowbytes),%esi
|
||||||
|
|
||||||
|
cmpw %bp,(%edx)
|
||||||
|
jg L3x3_1
|
||||||
|
movw %bp,(%edx)
|
||||||
|
movb %ch,(%edi)
|
||||||
|
L3x3_1:
|
||||||
|
cmpw %bp,2(%edx)
|
||||||
|
jg L3x3_2
|
||||||
|
movw %bp,2(%edx)
|
||||||
|
movb %ch,1(%edi)
|
||||||
|
L3x3_2:
|
||||||
|
cmpw %bp,4(%edx)
|
||||||
|
jg L3x3_3
|
||||||
|
movw %bp,4(%edx)
|
||||||
|
movb %ch,2(%edi)
|
||||||
|
L3x3_3:
|
||||||
|
|
||||||
|
cmpw %bp,(%edx,%esi,1)
|
||||||
|
jg L3x3_4
|
||||||
|
movw %bp,(%edx,%esi,1)
|
||||||
|
movb %ch,(%edi,%ebx,1)
|
||||||
|
L3x3_4:
|
||||||
|
cmpw %bp,2(%edx,%esi,1)
|
||||||
|
jg L3x3_5
|
||||||
|
movw %bp,2(%edx,%esi,1)
|
||||||
|
movb %ch,1(%edi,%ebx,1)
|
||||||
|
L3x3_5:
|
||||||
|
cmpw %bp,4(%edx,%esi,1)
|
||||||
|
jg L3x3_6
|
||||||
|
movw %bp,4(%edx,%esi,1)
|
||||||
|
movb %ch,2(%edi,%ebx,1)
|
||||||
|
L3x3_6:
|
||||||
|
|
||||||
|
cmpw %bp,(%edx,%esi,2)
|
||||||
|
jg L3x3_7
|
||||||
|
movw %bp,(%edx,%esi,2)
|
||||||
|
movb %ch,(%edi,%ebx,2)
|
||||||
|
L3x3_7:
|
||||||
|
cmpw %bp,2(%edx,%esi,2)
|
||||||
|
jg L3x3_8
|
||||||
|
movw %bp,2(%edx,%esi,2)
|
||||||
|
movb %ch,1(%edi,%ebx,2)
|
||||||
|
L3x3_8:
|
||||||
|
cmpw %bp,4(%edx,%esi,2)
|
||||||
|
jg L3x3_9
|
||||||
|
movw %bp,4(%edx,%esi,2)
|
||||||
|
movb %ch,2(%edi,%ebx,2)
|
||||||
|
L3x3_9:
|
||||||
|
|
||||||
|
popl %esi
|
||||||
|
jmp LDone
|
||||||
|
|
||||||
|
|
||||||
|
// 4x4
|
||||||
|
.globl DP_4x4
|
||||||
|
DP_4x4:
|
||||||
|
pushl %esi
|
||||||
|
movl C(screenwidth),%ebx
|
||||||
|
movl C(d_zrowbytes),%esi
|
||||||
|
|
||||||
|
cmpw %bp,(%edx)
|
||||||
|
jg L4x4_1
|
||||||
|
movw %bp,(%edx)
|
||||||
|
movb %ch,(%edi)
|
||||||
|
L4x4_1:
|
||||||
|
cmpw %bp,2(%edx)
|
||||||
|
jg L4x4_2
|
||||||
|
movw %bp,2(%edx)
|
||||||
|
movb %ch,1(%edi)
|
||||||
|
L4x4_2:
|
||||||
|
cmpw %bp,4(%edx)
|
||||||
|
jg L4x4_3
|
||||||
|
movw %bp,4(%edx)
|
||||||
|
movb %ch,2(%edi)
|
||||||
|
L4x4_3:
|
||||||
|
cmpw %bp,6(%edx)
|
||||||
|
jg L4x4_4
|
||||||
|
movw %bp,6(%edx)
|
||||||
|
movb %ch,3(%edi)
|
||||||
|
L4x4_4:
|
||||||
|
|
||||||
|
cmpw %bp,(%edx,%esi,1)
|
||||||
|
jg L4x4_5
|
||||||
|
movw %bp,(%edx,%esi,1)
|
||||||
|
movb %ch,(%edi,%ebx,1)
|
||||||
|
L4x4_5:
|
||||||
|
cmpw %bp,2(%edx,%esi,1)
|
||||||
|
jg L4x4_6
|
||||||
|
movw %bp,2(%edx,%esi,1)
|
||||||
|
movb %ch,1(%edi,%ebx,1)
|
||||||
|
L4x4_6:
|
||||||
|
cmpw %bp,4(%edx,%esi,1)
|
||||||
|
jg L4x4_7
|
||||||
|
movw %bp,4(%edx,%esi,1)
|
||||||
|
movb %ch,2(%edi,%ebx,1)
|
||||||
|
L4x4_7:
|
||||||
|
cmpw %bp,6(%edx,%esi,1)
|
||||||
|
jg L4x4_8
|
||||||
|
movw %bp,6(%edx,%esi,1)
|
||||||
|
movb %ch,3(%edi,%ebx,1)
|
||||||
|
L4x4_8:
|
||||||
|
|
||||||
|
leal (%edx,%esi,2),%edx
|
||||||
|
leal (%edi,%ebx,2),%edi
|
||||||
|
|
||||||
|
cmpw %bp,(%edx)
|
||||||
|
jg L4x4_9
|
||||||
|
movw %bp,(%edx)
|
||||||
|
movb %ch,(%edi)
|
||||||
|
L4x4_9:
|
||||||
|
cmpw %bp,2(%edx)
|
||||||
|
jg L4x4_10
|
||||||
|
movw %bp,2(%edx)
|
||||||
|
movb %ch,1(%edi)
|
||||||
|
L4x4_10:
|
||||||
|
cmpw %bp,4(%edx)
|
||||||
|
jg L4x4_11
|
||||||
|
movw %bp,4(%edx)
|
||||||
|
movb %ch,2(%edi)
|
||||||
|
L4x4_11:
|
||||||
|
cmpw %bp,6(%edx)
|
||||||
|
jg L4x4_12
|
||||||
|
movw %bp,6(%edx)
|
||||||
|
movb %ch,3(%edi)
|
||||||
|
L4x4_12:
|
||||||
|
|
||||||
|
cmpw %bp,(%edx,%esi,1)
|
||||||
|
jg L4x4_13
|
||||||
|
movw %bp,(%edx,%esi,1)
|
||||||
|
movb %ch,(%edi,%ebx,1)
|
||||||
|
L4x4_13:
|
||||||
|
cmpw %bp,2(%edx,%esi,1)
|
||||||
|
jg L4x4_14
|
||||||
|
movw %bp,2(%edx,%esi,1)
|
||||||
|
movb %ch,1(%edi,%ebx,1)
|
||||||
|
L4x4_14:
|
||||||
|
cmpw %bp,4(%edx,%esi,1)
|
||||||
|
jg L4x4_15
|
||||||
|
movw %bp,4(%edx,%esi,1)
|
||||||
|
movb %ch,2(%edi,%ebx,1)
|
||||||
|
L4x4_15:
|
||||||
|
cmpw %bp,6(%edx,%esi,1)
|
||||||
|
jg L4x4_16
|
||||||
|
movw %bp,6(%edx,%esi,1)
|
||||||
|
movb %ch,3(%edi,%ebx,1)
|
||||||
|
L4x4_16:
|
||||||
|
|
||||||
|
popl %esi
|
||||||
|
jmp LDone
|
||||||
|
|
||||||
|
// default case, handling any size particle
|
||||||
|
LDefault:
|
||||||
|
|
||||||
|
// count = pix << d_y_aspect_shift;
|
||||||
|
|
||||||
|
movl %eax,%ebx
|
||||||
|
movl %eax,DP_Pix
|
||||||
|
movb C(d_y_aspect_shift),%cl
|
||||||
|
shll %cl,%ebx
|
||||||
|
|
||||||
|
// for ( ; count ; count--, pz += d_zwidth, pdest += screenwidth)
|
||||||
|
// {
|
||||||
|
// for (i=0 ; i<pix ; i++)
|
||||||
|
// {
|
||||||
|
// if (pz[i] <= izi)
|
||||||
|
// {
|
||||||
|
// pz[i] = izi;
|
||||||
|
// pdest[i] = color;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
LGenRowLoop:
|
||||||
|
movl DP_Pix,%eax
|
||||||
|
|
||||||
|
LGenColLoop:
|
||||||
|
cmpw %bp,-2(%edx,%eax,2)
|
||||||
|
jg LGSkip
|
||||||
|
movw %bp,-2(%edx,%eax,2)
|
||||||
|
movb %ch,-1(%edi,%eax,1)
|
||||||
|
LGSkip:
|
||||||
|
decl %eax // --pix
|
||||||
|
jnz LGenColLoop
|
||||||
|
|
||||||
|
addl C(d_zrowbytes),%edx
|
||||||
|
addl C(screenwidth),%edi
|
||||||
|
|
||||||
|
decl %ebx // --count
|
||||||
|
jnz LGenRowLoop
|
||||||
|
|
||||||
|
LDone:
|
||||||
|
popl %ebx // restore register variables
|
||||||
|
popl %edi
|
||||||
|
popl %ebp // restore the caller's stack frame
|
||||||
|
ret
|
||||||
|
|
||||||
|
LPop6AndDone:
|
||||||
|
fstp %st(0)
|
||||||
|
fstp %st(0)
|
||||||
|
fstp %st(0)
|
||||||
|
fstp %st(0)
|
||||||
|
fstp %st(0)
|
||||||
|
LPop1AndDone:
|
||||||
|
fstp %st(0)
|
||||||
|
jmp LDone
|
||||||
|
|
||||||
|
#endif // id386
|
1744
common/wins/d_polysa.s
Normal file
1744
common/wins/d_polysa.s
Normal file
File diff suppressed because it is too large
Load diff
418
common/wins/math.s
Normal file
418
common/wins/math.s
Normal file
|
@ -0,0 +1,418 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
//
|
||||||
|
// math.s
|
||||||
|
// x86 assembly-language math routines.
|
||||||
|
|
||||||
|
#define GLQUAKE 1 // don't include unneeded defs
|
||||||
|
#include "asm_i386.h"
|
||||||
|
#include "quakeasm.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if id386
|
||||||
|
|
||||||
|
.data
|
||||||
|
|
||||||
|
.align 4
|
||||||
|
Ljmptab: .long Lcase0, Lcase1, Lcase2, Lcase3
|
||||||
|
.long Lcase4, Lcase5, Lcase6, Lcase7
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
// TODO: rounding needed?
|
||||||
|
// stack parameter offset
|
||||||
|
#define val 4
|
||||||
|
|
||||||
|
.globl C(Invert24To16)
|
||||||
|
C(Invert24To16):
|
||||||
|
|
||||||
|
movl val(%esp),%ecx
|
||||||
|
movl $0x100,%edx // 0x10000000000 as dividend
|
||||||
|
cmpl %edx,%ecx
|
||||||
|
jle LOutOfRange
|
||||||
|
|
||||||
|
subl %eax,%eax
|
||||||
|
divl %ecx
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
LOutOfRange:
|
||||||
|
movl $0xFFFFFFFF,%eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
#define in 4
|
||||||
|
#define out 8
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
.globl C(TransformVector)
|
||||||
|
C(TransformVector):
|
||||||
|
movl in(%esp),%eax
|
||||||
|
movl out(%esp),%edx
|
||||||
|
|
||||||
|
flds (%eax) // in[0]
|
||||||
|
fmuls C(vright) // in[0]*vright[0]
|
||||||
|
flds (%eax) // in[0] | in[0]*vright[0]
|
||||||
|
fmuls C(vup) // in[0]*vup[0] | in[0]*vright[0]
|
||||||
|
flds (%eax) // in[0] | in[0]*vup[0] | in[0]*vright[0]
|
||||||
|
fmuls C(vpn) // in[0]*vpn[0] | in[0]*vup[0] | in[0]*vright[0]
|
||||||
|
|
||||||
|
flds 4(%eax) // in[1] | ...
|
||||||
|
fmuls C(vright)+4 // in[1]*vright[1] | ...
|
||||||
|
flds 4(%eax) // in[1] | in[1]*vright[1] | ...
|
||||||
|
fmuls C(vup)+4 // in[1]*vup[1] | in[1]*vright[1] | ...
|
||||||
|
flds 4(%eax) // in[1] | in[1]*vup[1] | in[1]*vright[1] | ...
|
||||||
|
fmuls C(vpn)+4 // in[1]*vpn[1] | in[1]*vup[1] | in[1]*vright[1] | ...
|
||||||
|
fxch %st(2) // in[1]*vright[1] | in[1]*vup[1] | in[1]*vpn[1] | ...
|
||||||
|
|
||||||
|
faddp %st(0),%st(5) // in[1]*vup[1] | in[1]*vpn[1] | ...
|
||||||
|
faddp %st(0),%st(3) // in[1]*vpn[1] | ...
|
||||||
|
faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
|
||||||
|
|
||||||
|
flds 8(%eax) // in[2] | ...
|
||||||
|
fmuls C(vright)+8 // in[2]*vright[2] | ...
|
||||||
|
flds 8(%eax) // in[2] | in[2]*vright[2] | ...
|
||||||
|
fmuls C(vup)+8 // in[2]*vup[2] | in[2]*vright[2] | ...
|
||||||
|
flds 8(%eax) // in[2] | in[2]*vup[2] | in[2]*vright[2] | ...
|
||||||
|
fmuls C(vpn)+8 // in[2]*vpn[2] | in[2]*vup[2] | in[2]*vright[2] | ...
|
||||||
|
fxch %st(2) // in[2]*vright[2] | in[2]*vup[2] | in[2]*vpn[2] | ...
|
||||||
|
|
||||||
|
faddp %st(0),%st(5) // in[2]*vup[2] | in[2]*vpn[2] | ...
|
||||||
|
faddp %st(0),%st(3) // in[2]*vpn[2] | ...
|
||||||
|
faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
|
||||||
|
|
||||||
|
fstps 8(%edx) // out[2]
|
||||||
|
fstps 4(%edx) // out[1]
|
||||||
|
fstps (%edx) // out[0]
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
#define EMINS 4+4
|
||||||
|
#define EMAXS 4+8
|
||||||
|
#define P 4+12
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
.globl C(BoxOnPlaneSide)
|
||||||
|
C(BoxOnPlaneSide):
|
||||||
|
pushl %ebx
|
||||||
|
|
||||||
|
movl P(%esp),%edx
|
||||||
|
movl EMINS(%esp),%ecx
|
||||||
|
xorl %eax,%eax
|
||||||
|
movl EMAXS(%esp),%ebx
|
||||||
|
movb pl_signbits(%edx),%al
|
||||||
|
cmpb $8,%al
|
||||||
|
jge Lerror
|
||||||
|
flds pl_normal(%edx) // p->normal[0]
|
||||||
|
fld %st(0) // p->normal[0] | p->normal[0]
|
||||||
|
jmp Ljmptab(,%eax,4)
|
||||||
|
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
//dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
Lcase0:
|
||||||
|
fmuls (%ebx) // p->normal[0]*emaxs[0] | p->normal[0]
|
||||||
|
flds pl_normal+4(%edx) // p->normal[1] | p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]
|
||||||
|
fxch %st(2) // p->normal[0] | p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[1]
|
||||||
|
fmuls (%ecx) // p->normal[0]*emins[0] |
|
||||||
|
// p->normal[0]*emaxs[0] | p->normal[1]
|
||||||
|
fxch %st(2) // p->normal[1] | p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fld %st(0) // p->normal[1] | p->normal[1] |
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fmuls 4(%ebx) // p->normal[1]*emaxs[1] | p->normal[1] |
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
flds pl_normal+8(%edx) // p->normal[2] | p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[1] | p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fxch %st(2) // p->normal[1] | p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[2] | p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fmuls 4(%ecx) // p->normal[1]*emins[1] |
|
||||||
|
// p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[2] | p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fxch %st(2) // p->normal[2] | p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[1]*emins[1] |
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fld %st(0) // p->normal[2] | p->normal[2] |
|
||||||
|
// p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[1]*emins[1] |
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fmuls 8(%ebx) // p->normal[2]*emaxs[2] |
|
||||||
|
// p->normal[2] |
|
||||||
|
// p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[1]*emins[1] |
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[0]*emins[0]
|
||||||
|
fxch %st(5) // p->normal[0]*emins[0] |
|
||||||
|
// p->normal[2] |
|
||||||
|
// p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[1]*emins[1] |
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[2]*emaxs[2]
|
||||||
|
faddp %st(0),%st(3) //p->normal[2] |
|
||||||
|
// p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[2]*emaxs[2]
|
||||||
|
fmuls 8(%ecx) //p->normal[2]*emins[2] |
|
||||||
|
// p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[2]*emaxs[2]
|
||||||
|
fxch %st(1) //p->normal[1]*emaxs[1] |
|
||||||
|
// p->normal[2]*emins[2] |
|
||||||
|
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
||||||
|
// p->normal[0]*emaxs[0] |
|
||||||
|
// p->normal[2]*emaxs[2]
|
||||||
|
faddp %st(0),%st(3) //p->normal[2]*emins[2] |
|
||||||
|
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
||||||
|
// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
|
||||||
|
// p->normal[2]*emaxs[2]
|
||||||
|
fxch %st(3) //p->normal[2]*emaxs[2] +
|
||||||
|
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
||||||
|
// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
|
||||||
|
// p->normal[2]*emins[2]
|
||||||
|
faddp %st(0),%st(2) //p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
||||||
|
// dist1 | p->normal[2]*emins[2]
|
||||||
|
|
||||||
|
jmp LSetSides
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
Lcase1:
|
||||||
|
fmuls (%ecx) // emins[0]
|
||||||
|
flds pl_normal+4(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls (%ebx) // emaxs[0]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 4(%ebx) // emaxs[1]
|
||||||
|
flds pl_normal+8(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls 4(%ecx) // emins[1]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 8(%ebx) // emaxs[2]
|
||||||
|
fxch %st(5)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fmuls 8(%ecx) // emins[2]
|
||||||
|
fxch %st(1)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fxch %st(3)
|
||||||
|
faddp %st(0),%st(2)
|
||||||
|
|
||||||
|
jmp LSetSides
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
//dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
Lcase2:
|
||||||
|
fmuls (%ebx) // emaxs[0]
|
||||||
|
flds pl_normal+4(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls (%ecx) // emins[0]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 4(%ecx) // emins[1]
|
||||||
|
flds pl_normal+8(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls 4(%ebx) // emaxs[1]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 8(%ebx) // emaxs[2]
|
||||||
|
fxch %st(5)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fmuls 8(%ecx) // emins[2]
|
||||||
|
fxch %st(1)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fxch %st(3)
|
||||||
|
faddp %st(0),%st(2)
|
||||||
|
|
||||||
|
jmp LSetSides
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
Lcase3:
|
||||||
|
fmuls (%ecx) // emins[0]
|
||||||
|
flds pl_normal+4(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls (%ebx) // emaxs[0]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 4(%ecx) // emins[1]
|
||||||
|
flds pl_normal+8(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls 4(%ebx) // emaxs[1]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 8(%ebx) // emaxs[2]
|
||||||
|
fxch %st(5)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fmuls 8(%ecx) // emins[2]
|
||||||
|
fxch %st(1)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fxch %st(3)
|
||||||
|
faddp %st(0),%st(2)
|
||||||
|
|
||||||
|
jmp LSetSides
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
//dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
Lcase4:
|
||||||
|
fmuls (%ebx) // emaxs[0]
|
||||||
|
flds pl_normal+4(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls (%ecx) // emins[0]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 4(%ebx) // emaxs[1]
|
||||||
|
flds pl_normal+8(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls 4(%ecx) // emins[1]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 8(%ecx) // emins[2]
|
||||||
|
fxch %st(5)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fmuls 8(%ebx) // emaxs[2]
|
||||||
|
fxch %st(1)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fxch %st(3)
|
||||||
|
faddp %st(0),%st(2)
|
||||||
|
|
||||||
|
jmp LSetSides
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
Lcase5:
|
||||||
|
fmuls (%ecx) // emins[0]
|
||||||
|
flds pl_normal+4(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls (%ebx) // emaxs[0]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 4(%ebx) // emaxs[1]
|
||||||
|
flds pl_normal+8(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls 4(%ecx) // emins[1]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 8(%ecx) // emins[2]
|
||||||
|
fxch %st(5)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fmuls 8(%ebx) // emaxs[2]
|
||||||
|
fxch %st(1)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fxch %st(3)
|
||||||
|
faddp %st(0),%st(2)
|
||||||
|
|
||||||
|
jmp LSetSides
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
//dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
Lcase6:
|
||||||
|
fmuls (%ebx) // emaxs[0]
|
||||||
|
flds pl_normal+4(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls (%ecx) // emins[0]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 4(%ecx) // emins[1]
|
||||||
|
flds pl_normal+8(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls 4(%ebx) // emaxs[1]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 8(%ecx) // emins[2]
|
||||||
|
fxch %st(5)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fmuls 8(%ebx) // emaxs[2]
|
||||||
|
fxch %st(1)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fxch %st(3)
|
||||||
|
faddp %st(0),%st(2)
|
||||||
|
|
||||||
|
jmp LSetSides
|
||||||
|
|
||||||
|
//dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
Lcase7:
|
||||||
|
fmuls (%ecx) // emins[0]
|
||||||
|
flds pl_normal+4(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls (%ebx) // emaxs[0]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 4(%ecx) // emins[1]
|
||||||
|
flds pl_normal+8(%edx)
|
||||||
|
fxch %st(2)
|
||||||
|
fmuls 4(%ebx) // emaxs[1]
|
||||||
|
fxch %st(2)
|
||||||
|
fld %st(0)
|
||||||
|
fmuls 8(%ecx) // emins[2]
|
||||||
|
fxch %st(5)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fmuls 8(%ebx) // emaxs[2]
|
||||||
|
fxch %st(1)
|
||||||
|
faddp %st(0),%st(3)
|
||||||
|
fxch %st(3)
|
||||||
|
faddp %st(0),%st(2)
|
||||||
|
|
||||||
|
LSetSides:
|
||||||
|
|
||||||
|
// sides = 0;
|
||||||
|
// if (dist1 >= p->dist)
|
||||||
|
// sides = 1;
|
||||||
|
// if (dist2 < p->dist)
|
||||||
|
// sides |= 2;
|
||||||
|
|
||||||
|
faddp %st(0),%st(2) // dist1 | dist2
|
||||||
|
fcomps pl_dist(%edx)
|
||||||
|
xorl %ecx,%ecx
|
||||||
|
fnstsw %ax
|
||||||
|
fcomps pl_dist(%edx)
|
||||||
|
andb $1,%ah
|
||||||
|
xorb $1,%ah
|
||||||
|
addb %ah,%cl
|
||||||
|
|
||||||
|
fnstsw %ax
|
||||||
|
andb $1,%ah
|
||||||
|
addb %ah,%ah
|
||||||
|
addb %ah,%cl
|
||||||
|
|
||||||
|
// return sides;
|
||||||
|
|
||||||
|
popl %ebx
|
||||||
|
movl %ecx,%eax // return status
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
Lerror:
|
||||||
|
call C(BOPS_Error)
|
||||||
|
|
||||||
|
#endif // id386
|
33
common/wins/net_ser.h
Normal file
33
common/wins/net_ser.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
// net_ser.h
|
||||||
|
|
||||||
|
int Serial_Init (void);
|
||||||
|
void Serial_Listen (qboolean state);
|
||||||
|
void Serial_SearchForHosts (qboolean xmit);
|
||||||
|
qsocket_t *Serial_Connect (char *host);
|
||||||
|
qsocket_t *Serial_CheckNewConnections (void);
|
||||||
|
int Serial_GetMessage (qsocket_t *sock);
|
||||||
|
int Serial_SendMessage (qsocket_t *sock, sizebuf_t *data);
|
||||||
|
int Serial_SendUnreliableMessage (qsocket_t *sock, sizebuf_t *data);
|
||||||
|
qboolean Serial_CanSendMessage (qsocket_t *sock);
|
||||||
|
qboolean Serial_CanSendUnreliableMessage (qsocket_t *sock);
|
||||||
|
void Serial_Close (qsocket_t *sock);
|
||||||
|
void Serial_Shutdown (void);
|
39
common/wins/net_wins.h
Normal file
39
common/wins/net_wins.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
// net_wins.h
|
||||||
|
|
||||||
|
int WINS_Init (void);
|
||||||
|
void WINS_Shutdown (void);
|
||||||
|
void WINS_Listen (qboolean state);
|
||||||
|
int WINS_OpenSocket (int port);
|
||||||
|
int WINS_CloseSocket (int socket);
|
||||||
|
int WINS_Connect (int socket, struct qsockaddr *addr);
|
||||||
|
int WINS_CheckNewConnections (void);
|
||||||
|
int WINS_Read (int socket, byte *buf, int len, struct qsockaddr *addr);
|
||||||
|
int WINS_Write (int socket, byte *buf, int len, struct qsockaddr *addr);
|
||||||
|
int WINS_Broadcast (int socket, byte *buf, int len);
|
||||||
|
char *WINS_AddrToString (struct qsockaddr *addr);
|
||||||
|
int WINS_StringToAddr (char *string, struct qsockaddr *addr);
|
||||||
|
int WINS_GetSocketAddr (int socket, struct qsockaddr *addr);
|
||||||
|
int WINS_GetNameFromAddr (struct qsockaddr *addr, char *name);
|
||||||
|
int WINS_GetAddrFromName (char *name, struct qsockaddr *addr);
|
||||||
|
int WINS_AddrCompare (struct qsockaddr *addr1, struct qsockaddr *addr2);
|
||||||
|
int WINS_GetSocketPort (struct qsockaddr *addr);
|
||||||
|
int WINS_SetSocketPort (struct qsockaddr *addr, int port);
|
39
common/wins/net_wipx.h
Normal file
39
common/wins/net_wipx.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
// net_wipx.h
|
||||||
|
|
||||||
|
int WIPX_Init (void);
|
||||||
|
void WIPX_Shutdown (void);
|
||||||
|
void WIPX_Listen (qboolean state);
|
||||||
|
int WIPX_OpenSocket (int port);
|
||||||
|
int WIPX_CloseSocket (int socket);
|
||||||
|
int WIPX_Connect (int socket, struct qsockaddr *addr);
|
||||||
|
int WIPX_CheckNewConnections (void);
|
||||||
|
int WIPX_Read (int socket, byte *buf, int len, struct qsockaddr *addr);
|
||||||
|
int WIPX_Write (int socket, byte *buf, int len, struct qsockaddr *addr);
|
||||||
|
int WIPX_Broadcast (int socket, byte *buf, int len);
|
||||||
|
char *WIPX_AddrToString (struct qsockaddr *addr);
|
||||||
|
int WIPX_StringToAddr (char *string, struct qsockaddr *addr);
|
||||||
|
int WIPX_GetSocketAddr (int socket, struct qsockaddr *addr);
|
||||||
|
int WIPX_GetNameFromAddr (struct qsockaddr *addr, char *name);
|
||||||
|
int WIPX_GetAddrFromName (char *name, struct qsockaddr *addr);
|
||||||
|
int WIPX_AddrCompare (struct qsockaddr *addr1, struct qsockaddr *addr2);
|
||||||
|
int WIPX_GetSocketPort (struct qsockaddr *addr);
|
||||||
|
int WIPX_SetSocketPort (struct qsockaddr *addr, int port);
|
Loading…
Reference in a new issue