void *install_int21_hook(void) // Rueckgabe: ptr to allocated realmode mem { if ( GetLogDpmiInfo() ) LogLine("- Now installing rm hook\n"); //--- allocatore low memory for the new int21 handler --- rm21ptr = (struct rmcode *) dpmi_real_malloc(2048, &Hook21Sel); if (rm21ptr != NULL) { //--- lock this low memory region --- if (!dpmi_lock_region(rm21ptr, 2048)) { // locking failed? dpmi_real_free(Hook21Sel); return NULL; } OrgRmInt21 = ahf_dpmi_get_rmint(0x21); // get the org int21 vector //--- now patch the raw code of my new handler --- memcpy(rm21ptr, &rm21code, sizeof(rm21code)); *(unsigned long*)(rm21ptr->oldintofs) = OrgRmInt21; *(unsigned long*)(rm21ptr->LammCallAdr) = FP_OFF(RcvGP2Call); //--- now set my new handler --- _disable(); ahf_dpmi_set_rmint(0x21, ((unsigned long)DPMI_real_segment(rm21ptr) << 16) + DPMI_real_offset(rm21ptr)); _enable(); //--- make sure it's getting restored at exit --- atexit( remove_int21_hook ); } return rm21ptr; } // install_int21_hook()
void key_init() { // Initialize queue Status1= *(ubyte*)0x417; Status2= *(ubyte*)0x418; keyd_time_when_last_pressed = timer_get_fixed_seconds(); keyd_buffer_type = 1; keyd_repeat = 1; key_data.in_key_handler = 0; key_data.E0Flag = 0; key_data.E1Flag = 0; // Clear the keyboard array key_flush(); if (Installed) return; Installed = 1; //--------------- lock everything for the virtal memory ---------------------------------- if (!dpmi_lock_region ((void near *)key_handler, (char *)key_handler_end - (char near *)key_handler)) { Error( "Can't lock keyboard handler!\n" ); } if (!dpmi_lock_region (&key_data, sizeof(keyboard))) { Error( "Can't lock keyboard handler's data!\n" ); } if (!dpmi_lock_region (&keyd_buffer_type, sizeof(char))) { Error( "Can't lock keyboard handler's data!\n" ); } if (!dpmi_lock_region (&keyd_repeat, sizeof(char))) { Error( "Can't lock keyboard handler's data!\n" ); } if (!dpmi_lock_region (&keyd_editor_mode, sizeof(char))) { Error( "Can't lock keyboard handler's data!\n" ); } if (!dpmi_lock_region (&keyd_last_pressed, sizeof(char))) { Error( "Can't lock keyboard handler's data!\n" ); } if (!dpmi_lock_region (&keyd_last_released, sizeof(char))) { Error( "Can't lock keyboard handler's data!\n" ); } if (!dpmi_lock_region (&keyd_pressed, sizeof(char)*256)) { Error( "Can't lock keyboard handler's data!\n" ); } if (!dpmi_lock_region (&keyd_time_when_last_pressed, sizeof(int))) { Error( "Can't lock keyboard handler's data!\n" ); } key_data.prev_int_9 = _dos_getvect( 9 ); _dos_setvect( 9, key_handler ); atexit( key_close ); }
int ipx_init( int socket_number, int show_address ) { dpmi_real_regs rregs; ubyte *ipx_real_buffer; int i; atexit(ipx_close); ipx_packetnum = 0; // init packet buffers. for (i=0; i<MAX_PACKETS; i++ ) { packet_buffers[i].packetnum = -1; packet_free_list[i] = i; } num_packets = 0; largest_packet_index = 0; // Get the IPX vector memset(&rregs,0,sizeof(dpmi_real_regs)); rregs.eax=0x00007a00; dpmi_real_int386x( 0x2f, &rregs ); if ( (rregs.eax & 0xFF) != 0xFF ) { return 3; } ipx_vector_offset = rregs.edi & 0xFFFF; ipx_vector_segment = rregs.es; //printf( "IPX entry point at %.4x:%.4x\n", ipx_vector_segment, ipx_vector_offset ); // Open a socket for IPX memset(&rregs,0,sizeof(dpmi_real_regs)); swab( (char *)&socket_number,(char *)&ipx_socket, 2 ); rregs.edx = ipx_socket; rregs.eax = ipx_socket_life; rregs.ebx = 0; // Open socket dpmi_real_int386x( 0x7A, &rregs ); ipx_socket = rregs.edx & 0xFFFF; if ( rregs.eax & 0xFF ) { //mprintf( (1, "IPX error opening channel %d\n", socket_number-IPX_DEFAULT_SOCKET )); return -2; } ipx_installed = 1; // Find our internetwork address ipx_real_buffer = dpmi_get_temp_low_buffer( 1024 ); // 1k block if ( ipx_real_buffer == NULL ) { //printf( "Error allocation realmode memory\n" ); return -4; } memset(&rregs,0,sizeof(dpmi_real_regs)); rregs.ebx = 9; // Get internetwork address rregs.esi = DPMI_real_offset(ipx_real_buffer); rregs.es = DPMI_real_segment(ipx_real_buffer); dpmi_real_int386x( 0x7A, &rregs ); if ( rregs.eax & 0xFF ) { //printf( "Error getting internetwork address!\n" ); return -2; } memcpy( &ipx_network, ipx_real_buffer, 4 ); memcpy( &ipx_my_node, &ipx_real_buffer[4], 6 ); Ipx_num_networks = 0; memcpy( &Ipx_networks[Ipx_num_networks++], &ipx_network, 4 ); if ( show_address ) { printf( "My IPX addresss is " ); printf( "%02X%02X%02X%02X/", ipx_real_buffer[0],ipx_real_buffer[1],ipx_real_buffer[2],ipx_real_buffer[3] ); printf( "%02X%02X%02X%02X%02X%02X\n", ipx_real_buffer[4],ipx_real_buffer[5],ipx_real_buffer[6],ipx_real_buffer[7],ipx_real_buffer[8],ipx_real_buffer[9] ); printf( "\n" ); } packets = dpmi_real_malloc( sizeof(ipx_packet)*ipx_num_packets, &ipx_packets_selector ); if ( packets == NULL ) { //printf( "Couldn't allocate real memory for %d packets\n", ipx_num_packets ); return -4; } if (!dpmi_lock_region( packets, sizeof(ipx_packet)*ipx_num_packets )) { //printf( "Couldn't lock real memory for %d packets\n", ipx_num_packets ); return -4; } memset( packets, 0, sizeof(ipx_packet)*ipx_num_packets ); for (i=1; i<ipx_num_packets; i++ ) { packets[i].ecb.in_use = 0x1d; //packets[i].ecb.in_use = 0; packets[i].ecb.socket_id = ipx_socket; packets[i].ecb.fragment_count = 1; packets[i].ecb.fragment_pointer[0] = DPMI_real_offset(&packets[i].ipx); packets[i].ecb.fragment_pointer[1] = DPMI_real_segment(&packets[i].ipx); packets[i].ecb.fragment_size = sizeof(ipx_packet)-sizeof(ecb_header); //-sizeof(ecb_header); ipx_listen_for_packet(&packets[i].ecb); } packets[0].ecb.socket_id = ipx_socket; packets[0].ecb.fragment_count = 1; packets[0].ecb.fragment_pointer[0] = DPMI_real_offset(&packets[0].ipx); packets[0].ecb.fragment_pointer[1] = DPMI_real_segment(&packets[0].ipx); packets[0].ipx.packet_type = 4; // IPX packet packets[0].ipx.destination.socket_id = ipx_socket; // memcpy( packets[0].ipx.destination.network_id, &ipx_network, 4 ); memset( packets[0].ipx.destination.network_id, 0, 4 ); return 0; }
int dpmi_init(int verbose) { union REGS regs; struct SREGS sregs; mem_data mi; dpmi_dos_memory = dpmi_find_dos_memory(); dpmi_dos_buffer = dpmi_real_malloc( 1024, &dpmi_dos_selector); if (!dpmi_dos_buffer) { dpmi_dos_selector = 0; printf( "Error allocating 1K of DOS memory\n" ); exit(1); } atexit(dpmi_close); // Check dpmi memset(®s,0,sizeof(regs)); regs.x.eax = 0x400; // DPMI Get Memory Info int386( 0x31, ®s, ®s ); if (!regs.w.cflag) { if (verbose) printf( "V%d.%d, CPU:%d, VMM:", regs.h.ah, regs.h.al, regs.h.cl ); if (regs.w.bx & 4) { if (verbose) printf( "1" ); dpmi_virtual_memory = 1; } else { if (verbose) printf( "0" ); } } //--------- Find available memory memset(®s,0,sizeof(regs)); memset(&sregs,0,sizeof(sregs)); regs.x.eax = 0x500; // DPMI Get Memory Info sregs.es = FP_SEG(&mi); regs.x.edi = FP_OFF(&mi); int386x( 0x31, ®s, ®s, &sregs ); if (!regs.w.cflag) { if (verbose) printf( ", P:%dK", mi.largest_lockable_pages*4 ); if (dpmi_virtual_memory) if (verbose) printf( ", A:%dK", mi.largest_block_bytes/1024 ); //dpmi_physical_memory = mi.largest_lockable_pages*4096; //dpmi_available_memory = mi.largest_block_bytes; dpmi_physical_memory = mi.total_physical_pages*4096; dpmi_available_memory = mi.total_pages * 4096; } else { if (verbose) printf( "MemInfo failed!" ); dpmi_physical_memory = 16*1024*1024; // Assume 16 MB dpmi_available_memory = 16*1024*1024; // Assume 16 MB } #ifdef __WATCOMC__ if (!dpmi_lock_region( _GETDS, 4096 )) { printf( "Error locking _GETDS" ); exit(1); } if (!dpmi_lock_region( cstart_, 4096 )) { printf( "Error locking cstart" ); exit(1); } if (!dpmi_lock_region( _chain_intr, 4096 )) { printf( "Error locking _chain_intr" ); exit(1); } #endif return 1; }
int main(int argc, const char *argv[]) // return values: // 1 == error init dpmi / couldn't lock // 2 == error initing log buffers // 3 == error installing lammcall rmcode // 4 == useipxlink requested, but couldn't install // 5 == error while linking // 6 == error loading gp2.exe { char *fullname = NULL; DWORD *pULongCfg = NULL; char *pStrCfg = NULL; char cfgnamebuf[_MAX_PATH]; char *cfgname = NULL; char *gp2exename = GP2_EXE_FILENAME; char *gp2logname = GP2LOG_DEBUG_FILENAME; DWORD dpmicode; ubyte log_flags = 0, i /* count var */; char tmpbuf[128]; #ifndef TEST //----- invoked by our own stub? -------- // ACHTUNG: "GP2LINT" muss ungerade Anzahl Buchstaben haben (wegen updown & gamma) if (strcmp(getenv(updown("GP2LINT")), updown("GAMMA")) != 0) { //--- it's not defined, so leave quiet --- #ifdef TEST fprintf(stderr, "GP2LINT not defined!\n"); #endif return 140; } #endif printf(GP2LAP_BANNER_STR); #ifdef SOCKCLNT printf("This version of GP2Lap was compiled as a socket client.\n"); #endif #ifndef AUTH printf("This version of GP2Lap cannot be used for online leagues that require authentication.\n"); #endif //------- Init configuration if (GetConfigFileNameOpt(cfgnamebuf, _MAX_PATH, argc, (void*)argv)) { cfgname = cfgnamebuf; if (!strchr(cfgname, '.')) strcat(cfgname, ".cfg"); } else cfgname = GP2LAP_CFG_FILENAME; switch (InitCfgValues(cfgname, &paths_to_check, &items, &fullname)) { case 0: printf("- Configuration read from: %s\n", fullname); break; case 1: fprintf(stderr, "*** can't open %s\n", fullname); break; case 2: fprintf(stderr, "*** can't locate %s\n", fullname); break; } pULongCfg = GetCfgULong("logDebug"); if (pULongCfg) setbits(log_flags, BLF_DISABLED, !*pULongCfg); pULongCfg = GetCfgULong("logDebugFlush"); if (pULongCfg) setbits(log_flags, BLF_FLUSHALWAYS, *pULongCfg); pStrCfg = GetCfgString("logDebugName"); if (pStrCfg && strlen(pStrCfg) > 0) // strlen doesn't seem to do nullptr chk gp2logname = pStrCfg; if (isoff(log_flags, BLF_DISABLED)) printf("- Logging debug output to: %s\n", gp2logname); pULongCfg = GetCfgULong("hof25Enable"); if (pULongCfg) opt_hof25 = *pULongCfg; if (opt_hof25) printf("- HOF2.5 mode enabled\n"); pULongCfg = GetCfgULong("logPerf"); if (pULongCfg) opt_log_perf = *pULongCfg; if (opt_log_perf) printf("- Extended perfing enabled\n"); pULongCfg = GetCfgULong("logGLX"); if (pULongCfg) opt_log_glx = *pULongCfg; if (opt_log_glx) { printf("- GLX log file enabled\n"); // only enable opt_log_cc if opt_log_glx is TRUE pULongCfg = GetCfgULong("logCC"); if (pULongCfg) opt_log_cc = *pULongCfg; if (opt_log_cc) printf("- Computer car logging enabled\n"); } pULongCfg = GetCfgULong("Spa98"); if (pULongCfg) opt_spa98 = *pULongCfg; if (opt_spa98) printf("- Spa '98 enabled\n"); if (!LogStart(log_flags, gp2logname) && isoff(log_flags, BLF_DISABLED)) fprintf(stderr, "*** error opening logfile '%s'\n", gp2logname); atexit(LogEnd); #ifdef SOCKCLNT sockInit(); atexit(sockExit); #endif //--- init Frank's stuff ------ init_new_gp2strings(); // init our strings FrankSoftInit(); // atexit'ed //---- init dpmi before all other stuff now ------ dpmicode = dpmi_init(0 /* no verbose */); // atexit'ed if (dpmicode) { fprintf(stderr, "*** dpmi: error %04u\n", dpmicode); return 1; } initvesa(); //---- lock my int9 handler ------ if (!dpmi_lock_region((void near *)(MyInt9), 4096)) { // should be enough if (GetLogDpmiInfo()) LogLine("- dpmi: error: MI9 can't be locked!\n"); } else { if (GetLogDpmiInfo()) LogLine("- dpmis: MI9 locked\n"); } //============================================ //======== the complete logging stuff ======== //============================================ // Warning: don't change options after starting the log system! if (!Log_Create()) { fprintf(stderr, "*** error initing log buffers\n"); return 2; } atexit(Log_Kill); if (!PrfLog_Create()) { fprintf(stderr, "*** error initing perf log buffers\n"); return 2; } atexit(PrfLog_Kill); //================================================= //======== RM-Code fuer int21h vorbereiten ========= //================================================= if ( !install_int21_hook() ) { // atexit'ed fprintf(stderr, "*** lowp: error e004"); return 3; } //============================================ //======== the complete network stuff ======== //============================================ if ( UseIpxLink ) { if ( !ipx_basic_init(0) ) // init the ipx // atexit'ed return 4; if ( !start_ipx_link() ) // init the link return 5; } CloserInit(); // atexit'ed // the very last //---- ok, send alive to logfile ----------- _strdate(&tmpbuf); sprintf(strbuf,"\n"GP2LAP_NAME" started on %s ", tmpbuf); _strtime(&tmpbuf); strcat(strbuf, tmpbuf); strcat(strbuf, "\n"); LogLine(strbuf); sprintf(strbuf, "- Code start at 0x%08x\n", &__begtext); LogLine(strbuf); //----- 08/99 for solving the int2F prob--------------- InitFixInt2F(); //----- Fremdapplikation starten ------- putenv("DOS4G=QUIET"); sprintf(strbuf, "Loading %s...\n", gp2exename); LogLine(strbuf); printf(strbuf); argv[0] = gp2exename; if (spawnv(P_WAIT, gp2exename, (void*)argv) < 0) { // cast to void* to avoid warning about double indirection constness sprintf(strbuf, "*** error loading %s: %s\n", gp2exename, strerror(errno)); LogLine(strbuf); fprintf(stderr, strbuf); } #ifdef TEST sprintf(strbuf, "flagfield = 0x%08x\n", flagfield); LogLine(strbuf); if (GP2_Found && ((flagfield & 0xFFF) != 0x7)) printf("\nflags == 0x%08X\n*** error flag field incorrect\n", flagfield); #endif //--- saying bye now ------ _strdate(&tmpbuf); sprintf(strbuf, GP2LAP_NAME" exiting on %s ", tmpbuf); _strtime(&tmpbuf); strcat(strbuf, tmpbuf); strcat(strbuf, "\n"); LogLine(strbuf); return 0; }
//-------------------------------------------------------- // returns 0 if no mouse // else number of buttons int mouse_init(int enable_cyberman) { dpmi_real_regs rr; cyberman_info *ci; struct SREGS sregs; union REGS inregs, outregs; ubyte *Mouse_dos_mem; if (Mouse_installed) return Mouse.num_buttons; if (_dos_getvect(0x33) == NULL) { // No mouse driver loaded return 0; } // Reset the mouse driver memset( &inregs, 0, sizeof(inregs) ); inregs.w.ax = 0; int386(0x33, &inregs, &outregs); if (outregs.w.ax != 0xffff) return 0; Mouse.num_buttons = outregs.w.bx; Mouse.cyberman = 0; // Enable mouse driver memset( &inregs, 0, sizeof(inregs) ); inregs.w.ax = 0x0020; int386(0x33, &inregs, &outregs); if (outregs.w.ax != 0xffff ) return 0; if ( enable_cyberman ) { Mouse_dos_mem = dpmi_get_temp_low_buffer( 64 ); if (Mouse_dos_mem==NULL) { printf( "Unable to allocate DOS buffer in mouse.c\n" ); } else { // Check for Cyberman... memset( &rr, 0, sizeof(dpmi_real_regs) ); rr.es = DPMI_real_segment(Mouse_dos_mem); rr.edx = DPMI_real_offset(Mouse_dos_mem); rr.eax = 0x53c1; dpmi_real_int386x( 0x33, &rr ); if (rr.eax==1) { // SWIFT functions supported ci = (cyberman_info *)Mouse_dos_mem; if (ci->device_type==1) { // Cyberman Mouse.cyberman = 1; //printf( "Cyberman mouse detected\n" ); Mouse.num_buttons = 11; } } } } if (!dpmi_lock_region(&Mouse,sizeof(mouse_info))) { Error( "Unable to lock mouse data region" ); } if (!dpmi_lock_region((void near *)mouse_handler,(char *)mouse_handler_end - (char near *)mouse_handler)) { Error( "Unable to lock mouse handler" ); } // Install mouse handler memset( &inregs, 0, sizeof(inregs)); memset( &sregs, 0, sizeof(sregs)); inregs.w.ax = 0xC; inregs.w.cx = ME_LB_P|ME_LB_R|ME_RB_P|ME_RB_R|ME_MB_P|ME_MB_R; // watch all 3 button ups/downs if (Mouse.cyberman) inregs.w.cx |= ME_Z_C| ME_P_C| ME_B_C| ME_H_C; // if using a cyberman, also watch z, pitch, bank, heading. inregs.x.edx = FP_OFF(mouse_handler); sregs.es = FP_SEG(mouse_handler); int386x(0x33, &inregs, &outregs, &sregs); Mouse_installed = 1; atexit( mouse_close ); mouse_flush(); return Mouse.num_buttons; }