diff --git a/reactos/subsystems/ntvdm/bios/vidbios.c b/reactos/subsystems/ntvdm/bios/vidbios.c index ac1c595bf78..975dbb49149 100644 --- a/reactos/subsystems/ntvdm/bios/vidbios.c +++ b/reactos/subsystems/ntvdm/bios/vidbios.c @@ -39,8 +39,8 @@ /* PRIVATE VARIABLES **********************************************************/ /* - * VGA Register Configurations for BIOS Video Modes - * The configurations come from DOSBox. + * VGA Register Configurations for BIOS Video Modes. + * The configurations were checked against SeaBIOS VGA BIOS. */ static VGA_REGISTERS VideoMode_40x25_text = { @@ -48,7 +48,7 @@ static VGA_REGISTERS VideoMode_40x25_text = 0x67, /* Sequencer Registers */ - {0x00, 0x08, 0x03, 0x00, 0x07}, + {0x00, 0x08, 0x03, 0x00, 0x02}, /* CRTC Registers */ {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E, @@ -69,7 +69,7 @@ static VGA_REGISTERS VideoMode_80x25_text = 0x67, /* Sequencer Registers */ - {0x00, 0x00, 0x03, 0x00, 0x07}, + {0x00, 0x00, 0x03, 0x00, 0x02}, /* CRTC Registers */ {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E, @@ -102,7 +102,7 @@ static VGA_REGISTERS VideoMode_320x200_4color = /* AC Registers */ {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 = @@ -111,7 +111,7 @@ static VGA_REGISTERS VideoMode_640x200_2color = 0x63, /* Sequencer Registers */ - {0x00, 0x09, 0x0F, 0x00, 0x02}, + {0x00, 0x01, 0x01, 0x00, 0x02}, /* CRTC Registers */ {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00, @@ -132,7 +132,7 @@ static VGA_REGISTERS VideoMode_320x200_16color = 0x63, /* Sequencer Registers */ - {0x00, 0x09, 0x0F, 0x00, 0x02}, + {0x00, 0x09, 0x0F, 0x00, 0x06}, /* CRTC Registers */ {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}, /* 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, 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00} }; @@ -155,7 +153,7 @@ static VGA_REGISTERS VideoMode_640x200_16color = 0x63, /* Sequencer Registers */ - {0x00, 0x01, 0x0F, 0x00, 0x02}, + {0x00, 0x01, 0x0F, 0x00, 0x06}, /* CRTC Registers */ {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}, /* 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, 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00} }; @@ -178,7 +174,7 @@ static VGA_REGISTERS VideoMode_640x350_16color = 0xA3, /* Sequencer Registers */ - {0x00, 0x01, 0x0F, 0x00, 0x02}, + {0x00, 0x01, 0x0F, 0x00, 0x06}, /* CRTC Registers */ {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00, @@ -199,7 +195,7 @@ static VGA_REGISTERS VideoMode_640x480_2color = 0xE3, /* Sequencer Registers */ - {0x00, 0x01, 0x0F, 0x00, 0x02}, + {0x00, 0x01, 0x0F, 0x00, 0x06}, /* CRTC Registers */ {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}, /* AC Registers */ - {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00} +// {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, +// 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 = @@ -220,7 +218,7 @@ static VGA_REGISTERS VideoMode_640x480_16color = 0xE3, /* Sequencer Registers */ - {0x00, 0x01, 0x0F, 0x00, 0x02}, + {0x00, 0x01, 0x0F, 0x00, 0x06}, /* CRTC Registers */ {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, @@ -2287,7 +2285,7 @@ VOID VidBiosSyncCursorPosition(VOID) VidBiosSetCursorPosition(Row, Column, Bda->VideoPage); } -BYTE VidBiosGetVideoMode(VOID) +static BYTE VidBiosGetVideoMode(VOID) { /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */ 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 */ Bda->VGAOptions = 0x60 | (DoNotClear ? 0x80 : 0x00); + Bda->VGASwitches = 0xF9; /* High-resolution */ /* Set the start address in the CRTC */ 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) VidBiosSetCursorPosition(0, 0, Page); + // FIXME: We need to reset the fonts and the font vectors. (INT 1Fh and 43h). + /* Refresh display */ VgaRefreshDisplay(); @@ -2518,13 +2519,15 @@ VOID WINAPI VidBiosVideoService(LPWORD Stack) /* Set Text-Mode Cursor Shape */ case 0x01: { + WORD CursorStartEnd = getCX(); + /* Update the BDA */ - Bda->CursorStartLine = getCH(); - Bda->CursorEndLine = getCL(); + Bda->CursorStartLine = HIBYTE(CursorStartEnd) & 0x1F; + Bda->CursorEndLine = LOBYTE(CursorStartEnd) & 0x1F; /* Modify the CRTC registers */ 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_DATA , Bda->CursorEndLine); @@ -3139,10 +3142,6 @@ BOOLEAN VidBiosInitialize(VOID) /* Write the default font to the VGA font plane */ 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, // we should set this mode **only** when: