diff --git a/include/miscemu.h b/include/miscemu.h index 558f8410187..f8231b673e8 100644 --- a/include/miscemu.h +++ b/include/miscemu.h @@ -15,7 +15,9 @@ extern int DOSCONF_ReadConfig(void); /* msdos/dosmem.c */ -extern HANDLE16 DOSMEM_BiosSeg; +extern HANDLE16 DOSMEM_BiosDataSeg; +extern HANDLE16 DOSMEM_BiosSysSeg; + extern DWORD DOSMEM_CollateTable; extern DWORD DOSMEM_ErrorCall; diff --git a/loader/main.c b/loader/main.c index 278c0e989a3..fe12ef68a84 100644 --- a/loader/main.c +++ b/loader/main.c @@ -138,9 +138,9 @@ BOOL32 WINAPI MAIN_KernelInit(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvR SET_ENTRY_POINT( 195, 0xc0000 ); /* KERNEL.195: __C000H */ SET_ENTRY_POINT( 179, 0xd0000 ); /* KERNEL.179: __D000H */ SET_ENTRY_POINT( 190, 0xe0000 ); /* KERNEL.190: __E000H */ - SET_ENTRY_POINT( 173, 0xf0000 ); /* KERNEL.173: __ROMBIOS */ - SET_ENTRY_POINT( 194, 0xf0000 ); /* KERNEL.194: __F000H */ - NE_SetEntryPoint( hModule, 193, DOSMEM_BiosSeg ); /* KERNEL.193: __0040H */ + NE_SetEntryPoint( hModule, 173, DOSMEM_BiosSysSeg ); /* KERNEL.173: __ROMBIOS */ + NE_SetEntryPoint( hModule, 193, DOSMEM_BiosDataSeg ); /* KERNEL.193: __0040H */ + NE_SetEntryPoint( hModule, 194, DOSMEM_BiosSysSeg ); /* KERNEL.194: __F000H */ #undef SET_ENTRY_POINT } diff --git a/miscemu/instr.c b/miscemu/instr.c index d685a0b4468..8b4877bc2a6 100644 --- a/miscemu/instr.c +++ b/miscemu/instr.c @@ -65,7 +65,7 @@ static BOOL32 INSTR_ReplaceSelector( SIGCONTEXT *context, WORD *sel ) static WORD sys_timer = 0; if (!sys_timer) sys_timer = CreateSystemTimer( 55, DOSMEM_Tick ); - *sel = DOSMEM_BiosSeg; + *sel = DOSMEM_BiosDataSeg; return TRUE; } return FALSE; /* Can't replace selector, crashdump */ diff --git a/msdos/dosmem.c b/msdos/dosmem.c index eaf67b5cae7..2bdf1f9ea9e 100644 --- a/msdos/dosmem.c +++ b/msdos/dosmem.c @@ -18,7 +18,8 @@ #include "task.h" #include "debug.h" -HANDLE16 DOSMEM_BiosSeg; /* BIOS data segment at 0x40:0 */ +HANDLE16 DOSMEM_BiosDataSeg; /* BIOS data segment at 0x40:0 */ +HANDLE16 DOSMEM_BiosSysSeg; /* BIOS ROM segment at 0xf000:0 */ #pragma pack(1) @@ -199,13 +200,16 @@ static void DOSMEM_InitDPMI(void) } /*********************************************************************** - * DOSMEM_FillBiosSegment + * DOSMEM_FillBiosSegments * * Fill the BIOS data segment with dummy values. */ -static void DOSMEM_FillBiosSegment(void) +static void DOSMEM_FillBiosSegments(void) { - pBiosData = (BIOSDATA *)GlobalLock16( DOSMEM_BiosSeg ); + BYTE *pBiosSys = (BYTE *)GlobalLock16( DOSMEM_BiosSysSeg ); + BYTE *pBiosROMTable = pBiosSys+0xe6f5; + + pBiosData = (BIOSDATA *)GlobalLock16( DOSMEM_BiosDataSeg ); /* Clear all unused values */ memset( pBiosData, 0, sizeof(*pBiosData) ); @@ -229,6 +233,23 @@ static void DOSMEM_FillBiosSegment(void) pBiosData->NbHardDisks = 2; pBiosData->KbdBufferStart = 0x1e; pBiosData->KbdBufferEnd = 0x3e; + + /* fill ROM configuration table (values from Award) */ + *(WORD *)(pBiosROMTable)= 0x08; /* number of bytes following */ + *(pBiosROMTable+0x2) = 0xfc; /* model */ + *(pBiosROMTable+0x3) = 0x01; /* submodel */ + *(pBiosROMTable+0x4) = 0x00; /* BIOS revision */ + *(pBiosROMTable+0x5) = 0x74; /* feature byte 1 */ + *(pBiosROMTable+0x6) = 0x00; /* feature byte 2 */ + *(pBiosROMTable+0x7) = 0x00; /* feature byte 3 */ + *(pBiosROMTable+0x8) = 0x00; /* feature byte 4 */ + *(pBiosROMTable+0x9) = 0x00; /* feature byte 5 */ + + /* BIOS date string */ + strcpy((char *)pBiosSys+0xfff5, "13/01/99"); + + /* BIOS ID */ + *(pBiosSys+0xfffe) = 0xfc; } /*********************************************************************** @@ -353,10 +374,12 @@ BOOL32 DOSMEM_Init(HMODULE16 hModule) WARN(dosmem, "Could not allocate DOS memory.\n" ); return FALSE; } - DOSMEM_BiosSeg = GLOBAL_CreateBlock(GMEM_FIXED,DOSMEM_dosmem+0x400,0x100, - 0, FALSE, FALSE, FALSE, NULL ); + DOSMEM_BiosDataSeg = GLOBAL_CreateBlock(GMEM_FIXED,DOSMEM_dosmem+0x400, + 0x100, 0, FALSE, FALSE, FALSE, NULL ); + DOSMEM_BiosSysSeg = GLOBAL_CreateBlock(GMEM_FIXED,DOSMEM_dosmem+0xf0000, + 0x10000, 0, FALSE, FALSE, FALSE, NULL ); DOSMEM_FillIsrTable(0); - DOSMEM_FillBiosSegment(); + DOSMEM_FillBiosSegments(); DOSMEM_InitMemory(0); DOSMEM_InitCollateTable(); DOSMEM_InitErrorTable(); diff --git a/msdos/int15.c b/msdos/int15.c index ca046d17610..b150a8f18ad 100644 --- a/msdos/int15.c +++ b/msdos/int15.c @@ -21,6 +21,16 @@ void WINAPI INT_Int15Handler( CONTEXT *context ) RESET_CFLAG(context); break; + case 0xc0: /* GET CONFIGURATION */ + if (ISV86(context)) /* real */ + ES_reg(context) = 0xf000; + else + ES_reg(context) = DOSMEM_BiosSysSeg; + BX_reg(context) = 0xe6f5; + AH_reg(context) = 0x0; + RESET_CFLAG(context); + break; + default: INT_BARF( context, 0x15 ); }