Author: hbelusca Date: Mon May 19 02:21:49 2014 New Revision: 63367
URL: http://svn.reactos.org/svn/reactos?rev=63367&view=rev Log: [NTVDM] - Initialize the BIOS Configuration Table, see http://www.ctyme.com/intr/rb-1594.htm for more information. - Implement INT 15h, AH=C0h "GET CONFIGURATION".
Modified: trunk/reactos/subsystems/ntvdm/bios/bios.c trunk/reactos/subsystems/ntvdm/bios/bios.h trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c
Modified: trunk/reactos/subsystems/ntvdm/bios/bios.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/bios.... ============================================================================== --- trunk/reactos/subsystems/ntvdm/bios/bios.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/ntvdm/bios/bios.c [iso-8859-1] Mon May 19 02:21:49 2014 @@ -37,6 +37,7 @@
static CALLBACK16 __BiosContext; PBIOS_DATA_AREA Bda; +PBIOS_CONFIG_TABLE Bct;
/* PRIVATE FUNCTIONS **********************************************************/
@@ -134,8 +135,10 @@ /* Disable interrupts */ setIF(0);
- /* Initialize the BDA pointer */ - Bda = (PBIOS_DATA_AREA)SEG_OFF_TO_PTR(BDA_SEGMENT, 0); + /* Initialize the BDA and the BCT pointers */ + Bda = (PBIOS_DATA_AREA)SEG_OFF_TO_PTR(BDA_SEGMENT, 0x0000); + // The BCT is found at F000:E6F5 for 100% compatible BIOSes. + Bct = (PBIOS_CONFIG_TABLE)SEG_OFF_TO_PTR(BIOS_SEGMENT, 0xE6F5);
/* Register the BIOS support BOPs */ RegisterBop(BOP_BIOSINIT , BiosInitBop);
Modified: trunk/reactos/subsystems/ntvdm/bios/bios.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/bios.... ============================================================================== --- trunk/reactos/subsystems/ntvdm/bios/bios.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/ntvdm/bios/bios.h [iso-8859-1] Mon May 19 02:21:49 2014 @@ -22,6 +22,8 @@
#define BIOS_EQUIPMENT_LIST 0x2C // HACK: Disable FPU for now
+#pragma pack(push, 1) + /* * BIOS Data Area at 0040:XXXX * @@ -29,7 +31,6 @@ * and: http://www.bioscentral.com/misc/bda.htm * for more information. */ -#pragma pack(push, 1) typedef struct { WORD SerialPorts[4]; // 0x00 @@ -96,13 +97,30 @@ BYTE Reserved17[15]; // 0x121 BYTE Reserved18[3]; // 0x130 } BIOS_DATA_AREA, *PBIOS_DATA_AREA; +C_ASSERT(sizeof(BIOS_DATA_AREA) == 0x133); + +/* + * BIOS Configuration Table at F000:E6F5 for 100% compatible BIOSes. + * + * See: http://www.ctyme.com/intr/rb-1594.htm + * for more information. + */ +typedef struct _BIOS_CONFIG_TABLE +{ + WORD Length; // 0x00 + BYTE Model; // 0x02 + BYTE SubModel; // 0x03 + BYTE BiosRevision; // 0x04 + BYTE BiosFeature[5]; // 0x05 -- 0x09 + // Other BIOSes may extend this table. We don't. +} BIOS_CONFIG_TABLE, *PBIOS_CONFIG_TABLE; + #pragma pack(pop) - -C_ASSERT(sizeof(BIOS_DATA_AREA) == 0x133);
/* FUNCTIONS ******************************************************************/
extern PBIOS_DATA_AREA Bda; +extern PBIOS_CONFIG_TABLE Bct;
VOID WINAPI BiosEquipmentService(LPWORD Stack); VOID WINAPI BiosGetMemorySize(LPWORD Stack);
Modified: trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/bios3... ============================================================================== --- trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/ntvdm/bios/bios32/bios32.c [iso-8859-1] Mon May 19 02:21:49 2014 @@ -107,6 +107,20 @@ setAX(MAKEWORD(Low, High));
/* Clear CF */ + Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF; + + break; + } + + /* Get Configuration */ + case 0xC0: + { + /* Return the BIOS ROM Configuration Table address in ES:BX */ + setES(HIWORD(Bct)); + setBX(LOWORD(Bct)); + + /* Call successful; clear CF */ + setAH(0x00); Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
break; @@ -336,25 +350,22 @@ ((PULONG)BaseAddress)[0x49] = (ULONG)NULL; }
-/* PUBLIC FUNCTIONS ***********************************************************/ - -/* - * The BIOS POST (Power On-Self Test) - */ -BOOLEAN Bios32Initialize(VOID) -{ - BOOLEAN Success; +static VOID InitializeBiosInfo(VOID) +{ + Bct->Length = sizeof(*Bct); + Bct->Model = 0xFC; // PC-AT; see http://www.ctyme.com/intr/rb-1594.htm#Table515 + Bct->SubModel = 0x00; + Bct->BiosRevision = 0x01; + Bct->BiosFeature[0] = 0x64; // At the moment we don't support "INT 15/AH=4Fh called upon INT 09h" nor "wait for external event (INT 15/AH=41h) supported"; see http://www.ctyme.com/intr/rb-1594.htm#Table510 + Bct->BiosFeature[1] = 0x00; // We don't support anything from here; see http://www.ctyme.com/intr/rb-1594.htm#Table511 + Bct->BiosFeature[2] = 0x00; + Bct->BiosFeature[3] = 0x00; + Bct->BiosFeature[4] = 0x00; +} + +static VOID InitializeBiosData(VOID) +{ UCHAR Low, High; - - /* Initialize the stack */ - // That's what says IBM... (stack at 30:00FF going downwards) - // setSS(0x0000); - // setSP(0x0400); - setSS(0x0050); // Stack at 50:0400, going downwards - setSP(0x0400); - - /* Set data segment */ - setDS(BDA_SEGMENT);
/* Initialize the BDA contents */ Bda->EquipmentList = BIOS_EQUIPMENT_LIST; @@ -368,6 +379,30 @@ IOWriteB(CMOS_ADDRESS_PORT, CMOS_REG_BASE_MEMORY_HIGH); High = IOReadB(CMOS_DATA_PORT); Bda->MemorySize = MAKEWORD(Low, High); +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * The BIOS POST (Power On-Self Test) + */ +BOOLEAN Bios32Initialize(VOID) +{ + BOOLEAN Success; + + /* Initialize the stack */ + // That's what says IBM... (stack at 30:00FF going downwards) + // setSS(0x0000); + // setSP(0x0400); + setSS(0x0050); // Stack at 50:0400, going downwards + setSP(0x0400); + + /* Set data segment */ + setDS(BDA_SEGMENT); + + /* Initialize the BDA and the BIOS ROM Information */ + InitializeBiosData(); + InitializeBiosInfo();
/* Register the BIOS 32-bit Interrupts */ InitializeBiosInt32();