#include #ifdef __ENV_DJGPP__ #include #include #ifdef __DJGPP__ #define _BORLAND_DOS_REGS 1 #endif #include #include "pstypes.h" #include "inferno.h" #include "text.h" #include "console.h" #include "args.h" #include "error.h" #include "joy.h" #include "timer.h" #include "key.h" #include "mono.h" #include "u_dpmi.h" #include "mouse.h" //added on 9/15/98 by Victor Rachels to add cd controls //#include "bcd.h" //end this section addition - Victor Rachels void install_int3_handler(void); #ifdef __WATCOMC__ int __far descent_critical_error_handler( unsigned deverr, unsigned errcode, unsigned far * devhdr ); #endif #ifndef NDEBUG #ifdef __WATCOMC__ void do_heap_check() { int heap_status; heap_status = _heapset( 0xFF ); switch( heap_status ) { case _HEAPBADBEGIN: mprintf((1, "ERROR - heap is damaged\n")); Int3(); break; case _HEAPBADNODE: mprintf((1, "ERROR - bad node in heap\n" )); Int3(); break; } } #endif #endif #ifdef VR_DEVICES int is_3dbios_installed() { dpmi_real_regs rregs; memset(&rregs,0,sizeof(dpmi_real_regs)); rregs.eax = 0x4ed0; //rregs.ebx = 0x3d10; dpmi_real_int386x( 0x10, &rregs ); if ( (rregs.edx & 0xFFFF) != 0x3344 ) return 0; else return 1; } #endif // Returns 1 if ok, 0 if failed... int init_gameport() { union REGS regs; memset(®s,0,sizeof(regs)); regs.x.eax = 0x8400; regs.x.edx = 0xF0; int386( 0x15, ®s, ®s ); if ( ( regs.x.eax & 0xFFFF ) == 0x4753 /*'SG'*/ ) return 1; else return 0; } void check_dos_version() { int major, minor; union REGS regs; memset(®s,0,sizeof(regs)); regs.x.eax = 0x3000; // Get MS-DOS Version Number int386( 0x21, ®s, ®s ); major = regs.h.al; minor = regs.h.ah; if ( major < 5 ) { printf( "Using MS-DOS version %d.%d\nThis is not compatable with Descent.", major, minor); exit(1); } //printf( "\nUsing MS-DOS %d.%d...\n", major, minor ); } void dos_check_file_handles(int num_required) { int i, n; FILE * fp[16]; if ( num_required > 16 ) num_required = 16; n = 0; for (i=0; i<16; i++ ) fp[i] = NULL; for (i=0; i<16; i++ ) { fp[i] = fopen( "nul", "wb" ); if ( !fp[i] ) break; } n = i; for (i=0; i<16; i++ ) { if (fp[i]) fclose(fp[i]); } if ( n < num_required ) { printf( "\n%s\n", TXT_NOT_ENOUGH_HANDLES ); printf( "------------------------\n" ); printf( "%d/%d %s\n", n, num_required, TXT_HANDLES_1 ); printf( "%s\n", TXT_HANDLES_2); printf( "%s\n", TXT_HANDLES_3); exit(1); } } #define NEEDED_DOS_MEMORY ( 300*1024) // 300 K #define NEEDED_LINEAR_MEMORY (7680*1024) // 7.5 MB #define LOW_PHYSICAL_MEMORY_CUTOFF (5*1024*1024) // 5.0 MB #define NEEDED_PHYSICAL_MEMORY (2000*1024) // 2000 KB extern int piggy_low_memory; void mem_int_to_string( int number, char *dest ) { int i,l,c; char buffer[20],*p; sprintf( buffer, "%d", number ); l = strlen(buffer); if (l<=3) { // Don't bother with less than 3 digits sprintf( dest, "%d", number ); return; } c = l % 3; p=dest; for (i=0; i dpmi_physical_memory ) { mem_int_to_string( (dpmi_available_memory-dpmi_physical_memory)/1024, text ); } else { mem_int_to_string( 0, text ); } printf( "Virtual: %7s KB\n", text ); printf( "\n" ); if ( dpmi_dos_memory < NEEDED_DOS_MEMORY ) { printf( "%d %s\n", NEEDED_DOS_MEMORY - dpmi_dos_memory, TXT_MEMORY_CONFIG ); exit(1); } if ( dpmi_available_memory < NEEDED_LINEAR_MEMORY ) { if ( dpmi_virtual_memory ) { printf( "%d %s\n", NEEDED_LINEAR_MEMORY - dpmi_available_memory, TXT_RECONFIGURE_VMM ); } else { printf( "%d %s\n", NEEDED_LINEAR_MEMORY - dpmi_available_memory, TXT_MORE_MEMORY ); printf( "%s\n", TXT_MORE_MEMORY_2); } exit(1); } if ( dpmi_physical_memory < NEEDED_PHYSICAL_MEMORY ) { printf( "%d %s\n", NEEDED_PHYSICAL_MEMORY - dpmi_physical_memory, TXT_PHYSICAL_MEMORY ); if ( dpmi_virtual_memory ) { printf( "%s\n", TXT_PHYSICAL_MEMORY_2); } exit(1); } if ( dpmi_physical_memory < LOW_PHYSICAL_MEMORY_CUTOFF ) { piggy_low_memory = 1; } } //NO_STACK_SIZE_CHECK uint * stack, *stack_ptr; //NO_STACK_SIZE_CHECK int stack_size, unused_stack_space; //NO_STACK_SIZE_CHECK int sil; //NO_STACK_SIZE_CHECK //NO_STACK_SIZE_CHECK int main(int argc,char **argv) //NO_STACK_SIZE_CHECK { //NO_STACK_SIZE_CHECK uint ret_value; //NO_STACK_SIZE_CHECK //NO_STACK_SIZE_CHECK unused_stack_space = 0; //NO_STACK_SIZE_CHECK stack = &ret_value; //NO_STACK_SIZE_CHECK stack_size = stackavail()/4; //NO_STACK_SIZE_CHECK //NO_STACK_SIZE_CHECK for ( sil=0; sil