From 87f990907d1e9a6cc24ca2955f2c2ae324470af1 Mon Sep 17 00:00:00 2001 From: Ulf Wohlers Date: Mon, 25 Nov 2002 11:37:04 +0000 Subject: [PATCH] Support for memory allocation strategy: last matching block Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@535 --- include/dos_inc.h | 2 ++ src/dos/dos.cpp | 3 ++- src/dos/dos_memory.cpp | 46 +++++++++++++++++++++++++++++++++--------- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/include/dos_inc.h b/include/dos_inc.h index ff3d7595..346c5a26 100644 --- a/include/dos_inc.h +++ b/include/dos_inc.h @@ -140,6 +140,8 @@ bool DOS_ResizeMemory(Bit16u segment,Bit16u * blocks); bool DOS_FreeMemory(Bit16u segment); void DOS_FreeProcessMemory(Bit16u pspseg); Bit16u DOS_GetMemory(Bit16u pages); +void DOS_SetMemAllocStrategy(Bit16u strat); +Bit16u DOS_GetMemAllocStrategy(void); /* FCB stuff */ bool DOS_FCBOpen(Bit16u seg,Bit16u offset); diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp index 75d0a798..5df2a3ab 100644 --- a/src/dos/dos.cpp +++ b/src/dos/dos.cpp @@ -679,9 +679,10 @@ static Bitu DOS_21Handler(void) { case 0x58: /* Get/Set Memory allocation strategy */ switch (reg_al) { case 0: /* Get Strategy */ - reg_ax=0; //Low memory first fit + reg_ax=DOS_GetMemAllocStrategy(); break; case 1: /* Set Strategy */ + DOS_SetMemAllocStrategy(reg_bx); break; default: LOG_DEBUG("DOS:58:Not Supported Set//Get memory allocation call %X",reg_al); diff --git a/src/dos/dos_memory.cpp b/src/dos/dos_memory.cpp index 0140655b..0fb72a38 100644 --- a/src/dos/dos_memory.cpp +++ b/src/dos/dos_memory.cpp @@ -24,6 +24,7 @@ #define MEM_START 0x60 //First Segment that DOS can use //#define MEM_START 4000 //First Segment that DOS can use +static Bit16u memAllocStrategy = 0x00; static void DOS_CompressMemory(void) { MCB * pmcb;MCB * pmcbnext; @@ -57,6 +58,15 @@ void DOS_FreeProcessMemory(Bit16u pspseg) { DOS_CompressMemory(); }; +Bit16u DOS_GetMemAllocStrategy() +{ + return memAllocStrategy; +}; + +void DOS_SetMemAllocStrategy(Bit16u strat) +{ + memAllocStrategy = strat; +}; bool DOS_AllocateMemory(Bit16u * segment,Bit16u * blocks) { MCB * pmcb;MCB * pmcbnext; @@ -77,17 +87,33 @@ bool DOS_AllocateMemory(Bit16u * segment,Bit16u * blocks) { *segment=mcb_segment+1; return true; } else { + // TODO: Strategy "1": Best matching block /* If so allocate it */ - pmcbnext=(MCB *)HostMake(mcb_segment+*blocks+1,0); - pmcbnext->psp_segment=MCB_FREE; - pmcbnext->type=pmcb->type; - pmcbnext->size=pmcb->size-*blocks-1; - pmcb->size=*blocks; - pmcb->type=0x4D; - pmcb->psp_segment=dos.psp; - //TODO Filename - *segment=mcb_segment+1; - return true; + if ((memAllocStrategy & 0x03)==0) { + pmcbnext=(MCB *)HostMake(mcb_segment+*blocks+1,0); + pmcbnext->psp_segment=MCB_FREE; + pmcbnext->type=pmcb->type; + pmcbnext->size=pmcb->size-*blocks-1; + pmcb->size=*blocks; + pmcb->type=0x4D; + pmcb->psp_segment=dos.psp; + //TODO Filename + *segment=mcb_segment+1; + return true; + } else { + // * Last Block * + // New created block + *segment = mcb_segment+1+pmcb->size-*blocks; + pmcbnext=(MCB *)HostMake(*segment-1,0); + pmcbnext->size = *blocks; + pmcbnext->type = pmcb->type; + pmcbnext->psp_segment = dos.psp; + // Old Block + pmcb->size = pmcb->size-*blocks-1; + pmcb->psp_segment = MCB_FREE; + pmcb->type = 0x4D; + return true; + }; } } /* Onward to the next MCB if there is one */