shithub: qk1

Download patch

ref: facd1d4e9b6a5c1cd9c5faf96f7520c62746144b
parent: aff29f25c0e72554e533162fc4d2ba69a8009fdb
author: Konstantinn Bonnet <[email protected]>
date: Sun Jan 29 21:06:49 EST 2017

reimplement common.c file reading shit using libbio

- nuke -path, -proghack, -cachedir: useless
- remove static_registered check: eat me
- remove exit text: just exit already
- #pragma varargck argpos for all va functions

--- a/cl_demo.c
+++ b/cl_demo.c
@@ -3,348 +3,165 @@
 #include <stdio.h>
 #include "quakedef.h"
 
-void CL_FinishTimeDemo (void);
-
-/*
-==============================================================================
-
-DEMO CODE
-
-When a demo is playing back, all NET_SendMessages are skipped, and
-NET_GetMessages are read from the demo file.
-
-Whenever cl.time gets past the last received message, another message is
-read from the demo file.
-==============================================================================
-*/
-
-/*
-==============
-CL_StopPlayback
-
-Called when a demo file runs out, or the user starts a game
-==============
-*/
-void CL_StopPlayback (void)
+static void
+dmtimeend(void)
 {
-	if (!cls.demoplayback)
-		return;
+	int f;
+	float t;
 
-	fclose (cls.demofile);
-	cls.demoplayback = false;
-	cls.demofile = NULL;
-	cls.state = ca_disconnected;
-
-	if (cls.timedemo)
-		CL_FinishTimeDemo ();
+	cls.timedemo = 0;
+	f = host_framecount - cls.td_startframe - 1;
+	t = realtime - cls.td_starttime;
+	if(t == 0.0)
+		t = 1;
+	Con_Printf("%d frames %5.1f seconds %5.1f fps\n", f, t, f/t);
 }
 
