1 /* 2 Copyright (C) 1996-1997 Id Software, Inc. 3 4 This program is free software; you can redistribute it and/or 5 modify it under the terms of the GNU General Public License 6 as published by the Free Software Foundation; either version 2 7 of the License, or (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 13 See the GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19 */ 20 // sys_sun.h -- Sun system driver 21 22 #include "quakedef.h" 23 #include "errno.h" 24 #include <sys/types.h> 25 #include <sys/time.h> 26 #include <sys/stat.h> 27 #include <sys/mman.h> 28 #include <sys/param.h> 29 #include <fcntl.h> 30 #include <stddef.h> 31 #include <sys/types.h> 32 #include <fcntl.h> 33 #include <sys/mman.h> 34 #include <stdio.h> 35 36 qboolean isDedicated; 37 38 /* 39 =============================================================================== 40 41 FILE IO 42 43 =============================================================================== 44 */ 45 46 #define MAX_HANDLES 10 47 48 typedef struct 49 { 50 FILE *hFile; 51 char *pMap; 52 int nLen; 53 int nPos; 54 } MEMFILE; 55 56 MEMFILE sys_handles[MAX_HANDLES]; 57 58 int findhandle (void) 59 { 60 int i; 61 62 for (i=1 ; i<MAX_HANDLES ; i++) 63 if (!sys_handles[i].hFile) 64 return i; 65 Sys_Error ("out of handles"); 66 return -1; 67 } 68 69 /* 70 ================ 71 filelength 72 ================ 73 */ 74 int filelength (FILE *f) 75 { 76 int pos; 77 int end; 78 79 pos = ftell (f); 80 fseek (f, 0, SEEK_END); 81 end = ftell (f); 82 fseek (f, pos, SEEK_SET); 83 84 return end; 85 } 86 87 int Sys_FileOpenRead (char *path, int *hndl) 88 { 89 FILE *f; 90 int i; 91 92 i = findhandle (); 93 94 f = fopen(path, "rb"); 95 if (!f) 96 { 97 *hndl = -1; 98 return -1; 99 } 100 sys_handles[i].hFile = f; 101 sys_handles[i].nLen = filelength(f); 102 sys_handles[i].nPos = 0; 103 sys_handles[i].pMap = mmap( 0, sys_handles[i].nLen, PROT_READ, MAP_SHARED, fileno( sys_handles[i].hFile ), 0 ); 104 if (!sys_handles[i].pMap || (sys_handles[i].pMap == (char *)-1)) 105 { 106 printf( "mmap %s failed!", path ); 107 sys_handles[i].pMap = NULL; 108 } 109 110 *hndl = i; 111 112 return( sys_handles[i].nLen ); 113 } 114 115 int Sys_FileOpenWrite (char *path) 116 { 117 FILE *f; 118 int i; 119 120 i = findhandle (); 121 122 f = fopen(path, "wb"); 123 if (!f) 124 Sys_Error ("Error opening %s: %s", path,strerror(errno)); 125 sys_handles[i].hFile = f; 126 sys_handles[i].nLen = 0; 127 sys_handles[i].nPos = 0; 128 sys_handles[i].pMap = NULL; 129 130 return i; 131 } 132 133 void Sys_FileClose (int handle) 134 { 135 if (sys_handles[handle].pMap) 136 if (munmap( sys_handles[handle].pMap, sys_handles[handle].nLen ) != 0) 137 printf( "failed to unmap handle %d\n", handle ); 138 139 fclose (sys_handles[handle].hFile); 140 sys_handles[handle].hFile = NULL; 141 } 142 143 void Sys_FileSeek (int handle, int position) 144 { 145 if (sys_handles[handle].pMap) 146 { 147 sys_handles[handle].nPos = position; 148 } 149 else fseek (sys_handles[handle].hFile, position, SEEK_SET); 150 } 151 152 int Sys_FileRead (int handle, void *dest, int count) 153 { 154 if (sys_handles[handle].pMap) 155 { 156 int nPos = sys_handles[handle].nPos; 157 if (count < 0) count = 0; 158 if (nPos + count > sys_handles[handle].nLen) 159 count = sys_handles[handle].nLen - nPos; 160 memcpy( dest, &sys_handles[handle].pMap[nPos], count ); 161 sys_handles[handle].nPos = nPos + count; 162 return( count ); 163 } 164 else return fread (dest, 1, count, sys_handles[handle].hFile); 165 } 166 167 int Sys_FileWrite (int handle, void *data, int count) 168 { 169 if (sys_handles[handle].pMap) 170 Sys_Error( "Attempted to write to read-only file %d!\n", handle ); 171 return fwrite (data, 1, count, sys_handles[handle].hFile); 172 } 173 174 int Sys_FileTime (char *path) 175 { 176 FILE *f; 177 178 f = fopen(path, "rb"); 179 if (f) 180 { 181 fclose(f); 182 return 1; 183 } 184 185 return -1; 186 } 187 188 void Sys_mkdir (char *path) 189 { 190 mkdir( path, 0777 ); 191 } 192 193 /* 194 =============================================================================== 195 196 SYSTEM IO 197 198 =============================================================================== 199 */ 200 201 void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length) 202 { 203 204 int r; 205 unsigned long addr; 206 int psize = getpagesize(); 207 208 addr = (startaddr & ~(psize-1)) - psize; 209 210 // fprintf(stderr, "writable code %lx(%lx)-%lx, length=%lx\n", startaddr, 211 // addr, startaddr+length, length); 212 213 r = mprotect((char*)addr, length + startaddr - addr + psize, 7); 214 215 if (r < 0) 216 Sys_Error("Protection change failed\n"); 217 218 } 219 220 221 void Sys_Error (char *error, ...) 222 { 223 va_list argptr; 224 225 printf ("Sys_Error: "); 226 va_start (argptr,error); 227 vprintf (error,argptr); 228 va_end (argptr); 229 printf ("\n"); 230 Host_Shutdown(); 231 exit (1); 232 } 233 234 void Sys_Printf (char *fmt, ...) 235 { 236 va_list argptr; 237 238 va_start (argptr,fmt); 239 vprintf (fmt,argptr); 240 va_end (argptr); 241 } 242 243 void Sys_Quit (void) 244 { 245 Host_Shutdown(); 246 exit (0); 247 } 248 249 double Sys_FloatTime (void) 250 { 251 struct timeval tp; 252 struct timezone tzp; 253 static int secbase; 254 255 gettimeofday(&tp, &tzp); 256 257 if (!secbase) 258 { 259 secbase = tp.tv_sec; 260 return tp.tv_usec/1000000.0; 261 } 262 263 return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0; 264 } 265 266 char *Sys_ConsoleInput (void) 267 { 268 static char text[256]; 269 int len; 270 fd_set readfds; 271 int ready; 272 struct timeval timeout; 273 274 timeout.tv_sec = 0; 275 timeout.tv_usec = 0; 276 FD_ZERO(&readfds); 277 FD_SET(0, &readfds); 278 ready = select(1, &readfds, 0, 0, &timeout); 279 280 if (ready>0) 281 { 282 len = read (0, text, sizeof(text)); 283 if (len >= 1) 284 { 285 text[len-1] = 0; // rip off the /n and terminate 286 return text; 287 } 288 } 289 290 return 0; 291 } 292 293 void Sys_Sleep (void) 294 { 295 } 296 297 #if !id386 298 void Sys_HighFPPrecision (void) 299 { 300 } 301 302 void Sys_LowFPPrecision (void) 303 { 304 } 305 #endif 306 307 void Sys_Init(void) 308 { 309 #if id386 310 Sys_SetFPCW(); 311 #endif 312 } 313 314 //============================================================================= 315 316 int main (int argc, char **argv) 317 { 318 static quakeparms_t parms; 319 float time, oldtime, newtime; 320 321 parms.memsize = 16*1024*1024; 322 parms.membase = malloc (parms.memsize); 323 parms.basedir = "."; 324 parms.cachedir = NULL; 325 326 COM_InitArgv (argc, argv); 327 328 parms.argc = com_argc; 329 parms.argv = com_argv; 330 331 printf ("Host_Init\n"); 332 Host_Init (&parms); 333 334 Sys_Init(); 335 336 // unroll the simulation loop to give the video side a chance to see _vid_default_mode 337 Host_Frame( 0.1 ); 338 VID_SetDefaultMode(); 339 340 oldtime = Sys_FloatTime(); 341 while (1) 342 { 343 newtime = Sys_FloatTime(); 344 Host_Frame (newtime - oldtime); 345 oldtime = newtime; 346 } 347 return 0; 348 } 349 350 351 352 353