ref: a6ffb6a8ffefb4806f659ae05d730eaa6f486191
dir: /sys.c/
#include <u.h>
#include <libc.h>
#include <stdio.h>
#include <thread.h>
#include "quakedef.h"
qboolean isDedicated;
mainstacksize = 512*1024;
static char end1[] =
" QUAKE: The Doomed Dimension by id Software\n"
" ----------------------------------------------------------------------------\n"
" CALL 1-800-IDGAMES TO ORDER OR FOR TECHNICAL SUPPORT\n"
" PRICE: $45.00 (PRICES MAY VARY OUTSIDE THE US.)\n"
"\n"
" Yes! You only have one fourth of this incredible epic. That is because most\n"
" of you have paid us nothing or at most, very little. You could steal the\n"
" game from a friend. But we both know you'll be punished by God if you do.\n"
" WHY RISK ETERNAL DAMNATION? CALL 1-800-IDGAMES AND BUY NOW!\n"
" Remember, we love you almost as much as He does.\n"
"\n"
" Programming: John Carmack, Michael Abrash, John Cash\n"
" Design: John Romero, Sandy Petersen, American McGee, Tim Willits\n"
" Art: Adrian Carmack, Kevin Cloud\n"
" Biz: Jay Wilbur, Mike Wilson, Donna Jackson\n"
" Projects: Shawn Green Support: Barrett Alexander\n"
" Sound Effects: Trent Reznor and Nine Inch Nails\n"
" For other information or details on ordering outside the US, check out the\n"
" files accompanying QUAKE or our website at http://www.idsoftware.com.\n"
" Quake is a trademark of Id Software, inc., (c)1996 Id Software, inc.\n"
" All rights reserved. NIN logo is a registered trademark licensed to\n"
" Nothing Interactive, Inc. All rights reserved.\n";
static char end2[] =
" QUAKE by id Software\n"
" -----------------------------------------------------------------------------\n"
" Why did you quit from the registered version of QUAKE? Did the\n"
" scary monsters frighten you? Or did Mr. Sandman tug at your\n"
" little lids? No matter! What is important is you love our\n"
" game, and gave us your money. Congratulations, you are probably\n"
" not a thief.\n"
" Thank You.\n"
" id Software is:\n"
" PROGRAMMING: John Carmack, Michael Abrash, John Cash\n"
" DESIGN: John Romero, Sandy Petersen, American McGee, Tim Willits\n"
" ART: Adrian Carmack, Kevin Cloud\n"
" BIZ: Jay Wilbur, Mike Wilson PROJECTS MAN: Shawn Green\n"
" BIZ ASSIST: Donna Jackson SUPPORT: Barrett Alexander\n"
" SOUND EFFECTS AND MUSIC: Trent Reznor and Nine Inch Nails\n"
"\n"
" If you need help running QUAKE refer to the text files in the\n"
" QUAKE directory, or our website at http://www.idsoftware.com.\n"
" If all else fails, call our technical support at 1-800-IDGAMES.\n"
" Quake is a trademark of Id Software, inc., (c)1996 Id Software, inc.\n"
" All rights reserved. NIN logo is a registered trademark licensed\n"
" to Nothing Interactive, Inc. All rights reserved.\n";
void
Sys_Printf(char *fmt, ...)
{
char buf[1024], *p;
va_list arg;
va_start(arg, fmt);
vsnprint(buf, sizeof buf, fmt, arg);
va_end(arg);
for(p = buf; *p; p++){
*p &= 0x7f;
if(*p < 32 && *p != 10 && *p != 13 && *p != 9)
print("[%02x]", *p);
else
print("%c", *p);
}
}
void
Sys_Quit(void)
{
Host_Shutdown();
print("\n");
if(registered.value)
print("%s\n", end2);
else
print("%s\n", end1);
threadexitsall(nil);
}
void
Sys_Error(char *fmt, ...)
{
char buf[1024], *p;
va_list arg;
va_start(arg, fmt);
p = vseprint(buf, buf+sizeof buf, fmt, arg);
va_end(arg);
p = seprint(p, buf+sizeof buf, "\n");
ewrite(2, buf, p-buf);
Host_Shutdown();
sysfatal("ending.");
}
ulong
Sys_FileTime(char *path)
{
ulong t;
Dir *d;
if((d = dirstat(path)) == nil){
fprint(2, "dirstat: %r");
return -1;
}
t = d->mtime;
free(d);
return t;
}
void
Sys_mkdir(char *path)
{
int d;
/* don't care if it isn't a directory, caller doesn't check */
if(access(path, AEXIST) == 0)
return;
if((d = create(path, OREAD, DMDIR|0777)) < 0)
fprint(2, "Sys_mkdir:create: %r\n");
else
close(d);
}
vlong
flen(int fd)
{
vlong l;
Dir *d;
if((d = dirfstat(fd)) == nil) /* file assumed extant and readable */
sysfatal("flen: %r");
l = d->length;
free(d);
return l;
}
void
eread(int fd, void *buf, long n)
{
if(read(fd, buf, n) <= 0)
sysfatal("eread: %r");
}
void
ewrite(int fd, void *buf, long n)
{
if(write(fd, buf, n) != n)
sysfatal("ewrite: %r");
}
double
Sys_FloatTime(void)
{
static long secbase;
if(secbase == 0)
secbase = time(nil);
return nsec()/1000000000.0 - secbase;
}
void *
emalloc(ulong b)
{
void *p;
if((p = malloc(b)) == nil)
sysfatal("malloc %lud: %r", b);
return p;
}
void
Sys_HighFPPrecision(void)
{
}
void
Sys_LowFPPrecision(void)
{
}
static void
croak(void *, char *note)
{
if(strncmp(note, "sys:", 4) == 0){
IN_Shutdown();
SNDDMA_Shutdown();
}
noted(NDFLT);
}
void
threadmain(int c, char **v)
{
static char basedir[1024];
int j;
char *home;
double time, oldtime, newtime;
quakeparms_t parms;
memset(&parms, 0, sizeof parms);
/* ignore fp exceptions: rendering shit assumes they are */
setfcr(getfcr() & ~(FPOVFL|FPUNFL|FPINVAL|FPZDIV));
notify(croak);
COM_InitArgv(c, v);
parms.argc = com_argc;
parms.argv = com_argv;
argv0 = *v;
parms.memsize = 8*1024*1024;
if(j = COM_CheckParm("-mem"))
parms.memsize = atoi(com_argv[j+1]) * 1024*1024;
parms.membase = emalloc(parms.memsize);
if(home = getenv("home")){
snprint(basedir, sizeof basedir, "%s/lib/quake", home);
free(home);
}else
snprint(basedir, sizeof basedir, "/sys/lib/quake");
parms.basedir = basedir;
Host_Init(&parms);
oldtime = Sys_FloatTime() - 0.1;
for(;;){
// 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){
//usleep(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;
Host_Frame(time);
}
}