From b9bba7251902ac551c4cd2b7bb6c36d77a6c33b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Fri, 16 Dec 2005 21:05:46 +0000 Subject: [PATCH] add small free MCB to start of dos memory (fixes Cannon Fodder2 sound, Xenobots) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2414 --- src/dos/dos_memory.cpp | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/dos/dos_memory.cpp b/src/dos/dos_memory.cpp index 25aae77b..19bf2d1a 100644 --- a/src/dos/dos_memory.cpp +++ b/src/dos/dos_memory.cpp @@ -405,13 +405,6 @@ static Bitu DOS_default_handler(void) { static CALLBACK_HandlerObject callbackhandler; void DOS_SetupMemory(void) { - // Create a dummy device MCB with PSPSeg=0x0008 - DOS_MCB mcb_devicedummy((Bit16u)DOS_MEM_START); - mcb_devicedummy.SetPSPSeg(MCB_DOS); // Devices - mcb_devicedummy.SetSize(1); - mcb_devicedummy.SetType(0x4d); // More blocks will follow -// mcb_devicedummy.SetFileName("SD "); - /* Let dos claim a few bios interrupts. Makes DOSBox more compatible with * buggy games, which compare against the interrupt table. (probably a * broken linked list implementation) */ @@ -428,13 +421,35 @@ void DOS_SetupMemory(void) { real_writed(0,0x04*4,0x700000); //Shadow President // real_writed(0,0x0f*4,0x700000); //Always a tricky one (soundblaster irq) - DOS_MCB mcb((Bit16u)DOS_MEM_START+2); + // Create a dummy device MCB with PSPSeg=0x0008 + DOS_MCB mcb_devicedummy((Bit16u)DOS_MEM_START); + mcb_devicedummy.SetPSPSeg(MCB_DOS); // Devices + mcb_devicedummy.SetSize(1); + mcb_devicedummy.SetType(0x4d); // More blocks will follow +// mcb_devicedummy.SetFileName("SD "); + + Bit16u mcb_sizes=2; + // Create a small empty MCB (result from a growing environment block) + DOS_MCB tempmcb((Bit16u)DOS_MEM_START+mcb_sizes); + tempmcb.SetPSPSeg(MCB_FREE); + tempmcb.SetSize(4); + mcb_sizes+=5; + tempmcb.SetType(0x4d); + + // Lock the previous empty MCB + DOS_MCB tempmcb2((Bit16u)DOS_MEM_START+mcb_sizes); + tempmcb2.SetPSPSeg(0x40); // can be removed by loadfix + tempmcb2.SetSize(16); + mcb_sizes+=17; + tempmcb2.SetType(0x4d); + + DOS_MCB mcb((Bit16u)DOS_MEM_START+mcb_sizes); mcb.SetPSPSeg(MCB_FREE); //Free mcb.SetType(0x5a); //Last Block if (machine==MCH_TANDY) { /* memory up to 608k available, the rest (to 640k) is used by the tandy graphics system's variable mapping of 0xb800 */ - mcb.SetSize(0x97FE - DOS_MEM_START - 2); + mcb.SetSize(0x97FE - DOS_MEM_START - mcb_sizes); } else if (machine==MCH_PCJR) { /* memory from 128k to 640k is available */ mcb_devicedummy.SetPt((Bit16u)0x2000); @@ -449,11 +464,11 @@ void DOS_SetupMemory(void) { mcb_devicedummy.SetType(0x4d); /* memory below 96k */ - mcb.SetSize(0x1800 - DOS_MEM_START - 4); + mcb.SetSize(0x1800 - DOS_MEM_START - (2+mcb_sizes)); mcb.SetType(0x4d); } else { /* complete memory up to 640k available */ - mcb.SetSize(0x9FFE - DOS_MEM_START - 2); + mcb.SetSize(0x9FFE - DOS_MEM_START - mcb_sizes); } dos.firstMCB=DOS_MEM_START;