From a93c25213364a267f50037a745955aaa728225a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Wed, 14 Dec 2005 16:32:33 +0000 Subject: [PATCH] add bestfit search to DOS_AllocateMemory (Armour-Geddon) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2412 --- src/dos/dos_memory.cpp | 108 ++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 33 deletions(-) diff --git a/src/dos/dos_memory.cpp b/src/dos/dos_memory.cpp index ec4758a6..25aae77b 100644 --- a/src/dos/dos_memory.cpp +++ b/src/dos/dos_memory.cpp @@ -91,6 +91,7 @@ bool DOS_AllocateMemory(Bit16u * segment,Bit16u * blocks) { Bit16u umb_start=dos_infoblock.GetStartOfUMBChain(); if (umb_start==UMB_START_SEG) { + /* start with UMBs if requested (bits 7 or 6 set) */ if (mem_strat&0xc0) mcb_segment=umb_start; } else if (umb_start!=0xffff) LOG(LOG_DOSMISC,LOG_ERROR)("Corrupt UMB chain: %x",umb_start); @@ -99,58 +100,99 @@ bool DOS_AllocateMemory(Bit16u * segment,Bit16u * blocks) { DOS_MCB psp_mcb(dos.psp()-1); char psp_name[9]; psp_mcb.GetFileName(psp_name); - bool stop=false; - while(!stop) { + Bit16u found_seg=0,found_seg_size=0; + for (;;) { mcb.SetPt(mcb_segment); if (mcb.GetPSPSeg()==0) { /* Check for enough free memory in current block */ Bit16u block_size=mcb.GetSize(); if (block_size<(*blocks)) { if (bigsize