-/*
-====================
-CL_WriteDemoMessage
-
-Dumps the current net message, prefixed by the length and view angles
-====================
-*/
-void CL_WriteDemoMessage (void)
+static int
+dmmsg(void)
 {
-	int		len;
-	int		i;
-	float	f;
-
-	len = LittleLong (net_message.cursize);
-	fwrite (&len, 4, 1, cls.demofile);
-	for (i=0 ; i<3 ; i++)
-	{
-		f = LittleFloat (cl.viewangles[i]);
-		fwrite (&f, 4, 1, cls.demofile);
+	if(cls.signon == SIGNONS){
+		if(cls.timedemo){
+			if(host_framecount == cls.td_lastframe)
+				return 0;
+			cls.td_lastframe = host_framecount;
+			if(host_framecount == cls.td_startframe + 1)
+				cls.td_starttime = realtime;
+		}else if(cl.time <= cl.mtime[0])
+				return 0;
 	}
-	fwrite (net_message.data, net_message.cursize, 1, cls.demofile);
-	fflush (cls.demofile);
+	if(rlmpmsg() < 0){
+		abortdemo();
+		return 0;
+	}
+	return 1;
 }
 
-/*
-====================
-CL_GetMessage
-
-Handles recording and playback of demos, on top of NET_ code
-====================
-*/
-int CL_GetMessage (void)
+int
+clmsg(void)
 {
-	int		r, i;
-	float	f;
-	
-	if	(cls.demoplayback)
-	{
-	// decide if it is time to grab the next message		
-		if (cls.signon == SIGNONS)	// allways grab until fully connected
-		{
-			if (cls.timedemo)
-			{
-				if (host_framecount == cls.td_lastframe)
-					return 0;		// allready read this frame's message
-				cls.td_lastframe = host_framecount;
-			// if this is the second frame, grab the real td_starttime
-			// so the bogus time on the first frame doesn't count
-				if (host_framecount == cls.td_startframe + 1)
-					cls.td_starttime = realtime;
-			}
-			else if ( /* cl.time > 0 && */ cl.time <= cl.mtime[0])
-			{
-					return 0;		// don't need another message yet
-			}
-		}
-		
-	// get the next message
-		fread (&net_message.cursize, 4, 1, cls.demofile);
-		VectorCopy (cl.mviewangles[0], cl.mviewangles[1]);
-		for (i=0 ; i<3 ; i++)
-		{
-			fread (&f, 4, 1, cls.demofile);
-			cl.mviewangles[0][i] = LittleFloat (f);
-		}
-		
-		net_message.cursize = LittleLong (net_message.cursize);
-		if (net_message.cursize > MAX_MSGLEN)
-			Sys_Error ("Demo message > MAX_MSGLEN");
-		r = fread (net_message.data, net_message.cursize, 1, cls.demofile);
-		if (r != 1)
-		{
-			CL_StopPlayback ();
-			return 0;
-		}
-	
-		return 1;
-	}
+	int r;
 
-	while (1)
-	{
-		r = NET_GetMessage (cls.netcon);
-		
-		if (r != 1 && r != 2)
+	if(cls.demoplayback)
+		return dmmsg();
+	for(;;){
+		r = NET_GetMessage(cls.netcon);
+		if(r != 1 && r != 2)
 			return r;
-	
-	// discard nop keepalive message
-		if (net_message.cursize == 1 && net_message.data[0] == svc_nop)
-			Con_Printf ("<-- server to client keepalive\n");
+		if(net_message.cursize == 1 && net_message.data[0] == svc_nop)
+			dprint("<-- server to client keepalive");
 		else
 			break;
 	}
-
-	if (cls.demorecording)
-		CL_WriteDemoMessage ();
-	
+	if(cls.demorecording)
+		wlmpmsg();
 	return r;
 }
 
-
-/*
-====================
-CL_Stop_f
-
-stop recording a demo
-====================
-*/
-void CL_Stop_f (void)
+void
+abortdemo(void)
 {
-	if (cmd_source != src_command)
+	if(!cls.demoplayback)
 		return;
+	endlmp();
+	cls.demoplayback = 0;
+	cls.state = ca_disconnected;
+	if(cls.timedemo)
+		dmtimeend();
+}
 
-	if (!cls.demorecording)
-	{
-		Con_Printf ("Not recording a demo.\n");
+void
+stopdemo(void)
+{
+	if(cmd_source != src_command)
 		return;
+	if(!cls.demorecording){
+		Con_Printf("stop: no recording in progress\n");
+		return;
 	}
-
-// write a disconnect message to the demo file
-	SZ_Clear (&net_message);
-	MSG_WriteByte (&net_message, svc_disconnect);
-	CL_WriteDemoMessage ();
-
-// finish up
-	fclose (cls.demofile);
-	cls.demofile = NULL;
-	cls.demorecording = false;
-	Con_Printf ("Completed demo\n");
+	SZ_Clear(&net_message);
+	MSG_WriteByte(&net_message, svc_disconnect);
+	wlmpmsg();
+	endlmp();
+	cls.demorecording = 0;
 }
 
-/*
-====================
-CL_Record_f
-
-record <demoname> <map> [cd track]
-====================
-*/
-void CL_Record_f (void)
+void
+recdemo(void)
 {
-	int		c;
-	char	name[MAX_OSPATH];
-	int		track;
+	int c, trk;
+	char f[Nfspath];
 
-	if (cmd_source != src_command)
+	if(cmd_source != src_command)
 		return;
-
 	c = Cmd_Argc();
-	if (c != 2 && c != 3 && c != 4)
-	{
-		Con_Printf ("record <demoname> [<map> [cd track]]\n");
+	if(c < 2 || c > 4){
+		Con_Printf("record <demoname> [<map> [cd track]]\n");
 		return;
 	}
-
-	if (strstr(Cmd_Argv(1), ".."))
-	{
-		Con_Printf ("Relative pathnames are not allowed.\n");
+	trk = -1;
+	if(strstr(Cmd_Argv(1), "..") != nil){
+		Con_Printf("recdemo: invalid path\n");
 		return;
-	}
-
-	if (c == 2 && cls.state == ca_connected)
-	{
-		Con_Printf("Can not record - already connected to server\nClient demo recording must be started before connecting\n");
+	}else if(c == 2 && cls.state == ca_connected){
+		Con_Printf("recdemo: too late, already connected\n");
 		return;
-	}
-
-// write the forced cd track number, or -1
-	if (c == 4)
-	{
-		track = atoi(Cmd_Argv(3));
-		Con_Printf ("Forcing CD track to %d\n", cls.forcetrack);
-	}
-	else
-		track = -1;	
-
-	sprint (name, "%s/%s", com_gamedir, Cmd_Argv(1));
-	
-//
-// start the map up
-//
-	if (c > 2)
-		Cmd_ExecuteString ( va("map %s", Cmd_Argv(2)), src_command);
-	
-//
-// open the demo file
-//
-	COM_DefaultExtension (name, ".dem");
-
-	Con_Printf ("recording to %s.\n", name);
-	cls.demofile = fopen (name, "wb");
-	if (!cls.demofile)
-	{
-		Con_Printf ("ERROR: couldn't open.\n");
+	}else if(c == 4)
+		trk = atoi(Cmd_Argv(3));
+	snprint(f, sizeof f, "%s/%s", fsdir, Cmd_Argv(1));
+	ext(f, ".dem");
+	if(c > 2)
+		Cmd_ExecuteString(va("map %s", Cmd_Argv(2)), src_command);
+	if(reclmp(f, trk) < 0){
+		Con_Printf("recdemo: can't open %s: %r\n", f);
 		return;
 	}
-
-	cls.forcetrack = track;
-	fprintf (cls.demofile, "%d\n", cls.forcetrack);
-	
-	cls.demorecording = true;
+	cls.demorecording = 1;
+	cls.forcetrack = trk;	
 }
 
-
-/*
-====================
-CL_PlayDemo_f
-
-play [demoname]
-====================
-*/
-void CL_PlayDemo_f (void)
+/* when a demo is playing back, all NET_SendMessages are skipped, and
+ * NET_GetMessages are read from the demo file. whenever cl.time gets past
+ * the last received message, another message is read from the demo lump. */
+void
+playdemo(void)
 {
-	char	name[256];
-	int c;
-	qboolean neg = false;
+	char f[Nfspath];
 
-	if (cmd_source != src_command)
+	if(cmd_source != src_command)
 		return;
-
-	if (Cmd_Argc() != 2)
-	{
-		Con_Printf ("play <demoname> : plays a demo\n");
+	if(Cmd_Argc() != 2){
+		Con_Printf("playdemo <demo> : plays a demo\n");
 		return;
 	}
-
-//
-// disconnect from server
-//
-	CL_Disconnect ();
-	
-//
-// open the demo file
-//
-	strcpy (name, Cmd_Argv(1));
-	COM_DefaultExtension (name, ".dem");
-
-	Con_Printf ("Playing demo from %s.\n", name);
-	COM_FOpenFile (name, &cls.demofile);
-	if (!cls.demofile)
-	{
-		Con_Printf ("ERROR: couldn't open.\n");
-		cls.demonum = -1;		// stop demo loop
+	CL_Disconnect();
+	memset(f, 0, sizeof f);
+	strncpy(f, Cmd_Argv(1), sizeof(f)-5);
+	ext(f, ".dem");
+	if(demolmp(f) < 0){
+		Con_Printf("playdemo: can't open %s: %r\n", f);
+		cls.demonum = -1;
 		return;
 	}
-
-	cls.demoplayback = true;
+	cls.demoplayback = 1;
 	cls.state = ca_connected;
-	cls.forcetrack = 0;
-
-	while ((c = getc(cls.demofile)) != '\n')
-		if (c == '-')
-			neg = true;
-		else
-			cls.forcetrack = cls.forcetrack * 10 + (c - '0');
-
-	if (neg)
-		cls.forcetrack = -cls.forcetrack;
-// ZOID, fscanf is evil
-//	fscanf (cls.demofile, "%i\n", &cls.forcetrack);
 }
 
-/*
-====================
-CL_FinishTimeDemo
-
-====================
-*/
-void CL_FinishTimeDemo (void)
+void
+timedemo(void)
 {
-	int		frames;
-	float	time;
-	
-	cls.timedemo = false;
-	
-// the first frame didn't count
-	frames = (host_framecount - cls.td_startframe) - 1;
-	time = realtime - cls.td_starttime;
-	if (!time)
-		time = 1;
-	Con_Printf ("%d frames %5.1f seconds %5.1f fps\n", frames, time, frames/time);
-}
-
-/*
-====================
-CL_TimeDemo_f
-
-timedemo [demoname]
-====================
-*/
-void CL_TimeDemo_f (void)
-{
-	if (cmd_source != src_command)
+	if(cmd_source != src_command)
 		return;
-
-	if (Cmd_Argc() != 2)
-	{
-		Con_Printf ("timedemo <demoname> : gets demo speeds\n");
+	if(Cmd_Argc() != 2){
+		Con_Printf("timedemo <demoname> : gets demo speeds\n");
 		return;
 	}
-
-	CL_PlayDemo_f ();
-	
-// cls.td_starttime will be grabbed at the second frame of the demo, so
-// all the loading time doesn't get counted
-	
-	cls.timedemo = true;
+	playdemo();
+	if(cls.demoplayback != 1)
+		return;
+	/* cls.td_starttime will be grabbed at the second frame of the demo, so
+	 * all the loading time doesn't get counted */
+	cls.timedemo = 1;
 	cls.td_startframe = host_framecount;
-	cls.td_lastframe = -1;		// get a new message this frame
+	cls.td_lastframe = -1;	/* get a new message this frame */
 }
-
--- a/cl_main.c
+++ b/cl_main.c
@@ -90,11 +90,11 @@
 
 // if running a local server, shut it down
 	if (cls.demoplayback)
-		CL_StopPlayback ();
+		abortdemo ();
 	else if (cls.state == ca_connected)
 	{
 		if (cls.demorecording)
-			CL_Stop_f ();
+			stopdemo();
 
 		print("CL_Disconnect: sending clc_disconnect...\n");
 		SZ_Clear (&cls.message);
@@ -599,7 +599,7 @@
 	
 	do
 	{
-		ret = CL_GetMessage ();
+		ret = clmsg ();
 		if (ret == -1)
 			Host_Error ("CL_ReadFromServer: lost server connection");
 		if (!ret)
@@ -703,14 +703,11 @@
 	Cvar_RegisterVariable (&m_yaw);
 	Cvar_RegisterVariable (&m_forward);
 	Cvar_RegisterVariable (&m_side);
-
-//	Cvar_RegisterVariable (&cl_autofire);
 	
 	Cmd_AddCommand ("entities", CL_PrintEntities_f);
 	Cmd_AddCommand ("disconnect", CL_Disconnect_f);
-	Cmd_AddCommand ("record", CL_Record_f);
-	Cmd_AddCommand ("stop", CL_Stop_f);
-	Cmd_AddCommand ("playdemo", CL_PlayDemo_f);
-	Cmd_AddCommand ("timedemo", CL_TimeDemo_f);
+	Cmd_AddCommand("stop", stopdemo);
+	Cmd_AddCommand("record", recdemo);
+	Cmd_AddCommand("playdemo", playdemo);
+	Cmd_AddCommand("timedemo", timedemo);
 }
-
--- a/cl_parse.c
+++ b/cl_parse.c
@@ -146,11 +146,11 @@
 	
 	do
 	{
-		ret = CL_GetMessage ();
+		ret = clmsg ();
 		switch (ret)
 		{
 		default:
-			Host_Error ("CL_KeepaliveMessage: CL_GetMessage failed");		
+			Host_Error ("CL_KeepaliveMessage: clmsg failed");		
 		case 0:
 			break;	// nothing waiting
 		case 1:
@@ -190,8 +190,8 @@
 	char	*str;
 	int		i;
 	int		nummodels, numsounds;
-	char	model_precache[MAX_MODELS][MAX_QPATH];
-	char	sound_precache[MAX_SOUNDS][MAX_QPATH];
+	char	model_precache[MAX_MODELS][Npath];
+	char	sound_precache[MAX_SOUNDS][Npath];
 
 	print("CL_ParseServerInfo: parsing serverinfo pkt...\n");
 //
@@ -390,7 +390,7 @@
 	else
 	{
 		if (i > cl.maxclients)
-			Sys_Error ("i >= cl.maxclients");
+			fatal ("i >= cl.maxclients");
 		ent->colormap = cl.scores[i-1].translations;
 	}
 
@@ -599,7 +599,7 @@
 	byte	*dest, *source;
 	
 	if (slot > cl.maxclients)
-		Sys_Error ("CL_NewTranslation: slot > cl.maxclients");
+		fatal ("CL_NewTranslation: slot > cl.maxclients");
 	dest = cl.scores[slot].translations;
 	source = vid.colormap;
 	memcpy(dest, vid.colormap, sizeof cl.scores[slot].translations);
@@ -784,7 +784,7 @@
 		case svc_lightstyle:
 			i = MSG_ReadByte ();
 			if (i >= MAX_LIGHTSTYLES)
-				Sys_Error ("svc_lightstyle > MAX_LIGHTSTYLES");
+				fatal ("svc_lightstyle > MAX_LIGHTSTYLES");
 			strcpy(cl_lightstyle[i].map,  MSG_ReadString());
 			cl_lightstyle[i].length = strlen(cl_lightstyle[i].map);
 			break;
@@ -869,7 +869,7 @@
 		case svc_updatestat:
 			i = MSG_ReadByte ();
 			if (i < 0 || i >= MAX_CL_STATS)
-				Sys_Error ("svc_updatestat: %d is invalid", i);
+				fatal ("svc_updatestat: %d is invalid", i);
 			cl.stats[i] = MSG_ReadLong ();;
 			break;
 			
@@ -880,7 +880,7 @@
 		case svc_cdtrack:
 			cl.cdtrack = MSG_ReadByte ();
 			cl.looptrack = MSG_ReadByte ();
-			if ( (cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1) )
+			if((cls.demoplayback || cls.demorecording) && cls.forcetrack > 0)
 				CDAudio_Play ((byte)cls.forcetrack, true);
 			else
 				CDAudio_Play ((byte)cl.cdtrack, true);
--- a/cl_tent.c
+++ b/cl_tent.c
@@ -230,7 +230,7 @@
 		break;
 
 	default:
-		Sys_Error ("CL_ParseTEnt: bad type");
+		fatal ("CL_ParseTEnt: bad type");
 	}
 }
 
--- a/client.h
+++ b/client.h
@@ -86,7 +86,7 @@
 	cactive_t	state;
 
 // personalization data sent to server	
-	char		mapstring[MAX_QPATH];
+	char		mapstring[Npath];
 	char		spawnparms[MAX_MAPSTRING];	// to restart a level
 
 // demo loop control
@@ -99,7 +99,6 @@
 	qboolean	demoplayback;
 	qboolean	timedemo;
 	int			forcetrack;			// -1 = use normal cd track
-	FILE		*demofile;
 	int			td_lastframe;		// to meter out one message a frame
 	int			td_startframe;		// host_framecount at start
 	float		td_starttime;		// realtime at second frame of timedemo
@@ -220,8 +219,6 @@
 
 extern	cvar_t	cl_anglespeedkey;
 
-extern	cvar_t	cl_autofire;
-
 extern	cvar_t	cl_shownet;
 extern	cvar_t	cl_nolerp;
 
@@ -304,17 +301,6 @@
 
 float CL_KeyState (kbutton_t *key);
 char *Key_KeynumToString (int keynum);
-
-//
-// cl_demo.c
-//
-void CL_StopPlayback (void);
-int CL_GetMessage (void);
-
-void CL_Stop_f (void);
-void CL_Record_f (void);
-void CL_PlayDemo_f (void);
-void CL_TimeDemo_f (void);
 
 //
 // cl_parse.c
--- a/cmd.c
+++ b/cmd.c
@@ -274,10 +274,9 @@
 	}
 
 	mark = Hunk_LowMark ();
-	f = (char *)COM_LoadHunkFile (Cmd_Argv(1));
-	if (!f)
-	{
-		Con_Printf ("couldn't exec %s\n",Cmd_Argv(1));
+	f = loadhunklmp(Cmd_Argv(1), nil);
+	if(f == nil){
+		Con_Printf("couldn't exec %s: %r\n", Cmd_Argv(1));
 		return;
 	}
 	Con_Printf ("execing %s\n",Cmd_Argv(1));
@@ -512,7 +511,7 @@
 	cmd_function_t	*cmd;
 	
 	if (host_initialized)	// because hunk allocation would get stomped
-		Sys_Error ("Cmd_AddCommand after host_initialized");
+		fatal ("Cmd_AddCommand after host_initialized");
 		
 // fail if the command is a variable name
 	if (Cvar_VariableString(cmd_name)[0])
@@ -673,7 +672,7 @@
 	int i;
 	
 	if (parm == nil)
-		Sys_Error ("Cmd_CheckParm: nil");
+		fatal ("Cmd_CheckParm: nil");
 
 	for (i = 1; i < Cmd_Argc (); i++)
 		if(cistrcmp(parm, Cmd_Argv(i)) == 0)
--- a/common.c
+++ b/common.c
@@ -1,10 +1,12 @@
-// common.c -- misc functions used in client and server
-
 #include <u.h>
 #include <libc.h>
 #include <stdio.h>
 #include "quakedef.h"
 
+cvar_t  registered = {"registered","0"};
+cvar_t  cmdline = {"cmdline","0", false, true};
+char	com_cmdline[256];
+
 #define NUM_SAFE_ARGVS  6
 
 static char     *largv[MAX_NUM_ARGVS + NUM_SAFE_ARGVS + 1];
@@ -13,52 +15,15 @@
 static char     *safeargvs[NUM_SAFE_ARGVS] =
 	{"-stdvid", "-nolan", "-nosound", "-nojoy", "-nomouse", "-dibonly"};
 
-cvar_t  registered = {"registered","0"};
-cvar_t  cmdline = {"cmdline","0", false, true};
-
-qboolean        com_modified;   // set true if using non-id files
-
-qboolean		proghack;
-
-int             static_registered = 1;  // only for startup check, then set
-
 qboolean		msg_suppress_1 = 0;
 
-void COM_InitFilesystem (void);
-
-// if a packfile directory differs from this, it is assumed to be hacked
-#define PAK0_COUNT              339
-#define PAK0_CRC                32981
-
 char	com_token[1024];
 int		com_argc;
 char	**com_argv;
 
-#define CMDLINE_LENGTH	256
-char	com_cmdline[CMDLINE_LENGTH];
 
 qboolean		standard_quake = true, rogue, hipnotic;
 
-// this graphic needs to be in the pak file to use registered features
-unsigned short pop[] =
-{
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
-,0x0000,0x0000,0x6600,0x0000,0x0000,0x0000,0x6600,0x0000
-,0x0000,0x0066,0x0000,0x0000,0x0000,0x0000,0x0067,0x0000
-,0x0000,0x6665,0x0000,0x0000,0x0000,0x0000,0x0065,0x6600
-,0x0063,0x6561,0x0000,0x0000,0x0000,0x0000,0x0061,0x6563
-,0x0064,0x6561,0x0000,0x0000,0x0000,0x0000,0x0061,0x6564
-,0x0064,0x6564,0x0000,0x6469,0x6969,0x6400,0x0064,0x6564
-,0x0063,0x6568,0x6200,0x0064,0x6864,0x0000,0x6268,0x6563
-,0x0000,0x6567,0x6963,0x0064,0x6764,0x0063,0x6967,0x6500
-,0x0000,0x6266,0x6769,0x6a68,0x6768,0x6a69,0x6766,0x6200
-,0x0000,0x0062,0x6566,0x6666,0x6666,0x6666,0x6562,0x0000
-,0x0000,0x0000,0x0062,0x6364,0x6664,0x6362,0x0000,0x0000
-,0x0000,0x0000,0x0000,0x0062,0x6662,0x0000,0x0000,0x0000
-,0x0000,0x0000,0x0000,0x0061,0x6661,0x0000,0x0000,0x0000
-,0x0000,0x0000,0x0000,0x0000,0x6500,0x0000,0x0000,0x0000
-,0x0000,0x0000,0x0000,0x0000,0x6400,0x0000,0x0000,0x0000
-};
 
 /*
 
@@ -69,15 +34,6 @@
 only used during filesystem initialization.
 
 The "game directory" is the first tree on the search path and directory that all generated files (savegames, screenshots, demos, config files) will be saved to.  This can be overridden with the "-game" command line parameter.  The game directory can never be changed while quake is executing.  This is a precacution against having a malicious server instruct clients to write files over areas they shouldn't.
-
-The "cache directory" is only used during development to save network bandwidth, especially over ISDN / T1 lines.  If there is a cache directory
-specified, when a file is found by the normal search path, it will be mirrored
-into the cache directory, then opened there.
-
-
-
-FIXME:
-The file "parms.txt" will be read out of the game directory and appended to the current command line arguments to allow different games to initialize startup parms differently.  This could be used to add a "-sspeed 22050" for the high quality sound edition.  Because they are added at the end, they will not override an explicit setting on the original command line.
 	
 */
 
@@ -119,8 +75,6 @@
 ============================================================================
 */
 
-qboolean        bigendien;
-
 short   (*BigShort) (short l);
 short   (*LittleShort) (short l);
 int     (*BigLong) (int l);
@@ -128,60 +82,6 @@
 float   (*BigFloat) (float l);
 float   (*LittleFloat) (float l);
 
-short   ShortSwap (short l)
-{
-	byte    b1,b2;
-
-	b1 = l&255;
-	b2 = (l>>8)&255;
-
-	return (b1<<8) + b2;
-}
-
-short   ShortNoSwap (short l)
-{
-	return l;
-}
-
-int    LongSwap (int l)
-{
-	byte    b1,b2,b3,b4;
-
-	b1 = l&255;
-	b2 = (l>>8)&255;
-	b3 = (l>>16)&255;
-	b4 = (l>>24)&255;
-
-	return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
-}
-
-int     LongNoSwap (int l)
-{
-	return l;
-}
-
-float FloatSwap (float f)
-{
-	union
-	{
-		float   f;
-		byte    b[4];
-	} dat1, dat2;
-	
-	
-	dat1.f = f;
-	dat2.b[0] = dat1.b[3];
-	dat2.b[1] = dat1.b[2];
-	dat2.b[2] = dat1.b[1];
-	dat2.b[3] = dat1.b[0];
-	return dat2.f;
-}
-
-float FloatNoSwap (float f)
-{
-	return f;
-}
-
 /*
 ==============================================================================
 
@@ -201,7 +101,7 @@
 	
 #ifdef PARANOID
 	if (c < -128 || c > 127)
-		Sys_Error ("MSG_WriteChar: range error");
+		fatal ("MSG_WriteChar: range error");
 #endif
 
 	buf = SZ_GetSpace (sb, 1);
@@ -214,7 +114,7 @@
 	
 #ifdef PARANOID
 	if (c < 0 || c > 255)
-		Sys_Error ("MSG_WriteByte: range error");
+		fatal ("MSG_WriteByte: range error");
 #endif
 
 	buf = SZ_GetSpace (sb, 1);
@@ -227,7 +127,7 @@
 	
 #ifdef PARANOID
 	if (c < ((short)0x8000) || c > (short)0x7fff)
-		Sys_Error ("MSG_WriteShort: range error");
+		fatal ("MSG_WriteShort: range error");
 #endif
 
 	buf = SZ_GetSpace (sb, 2);
@@ -449,9 +349,9 @@
 	
 	if(buf->cursize + length > buf->maxsize){
 		if(!buf->allowoverflow)
-			Sys_Error("SZ_GetSpace: overflow without allowoverflow set");
+			fatal("SZ_GetSpace: overflow without allowoverflow set");
 		if(length > buf->maxsize)
-			Sys_Error("SZ_GetSpace: %d is > full buffer size", length);
+			fatal("SZ_GetSpace: %d is > full buffer size", length);
 		buf->overflowed = true;
 		Con_Printf("SZ_GetSpace: overflow");
 		SZ_Clear(buf); 
@@ -481,116 +381,7 @@
 		memcpy((uchar *)SZ_GetSpace(buf, len-1)-1, data, len);	// write over trailing 0
 }
 
-
-//============================================================================
-
-
 /*
-============
-COM_SkipPath
-============
-*/
-char *COM_SkipPath (char *pathname)
-{
-	char    *last;
-	
-	last = pathname;
-	while (*pathname)
-	{
-		if (*pathname=='/')
-			last = pathname+1;
-		pathname++;
-	}
-	return last;
-}
-
-/*
-============
-COM_StripExtension
-============
-*/
-void COM_StripExtension (char *in, char *out)
-{
-	while (*in && *in != '.')
-		*out++ = *in++;
-	*out = 0;
-}
-
-/*
-============
-COM_FileExtension
-============
-*/
-char *COM_FileExtension (char *in)
-{
-	static char exten[8];
-	int             i;
-
-	while (*in && *in != '.')
-		in++;
-	if (!*in)
-		return "";
-	in++;
-	for (i=0 ; i<7 && *in ; i++,in++)
-		exten[i] = *in;
-	exten[i] = 0;
-	return exten;
-}
-
-/*
-============
-COM_FileBase
-============
-*/
-void COM_FileBase (char *in, char *out)
-{
-	char *s, *s2;
-	
-	s = in + strlen(in) - 1;
-	
-	while (s != in && *s != '.')
-		s--;
-	
-	for (s2 = s ; *s2 && *s2 != '/' ; s2--)
-	;
-	
-	if (s-s2 < 2)
-		strcpy (out,"?model?");
-	else
-	{
-		s--;
-		strncpy (out,s2+1, s-s2);
-		out[s-s2] = 0;
-	}
-}
-
-
-/*
-==================
-COM_DefaultExtension
-==================
-*/
-void COM_DefaultExtension (char *path, char *extension)
-{
-	char    *src;
-//
-// if path doesn't have a .EXT, append extension
-// (extension should include the .)
-//
-	src = path + strlen(path) - 1;
-
-	while (*src != '/' && src != path)
-	{
-		if (*src == '.')
-			return;                 // it has an extension
-		src--;
-	}
-
-	strcat (path, extension);
-}
-
-
-/*
 ==============
 COM_Parse
 
@@ -693,50 +484,6 @@
 
 /*
 ================
-COM_CheckRegistered
-
-Looks for the pop.txt file and verifies it.
-Sets the "registered" cvar.
-Immediately exits out if an alternate game was attempted to be started without
-being registered.
-================
-*/
-void COM_CheckRegistered (void)
-{
-	int             h;
-	unsigned short  check[128];
-	int                     i;
-
-	COM_OpenFile("gfx/pop.lmp", &h);
-	static_registered = 0;
-
-	if (h == -1)
-	{
-		Con_Printf ("Playing shareware version.\n");
-		if (com_modified)
-			Sys_Error ("You must have the registered version to use modified games");
-		return;
-	}
-
-	eread(h, check, sizeof check);
-	COM_CloseFile (h);
-	
-	for (i=0 ; i<128 ; i++)
-		if (pop[i] != (unsigned short)BigShort (check[i]))
-			Sys_Error ("Corrupted data file.");
-	
-	Cvar_Set ("cmdline", com_cmdline);
-	Cvar_Set ("registered", "1");
-	static_registered = 1;
-	Con_Printf ("Playing registered version.\n");
-}
-
-
-void COM_Path_f (void);
-
-
-/*
-================
 COM_InitArgv
 ================
 */
@@ -752,12 +499,12 @@
 	{
 		i = 0;
 
-		while ((n < (CMDLINE_LENGTH - 1)) && argv[j][i])
+		while ((n < (sizeof(com_cmdline) - 1)) && argv[j][i])
 		{
 			com_cmdline[n++] = argv[j][i++];
 		}
 
-		if (n < (CMDLINE_LENGTH - 1))
+		if (n < (sizeof(com_cmdline) - 1))
 			com_cmdline[n++] = ' ';
 		else
 			break;
@@ -802,48 +549,7 @@
 	}
 }
 
-
 /*
-================
-COM_Init
-================
-*/
-void COM_Init (char *) /*basedir*/
-{
-	byte    swaptest[2] = {1,0};
-
-// set the byte swapping variables in a portable manner 
-	if ( *(short *)swaptest == 1)
-	{
-		bigendien = false;
-		BigShort = ShortSwap;
-		LittleShort = ShortNoSwap;
-		BigLong = LongSwap;
-		LittleLong = LongNoSwap;
-		BigFloat = FloatSwap;
-		LittleFloat = FloatNoSwap;
-	}
-	else
-	{
-		bigendien = true;
-		BigShort = ShortNoSwap;
-		LittleShort = ShortSwap;
-		BigLong = LongNoSwap;
-		LittleLong = LongSwap;
-		BigFloat = FloatNoSwap;
-		LittleFloat = FloatSwap;
-	}
-
-	Cvar_RegisterVariable (&registered);
-	Cvar_RegisterVariable (&cmdline);
-	Cmd_AddCommand ("path", COM_Path_f);
-
-	COM_InitFilesystem ();
-	COM_CheckRegistered ();
-}
-
-
-/*
 ============
 va
 
@@ -863,626 +569,4 @@
 	va_end(arg);
 
 	return s;  
-}
-
-
-/// just for debugging
-int     memsearch (byte *start, int count, int search)
-{
-	int             i;
-	
-	for (i=0 ; i<count ; i++)
-		if (start[i] == search)
-			return i;
-	return -1;
-}
-
-/*
-=============================================================================
-
-QUAKE FILESYSTEM
-
-=============================================================================
-*/
-
-vlong	com_filesize;
-
-
-//
-// in memory
-//
-
-typedef struct
-{
-	char    name[MAX_QPATH];
-	int             filepos, filelen;
-} packfile_t;
-
-typedef struct pack_s
-{
-	char    filename[MAX_OSPATH];
-	int             handle;
-	int             numfiles;
-	packfile_t      *files;
-} pack_t;
-
-//
-// on disk
-//
-typedef struct
-{
-	char    name[56];
-	int             filepos, filelen;
-} dpackfile_t;
-
-typedef struct
-{
-	char    id[4];
-	int             dirofs;
-	int             dirlen;
-} dpackheader_t;
-
-#define MAX_FILES_IN_PACK       2048
-
-char    com_cachedir[MAX_OSPATH];
-char    com_gamedir[MAX_OSPATH];
-
-typedef struct searchpath_s
-{
-	char    filename[MAX_OSPATH];
-	pack_t  *pack;          // only one of filename / pack will be used
-	struct searchpath_s *next;
-} searchpath_t;
-
-searchpath_t    *com_searchpaths;
-
-/*
-============
-COM_Path_f
-
-============
-*/
-void COM_Path_f (void)
-{
-	searchpath_t    *s;
-	
-	Con_Printf ("Current search path:\n");
-	for (s=com_searchpaths ; s ; s=s->next)
-	{
-		if (s->pack)
-		{
-			Con_Printf ("%s (%d files)\n", s->pack->filename, s->pack->numfiles);
-		}
-		else
-			Con_Printf ("%s\n", s->filename);
-	}
-}
-
-void
-COM_WriteFile(char *filename, void *data, int len)
-{
-	int fd;
-	char path[MAX_OSPATH];
-
-	snprint(path, sizeof path, "%s/%s", com_gamedir, filename);
-	if((fd = create(path, OWRITE, 0666)) < 0)
-		sysfatal("COM_WriteFile: %r");
-	ewrite(fd, data, len);
-	close(fd);
-}
-
-/* create directories needed to resolve a path */
-static void
-mkdirp(char *path)
-{
-	int fd;
-	char *s;
-
-	for(s = path+1; *s; s++){
-		if(*s == '/'){     
-			*s = 0;
-			if(access(path, AEXIST) < 0){
-				if((fd = create(path, OREAD, DMDIR|0777)) < 0)
-					sysfatal("mkdirp: %r");
-				close(fd);
-			}
-			*s = '/';
-		}
-	}
-}
-
-/* Copies a file over from the net to the local cache, creating any directories
- * needed. This is for the convenience of developers using ISDN from home. */
-void
-COM_CopyFile(char *netpath, char *cachepath)
-{
-	int             in, out;
-	int             count;
-	vlong		remaining;
-	char    buf[4096];
-
-	if((in = open(netpath, OREAD)) < 0)
-		sysfatal("COM_CopyFile:open: %r");
-	remaining = flen(in);
-
-	mkdirp(cachepath);
-	if((out = create(cachepath, OWRITE, 0666)) < 0)
-		sysfatal("COM_CopyFile: %r");
-
-	while(remaining){
-		if(remaining < sizeof buf)
-			count = remaining;
-		else
-			count = sizeof buf;
-		eread(in, buf, count);
-		ewrite(out, buf, count);
-		remaining -= count;
-	}
-
-	close(in);
-	close(out);    
-}
-
-/*
-===========
-COM_FindFile
-
-Finds the file in the search path.
-Sets com_filesize and one of handle or file
-===========
-*/
-int COM_FindFile (char *filename, int *handle, FILE **file)
-{
-	searchpath_t    *search;
-	char            netpath[MAX_OSPATH];
-	char            cachepath[MAX_OSPATH];
-	pack_t          *pak;
-	int                     i;
-	int                     findtime, cachetime;
-
-	if (file && handle)
-		Sys_Error ("COM_FindFile: both handle and file set");
-	if (!file && !handle)
-		Sys_Error ("COM_FindFile: neither handle or file set");
-		
-//
-// search through the path, one element at a time
-//
-	search = com_searchpaths;
-	if (proghack)
-	{	// gross hack to use quake 1 progs with quake 2 maps
-		if(strcmp(filename, "progs.dat") == 0)
-			search = search->next;
-	}
-
-	for ( ; search ; search = search->next)
-	{
-	// is the element a pak file?
-		if (search->pack)
-		{
-		// look through all the pak file elements
-			pak = search->pack;
-			for (i=0 ; i<pak->numfiles ; i++)
-				if(strcmp(pak->files[i].name, filename) == 0)
-				{       // found it!
-					if (handle)
-					{
-						*handle = pak->handle;
-						seek(pak->handle, pak->files[i].filepos, 0);
-					}
-					else
-					{       // open a new file on the pakfile
-						*file = fopen (pak->filename, "rb");
-						if (*file)
-							fseek (*file, pak->files[i].filepos, SEEK_SET);
-					}
-					com_filesize = pak->files[i].filelen;
-					return com_filesize;
-				}
-		}
-		else
-		{               
-	// check a file in the directory tree
-			if (!static_registered)
-			{       // if not a registered version, don't ever go beyond base
-				if ( strchr (filename, '/') || strchr (filename,'\\'))
-					continue;
-			}
-
-			snprint(netpath, sizeof netpath, "%s/%s", search->filename, filename);
-
-			findtime = Sys_FileTime (netpath);
-			if (findtime == -1)
-				continue;
-	
-		// see if the file needs to be updated in the cache
-			if (!com_cachedir[0])
-				strcpy (cachepath, netpath);
-			else
-			{	
-				sprint (cachepath,"%s%s", com_cachedir, netpath);
-
-				cachetime = Sys_FileTime (cachepath);
-			
-				if (cachetime < findtime)
-					COM_CopyFile (netpath, cachepath);
-				strcpy (netpath, cachepath);
-			}
-
-			com_filesize = -1;
-			if((i = open(netpath, OREAD)) < 0)
-				fprint(2, "COM_FindFile:open: %r\n");
-			else
-				com_filesize = flen(i);
-
-			if(handle != nil)
-				*handle = i;
-			else
-			{
-				close(i);
-				*file = fopen (netpath, "rb");
-			}
-			return com_filesize;
-		}	
-	}
-
-	fprint(2, "FindFile: no such file %s\n", filename);
-
-	if (handle)
-		*handle = -1;
-	else
-		*file = NULL;
-	com_filesize = -1;
-	return -1;
-}
-
-
-/*
-===========
-COM_OpenFile
-
-filename never has a leading slash, but may contain directory walks
-returns a handle and a length
-it may actually be inside a pak file
-===========
-*/
-int COM_OpenFile (char *filename, int *handle)
-{
-	return COM_FindFile (filename, handle, NULL);
-}
-
-/*
-===========
-COM_FOpenFile
-
-If the requested file is inside a packfile, a new FILE * will be opened
-into the file.
-===========
-*/
-int COM_FOpenFile (char *filename, FILE **file)
-{
-	return COM_FindFile (filename, nil, file);
-}
-
-/*
-============
-COM_CloseFile
-
-If it is a pak file handle, don't really close it
-============
-*/
-void COM_CloseFile (int h)
-{
-	searchpath_t    *s;
-	
-	for (s = com_searchpaths ; s ; s=s->next)
-		if (s->pack && s->pack->handle == h)
-			return;
-			
-	close(h);
-}
-
-
-/*
-============
-COM_LoadFile
-
-Filename are reletive to the quake directory.
-Allways appends a 0 byte.
-============
-*/
-cache_user_t *loadcache;
-byte    *loadbuf;
-int             loadsize;
-byte *COM_LoadFile (char *path, int usehunk)
-{
-	int             h;
-	byte    *buf;
-	char    base[32];
-	int             len;
-
-	buf = nil;     // quiet compiler warning
-
-// look for it in the filesystem or pack files
-	len = COM_OpenFile (path, &h);
-	if (h == -1)
-		return nil;
-	
-// extract the filename base name for hunk tag
-	COM_FileBase (path, base);
-	
-	if (usehunk == 1)
-		buf = Hunk_AllocName (len+1, base);
-	else if (usehunk == 2)
-		buf = Hunk_TempAlloc (len+1);
-	else if (usehunk == 0)
-		buf = Z_Malloc (len+1);
-	else if (usehunk == 3)
-		buf = Cache_Alloc (loadcache, len+1, base);
-	else if (usehunk == 4)
-	{
-		if (len+1 > loadsize)
-			buf = Hunk_TempAlloc (len+1);
-		else
-			buf = loadbuf;
-	}
-	else
-		Sys_Error ("COM_LoadFile: bad usehunk");
-
-	if (!buf)
-		Sys_Error ("COM_LoadFile: not enough space for %s", path);
-		
-	((byte *)buf)[len] = 0;
-
-	Draw_BeginDisc ();
-	eread(h, buf, len);
-	COM_CloseFile (h);
-	Draw_EndDisc ();
-
-	return buf;
-}
-
-byte *COM_LoadHunkFile (char *path)
-{
-	return COM_LoadFile (path, 1);
-}
-
-byte *COM_LoadTempFile (char *path)
-{
-	return COM_LoadFile (path, 2);
-}
-
-void COM_LoadCacheFile (char *path, struct cache_user_s *cu)
-{
-	loadcache = cu;
-	COM_LoadFile (path, 3);
-}
-
-// uses temp hunk if larger than bufsize
-byte *COM_LoadStackFile (char *path, void *buffer, int bufsize)
-{
-	byte    *buf;
-	
-	loadbuf = (byte *)buffer;
-	loadsize = bufsize;
-	buf = COM_LoadFile (path, 4);
-	
-	return buf;
-}
-
-/*
-=================
-COM_LoadPackFile
-
-Takes an explicit (not game tree related) path to a pak file.
-
-Loads the header and directory, adding the files at the beginning
-of the list so they override previous pack files.
-=================
-*/
-pack_t *COM_LoadPackFile (char *packfile)
-{
-	dpackheader_t   header;
-	int                             i;
-	packfile_t              *newfiles;
-	int                             numpackfiles;
-	pack_t                  *pack;
-	int                             packhandle;
-	dpackfile_t             info[MAX_FILES_IN_PACK];
-	unsigned short          crc;
-
-	if((packhandle = open(packfile, OREAD)) < 0){
-		fprint(2, "COM_LoadPackFile: %r\n");
-		return nil;
-	}
-	eread(packhandle, &header, sizeof header);
-	if (header.id[0] != 'P' || header.id[1] != 'A'
-	|| header.id[2] != 'C' || header.id[3] != 'K')
-		Sys_Error ("%s is not a packfile", packfile);
-	header.dirofs = LittleLong (header.dirofs);
-	header.dirlen = LittleLong (header.dirlen);
-
-	numpackfiles = header.dirlen / sizeof(dpackfile_t);
-
-	if (numpackfiles > MAX_FILES_IN_PACK)
-		Sys_Error ("%s has %d files", packfile, numpackfiles);
-
-	if (numpackfiles != PAK0_COUNT)
-		com_modified = true;    // not the original file
-
-	newfiles = Hunk_AllocName(numpackfiles * sizeof *newfiles, "packfile");
-
-	seek(packhandle, header.dirofs, 0);
-	eread(packhandle, info, header.dirlen);
-
-// crc the directory to check for modifications
-	CRC_Init (&crc);
-	for (i=0 ; i<header.dirlen ; i++)
-		CRC_ProcessByte (&crc, ((byte *)info)[i]);
-	if (crc != PAK0_CRC)
-		com_modified = true;
-
-// parse the directory
-	for (i=0 ; i<numpackfiles ; i++)
-	{
-		strcpy (newfiles[i].name, info[i].name);
-		newfiles[i].filepos = LittleLong(info[i].filepos);
-		newfiles[i].filelen = LittleLong(info[i].filelen);
-	}
-
-	pack = Hunk_Alloc(sizeof *pack);
-	strcpy (pack->filename, packfile);
-	pack->handle = packhandle;
-	pack->numfiles = numpackfiles;
-	pack->files = newfiles;
-	
-	Con_Printf ("Added packfile %s (%d files)\n", packfile, numpackfiles);
-	return pack;
-}
-
-
-/*
-================
-COM_AddGameDirectory
-
-Sets com_gamedir, adds the directory to the head of the path,
-then loads and adds pak1.pak pak2.pak ... 
-================
-*/
-void COM_AddGameDirectory (char *dir)
-{
-	int                             i;
-	searchpath_t    *search;
-	pack_t                  *pak;
-	char                    pakfile[MAX_OSPATH];
-
-	strcpy (com_gamedir, dir);
-
-//
-// add the directory to the search path
-//
-	search = Hunk_Alloc(sizeof *search);
-	strcpy (search->filename, dir);
-	search->next = com_searchpaths;
-	com_searchpaths = search;
-
-//
-// add any pak files in the format pak0.pak pak1.pak, ...
-//
-	for (i=0 ; ; i++)
-	{
-		sprint (pakfile, "%s/pak%d.pak", dir, i);
-		pak = COM_LoadPackFile (pakfile);
-		if (!pak)
-			break;
-		search = Hunk_Alloc(sizeof *search);
-		search->pack = pak;
-		search->next = com_searchpaths;
-		com_searchpaths = search;               
-	}
-
-//
-// add the contents of the parms.txt file to the end of the command line
-//
-
-}
-
-/*
-================
-COM_InitFilesystem
-================
-*/
-void COM_InitFilesystem (void)
-{
-	int             i, j;
-	char    basedir[MAX_OSPATH];
-	searchpath_t    *search;
-
-//
-// -basedir <path>
-// Overrides the system supplied base directory (under GAMENAME)
-//
-	i = COM_CheckParm ("-basedir");
-	if (i && i < com_argc-1)
-		strcpy (basedir, com_argv[i+1]);
-	else
-		strcpy (basedir, host_parms.basedir);
-
-	j = strlen (basedir);
-
-	if (j > 0)
-	{
-		if ((basedir[j-1] == '\\') || (basedir[j-1] == '/'))
-			basedir[j-1] = 0;
-	}
-
-//
-// -cachedir <path>
-// Overrides the system supplied cache directory (NULL or /qcache)
-// -cachedir - will disable caching.
-//
-	i = COM_CheckParm ("-cachedir");
-	if (i && i < com_argc-1)
-	{
-		if (com_argv[i+1][0] == '-')
-			com_cachedir[0] = 0;
-		else
-			strcpy (com_cachedir, com_argv[i+1]);
-	}
-	else if (host_parms.cachedir)
-		strcpy (com_cachedir, host_parms.cachedir);
-	else
-		com_cachedir[0] = 0;
-
-//
-// start up with GAMENAME by default (id1)
-//
-	COM_AddGameDirectory (va("%s/"GAMENAME, basedir) );
-
-	if (COM_CheckParm ("-rogue"))
-		COM_AddGameDirectory (va("%s/rogue", basedir) );
-	if (COM_CheckParm ("-hipnotic"))
-		COM_AddGameDirectory (va("%s/hipnotic", basedir) );
-
-//
-// -game <gamedir>
-// Adds basedir/gamedir as an override game
-//
-	i = COM_CheckParm ("-game");
-	if (i && i < com_argc-1)
-	{
-		com_modified = true;
-		COM_AddGameDirectory (va("%s/%s", basedir, com_argv[i+1]));
-	}
-
-//
-// -path <dir or packfile> [<dir or packfile>] ...
-// Fully specifies the exact serach path, overriding the generated one
-//
-	i = COM_CheckParm ("-path");
-	if (i)
-	{
-		com_modified = true;
-		com_searchpaths = nil;
-		while (++i < com_argc)
-		{
-			if (!com_argv[i] || com_argv[i][0] == '+' || com_argv[i][0] == '-')
-				break;
-			
-			search = Hunk_Alloc(sizeof *search);
-			if(strcmp(COM_FileExtension(com_argv[i]), "pak") == 0)
-			{
-				search->pack = COM_LoadPackFile (com_argv[i]);
-				if (!search->pack)
-					Sys_Error ("Couldn't load packfile: %s", com_argv[i]);
-			}
-			else
-				strcpy (search->filename, com_argv[i]);
-			search->next = com_searchpaths;
-			com_searchpaths = search;
-		}
-	}
-
-	if (COM_CheckParm ("-proghack"))
-		proghack = true;
 }
--- a/common.h
+++ b/common.h
@@ -1,20 +1,6 @@
-// comndef.h  -- general definitions
-
-#ifndef BYTE_DEFINED
-typedef unsigned char 		byte;
-#define BYTE_DEFINED 1
-#endif
-
-#undef true
-#undef false
-
-typedef enum {false, true}	qboolean;
-
-//============================================================================
-
 typedef struct sizebuf_s
 {
-	qboolean	allowoverflow;	// if false, do a Sys_Error
+	qboolean	allowoverflow;	// if false, do a fatal
 	qboolean	overflowed;		// set to true if the buffer size failed
 	byte	*data;
 	int		maxsize;
@@ -66,8 +52,6 @@
 
 //============================================================================
 
-extern	qboolean		bigendien;
-
 extern	short	(*BigShort) (short l);
 extern	short	(*LittleShort) (short l);
 extern	int	(*BigLong) (int l);
@@ -110,16 +94,11 @@
 
 extern	int		com_argc;
 extern	char	**com_argv;
+extern char com_cmdline[];
 
 int COM_CheckParm (char *parm);
-void COM_Init (char *path);
 void COM_InitArgv (int argc, char **argv);
 
-char *COM_SkipPath (char *pathname);
-void COM_StripExtension (char *in, char *out);
-void COM_FileBase (char *in, char *out);
-void COM_DefaultExtension (char *path, char *extension);
-
 char	*va(char *format, ...);
 // does a varargs printf into a temp buffer
 
@@ -126,22 +105,11 @@
 
 //============================================================================
 
-extern vlong com_filesize;
 struct cache_user_s;
 
-extern	char	com_gamedir[MAX_OSPATH];
+extern cvar_t registered;
+extern cvar_t cmdline;
 
-void COM_WriteFile (char *filename, void *data, int len);
-int COM_OpenFile (char *filename, int *hndl);
-int COM_FOpenFile (char *filename, FILE **file);
-void COM_CloseFile (int h);
-
-byte *COM_LoadStackFile (char *path, void *buffer, int bufsize);
-byte *COM_LoadTempFile (char *path);
-byte *COM_LoadHunkFile (char *path);
-void COM_LoadCacheFile (char *path, struct cache_user_s *cu);
-
-
-extern	struct cvar_s	registered;
-
 extern qboolean		standard_quake, rogue, hipnotic;
+
+#pragma varargck	argpos	va	1
--- a/console.h
+++ b/console.h
@@ -18,3 +18,5 @@
 void Con_DrawNotify (void);
 void Con_ClearNotify (void);
 void Con_ToggleConsole_f (void);
+
+#pragma varargck	argpos	Con_Printf	1
--- a/crc.c
+++ /dev/null
@@ -1,62 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <stdio.h>
-#include "quakedef.h"
-
-// this is a 16 bit, non-reflected CRC using the polynomial 0x1021
-// and the initial and final xor values shown below...  in other words, the
-// CCITT standard CRC used by XMODEM
-
-#define CRC_INIT_VALUE	0xffff
-#define CRC_XOR_VALUE	0x0000
-
-static unsigned short crctable[256] =
-{
-	0x0000,	0x1021,	0x2042,	0x3063,	0x4084,	0x50a5,	0x60c6,	0x70e7,
-	0x8108,	0x9129,	0xa14a,	0xb16b,	0xc18c,	0xd1ad,	0xe1ce,	0xf1ef,
-	0x1231,	0x0210,	0x3273,	0x2252,	0x52b5,	0x4294,	0x72f7,	0x62d6,
-	0x9339,	0x8318,	0xb37b,	0xa35a,	0xd3bd,	0xc39c,	0xf3ff,	0xe3de,
-	0x2462,	0x3443,	0x0420,	0x1401,	0x64e6,	0x74c7,	0x44a4,	0x5485,
-	0xa56a,	0xb54b,	0x8528,	0x9509,	0xe5ee,	0xf5cf,	0xc5ac,	0xd58d,
-	0x3653,	0x2672,	0x1611,	0x0630,	0x76d7,	0x66f6,	0x5695,	0x46b4,
-	0xb75b,	0xa77a,	0x9719,	0x8738,	0xf7df,	0xe7fe,	0xd79d,	0xc7bc,
-	0x48c4,	0x58e5,	0x6886,	0x78a7,	0x0840,	0x1861,	0x2802,	0x3823,
-	0xc9cc,	0xd9ed,	0xe98e,	0xf9af,	0x8948,	0x9969,	0xa90a,	0xb92b,
-	0x5af5,	0x4ad4,	0x7ab7,	0x6a96,	0x1a71,	0x0a50,	0x3a33,	0x2a12,
-	0xdbfd,	0xcbdc,	0xfbbf,	0xeb9e,	0x9b79,	0x8b58,	0xbb3b,	0xab1a,
-	0x6ca6,	0x7c87,	0x4ce4,	0x5cc5,	0x2c22,	0x3c03,	0x0c60,	0x1c41,
-	0xedae,	0xfd8f,	0xcdec,	0xddcd,	0xad2a,	0xbd0b,	0x8d68,	0x9d49,
-	0x7e97,	0x6eb6,	0x5ed5,	0x4ef4,	0x3e13,	0x2e32,	0x1e51,	0x0e70,
-	0xff9f,	0xefbe,	0xdfdd,	0xcffc,	0xbf1b,	0xaf3a,	0x9f59,	0x8f78,
-	0x9188,	0x81a9,	0xb1ca,	0xa1eb,	0xd10c,	0xc12d,	0xf14e,	0xe16f,
-	0x1080,	0x00a1,	0x30c2,	0x20e3,	0x5004,	0x4025,	0x7046,	0x6067,
-	0x83b9,	0x9398,	0xa3fb,	0xb3da,	0xc33d,	0xd31c,	0xe37f,	0xf35e,
-	0x02b1,	0x1290,	0x22f3,	0x32d2,	0x4235,	0x5214,	0x6277,	0x7256,
-	0xb5ea,	0xa5cb,	0x95a8,	0x8589,	0xf56e,	0xe54f,	0xd52c,	0xc50d,
-	0x34e2,	0x24c3,	0x14a0,	0x0481,	0x7466,	0x6447,	0x5424,	0x4405,
-	0xa7db,	0xb7fa,	0x8799,	0x97b8,	0xe75f,	0xf77e,	0xc71d,	0xd73c,
-	0x26d3,	0x36f2,	0x0691,	0x16b0,	0x6657,	0x7676,	0x4615,	0x5634,
-	0xd94c,	0xc96d,	0xf90e,	0xe92f,	0x99c8,	0x89e9,	0xb98a,	0xa9ab,
-	0x5844,	0x4865,	0x7806,	0x6827,	0x18c0,	0x08e1,	0x3882,	0x28a3,
-	0xcb7d,	0xdb5c,	0xeb3f,	0xfb1e,	0x8bf9,	0x9bd8,	0xabbb,	0xbb9a,
-	0x4a75,	0x5a54,	0x6a37,	0x7a16,	0x0af1,	0x1ad0,	0x2ab3,	0x3a92,
-	0xfd2e,	0xed0f,	0xdd6c,	0xcd4d,	0xbdaa,	0xad8b,	0x9de8,	0x8dc9,
-	0x7c26,	0x6c07,	0x5c64,	0x4c45,	0x3ca2,	0x2c83,	0x1ce0,	0x0cc1,
-	0xef1f,	0xff3e,	0xcf5d,	0xdf7c,	0xaf9b,	0xbfba,	0x8fd9,	0x9ff8,
-	0x6e17,	0x7e36,	0x4e55,	0x5e74,	0x2e93,	0x3eb2,	0x0ed1,	0x1ef0
-};
-
-void CRC_Init(unsigned short *crcvalue)
-{
-	*crcvalue = CRC_INIT_VALUE;
-}
-
-void CRC_ProcessByte(unsigned short *crcvalue, byte data)
-{
-	*crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data];
-}
-
-unsigned short CRC_Value(unsigned short crcvalue)
-{
-	return crcvalue ^ CRC_XOR_VALUE;
-}
--- a/crc.h
+++ /dev/null
@@ -1,3 +1,0 @@
-void CRC_Init(unsigned short *crcvalue);
-void CRC_ProcessByte(unsigned short *crcvalue, byte data);
-unsigned short CRC_Value(unsigned short crcvalue);
--- a/cvar.c
+++ b/cvar.c
@@ -79,54 +79,8 @@
 	return NULL;
 }
 
-
 /*
 ============
-Cvar_Set
-============
-*/
-void Cvar_Set (char *var_name, char *value)
-{
-	cvar_t	*var;
-	qboolean changed;
-	
-	var = Cvar_FindVar (var_name);
-	if (!var)
-	{	// there is an error in C code if this happens
-		Con_Printf ("Cvar_Set: variable %s not found\n", var_name);
-		return;
-	}
-
-	changed = strcmp(var->string, value);
-	
-	Z_Free (var->string);	// free the old value string
-	
-	var->string = Z_Malloc(strlen(value)+1);
-	strcpy(var->string, value);
-	var->value = atof(var->string);
-	if (var->server && changed)
-	{
-		if (sv.active)
-			SV_BroadcastPrintf ("\"%s\" changed to \"%s\"\n", var->name, var->string);
-	}
-}
-
-/*
-============
-Cvar_SetValue
-============
-*/
-void Cvar_SetValue (char *var_name, float value)
-{
-	char	val[32];
-	
-	sprint (val, "%f",value);
-	Cvar_Set (var_name, val);
-}
-
-
-/*
-============
 Cvar_RegisterVariable
 
 Adds a freestanding variable to the variable list.
@@ -184,7 +138,7 @@
 		return true;
 	}
 
-	Cvar_Set (v->name, Cmd_Argv(1));
+	setcvar (v->name, Cmd_Argv(1));
 	return true;
 }
 
@@ -206,3 +160,29 @@
 			fprintf (f, "%s \"%s\"\n", var->name, var->string);
 }
 
+void
+setcvar(char *k, char *v)
+{
+	int n;
+	cvar_t *cv;
+
+	cv = Cvar_FindVar(k);
+	if(cv == nil)
+		fatal("setcvar: no such cvar %s", k);
+	n = strcmp(cv->string, k);
+	Z_Free(cv->string);
+	cv->string = Z_Malloc(strlen(v)+1);
+	strcpy(cv->string, v);
+	cv->value = atof(v);
+	if(n && cv->server && sv.active)
+		SV_BroadcastPrintf("\"%s\" changed to \"%s\"\n", cv->name, cv->string);
+}
+
+void
+setcvarv(char *k, float v)
+{
+	char u[32];
+
+	sprint(u, "%f", v);
+	setcvar(k, u);
+}
--- a/cvar.h
+++ b/cvar.h
@@ -46,12 +46,6 @@
 // registers a cvar that allready has the name, string, and optionally the
 // archive elements set.
 
-void 	Cvar_Set (char *var_name, char *value);
-// equivelant to "<name> <variable>" typed at the console
-
-void	Cvar_SetValue (char *var_name, float value);
-// expands value to a string and calls Cvar_Set
-
 float	Cvar_VariableValue (char *var_name);
 // returns 0 if not defined or non numeric
 
--- a/d_iface.h
+++ b/d_iface.h
@@ -29,6 +29,7 @@
 	float		die;
 	ptype_t		type;
 } particle_t;
+extern particle_t	*active_particles, *free_particles;
 
 #define PARTICLE_Z_CLIP	8.0
 
--- a/d_surf.c
+++ b/d_surf.c
@@ -42,7 +42,7 @@
 	s = (byte *)sc_base + sc_size;
 	for (i=0 ; i<GUARDSIZE ; i++)
 		if (s[i] != (byte)i)
-			Sys_Error ("D_CheckCacheGuard: failed");
+			fatal ("D_CheckCacheGuard: failed");
 }
 
 void D_ClearCacheGuard (void)
@@ -115,15 +115,15 @@
 	qboolean                wrapped_this_time;
 
 	if ((width < 0) || (width > 256))
-		Sys_Error ("D_SCAlloc: bad cache width %d\n", width);
+		fatal ("D_SCAlloc: bad cache width %d\n", width);
 
 	if ((size <= 0) || (size > 0x10000))
-		Sys_Error ("D_SCAlloc: bad cache size %d\n", size);
+		fatal ("D_SCAlloc: bad cache size %zud\n", size);
 	
 	size = (uintptr)&((surfcache_t *)0)->data[size];
 	size = (size + 3) & ~3;
 	if (size > sc_size)
-		Sys_Error ("D_SCAlloc: %d > cache size",size);
+		fatal ("D_SCAlloc: %zud > cache size",size);
 
 // if there is not size bytes after the rover, reset to the start
 	wrapped_this_time = false;
@@ -147,7 +147,7 @@
 	// free another
 		sc_rover = sc_rover->next;
 		if (!sc_rover)
-			Sys_Error ("D_SCAlloc: hit the end of memory");
+			fatal ("D_SCAlloc: hit the end of memory");
 		if (sc_rover->owner)
 			*sc_rover->owner = nil;
 			
--- /dev/null
+++ b/dat.h
@@ -1,0 +1,8 @@
+enum{
+	Npath = 64,
+	Nfspath = 128,
+	Nmsg = 8000
+};
+
+extern char fsdir[];
+extern u16int crcn;
--- a/draw.c
+++ b/draw.c
@@ -25,7 +25,7 @@
 
 typedef struct cachepic_s
 {
-	char		name[MAX_QPATH];
+	char		name[Npath];
 	cache_user_t	cache;
 } cachepic_t;
 
@@ -57,7 +57,7 @@
 	if (i == menu_numcachepics)
 	{
 		if (menu_numcachepics == MAX_CACHED_PICS)
-			Sys_Error ("menu_numcachepics == MAX_CACHED_PICS");
+			fatal ("menu_numcachepics == MAX_CACHED_PICS");
 		menu_numcachepics++;
 		strcpy (pic->name, path);
 	}
@@ -70,13 +70,9 @@
 //
 // load the pic from disk
 //
-	COM_LoadCacheFile (path, &pic->cache);
-	
-	dat = (qpic_t *)pic->cache.data;
-	if (!dat)
-	{
-		Sys_Error ("Draw_CachePic: failed to load %s", path);
-	}
+	dat = loadcachelmp(path, &pic->cache);
+	if(dat == nil)
+		fatal("Draw_CachePic: failed to load %s: %r", path);
 
 	SwapPic (dat);
 
@@ -127,9 +123,9 @@
 
 #ifdef PARANOID
 	if (y > vid.height - 8 || x < 0 || x > vid.width - 8)
-		Sys_Error ("Con_DrawCharacter: (%d, %d)", x, y);
+		fatal ("Con_DrawCharacter: (%d, %d)", x, y);
 	if (num < 0 || num > 255)
-		Sys_Error ("Con_DrawCharacter: char %d", num);
+		fatal ("Con_DrawCharacter: char %d", num);
 #endif
 
 	row = num>>4;
@@ -277,7 +273,7 @@
 		(y < 0) ||
 		(y + pic->height > vid.height))
 	{
-		Sys_Error ("Draw_Pic: bad coordinates");
+		fatal ("Draw_Pic: bad coordinates");
 	}
 
 	source = pic->data;
@@ -326,7 +322,7 @@
 	if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 ||
 		 (unsigned)(y + pic->height) > vid.height)
 	{
-		Sys_Error ("Draw_TransPic: bad coordinates");
+		fatal ("Draw_TransPic: bad coordinates");
 	}
 		
 	source = pic->data;
@@ -413,7 +409,7 @@
 	if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 ||
 		 (unsigned)(y + pic->height) > vid.height)
 	{
-		Sys_Error ("Draw_TransPic: bad coordinates");
+		fatal ("Draw_TransPic: bad coordinates");
 	}
 		
 	source = pic->data;
--- /dev/null
+++ b/fns.h
@@ -1,0 +1,28 @@
+void	setcvar(char*, char*);
+void	setcvarv(char*, float);
+int	clmsg(void);
+void	abortdemo(void);
+void	stopdemo(void);
+void	recdemo(void);
+void	playdemo(void);
+void	timedemo(void);
+void*	loadhunklmp(char *, int *);
+void*	loadcachelmp(char *, cache_user_t *);
+void*	loadstklmp(char *, void *, int, int *);
+void	pointlmp(void);
+void	endlmp(void);
+int	rlmpmsg(void);
+void	wlmpmsg(void);
+int	reclmp(char*, int);
+int	demolmp(char*);
+void	crc(u8int);
+void	initcrc(void);
+void	ext(char*, char*);
+void	radix(char*, char*);
+void	unloadfs(void);
+void	initfs(void);
+void	dprint(char*, ...);
+void	fatal(char*, ...);
+
+#pragma	varargck	argpos	dprint	1
+#pragma varargck	argpos	fatal	1
--- /dev/null
+++ b/fs.c
@@ -1,0 +1,721 @@
+#include <u.h>
+#include <libc.h>
+#include <stdio.h>
+#include <bio.h>
+#include "quakedef.h"
+
+u16int crcn;
+char fsdir[Nfspath];
+
+typedef struct Lump Lump;
+typedef struct Pak Pak;
+typedef struct Paklist Paklist;
+
+enum{
+	Npakhdr = 4+4+4,
+	Npaksz = 56+4+4,
+	Npaklmp = 2048,
+	Npak0lmp = 339,
+	Npak0crc = 0x80d5,
+	Fhunk = 0,
+	Fcache,
+	Fstack
+};
+struct Lump{
+	char f[Npath];
+	int ofs;
+	int len;
+};
+struct Pak{
+	char f[Nfspath];
+	Biobuf *bf;
+	Lump *l;
+	Lump *e;
+};
+struct Paklist{
+	char f[Nfspath];
+	Pak *p;
+	Paklist *pl;
+};
+static Paklist *pkl;
+
+static u16int pop[] = {
+	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	0x0000, 0x0000, 0x6600, 0x0000, 0x0000, 0x0000, 0x6600, 0x0000,
+	0x0000, 0x0066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0067, 0x0000,
+	0x0000, 0x6665, 0x0000, 0x0000, 0x0000, 0x0000, 0x0065, 0x6600,
+	0x0063, 0x6561, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x6563,
+	0x0064, 0x6561, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x6564,
+	0x0064, 0x6564, 0x0000, 0x6469, 0x6969, 0x6400, 0x0064, 0x6564,
+	0x0063, 0x6568, 0x6200, 0x0064, 0x6864, 0x0000, 0x6268, 0x6563,
+	0x0000, 0x6567, 0x6963, 0x0064, 0x6764, 0x0063, 0x6967, 0x6500,
+	0x0000, 0x6266, 0x6769, 0x6a68, 0x6768, 0x6a69, 0x6766, 0x6200,
+	0x0000, 0x0062, 0x6566, 0x6666, 0x6666, 0x6666, 0x6562, 0x0000,
+	0x0000, 0x0000, 0x0062, 0x6364, 0x6664, 0x6362, 0x0000, 0x0000,
+	0x0000, 0x0000, 0x0000, 0x0062, 0x6662, 0x0000, 0x0000, 0x0000,
+	0x0000, 0x0000, 0x0000, 0x0061, 0x6661, 0x0000, 0x0000, 0x0000,
+	0x0000, 0x0000, 0x0000, 0x0000, 0x6500, 0x0000, 0x0000, 0x0000,
+	0x0000, 0x0000, 0x0000, 0x0000, 0x6400, 0x0000, 0x0000, 0x0000
+};
+
+/* this is a 16 bit, non-reflected CRC using the polynomial 0x1021 and the
+ * initial and final xor values shown below; in other words, the CCITT standard
+ * CRC used by XMODEM */
+enum{
+	Ncrc0 = 0xffff,
+	Nxor = 0
+};
+static u16int crct[] ={
+	0x0000,	0x1021,	0x2042,	0x3063,	0x4084,	0x50a5,	0x60c6,	0x70e7,
+	0x8108,	0x9129,	0xa14a,	0xb16b,	0xc18c,	0xd1ad,	0xe1ce,	0xf1ef,
+	0x1231,	0x0210,	0x3273,	0x2252,	0x52b5,	0x4294,	0x72f7,	0x62d6,
+	0x9339,	0x8318,	0xb37b,	0xa35a,	0xd3bd,	0xc39c,	0xf3ff,	0xe3de,
+	0x2462,	0x3443,	0x0420,	0x1401,	0x64e6,	0x74c7,	0x44a4,	0x5485,
+	0xa56a,	0xb54b,	0x8528,	0x9509,	0xe5ee,	0xf5cf,	0xc5ac,	0xd58d,
+	0x3653,	0x2672,	0x1611,	0x0630,	0x76d7,	0x66f6,	0x5695,	0x46b4,
+	0xb75b,	0xa77a,	0x9719,	0x8738,	0xf7df,	0xe7fe,	0xd79d,	0xc7bc,
+	0x48c4,	0x58e5,	0x6886,	0x78a7,	0x0840,	0x1861,	0x2802,	0x3823,
+	0xc9cc,	0xd9ed,	0xe98e,	0xf9af,	0x8948,	0x9969,	0xa90a,	0xb92b,
+	0x5af5,	0x4ad4,	0x7ab7,	0x6a96,	0x1a71,	0x0a50,	0x3a33,	0x2a12,
+	0xdbfd,	0xcbdc,	0xfbbf,	0xeb9e,	0x9b79,	0x8b58,	0xbb3b,	0xab1a,
+	0x6ca6,	0x7c87,	0x4ce4,	0x5cc5,	0x2c22,	0x3c03,	0x0c60,	0x1c41,
+	0xedae,	0xfd8f,	0xcdec,	0xddcd,	0xad2a,	0xbd0b,	0x8d68,	0x9d49,
+	0x7e97,	0x6eb6,	0x5ed5,	0x4ef4,	0x3e13,	0x2e32,	0x1e51,	0x0e70,
+	0xff9f,	0xefbe,	0xdfdd,	0xcffc,	0xbf1b,	0xaf3a,	0x9f59,	0x8f78,
+	0x9188,	0x81a9,	0xb1ca,	0xa1eb,	0xd10c,	0xc12d,	0xf14e,	0xe16f,
+	0x1080,	0x00a1,	0x30c2,	0x20e3,	0x5004,	0x4025,	0x7046,	0x6067,
+	0x83b9,	0x9398,	0xa3fb,	0xb3da,	0xc33d,	0xd31c,	0xe37f,	0xf35e,
+	0x02b1,	0x1290,	0x22f3,	0x32d2,	0x4235,	0x5214,	0x6277,	0x7256,
+	0xb5ea,	0xa5cb,	0x95a8,	0x8589,	0xf56e,	0xe54f,	0xd52c,	0xc50d,
+	0x34e2,	0x24c3,	0x14a0,	0x0481,	0x7466,	0x6447,	0x5424,	0x4405,
+	0xa7db,	0xb7fa,	0x8799,	0x97b8,	0xe75f,	0xf77e,	0xc71d,	0xd73c,
+	0x26d3,	0x36f2,	0x0691,	0x16b0,	0x6657,	0x7676,	0x4615,	0x5634,
+	0xd94c,	0xc96d,	0xf90e,	0xe92f,	0x99c8,	0x89e9,	0xb98a,	0xa9ab,
+	0x5844,	0x4865,	0x7806,	0x6827,	0x18c0,	0x08e1,	0x3882,	0x28a3,
+	0xcb7d,	0xdb5c,	0xeb3f,	0xfb1e,	0x8bf9,	0x9bd8,	0xabbb,	0xbb9a,
+	0x4a75,	0x5a54,	0x6a37,	0x7a16,	0x0af1,	0x1ad0,	0x2ab3,	0x3a92,
+	0xfd2e,	0xed0f,	0xdd6c,	0xcd4d,	0xbdaa,	0xad8b,	0x9de8,	0x8dc9,
+	0x7c26,	0x6c07,	0x5c64,	0x4c45,	0x3ca2,	0x2c83,	0x1ce0,	0x0cc1,
+	0xef1f,	0xff3e,	0xcf5d,	0xdf7c,	0xaf9b,	0xbfba,	0x8fd9,	0x9ff8,
+	0x6e17,	0x7e36,	0x4e55,	0x5e74,	0x2e93,	0x3eb2,	0x0ed1,	0x1ef0
+};
+static int notid1;
+
+static int loadsize;
+static uchar *loadbuf;
+static cache_user_t *loadcache;
+
+static Biobuf *demobf;
+static vlong demoofs;
+
+#define	GBIT32(p)	((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
+#define	PBIT32(p,v)	(p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
+
+static Biobuf *
+bopen(char *f, int m, int arm)
+{
+	Biobuf *bf;
+
+	bf = Bopen(f, m);
+	if(bf == nil)
+		return nil;
+	if(arm)
+		Blethal(bf, nil);
+	return bf;
+}
+
+static long
+eread(Biobuf *bf, void *u, long n)
+{
+	if(Bread(bf, u, n) != n)
+		fatal("eread: short read: %r");
+	return n;
+}
+
+static u8int
+get8(Biobuf *bf)
+{
+	u8int v;
+
+	eread(bf, &v, 1);
+	return v;
+}
+
+static u16int
+get16(Biobuf *bf)
+{
+	u16int v;
+
+	v = get8(bf);
+	return v | get8(bf) << 8;
+}
+
+static u32int
+get32(Biobuf *bf)
+{
+	u32int v;
+
+	v = get16(bf);
+	return v | get16(bf) << 16;
+}
+
+static float
+getfl(Biobuf *bf)
+{
+	union{
+		float v;
+		u32int u;
+	} u;
+
+	u.u = get32(bf);
+	return u.v;
+}
+
+static u16int
+get16b(Biobuf *bf)
+{
+	u16int v;
+
+	v = get8(bf);
+	return v << 8 | get8(bf);
+}
+
+static u32int
+get32b(Biobuf *bf)
+{
+	u32int v;
+
+	v = get16(bf);
+	return v << 16 | get16(bf);
+}
+
+static void
+ewrite(Biobuf *bf, void *u, long n)
+{
+	if(Bwrite(bf, u, n) != n)
+		fatal("eread: short write: %r");
+}
+
+static void
+put32(Biobuf *bf, u32int v)
+{
+	uchar u[4];
+
+	PBIT32(u, v);
+	ewrite(bf, u, 4);
+}
+
+static void
+putfl(Biobuf *bf, float v)
+{
+	union{
+		float v;
+		u32int u;
+	} w;
+
+	w.v = v;
+	put32(bf, w.u);
+}
+
+static vlong
+bsize(Biobuf *bf)
+{
+	vlong n;
+	Dir *d;
+
+	d = dirfstat(Bfildes(bf));
+	if(d == nil)
+		sysfatal("bstat: %r");
+	n = d->length;
+	free(d);
+	return n;
+}
+
+static Pak *
+pak(char *f)
+{
+	int n, ofs, len, nlmp;
+	uchar u[8];
+	Biobuf *bf;
+	Lump *l;
+	Pak *p;
+
+	bf = bopen(f, OREAD, 1);
+	if(bf == nil)
+		return nil;
+	memset(u, 0, sizeof u);
+	eread(bf, u, 4);
+	if(memcmp(u, "PACK", 4) != 0)
+		fatal("pak %s: invalid pak file", f);
+	ofs = get32(bf);
+	len = get32(bf);
+	nlmp = len / Npaksz;
+	if(nlmp > Npaklmp)
+		fatal("pak %s: invalid lump number %d", f, nlmp);
+	if(nlmp != Npak0lmp)
+		notid1 = 1;
+	l = Hunk_AllocName(nlmp * sizeof *l, "pak");
+	p = Hunk_Alloc(sizeof *p);
+	strncpy(p->f, f, sizeof(p->f)-1);
+	p->bf = bf;
+	p->l = l;
+	p->e = l + nlmp;
+	Bseek(bf, ofs, 0);
+	initcrc();
+	while(l < p->e){
+		eread(bf, l->f, 56);
+		for(n=0; n<56; n++)
+			crc(l->f[n]);
+		eread(bf, u, 8);
+		for(n=0; n<8; n++)
+			crc(u[n]);
+		l->ofs = GBIT32(u);
+		l->len = GBIT32(u+4);
+		l++;
+	}
+	if(crcn != Npak0crc)
+		notid1 = 1;
+	return p;
+}
+
+static void
+pakdir(char *d)
+{
+	int n;
+	char f[Nfspath];
+	Paklist *pl;
+	Pak *p;
+
+	strncpy(fsdir, d, sizeof(fsdir)-1);
+	pl = Hunk_Alloc(sizeof *pl);
+	strncpy(pl->f, d, sizeof(pl->f)-1);
+	pl->pl = pkl;
+	pkl = pl;
+	for(n=0; ; n++){
+		snprint(f, sizeof f, "%s/pak%d.pak", d, n);
+		p = pak(f);
+		if(p == nil){
+			dprint("pakdir: can't open %s: %r", f);
+			break;
+		}
+		pl = Hunk_Alloc(sizeof *pl);
+		pl->p = p;
+		pl->pl = pkl;
+		pkl = pl;       
+	}
+}
+
+static void
+initns(void)
+{
+	int i;
+	char d[Nfspath], *e;
+
+	memset(d, 0, sizeof d);
+	i = COM_CheckParm("-basedir");
+	if(i != 0 && i < com_argc - 1)
+		strncpy(d, com_argv[i+1], sizeof(d)-1);
+	else
+		strncpy(d, host_parms.basedir, sizeof(d)-1);
+	e = d + strlen(d) - 1;
+	if(e > d && *e == '/')
+		*e = 0;
+	pakdir(va("%s%s", d, "/id1"));
+	if(COM_CheckParm("-rogue"))
+		pakdir(va("%s%s", d, "/rogue"));
+	if(COM_CheckParm("-hipnotic"))
+		pakdir(va("%s%s", d, "/hipnotic"));
+	i = COM_CheckParm("-game");
+	if(i != 0 && i < com_argc - 1){
+		notid1 = 1;
+		pakdir(va("%s/%s", d, com_argv[i+1]));
+	}
+}
+
+static Biobuf *
+openlmp(char *f, int *len)
+{
+	char d[Nfspath];
+	Biobuf *bf;
+	Paklist *pl;
+	Pak *p;
+	Lump *l;
+
+	for(pl=pkl; pl != nil; pl=pl->pl){
+		if(pl->p != nil){
+			p = pl->p;
+			l = p->l;
+			while(l < p->e){
+				if(strcmp(l->f, f) == 0){
+					Bseek(p->bf, l->ofs, 0);
+					if(len != nil)
+						*len = l->len;
+					return p->bf;
+				}
+				l++;
+			}
+			continue;
+		}
+		snprint(d, sizeof d, "%s/%s", pl->f, f);
+		if(access(d, AREAD) < 0)
+			continue;
+		bf = bopen(d, OREAD, 1);
+		if(bf == nil)
+			return nil;
+		if(len != nil)
+			*len = bsize(bf);
+		return bf;
+	}
+	werrstr("openlmp %s: not found", f);
+	return nil;
+}
+
+static void
+closelmp(Biobuf *bf)
+{
+	Paklist *pl;
+
+	for(pl=pkl; pl!=nil; pl=pl->pl)
+		if(pl->p && pl->p->bf == bf)
+			return;
+	Bterm(bf);
+}
+
+static uchar *
+loadlmp(char *f, int mth, int *n)
+{
+	int m;
+	char r[32];
+	uchar *buf;
+	Biobuf *bf;
+
+	bf = openlmp(f, &m);
+	if(bf == nil)
+		return nil;
+	radix(f, r);
+	buf = nil;
+	switch(mth){
+	case Fhunk: buf = Hunk_AllocName(m + 1, r); break;
+	case Fcache: buf = Cache_Alloc(loadcache, m + 1, r); break;
+	case Fstack: buf = m+1 <= loadsize ? loadbuf : Hunk_TempAlloc(m+1);
+	}
+	if(buf == nil)
+		fatal("loadlmp %s %d: memory allocation failed: %r", f, m+1);
+	buf[m] = 0;
+	Draw_BeginDisc();
+	eread(bf, buf, m);
+	closelmp(bf);
+	Draw_EndDisc();
+	if(n != nil)
+		*n = m;
+	return buf;
+}
+
+static void
+path(void)
+{
+	Paklist *pl;
+
+	for(pl=pkl; pl!=nil; pl=pl->pl)
+		if(pl->p)
+			Con_Printf("%s (%zd files)\n", pl->p->f, pl->p->e - pl->p->l);
+		else
+			Con_Printf("%s\n", pl->f);
+}
+
+static void
+chkreg(void)
+{
+	u16int *p;
+	Biobuf *bf;
+
+	Cvar_RegisterVariable(&registered);
+	bf = openlmp("gfx/pop.lmp", nil);
+	if(bf == nil){
+		dprint("chkreg: shareware version");
+		if(notid1)
+			fatal("chkreg: phase error -- %r");
+		return;
+	}
+	p = pop;
+	while(p < pop + nelem(pop))
+		if(*p++ != get16b(bf))
+			fatal("chkreg: corrupted pop lump");
+	closelmp(bf);
+	setcvar("registered", "1");
+	dprint("chkreg: registered version");
+}
+
+void *
+loadhunklmp(char *f, int *n)
+{
+	return loadlmp(f, Fhunk, n);
+}
+
+void *
+loadcachelmp(char *f, cache_user_t *c)
+{
+	loadcache = c;
+	loadlmp(f, Fcache, nil);
+	return c->data;
+}
+
+void *
+loadstklmp(char *f, void *buf, int nbuf, int *n)
+{
+	loadbuf = buf;
+	loadsize = nbuf;
+	return loadlmp(f, Fstack, n);
+}
+
+void
+pointlmp(void)
+{
+	int i, n, nv;
+	char f[Nfspath];
+	Biobuf *bf;
+	vec3_t v3;
+	vec_t *v;
+	particle_t *p;
+
+	snprint(f, sizeof f, "maps/%s.pts", sv.name);
+	bf = openlmp(f, &n);
+	if(bf == nil){
+		Con_Printf("pointlmp: can't open %s: %r\n", f);
+		return;
+	}
+	nv = 0;
+	for(;;){
+		if(n < 3*4+3)
+			break;
+		for(i=0, v=v3; i<3; i++){
+			*v++ = getfl(bf);
+			Bseek(bf, 1, 1);
+		}
+		n -= 3*4+3;
+		nv++;
+		if(free_particles == nil){
+			Con_Printf("pointlmp: insufficient free particles\n");
+			break;
+		}
+		p = free_particles;
+		free_particles = p->next;
+		p->next = active_particles;
+		active_particles = p;
+		p->die = 99999;
+		p->color = -nv & 15;
+		p->type = pt_static;
+		VectorCopy(vec3_origin, p->vel);
+		VectorCopy(v3, p->org);
+	}
+	closelmp(bf);
+	Con_Printf("pointlmp: %d points read\n", nv);
+}
+
+void
+endlmp(void)
+{
+	closelmp(demobf);
+	demobf = nil;
+}
+
+int
+rlmpmsg(void)
+{
+	int n;
+	vec_t *f;
+
+	Bseek(demobf, demoofs, 0);
+	net_message.cursize = get32(demobf);
+	VectorCopy(cl.mviewangles[0], cl.mviewangles[1]);
+	for(n=0, f=cl.mviewangles[0]; n<3; n++)
+		*f++ = getfl(demobf);
+	if(net_message.cursize > Nmsg)
+		fatal("rlmpmsg: invalid message size %d\n", net_message.cursize);
+	n = Bread(demobf, net_message.data, net_message.cursize);
+	demoofs = Bseek(demobf, 0, 1);
+	if(n < 0)
+		dprint("rlmpmsg: bad read: %r");
+	if(n != net_message.cursize){
+		dprint("rlmpmsg: short read: %r");
+		n = -1;
+	}
+	return n;
+}
+
+void
+wlmpmsg(void)
+{
+	int i;
+
+	put32(demobf, net_message.cursize);
+	for(i=0; i<3; i++)
+		putfl(demobf, cl.viewangles[i]);
+	ewrite(demobf, net_message.data, net_message.cursize);
+}
+
+int
+reclmp(char *f, int trk)
+{
+	char s[16];
+
+	demobf = bopen(f, OWRITE, 0);
+	if(demobf == nil)
+		return -1;
+	sprint(s, "%d\n", trk);
+	ewrite(demobf, s, strlen(s));
+	return 0;
+}
+
+demolmp(char *f)
+{
+	int n;
+	char *s;
+
+	demobf = openlmp(f, &n);
+	if(demobf == nil)
+		return -1;
+	s = Brdline(demobf, '\n');
+	n = Blinelen(demobf) - 1;
+	if(s == nil || n < 0 || n > 11){
+		dprint("demolmp: invalid trk field");
+		closelmp(demobf);
+		return -1;
+	}
+	demoofs = Bseek(demobf, 0, 1);
+	s[n] = 0;
+	cls.forcetrack =  strtol(s, nil, 10);
+	return 0;
+}
+
+void
+crc(u8int v)
+{
+	crcn = crcn << 8 ^ crct[crcn >> 8 ^ v];
+}
+
+void
+initcrc(void)
+{
+	crcn = Ncrc0;
+}
+
+void
+ext(char *f, char *e)
+{
+	char *s, *d;
+
+	s = strrchr(f, '/');
+	d = strrchr(f, '.');
+	if(d > s)
+		return;
+	strcat(f, e);
+}
+
+void
+radix(char *f, char *d)
+{
+	char *s, *e;
+
+	s = strrchr(f, '/');
+	e = strrchr(f, '.');
+	if(s == nil)
+		s = f;
+	s++;
+	if(e - s < 1)
+		strcpy(d, "?model?");
+	else{
+		strncpy(d, s, e - s);
+		d[e - s] = 0;
+	}
+}
+
+void
+unloadfs(void)
+{
+	Paklist *pl;
+
+	for(pl=pkl; pl!=nil; pl=pl->pl)
+		if(pl->p != nil)
+			Bterm(pl->p->bf);
+}
+
+/* TODO: nuke these from orbit */
+static short
+ShortSwap(short l)
+{
+	byte    b1,b2;
+
+	b1 = l&255;
+	b2 = (l>>8)&255;
+	return (b1<<8) + b2;
+}
+static short
+ShortNoSwap(short l)
+{
+	return l;
+}
+static int
+LongSwap(int l)
+{
+	byte    b1,b2,b3,b4;
+
+	b1 = l&255;
+	b2 = (l>>8)&255;
+	b3 = (l>>16)&255;
+	b4 = (l>>24)&255;
+	return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
+}
+static int
+LongNoSwap(int l)
+{
+	return l;
+}
+static float
+FloatSwap(float f)
+{
+	union{
+		float   f;
+		byte    b[4];
+	} dat1, dat2;
+
+	dat1.f = f;
+	dat2.b[0] = dat1.b[3];
+	dat2.b[1] = dat1.b[2];
+	dat2.b[2] = dat1.b[1];
+	dat2.b[3] = dat1.b[0];
+	return dat2.f;
+}
+static float
+FloatNoSwap(float f)
+{
+	return f;
+}
+
+void
+initfs(void)
+{
+	byte swaptest[2] = {1,0};
+
+	if(*(short *)swaptest == 1)
+	{
+		BigShort = ShortSwap;
+		LittleShort = ShortNoSwap;
+		BigLong = LongSwap;
+		LittleLong = LongNoSwap;
+		BigFloat = FloatSwap;
+		LittleFloat = FloatNoSwap;
+	}else{
+		BigShort = ShortNoSwap;
+		LittleShort = ShortSwap;
+		BigLong = LongNoSwap;
+		LittleLong = LongSwap;
+		BigFloat = FloatNoSwap;
+		LittleFloat = FloatSwap;
+	}
+	initns();
+	chkreg();
+	Cmd_AddCommand("path", path);
+	Cvar_RegisterVariable(&cmdline);
+	setcvar("cmdline", com_cmdline);
+}
--- a/host.c
+++ b/host.c
@@ -78,7 +78,7 @@
 	if(sv.active)
 		Host_ShutdownServer(false);
 	if(cls.state == ca_dedicated)
-		Sys_Error("Host_EndGame: %s\n", s);	// dedicated servers exit
+		fatal("Host_EndGame: %s\n", s);	// dedicated servers exit
 	if(cls.demonum != -1)
 		CL_NextDemo();
 	else
@@ -101,7 +101,7 @@
 	static qboolean inerror = false;
 	
 	if(inerror)
-		Sys_Error("Host_Error: recursively entered");
+		fatal("Host_Error: recursively entered");
 	inerror = true;
 	
 	SCR_EndLoadingPlaque();	// reenable screen updates
@@ -115,7 +115,7 @@
 	if(sv.active)
 		Host_ShutdownServer(false);
 	if(cls.state == ca_dedicated)
-		Sys_Error("Host_Error: %s\n", s);	// dedicated servers exit
+		fatal("Host_Error: %s\n", s);	// dedicated servers exit
 	CL_Disconnect();
 	cls.demonum = -1;
 
@@ -151,7 +151,7 @@
 	if (i)
 	{
 		if (cls.state == ca_dedicated)
-			Sys_Error ("Only one of -dedicated or -listen can be specified");
+			fatal ("Only one of -dedicated or -listen can be specified");
 		if (i != (com_argc - 1))
 			svs.maxclients = atoi(com_argv[i+1]);
 		else
@@ -168,9 +168,9 @@
 	svs.clients = Hunk_AllocName(svs.maxclientslimit * sizeof *svs.clients, "clients");
 
 	if (svs.maxclients > 1)
-		Cvar_SetValue ("deathmatch", 1.0);
+		setcvarv ("deathmatch", 1.0);
 	else
-		Cvar_SetValue ("deathmatch", 0.0);
+		setcvarv ("deathmatch", 0.0);
 }
 
 
@@ -223,7 +223,7 @@
 // config.cfg cvars
 	if (host_initialized & !isDedicated)
 	{
-		f = fopen (va("%s/config.cfg",com_gamedir), "w");
+		f = fopen (va("%s/config.cfg",fsdir), "w");
 		if (!f)
 		{
 			Con_Printf ("Couldn't write config.cfg.\n");
@@ -703,7 +703,7 @@
 	host_parms = *parms;
 
 	if (parms->memsize < minimum_memory)
-		Sys_Error ("Only %4.1f megs of memory available, can't execute game", parms->memsize / (float)0x100000);
+		fatal ("Only %4.1f megs of memory available, can't execute game", parms->memsize / (float)0x100000);
 
 	com_argc = parms->argc;
 	com_argv = parms->argv;
@@ -713,7 +713,7 @@
 	Cmd_Init ();	
 	V_Init ();
 	Chase_Init ();
-	COM_Init (parms->basedir);
+	initfs();
 	Host_InitLocal ();
 	W_LoadWadFile ("gfx.wad");
 	Key_Init ();
@@ -731,12 +731,12 @@
  
 	if (cls.state != ca_dedicated)
 	{
-		host_basepal = (byte *)COM_LoadHunkFile ("gfx/palette.lmp");
-		if (!host_basepal)
-			Sys_Error ("Couldn't load gfx/palette.lmp");
-		host_colormap = (byte *)COM_LoadHunkFile ("gfx/colormap.lmp");
-		if (!host_colormap)
-			Sys_Error ("Couldn't load gfx/colormap.lmp");
+		host_basepal = loadhunklmp("gfx/palette.lmp", nil);
+		if(host_basepal == nil)
+			fatal("Host_Init: failed to load gfx/palette.lmp: %r");
+		host_colormap = loadhunklmp("gfx/colormap.lmp", nil);
+		if(host_colormap == nil)
+			fatal("Host_Init: failed to load gfx/colormap.lmp: %r");
 
 		VID_Init (host_basepal);
 
@@ -763,7 +763,7 @@
 ===============
 Host_Shutdown
 
-FIXME: this is a callback from Sys_Quit and Sys_Error.  It would be better
+FIXME: this is a callback from Sys_Quit and fatal.  It would be better
 to run quit through here before the final handoff to the sys code.
 ===============
 */
@@ -787,6 +787,7 @@
 	NET_Shutdown ();
 	S_Shutdown();
 	IN_Shutdown ();
+	unloadfs();
 
 	if (cls.state != ca_dedicated)
 	{
--- a/host_cmd.c
+++ b/host_cmd.c
@@ -239,7 +239,7 @@
 void Host_Map_f (void)
 {
 	int		i;
-	char	name[MAX_QPATH];
+	char	name[Npath];
 
 	if (cmd_source != src_command)
 		return;
@@ -289,7 +289,7 @@
 */
 void Host_Changelevel_f (void)
 {
-	char	level[MAX_QPATH];
+	char	level[Npath];
 
 	if (Cmd_Argc() != 2)
 	{
@@ -315,7 +315,7 @@
 */
 void Host_Restart_f (void)
 {
-	char	mapname[MAX_QPATH];
+	char	mapname[Npath];
 
 	if (cls.demoplayback || !sv.active)
 		return;
@@ -350,12 +350,12 @@
 */
 void Host_Connect_f (void)
 {
-	char	name[MAX_QPATH];
+	char	name[Npath];
 	
 	cls.demonum = -1;		// stop demo loop in case this fails
 	if (cls.demoplayback)
 	{
-		CL_StopPlayback ();
+		abortdemo ();
 		CL_Disconnect ();
 	}
 	strcpy (name, Cmd_Argv(1));
@@ -453,9 +453,9 @@
 		}
 	}
 
-	sprint (name, "%s/%s", com_gamedir, Cmd_Argv(1));
-	COM_DefaultExtension (name, ".sav");
-	
+	sprint (name, "%s/%s", fsdir, Cmd_Argv(1));
+	ext(name, ".sav");
+
 	Con_Printf ("Saving game to %s...\n", name);
 	f = fopen (name, "w");
 	if (!f)
@@ -502,9 +502,9 @@
 */
 void Host_Loadgame_f (void)
 {
-	char	name[MAX_OSPATH];
+	char	name[Nfspath];
 	FILE	*f;
-	char	mapname[MAX_QPATH];
+	char	mapname[Npath];
 	float	time, tfloat;
 	char	str[32768], *start;
 	int		i, r;
@@ -524,9 +524,9 @@
 
 	cls.demonum = -1;		// stop demo loop in case this fails
 
-	sprint (name, "%s/%s", com_gamedir, Cmd_Argv(1));
-	COM_DefaultExtension (name, ".sav");
-	
+	sprint (name, "%s/%s", fsdir, Cmd_Argv(1));
+	ext(name, ".sav");
+
 // we can't call SCR_BeginLoadingPlaque, because too much stack space has
 // been used.  The menu calls it before stuffing loadgame command
 //	SCR_BeginLoadingPlaque ();
@@ -552,7 +552,7 @@
 // this silliness is so we can load 1.06 save files, which have float skill values
 	fscanf (f, "%f\n", &tfloat);
 	current_skill = (int)(tfloat + 0.1);
-	Cvar_SetValue ("skill", (float)current_skill);
+	setcvarv ("skill", (float)current_skill);
 
 	fscanf (f, "%s\n",mapname);
 	fscanf (f, "%f\n",&time);
@@ -594,13 +594,13 @@
 			}
 		}
 		if (i == sizeof(str)-1)
-			Sys_Error ("Loadgame buffer overflow");
+			fatal ("Loadgame buffer overflow");
 		str[i] = 0;
 		start = COM_Parse(str);
 		if (!com_token[0])
 			break;		// end of file
 		if(strcmp(com_token, "{") != 0)
-			Sys_Error ("First token isn't a brace");
+			fatal ("First token isn't a brace");
 			
 		if (entnum == -1)
 		{	// parse the global vars
@@ -664,7 +664,7 @@
 	{
 		if(strcmp(cl_name.string, newName) == 0)
 			return;
-		Cvar_Set ("_cl_name", newName);
+		setcvar ("_cl_name", newName);
 		if (cls.state == ca_connected)
 			Cmd_ForwardToServer ();
 		return;
@@ -907,7 +907,7 @@
 
 	if (cmd_source == src_command)
 	{
-		Cvar_SetValue ("_cl_color", playercolor);
+		setcvarv ("_cl_color", playercolor);
 		if (cls.state == ca_connected)
 			Cmd_ForwardToServer ();
 		return;
@@ -1604,7 +1604,7 @@
 		return;
 	if (!cls.demoplayback)
 		return;
-	CL_StopPlayback ();
+	abortdemo ();
 	CL_Disconnect ();
 }
 
--- a/keys.c
+++ b/keys.c
@@ -618,7 +618,7 @@
 			M_ToggleMenu_f ();
 			break;
 		default:
-			Sys_Error ("Bad key_dest");
+			fatal ("Bad key_dest");
 		}
 		return;
 	}
@@ -705,7 +705,7 @@
 		Key_Console (key);
 		break;
 	default:
-		Sys_Error ("Bad key_dest");
+		fatal ("Bad key_dest");
 	}
 }
 
--- a/mathlib.c
+++ b/mathlib.c
@@ -5,8 +5,6 @@
 #include <stdio.h>
 #include "quakedef.h"
 
-void Sys_Error (char *error, ...);
-
 vec3_t vec3_origin = {0,0,0};
 int nanmask = 255<<23;
 
@@ -146,7 +144,7 @@
 */
 void BOPS_Error (void)
 {
-	Sys_Error ("BoxOnPlaneSide:  Bad signbits");
+	fatal ("BoxOnPlaneSide:  Bad signbits");
 }
 
 
@@ -251,7 +249,7 @@
 
 #ifdef PARANOID
 if (sides == 0)
-	Sys_Error ("BoxOnPlaneSide: sides==0");
+	fatal ("BoxOnPlaneSide: sides==0");
 #endif
 
 	return sides;
@@ -464,9 +462,9 @@
 
 #ifdef PARANOID
 	if (denom <= 0.0)
-		Sys_Error ("FloorDivMod: bad denominator %d\n", denom);
+		fatal ("FloorDivMod: bad denominator %d\n", denom);
 	if (floor(numer) != numer || floor(denom) != denom)
-		Sys_Error ("FloorDivMod: non-integer numer or denom %f %f\n", numer, denom);
+		fatal ("FloorDivMod: non-integer numer or denom %f %f\n", numer, denom);
 #endif
 
 	if (numer >= 0.0)
--- a/menu.c
+++ b/menu.c
@@ -420,7 +420,7 @@
 void M_ScanSaves (void)
 {
 	int		i, j;
-	char	name[MAX_OSPATH];
+	char	name[Nfspath];
 	FILE	*f;
 	int		version;
 
@@ -428,7 +428,7 @@
 	{
 		strcpy (m_filenames[i], "--- UNUSED SLOT ---");
 		loadable[i] = false;
-		sprint (name, "%s/s%d.sav", com_gamedir, i);
+		sprint (name, "%s/s%d.sav", fsdir, i);
 		f = fopen (name, "r");
 		if (!f)
 			continue;
@@ -771,7 +771,7 @@
 		if(strcmp(cl_name.string, setup_myname) != 0)
 			Cbuf_AddText ( va ("name \"%s\"\n", setup_myname) );
 		if(strcmp(hostname.string, setup_hostname) != 0)
-			Cvar_Set("hostname", setup_hostname);
+			setcvar("hostname", setup_hostname);
 		if(setup_top != setup_oldtop || setup_bottom != setup_oldbottom)
 			Cbuf_AddText(va("color %d %d\n", setup_top, setup_bottom));
 		m_entersound = true;
@@ -1020,7 +1020,7 @@
 			scr_viewsize.value = 30;
 		if (scr_viewsize.value > 120)
 			scr_viewsize.value = 120;
-		Cvar_SetValue ("viewsize", scr_viewsize.value);
+		setcvarv ("viewsize", scr_viewsize.value);
 		break;
 	case 4:	// gamma
 		v_gamma.value -= dir * 0.05;
@@ -1028,7 +1028,7 @@
 			v_gamma.value = 0.5;
 		if (v_gamma.value > 1)
 			v_gamma.value = 1;
-		Cvar_SetValue ("gamma", v_gamma.value);
+		setcvarv ("gamma", v_gamma.value);
 		break;
 	case 5:	// mouse speed
 		sensitivity.value += dir * 0.5;
@@ -1036,7 +1036,7 @@
 			sensitivity.value = 1;
 		if (sensitivity.value > 11)
 			sensitivity.value = 11;
-		Cvar_SetValue ("sensitivity", sensitivity.value);
+		setcvarv ("sensitivity", sensitivity.value);
 		break;
 	case 6:	// music volume
 		bgmvolume.value += dir * 0.1;
@@ -1044,7 +1044,7 @@
 			bgmvolume.value = 0;
 		if (bgmvolume.value > 1)
 			bgmvolume.value = 1;
-		Cvar_SetValue ("bgmvolume", bgmvolume.value);
+		setcvarv ("bgmvolume", bgmvolume.value);
 		break;
 	case 7:	// sfx volume
 		volume.value += dir * 0.1;
@@ -1052,32 +1052,32 @@
 			volume.value = 0;
 		if (volume.value > 1)
 			volume.value = 1;
-		Cvar_SetValue ("volume", volume.value);
+		setcvarv ("volume", volume.value);
 		break;
 
 	case 8:	// allways run
 		if (cl_forwardspeed.value > 200)
 		{
-			Cvar_SetValue ("cl_forwardspeed", 200);
-			Cvar_SetValue ("cl_backspeed", 200);
+			setcvarv ("cl_forwardspeed", 200);
+			setcvarv ("cl_backspeed", 200);
 		}
 		else
 		{
-			Cvar_SetValue ("cl_forwardspeed", 400);
-			Cvar_SetValue ("cl_backspeed", 400);
+			setcvarv ("cl_forwardspeed", 400);
+			setcvarv ("cl_backspeed", 400);
 		}
 		break;
 
 	case 9:	// invert mouse
-		Cvar_SetValue ("m_pitch", -m_pitch.value);
+		setcvarv ("m_pitch", -m_pitch.value);
 		break;
 
 	case 10:	// lookspring
-		Cvar_SetValue ("lookspring", !lookspring.value);
+		setcvarv ("lookspring", !lookspring.value);
 		break;
 
 	case 11:	// lookstrafe
-		Cvar_SetValue ("lookstrafe", !lookstrafe.value);
+		setcvarv ("lookstrafe", !lookstrafe.value);
 		break;
 	}
 }
@@ -2572,7 +2572,7 @@
 		break;
 
 	case 2:
-		Cvar_SetValue ("coop", coop.value ? 0 : 1);
+		setcvarv ("coop", coop.value ? 0 : 1);
 		break;
 
 	case 3:
@@ -2581,35 +2581,35 @@
 		else
 			count = 2;
 
-		Cvar_SetValue ("teamplay", teamplay.value + dir);
+		setcvarv ("teamplay", teamplay.value + dir);
 		if (teamplay.value > count)
-			Cvar_SetValue ("teamplay", 0);
+			setcvarv ("teamplay", 0);
 		else if (teamplay.value < 0)
-			Cvar_SetValue ("teamplay", count);
+			setcvarv ("teamplay", count);
 		break;
 
 	case 4:
-		Cvar_SetValue ("skill", skill.value + dir);
+		setcvarv ("skill", skill.value + dir);
 		if (skill.value > 3)
-			Cvar_SetValue ("skill", 0);
+			setcvarv ("skill", 0);
 		if (skill.value < 0)
-			Cvar_SetValue ("skill", 3);
+			setcvarv ("skill", 3);
 		break;
 
 	case 5:
-		Cvar_SetValue ("fraglimit", fraglimit.value + dir*10);
+		setcvarv ("fraglimit", fraglimit.value + dir*10);
 		if (fraglimit.value > 100)
-			Cvar_SetValue ("fraglimit", 0);
+			setcvarv ("fraglimit", 0);
 		if (fraglimit.value < 0)
-			Cvar_SetValue ("fraglimit", 100);
+			setcvarv ("fraglimit", 100);
 		break;
 
 	case 6:
-		Cvar_SetValue ("timelimit", timelimit.value + dir*5);
+		setcvarv ("timelimit", timelimit.value + dir*5);
 		if (timelimit.value > 60)
-			Cvar_SetValue ("timelimit", 0);
+			setcvarv ("timelimit", 0);
 		if (timelimit.value < 0)
-			Cvar_SetValue ("timelimit", 60);
+			setcvarv ("timelimit", 60);
 		break;
 
 	case 7:
--- a/mkfile
+++ b/mkfile
@@ -13,7 +13,6 @@
 	cmd.$O\
 	common.$O\
 	console.$O\
-	crc.$O\
 	cvar.$O\
 	draw.$O\
 	d_edge.$O\
@@ -28,6 +27,7 @@
 	d_surf.$O\
 	d_vars.$O\
 	d_zpoint.$O\
+	fs.$O\
 	host.$O\
 	host_cmd.$O\
 	keys.$O\
@@ -42,6 +42,7 @@
 	pr_cmds.$O\
 	pr_edict.$O\
 	pr_exec.$O\
+	qk1.$O\
 	r_aclip.$O\
 	r_alias.$O\
 	r_bsp.$O\
@@ -77,6 +78,8 @@
 	net_udp.$O\
 
 HFILES=\
+	dat.h\
+	fns.h\
 	adivtab.h\
 	anorms.h\
 	bspfile.h\
@@ -85,7 +88,6 @@
 	cmd.h\
 	common.h\
 	console.h\
-	crc.h\
 	cvar.h\
 	d_iface.h\
 	d_local.h\
--- a/model.c
+++ b/model.c
@@ -51,7 +51,7 @@
 	Mod_LoadModel (mod, true);
 	
 	if (!mod->cache.data)
-		Sys_Error ("Mod_Extradata: caching failed");
+		fatal ("Mod_Extradata: caching failed");
 	return mod->cache.data;
 }
 
@@ -67,7 +67,7 @@
 	mplane_t	*plane;
 	
 	if (!model || !model->nodes)
-		Sys_Error ("Mod_PointInLeaf: bad model");
+		fatal ("Mod_PointInLeaf: bad model");
 
 	node = model->nodes;
 	while (1)
@@ -167,7 +167,7 @@
 	model_t	*avail = nil;
 
 	if (!name[0])
-		Sys_Error ("Mod_ForName: nil name");
+		fatal ("Mod_ForName: nil name");
 		
 //
 // search the currently loaded models
@@ -193,7 +193,7 @@
 						Cache_Free (&mod->cache);
 			}
 			else
-				Sys_Error ("mod_numknown == MAX_MOD_KNOWN");
+				fatal ("mod_numknown == MAX_MOD_KNOWN");
 		}
 		else
 			mod_numknown++;
@@ -252,23 +252,18 @@
 //
 // because the world is so huge, load it one piece at a time
 //
-	
-//
-// load the file
-//
-	buf = (uint *)COM_LoadStackFile(mod->name, stackbuf, sizeof stackbuf);
-	if (!buf)
-	{
-		if (crash)
-			Sys_Error ("Mod_NumForName: %s not found", mod->name);
+
+	buf = loadstklmp(mod->name, stackbuf, sizeof stackbuf, nil);
+	if(buf == nil){
+		if(crash)
+			fatal("Mod_LoadModel %s: not found: %r", mod->name);
 		return nil;
 	}
-	
+
 //
 // allocate a new model
 //
-	COM_FileBase (mod->name, loadname);
-	
+	radix(mod->name, loadname);
 	loadmodel = mod;
 
 //
@@ -362,7 +357,7 @@
 			mt->offsets[j] = LittleLong (mt->offsets[j]);
 		
 		if ( (mt->width & 15) || (mt->height & 15) )
-			Sys_Error ("Texture %s is not 16 aligned", mt->name);
+			fatal ("Texture %s is not 16 aligned", mt->name);
 		pixels = mt->width*mt->height/64*85;
 		tx = Hunk_AllocName(pixels + sizeof *tx, loadname);
 		loadmodel->textures[i] = tx;
@@ -413,7 +408,7 @@
 			altmax++;
 		}
 		else
-			Sys_Error ("Bad animating texture %s", tx->name);
+			fatal ("Bad animating texture %s", tx->name);
 
 		for (j=i+1 ; j<m->nummiptex ; j++)
 		{
@@ -441,7 +436,7 @@
 					altmax = num+1;
 			}
 			else
-				Sys_Error ("Bad animating texture %s", tx->name);
+				fatal ("Bad animating texture %s", tx->name);
 		}
 		
 #define	ANIM_CYCLE	2
@@ -450,7 +445,7 @@
 		{
 			tx2 = anims[j];
 			if (!tx2)
-				Sys_Error("Missing frame %d of %s", j, tx->name);
+				fatal("Missing frame %d of %s", j, tx->name);
 			tx2->anim_total = max * ANIM_CYCLE;
 			tx2->anim_min = j * ANIM_CYCLE;
 			tx2->anim_max = (j+1) * ANIM_CYCLE;
@@ -462,7 +457,7 @@
 		{
 			tx2 = altanims[j];
 			if (!tx2)
-				Sys_Error("Missing frame %d of %s", j, tx->name);
+				fatal("Missing frame %d of %s", j, tx->name);
 			tx2->anim_total = altmax * ANIM_CYCLE;
 			tx2->anim_min = j * ANIM_CYCLE;
 			tx2->anim_max = (j+1) * ANIM_CYCLE;
@@ -537,7 +532,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadVertexes: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadVertexes: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -565,7 +560,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadSubmodels: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadSubmodels: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -601,7 +596,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadEdges: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadEdges: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName((count+1) * sizeof *out, loadname);
 
@@ -630,7 +625,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadTexInfo: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadTexInfo: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -670,7 +665,7 @@
 		else
 		{
 			if (miptex >= loadmodel->numtextures)
-				Sys_Error ("miptex >= loadmodel->numtextures");
+				fatal ("miptex >= loadmodel->numtextures");
 			out->texture = loadmodel->textures[miptex];
 			if (!out->texture)
 			{
@@ -730,7 +725,7 @@
 		s->texturemins[i] = bmins[i] * 16;
 		s->extents[i] = (bmaxs[i] - bmins[i]) * 16;
 		if ( !(tex->flags & TEX_SPECIAL) && s->extents[i] > 256)
-			Sys_Error ("Bad surface extents");
+			fatal ("Bad surface extents");
 	}
 }
 
@@ -749,7 +744,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadFaces: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadFaces: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -832,7 +827,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadNodes: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadNodes: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -879,7 +874,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadLeafs: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadLeafs: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -926,7 +921,7 @@
 
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadClipnodes: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadClipnodes: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -1017,7 +1012,7 @@
 	
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadMarksurfaces: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadMarksurfaces: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -1028,7 +1023,7 @@
 	{
 		j = LittleShort(in[i]);
 		if (j >= loadmodel->numsurfaces)
-			Sys_Error ("Mod_ParseMarksurfaces: bad surface number");
+			fatal ("Mod_ParseMarksurfaces: bad surface number");
 		out[i] = loadmodel->surfaces + j;
 	}
 }
@@ -1045,7 +1040,7 @@
 	
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadSurfedges: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadSurfedges: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * sizeof *out, loadname);
 
@@ -1071,7 +1066,7 @@
 	
 	in = (void *)(mod_base + l->fileofs);
 	if (l->filelen % sizeof(*in))
-		Sys_Error("Mod_LoadPlanes: funny lump size in %s", loadmodel->name);
+		fatal("Mod_LoadPlanes: funny lump size in %s", loadmodel->name);
 	count = l->filelen / sizeof(*in);
 	out = Hunk_AllocName(count * 2 * sizeof *out, loadname);
 
@@ -1129,7 +1124,7 @@
 
 	i = LittleLong (header->version);
 	if (i != BSPVERSION)
-		Sys_Error("Mod_LoadBrushModel: %s has wrong version number (%d should be %d)", mod->name, i, BSPVERSION);
+		fatal("Mod_LoadBrushModel: %s has wrong version number (%d should be %d)", mod->name, i, BSPVERSION);
 
 // swap all the lumps
 	mod_base = (byte *)header;
@@ -1295,7 +1290,7 @@
 	{
 		*poutintervals = LittleFloat (pin_intervals->interval);
 		if (*poutintervals <= 0.0)
-			Sys_Error ("Mod_LoadAliasGroup: interval<=0");
+			fatal ("Mod_LoadAliasGroup: interval<=0");
 
 		poutintervals++;
 		pin_intervals++;
@@ -1334,7 +1329,7 @@
 		for(i=0; i<skinsize; i++)
 			pusskin[i] = d_8to16table[pinskin[i]];
 	}else
-		Sys_Error("Mod_LoadAliasSkin: invalid r_pixbytes: %d\n", r_pixbytes);
+		fatal("Mod_LoadAliasSkin: invalid r_pixbytes: %d\n", r_pixbytes);
 
 	pinskin += skinsize;
 
@@ -1379,7 +1374,7 @@
 	{
 		*poutskinintervals = LittleFloat (pinskinintervals->interval);
 		if (*poutskinintervals <= 0)
-			Sys_Error ("Mod_LoadAliasSkinGroup: interval<=0");
+			fatal ("Mod_LoadAliasSkinGroup: interval<=0");
 
 		poutskinintervals++;
 		pinskinintervals++;
@@ -1424,7 +1419,7 @@
 
 	version = LittleLong (pinmodel->version);
 	if (version != ALIAS_VERSION)
-		Sys_Error ("%s has wrong version number (%d should be %d)",
+		fatal ("%s has wrong version number (%d should be %d)",
 				 mod->name, version, ALIAS_VERSION);
 
 //
@@ -1454,21 +1449,21 @@
 	pmodel->skinheight = LittleLong (pinmodel->skinheight);
 
 	if (pmodel->skinheight > MAX_LBM_HEIGHT)
-		Sys_Error ("model %s has a skin taller than %d", mod->name,
+		fatal ("model %s has a skin taller than %d", mod->name,
 				   MAX_LBM_HEIGHT);
 
 	pmodel->numverts = LittleLong (pinmodel->numverts);
 
 	if (pmodel->numverts <= 0)
-		Sys_Error ("model %s has no vertices", mod->name);
+		fatal ("model %s has no vertices", mod->name);
 
 	if (pmodel->numverts > MAXALIASVERTS)
-		Sys_Error ("model %s has too many vertices", mod->name);
+		fatal ("model %s has too many vertices", mod->name);
 
 	pmodel->numtris = LittleLong (pinmodel->numtris);
 
 	if (pmodel->numtris <= 0)
-		Sys_Error ("model %s has no triangles", mod->name);
+		fatal ("model %s has no triangles", mod->name);
 
 	pmodel->numframes = LittleLong (pinmodel->numframes);
 	pmodel->size = LittleFloat (pinmodel->size) * ALIAS_BASE_SIZE_RATIO;
@@ -1486,7 +1481,7 @@
 	numframes = pmodel->numframes;
 
 	if (pmodel->skinwidth & 0x03)
-		Sys_Error ("Mod_LoadAliasModel: skinwidth not multiple of 4");
+		fatal ("Mod_LoadAliasModel: skinwidth not multiple of 4");
 
 	pheader->model = (byte *)pmodel - (byte *)pheader;
 
@@ -1496,7 +1491,7 @@
 	skinsize = pmodel->skinheight * pmodel->skinwidth;
 
 	if (numskins < 1)
-		Sys_Error ("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);
+		fatal ("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);
 
 	pskintype = (daliasskintype_t *)&pinmodel[1];
 
@@ -1568,7 +1563,7 @@
 // load the frames
 //
 	if (numframes < 1)
-		Sys_Error ("Mod_LoadAliasModel: Invalid # of frames: %d\n", numframes);
+		fatal ("Mod_LoadAliasModel: Invalid # of frames: %d\n", numframes);
 
 	pframetype = (daliasframetype_t *)&pintriangles[pmodel->numtris];
 
@@ -1660,7 +1655,7 @@
 		for(i=0 ; i<size ; i++)
 			ppixout[i] = d_8to16table[ppixin[i]];
 	}else
-		Sys_Error("Mod_LoadSpriteFrame: invalid r_pixbytes: %d\n", r_pixbytes);
+		fatal("Mod_LoadSpriteFrame: invalid r_pixbytes: %d\n", r_pixbytes);
 
 	return (void *)((byte *)pinframe + size + sizeof *pinframe);
 }
@@ -1701,7 +1696,7 @@
 	{
 		*poutintervals = LittleFloat (pin_intervals->interval);
 		if (*poutintervals <= 0.0)
-			Sys_Error ("Mod_LoadSpriteGroup: interval<=0");
+			fatal ("Mod_LoadSpriteGroup: interval<=0");
 
 		poutintervals++;
 		pin_intervals++;
@@ -1737,7 +1732,7 @@
 
 	version = LittleLong (pin->version);
 	if (version != SPRITE_VERSION)
-		Sys_Error ("%s has wrong version number "
+		fatal ("%s has wrong version number "
 				 "(%d should be %d)", mod->name, version, SPRITE_VERSION);
 
 	numframes = LittleLong (pin->numframes);
@@ -1764,7 +1759,7 @@
 // load the frames
 //
 	if (numframes < 1)
-		Sys_Error ("Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes);
+		fatal ("Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes);
 
 	mod->numframes = numframes;
 	mod->flags = 0;
--- a/model.h
+++ b/model.h
@@ -278,7 +278,7 @@
 
 typedef struct model_s
 {
-	char		name[MAX_QPATH];
+	char		name[Npath];
 	qboolean	needload;		// bmodels and sprites don't cache normally
 
 	modtype_t	type;
--- a/net_dgrm.c
+++ b/net_dgrm.c
@@ -141,13 +141,13 @@
 
 #ifdef DEBUG
 	if (data->cursize == 0)
-		Sys_Error("Datagram_SendMessage: zero length message\n");
+		fatal("Datagram_SendMessage: zero length message\n");
 
 	if (data->cursize > NET_MAXMESSAGE)
-		Sys_Error("Datagram_SendMessage: message too big %ud\n", data->cursize);
+		fatal("Datagram_SendMessage: message too big %ud\n", data->cursize);
 
 	if (sock->canSend == false)
-		Sys_Error("SendMessage: called with canSend == false\n");
+		fatal("SendMessage: called with canSend == false\n");
 #endif
 
 	memcpy(sock->sendMessage, data->data, data->cursize);
@@ -267,10 +267,10 @@
 
 #ifdef DEBUG
 	if (data->cursize == 0)
-		Sys_Error("Datagram_SendUnreliableMessage: zero length message\n");
+		fatal("Datagram_SendUnreliableMessage: zero length message\n");
 
 	if (data->cursize > MAX_DATAGRAM)
-		Sys_Error("Datagram_SendUnreliableMessage: message too big %ud\n", data->cursize);
+		fatal("Datagram_SendUnreliableMessage: message too big %ud\n", data->cursize);
 #endif
 
 	packetLen = NET_HEADERSIZE + data->cursize;
@@ -526,7 +526,7 @@
 			break;
 
 		if (MSG_ReadByte() != CCREP_PLAYER_INFO)
-			Sys_Error("Unexpected repsonse to Player Info request\n");
+			fatal("Unexpected repsonse to Player Info request\n");
 
 		MSG_ReadByte();	/* playerNumber */
 		strcpy(name, MSG_ReadString());
--- a/net_loop.c
+++ b/net_loop.c
@@ -143,7 +143,7 @@
 	bufferLength = &((qsocket_t *)sock->driverdata)->receiveMessageLength;
 
 	if ((*bufferLength + data->cursize + 4) > NET_MAXMESSAGE)
-		Sys_Error("Loop_SendMessage: overflow\n");
+		fatal("Loop_SendMessage: overflow\n");
 
 	buffer = ((qsocket_t *)sock->driverdata)->receiveMessage + *bufferLength;
 
--- a/net_main.c
+++ b/net_main.c
@@ -140,7 +140,7 @@
 				break;
 			}
 		if (!s)
-			Sys_Error ("NET_FreeQSocket: not active\n");
+			fatal ("NET_FreeQSocket: not active\n");
 	}
 
 	// add it to free list
@@ -202,9 +202,9 @@
 
 	svs.maxclients = n;
 	if (n == 1)
-		Cvar_Set ("deathmatch", "0");
+		setcvar ("deathmatch", "0");
 	else
-		Cvar_Set ("deathmatch", "1");
+		setcvar ("deathmatch", "1");
 }
 
 
@@ -699,7 +699,7 @@
 		if (i < com_argc-1)
 			DEFAULTnet_hostport = atoi(com_argv[i+1]);
 		else
-			Sys_Error ("NET_Init: you must specify a number after -port");
+			fatal ("NET_Init: you must specify a number after -port");
 	}
 	net_hostport = DEFAULTnet_hostport;
 
--- a/net_udp.c
+++ b/net_udp.c
@@ -41,11 +41,11 @@
 	if(strcmp(hostname.string, "UNNAMED") == 0)
 	{
 		buff[15] = 0;
-		Cvar_Set ("hostname", buff);
+		setcvar ("hostname", buff);
 	}
 
 	if ((net_controlsocket = UDP_OpenSocket (0)) == -1)
-		Sys_Error("UDP_Init: Unable to open control socket\n");
+		fatal("UDP_Init: Unable to open control socket\n");
 
 	((struct sockaddr_in *)&broadcastaddr)->sin_family = AF_INET;
 	((struct sockaddr_in *)&broadcastaddr)->sin_addr.s_addr = INADDR_BROADCAST;
@@ -80,7 +80,7 @@
 		if (net_acceptsocket != -1)
 			return;
 		if ((net_acceptsocket = UDP_OpenSocket (net_hostport)) == -1)
-			Sys_Error ("UDP_Listen: Unable to open accept socket\n");
+			fatal ("UDP_Listen: Unable to open accept socket\n");
 		return;
 	}
 
@@ -204,7 +204,7 @@
 		return -1;
 
 	if (ioctl (net_acceptsocket, FIONREAD, &available) == -1)
-		Sys_Error ("UDP: ioctlsocket (FIONREAD) failed\n");
+		fatal ("UDP: ioctlsocket (FIONREAD) failed\n");
 	if (available)
 		return net_acceptsocket;
 	return -1;
@@ -249,7 +249,7 @@
 	if (socket != net_broadcastsocket)
 	{
 		if (net_broadcastsocket != 0)
-			Sys_Error("Attempted to use multiple broadcasts sockets\n");
+			fatal("Attempted to use multiple broadcasts sockets\n");
 		ret = UDP_MakeSocketBroadcastCapable (socket);
 		if (ret == -1)
 		{
--- a/pr_cmds.c
+++ b/pr_cmds.c
@@ -553,13 +553,13 @@
 	attenuation = G_FLOAT(OFS_PARM4);
 	
 	if (volume < 0 || volume > 255)
-		Sys_Error ("SV_StartSound: volume = %d", volume);
+		fatal ("SV_StartSound: volume = %d", volume);
 
 	if (attenuation < 0 || attenuation > 4)
-		Sys_Error ("SV_StartSound: attenuation = %f", attenuation);
+		fatal ("SV_StartSound: attenuation = %f", attenuation);
 
 	if (channel < 0 || channel > 7)
-		Sys_Error ("SV_StartSound: channel = %d", channel);
+		fatal ("SV_StartSound: channel = %d", channel);
 
 	SV_StartSound (entity, channel, sample, volume, attenuation);
 }
@@ -818,7 +818,7 @@
 	var = G_STRING(OFS_PARM0);
 	val = G_STRING(OFS_PARM1);
 	
-	Cvar_Set (var, val);
+	setcvar (var, val);
 }
 
 /*
--- a/pr_edict.c
+++ b/pr_edict.c
@@ -15,8 +15,6 @@
 float			*pr_globals;			// same as pr_global_struct
 int				pr_edict_size;	// in bytes
 
-unsigned short		pr_crc;
-
 int		type_size[8] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *)/4};
 
 ddef_t *ED_FieldAtOfs (int ofs);
@@ -94,7 +92,7 @@
 	}
 	
 	if (i == MAX_EDICTS)
-		Sys_Error ("ED_Alloc: no free edicts");
+		fatal ("ED_Alloc: no free edicts");
 		
 	sv.num_edicts++;
 	e = EDICT_NUM(i);
@@ -650,7 +648,7 @@
 		if (com_token[0] == '}')
 			break;
 		if (!data)
-			Sys_Error ("ED_ParseEntity: EOF without closing brace");
+			fatal ("ED_ParseEntity: EOF without closing brace");
 
 		strcpy (keyname, com_token);
 
@@ -657,10 +655,10 @@
 	// parse value	
 		data = COM_Parse (data);
 		if (!data)
-			Sys_Error ("ED_ParseEntity: EOF without closing brace");
+			fatal ("ED_ParseEntity: EOF without closing brace");
 
 		if (com_token[0] == '}')
-			Sys_Error ("ED_ParseEntity: closing brace without data");
+			fatal ("ED_ParseEntity: closing brace without data");
 
 		key = ED_FindGlobal (keyname);
 		if (!key)
@@ -813,7 +811,7 @@
 		if (com_token[0] == '}')
 			break;
 		if (!data)
-			Sys_Error ("ED_ParseEntity: EOF without closing brace");
+			fatal ("ED_ParseEntity: EOF without closing brace");
 		
 // anglehack is to allow QuakeEd to write single scalar angles
 // and allow them to be turned into vectors. (FIXME...)
@@ -842,10 +840,10 @@
 	// parse value	
 		data = COM_Parse (data);
 		if (!data)
-			Sys_Error ("ED_ParseEntity: EOF without closing brace");
+			fatal ("ED_ParseEntity: EOF without closing brace");
 
 		if (com_token[0] == '}')
-			Sys_Error ("ED_ParseEntity: closing brace without data");
+			fatal ("ED_ParseEntity: closing brace without data");
 
 		init = true;	
 
@@ -912,7 +910,7 @@
 		if (!data)
 			break;
 		if (com_token[0] != '{')
-			Sys_Error ("ED_LoadFromFile: found %s when expecting {",com_token);
+			fatal ("ED_LoadFromFile: found %s when expecting {",com_token);
 
 		if (!ent)
 			ent = EDICT_NUM(0);
@@ -976,21 +974,21 @@
 */
 void PR_LoadProgs (void)
 {
-	int		i;
+	int i, n;
 
 // flush the non-C variable lookup cache
 	for (i=0 ; i<GEFV_CACHESIZE ; i++)
 		gefvCache[i].field[0] = 0;
 
-	CRC_Init (&pr_crc);
+	initcrc();
 
-	progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat");
-	if (!progs)
-		Sys_Error ("PR_LoadProgs: couldn't load progs.dat");
-	print("Programs occupy %lldK.\n", com_filesize/1024);
+	progs = loadhunklmp("progs.dat", &n);
+	if(progs == nil)
+		fatal("PR_LoadProgs: failed to load progs.dat: %r");
+	print("Programs occupy %dK.\n", n/1024);
 
-	for (i=0 ; i<com_filesize ; i++)
-		CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]);
+	for (i=0 ; i<n ; i++)
+		crc (((byte *)progs)[i]);
 
 // byte swap the header
 	for (i=0 ; i<sizeof(*progs)/4 ; i++)
@@ -997,9 +995,9 @@
 		((int *)progs)[i] = LittleLong ( ((int *)progs)[i] );		
 
 	if (progs->version != PROG_VERSION)
-		Sys_Error ("progs.dat has wrong version number (%d should be %d)", progs->version, PROG_VERSION);
+		fatal ("progs.dat has wrong version number (%d should be %d)", progs->version, PROG_VERSION);
 	if (progs->crc != PROGHEADER_CRC)
-		Sys_Error ("progs.dat system vars have been modified, progdefs.h is out of date");
+		fatal ("progs.dat system vars have been modified, progdefs.h is out of date");
 
 	pr_functions = (dfunction_t *)((byte *)progs + progs->ofs_functions);
 	pr_strings = (char *)progs + progs->ofs_strings;
@@ -1042,7 +1040,7 @@
 	{
 		pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type);
 		if (pr_fielddefs[i].type & DEF_SAVEGLOBAL)
-			Sys_Error ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL");
+			fatal ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL");
 		pr_fielddefs[i].ofs = LittleShort (pr_fielddefs[i].ofs);
 		pr_fielddefs[i].s_name = LittleLong (pr_fielddefs[i].s_name);
 	}
@@ -1081,7 +1079,7 @@
 edict_t *EDICT_NUM(int n)
 {
 	if (n < 0 || n >= sv.max_edicts)
-		Sys_Error ("EDICT_NUM: bad number %d", n);
+		fatal ("EDICT_NUM: bad number %d", n);
 	return (edict_t *)((byte *)sv.edicts+ (n)*pr_edict_size);
 }
 
@@ -1093,6 +1091,6 @@
 	b = b / pr_edict_size;
 	
 	if (b < 0 || b >= sv.num_edicts)
-		Sys_Error ("NUM_FOR_EDICT: bad pointer");
+		fatal ("NUM_FOR_EDICT: bad pointer");
 	return b;
 }
--- a/pr_exec.c
+++ b/pr_exec.c
@@ -317,7 +317,7 @@
 	int		i, c;
 
 	if (pr_depth <= 0)
-		Sys_Error ("prog stack underflow");
+		fatal ("prog stack underflow");
 
 // restore locals from the stack
 	c = pr_xfunction->locals;
--- a/progs.h
+++ b/progs.h
@@ -105,8 +105,6 @@
 extern	dfunction_t	*pr_xfunction;
 extern	int			pr_xstatement;
 
-extern	unsigned short		pr_crc;
-
 void PR_RunError (char *error, ...);
 
 void ED_PrintEdicts (void);
@@ -118,3 +116,5 @@
 void M_Keydown (int key);
 void M_ToggleMenu_f (void);
 void M_Draw (void);
+
+#pragma varargck	argpos	PR_RunError	1
--- /dev/null
+++ b/qk1.c
@@ -1,0 +1,31 @@
+#include <u.h>
+#include <libc.h>
+#include <stdio.h>
+#include "quakedef.h"
+
+static int debug;
+
+void
+dprint(char *fmt, ...)
+{
+	char s[256];
+	va_list arg;
+
+	if(!debug)
+		return;
+	va_start(arg, fmt);
+	vseprint(s, s+sizeof s, fmt, arg);
+	va_end(arg);
+	fprint(2, "%s\n", s);
+}
+
+void
+fatal(char *fmt, ...)
+{
+	va_list arg;
+
+	Host_Shutdown();
+	va_start(arg, fmt);
+	sysfatal(fmt, arg);
+	va_end(arg);
+}
--- a/quakedef.h
+++ b/quakedef.h
@@ -1,5 +1,3 @@
-// quakedef.h -- primary header for client
-
 #define	QUAKE_GAME			// as opposed to utilities
 #define	VERSION				1.09
 //#define	PARANOID			// speed sapping error checking
@@ -30,13 +28,8 @@
 // fall over
 #define	ROLL	2
 
-
-#define	MAX_QPATH		64			// max length of a quake game pathname
-#define	MAX_OSPATH		128			// max length of a filesystem pathname
-
 #define	ON_EPSILON		0.1			// point on plane side epsilon
 
-#define	MAX_MSGLEN		8000		// max length of a reliable message
 #define	MAX_DATAGRAM	1024		// max length of unreliable message
 
 //
@@ -147,6 +140,10 @@
 // Use for multiplayer testing only - VERY dangerous!!!
 // #define IDGODS
 
+typedef unsigned char 		byte;
+typedef enum {false, true}	qboolean;
+
+#include "cvar.h"
 #include "common.h"
 #include "bspfile.h"
 #include "vid.h"
@@ -165,9 +162,10 @@
 	int		effects;
 } entity_state_t;
 
+#include "dat.h"
+#include "fns.h"
 #include "wad.h"
 #include "draw.h"
-#include "cvar.h"
 #include "screen.h"
 #include "net.h"
 #include "protocol.h"
@@ -186,7 +184,6 @@
 #include "console.h"
 #include "view.h"
 #include "menu.h"
-#include "crc.h"
 #include "cdaudio.h"
 
 /* included here to avoid type incompatibilities errors from 2c(1),2l(1) */
@@ -202,7 +199,6 @@
 typedef struct
 {
 	char	*basedir;
-	char	*cachedir;		// for development over ISDN lines
 	int		argc;
 	char	**argv;
 	void	*membase;
@@ -262,3 +258,7 @@
 void Chase_Init (void);
 void Chase_Reset (void);
 void Chase_Update (void);
+
+#pragma varargck	argpos	Host_Error	1
+#pragma varargck	argpos	Host_EndGame	1
+#pragma varargck	argpos	Host_ClientCommands	1
--- a/r_alias.c
+++ b/r_alias.c
@@ -698,7 +698,7 @@
 	R_AliasSetupFrame ();
 
 	if (!currententity->colormap)
-		Sys_Error ("R_AliasDrawModel: !currententity->colormap");
+		fatal ("R_AliasDrawModel: !currententity->colormap");
 
 	r_affinetridesc.drawtype = (currententity->trivial_accept == 3) &&
 			r_recursiveaffinetriangles;
--- a/r_bsp.c
+++ b/r_bsp.c
@@ -376,7 +376,7 @@
 			}
 			else
 			{
-				Sys_Error ("no edges in bmodel");
+				fatal ("no edges in bmodel");
 			}
 		}
 	}
--- a/r_efrag.c
+++ b/r_efrag.c
@@ -249,7 +249,7 @@
 			break;
 
 		default:	
-			Sys_Error ("R_StoreEfrags: Bad entity type %d\n", clmodel->type);
+			fatal ("R_StoreEfrags: Bad entity type %d\n", clmodel->type);
 		}
 	}
 }
--- a/r_local.h
+++ b/r_local.h
@@ -221,7 +221,6 @@
 void R_DrawParticles (void);
 void R_InitParticles (void);
 void R_ClearParticles (void);
-void R_ReadPointFile_f (void);
 void R_SurfacePatch (void);
 
 extern int		r_amodels_drawn;
--- a/r_main.c
+++ b/r_main.c
@@ -171,7 +171,7 @@
 	R_InitTurb ();
 	
 	Cmd_AddCommand ("timerefresh", R_TimeRefresh_f);	
-	Cmd_AddCommand ("pointfile", R_ReadPointFile_f);	
+	Cmd_AddCommand("pointfile", pointlmp);
 
 	Cvar_RegisterVariable (&r_draworder);
 	Cvar_RegisterVariable (&r_speeds);
@@ -195,8 +195,8 @@
 	Cvar_RegisterVariable (&r_aliastransbase);
 	Cvar_RegisterVariable (&r_aliastransadj);
 
-	Cvar_SetValue ("r_maxedges", (float)NUMSTACKEDGES);
-	Cvar_SetValue ("r_maxsurfs", (float)NUMSTACKSURFACES);
+	setcvarv ("r_maxedges", (float)NUMSTACKEDGES);
+	setcvarv ("r_maxsurfs", (float)NUMSTACKSURFACES);
 
 	view_clipplanes[0].leftedge = true;
 	view_clipplanes[1].rightedge = true;
@@ -927,7 +927,7 @@
 	Sys_LowFPPrecision ();
 
 	if (!cl_entities[0].model || !cl.worldmodel)
-		Sys_Error ("R_RenderView: NULL worldmodel");
+		fatal ("R_RenderView: NULL worldmodel");
 		
 	if (!r_dspeeds.value)
 	{
@@ -1006,16 +1006,16 @@
 	
 	delta = (byte *)&dummy - r_stack_start;
 	if (delta < -10000 || delta > 10000)
-		Sys_Error ("R_RenderView: called without enough stack");
+		fatal ("R_RenderView: called without enough stack");
 
 	if ( Hunk_LowMark() & 3 )
-		Sys_Error ("Hunk is missaligned");
+		fatal ("Hunk is missaligned");
 
 	if ( (uintptr)(&dummy) & 3 )
-		Sys_Error ("Stack is missaligned");
+		fatal ("Stack is missaligned");
 
 	if ( (uintptr)(&r_warpbuffer) & 3 )
-		Sys_Error ("Globals are missaligned");
+		fatal ("Globals are missaligned");
 
 	R_RenderView_ ();
 }
--- a/r_misc.c
+++ b/r_misc.c
@@ -349,10 +349,10 @@
 // don't allow cheats in multiplayer
 	if (cl.maxclients > 1)
 	{
-		Cvar_Set ("r_draworder", "0");
-		Cvar_Set ("r_fullbright", "0");
-		Cvar_Set ("r_ambient", "0");
-		Cvar_Set ("r_drawflat", "0");
+		setcvar ("r_draworder", "0");
+		setcvar ("r_fullbright", "0");
+		setcvar ("r_ambient", "0");
+		setcvar ("r_drawflat", "0");
 	}
 
 	if (r_numsurfs.value)
@@ -360,7 +360,7 @@
 		if ((surface_p - surfaces) > r_maxsurfsseen)
 			r_maxsurfsseen = surface_p - surfaces;
 
-		Con_Printf ("Used %d of %d surfs; %d max\n", surface_p - surfaces,
+		Con_Printf ("Used %zd of %zd surfs; %d max\n", surface_p - surfaces,
 				surf_max - surfaces, r_maxsurfsseen);
 	}
 
--- a/r_part.c
+++ b/r_part.c
@@ -115,55 +115,6 @@
 	particles[r_numparticles-1].next = nil;
 }
 
