MemHandle MEM_AllocatePages(Bitu pages,bool sequence) { MemHandle ret; if (!pages) return 0; if (sequence) { Bitu index=BestMatch(pages); if (!index) return 0; MemHandle * next=&ret; while (pages) { *next=index; next=&memory.mhandles[index]; index++;pages--; } *next=-1; } else { if (MEM_FreeTotal()<pages) return 0; MemHandle * next=&ret; while (pages) { Bitu index=BestMatch(1); if (!index) E_Exit("MEM:corruption during allocate"); while (pages && (!memory.mhandles[index])) { *next=index; next=&memory.mhandles[index]; index++;pages--; } *next=-1; //Invalidate it in case we need another match } } return ret; }
Bitu XMS_QueryFreeMemory(Bit16u& largestFree, Bit16u& totalFree) { /* Scan the tree for free memory and find largest free block */ totalFree=(Bit16u)(MEM_FreeTotal()*4); largestFree=(Bit16u)(MEM_FreeLargest()*4); if (!totalFree) return XMS_OUT_OF_SPACE; return 0; }
static Bit8u EMM_AllocateSystemHandle(Bit16u pages) { /* Check for enough free pages */ if ((MEM_FreeTotal()/ 4) < pages) { return EMM_OUT_OF_LOG;} Bit16u handle = 0; // emm system handle (reserved for OS usage) /* Release memory if already allocated */ if (emm_handles[handle].pages != NULL_HANDLE) { MEM_ReleasePages(emm_handles[handle].mem); } MemHandle mem = MEM_AllocatePages(pages*4,false); if (!mem) E_Exit("EMS:System handle memory allocation failure"); emm_handles[handle].pages = pages; emm_handles[handle].mem = mem; return EMM_NO_ERROR; }
static Bit8u EMM_AllocateMemory(Bit16u pages,Bit16u & dhandle,bool can_allocate_zpages) { /* Check for 0 page allocation */ if (!pages) { if (!can_allocate_zpages) return EMM_ZERO_PAGES; } /* Check for enough free pages */ if ((MEM_FreeTotal()/ 4) < pages) { return EMM_OUT_OF_LOG;} Bit16u handle = 1; /* Check for a free handle */ while (emm_handles[handle].pages != NULL_HANDLE) { if (++handle >= EMM_MAX_HANDLES) {return EMM_OUT_OF_HANDLES;} } MemHandle mem = 0; if (pages) { mem = MEM_AllocatePages(pages*4,false); if (!mem) E_Exit("EMS:Memory allocation failure"); } emm_handles[handle].pages = pages; emm_handles[handle].mem = mem; /* Change handle only if there is no error. */ dhandle = handle; return EMM_NO_ERROR; }
static Bit16u EMM_GetFreePages(void) { Bitu count=MEM_FreeTotal()/4; if (count>0x7fff) count=0x7fff; return (Bit16u)count; }