319 lines
6.8 KiB
C
319 lines
6.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
port.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This is the console fullscreen driver for the VGA card.
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
kernel mode only
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "fsvga.h"
|
||
|
|
||
|
#define MAKEWORD(a, b) (USHORT)((((USHORT)a) & 0xFF) | ((((USHORT)(b)) << 8) & 0xFF00))
|
||
|
|
||
|
VOID
|
||
|
GetHardwareScrollReg(
|
||
|
PPORT_LIST PortList,
|
||
|
PEMULATE_BUFFER_INFORMATION EmulateInfo
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine gets the hardware scrolls register value.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
UCHAR low;
|
||
|
UCHAR high;
|
||
|
UCHAR mid;
|
||
|
|
||
|
WRITE_PORT_UCHAR(PortList[CRTCAddressPortColor].Port,
|
||
|
IND_START_ADRS_L);
|
||
|
low = READ_PORT_UCHAR(PortList[CRTCDataPortColor].Port);
|
||
|
|
||
|
WRITE_PORT_UCHAR(PortList[CRTCAddressPortColor].Port,
|
||
|
IND_START_ADRS_H);
|
||
|
high = READ_PORT_UCHAR(PortList[CRTCDataPortColor].Port);
|
||
|
|
||
|
EmulateInfo->StartAddress = MAKEWORD(low, high);
|
||
|
|
||
|
WRITE_PORT_UCHAR(PortList[CRTCAddressPortColor].Port,
|
||
|
IND_LINE_COMPARE);
|
||
|
low = READ_PORT_UCHAR(PortList[CRTCDataPortColor].Port);
|
||
|
|
||
|
WRITE_PORT_UCHAR(PortList[CRTCAddressPortColor].Port,
|
||
|
IND_LINE_COMPARE8);
|
||
|
mid = READ_PORT_UCHAR(PortList[CRTCDataPortColor].Port);
|
||
|
mid = (mid >> 4) & 1;
|
||
|
|
||
|
WRITE_PORT_UCHAR(PortList[CRTCAddressPortColor].Port,
|
||
|
IND_LINE_COMPARE9);
|
||
|
high = READ_PORT_UCHAR(PortList[CRTCDataPortColor].Port);
|
||
|
high = (high >> 5) & 2;
|
||
|
|
||
|
high |= mid;
|
||
|
EmulateInfo->LineCompare = MAKEWORD(low, high);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SetGRAMWriteMode(
|
||
|
PPORT_LIST PortList
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine sets the write mode of graphics register.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_GRAPH_MODE, M_PROC_WRITE+M_DATA_READ));
|
||
|
|
||
|
//
|
||
|
// Set up to write data without interacting with the latches.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_DATA_ROTATE, DR_SET));
|
||
|
|
||
|
//
|
||
|
// Enable all the available EGA planes.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[SEQAddressPort].Port,
|
||
|
MAKEWORD(IND_MAP_MASK, GRAPH_ADDR_MASK));
|
||
|
//
|
||
|
// Use all pixel positions.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_BIT_MASK, BIT_MASK_DEFAULT));
|
||
|
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SetGRAMCopyMode(
|
||
|
PPORT_LIST PortList
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine sets the copy mode of graphics register.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_GRAPH_MODE, M_LATCH_WRITE+M_COLOR_READ));
|
||
|
|
||
|
//
|
||
|
// Set up to write data without interacting with the latches.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_DATA_ROTATE, DR_SET));
|
||
|
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_COLOR_DONT_CARE, 0));
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SetGRAMInvertMode(
|
||
|
PPORT_LIST PortList
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine sets the invert mode of graphics register.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_GRAPH_MODE, M_AND_WRITE+M_COLOR_READ));
|
||
|
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_DATA_ROTATE, DR_XOR));
|
||
|
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_BIT_MASK, BIT_MASK_DEFAULT));
|
||
|
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_COLOR_DONT_CARE, 0));
|
||
|
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_SET_RESET, 0xff));
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
set_opaque_bkgnd_proc(
|
||
|
PPORT_LIST PortList,
|
||
|
PEMULATE_BUFFER_INFORMATION EmulateInfo,
|
||
|
PUCHAR FrameBuffer,
|
||
|
USHORT Attributes
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
set_opaque_bkgnd
|
||
|
|
||
|
Set the VGA registers for drawing a full screen byte with opaque
|
||
|
font and opaque background.
|
||
|
|
||
|
Created.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
UCHAR ColorFg = Attributes & 0x0f;
|
||
|
UCHAR ColorBg = (Attributes & 0xf0) >> 4;
|
||
|
|
||
|
if (Attributes & COMMON_LVB_REVERSE_VIDEO)
|
||
|
{
|
||
|
Attributes = ColorBg;
|
||
|
ColorBg = ColorFg;
|
||
|
ColorFg = (UCHAR)Attributes;
|
||
|
}
|
||
|
|
||
|
if (EmulateInfo->ColorFg == ColorFg &&
|
||
|
EmulateInfo->ColorBg == ColorBg)
|
||
|
return;
|
||
|
|
||
|
EmulateInfo->ColorFg = ColorFg;
|
||
|
EmulateInfo->ColorBg = ColorBg;
|
||
|
|
||
|
ColorSetDirect(PortList, FrameBuffer, ColorFg, ColorBg);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ColorSetGridMask(
|
||
|
PPORT_LIST PortList,
|
||
|
UCHAR BitMask
|
||
|
)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// That color is used for all planes.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_SET_RESET_ENABLE, GRAPH_ADDR_MASK));
|
||
|
|
||
|
//
|
||
|
// Change the Set/Reset register to be all set.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_SET_RESET, 0x07));
|
||
|
|
||
|
//
|
||
|
// Use specified pixel positions.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_BIT_MASK, BitMask));
|
||
|
|
||
|
//
|
||
|
// Set up to write data without interacting with the latches.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_DATA_ROTATE, DR_SET));
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ColorSetDirect(
|
||
|
PPORT_LIST PortList,
|
||
|
PUCHAR FrameBuffer,
|
||
|
UCHAR ColorFg,
|
||
|
UCHAR ColorBg
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
ColorSetDirect
|
||
|
|
||
|
Set the VGA registers for drawing a full screen byte with opaque
|
||
|
font and opaque background.
|
||
|
|
||
|
Created.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
//
|
||
|
// Set up to write data without interacting with the latches.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_DATA_ROTATE, DR_SET));
|
||
|
|
||
|
//
|
||
|
// Put the background color in the Set/Reset register.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_SET_RESET, ColorBg));
|
||
|
|
||
|
//
|
||
|
// That color is used for all planes.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_SET_RESET_ENABLE, GRAPH_ADDR_MASK));
|
||
|
|
||
|
//
|
||
|
// This gets our background color into the latches.
|
||
|
//
|
||
|
AccessGRAM_WR(FrameBuffer, GRAPH_ADDR_MASK);
|
||
|
|
||
|
//
|
||
|
// Change the Set/Reset register to be all zeroes.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_SET_RESET, 0));
|
||
|
|
||
|
//
|
||
|
// The Set/Reset enable register now flags where the foreground/background colors are the same.
|
||
|
//
|
||
|
ColorFg = ~(ColorFg ^ ColorBg);
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_SET_RESET_ENABLE, ColorFg));
|
||
|
|
||
|
//
|
||
|
// Color differences will be xor'd with the latches.
|
||
|
//
|
||
|
WRITE_PORT_USHORT(PortList[GRAPHAddressPort].Port,
|
||
|
MAKEWORD(IND_DATA_ROTATE, DR_XOR));
|
||
|
|
||
|
|
||
|
}
|