-
-void R_ReadPointFile_f (void)
-{
-	FILE	*f;
-	vec3_t	org;
-	int		r;
-	int		c;
-	particle_t	*p;
-	char	name[MAX_OSPATH];
-	
-	sprint (name,"maps/%s.pts", sv.name);
-
-	COM_FOpenFile (name, &f);
-	if (!f)
-	{
-		Con_Printf ("couldn't open %s\n", name);
-		return;
-	}
-	
-	Con_Printf ("Reading %s...\n", name);
-	c = 0;
-	for ( ;; )
-	{
-		r = fscanf (f,"%f %f %f\n", &org[0], &org[1], &org[2]);
-		if (r != 3)
-			break;
-		c++;
-		
-		if (!free_particles)
-		{
-			Con_Printf ("Not enough free particles\n");
-			break;
-		}
-		p = free_particles;
-		free_particles = p->next;
-		p->next = active_particles;
-		active_particles = p;
-		
-		p->die = 99999;
-		p->color = (-c)&15;
-		p->type = pt_static;
-		VectorCopy (vec3_origin, p->vel);
-		VectorCopy (org, p->org);
-	}
-
-	fclose (f);
-	Con_Printf ("%d points read\n", c);
-}
-
 /*
 ===============
 R_ParseParticleEffect
--- a/r_sprite.c
+++ b/r_sprite.c
@@ -170,7 +170,7 @@
 		if (nump < 3)
 			return;
 		if (nump >= MAXWORKINGVERTS)
-			Sys_Error("R_SetupAndDrawSprite: too many points");
+			fatal("R_SetupAndDrawSprite: too many points");
 	}
 
 // transform vertices into viewspace and project
@@ -372,7 +372,7 @@
 	}
 	else
 	{
-		Sys_Error ("R_DrawSprite: Bad sprite type %d", psprite->type);
+		fatal ("R_DrawSprite: Bad sprite type %d", psprite->type);
 	}
 
 	R_RotateSprite (psprite->beamlength);
--- a/r_surf.c
+++ b/r_surf.c
@@ -197,9 +197,9 @@
 	{
 		base = base->anim_next;
 		if (!base)
-			Sys_Error ("R_TextureAnimation: broken cycle");
+			fatal ("R_TextureAnimation: broken cycle");
 		if (++count > 100)
-			Sys_Error ("R_TextureAnimation: infinite cycle");
+			fatal ("R_TextureAnimation: infinite cycle");
 	}
 
 	return base;
@@ -634,7 +634,7 @@
 	}
 	else
 	{
-		Sys_Error ("Unknown tile type");
+		fatal ("Unknown tile type");
 	}
 }
 
--- a/screen.c
+++ b/screen.c
@@ -183,7 +183,7 @@
         float   x;
 
         if (fov_x < 1 || fov_x > 179)
-                Sys_Error ("Bad fov: %f", fov_x);
+                fatal ("Bad fov: %f", fov_x);
 
         x = width/tan(fov_x/360*M_PI);
 
@@ -217,15 +217,15 @@
 	
 // bound viewsize
 	if (scr_viewsize.value < 30)
-		Cvar_Set ("viewsize","30");
+		setcvar ("viewsize","30");
 	if (scr_viewsize.value > 120)
-		Cvar_Set ("viewsize","120");
+		setcvar ("viewsize","120");
 
 // bound field of view
 	if (scr_fov.value < 10)
-		Cvar_Set ("fov","10");
+		setcvar ("fov","10");
 	if (scr_fov.value > 170)
-		Cvar_Set ("fov","170");
+		setcvar ("fov","170");
 
 	r_refdef.fov_x = scr_fov.value;
 	r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.vrect.width, r_refdef.vrect.height);
@@ -271,7 +271,7 @@
 */
 void SCR_SizeUp_f (void)
 {
-	Cvar_SetValue ("viewsize",scr_viewsize.value+10);
+	setcvarv ("viewsize",scr_viewsize.value+10);
 	vid.recalc_refdef = 1;
 }
 
@@ -285,7 +285,7 @@
 */
 void SCR_SizeDown_f (void)
 {
-	Cvar_SetValue ("viewsize",scr_viewsize.value-10);
+	setcvarv ("viewsize",scr_viewsize.value-10);
 	vid.recalc_refdef = 1;
 }
 
@@ -561,7 +561,8 @@
 	for(i=0; i<3*256; i++)
 		*p++ = *pal++;
 
-	COM_WriteFile(path, buf, p - buf);
+	USED(path);
+	/*COM_WriteFile(path, buf, p - buf);*/
 } 
 
 static void
@@ -568,7 +569,7 @@
 dopcx(void)
 {
 	int i; 
-	char pcxname[12], checkname[MAX_OSPATH];
+	char pcxname[12], checkname[Nfspath];
 
 	writepcx = 0;
 
@@ -577,7 +578,7 @@
 	for(i=0; i<100; i++){
 		pcxname[5] = i / 10 + '0';
 		pcxname[6] = i % 10 + '0';
-		sprint(checkname, "%s/%s", com_gamedir, pcxname);
+		sprint(checkname, "%s/%s", fsdir, pcxname);
 		if(access(checkname, AEXIST) == -1)
 			break;
 	}
--- a/server.h
+++ b/server.h
@@ -69,7 +69,7 @@
 
 	sizebuf_t		message;			// can be added to at any time,
 										// copied and clear once per frame
-	byte			msgbuf[MAX_MSGLEN];
+	byte			msgbuf[Nmsg];
 	edict_t			*edict;				// EDICT_NUM(clientnum+1)
 	char			name[32];			// for printing to other people
 	int				colors;
@@ -202,3 +202,6 @@
 void SV_RunClients (void);
 void SV_SaveSpawnparms (void);
 void SV_SpawnServer (char *server);
+
+#pragma varargck	argpos	SV_ClientPrintf	1
+#pragma varargck	argpos	SV_BroadcastPrintf	1
--- a/snd_dma.c
+++ b/snd_dma.c
@@ -96,7 +96,7 @@
 		Con_Printf ("sound system not started\n");
 		return;
 	}
