diff --git a/DOOM1.WAD b/DOOM1.WAD new file mode 100644 index 0000000..1a58f66 Binary files /dev/null and b/DOOM1.WAD differ diff --git a/doom.c b/doom.c new file mode 100644 index 0000000..f63defa --- /dev/null +++ b/doom.c @@ -0,0 +1,99 @@ +#pragma warning( disable: 4113 ) +#pragma warning( disable: 4311 ) +#pragma warning( disable: 4047 ) +#pragma warning( disable: 4024 ) +#pragma warning( disable: 4312 ) +#pragma warning( disable: 4020 ) +#pragma warning( disable: 4700 ) +#pragma warning( disable: 4133 ) +#pragma warning( disable: 4142 ) + +#define strcasecmp stricmp +#define strncasecmp strnicmp + +#define CONCAT_IMPL( x, y ) x##y +#define CONCAT( x, y ) CONCAT_IMPL( x, y ) +#define rcsid CONCAT( rcsid, __COUNTER__ ) + +#define open doom_open +#define close doom_close +#include "libs_win32/unistd.h" +#include "linuxdoom-1.10/am_map.c" +#include "linuxdoom-1.10/doomdef.c" +#include "linuxdoom-1.10/doomstat.c" +#include "linuxdoom-1.10/dstrings.c" +#include "linuxdoom-1.10/d_items.c" +#include "linuxdoom-1.10/d_main.c" +#include "linuxdoom-1.10/d_net.c" +#include "linuxdoom-1.10/f_finale.c" +#include "linuxdoom-1.10/f_wipe.c" +#include "linuxdoom-1.10/g_game.c" +#include "linuxdoom-1.10/hu_lib.c" +#include "linuxdoom-1.10/hu_stuff.c" +#include "linuxdoom-1.10/info.c" +#include "linuxdoom-1.10/i_main.c" +#include "linuxdoom-1.10/i_sound.c" +#include "linuxdoom-1.10/i_system.c" +#include "linuxdoom-1.10/i_video.c" +#include "linuxdoom-1.10/m_argv.c" +#include "linuxdoom-1.10/m_bbox.c" +#include "linuxdoom-1.10/m_cheat.c" +#include "linuxdoom-1.10/m_fixed.c" +#include "linuxdoom-1.10/m_random.c" +#include "linuxdoom-1.10/m_swap.c" +#include "linuxdoom-1.10/p_ceilng.c" +#include "linuxdoom-1.10/p_doors.c" +#include "linuxdoom-1.10/p_enemy.c" +#include "linuxdoom-1.10/p_floor.c" +#include "linuxdoom-1.10/p_inter.c" +#include "linuxdoom-1.10/p_lights.c" +#include "linuxdoom-1.10/p_map.c" +#include "linuxdoom-1.10/p_maputl.c" +#include "linuxdoom-1.10/p_mobj.c" +#include "linuxdoom-1.10/p_plats.c" +#include "linuxdoom-1.10/p_pspr.c" +#include "linuxdoom-1.10/p_saveg.c" +#include "linuxdoom-1.10/p_setup.c" +#include "linuxdoom-1.10/p_sight.c" +#include "linuxdoom-1.10/p_spec.c" +#include "linuxdoom-1.10/p_switch.c" +#include "linuxdoom-1.10/p_telept.c" +#include "linuxdoom-1.10/p_tick.c" +#include "linuxdoom-1.10/p_user.c" +#include "linuxdoom-1.10/r_bsp.c" +#include "linuxdoom-1.10/r_data.c" +#include "linuxdoom-1.10/r_draw.c" +#include "linuxdoom-1.10/r_main.c" +#include "linuxdoom-1.10/r_plane.c" +#include "linuxdoom-1.10/r_segs.c" +#include "linuxdoom-1.10/r_sky.c" +#include "linuxdoom-1.10/r_things.c" +#include "linuxdoom-1.10/sounds.c" +#undef BG +#include "linuxdoom-1.10/st_lib.c" +#include "linuxdoom-1.10/st_stuff.c" +#define channels xchannels +#include "linuxdoom-1.10/s_sound.c" +#undef channels +#include "linuxdoom-1.10/tables.c" +#include "linuxdoom-1.10/v_video.c" +#define anim_t wi_anim_t +#define anims wi_anims +#define time wi_time +#include "linuxdoom-1.10/wi_stuff.c" +#undef anims +#undef anim_t +#undef time +#include "linuxdoom-1.10/z_zone.c" + +#undef open +#undef close + +#include +#include "linuxdoom-1.10/m_menu.c" +#include "linuxdoom-1.10/m_misc.c" +#define strupr xstrupr +#include "linuxdoom-1.10/w_wad.c" +#undef strupr + +#include "linuxdoom-1.10/i_net.c" diff --git a/libs_win32/unistd.h b/libs_win32/unistd.h new file mode 100644 index 0000000..4c06b0c --- /dev/null +++ b/libs_win32/unistd.h @@ -0,0 +1,58 @@ +#ifndef _UNISTD_H +#define _UNISTD_H 1 + +/* This is intended as a drop-in replacement for unistd.h on Windows. + * Please add functionality as neeeded. + * https://stackoverflow.com/a/826027/1202830 + */ + +#include +//#include /* for getpid() and the exec..() family */ +//#include /* for _getcwd() and _chdir() */ + +#define srandom srand +#define random rand + +/* Values for the second argument to access. + These may be OR'd together. */ +#define R_OK 4 /* Test for read permission. */ +#define W_OK 2 /* Test for write permission. */ +//#define X_OK 1 /* execute permission - unsupported in windows*/ +#define F_OK 0 /* Test for existence. */ + +#define access _access +#define dup2 _dup2 +#define execve _execve +#define ftruncate _chsize +#define unlink _unlink +#define fileno _fileno +#define getcwd _getcwd +#define chdir _chdir +#define isatty _isatty +#define lseek _lseek +/* read, write, and close are NOT being #defined here, because while there are file handle specific versions for Windows, they probably don't work for sockets. You need to look at your app and consider whether to call e.g. closesocket(). */ +int __cdecl _access( char const* _FileName, int _AccessMode ); +int __cdecl mkdir( char const* _Path ); +long __cdecl filelength( int _FileHandle ); + + +#ifdef _WIN64 +#define ssize_t __int64 +#else +#define ssize_t long +#endif + +#define STDIN_FILENO 0 +#define STDOUT_FILENO 1 +#define STDERR_FILENO 2 +/* should be in some equivalent to */ +//typedef __int8 int8_t; +//typedef __int16 int16_t; +//typedef __int32 int32_t; +//typedef __int64 int64_t; +//typedef unsigned __int8 uint8_t; +//typedef unsigned __int16 uint16_t; +//typedef unsigned __int32 uint32_t; +//typedef unsigned __int64 uint64_t; + +#endif /* unistd.h */ diff --git a/linuxdoom-1.10/d_main.c b/linuxdoom-1.10/d_main.c index 23427e8..e642551 100644 --- a/linuxdoom-1.10/d_main.c +++ b/linuxdoom-1.10/d_main.c @@ -563,14 +563,14 @@ void D_AddFile (char *file) void IdentifyVersion (void) { - char* doom1wad; - char* doomwad; - char* doomuwad; - char* doom2wad; + char* doom1wad = "doom1.wad"; + char* doomwad = "doom.wad"; + char* doomuwad = "doomu.wad"; + char* doom2wad = "doom2.wad"; - char* doom2fwad; - char* plutoniawad; - char* tntwad; + char* doom2fwad = ""; + char* plutoniawad = ""; + char* tntwad = ""; #ifdef NORMALUNIX char *home; @@ -877,7 +877,7 @@ void D_DoomMain (void) if (M_CheckParm("-cdrom")) { printf(D_CDROM); - mkdir("c:\\doomdata",0); + mkdir("c:\\doomdata"); strcpy (basedefault,"c:/doomdata/default.cfg"); } diff --git a/linuxdoom-1.10/doomdef.h b/linuxdoom-1.10/doomdef.h index 1850477..170efe1 100644 --- a/linuxdoom-1.10/doomdef.h +++ b/linuxdoom-1.10/doomdef.h @@ -30,7 +30,7 @@ // Global parameters/defines. // // DOOM version -enum { VERSION = 110 }; +enum { VERSION = 109 }; // Game mode handling - identify IWAD version diff --git a/linuxdoom-1.10/i_net.c b/linuxdoom-1.10/i_net.c index 557f417..52fe0cf 100644 --- a/linuxdoom-1.10/i_net.c +++ b/linuxdoom-1.10/i_net.c @@ -23,326 +23,29 @@ static const char rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $"; -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "i_system.h" -#include "d_event.h" -#include "d_net.h" -#include "m_argv.h" - -#include "doomstat.h" - -#ifdef __GNUG__ -#pragma implementation "i_net.h" -#endif #include "i_net.h" - - - -// For some odd reason... -#define ntohl(x) \ - ((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \ - (((unsigned long int)(x) & 0x0000ff00U) << 8) | \ - (((unsigned long int)(x) & 0x00ff0000U) >> 8) | \ - (((unsigned long int)(x) & 0xff000000U) >> 24))) - -#define ntohs(x) \ - ((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \ - (((unsigned short int)(x) & 0xff00) >> 8))) \ - -#define htonl(x) ntohl(x) -#define htons(x) ntohs(x) - -void NetSend (void); -boolean NetListen (void); - - -// -// NETWORKING -// - -int DOOMPORT = (IPPORT_USERRESERVED +0x1d ); - -int sendsocket; -int insocket; - -struct sockaddr_in sendaddress[MAXNETNODES]; - -void (*netget) (void); -void (*netsend) (void); - - -// -// UDPsocket -// -int UDPsocket (void) -{ - int s; - - // allocate a socket - s = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (s<0) - I_Error ("can't create socket: %s",strerror(errno)); - - return s; -} - -// -// BindToLocalPort -// -void -BindToLocalPort -( int s, - int port ) -{ - int v; - struct sockaddr_in address; - - memset (&address, 0, sizeof(address)); - address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; - address.sin_port = port; - - v = bind (s, (void *)&address, sizeof(address)); - if (v == -1) - I_Error ("BindToPort: bind: %s", strerror(errno)); -} - - -// -// PacketSend -// -void PacketSend (void) -{ - int c; - doomdata_t sw; - - // byte swap - sw.checksum = htonl(netbuffer->checksum); - sw.player = netbuffer->player; - sw.retransmitfrom = netbuffer->retransmitfrom; - sw.starttic = netbuffer->starttic; - sw.numtics = netbuffer->numtics; - for (c=0 ; c< netbuffer->numtics ; c++) - { - sw.cmds[c].forwardmove = netbuffer->cmds[c].forwardmove; - sw.cmds[c].sidemove = netbuffer->cmds[c].sidemove; - sw.cmds[c].angleturn = htons(netbuffer->cmds[c].angleturn); - sw.cmds[c].consistancy = htons(netbuffer->cmds[c].consistancy); - sw.cmds[c].chatchar = netbuffer->cmds[c].chatchar; - sw.cmds[c].buttons = netbuffer->cmds[c].buttons; - } - - //printf ("sending %i\n",gametic); - c = sendto (sendsocket , &sw, doomcom->datalength - ,0,(void *)&sendaddress[doomcom->remotenode] - ,sizeof(sendaddress[doomcom->remotenode])); - - // if (c == -1) - // I_Error ("SendPacket error: %s",strerror(errno)); -} - - -// -// PacketGet -// -void PacketGet (void) -{ - int i; - int c; - struct sockaddr_in fromaddress; - int fromlen; - doomdata_t sw; - - fromlen = sizeof(fromaddress); - c = recvfrom (insocket, &sw, sizeof(sw), 0 - , (struct sockaddr *)&fromaddress, &fromlen ); - if (c == -1 ) - { - if (errno != EWOULDBLOCK) - I_Error ("GetPacket: %s",strerror(errno)); - doomcom->remotenode = -1; // no packet - return; - } - - { - static int first=1; - if (first) - printf("len=%d:p=[0x%x 0x%x] \n", c, *(int*)&sw, *((int*)&sw+1)); - first = 0; - } - - // find remote node number - for (i=0 ; inumnodes ; i++) - if ( fromaddress.sin_addr.s_addr == sendaddress[i].sin_addr.s_addr ) - break; - - if (i == doomcom->numnodes) - { - // packet is not from one of the players (new game broadcast) - doomcom->remotenode = -1; // no packet - return; - } - - doomcom->remotenode = i; // good packet from a game player - doomcom->datalength = c; - - // byte swap - netbuffer->checksum = ntohl(sw.checksum); - netbuffer->player = sw.player; - netbuffer->retransmitfrom = sw.retransmitfrom; - netbuffer->starttic = sw.starttic; - netbuffer->numtics = sw.numtics; - - for (c=0 ; c< netbuffer->numtics ; c++) - { - netbuffer->cmds[c].forwardmove = sw.cmds[c].forwardmove; - netbuffer->cmds[c].sidemove = sw.cmds[c].sidemove; - netbuffer->cmds[c].angleturn = ntohs(sw.cmds[c].angleturn); - netbuffer->cmds[c].consistancy = ntohs(sw.cmds[c].consistancy); - netbuffer->cmds[c].chatchar = sw.cmds[c].chatchar; - netbuffer->cmds[c].buttons = sw.cmds[c].buttons; - } -} - - - -int GetLocalAddress (void) -{ - char hostname[1024]; - struct hostent* hostentry; // host information entry - int v; - - // get local address - v = gethostname (hostname, sizeof(hostname)); - if (v == -1) - I_Error ("GetLocalAddress : gethostname: errno %d",errno); - - hostentry = gethostbyname (hostname); - if (!hostentry) - I_Error ("GetLocalAddress : gethostbyname: couldn't get local host"); - - return *(int *)hostentry->h_addr_list[0]; -} - - // // I_InitNetwork // void I_InitNetwork (void) { - boolean trueval = true; - int i; - int p; - struct hostent* hostentry; // host information entry - doomcom = malloc (sizeof (*doomcom) ); memset (doomcom, 0, sizeof(*doomcom) ); - // set up for network - i = M_CheckParm ("-dup"); - if (i && i< myargc-1) - { - doomcom->ticdup = myargv[i+1][0]-'0'; - if (doomcom->ticdup < 1) - doomcom->ticdup = 1; - if (doomcom->ticdup > 9) - doomcom->ticdup = 9; - } - else doomcom-> ticdup = 1; - - if (M_CheckParm ("-extratic")) - doomcom-> extratics = 1; - else doomcom-> extratics = 0; - - p = M_CheckParm ("-port"); - if (p && p ... - i = M_CheckParm ("-net"); - if (!i) - { - // single player game netgame = false; doomcom->id = DOOMCOM_ID; doomcom->numplayers = doomcom->numnodes = 1; doomcom->deathmatch = false; doomcom->consoleplayer = 0; return; - } - - netsend = PacketSend; - netget = PacketGet; - netgame = true; - - // parse player number and host list - doomcom->consoleplayer = myargv[i+1][0]-'1'; - - doomcom->numnodes = 1; // this node for sure - - i++; - while (++i < myargc && myargv[i][0] != '-') - { - sendaddress[doomcom->numnodes].sin_family = AF_INET; - sendaddress[doomcom->numnodes].sin_port = htons(DOOMPORT); - if (myargv[i][0] == '.') - { - sendaddress[doomcom->numnodes].sin_addr.s_addr - = inet_addr (myargv[i]+1); - } - else - { - hostentry = gethostbyname (myargv[i]); - if (!hostentry) - I_Error ("gethostbyname: couldn't find %s", myargv[i]); - sendaddress[doomcom->numnodes].sin_addr.s_addr - = *(int *)hostentry->h_addr_list[0]; - } - doomcom->numnodes++; - } - - doomcom->id = DOOMCOM_ID; - doomcom->numplayers = doomcom->numnodes; - - // build message to receive - insocket = UDPsocket (); - BindToLocalPort (insocket,htons(DOOMPORT)); - ioctl (insocket, FIONBIO, &trueval); - - sendsocket = UDPsocket (); } void I_NetCmd (void) { - if (doomcom->command == CMD_SEND) - { - netsend (); - } - else if (doomcom->command == CMD_GET) - { - netget (); - } - else - I_Error ("Bad net cmd: %i\n",doomcom->command); } diff --git a/linuxdoom-1.10/i_sound.c b/linuxdoom-1.10/i_sound.c index a327bfa..3acdf21 100644 --- a/linuxdoom-1.10/i_sound.c +++ b/linuxdoom-1.10/i_sound.c @@ -24,365 +24,7 @@ static const char rcsid[] = "$Id: i_unix.c,v 1.5 1997/02/03 22:45:10 b1 Exp $"; -#include -#include -#include - -#include - -#include -#include - -#ifndef LINUX -#include -#endif - -#include -#include -#include - -// Linux voxware output. -#include - -// Timer stuff. Experimental. -#include -#include - -#include "z_zone.h" - -#include "i_system.h" #include "i_sound.h" -#include "m_argv.h" -#include "m_misc.h" -#include "w_wad.h" - -#include "doomdef.h" - -// UNIX hack, to be removed. -#ifdef SNDSERV -// Separate sound server process. -FILE* sndserver=0; -char* sndserver_filename = "./sndserver "; -#elif SNDINTR - -// Update all 30 millisecs, approx. 30fps synchronized. -// Linux resolution is allegedly 10 millisecs, -// scale is microseconds. -#define SOUND_INTERVAL 500 - -// Get the interrupt. Set duration in millisecs. -int I_SoundSetTimer( int duration_of_tick ); -void I_SoundDelTimer( void ); -#else -// None? -#endif - - -// A quick hack to establish a protocol between -// synchronous mix buffer updates and asynchronous -// audio writes. Probably redundant with gametic. -static int flag = 0; - -// The number of internal mixing channels, -// the samples calculated for each mixing step, -// the size of the 16bit, 2 hardware channel (stereo) -// mixing buffer, and the samplerate of the raw data. - - -// Needed for calling the actual sound output. -#define SAMPLECOUNT 512 -#define NUM_CHANNELS 8 -// It is 2 for 16bit, and 2 for two channels. -#define BUFMUL 4 -#define MIXBUFFERSIZE (SAMPLECOUNT*BUFMUL) - -#define SAMPLERATE 11025 // Hz -#define SAMPLESIZE 2 // 16bit - -// The actual lengths of all sound effects. -int lengths[NUMSFX]; - -// The actual output device. -int audio_fd; - -// The global mixing buffer. -// Basically, samples from all active internal channels -// are modifed and added, and stored in the buffer -// that is submitted to the audio device. -signed short mixbuffer[MIXBUFFERSIZE]; - - -// The channel step amount... -unsigned int channelstep[NUM_CHANNELS]; -// ... and a 0.16 bit remainder of last step. -unsigned int channelstepremainder[NUM_CHANNELS]; - - -// The channel data pointers, start and end. -unsigned char* channels[NUM_CHANNELS]; -unsigned char* channelsend[NUM_CHANNELS]; - - -// Time/gametic that the channel started playing, -// used to determine oldest, which automatically -// has lowest priority. -// In case number of active sounds exceeds -// available channels. -int channelstart[NUM_CHANNELS]; - -// The sound in channel handles, -// determined on registration, -// might be used to unregister/stop/modify, -// currently unused. -int channelhandles[NUM_CHANNELS]; - -// SFX id of the playing sound effect. -// Used to catch duplicates (like chainsaw). -int channelids[NUM_CHANNELS]; - -// Pitch to stepping lookup, unused. -int steptable[256]; - -// Volume lookups. -int vol_lookup[128*256]; - -// Hardware left and right channel volume lookup. -int* channelleftvol_lookup[NUM_CHANNELS]; -int* channelrightvol_lookup[NUM_CHANNELS]; - - - - -// -// Safe ioctl, convenience. -// -void -myioctl -( int fd, - int command, - int* arg ) -{ - int rc; - extern int errno; - - rc = ioctl(fd, command, arg); - if (rc < 0) - { - fprintf(stderr, "ioctl(dsp,%d,arg) failed\n", command); - fprintf(stderr, "errno=%d\n", errno); - exit(-1); - } -} - - - - - -// -// This function loads the sound data from the WAD lump, -// for single sound. -// -void* -getsfx -( char* sfxname, - int* len ) -{ - unsigned char* sfx; - unsigned char* paddedsfx; - int i; - int size; - int paddedsize; - char name[20]; - int sfxlump; - - - // Get the sound data from the WAD, allocate lump - // in zone memory. - sprintf(name, "ds%s", sfxname); - - // Now, there is a severe problem with the - // sound handling, in it is not (yet/anymore) - // gamemode aware. That means, sounds from - // DOOM II will be requested even with DOOM - // shareware. - // The sound list is wired into sounds.c, - // which sets the external variable. - // I do not do runtime patches to that - // variable. Instead, we will use a - // default sound for replacement. - if ( W_CheckNumForName(name) == -1 ) - sfxlump = W_GetNumForName("dspistol"); - else - sfxlump = W_GetNumForName(name); - - size = W_LumpLength( sfxlump ); - - // Debug. - // fprintf( stderr, "." ); - //fprintf( stderr, " -loading %s (lump %d, %d bytes)\n", - // sfxname, sfxlump, size ); - //fflush( stderr ); - - sfx = (unsigned char*)W_CacheLumpNum( sfxlump, PU_STATIC ); - - // Pads the sound effect out to the mixing buffer size. - // The original realloc would interfere with zone memory. - paddedsize = ((size-8 + (SAMPLECOUNT-1)) / SAMPLECOUNT) * SAMPLECOUNT; - - // Allocate from zone memory. - paddedsfx = (unsigned char*)Z_Malloc( paddedsize+8, PU_STATIC, 0 ); - // ddt: (unsigned char *) realloc(sfx, paddedsize+8); - // This should interfere with zone memory handling, - // which does not kick in in the soundserver. - - // Now copy and pad. - memcpy( paddedsfx, sfx, size ); - for (i=size ; i> 16); ///(256*256); - seperation = seperation - 257; - rightvol = - volume - ((volume*seperation*seperation) >> 16); - - // Sanity check, clamp volume. - if (rightvol < 0 || rightvol > 127) - I_Error("rightvol out of bounds"); - - if (leftvol < 0 || leftvol > 127) - I_Error("leftvol out of bounds"); - - // Get the proper lookup table piece - // for this volume level??? - channelleftvol_lookup[slot] = &vol_lookup[leftvol*256]; - channelrightvol_lookup[slot] = &vol_lookup[rightvol*256]; - - // Preserve sound SFX id, - // e.g. for avoiding duplicates of chainsaw. - channelids[slot] = sfxid; - - // You tell me. - return rc; -} - - - - // // SFX API @@ -395,32 +37,6 @@ addsfx // void I_SetChannels() { - // Init internal lookups (raw data, mixing buffer, channels). - // This function sets up internal lookups used during - // the mixing process. - int i; - int j; - - int* steptablemid = steptable + 128; - - // Okay, reset internal mixing channels to zero. - /*for (i=0; i> 16; - // Limit to LSB??? - channelstepremainder[ chan ] &= 65536-1; - - // Check whether we are done. - if (channels[ chan ] >= channelsend[ chan ]) - channels[ chan ] = 0; - } - } - - // Clamp to range. Left hardware channel. - // Has been char instead of short. - // if (dl > 127) *leftout = 127; - // else if (dl < -128) *leftout = -128; - // else *leftout = dl; - - if (dl > 0x7fff) - *leftout = 0x7fff; - else if (dl < -0x8000) - *leftout = -0x8000; - else - *leftout = dl; - - // Same for right hardware channel. - if (dr > 0x7fff) - *rightout = 0x7fff; - else if (dr < -0x8000) - *rightout = -0x8000; - else - *rightout = dr; - - // Increment current pointers in mixbuffer. - leftout += step; - rightout += step; - } - -#ifdef SNDINTR - // Debug check. - if ( flag ) - { - misses += flag; - flag = 0; - } - - if ( misses > 10 ) - { - fprintf( stderr, "I_SoundUpdate: missed 10 buffer writes\n"); - misses = 0; - } - - // Increment flag for update. - flag++; -#endif } @@ -666,7 +144,6 @@ void I_SubmitSound(void) { // Write it to DSP device. - write(audio_fd, mixbuffer, SAMPLECOUNT*BUFMUL); } @@ -692,39 +169,6 @@ I_UpdateSoundParams void I_ShutdownSound(void) { -#ifdef SNDSERV - if (sndserver) - { - // Send a "quit" command. - fprintf(sndserver, "q\n"); - fflush(sndserver); - } -#else - // Wait till all pending sounds are finished. - int done = 0; - int i; - - - // FIXME (below). - fprintf( stderr, "I_ShutdownSound: NOT finishing pending sounds\n"); - fflush( stderr ); - - while ( !done ) - { - for( i=0 ; i<8 && !channels[i] ; i++); - - // FIXME. No proper channel output. - //if (i==8) - done=1; - } -#ifdef SNDINTR - I_SoundDelTimer(); -#endif - - // Cleaning up -releasing the DSP device. - close ( audio_fd ); -#endif - // Done. return; } @@ -737,91 +181,6 @@ void I_ShutdownSound(void) void I_InitSound() { -#ifdef SNDSERV - char buffer[256]; - - if (getenv("DOOMWADDIR")) - sprintf(buffer, "%s/%s", - getenv("DOOMWADDIR"), - sndserver_filename); - else - sprintf(buffer, "%s", sndserver_filename); - - // start sound process - if ( !access(buffer, X_OK) ) - { - strcat(buffer, " -quiet"); - sndserver = popen(buffer, "w"); - } - else - fprintf(stderr, "Could not start sound server [%s]\n", buffer); -#else - - int i; - -#ifdef SNDINTR - fprintf( stderr, "I_SoundSetTimer: %d microsecs\n", SOUND_INTERVAL ); - I_SoundSetTimer( SOUND_INTERVAL ); -#endif - - // Secure and configure sound device first. - fprintf( stderr, "I_InitSound: "); - - audio_fd = open("/dev/dsp", O_WRONLY); - if (audio_fd<0) - fprintf(stderr, "Could not open /dev/dsp\n"); - - - i = 11 | (2<<16); - myioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, &i); - myioctl(audio_fd, SNDCTL_DSP_RESET, 0); - - i=SAMPLERATE; - - myioctl(audio_fd, SNDCTL_DSP_SPEED, &i); - - i=1; - myioctl(audio_fd, SNDCTL_DSP_STEREO, &i); - - myioctl(audio_fd, SNDCTL_DSP_GETFMTS, &i); - - if (i&=AFMT_S16_LE) - myioctl(audio_fd, SNDCTL_DSP_SETFMT, &i); - else - fprintf(stderr, "Could not play signed 16 data\n"); - - fprintf(stderr, " configured audio device\n" ); - - - // Initialize external data (all sounds) at start, keep static. - fprintf( stderr, "I_InitSound: "); - - for (i=1 ; idata; - lengths[i] = lengths[(S_sfx[i].link - S_sfx)/sizeof(sfxinfo_t)]; - } - } - - fprintf( stderr, " pre-cached all sound data\n"); - - // Now initialize mixbuffer with zero. - for ( i = 0; i< MIXBUFFERSIZE; i++ ) - mixbuffer[i] = 0; - - // Finished initialization. - fprintf(stderr, "I_InitSound: sound module ready\n"); - -#endif } @@ -890,96 +249,3 @@ int I_QrySongPlaying(int handle) -// -// Experimental stuff. -// A Linux timer interrupt, for asynchronous -// sound output. -// I ripped this out of the Timer class in -// our Difference Engine, including a few -// SUN remains... -// -#ifdef sun - typedef sigset_t tSigSet; -#else - typedef int tSigSet; -#endif - - -// We might use SIGVTALRM and ITIMER_VIRTUAL, if the process -// time independend timer happens to get lost due to heavy load. -// SIGALRM and ITIMER_REAL doesn't really work well. -// There are issues with profiling as well. -static int /*__itimer_which*/ itimer = ITIMER_REAL; - -static int sig = SIGALRM; - -// Interrupt handler. -void I_HandleSoundTimer( int ignore ) -{ - // Debug. - //fprintf( stderr, "%c", '+' ); fflush( stderr ); - - // Feed sound device if necesary. - if ( flag ) - { - // See I_SubmitSound(). - // Write it to DSP device. - write(audio_fd, mixbuffer, SAMPLECOUNT*BUFMUL); - - // Reset flag counter. - flag = 0; - } - else - return; - - // UNUSED, but required. - ignore = 0; - return; -} - -// Get the interrupt. Set duration in millisecs. -int I_SoundSetTimer( int duration_of_tick ) -{ - // Needed for gametick clockwork. - struct itimerval value; - struct itimerval ovalue; - struct sigaction act; - struct sigaction oact; - - int res; - - // This sets to SA_ONESHOT and SA_NOMASK, thus we can not use it. - // signal( _sig, handle_SIG_TICK ); - - // Now we have to change this attribute for repeated calls. - act.sa_handler = I_HandleSoundTimer; -#ifndef sun - //ac t.sa_mask = _sig; -#endif - act.sa_flags = SA_RESTART; - - sigaction( sig, &act, &oact ); - - value.it_interval.tv_sec = 0; - value.it_interval.tv_usec = duration_of_tick; - value.it_value.tv_sec = 0; - value.it_value.tv_usec = duration_of_tick; - - // Error is -1. - res = setitimer( itimer, &value, &ovalue ); - - // Debug. - if ( res == -1 ) - fprintf( stderr, "I_SoundSetTimer: interrupt n.a.\n"); - - return res; -} - - -// Remove the interrupt. Set duration to zero. -void I_SoundDelTimer() -{ - // Debug. - if ( I_SoundSetTimer( 0 ) == -1) - fprintf( stderr, "I_SoundDelTimer: failed to remove interrupt. Doh!\n"); -} diff --git a/linuxdoom-1.10/i_sound.h b/linuxdoom-1.10/i_sound.h index bbfabac..71aecd7 100644 --- a/linuxdoom-1.10/i_sound.h +++ b/linuxdoom-1.10/i_sound.h @@ -25,12 +25,6 @@ #include "doomdef.h" -// UNIX hack, to be removed. -#ifdef SNDSERV -#include -extern FILE* sndserver; -extern char* sndserver_filename; -#endif #include "doomstat.h" #include "sounds.h" diff --git a/linuxdoom-1.10/i_system.c b/linuxdoom-1.10/i_system.c index 1b67d51..bacd67a 100644 --- a/linuxdoom-1.10/i_system.c +++ b/linuxdoom-1.10/i_system.c @@ -20,99 +20,84 @@ // //----------------------------------------------------------------------------- -static const char -rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $"; - - -#include -#include -#include - -#include -#include -#include - +#include "doomtype.h" #include "doomdef.h" -#include "m_misc.h" -#include "i_video.h" -#include "i_sound.h" - -#include "d_net.h" -#include "g_game.h" - -#ifdef __GNUG__ -#pragma implementation "i_system.h" -#endif -#include "i_system.h" +#include "doomstat.h" +#include "d_ticcmd.h" +#include +#include +void I_Init (void) +{ + I_InitSound(); + I_InitGraphics(); +} int mb_used = 6; -void -I_Tactile -( int on, - int off, - int total ) -{ - // UNUSED. - on = off = total = 0; -} - -ticcmd_t emptycmd; -ticcmd_t* I_BaseTiccmd(void) -{ - return &emptycmd; -} - - -int I_GetHeapSize (void) -{ - return mb_used*1024*1024; -} - -byte* I_ZoneBase (int* size) +// Called by startup code +// to get the ammount of memory to malloc +// for the zone management. +byte* I_ZoneBase (int *size) { *size = mb_used*1024*1024; return (byte *) malloc (*size); } - -// -// I_GetTime -// returns time in 1/70th second tics -// -int I_GetTime (void) +// Called by D_DoomLoop, +// returns current time in tics. +int I_GetTime (void) { - struct timeval tp; - struct timezone tzp; - int newtics; - static int basetime=0; - - gettimeofday(&tp, &tzp); - if (!basetime) - basetime = tp.tv_sec; - newtics = (tp.tv_sec-basetime)*TICRATE + tp.tv_usec*TICRATE/1000000; - return newtics; + return clock()/(CLOCKS_PER_SEC/TICRATE); } // -// I_Init +// Called by D_DoomLoop, +// called before processing any tics in a frame +// (just after displaying a frame). +// Time consuming syncronous operations +// are performed here (joystick reading). +// Can call D_PostEvent. // -void I_Init (void) +void I_StartFrame (void) { - I_InitSound(); - // I_InitGraphics(); } + // -// I_Quit -// +// Called by D_DoomLoop, +// called before processing each tic in a frame. +// Quick syncronous operations are performed here. +// Can call D_PostEvent. +void I_StartTic (void) +{ +} + +// Asynchronous interrupt functions should maintain private queues +// that are read by the synchronous functions +// to be converted into events. + +// Either returns a null ticcmd, +// or calls a loadable driver to build it. +// This ticcmd will then be modified by the gameloop +// for normal input. + +ticcmd_t emptycmd; + +ticcmd_t* I_BaseTiccmd (void) +{ + return &emptycmd; +} + + +// Called by M_Responder when quit is selected. +// Clean exit, displays sell blurb. void I_Quit (void) { D_QuitNetGame (); @@ -123,28 +108,11 @@ void I_Quit (void) exit(0); } -void I_WaitVBL(int count) -{ -#ifdef SGI - sginap(1); -#else -#ifdef SUN - sleep(0); -#else - usleep (count * (1000000/70) ); -#endif -#endif -} -void I_BeginRead(void) -{ -} -void I_EndRead(void) -{ -} - -byte* I_AllocLow(int length) +// Allocates from low memory under dos, +// just mallocs under unix +byte* I_AllocLow (int length) { byte* mem; @@ -153,11 +121,12 @@ byte* I_AllocLow(int length) return mem; } +void I_Tactile (int on, int off, int total) +{ + // UNUSED. + on = off = total = 0; +} -// -// I_Error -// -extern boolean demorecording; void I_Error (char *error, ...) { @@ -181,3 +150,4 @@ void I_Error (char *error, ...) exit(-1); } + diff --git a/linuxdoom-1.10/i_video.c b/linuxdoom-1.10/i_video.c index 9b311b3..c5e87e0 100644 --- a/linuxdoom-1.10/i_video.c +++ b/linuxdoom-1.10/i_video.c @@ -24,1027 +24,37 @@ static const char rcsid[] = "$Id: i_x.c,v 1.6 1997/02/03 22:45:10 b1 Exp $"; -#include -#include -#include -#include - -#include -#include -#include - -#include -// Had to dig up XShm.c for this one. -// It is in the libXext, but not in the XFree86 headers. -#ifdef LINUX -int XShmGetEventBase( Display* dpy ); // problems with g++? -#endif - -#include -#include -#include -#include - -#include -#include -#include - -#include "doomstat.h" -#include "i_system.h" -#include "v_video.h" -#include "m_argv.h" -#include "d_main.h" - #include "doomdef.h" +#include "doomtype.h" -#define POINTER_WARP_COUNTDOWN 1 - -Display* X_display=0; -Window X_mainWindow; -Colormap X_cmap; -Visual* X_visual; -GC X_gc; -XEvent X_event; -int X_screen; -XVisualInfo X_visualinfo; -XImage* image; -int X_width; -int X_height; - -// MIT SHared Memory extension. -boolean doShm; - -XShmSegmentInfo X_shminfo; -int X_shmeventtype; - -// Fake mouse handling. -// This cannot work properly w/o DGA. -// Needs an invisible mouse cursor at least. -boolean grabMouse; -int doPointerWarp = POINTER_WARP_COUNTDOWN; - -// Blocky mode, -// replace each 320x200 pixel with multiply*multiply pixels. -// According to Dave Taylor, it still is a bonehead thing -// to use .... -static int multiply=1; - - -// -// Translates the key currently in X_event -// - -int xlatekey(void) +void I_InitGraphics (void) { - - int rc; - - switch(rc = XKeycodeToKeysym(X_display, X_event.xkey.keycode, 0)) - { - case XK_Left: rc = KEY_LEFTARROW; break; - case XK_Right: rc = KEY_RIGHTARROW; break; - case XK_Down: rc = KEY_DOWNARROW; break; - case XK_Up: rc = KEY_UPARROW; break; - case XK_Escape: rc = KEY_ESCAPE; break; - case XK_Return: rc = KEY_ENTER; break; - case XK_Tab: rc = KEY_TAB; break; - case XK_F1: rc = KEY_F1; break; - case XK_F2: rc = KEY_F2; break; - case XK_F3: rc = KEY_F3; break; - case XK_F4: rc = KEY_F4; break; - case XK_F5: rc = KEY_F5; break; - case XK_F6: rc = KEY_F6; break; - case XK_F7: rc = KEY_F7; break; - case XK_F8: rc = KEY_F8; break; - case XK_F9: rc = KEY_F9; break; - case XK_F10: rc = KEY_F10; break; - case XK_F11: rc = KEY_F11; break; - case XK_F12: rc = KEY_F12; break; - - case XK_BackSpace: - case XK_Delete: rc = KEY_BACKSPACE; break; - - case XK_Pause: rc = KEY_PAUSE; break; - - case XK_KP_Equal: - case XK_equal: rc = KEY_EQUALS; break; - - case XK_KP_Subtract: - case XK_minus: rc = KEY_MINUS; break; - - case XK_Shift_L: - case XK_Shift_R: - rc = KEY_RSHIFT; - break; - - case XK_Control_L: - case XK_Control_R: - rc = KEY_RCTRL; - break; - - case XK_Alt_L: - case XK_Meta_L: - case XK_Alt_R: - case XK_Meta_R: - rc = KEY_RALT; - break; - - default: - if (rc >= XK_space && rc <= XK_asciitilde) - rc = rc - XK_space + ' '; - if (rc >= 'A' && rc <= 'Z') - rc = rc - 'A' + 'a'; - break; - } - - return rc; - } + void I_ShutdownGraphics(void) { - // Detach from X server - if (!XShmDetach(X_display, &X_shminfo)) - I_Error("XShmDetach() failed in I_ShutdownGraphics()"); - - // Release shared memory. - shmdt(X_shminfo.shmaddr); - shmctl(X_shminfo.shmid, IPC_RMID, 0); - - // Paranoia. - image->data = NULL; } - - -// -// I_StartFrame -// -void I_StartFrame (void) -{ - // er? - -} - -static int lastmousex = 0; -static int lastmousey = 0; -boolean mousemoved = false; -boolean shmFinished; - -void I_GetEvent(void) -{ - - event_t event; - - // put event-grabbing stuff in here - XNextEvent(X_display, &X_event); - switch (X_event.type) - { - case KeyPress: - event.type = ev_keydown; - event.data1 = xlatekey(); - D_PostEvent(&event); - // fprintf(stderr, "k"); - break; - case KeyRelease: - event.type = ev_keyup; - event.data1 = xlatekey(); - D_PostEvent(&event); - // fprintf(stderr, "ku"); - break; - case ButtonPress: - event.type = ev_mouse; - event.data1 = - (X_event.xbutton.state & Button1Mask) - | (X_event.xbutton.state & Button2Mask ? 2 : 0) - | (X_event.xbutton.state & Button3Mask ? 4 : 0) - | (X_event.xbutton.button == Button1) - | (X_event.xbutton.button == Button2 ? 2 : 0) - | (X_event.xbutton.button == Button3 ? 4 : 0); - event.data2 = event.data3 = 0; - D_PostEvent(&event); - // fprintf(stderr, "b"); - break; - case ButtonRelease: - event.type = ev_mouse; - event.data1 = - (X_event.xbutton.state & Button1Mask) - | (X_event.xbutton.state & Button2Mask ? 2 : 0) - | (X_event.xbutton.state & Button3Mask ? 4 : 0); - // suggest parentheses around arithmetic in operand of | - event.data1 = - event.data1 - ^ (X_event.xbutton.button == Button1 ? 1 : 0) - ^ (X_event.xbutton.button == Button2 ? 2 : 0) - ^ (X_event.xbutton.button == Button3 ? 4 : 0); - event.data2 = event.data3 = 0; - D_PostEvent(&event); - // fprintf(stderr, "bu"); - break; - case MotionNotify: - event.type = ev_mouse; - event.data1 = - (X_event.xmotion.state & Button1Mask) - | (X_event.xmotion.state & Button2Mask ? 2 : 0) - | (X_event.xmotion.state & Button3Mask ? 4 : 0); - event.data2 = (X_event.xmotion.x - lastmousex) << 2; - event.data3 = (lastmousey - X_event.xmotion.y) << 2; - - if (event.data2 || event.data3) - { - lastmousex = X_event.xmotion.x; - lastmousey = X_event.xmotion.y; - if (X_event.xmotion.x != X_width/2 && - X_event.xmotion.y != X_height/2) - { - D_PostEvent(&event); - // fprintf(stderr, "m"); - mousemoved = false; - } else - { - mousemoved = true; - } - } - break; - - case Expose: - case ConfigureNotify: - break; - - default: - if (doShm && X_event.type == X_shmeventtype) shmFinished = true; - break; - } - -} - -Cursor -createnullcursor -( Display* display, - Window root ) -{ - Pixmap cursormask; - XGCValues xgc; - GC gc; - XColor dummycolour; - Cursor cursor; - - cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/); - xgc.function = GXclear; - gc = XCreateGC(display, cursormask, GCFunction, &xgc); - XFillRectangle(display, cursormask, gc, 0, 0, 1, 1); - dummycolour.pixel = 0; - dummycolour.red = 0; - dummycolour.flags = 04; - cursor = XCreatePixmapCursor(display, cursormask, cursormask, - &dummycolour,&dummycolour, 0,0); - XFreePixmap(display,cursormask); - XFreeGC(display,gc); - return cursor; -} - -// -// I_StartTic -// -void I_StartTic (void) -{ - - if (!X_display) - return; - - while (XPending(X_display)) - I_GetEvent(); - - // Warp the pointer back to the middle of the window - // or it will wander off - that is, the game will - // loose input focus within X11. - if (grabMouse) - { - if (!--doPointerWarp) - { - XWarpPointer( X_display, - None, - X_mainWindow, - 0, 0, - 0, 0, - X_width/2, X_height/2); - - doPointerWarp = POINTER_WARP_COUNTDOWN; - } - } - - mousemoved = false; - -} - - -// -// I_UpdateNoBlit -// -void I_UpdateNoBlit (void) -{ - // what is this? -} - -// -// I_FinishUpdate -// -void I_FinishUpdate (void) -{ - - static int lasttic; - int tics; - int i; - // UNUSED static unsigned char *bigscreen=0; - - // draws little dots on the bottom of the screen - if (devparm) - { - - i = I_GetTime(); - tics = i - lasttic; - lasttic = i; - if (tics > 20) tics = 20; - - for (i=0 ; idata[i*X_width]; - - y = SCREENHEIGHT; - while (y--) - { - x = SCREENWIDTH; - do - { - fouripixels = *ilineptr++; - twoopixels = (fouripixels & 0xff000000) - | ((fouripixels>>8) & 0xffff00) - | ((fouripixels>>16) & 0xff); - twomoreopixels = ((fouripixels<<16) & 0xff000000) - | ((fouripixels<<8) & 0xffff00) - | (fouripixels & 0xff); -#ifdef __BIG_ENDIAN__ - *olineptrs[0]++ = twoopixels; - *olineptrs[1]++ = twoopixels; - *olineptrs[0]++ = twomoreopixels; - *olineptrs[1]++ = twomoreopixels; -#else - *olineptrs[0]++ = twomoreopixels; - *olineptrs[1]++ = twomoreopixels; - *olineptrs[0]++ = twoopixels; - *olineptrs[1]++ = twoopixels; -#endif - } while (x-=4); - olineptrs[0] += X_width/4; - olineptrs[1] += X_width/4; - } - - } - else if (multiply == 3) - { - unsigned int *olineptrs[3]; - unsigned int *ilineptr; - int x, y, i; - unsigned int fouropixels[3]; - unsigned int fouripixels; - - ilineptr = (unsigned int *) (screens[0]); - for (i=0 ; i<3 ; i++) - olineptrs[i] = (unsigned int *) &image->data[i*X_width]; - - y = SCREENHEIGHT; - while (y--) - { - x = SCREENWIDTH; - do - { - fouripixels = *ilineptr++; - fouropixels[0] = (fouripixels & 0xff000000) - | ((fouripixels>>8) & 0xff0000) - | ((fouripixels>>16) & 0xffff); - fouropixels[1] = ((fouripixels<<8) & 0xff000000) - | (fouripixels & 0xffff00) - | ((fouripixels>>8) & 0xff); - fouropixels[2] = ((fouripixels<<16) & 0xffff0000) - | ((fouripixels<<8) & 0xff00) - | (fouripixels & 0xff); -#ifdef __BIG_ENDIAN__ - *olineptrs[0]++ = fouropixels[0]; - *olineptrs[1]++ = fouropixels[0]; - *olineptrs[2]++ = fouropixels[0]; - *olineptrs[0]++ = fouropixels[1]; - *olineptrs[1]++ = fouropixels[1]; - *olineptrs[2]++ = fouropixels[1]; - *olineptrs[0]++ = fouropixels[2]; - *olineptrs[1]++ = fouropixels[2]; - *olineptrs[2]++ = fouropixels[2]; -#else - *olineptrs[0]++ = fouropixels[2]; - *olineptrs[1]++ = fouropixels[2]; - *olineptrs[2]++ = fouropixels[2]; - *olineptrs[0]++ = fouropixels[1]; - *olineptrs[1]++ = fouropixels[1]; - *olineptrs[2]++ = fouropixels[1]; - *olineptrs[0]++ = fouropixels[0]; - *olineptrs[1]++ = fouropixels[0]; - *olineptrs[2]++ = fouropixels[0]; -#endif - } while (x-=4); - olineptrs[0] += 2*X_width/4; - olineptrs[1] += 2*X_width/4; - olineptrs[2] += 2*X_width/4; - } - - } - else if (multiply == 4) - { - // Broken. Gotta fix this some day. - void Expand4(unsigned *, double *); - Expand4 ((unsigned *)(screens[0]), (double *) (image->data)); - } - - if (doShm) - { - - if (!XShmPutImage( X_display, - X_mainWindow, - X_gc, - image, - 0, 0, - 0, 0, - X_width, X_height, - True )) - I_Error("XShmPutImage() failed\n"); - - // wait for it to finish and processes all input events - shmFinished = false; - do - { - I_GetEvent(); - } while (!shmFinished); - - } - else - { - - // draw the image - XPutImage( X_display, - X_mainWindow, - X_gc, - image, - 0, 0, - 0, 0, - X_width, X_height ); - - // sync up with server - XSync(X_display, False); - - } - -} - - -// -// I_ReadScreen -// -void I_ReadScreen (byte* scr) -{ - memcpy (scr, screens[0], SCREENWIDTH*SCREENHEIGHT); -} - - -// -// Palette stuff. -// -static XColor colors[256]; - -void UploadNewPalette(Colormap cmap, byte *palette) -{ - - register int i; - register int c; - static boolean firstcall = true; - -#ifdef __cplusplus - if (X_visualinfo.c_class == PseudoColor && X_visualinfo.depth == 8) -#else - if (X_visualinfo.class == PseudoColor && X_visualinfo.depth == 8) -#endif - { - // initialize the colormap - if (firstcall) - { - firstcall = false; - for (i=0 ; i<256 ; i++) - { - colors[i].pixel = i; - colors[i].flags = DoRed|DoGreen|DoBlue; - } - } - - // set the X colormap entries - for (i=0 ; i<256 ; i++) - { - c = gammatable[usegamma][*palette++]; - colors[i].red = (c<<8) + c; - c = gammatable[usegamma][*palette++]; - colors[i].green = (c<<8) + c; - c = gammatable[usegamma][*palette++]; - colors[i].blue = (c<<8) + c; - } - - // store the colors to the current colormap - XStoreColors(X_display, cmap, colors, 256); - - } -} - -// -// I_SetPalette -// +// Takes full 8 bit values. void I_SetPalette (byte* palette) { - UploadNewPalette(X_cmap, palette); } -// -// This function is probably redundant, -// if XShmDetach works properly. -// ddt never detached the XShm memory, -// thus there might have been stale -// handles accumulating. -// -void grabsharedmemory(int size) +void I_UpdateNoBlit (void) { - - int key = ('d'<<24) | ('o'<<16) | ('o'<<8) | 'm'; - struct shmid_ds shminfo; - int minsize = 320*200; - int id; - int rc; - // UNUSED int done=0; - int pollution=5; - - // try to use what was here before - do - { - id = shmget((key_t) key, minsize, 0777); // just get the id - if (id != -1) - { - rc=shmctl(id, IPC_STAT, &shminfo); // get stats on it - if (!rc) - { - if (shminfo.shm_nattch) - { - fprintf(stderr, "User %d appears to be running " - "DOOM. Is that wise?\n", shminfo.shm_cpid); - key++; - } - else - { - if (getuid() == shminfo.shm_perm.cuid) - { - rc = shmctl(id, IPC_RMID, 0); - if (!rc) - fprintf(stderr, - "Was able to kill my old shared memory\n"); - else - I_Error("Was NOT able to kill my old shared memory"); - - id = shmget((key_t)key, size, IPC_CREAT|0777); - if (id==-1) - I_Error("Could not get shared memory"); - - rc=shmctl(id, IPC_STAT, &shminfo); - - break; - - } - if (size >= shminfo.shm_segsz) - { - fprintf(stderr, - "will use %d's stale shared memory\n", - shminfo.shm_cpid); - break; - } - else - { - fprintf(stderr, - "warning: can't use stale " - "shared memory belonging to id %d, " - "key=0x%x\n", - shminfo.shm_cpid, key); - key++; - } - } - } - else - { - I_Error("could not get stats on key=%d", key); - } - } - else - { - id = shmget((key_t)key, size, IPC_CREAT|0777); - if (id==-1) - { - extern int errno; - fprintf(stderr, "errno=%d\n", errno); - I_Error("Could not get any shared memory"); - } - break; - } - } while (--pollution); - - if (!pollution) - { - I_Error("Sorry, system too polluted with stale " - "shared memory segments.\n"); - } - - X_shminfo.shmid = id; - - // attach to the shared memory segment - image->data = X_shminfo.shmaddr = shmat(id, 0, 0); - - fprintf(stderr, "shared memory id=%d, addr=0x%x\n", id, - (int) (image->data)); } -void I_InitGraphics(void) +void I_FinishUpdate (void) { - - char* displayname; - char* d; - int n; - int pnum; - int x=0; - int y=0; - - // warning: char format, different type arg - char xsign=' '; - char ysign=' '; - - int oktodraw; - unsigned long attribmask; - XSetWindowAttributes attribs; - XGCValues xgcvalues; - int valuemask; - static int firsttime=1; - - if (!firsttime) - return; - firsttime = 0; - - signal(SIGINT, (void (*)(int)) I_Quit); - - if (M_CheckParm("-2")) - multiply = 2; - - if (M_CheckParm("-3")) - multiply = 3; - - if (M_CheckParm("-4")) - multiply = 4; - - X_width = SCREENWIDTH * multiply; - X_height = SCREENHEIGHT * multiply; - - // check for command-line display name - if ( (pnum=M_CheckParm("-disp")) ) // suggest parentheses around assignment - displayname = myargv[pnum+1]; - else - displayname = 0; - - // check if the user wants to grab the mouse (quite unnice) - grabMouse = !!M_CheckParm("-grabmouse"); - - // check for command-line geometry - if ( (pnum=M_CheckParm("-geom")) ) // suggest parentheses around assignment - { - // warning: char format, different type arg 3,5 - n = sscanf(myargv[pnum+1], "%c%d%c%d", &xsign, &x, &ysign, &y); - - if (n==2) - x = y = 0; - else if (n==6) - { - if (xsign == '-') - x = -x; - if (ysign == '-') - y = -y; - } - else - I_Error("bad -geom parameter"); - } - - // open the display - X_display = XOpenDisplay(displayname); - if (!X_display) - { - if (displayname) - I_Error("Could not open display [%s]", displayname); - else - I_Error("Could not open display (DISPLAY=[%s])", getenv("DISPLAY")); - } - - // use the default visual - X_screen = DefaultScreen(X_display); - if (!XMatchVisualInfo(X_display, X_screen, 8, PseudoColor, &X_visualinfo)) - I_Error("xdoom currently only supports 256-color PseudoColor screens"); - X_visual = X_visualinfo.visual; - - // check for the MITSHM extension - doShm = XShmQueryExtension(X_display); - - // even if it's available, make sure it's a local connection - if (doShm) - { - if (!displayname) displayname = (char *) getenv("DISPLAY"); - if (displayname) - { - d = displayname; - while (*d && (*d != ':')) d++; - if (*d) *d = 0; - if (!(!strcasecmp(displayname, "unix") || !*displayname)) doShm = false; - } - } - - fprintf(stderr, "Using MITSHM extension\n"); - - // create the colormap - X_cmap = XCreateColormap(X_display, RootWindow(X_display, - X_screen), X_visual, AllocAll); - - // setup attributes for main window - attribmask = CWEventMask | CWColormap | CWBorderPixel; - attribs.event_mask = - KeyPressMask - | KeyReleaseMask - // | PointerMotionMask | ButtonPressMask | ButtonReleaseMask - | ExposureMask; - - attribs.colormap = X_cmap; - attribs.border_pixel = 0; - - // create the main window - X_mainWindow = XCreateWindow( X_display, - RootWindow(X_display, X_screen), - x, y, - X_width, X_height, - 0, // borderwidth - 8, // depth - InputOutput, - X_visual, - attribmask, - &attribs ); - - XDefineCursor(X_display, X_mainWindow, - createnullcursor( X_display, X_mainWindow ) ); - - // create the GC - valuemask = GCGraphicsExposures; - xgcvalues.graphics_exposures = False; - X_gc = XCreateGC( X_display, - X_mainWindow, - valuemask, - &xgcvalues ); - - // map the window - XMapWindow(X_display, X_mainWindow); - - // wait until it is OK to draw - oktodraw = 0; - while (!oktodraw) - { - XNextEvent(X_display, &X_event); - if (X_event.type == Expose - && !X_event.xexpose.count) - { - oktodraw = 1; - } - } - - // grabs the pointer so it is restricted to this window - if (grabMouse) - XGrabPointer(X_display, X_mainWindow, True, - ButtonPressMask|ButtonReleaseMask|PointerMotionMask, - GrabModeAsync, GrabModeAsync, - X_mainWindow, None, CurrentTime); - - if (doShm) - { - - X_shmeventtype = XShmGetEventBase(X_display) + ShmCompletion; - - // create the image - image = XShmCreateImage( X_display, - X_visual, - 8, - ZPixmap, - 0, - &X_shminfo, - X_width, - X_height ); - - grabsharedmemory(image->bytes_per_line * image->height); - - - // UNUSED - // create the shared memory segment - // X_shminfo.shmid = shmget (IPC_PRIVATE, - // image->bytes_per_line * image->height, IPC_CREAT | 0777); - // if (X_shminfo.shmid < 0) - // { - // perror(""); - // I_Error("shmget() failed in InitGraphics()"); - // } - // fprintf(stderr, "shared memory id=%d\n", X_shminfo.shmid); - // attach to the shared memory segment - // image->data = X_shminfo.shmaddr = shmat(X_shminfo.shmid, 0, 0); - - - if (!image->data) - { - perror(""); - I_Error("shmat() failed in InitGraphics()"); - } - - // get the X server to attach to it - if (!XShmAttach(X_display, &X_shminfo)) - I_Error("XShmAttach() failed in InitGraphics()"); - - } - else - { - image = XCreateImage( X_display, - X_visual, - 8, - ZPixmap, - 0, - (char*)malloc(X_width * X_height), - X_width, X_height, - 8, - X_width ); - - } - - if (multiply == 1) - screens[0] = (unsigned char *) (image->data); - else - screens[0] = (unsigned char *) malloc (SCREENWIDTH * SCREENHEIGHT); - } - -unsigned exptable[256]; - -void InitExpand (void) +void I_WaitVBL(int count) { - int i; - - for (i=0 ; i<256 ; i++) - exptable[i] = i | (i<<8) | (i<<16) | (i<<24); } -double exptable2[256*256]; - -void InitExpand2 (void) +void I_ReadScreen (byte* scr) { - int i; - int j; - // UNUSED unsigned iexp, jexp; - double* exp; - union - { - double d; - unsigned u[2]; - } pixel; - - printf ("building exptable2...\n"); - exp = exptable2; - for (i=0 ; i<256 ; i++) - { - pixel.u[0] = i | (i<<8) | (i<<16) | (i<<24); - for (j=0 ; j<256 ; j++) - { - pixel.u[1] = j | (j<<8) | (j<<16) | (j<<24); - *exp++ = pixel.d; - } - } - printf ("done.\n"); } -int inited; - -void -Expand4 -( unsigned* lineptr, - double* xline ) -{ - double dpixel; - unsigned x; - unsigned y; - unsigned fourpixels; - unsigned step; - double* exp; - - exp = exptable2; - if (!inited) - { - inited = 1; - InitExpand2 (); - } - - - step = 3*SCREENWIDTH/2; - - y = SCREENHEIGHT-1; - do - { - x = SCREENWIDTH; - - do - { - fourpixels = lineptr[0]; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); - xline[0] = dpixel; - xline[160] = dpixel; - xline[320] = dpixel; - xline[480] = dpixel; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); - xline[1] = dpixel; - xline[161] = dpixel; - xline[321] = dpixel; - xline[481] = dpixel; - - fourpixels = lineptr[1]; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); - xline[2] = dpixel; - xline[162] = dpixel; - xline[322] = dpixel; - xline[482] = dpixel; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); - xline[3] = dpixel; - xline[163] = dpixel; - xline[323] = dpixel; - xline[483] = dpixel; - - fourpixels = lineptr[2]; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); - xline[4] = dpixel; - xline[164] = dpixel; - xline[324] = dpixel; - xline[484] = dpixel; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); - xline[5] = dpixel; - xline[165] = dpixel; - xline[325] = dpixel; - xline[485] = dpixel; - - fourpixels = lineptr[3]; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); - xline[6] = dpixel; - xline[166] = dpixel; - xline[326] = dpixel; - xline[486] = dpixel; - - dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); - xline[7] = dpixel; - xline[167] = dpixel; - xline[327] = dpixel; - xline[487] = dpixel; - - lineptr+=4; - xline+=8; - } while (x-=16); - xline += step; - } while (y--); -} - - diff --git a/linuxdoom-1.10/info.c b/linuxdoom-1.10/info.c index 230c72b..08b0502 100644 --- a/linuxdoom-1.10/info.c +++ b/linuxdoom-1.10/info.c @@ -37,7 +37,7 @@ rcsid[] = "$Id: info.c,v 1.3 1997/01/26 07:45:00 b1 Exp $"; #include "p_mobj.h" -char *sprnames[NUMSPRITES] = { +char *sprnames[NUMSPRITES+1] = { "TROO","SHTG","PUNG","PISG","PISF","SHTF","SHT2","CHGG","CHGF","MISG", "MISF","SAWG","PLSG","PLSF","BFGG","BFGF","BLUD","PUFF","BAL1","BAL2", "PLSS","PLSE","MISL","BFS1","BFE1","BFE2","TFOG","IFOG","PLAY","POSS", @@ -51,7 +51,7 @@ char *sprnames[NUMSPRITES] = { "POL3","POL1","POL6","GOR2","GOR3","GOR4","GOR5","SMIT","COL1","COL2", "COL3","COL4","CAND","CBRA","COL6","TRE1","TRE2","ELEC","CEYE","FSKU", "COL5","TBLU","TGRN","TRED","SMBT","SMGT","SMRT","HDB1","HDB2","HDB3", - "HDB4","HDB5","HDB6","POB1","POB2","BRS1","TLMP","TLP2" + "HDB4","HDB5","HDB6","POB1","POB2","BRS1","TLMP","TLP2", NULL }; diff --git a/linuxdoom-1.10/info.h b/linuxdoom-1.10/info.h index 786a717..00da20b 100644 --- a/linuxdoom-1.10/info.h +++ b/linuxdoom-1.10/info.h @@ -1156,7 +1156,7 @@ typedef struct } state_t; extern state_t states[NUMSTATES]; -extern char *sprnames[NUMSPRITES]; +extern char *sprnames[NUMSPRITES+1]; diff --git a/linuxdoom-1.10/m_bbox.h b/linuxdoom-1.10/m_bbox.h index 66be2fb..988fcc1 100644 --- a/linuxdoom-1.10/m_bbox.h +++ b/linuxdoom-1.10/m_bbox.h @@ -23,8 +23,7 @@ #ifndef __M_BBOX__ #define __M_BBOX__ -#include - +#include "doomtype.h" #include "m_fixed.h" diff --git a/linuxdoom-1.10/m_menu.c b/linuxdoom-1.10/m_menu.c index 4d415ae..457a96d 100644 --- a/linuxdoom-1.10/m_menu.c +++ b/linuxdoom-1.10/m_menu.c @@ -25,7 +25,6 @@ static const char rcsid[] = "$Id: m_menu.c,v 1.7 1997/02/03 22:45:10 b1 Exp $"; -#include #include #include #include diff --git a/linuxdoom-1.10/m_misc.c b/linuxdoom-1.10/m_misc.c index 0df4fe5..47c0c38 100644 --- a/linuxdoom-1.10/m_misc.c +++ b/linuxdoom-1.10/m_misc.c @@ -31,8 +31,6 @@ rcsid[] = "$Id: m_misc.c,v 1.6 1997/02/03 22:45:10 b1 Exp $"; #include #include #include -#include - #include diff --git a/linuxdoom-1.10/p_setup.c b/linuxdoom-1.10/p_setup.c index e5d3667..f27b4ff 100644 --- a/linuxdoom-1.10/p_setup.c +++ b/linuxdoom-1.10/p_setup.c @@ -533,7 +533,7 @@ void P_GroupLines (void) } // build line tables for each sector - linebuffer = Z_Malloc (total*4, PU_LEVEL, 0); + linebuffer = Z_Malloc (total*sizeof(*linebuffer), PU_LEVEL, 0); sector = sectors; for (i=0 ; iwidth); + patchcount = (byte *)malloc (texture->width); memset (patchcount, 0, texture->width); patch = texture->patches; @@ -448,7 +448,7 @@ void R_InitTextures (void) names = W_CacheLumpName ("PNAMES", PU_STATIC); nummappatches = LONG ( *((int *)names) ); name_p = names+4; - patchlookup = alloca (nummappatches*sizeof(*patchlookup)); + patchlookup = malloc (nummappatches*sizeof(*patchlookup)); for (i=0 ; inext) diff --git a/linuxdoom-1.10/r_draw.c b/linuxdoom-1.10/r_draw.c index 0145044..70643bf 100644 --- a/linuxdoom-1.10/r_draw.c +++ b/linuxdoom-1.10/r_draw.c @@ -461,7 +461,7 @@ void R_InitTranslationTables (void) int i; translationtables = Z_Malloc (256*3+255, PU_STATIC, 0); - translationtables = (byte *)(( (int)translationtables + 255 )& ~255); + translationtables = (byte *)(( (uintptr_t)translationtables + 255 )& ~255); // translate just the 16 green colors for (i=0 ; i<256 ; i++) diff --git a/linuxdoom-1.10/s_sound.c b/linuxdoom-1.10/s_sound.c index bcfb538..5c253ce 100644 --- a/linuxdoom-1.10/s_sound.c +++ b/linuxdoom-1.10/s_sound.c @@ -368,8 +368,8 @@ S_StartSoundAtVolume // cache data if necessary if (!sfx->data) { - fprintf( stderr, - "S_StartSoundAtVolume: 16bit and not pre-cached - wtf?\n"); + //fprintf( stderr, + // "S_StartSoundAtVolume: 16bit and not pre-cached - wtf?\n"); // DOS remains, 8bit handling //sfx->data = (void *) W_CacheLumpNum(sfx->lumpnum, PU_MUSIC); diff --git a/linuxdoom-1.10/w_wad.c b/linuxdoom-1.10/w_wad.c index 178f5cb..5f98b01 100644 --- a/linuxdoom-1.10/w_wad.c +++ b/linuxdoom-1.10/w_wad.c @@ -32,7 +32,6 @@ rcsid[] = "$Id: w_wad.c,v 1.5 1997/02/03 16:47:57 b1 Exp $"; #include #include #include -#include #include #include #define O_BINARY 0 @@ -71,7 +70,7 @@ void strupr (char* s) while (*s) { *s = toupper(*s); s++; } } -int filelength (int handle) +int wadfilelength (int handle) { struct stat fileinfo; @@ -174,7 +173,7 @@ void W_AddFile (char *filename) // single lump file fileinfo = &singleinfo; singleinfo.filepos = 0; - singleinfo.size = LONG(filelength(handle)); + singleinfo.size = LONG(wadfilelength(handle)); ExtractFileBase (filename, singleinfo.name); numlumps++; } @@ -196,7 +195,7 @@ void W_AddFile (char *filename) header.numlumps = LONG(header.numlumps); header.infotableofs = LONG(header.infotableofs); length = header.numlumps*sizeof(filelump_t); - fileinfo = alloca (length); + fileinfo = malloc (length); lseek (handle, header.infotableofs, SEEK_SET); read (handle, fileinfo, length); numlumps += header.numlumps; @@ -253,7 +252,7 @@ void W_Reload (void) lumpcount = LONG(header.numlumps); header.infotableofs = LONG(header.infotableofs); length = lumpcount*sizeof(filelump_t); - fileinfo = alloca (length); + fileinfo = malloc (length); lseek (handle, header.infotableofs, SEEK_SET); read (handle, fileinfo, length);