singrdk/base/boot/SingLdrPc/blvideo.cpp

326 lines
5.7 KiB
C++
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
//++
//
// Copyright (c) Microsoft Corporation
//
// Module Name:
//
// blvideo.cpp
//
// Abstract:
//
// This module implements basic video support for the boot loader.
//
//--
#include "bl.h"
#define BL_VIDEO_ROW_COUNT 50
#define BL_VIDEO_COL_COUNT 80
#define BL_VIDEO_DEFAULT_ATTRIBUTE 0x1F00
#define BL_VIDEO_REGISTER_INDEX_PORT 0x3D4
#define BL_VIDEO_REGISTER_DATA_PORT 0x3D5
#define BL_VIDEO_REGISTER_CURSOR_LOW 0x0F
#define BL_VIDEO_REGISTER_CURSOR_HIGH 0x0E
#define BL_VIDEO_BASE_ADDRESS ((ULONG_PTR) 0x000B8000)
PUINT16 BlVideoBuffer = (PUINT16) BL_VIDEO_BASE_ADDRESS;
UINT16 BlVideoCursorPosition;
UINT16 BlVideoDefaultAttribute = BL_VIDEO_DEFAULT_ATTRIBUTE;
VOID
BlVideoSetCursorPosition(
UINT16 X,
UINT16 Y
)
//++
//
// Routine Description:
//
// This function sets the cursor position.
//
// Arguments:
//
// X - Supplies the X coordinate for the cursor.
//
// Y - Supplies the Y coordinate for the cursor.
//
//--
{
BlVideoCursorPosition = (Y * BL_VIDEO_COL_COUNT) + X;
BlRtlWritePort8(BL_VIDEO_REGISTER_INDEX_PORT, BL_VIDEO_REGISTER_CURSOR_HIGH);
BlRtlWritePort8(BL_VIDEO_REGISTER_DATA_PORT, (UINT8) (BlVideoCursorPosition >> 8));
BlRtlWritePort8(BL_VIDEO_REGISTER_INDEX_PORT, BL_VIDEO_REGISTER_CURSOR_LOW);
BlRtlWritePort8(BL_VIDEO_REGISTER_DATA_PORT, (UINT8) (BlVideoCursorPosition & 0xFF));
}
VOID
BlVideoGetCursorPosition(
PUINT16 X,
PUINT16 Y
)
//++
//
// Routine Description:
//
// This function gets the cursor position.
//
// Arguments:
//
// X - Supplies a pointer to the variable that will receive the X coordinate.
//
// Y - Supplies a pointer to the variable that will receive the Y coordinate.
//
//--
{
*X = BlVideoCursorPosition % BL_VIDEO_COL_COUNT;
*Y = BlVideoCursorPosition / BL_VIDEO_COL_COUNT;
}
VOID
BlVideoWriteCurrentCharacter(
UINT8 Character
)
//++
//
// Routine Description:
//
// This function writes the current character (i.e. the character under the cursor).
//
// Arguments:
//
// Character - Supplies the character to write.
//
//--
{
UINT16 X;
UINT16 Y;
BlVideoGetCursorPosition(&X, &Y);
BlVideoBuffer[(Y * BL_VIDEO_COL_COUNT) + X] = BlVideoDefaultAttribute | Character;
}
VOID
BlVideoScrollUpWindow(
UINT8 NumberOfLines
)
//++
//
// Routine Description:
//
// This function scrolls up the specified window.
//
// Arguments:
//
// NumberOfLines - Supplies the number of lines to scroll.
//
//--
{
UINT16 Delta;
UINT16 Index;
UINT16 Limit;
Limit = BL_VIDEO_COL_COUNT * BL_VIDEO_ROW_COUNT;
Delta = NumberOfLines * BL_VIDEO_COL_COUNT;
if (Delta > Limit) {
Delta = Limit;
}
for (Index = Delta; Index < Limit; Index += 1) {
BlVideoBuffer[Index - Delta] = BlVideoBuffer[Index];
}
for (Index = Limit - Delta; Index < Limit; Index += 1) {
BlVideoBuffer[Index] = BlVideoDefaultAttribute | ' ';
}
}
VOID
BlVideoPrintCharacter(
UINT8 Character
)
//++
//
// Routine Description:
//
// This function prints the specified character and advances the cursor.
//
// Arguments:
//
// Character - Supplies the character to print.
//
//--
{
UINT16 X;
UINT16 Y;
BlVideoGetCursorPosition(&X, &Y);
switch (Character) {
case '\f': {
X = 0;
Y = 0;
BlVideoInitialize();
break;
}
case '\r': {
X = 0;
break;
}
case '\n': {
X = BL_VIDEO_COL_COUNT;
break;
}
default: {
BlVideoWriteCurrentCharacter(Character);
X += 1;
}
}
if (X == BL_VIDEO_COL_COUNT) {
X = 0;
Y += 1;
}
if (Y == BL_VIDEO_ROW_COUNT) {
BlVideoScrollUpWindow(1);
Y = BL_VIDEO_ROW_COUNT - 1;
}
BlVideoSetCursorPosition(X, Y);
}
VOID
BlVideoPrintString(
PCSTR String
)
//++
//
// Routine Description:
//
// This function prints the specified string and advances the cursor.
//
// Arguments:
//
// String - Supplies a pointer to the string to print.
//
//--
{
PCSTR Next;
Next = String;
while (*Next != 0) {
BlVideoPrintCharacter(*Next);
Next += 1;
}
}
BOOLEAN
BlVideoPrintf(
PCSTR Format,
...
)
//++
//
// Routine Description:
//
// This function prints out a string.
//
// Arguments:
//
// Format - Supplies the format string.
//
// ... - Supplies the input parameters.
//
// Return Value:
//
// TRUE, if operation was successful.
// FALSE, otherwise.
//
//--
{
va_list ArgumentList;
CHAR Buffer[4096];
va_start(ArgumentList, Format);
if (BlRtlFormatString(Buffer,
sizeof(Buffer),
Format,
ArgumentList) == FALSE) {
return FALSE;
}
BlVideoPrintString(Buffer);
return TRUE;
}
VOID
BlVideoInitialize(
VOID
)
//++
//
// Routine Description:
//
// This function initializes video support for the boot loader.
//
//--
{
UINT16 Index;
UINT16 Limit;
Limit = BL_VIDEO_COL_COUNT * BL_VIDEO_ROW_COUNT;
for (Index = 0; Index < Limit; Index += 1) {
BlVideoBuffer[Index] = BlVideoDefaultAttribute | ' ';
}
BlVideoSetCursorPosition(0, 0);
}