-	
+
     Con_Printf("%5d stereo\n", shm->channels - 1);
     Con_Printf("%5d samples\n", shm->samples);
     Con_Printf("%5d samplepos\n", shm->samplepos);
@@ -103,7 +103,7 @@
     Con_Printf("%5d samplebits\n", shm->samplebits);
     Con_Printf("%5d submission_chunk\n", shm->submission_chunk);
     Con_Printf("%5d speed\n", shm->speed);
-    Con_Printf("0x%x dma buffer\n", shm->buffer);
+    Con_Printf("%#p dma buffer\n", shm->buffer);
 	Con_Printf("%5d total_channels\n", total_channels);
 }
 
@@ -173,7 +173,7 @@
 
 	if (host_parms.memsize < 0x800000)
 	{
-		Cvar_Set ("loadas8bit", "1");
+		setcvar("loadas8bit", "1");
 		Con_Printf ("loading all sounds as 8bit\n");
 	}
 
@@ -251,10 +251,10 @@
 	sfx_t	*sfx;
 
 	if (name == nil)
-		Sys_Error ("S_FindName: NULL\n");
+		fatal ("S_FindName: NULL\n");
 
-	if(strlen(name) >= MAX_QPATH)
-		Sys_Error ("Sound name too long: %s", name);
+	if(strlen(name) >= Npath)
+		fatal ("Sound name too long: %s", name);
 
 // see if already loaded
 	for (i=0 ; i < num_sfx ; i++)
