summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/quake/sys_sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/sdl/progs/quake/sys_sdl.c')
-rw-r--r--apps/plugins/sdl/progs/quake/sys_sdl.c414
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");
+
+}
+