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_buffer); if (!dpmi_dos_buffer) { dpmi_dos_selector = 0; printf( "Error allocating 1K of DOS memory\n" ); exit(1); } atexit(dpmi_close); if (verbose) printf( "MemInfo failed!" ); dpmi_physical_memory = 16*1024*1024; // Assume 16 MB dpmi_available_memory = 16*1024*1024; // Assume 16 MB return 1; }
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; }