@@ -262,7 +262,7 @@
 			return &known_sfx[i];
 
 	if (num_sfx == MAX_SFX)
-		Sys_Error ("S_FindName: out of sfx_t");
+		fatal ("S_FindName: out of sfx_t");
 	
 	sfx = &known_sfx[i];
 	strcpy (sfx->name, name);
--- a/snd_mem.c
+++ b/snd_mem.c
@@ -100,15 +100,13 @@
 
 //	Con_Printf ("loading %s\n",namebuffer);
 
-	data = COM_LoadStackFile(namebuffer, stackbuf, sizeof stackbuf);
-
-	if (!data)
-	{
-		Con_Printf ("Couldn't load %s\n", namebuffer);
+	data = loadstklmp(namebuffer, stackbuf, sizeof stackbuf, &len);
+	if(data == nil){
+		Con_Printf("Couldn't load %s: %r\n", namebuffer);
 		return nil;
 	}
 
-	info = GetWavinfo (s->name, data, com_filesize);
+	info = GetWavinfo (s->name, data, len);
 	if (info.channels != 1)
 	{
 		Con_Printf ("%s is a stereo sample\n",s->name);
@@ -195,7 +193,7 @@
 			return;
 		}
 //		if (iff_chunk_len > 1024*1024)
-//			Sys_Error ("FindNextChunk: %d length is past the 1 meg sanity limit", iff_chunk_len);
+//			fatal ("FindNextChunk: %d length is past the 1 meg sanity limit", iff_chunk_len);
 		data_p -= 8;
 		last_chunk = data_p + 8 + ( (iff_chunk_len + 1) & ~1 );
 		if(strncmp((char *)data_p, name, 4) == 0)
@@ -221,7 +219,7 @@
 		memcpy (str, data_p, 4);
 		data_p += 4;
 		iff_chunk_len = GetLittleLong();
-		Con_Printf ("0x%x : %s (%d)\n", (uintptr)(data_p - 4), str, iff_chunk_len);
+		Con_Printf ("0x%zud : %s (%d)\n", (uintptr)(data_p - 4), str, iff_chunk_len);
 		data_p += (iff_chunk_len + 1) & ~1;
 	} while (data_p < iff_end);
 }
@@ -315,7 +313,7 @@
 	if (info.samples)
 	{
 		if (samples < info.samples)
-			Sys_Error ("Sound %s has a bad loop length", name);
+			fatal ("Sound %s has a bad loop length", name);
 	}
 	else
 		info.samples = samples;
--- a/sound.h
+++ b/sound.h
@@ -20,7 +20,7 @@
 
 typedef struct sfx_s
 {
-	char 	name[MAX_QPATH];
+	char 	name[Npath];
 	cache_user_t	cache;
 } sfx_t;
 
--- a/sv_main.c
+++ b/sv_main.c
@@ -108,13 +108,13 @@
 	int			ent;
 	
 	if (volume < 0 || volume > 255)
-		Sys_Error ("SV_StartSound: volume = %d", volume);
+		fatal ("SV_StartSound: volume = %d", volume);
 
 	if (attenuation < 0 || attenuation > 4)
-		Sys_Error ("SV_StartSound: attenuation = %f", attenuation);
+		fatal ("SV_StartSound: attenuation = %f", attenuation);
 
 	if (channel < 0 || channel > 7)
-		Sys_Error ("SV_StartSound: channel = %d", channel);
+		fatal ("SV_StartSound: channel = %d", channel);
 
 	if (sv.datagram.cursize > MAX_DATAGRAM-16)
 		return;	
