Author: hbelusca
Date: Tue Nov 11 18:44:03 2014
New Revision: 65379
URL:
http://svn.reactos.org/svn/reactos?rev=65379&view=rev
Log:
[NTVDM]
- Store in bit 7 of Bda->VGAOptions (40:87) whether we needed to clear video memory (or
not) when changing the video mode.
- When retrieving the current video mode, set this bit 7 as required.
- Improve a bit the DPRINT of VidBiosSetVideoMode for diagnostic purposes.
- Remove the temporary "fix" (read: hack, and it broke some apps) from r65015 /
r65018 : I'm working on a real fix.
- Rework some subfunctions of the INT 10h, AH=11h function (font generator).
- Fix reporting "256 kb video memory" in the Bda->VGAOptions flag.
Modified:
trunk/reactos/subsystems/ntvdm/bios/vidbios.c
Modified: trunk/reactos/subsystems/ntvdm/bios/vidbios.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/bios/vidb…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/bios/vidbios.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/bios/vidbios.c [iso-8859-1] Tue Nov 11 18:44:03 2014
@@ -2289,7 +2289,8 @@
BYTE VidBiosGetVideoMode(VOID)
{
- return Bda->VideoMode;
+ /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
+ return Bda->VideoMode | (Bda->VGAOptions & 0x80);
}
static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
@@ -2297,6 +2298,8 @@
BYTE Page;
COORD Resolution;
PVGA_REGISTERS VgaMode;
+
+ BYTE OrgModeNumber = ModeNumber;
/*
* IBM standard modes do not clear the screen if the
@@ -2315,18 +2318,10 @@
return FALSE;
}
- /* Check if this is the current mode */
- if (ModeNumber == Bda->VideoMode)
- {
- /* Just clear the VGA memory if needed */
- if (!DoNotClear) VgaClearMemory();
- return TRUE;
- }
-
VgaMode = VideoModes[ModeNumber];
- DPRINT1("Switching to mode %02Xh %s clearing the screen; VgaMode =
0x%p\n",
- ModeNumber, (DoNotClear ? "without" : "and"), VgaMode);
+ DPRINT1("Switching to mode %02Xh (%02Xh) %s clearing the screen; VgaMode =
0x%p\n",
+ ModeNumber, OrgModeNumber, (DoNotClear ? "without" :
"and"), VgaMode);
if (!VgaSetRegisters(VgaMode)) return FALSE;
@@ -2345,6 +2340,9 @@
Bda->VideoPageSize = VideoModePageSize[ModeNumber];
Bda->VideoPage = 0;
Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
+
+ /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
+ Bda->VGAOptions = 0x60 | (DoNotClear ? 0x80 : 0x00);
/* Set the start address in the CRTC */
IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
@@ -2738,8 +2736,8 @@
/* Get Current Video Mode */
case 0x0F:
{
- setAX(MAKEWORD(Bda->VideoMode, Bda->ScreenColumns));
- setBX(MAKEWORD(getBL(), Bda->VideoPage));
+ setAX(MAKEWORD(VidBiosGetVideoMode(), Bda->ScreenColumns));
+ setBH(Bda->VideoPage);
break;
}
@@ -2939,23 +2937,100 @@
{
switch (getAL())
{
+ /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
+ case 0x20:
+ {
+ /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
+ // Far pointer to the 8x8 characters 80h-FFh
+ ((PULONG)BaseAddress)[0x1F] = MAKELONG(getBP(), getES());
+ break;
+ }
+
+ /* Setup ROM 8x8 Font for Graphics Mode */
+ case 0x23:
+ {
+ // FIXME: Use BL and DL for the number of screen rows
+
+ /* Write the default font to the VGA font plane */
+ VgaWriteFont(0, Font8x8, sizeof(Font8x8)/sizeof(Font8x8[0]) /
VGA_FONT_CHARACTERS);
+
+ /* Update the BIOS INT 43h vector */
+ // Far pointer to the 8x8 characters 00h-...
+ ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x8_OFFSET,
VIDEO_BIOS_DATA_SEG);
+
+ break;
+ }
+
+ /* Setup ROM 8x16 Font for Graphics Mode */
+ case 0x24:
+ {
+ // FIXME: Use BL and DL for the number of screen rows
+
+ /* Write the default font to the VGA font plane */
+ VgaWriteFont(0, Font8x16, sizeof(Font8x16)/sizeof(Font8x16[0]) /
VGA_FONT_CHARACTERS);
+
+ /* Update the BIOS INT 43h vector */
+ // Far pointer to the 8x16 characters 00h-...
+ ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET,
VIDEO_BIOS_DATA_SEG);
+
+ break;
+ }
+
+ /* Get Current Character Font Information */
case 0x30:
{
- USHORT Offsets[] =
+ ULONG Address = (ULONG)NULL;
+
+ switch (getBH())
{
- FONT_8x8_HIGH_OFFSET, /* 00h - INT 0x1F pointer */
- 0, /* 01h - NOT IMPLEMENTED - INT 0x43
pointer */
- FONT_8x14_OFFSET, /* 02h - NOT IMPLEMENTED - 8x14 font */
- FONT_8x8_OFFSET, /* 03h - 8x8 font */
- FONT_8x8_HIGH_OFFSET, /* 04h - 8x8 font, upper half */
- 0, /* 05h - NOT IMPLEMENTED - 9x14 font */
- FONT_8x16_OFFSET, /* 06h - 8x16 font */
- 0, /* 07h - NOT IMPLEMENTED - 9x16 font */
- };
+ /* 00h - INT 0x1F pointer */
+ case 0x00:
+ Address = ((PULONG)BaseAddress)[0x1F];
+ break;
+
+ /* 01h - INT 0x43 pointer */
+ case 0x01:
+ Address = ((PULONG)BaseAddress)[0x43];
+ break;
+
+ /* 02h - 8x14 font */
+ case 0x02:
+ Address = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
+ break;
+
+ /* 03h - 8x8 font */
+ case 0x03:
+ Address = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
+ break;
+
+ /* 04h - 8x8 font, upper half */
+ case 0x04:
+ Address = MAKELONG(FONT_8x8_HIGH_OFFSET,
VIDEO_BIOS_DATA_SEG);
+ break;
+
+ /* 05h - NOT IMPLEMENTED - 9x14 font */
+ case 0x05:
+ break;
+
+ /* 06h - 8x16 font */
+ case 0x06:
+ Address = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
+ break;
+
+ /* 07h - NOT IMPLEMENTED - 9x16 font */
+ case 0x07:
+ break;
+
+ default:
+ DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT
IMPLEMENTED\n",
+ getBH());
+ }
/* Return the data */
- setES(VIDEO_BIOS_DATA_SEG);
- setBP(Offsets[getBH() & 7]);
+ setES(HIWORD(Address));
+ setBP(LOWORD(Address));
+ setCX(Bda->CharacterHeight);
+ setDL(Bda->ScreenRows);
break;
}
@@ -3045,27 +3120,27 @@
{
/* Some interrupts are in fact addresses to tables */
((PULONG)BaseAddress)[0x1D] = (ULONG)NULL;
+ // Far pointer to the 8x8 characters 80h-FFh
((PULONG)BaseAddress)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
// ((PULONG)BaseAddress)[0x42] = (ULONG)NULL;
- ((PULONG)BaseAddress)[0x43] = (ULONG)NULL;
+ // Far pointer to the 8x16 characters 00h-...
+ ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
((PULONG)BaseAddress)[0x44] = (ULONG)NULL;
+ // ((PULONG)BaseAddress)[0x6D] = (ULONG)NULL;
/* Fill the tables */
RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x8_OFFSET),
- Font8x8,
- sizeof(Font8x8));
+ Font8x8, sizeof(Font8x8));
RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x16_OFFSET),
- Font8x16,
- sizeof(Font8x16));
+ Font8x16, sizeof(Font8x16));
RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x14_OFFSET),
- Font8x14,
- sizeof(Font8x14));
+ Font8x14, sizeof(Font8x14));
/* Write the default font to the VGA font plane */
- VgaWriteFont(0, Font8x16, 16);
+ VgaWriteFont(0, Font8x16, sizeof(Font8x16)/sizeof(Font8x16[0]) /
VGA_FONT_CHARACTERS);
/* Initialize the VGA BDA data */
- Bda->VGAOptions = 0x30; /* 256 KB Video RAM */
+ Bda->VGAOptions = 0x60; /* 256 KB Video RAM */
Bda->VGASwitches = 0x09; /* High-resolution */
//