|
|
/*++
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));
}
|