windows-nt/Source/XPSP1/NT/drivers/video/ms/fsvga/port.c

319 lines
6.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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));
}