@@ -176,7 +176,7 @@
 	char			message[2048];
 
 	MSG_WriteByte (&client->message, svc_print);
-	sprint(message, "%c\nVERSION %4.2f SERVER (%ud CRC)\n", 2, VERSION, pr_crc);
+	sprint(message, "%c\nVERSION %4.2f SERVER (%ud CRC)\n", 2, VERSION, crcn);
 	MSG_WriteString (&client->message,message);
 
 	MSG_WriteByte (&client->message, svc_serverinfo);
@@ -303,7 +303,7 @@
 			if (!svs.clients[i].active)
 				break;
 		if (i == svs.maxclients)
-			Sys_Error ("Host_CheckForNewClients: no free clients");
+			fatal ("Host_CheckForNewClients: no free clients");
 		
 		svs.clients[i].netconnection = ret;
 		SV_ConnectClient (i);	
@@ -883,7 +883,7 @@
 		if (!strcmp(sv.model_precache[i], name))
 			return i;
 	if (i==MAX_MODELS || !sv.model_precache[i])
-		Sys_Error ("SV_ModelIndex: model %s not precached", name);
+		fatal ("SV_ModelIndex: model %s not precached", name);
 	return i;
 }
 
@@ -1015,7 +1015,7 @@
 
 	// let's not have any servers with no name
 	if (hostname.string[0] == 0)
-		Cvar_Set ("hostname", "UNNAMED");
+		setcvar ("hostname", "UNNAMED");
 	scr_centertime_off = 0;
 
 	print("SV_SpawnServer: %s\n", server);
@@ -1033,7 +1033,7 @@
 // make cvars consistant
 //
 	if (coop.value)
-		Cvar_SetValue ("deathmatch", 0);
+		setcvarv ("deathmatch", 0);
 	current_skill = (int)(skill.value + 0.5);
 	if (current_skill < 0)
 		current_skill = 0;
@@ -1040,7 +1040,7 @@
 	if (current_skill > 3)
 		current_skill = 3;
 
-	Cvar_SetValue ("skill", (float)current_skill);
+	setcvarv ("skill", (float)current_skill);
 	
 //
 // set up the new server
--- a/sv_phys.c
+++ b/sv_phys.c
@@ -251,7 +251,7 @@
 			 break;		// moved the entire distance
 
 		if (!trace.ent)
-			Sys_Error ("SV_FlyMove: !trace.ent");
+			fatal ("SV_FlyMove: !trace.ent");
 
 		if (trace.plane.normal[2] > 0.7)
 		{
@@ -907,7 +907,7 @@
 		break;
 		
 	default:
-		Sys_Error ("SV_Physics_client: bad movetype %d", (int)ent->v.movetype);
+		fatal ("SV_Physics_client: bad movetype %d", (int)ent->v.movetype);
 	}
 
 //
@@ -1161,7 +1161,7 @@
 		|| ent->v.movetype == MOVETYPE_FLYMISSILE)
 			SV_Physics_Toss (ent);
 		else
-			Sys_Error ("SV_Physics: bad movetype %d", (int)ent->v.movetype);			
+			fatal ("SV_Physics: bad movetype %d", (int)ent->v.movetype);			
 	}
 	
 	if (pr_global_struct->force_retouch)
--- a/sys.c
+++ b/sys.c
@@ -7,94 +7,13 @@
 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_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)
-		return -1;
-	t = d->mtime;
-	free(d);
-	return t;
-}
-
 vlong
 flen(int fd)
 {
@@ -106,20 +25,6 @@
 	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
--- a/sys.h
+++ b/sys.h
@@ -5,15 +5,11 @@
 	THnet	= 3
 };
 
-void	Sys_Error(char *, ...);
 void	Sys_Quit(void);
 void	Sys_LowFPPrecision(void);
 void	Sys_HighFPPrecision(void);
 void*	emalloc(ulong);
-ulong	Sys_FileTime(char *);
 vlong	flen(int);
-void	eread(int, void *, long);
-void	ewrite(int, void *, long);
 double	Sys_FloatTime(void);
 char*	Sys_ConsoleInput(void);
 void	Sys_SendKeyEvents(void);	// call Key_Event() until the input queue is empty
--- a/vid.c
+++ b/vid.c
@@ -186,7 +186,6 @@
 void
 VID_Shutdown(void)
 {
-	Con_Printf("VID_Shutdown\n");
 	free(framebuf);
 	freeimage(fbim);
 }
--- a/view.c
+++ b/view.c
@@ -842,9 +842,9 @@
 // don't allow cheats in multiplayer
 	if (cl.maxclients > 1)
 	{
-		Cvar_Set ("scr_ofsx", "0");
-		Cvar_Set ("scr_ofsy", "0");
-		Cvar_Set ("scr_ofsz", "0");
+		setcvar ("scr_ofsx", "0");
+		setcvar ("scr_ofsy", "0");
+		setcvar ("scr_ofsz", "0");
 	}
 
 	if (cl.intermission)
--- a/wad.c
+++ b/wad.c
@@ -53,11 +53,11 @@
 	wadinfo_t		*header;
 	unsigned		i;
 	int				infotableofs;
-	
-	wad_base = COM_LoadHunkFile (filename);
-	if (!wad_base)
-		Sys_Error ("W_LoadWadFile: couldn't load %s", filename);
 
+	wad_base = loadhunklmp(filename, nil);
+	if(wad_base == nil)
+		fatal("W_LoadWadFile: failed to load %s: %r", filename);
+
 	header = (wadinfo_t *)wad_base;
 	
 	if (header->identification[0] != 'W'
@@ -64,7 +64,7 @@
 	|| header->identification[1] != 'A'
 	|| header->identification[2] != 'D'
 	|| header->identification[3] != '2')
-		Sys_Error ("Wad file %s doesn't have WAD2 id\n",filename);
+		fatal ("Wad file %s doesn't have WAD2 id\n",filename);
 		
 	wad_numlumps = LittleLong(header->numlumps);
 	infotableofs = LittleLong(header->infotableofs);
@@ -100,7 +100,7 @@
 			return lump_p;
 	}
 	
-	Sys_Error ("W_GetLumpinfo: %s not found", name);
+	fatal ("W_GetLumpinfo: %s not found", name);
 	return nil;
 }
 
@@ -118,7 +118,7 @@
 	lumpinfo_t	*lump;
 	
 	if (num < 0 || num > wad_numlumps)
-		Sys_Error ("W_GetLumpNum: bad number: %d", num);
+		fatal ("W_GetLumpNum: bad number: %d", num);
 		
 	lump = wad_lumps + num;
 	
--- a/world.c
+++ b/world.c
@@ -121,12 +121,12 @@
 	if (ent->v.solid == SOLID_BSP)
 	{	// explicit hulls in the BSP model
 		if (ent->v.movetype != MOVETYPE_PUSH)
-			Sys_Error ("SOLID_BSP without MOVETYPE_PUSH");
+			fatal ("SOLID_BSP without MOVETYPE_PUSH");
 
 		model = sv.models[ (int)ent->v.modelindex ];
 
 		if (!model || model->type != mod_brush)
-			Sys_Error ("MOVETYPE_PUSH with a non bsp model");
+			fatal ("MOVETYPE_PUSH with a non bsp model");
 
 		VectorSubtract (maxs, mins, size);
 		if (size[0] < 3)
@@ -451,7 +451,7 @@
 	while (num >= 0)
 	{
 		if (num < hull->firstclipnode || num > hull->lastclipnode)
-			Sys_Error ("SV_HullPointContents: bad node number");
+			fatal ("SV_HullPointContents: bad node number");
 	
 		node = hull->clipnodes + num;
 		plane = hull->planes + node->planenum;
@@ -558,7 +558,7 @@
 	}
 
 	if (num < hull->firstclipnode || num > hull->lastclipnode)
-		Sys_Error ("SV_RecursiveHullCheck: bad node number");
+		fatal ("SV_RecursiveHullCheck: bad node number");
 
 //
 // find the point distances
@@ -727,7 +727,7 @@
 		if (touch == clip->passedict)
 			continue;
 		if (touch->v.solid == SOLID_TRIGGER)
-			Sys_Error ("Trigger in clipping list");
+			fatal ("Trigger in clipping list");
 
 		if (clip->type == MOVE_NOMONSTERS && touch->v.solid != SOLID_BSP)
 			continue;
--- a/zone.c
+++ b/zone.c
@@ -83,13 +83,13 @@
 	memblock_t	*block, *other;
 	
 	if (!ptr)
-		Sys_Error ("Z_Free: NULL pointer");
+		fatal ("Z_Free: NULL pointer");
 
 	block = (memblock_t *)((uchar *)ptr - sizeof(memblock_t));
 	if (block->id != ZONEID)
-		Sys_Error ("Z_Free: freed a pointer without ZONEID");
+		fatal ("Z_Free: freed a pointer without ZONEID");
 	if (block->tag == 0)
-		Sys_Error ("Z_Free: freed a freed pointer");
+		fatal ("Z_Free: freed a freed pointer");
 
 	block->tag = 0;		// mark as free
 	
@@ -122,7 +122,7 @@
 
 	Z_CheckHeap();	// DEBUG
 	if((buf = Z_TagMalloc(size, 1)) == nil)
-		Sys_Error("Z_Malloc: failed on allocation of %d bytes", size);
+		fatal("Z_Malloc: failed on allocation of %d bytes", size);
 	memset(buf, 0, size);
 
 	return buf;
@@ -134,7 +134,7 @@
 	memblock_t	*start, *rover, *new, *base;
 
 	if (!tag)
-		Sys_Error ("Z_TagMalloc: tried to use a 0 tag");
+		fatal ("Z_TagMalloc: tried to use a 0 tag");
 
 //
 // scan through the block list looking for the first free block
@@ -229,11 +229,11 @@
 		if (block->next == &mainzone->blocklist)
 			break;			// all blocks have been hit	
 		if ( (byte *)block + block->size != (byte *)block->next)
-			Sys_Error ("Z_CheckHeap: block size does not touch the next block\n");
+			fatal ("Z_CheckHeap: block size does not touch the next block\n");
 		if ( block->next->prev != block)
-			Sys_Error ("Z_CheckHeap: next block doesn't have proper back link\n");
+			fatal ("Z_CheckHeap: next block doesn't have proper back link\n");
 		if (!block->tag && !block->next->tag)
-			Sys_Error ("Z_CheckHeap: two consecutive free blocks\n");
+			fatal ("Z_CheckHeap: two consecutive free blocks\n");
 	}
 }
 
@@ -273,9 +273,9 @@
 	for (h = (hunk_t *)hunk_base ; (byte *)h != hunk_base + hunk_low_used ; )
 	{
 		if (h->sentinal != HUNK_SENTINAL)
-			Sys_Error ("Hunk_Check: trahsed sentinal");
+			fatal ("Hunk_Check: trahsed sentinal");
 		if (h->size < 16 || h->size + (byte *)h - hunk_base > hunk_size)
-			Sys_Error ("Hunk_Check: bad size");
+			fatal ("Hunk_Check: bad size");
 		h = (hunk_t *)((byte *)h+h->size);
 	}
 }
@@ -331,9 +331,9 @@
 	// run consistancy checks
 	//
 		if (h->sentinal != HUNK_SENTINAL)
-			Sys_Error ("Hunk_Check: trahsed sentinal");
+			fatal ("Hunk_Check: trahsed sentinal");
 		if (h->size < 16 || h->size + (byte *)h - hunk_base > hunk_size)
-			Sys_Error ("Hunk_Check: bad size");
+			fatal ("Hunk_Check: bad size");
 			
 		next = (hunk_t *)((byte *)h+h->size);
 		count++;
@@ -381,12 +381,12 @@
 #endif
 
 	if (size < 0)
-		Sys_Error ("Hunk_Alloc: bad size: %d", size);
+		fatal ("Hunk_Alloc: bad size: %d", size);
 		
 	size = sizeof(hunk_t) + ((size+15)&~15);
 	
 	if (hunk_size - hunk_low_used - hunk_high_used < size)
-		Sys_Error ("Hunk_Alloc: failed on %d bytes",size);
+		fatal ("Hunk_Alloc: failed on %d bytes",size);
 	
 	h = (hunk_t *)(hunk_base + hunk_low_used);
 	hunk_low_used += size;
@@ -420,7 +420,7 @@
 void Hunk_FreeToLowMark (int mark)
 {
 	if (mark < 0 || mark > hunk_low_used)
-		Sys_Error ("Hunk_FreeToLowMark: bad mark %d", mark);
+		fatal ("Hunk_FreeToLowMark: bad mark %d", mark);
 	memset(hunk_base + mark, 0, hunk_low_used - mark);
 	hunk_low_used = mark;
 }
@@ -444,7 +444,7 @@
 		Hunk_FreeToHighMark (hunk_tempmark);
 	}
 	if (mark < 0 || mark > hunk_high_used)
-		Sys_Error ("Hunk_FreeToHighMark: bad mark %d", mark);
+		fatal ("Hunk_FreeToHighMark: bad mark %d", mark);
 	memset(hunk_base + hunk_size - hunk_high_used, 0, hunk_high_used - mark);
 	hunk_high_used = mark;
 }
@@ -460,7 +460,7 @@
 	hunk_t	*h;
 
 	if (size < 0)
-		Sys_Error ("Hunk_HighAllocName: bad size: %d", size);
+		fatal ("Hunk_HighAllocName: bad size: %d", size);
 
 	if (hunk_tempactive)
 	{
@@ -626,7 +626,7 @@
 void Cache_UnlinkLRU (cache_system_t *cs)
 {
 	if (!cs->lru_next || !cs->lru_prev)
-		Sys_Error ("Cache_UnlinkLRU: NULL link");
+		fatal ("Cache_UnlinkLRU: NULL link");
 
 	cs->lru_next->lru_prev = cs->lru_prev;
 	cs->lru_prev->lru_next = cs->lru_next;
@@ -637,7 +637,7 @@
 void Cache_MakeLRU (cache_system_t *cs)
 {
 	if (cs->lru_next || cs->lru_prev)
-		Sys_Error ("Cache_MakeLRU: active link");
+		fatal ("Cache_MakeLRU: active link");
 
 	cache_head.lru_next->lru_prev = cs;
 	cs->lru_next = cache_head.lru_next;
@@ -662,7 +662,7 @@
 	if (!nobottom && cache_head.prev == &cache_head)
 	{
 		if (hunk_size - hunk_high_used - hunk_low_used < size)
-			Sys_Error ("Cache_TryAlloc: %d is greater then free hunk", size);
+			fatal ("Cache_TryAlloc: %d is greater then free hunk", size);
 
 		new = (cache_system_t *) (hunk_base + hunk_low_used);
 		memset(new, 0, sizeof *new);
@@ -772,7 +772,7 @@
 	cache_system_t	*cs;
 
 	if (!c->data)
-		Sys_Error ("Cache_Free: not allocated");
+		fatal ("Cache_Free: not allocated");
 
 	cs = ((cache_system_t *)c->data) - 1;
 
@@ -819,10 +819,10 @@
 	cache_system_t	*cs;
 
 	if (c->data)
-		Sys_Error ("Cache_Alloc: allready allocated");
+		fatal ("Cache_Alloc: allready allocated");
 	
 	if (size <= 0)
-		Sys_Error ("Cache_Alloc: size %d", size);
+		fatal ("Cache_Alloc: size %d", size);
 
 	size = (size + sizeof(*cs) + 15) & ~15;
 
@@ -840,7 +840,7 @@
 	
 	// free the least recently used cahedat
 		if (cache_head.lru_prev == &cache_head)
-			Sys_Error ("Cache_Alloc: out of memory");
+			fatal ("Cache_Alloc: out of memory");
 													// not enough memory at all
 		Cache_Free ( cache_head.lru_prev->user );
 	} 
@@ -873,7 +873,7 @@
 		if (p < com_argc-1)
 			zonesize = atoi(com_argv[p+1]) * 1024;
 		else
-			Sys_Error ("Memory_Init: you must specify a size in KB after -zone");
+			fatal ("Memory_Init: you must specify a size in KB after -zone");
 	}
 	mainzone = Hunk_AllocName (zonesize, "zone" );
 	Z_ClearZone (mainzone, zonesize);