void mouse_get_cyberman_pos( int *x, int *y ) { dpmi_real_regs rr; event_info * ei; ubyte *Mouse_dos_mem; if ( (!Mouse_installed) || (!Mouse.cyberman) ) { *x = *y = 0; return; } Mouse_dos_mem = dpmi_get_temp_low_buffer( 64 ); if ( !Mouse_dos_mem ) { *x = *y = 0; return; } 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 = 0x5301; dpmi_real_int386x( 0x33, &rr ); ei = (event_info *)Mouse_dos_mem; *x = (((ei->x+8128)*256)/(8064+8128+1)) - 127; *y = (((ei->y+8128)*256)/(8064+8128+1)) - 127; }
void ipx_get_local_target( ubyte * server, ubyte * node, ubyte * local_target ) { net_xlat_info * info; dpmi_real_regs rregs; // Get dos memory for call... info = (net_xlat_info *)dpmi_get_temp_low_buffer( sizeof(net_xlat_info) ); assert( info != NULL ); memcpy( info->network, server, 4 ); memcpy( info->node, node, 6 ); memset(&rregs,0,sizeof(dpmi_real_regs)); rregs.ebx = 2; // Get Local Target rregs.es = DPMI_real_segment(info); rregs.esi = DPMI_real_offset(info->network); rregs.edi = DPMI_real_offset(info->local_target); dpmi_real_int386x( 0x7A, &rregs ); // Save the local target... memcpy( local_target, info->local_target, 6 ); }
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; }
//-------------------------------------------------------- // 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; }