[NTVDM]: Fix various little things in the video BIOS (and fix some video mode registers).

svn path=/trunk/; revision=65414
This commit is contained in:
Hermès Bélusca-Maïto 2014-11-15 16:14:04 +00:00
parent d557b68747
commit f7311a5a01

View file

@ -39,8 +39,8 @@
/* PRIVATE VARIABLES **********************************************************/ /* PRIVATE VARIABLES **********************************************************/
/* /*
* VGA Register Configurations for BIOS Video Modes * VGA Register Configurations for BIOS Video Modes.
* The configurations come from DOSBox. * The configurations were checked against SeaBIOS VGA BIOS.
*/ */
static VGA_REGISTERS VideoMode_40x25_text = static VGA_REGISTERS VideoMode_40x25_text =
{ {
@ -48,7 +48,7 @@ static VGA_REGISTERS VideoMode_40x25_text =
0x67, 0x67,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x08, 0x03, 0x00, 0x07}, {0x00, 0x08, 0x03, 0x00, 0x02},
/* CRTC Registers */ /* CRTC Registers */
{0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E, {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
@ -69,7 +69,7 @@ static VGA_REGISTERS VideoMode_80x25_text =
0x67, 0x67,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x00, 0x03, 0x00, 0x07}, {0x00, 0x00, 0x03, 0x00, 0x02},
/* CRTC Registers */ /* CRTC Registers */
{0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E, {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
@ -102,7 +102,7 @@ static VGA_REGISTERS VideoMode_320x200_4color =
/* AC Registers */ /* AC Registers */
{0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00} 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00}
}; };
static VGA_REGISTERS VideoMode_640x200_2color = static VGA_REGISTERS VideoMode_640x200_2color =
@ -111,7 +111,7 @@ static VGA_REGISTERS VideoMode_640x200_2color =
0x63, 0x63,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x09, 0x0F, 0x00, 0x02}, {0x00, 0x01, 0x01, 0x00, 0x02},
/* CRTC Registers */ /* CRTC Registers */
{0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00, {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
@ -132,7 +132,7 @@ static VGA_REGISTERS VideoMode_320x200_16color =
0x63, 0x63,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x09, 0x0F, 0x00, 0x02}, {0x00, 0x09, 0x0F, 0x00, 0x06},
/* CRTC Registers */ /* CRTC Registers */
{0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00, {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
@ -143,8 +143,6 @@ static VGA_REGISTERS VideoMode_320x200_16color =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
/* AC Registers */ /* AC Registers */
// {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
// 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00} 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
}; };
@ -155,7 +153,7 @@ static VGA_REGISTERS VideoMode_640x200_16color =
0x63, 0x63,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x01, 0x0F, 0x00, 0x02}, {0x00, 0x01, 0x0F, 0x00, 0x06},
/* CRTC Registers */ /* CRTC Registers */
{0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00, {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
@ -166,8 +164,6 @@ static VGA_REGISTERS VideoMode_640x200_16color =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
/* AC Registers */ /* AC Registers */
// {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
// 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00} 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
}; };
@ -178,7 +174,7 @@ static VGA_REGISTERS VideoMode_640x350_16color =
0xA3, 0xA3,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x01, 0x0F, 0x00, 0x02}, {0x00, 0x01, 0x0F, 0x00, 0x06},
/* CRTC Registers */ /* CRTC Registers */
{0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00, {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
@ -199,7 +195,7 @@ static VGA_REGISTERS VideoMode_640x480_2color =
0xE3, 0xE3,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x01, 0x0F, 0x00, 0x02}, {0x00, 0x01, 0x0F, 0x00, 0x06},
/* CRTC Registers */ /* CRTC Registers */
{0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
@ -210,8 +206,10 @@ static VGA_REGISTERS VideoMode_640x480_2color =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
/* AC Registers */ /* AC Registers */
{0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, // {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00} // 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
{0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F,
0x00, 0x3F, 0x00, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
}; };
static VGA_REGISTERS VideoMode_640x480_16color = static VGA_REGISTERS VideoMode_640x480_16color =
@ -220,7 +218,7 @@ static VGA_REGISTERS VideoMode_640x480_16color =
0xE3, 0xE3,
/* Sequencer Registers */ /* Sequencer Registers */
{0x00, 0x01, 0x0F, 0x00, 0x02}, {0x00, 0x01, 0x0F, 0x00, 0x06},
/* CRTC Registers */ /* CRTC Registers */
{0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
@ -2287,7 +2285,7 @@ VOID VidBiosSyncCursorPosition(VOID)
VidBiosSetCursorPosition(Row, Column, Bda->VideoPage); VidBiosSetCursorPosition(Row, Column, Bda->VideoPage);
} }
BYTE VidBiosGetVideoMode(VOID) static BYTE VidBiosGetVideoMode(VOID)
{ {
/* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */ /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
return Bda->VideoMode | (Bda->VGAOptions & 0x80); return Bda->VideoMode | (Bda->VGAOptions & 0x80);
@ -2343,6 +2341,7 @@ static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
/* 256 KB Video RAM; set bit 7 if we do not clear the screen */ /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
Bda->VGAOptions = 0x60 | (DoNotClear ? 0x80 : 0x00); Bda->VGAOptions = 0x60 | (DoNotClear ? 0x80 : 0x00);
Bda->VGASwitches = 0xF9; /* High-resolution */
/* Set the start address in the CRTC */ /* Set the start address in the CRTC */
IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG); IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
@ -2363,6 +2362,8 @@ static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
for (Page = 0; Page < BIOS_MAX_PAGES; ++Page) for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
VidBiosSetCursorPosition(0, 0, Page); VidBiosSetCursorPosition(0, 0, Page);
// FIXME: We need to reset the fonts and the font vectors. (INT 1Fh and 43h).
/* Refresh display */ /* Refresh display */
VgaRefreshDisplay(); VgaRefreshDisplay();
@ -2518,13 +2519,15 @@ VOID WINAPI VidBiosVideoService(LPWORD Stack)
/* Set Text-Mode Cursor Shape */ /* Set Text-Mode Cursor Shape */
case 0x01: case 0x01:
{ {
WORD CursorStartEnd = getCX();
/* Update the BDA */ /* Update the BDA */
Bda->CursorStartLine = getCH(); Bda->CursorStartLine = HIBYTE(CursorStartEnd) & 0x1F;
Bda->CursorEndLine = getCL(); Bda->CursorEndLine = LOBYTE(CursorStartEnd) & 0x1F;
/* Modify the CRTC registers */ /* Modify the CRTC registers */
IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG); IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG);
IOWriteB(VGA_CRTC_DATA , Bda->CursorStartLine); IOWriteB(VGA_CRTC_DATA , HIBYTE(CursorStartEnd));
IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_END_REG); IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_END_REG);
IOWriteB(VGA_CRTC_DATA , Bda->CursorEndLine); IOWriteB(VGA_CRTC_DATA , Bda->CursorEndLine);
@ -3139,10 +3142,6 @@ BOOLEAN VidBiosInitialize(VOID)
/* Write the default font to the VGA font plane */ /* Write the default font to the VGA font plane */
VgaWriteFont(0, Font8x16, sizeof(Font8x16)/sizeof(Font8x16[0]) / VGA_FONT_CHARACTERS); VgaWriteFont(0, Font8x16, sizeof(Font8x16)/sizeof(Font8x16[0]) / VGA_FONT_CHARACTERS);
/* Initialize the VGA BDA data */
Bda->VGAOptions = 0x60; /* 256 KB Video RAM */
Bda->VGASwitches = 0x09; /* High-resolution */
// //
// FIXME: At the moment we always set a VGA mode. In the future, // FIXME: At the moment we always set a VGA mode. In the future,
// we should set this mode **only** when: // we should set this mode **only** when: