diff options
Diffstat (limited to 'apps/plugins/sdl/progs/quake/sys_sdl.c')
| -rw-r--r-- | apps/plugins/sdl/progs/quake/sys_sdl.c | 414 |
1 files changed, 414 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/quake/sys_sdl.c b/apps/plugins/sdl/progs/quake/sys_sdl.c new file mode 100644 index 0000000..837d935 --- /dev/null +++ b/apps/plugins/sdl/progs/quake/sys_sdl.c @@ -0,0 +1,414 @@ +#include <limits.h> +#include <sys/types.h> +#include <stdarg.h> +#include <ctype.h> + +#include "quakedef.h" + +qboolean isDedicated; + +int noconinput = 0; + +char *basedir = "/.rockbox/quake"; +char *cachedir = "/.rockbox/quake"; + +cvar_t sys_linerefresh = {"sys_linerefresh","0"};// set for entity display +cvar_t sys_nostdout = {"sys_nostdout","0"}; + +// ======================================================================= +// General routines +// ======================================================================= + +void Sys_DebugNumber(int y, int val) +{ +} + +void Sys_Printf (char *fmt, ...) +{ + va_list argptr; + char text[1024]; + + va_start (argptr,fmt); + vsprintf (text,fmt,argptr); + va_end (argptr); + printf("%s", text); + + //Con_Print (text); +} + +void Sys_Quit (void) +{ + Host_Shutdown(); + exit(0); +} + +void Sys_Init(void) +{ +#if id386 + Sys_SetFPCW(); +#endif +} + +#if !id386 + +/* +================ +Sys_LowFPPrecision +================ +*/ +void Sys_LowFPPrecision (void) +{ +// causes weird problems on Nextstep +} + + +/* +================ +Sys_HighFPPrecision +================ +*/ +void Sys_HighFPPrecision (void) +{ +// causes weird problems on Nextstep +} + +#endif // !id386 + + +void Sys_Error (char *error, ...) +{ + va_list argptr; + char string[1024]; + + va_start (argptr,error); + vsprintf (string,error,argptr); + va_end (argptr); + rb->splashf(HZ*2, "Error: %s\n", string); + + Host_Shutdown (); + exit (1); + +} + +void Sys_Warn (char *warning, ...) +{ + va_list argptr; + char string[1024]; + + va_start (argptr,warning); + vsprintf (string,warning,argptr); + va_end (argptr); + rb->splashf(HZ*2, "Warning: %s", string); +} + +/* +=============================================================================== + +FILE IO + +=============================================================================== +*/ + +#define MAX_HANDLES 10 +static FILE *sys_handles[MAX_HANDLES]; + +int findhandle (void) +{ + int i; + + for (i=1 ; i<MAX_HANDLES ; i++) + if (!sys_handles[i]) + return i; + Sys_Error ("out of handles"); + return -1; +} + +/* +================ +Qfilelength +================ +*/ +static int Qfilelength (FILE *f) +{ + int pos; + int end; + + pos = ftell (f); + fseek (f, 0, SEEK_END); + end = ftell (f); + fseek (f, pos, SEEK_SET); + + return end; +} + +int Sys_FileOpenRead (char *path, int *hndl) +{ + FILE *f; + int i; + + i = findhandle (); + + f = fopen(path, "rb"); + if (!f) + { + *hndl = -1; + return -1; + } + sys_handles[i] = f; + *hndl = i; + + return Qfilelength(f); +} + +int Sys_FileOpenWrite (char *path) +{ + FILE *f; + int i; + + i = findhandle (); + + f = fopen(path, "wb"); + if (!f) + Sys_Error ("Error opening %s: %s", path,strerror(errno)); + sys_handles[i] = f; + + return i; +} + +void Sys_FileClose (int handle) +{ + if ( handle >= 0 ) { + rb->splashf(HZ, "Close handle %d", handle); + fclose (sys_handles[handle]); + sys_handles[handle] = NULL; + } +} + +void Sys_FileSeek (int handle, int position) +{ + if ( handle >= 0 ) { + fseek (sys_handles[handle], position, SEEK_SET); + } +} + +int Sys_FileRead (int handle, void *dst, int count) +{ + char *data; + int size, done; + + size = 0; + if ( handle >= 0 ) { + data = dst; + while ( count > 0 ) { + done = fread (data, 1, count, sys_handles[handle]); + if ( done == 0 ) { + break; + } + else if(done < 0) + { + Sys_Error("stream error %d, file is %d = %d", done, handle, sys_handles[handle]); + } + data += done; + count -= done; + size += done; + } + } + return size; + +} + +int Sys_FileWrite (int handle, void *src, int count) +{ + char *data; + int size, done; + + size = 0; + if ( handle >= 0 ) { + data = src; + while ( count > 0 ) { + done = fread (data, 1, count, sys_handles[handle]); + if ( done == 0 ) { + break; + } + data += done; + count -= done; + size += done; + } + } + return size; +} + +int Sys_FileTime (char *path) +{ + FILE *f; + + f = fopen(path, "rb"); + if (f) + { + fclose(f); + return 1; + } + + return -1; +} + +void Sys_mkdir (char *path) +{ +#ifdef __WIN32__ + mkdir (path); +#else + mkdir (path); +#endif +} + +void Sys_DebugLog(char *file, char *fmt, ...) +{ + va_list argptr; + static char data[1024]; + FILE *fp; + + va_start(argptr, fmt); + vsprintf(data, fmt, argptr); + va_end(argptr); + fp = fopen(file, "a"); + fwrite(data, strlen(data), 1, fp); + fclose(fp); +} + +double Sys_FloatTime (void) +{ + static int starttime = 0; + + if ( ! starttime ) + starttime = *rb->current_tick; + + return (*rb->current_tick - starttime) / ((double)HZ); +} + +// ======================================================================= +// Sleeps for microseconds +// ======================================================================= + +static volatile int oktogo; + +void alarm_handler(int x) +{ + oktogo=1; +} + +byte *Sys_ZoneBase (int *size) +{ + + char *QUAKEOPT = getenv("QUAKEOPT"); + + *size = 0xc00000; + if (QUAKEOPT) + { + while (*QUAKEOPT) + if (tolower(*QUAKEOPT++) == 'm') + { + *size = atof(QUAKEOPT) * 1024*1024; + break; + } + } + return malloc (*size); + +} + +void Sys_LineRefresh(void) +{ +} + +void Sys_Sleep(void) +{ + SDL_Delay(1); +} + +void floating_point_exception_handler(int whatever) +{ +// Sys_Warn("floating point exception\n"); +} + +void moncontrol(int x) +{ +} + +int my_main (int c, char **v) +{ + double time, oldtime, newtime; + quakeparms_t parms; + extern int vcrFile; + extern int recording; + static int frame; + + moncontrol(0); + +// signal(SIGFPE, floating_point_exception_handler); + + rb->splash(0, "quake 1"); + + parms.memsize = 8*1024*1024; + parms.membase = malloc (parms.memsize); + parms.basedir = basedir; + parms.cachedir = cachedir; + + COM_InitArgv(c, v); + parms.argc = com_argc; + parms.argv = com_argv; + + Sys_Init(); + rb->splash(0, "quake 2"); + + Host_Init(&parms); + rb->splash(0, "quake 3"); + + //Cvar_RegisterVariable (&sys_nostdout); + rb->splash(0, "quake 4"); + + oldtime = Sys_FloatTime () - 0.1; + while (1) + { +// find time spent rendering last frame + newtime = Sys_FloatTime (); + time = newtime - oldtime; + + if (cls.state == ca_dedicated) + { // play vcrfiles at max speed + if (time < sys_ticrate.value && (vcrFile == -1 || recording) ) + { + SDL_Delay (1); + continue; // not time to run a server only tic yet + } + time = sys_ticrate.value; + } + + if (time > sys_ticrate.value*2) + oldtime = newtime; + else + oldtime += time; + + if (++frame > 10) + moncontrol(1); // profile only while we do each Quake frame + Host_Frame (time); + moncontrol(0); + +// graphic debugging aids + if (sys_linerefresh.value) + Sys_LineRefresh (); + } + +} + + +/* +================ +Sys_MakeCodeWriteable +================ +*/ +void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length) +{ + + Sys_Error("Protection change failed\n"); + +} + |