mirror of
https://github.com/reactos/reactos.git
synced 2024-09-12 22:02:18 +00:00
[NTVDM]
Properly clear the video memory when switching to a different mode. svn path=/trunk/; revision=68091
This commit is contained in:
parent
e730ef4e7d
commit
a9a14ab22b
|
@ -2387,6 +2387,44 @@ static inline BYTE VidBiosGetVideoMode(VOID)
|
||||||
return Bda->VideoMode | (Bda->VGAOptions & 0x80);
|
return Bda->VideoMode | (Bda->VGAOptions & 0x80);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline VOID VidBiosClearScreen(VOID)
|
||||||
|
{
|
||||||
|
static const DWORD MemoryMaps[4] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
|
||||||
|
static const DWORD MemorySizes[4] = { 0x20000, 0x10000, 0x10000, 0x8000 };
|
||||||
|
|
||||||
|
DWORD VideoAddress;
|
||||||
|
BYTE Buffer[0x20000];
|
||||||
|
DWORD BufferSize;
|
||||||
|
BYTE Misc;
|
||||||
|
|
||||||
|
/* Read the misc register */
|
||||||
|
IOWriteB(VGA_GC_INDEX, VGA_GC_MISC_REG);
|
||||||
|
Misc = IOReadB(VGA_GC_DATA);
|
||||||
|
|
||||||
|
/* Get the video address */
|
||||||
|
VideoAddress = MemoryMaps[(Misc >> 2) & 3];
|
||||||
|
BufferSize = MemorySizes[(Misc >> 2) & 3];
|
||||||
|
|
||||||
|
if (Misc & 1)
|
||||||
|
{
|
||||||
|
/* Graphics mode */
|
||||||
|
RtlZeroMemory(Buffer, BufferSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INT i;
|
||||||
|
|
||||||
|
/* Text mode */
|
||||||
|
for (i = 0; i < (BufferSize >> 1); i++)
|
||||||
|
{
|
||||||
|
((PWORD)Buffer)[i] = MAKEWORD(' ', DEFAULT_ATTRIBUTE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write to video memory */
|
||||||
|
EmulatorWriteMemory(&EmulatorContext, VideoAddress, Buffer, BufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
|
static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
|
||||||
{
|
{
|
||||||
BYTE Page;
|
BYTE Page;
|
||||||
|
@ -2503,30 +2541,7 @@ 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);
|
||||||
|
|
||||||
// HACK: We clear here all the text memory. TODO: Do it better!
|
if (!DoNotClear) VidBiosClearScreen();
|
||||||
if (!DoNotClear && ((ModeNumber >= 0x00 && ModeNumber <= 0x03) || (ModeNumber == 0x07)))
|
|
||||||
{
|
|
||||||
INT i, j;
|
|
||||||
DWORD VideoAddress;
|
|
||||||
WORD FillCharacter = MAKEWORD(' ', DEFAULT_ATTRIBUTE);
|
|
||||||
|
|
||||||
for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
|
|
||||||
{
|
|
||||||
VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
|
|
||||||
|
|
||||||
for (i = 0; i <= Bda->ScreenRows; i++)
|
|
||||||
{
|
|
||||||
for (j = 0; j <= Bda->ScreenColumns - 1; j++)
|
|
||||||
{
|
|
||||||
/* Write to video memory */
|
|
||||||
EmulatorWriteMemory(&EmulatorContext,
|
|
||||||
VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
|
|
||||||
(LPVOID)&FillCharacter,
|
|
||||||
sizeof(FillCharacter));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Refresh display */
|
/* Refresh display */
|
||||||
VgaRefreshDisplay();
|
VgaRefreshDisplay();
|
||||||
|
|
Loading…
Reference in a new issue