From 154ad6437058b654ff4ab326f984f6f45c358f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Mon, 1 Aug 2005 09:30:45 +0000 Subject: [PATCH] raise dos memory start segment (WC armada, novalogic setup); update some dos tables Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2260 --- include/dos_inc.h | 30 +++++++++++++++++++++-------- src/dos/dos_classes.cpp | 42 ++++++++++++++++++++++------------------- src/dos/dos_memory.cpp | 24 ++++++++++------------- src/dos/dos_tables.cpp | 38 ++++++++++++++++++------------------- 4 files changed, 74 insertions(+), 60 deletions(-) diff --git a/include/dos_inc.h b/include/dos_inc.h index 49aa85e9..1e27f92e 100644 --- a/include/dos_inc.h +++ b/include/dos_inc.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_inc.h,v 1.53 2005-03-24 10:18:45 qbix79 Exp $ */ +/* $Id: dos_inc.h,v 1.54 2005-08-01 09:30:44 c2woody Exp $ */ #ifndef DOSBOX_DOS_INC_H #define DOSBOX_DOS_INC_H @@ -76,6 +76,15 @@ enum { RETURN_EXIT=0,RETURN_CTRLC=1,RETURN_ABORT=2,RETURN_TSR=3}; #define DOS_DRIVES 26 #define DOS_DEVICES 10 +#define DOS_INFOBLOCK_SEG 0x50 +#define DOS_SDA_SEG 0x5a +#define DOS_SDA_OFS 0 +#define DOS_CONSTRING_SEG 0x5d +#define DOS_CONDRV_SEG 0x60 +#define DOS_SFT_SEG 0x62 +#define DOS_CDS_SEG 0x64 +#define DOS_MEM_START 0x102 //First Segment that DOS can use + /* internal Dos Tables */ extern DOS_File * Files[DOS_FILES]; @@ -350,7 +359,7 @@ public: void SetCurDirStruct(Bit32u _curdirstruct); void SetFCBTable(Bit32u _fcbtable); void SetDeviceChainStart(Bit32u _devchain); - void SetDiskInfoBuffer(Bit32u _dinfobuf); + void SetDiskBufferHeadPt(Bit32u _dbheadpt); RealPt GetPointer (void); #ifdef _MSC_VER @@ -391,7 +400,17 @@ public: Bit8u bootDrive; // 0x43 boot drive Bit8u useDwordMov; // 0x44 use dword moves Bit16u extendedSize; // 0x45 size of extended memory - // some more stuff, hopefully never used. + Bit32u diskBufferHeadPt; // 0x47 pointer to least-recently used buffer header + Bit16u dirtyDiskBuffers; // 0x4b number of dirty disk buffers + Bit32u lookaheadBufPt; // 0x4d pointer to lookahead buffer + Bit16u lookaheadBufNumber; // 0x51 number of lookahead buffers + Bit8u bufferLocation; // 0x53 workspace buffer location + Bit32u workspaceBuffer; // 0x54 pointer to workspace buffer + Bit8u unknown2[11]; // 0x58 + Bit8u chainingUMB; // 0x63 bit0: UMB chain linked to MCB chain + Bit16u minMemForExec; // 0x64 minimum paragraphs needed for current program + Bit16u startOfUMBChain; // 0x66 segment of first UMB-MCB + Bit16u memAllocScanStart; // 0x68 start paragraph for memory allocation } GCC_ATTRIBUTE(packed); #ifdef _MSC_VER #pragma pack () @@ -510,11 +529,6 @@ private: #endif }; -extern Bit16u sdaseg; -#define DOS_SDA_SEG sdaseg -#define DOS_SDA_OFS 0 - - class DOS_SDA : public MemStruct { public: DOS_SDA(Bit16u _seg,Bit16u _offs) { SetPt(_seg,_offs); } diff --git a/src/dos/dos_classes.cpp b/src/dos/dos_classes.cpp index cb9307ec..dfdafe60 100644 --- a/src/dos/dos_classes.cpp +++ b/src/dos/dos_classes.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_classes.cpp,v 1.43 2005-02-10 10:20:51 qbix79 Exp $ */ +/* $Id: dos_classes.cpp,v 1.44 2005-08-01 09:30:45 c2woody Exp $ */ #include #include @@ -58,11 +58,10 @@ void DOS_ParamBlock::SaveData(void) { } -void DOS_InfoBlock::SetLocation(Bit16u segment) -{ +void DOS_InfoBlock::SetLocation(Bit16u segment) { seg = segment; pt=PhysMake(seg,0); -/* Clear the initual Block */ + /* Clear the initial Block */ for(Bitu i=0;i=0xe000) { @@ -81,20 +80,19 @@ void DOS_SetupTables(void) { dos.tables.tempdta_fcbdelete=RealMake(DOS_GetMemory(4),0); for (i=0;i20 detection routine */ /* Possibly obselete when SFT is properly handled */ - real_writed(0x5d,0x0a,0x204e4f43); - real_writed(0x5d,0x1a,0x204e4f43); - real_writed(0x5d,0x2a,0x204e4f43); + real_writed(DOS_CONSTRING_SEG,0x0a,0x204e4f43); + real_writed(DOS_CONSTRING_SEG,0x1a,0x204e4f43); + real_writed(DOS_CONSTRING_SEG,0x2a,0x204e4f43); /* create a CON device driver */ - seg=0x60; + seg=DOS_CONDRV_SEG; real_writed(seg,0x00,0xffffffff); // next ptr real_writew(seg,0x04,0x8013); // attributes real_writed(seg,0x06,0xffffffff); // strategy routine @@ -103,16 +101,16 @@ void DOS_SetupTables(void) { dos_infoblock.SetDeviceChainStart(RealMake(seg,0)); /* Create a fake SFT, so programs think there are 100 file handles */ - seg=0x62; - seg2=0x63; + seg=DOS_SFT_SEG; + seg2=DOS_SFT_SEG+1; real_writed(seg,0,seg2<<16); //Next File Table real_writew(seg,4,100); //File Table supports 100 files real_writed(seg2,0,0xffffffff); //Last File Table real_writew(seg2,4,100); //File Table supports 100 files dos_infoblock.SetfirstFileTable(RealMake(seg,0)); - /* Create a fake CDS */ - seg=0x64; + /* Create a fake Current Directory Structure */ + seg=DOS_CDS_SEG; real_writed(seg,0x00,0x005c3a43); dos_infoblock.SetCurDirStruct(RealMake(seg,0)); @@ -128,13 +126,15 @@ void DOS_SetupTables(void) { real_writew(seg,4,100); //File Table supports 100 files dos_infoblock.SetFCBTable(RealMake(seg,0)); - /* Create a fake disk info buffer */ + /* Create a fake disk buffer head */ seg=DOS_GetMemory(6); - seg2=DOS_GetMemory(6); - real_writed(seg,0x00,seg2<<16); - real_writed(seg2,0x00,0xffffffff); - real_writed(seg2,0x0d,0xffffffff); - dos_infoblock.SetDiskInfoBuffer(RealMake(seg,0)); + for (Bitu ct=0; ct<0x20; ct++) real_writeb(seg,ct,0); + real_writew(seg,0x00,0xffff); // forward ptr + real_writew(seg,0x02,0xffff); // backward ptr + real_writeb(seg,0x04,0xff); // not in use + real_writeb(seg,0x0a,0x01); // number of FATs + real_writed(seg,0x0d,0xffffffff); // pointer to DPB + dos_infoblock.SetDiskBufferHeadPt(RealMake(seg,0)); /* Set buffers to a nice value */ dos_infoblock.SetBuffers(50,50);