📄 i_system.c
字号:
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// $Id: I_system.c,v 1.5 2000/10/21 08:43:32 bpereira Exp $
//
// Copyright (C) 1993-1996 by id Software, Inc.
// Portions Copyright (C) 1998-2000 by DooM Legacy Team.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
//
// $Log: I_system.c,v $
// Revision 1.5 2000/10/21 08:43:32 bpereira
// no message
//
// Revision 1.4 2000/10/02 18:25:46 bpereira
// no message
//
// Revision 1.3 2000/04/16 18:38:07 bpereira
// no message
//
// Revision 1.2 2000/02/27 00:42:11 hurdler
// fix CR+LF problem
//
// Revision 1.1.1.1 2000/02/22 20:32:33 hurdler
// Initial import into CVS (v1.29 pr3)
//
//
// DESCRIPTION:
// Misc. stuff
// Startup & Shutdown routines for music,sound,timer,keyboard,...
// Signal handler to trap errors and exit cleanly.
//
//-----------------------------------------------------------------------------
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <io.h>
#include <stdarg.h>
#include <sys/time.h>
#ifdef DJGPP
#include <dpmi.h>
#include <go32.h>
#include <pc.h>
#include <dos.h>
#include <crt0.h>
#include <sys/segments.h>
#include <sys/nearptr.h>
#include <keys.h>
#endif
#include "../doomdef.h"
#include "../m_misc.h"
#include "../i_video.h"
#include "../i_sound.h"
#include "../i_system.h"
#include "../d_net.h"
#include "../g_game.h"
#include "../d_main.h"
#include "../m_argv.h"
#include "../w_wad.h"
#include "../z_zone.h"
#include "../g_input.h"
#include "../console.h"
#ifdef __GNUG__
#pragma implementation "../i_system.h"
#endif
#include "../i_joy.h"
//### let's try with Allegro ###
#define alleg_mouse_unused
//#define alleg_timer_unused
#define alleg_keyboard_unused
//#define alleg_joystick_unused
#define alleg_gfx_driver_unused
#define alleg_palette_unused
#define alleg_graphics_unused
#define alleg_vidmem_unused
#define alleg_flic_unused
#define alleg_sound_unused
#define alleg_file_unused
#define alleg_datafile_unused
#define alleg_math_unused
#define alleg_gui_unused
#include <allegro.h>
//### end of Allegro include ###
// Do not execute cleanup code more than once. See Shutdown_xxx() routines.
byte graphics_started=false;
byte keyboard_started=false;
byte sound_started=false;
byte timer_started=false;
/* Mouse stuff */
byte mouse_detected=false;
volatile tic_t ticcount; //returned by I_GetTime(), updated by timer interrupt
void I_Tactile ( int on, int off, int total )
{
// UNUSED.
on = off = total = 0;
}
ticcmd_t emptycmd;
ticcmd_t* I_BaseTiccmd(void)
{
return &emptycmd;
}
//
// Allocates the base zone memory,
// this function returns a valid pointer and size,
// else it should interrupt the program immediately.
//
//added:11-02-98: now checks if mem could be allocated, this is still
// prehistoric... there's a lot to do here: memory locking, detection
// of win95 etc...
//
boolean win95;
boolean lockmem;
void I_DetectWin95 (void)
{
__dpmi_regs r;
r.x.ax = 0x160a; // Get Windows Version
__dpmi_int(0x2f, &r);
if(r.x.ax || r.h.bh < 4) // Not windows or earlier than Win95
{
win95 = false;
}
else
{
CONS_Printf ("Windows 95 detected\n");
win95 = true;
}
}
ULONG I_GetFreeMem(ULONG *total)
{
_go32_dpmi_meminfo info;
_go32_dpmi_get_free_memory_information(&info);
if( total )
*total = info.total_physical_pages<<12; // <<12 for convert page to byte
return info.available_physical_pages<<12;
}
/*==========================================================================*/
// I_GetTime ()
/*==========================================================================*/
tic_t inline I_GetTime (void)
{
return ticcount;
}
byte joystick_detected=false;
JoyType_t Joystick;
//
// I_Init
//
void I_WaitJoyButton (void)
{
CON_Drawer ();
I_FinishUpdate (); // page flip or blit buffer
do {
poll_joystick();
} while (!(joy_b1 || joy_b2));
while (joy_b1 || joy_b2)
poll_joystick();
}
void I_InitJoystick (void)
{
//init the joystick
joystick_detected=0;
if (cv_usejoystick.value && !M_CheckParm("-nojoy"))
{
joy_type = JOY_TYPE_4BUTTON;
if(initialise_joystick()==0) {
switch(cv_usejoystick.value) {
case 1 : joy_type = JOY_TYPE_4BUTTON; break;
case 2 : joy_type = JOY_TYPE_STANDARD; break;
case 3 : joy_type = JOY_TYPE_6BUTTON; break;
case 4 : joy_type = JOY_TYPE_WINGEX; break;
case 5 : joy_type = JOY_TYPE_FSPRO; break;
// new since 1.28 support from allegro 3.11
case 6 : joy_type = JOY_TYPE_8BUTTON; break;
case 7 : joy_type = JOY_TYPE_SIDEWINDER; break;
case 8 : joy_type = JOY_TYPE_GAMEPAD_PRO; break;
case 9 : joy_type = JOY_TYPE_SNESPAD_LPT1;break;
case 10: joy_type = JOY_TYPE_SNESPAD_LPT2;break;
case 11: joy_type = JOY_TYPE_SNESPAD_LPT3;break;
case 12: joy_type = JOY_TYPE_WINGWARRIOR; break;
}
// only gamepadstyle joysticks
Joystick.bGamepadStyle=true;
CONS_Printf("\2CENTER the joystick and press a button:"); I_WaitJoyButton ();
initialise_joystick();
CONS_Printf("\nPush the joystick to the UPPER LEFT corner and press a button\n"); I_WaitJoyButton ();
calibrate_joystick_tl();
CONS_Printf("Push the joystick to the LOWER RIGHT corner and press a button\n"); I_WaitJoyButton ();
calibrate_joystick_br();
if(joy_type== JOY_TYPE_WINGEX || joy_type == JOY_TYPE_FSPRO)
{
CONS_Printf("Put Hat at Center and press a button\n"); I_WaitJoyButton ();
calibrate_joystick_hat(JOY_HAT_CENTRE);
CONS_Printf("Put Hat at Up and press a button\n"); I_WaitJoyButton ();
calibrate_joystick_hat(JOY_HAT_UP);
CONS_Printf("Put Hat at Down and press a button\n"); I_WaitJoyButton ();
calibrate_joystick_hat(JOY_HAT_DOWN);
CONS_Printf("Put Hat at Left and press a button\n"); I_WaitJoyButton ();
calibrate_joystick_hat(JOY_HAT_LEFT);
CONS_Printf("Put Hat at Right and press a button\n"); I_WaitJoyButton ();
calibrate_joystick_hat(JOY_HAT_RIGHT);
}
joystick_detected=1;
}
else
{
CONS_Printf("\2No Joystick detected.\n");
}
}
}
//
// I_Error
//
//added:18-02-98: put an error message (with format) on stderr
void I_OutputMsg (char *error, ...)
{
va_list argptr;
va_start (argptr,error);
vfprintf (stderr,error,argptr);
va_end (argptr);
// dont flush the message!
}
int errorcount=0; // fuck recursive errors
int shutdowning=false;
//added 31-12-97 : display error messy after shutdowngfx
void I_Error (char *error, ...)
{
va_list argptr;
// added 11-2-98 recursive error detecting
if(shutdowning)
{
errorcount++;
if(errorcount==5)
I_ShutdownGraphics();
if(errorcount==6)
I_ShutdownSystem();
if(errorcount>7)
exit(-1); // recursive errors detected
}
shutdowning=true;
// put message to stderr
va_start (argptr,error);
fprintf (stderr, "Error: ");
vfprintf (stderr,error,argptr);
#ifdef DEBUGFILE
if (debugfile)
{
fprintf (debugfile,"I_Error :");
vfprintf (debugfile,error,argptr);
}
#endif
va_end (argptr);
//added:18-02-98: save one time is enough!
if (!errorcount)
{
M_SaveConfig (NULL); //save game config, cvars..
}
//added:16-02-98: save demo, could be useful for debug
// NOTE: demos are normally not saved here.
if (demorecording)
G_CheckDemoStatus();
D_QuitNetGame ();
/* shutdown everything that was started ! */
I_ShutdownSystem();
fprintf (stderr, "\nPress ENTER");
fflush( stderr );
getchar();
exit(-1);
}
//
// I_Quit : shutdown everything cleanly, in reverse order of Startup.
//
void I_Quit (void)
{
byte* endoom;
//added:16-02-98: when recording a demo, should exit using 'q' key,
// but sometimes we forget and use 'F10'.. so save here too.
if (demorecording)
G_CheckDemoStatus();
M_SaveConfig (NULL); //save game config, cvars..
endoom = W_CacheLumpName("ENDOOM",PU_CACHE);
//added:03-01-98: maybe it needs that the ticcount continues,
// or something else that will be finished by ShutdownSystem()
// so I do it before.
D_QuitNetGame ();
/* shutdown everything that was started ! */
I_ShutdownSystem();
puttext(1,1,80,25,endoom);
gotoxy(1,24);
if(shutdowning || errorcount)
I_Error("Error detected (%d)",errorcount);
fflush(stderr);
exit(0);
}
//added:12-02-98: does want to work!!!! rhaaahahha
void I_WaitVBL(int count)
{
while(count-->0);
{
do {
} while (inportb(0x3DA) & 8);
do {
} while (!(inportb(0x3DA) & 8));
}
}
// Fab: this is probably to activate the 'loading' disc icon
// it should set a flag, that I_FinishUpdate uses to know
// whether it draws a small 'loading' disc icon on the screen or not
//
// also it should explicitly draw the disc because the screen is
// possibly not refreshed while loading
//
void I_BeginRead (void)
{
}
// Fab: see above, end the 'loading' disc icon, set the flag false
//
void I_EndRead (void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -