224 lines
8.6 KiB
C
224 lines
8.6 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
vga.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the definitions for the code that implements the
|
|||
|
VGA device driver.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Base address of VGA memory range. Also used as base address of VGA
|
|||
|
// memory when loading a font, which is done with the VGA mapped at A0000.
|
|||
|
//
|
|||
|
|
|||
|
#define MEM_VGA 0xA0000
|
|||
|
#define MEM_VGA_SIZE 0x20000
|
|||
|
|
|||
|
//
|
|||
|
// Index in the access range sturture for video memory
|
|||
|
// !!! This must match the VgaAccessRange structure !!!
|
|||
|
// !!! Memory is in the structure, index 2 (3rd entry) !!!
|
|||
|
|
|||
|
#define VGA_MEMORY 2
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// VGA port-related definitions.
|
|||
|
//
|
|||
|
//
|
|||
|
// Port definitions for filling the ACCSES_RANGES structure in the miniport
|
|||
|
// information, defines the range of I/O ports the VGA spans.
|
|||
|
// There is a break in the IO ports - a few ports are used for the parallel
|
|||
|
// port. Those cannot be defined in the ACCESS_RANGE, but are still mapped
|
|||
|
// so all VGA ports are in one address range.
|
|||
|
//
|
|||
|
|
|||
|
#define VGA_BASE_IO_PORT 0x000003B0
|
|||
|
#define VGA_START_BREAK_PORT 0x000003BB
|
|||
|
#define VGA_END_BREAK_PORT 0x000003C0
|
|||
|
#define VGA_MAX_IO_PORT 0x000003DF
|
|||
|
|
|||
|
//
|
|||
|
// VGA register definitions
|
|||
|
//
|
|||
|
// ports in monochrome mode
|
|||
|
#define CRTC_ADDRESS_PORT_MONO 0x0004 // CRT Controller Address and
|
|||
|
#define CRTC_DATA_PORT_MONO 0x0005 // Data registers in mono mode
|
|||
|
#define FEAT_CTRL_WRITE_PORT_MONO 0x000A // Feature Control write port
|
|||
|
// in mono mode
|
|||
|
#define INPUT_STATUS_1_MONO 0x000A // Input Status 1 register read
|
|||
|
// port in mono mode
|
|||
|
#define ATT_INITIALIZE_PORT_MONO INPUT_STATUS_1_MONO
|
|||
|
// Register to read to reset
|
|||
|
// Attribute Controller index/data
|
|||
|
|
|||
|
#define ATT_ADDRESS_PORT 0x0010 // Attribute Controller Address and
|
|||
|
#define ATT_DATA_WRITE_PORT 0x0010 // Data registers share one port
|
|||
|
// for writes, but only Address is
|
|||
|
// readable at 0x3C0
|
|||
|
#define ATT_DATA_READ_PORT 0x0011 // Attribute Controller Data reg is
|
|||
|
// readable here
|
|||
|
#define MISC_OUTPUT_REG_WRITE_PORT 0x0012 // Miscellaneous Output reg write
|
|||
|
// port
|
|||
|
#define INPUT_STATUS_0_PORT 0x0012 // Input Status 0 register read
|
|||
|
// port
|
|||
|
#define VIDEO_SUBSYSTEM_ENABLE_PORT 0x0013 // Bit 0 enables/disables the
|
|||
|
// entire VGA subsystem
|
|||
|
#define SEQ_ADDRESS_PORT 0x0014 // Sequence Controller Address and
|
|||
|
#define SEQ_DATA_PORT 0x0015 // Data registers
|
|||
|
#define DAC_PIXEL_MASK_PORT 0x0016 // DAC pixel mask reg
|
|||
|
#define DAC_ADDRESS_READ_PORT 0x0017 // DAC register read index reg,
|
|||
|
// write-only
|
|||
|
#define DAC_STATE_PORT 0x0017 // DAC state (read/write),
|
|||
|
// read-only
|
|||
|
#define DAC_ADDRESS_WRITE_PORT 0x0018 // DAC register write index reg
|
|||
|
#define DAC_DATA_REG_PORT 0x0019 // DAC data transfer reg
|
|||
|
#define FEAT_CTRL_READ_PORT 0x001A // Feature Control read port
|
|||
|
#define MISC_OUTPUT_REG_READ_PORT 0x001C // Miscellaneous Output reg read
|
|||
|
// port
|
|||
|
#define GRAPH_ADDRESS_PORT 0x001E // Graphics Controller Address
|
|||
|
#define GRAPH_DATA_PORT 0x001F // and Data registers
|
|||
|
|
|||
|
#define CRTC_ADDRESS_PORT_COLOR 0x0024 // CRT Controller Address and
|
|||
|
#define CRTC_DATA_PORT_COLOR 0x0025 // Data registers in color mode
|
|||
|
#define FEAT_CTRL_WRITE_PORT_COLOR 0x002A // Feature Control write port
|
|||
|
#define INPUT_STATUS_1_COLOR 0x002A // Input Status 1 register read
|
|||
|
// port in color mode
|
|||
|
#define ATT_INITIALIZE_PORT_COLOR INPUT_STATUS_1_COLOR
|
|||
|
// Register to read to reset
|
|||
|
// Attribute Controller index/data
|
|||
|
// toggle in color mode
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// VGA indexed register indexes.
|
|||
|
//
|
|||
|
|
|||
|
#define IND_CURSOR_START 0x0A // index in CRTC of the Cursor Start
|
|||
|
#define IND_CURSOR_END 0x0B // and End registers
|
|||
|
#define IND_CURSOR_HIGH_LOC 0x0E // index in CRTC of the Cursor Location
|
|||
|
#define IND_CURSOR_LOW_LOC 0x0F // High and Low Registers
|
|||
|
#define IND_VSYNC_END 0x11 // index in CRTC of the Vertical Sync
|
|||
|
// End register, which has the bit
|
|||
|
// that protects/unprotects CRTC
|
|||
|
// index registers 0-7
|
|||
|
#define IND_SET_RESET_ENABLE 0x01 // index of Set/Reset Enable reg in GC
|
|||
|
#define IND_DATA_ROTATE 0x03 // index of Data Rotate reg in GC
|
|||
|
#define IND_READ_MAP 0x04 // index of Read Map reg in Graph Ctlr
|
|||
|
#define IND_GRAPH_MODE 0x05 // index of Mode reg in Graph Ctlr
|
|||
|
#define IND_GRAPH_MISC 0x06 // index of Misc reg in Graph Ctlr
|
|||
|
#define IND_BIT_MASK 0x08 // index of Bit Mask reg in Graph Ctlr
|
|||
|
#define IND_SYNC_RESET 0x00 // index of Sync Reset reg in Seq
|
|||
|
#define IND_MAP_MASK 0x02 // index of Map Mask in Sequencer
|
|||
|
#define IND_MEMORY_MODE 0x04 // index of Memory Mode reg in Seq
|
|||
|
#define IND_CRTC_PROTECT 0x11 // index of reg containing regs 0-7 in
|
|||
|
// CRTC
|
|||
|
#define IND_START_ADRS_H 0x0C // index in CRTC of Start Address (high)
|
|||
|
#define IND_START_ADRS_L 0x0D // index in CRTC of Start Address (low)
|
|||
|
#define IND_LINE_COMPARE 0x18 // index in CRTC of Line Compare (bit7-0)
|
|||
|
#define IND_LINE_COMPARE8 0x07 // index in CRTC of Line Compare (bit8)
|
|||
|
#define IND_LINE_COMPARE9 0x09 // index in CRTC of Line Compare (bit9)
|
|||
|
#define IND_SET_RESET 0x00 // index of Set/Reset Plane Color Register in Graph Ctrl
|
|||
|
#define IND_COLOR_DONT_CARE 0x07 // index of Color Don't Care Register in Graph Ctrl
|
|||
|
|
|||
|
#define START_SYNC_RESET_VALUE 0x01 // value for Sync Reset reg to start
|
|||
|
// synchronous reset
|
|||
|
#define END_SYNC_RESET_VALUE 0x03 // value for Sync Reset reg to end
|
|||
|
// synchronous reset
|
|||
|
|
|||
|
//
|
|||
|
// Values for Attribute Controller Index register to turn video off
|
|||
|
// and on, by setting bit 5 to 0 (off) or 1 (on).
|
|||
|
//
|
|||
|
|
|||
|
#define VIDEO_DISABLE 0
|
|||
|
#define VIDEO_ENABLE 0x20
|
|||
|
|
|||
|
//
|
|||
|
// Value written to the Read Map register when identifying the existence of
|
|||
|
// a VGA in VgaInitialize. This value must be different from the final test
|
|||
|
// value written to the Bit Mask in that routine.
|
|||
|
//
|
|||
|
|
|||
|
#define READ_MAP_TEST_SETTING 0x03
|
|||
|
|
|||
|
//
|
|||
|
// Masks to keep only the significant bits of the Graphics Controller and
|
|||
|
// Sequencer Address registers. Masking is necessary because some VGAs, such
|
|||
|
// as S3-based ones, don't return unused bits set to 0, and some SVGAs use
|
|||
|
// these bits if extensions are enabled.
|
|||
|
//
|
|||
|
|
|||
|
#define GRAPH_ADDR_MASK 0x0F
|
|||
|
#define SEQ_ADDR_MASK 0x07
|
|||
|
|
|||
|
//
|
|||
|
// IND_DATA_ROTATE : index of Data Rotate reg in GC
|
|||
|
//
|
|||
|
#define DR_ROT_CNT 0x07 // Data Rotate Count
|
|||
|
#define DR_SET 0x00 // Data Unmodified
|
|||
|
#define DR_AND 0x08 // Data ANDed with latches
|
|||
|
#define DR_OR 0x10 // Data ORed with latches
|
|||
|
#define DR_XOR 0x18 // Data XORed with latches
|
|||
|
|
|||
|
//
|
|||
|
// IND_GRAPH_MODE : index of Mode reg in Graph Ctlr
|
|||
|
//
|
|||
|
#define M_PROC_WRITE 0x00 // Write processor data rotated
|
|||
|
#define M_LATCH_WRITE 0x01 // Write latched data
|
|||
|
#define M_COLOR_WRITE 0x02 // Write processor data as color
|
|||
|
#define M_AND_WRITE 0x03 // Write (procdata AND bitmask)
|
|||
|
#define M_DATA_READ 0x00 // Read selected plane
|
|||
|
#define M_COLOR_READ 0x08 // Read color compare
|
|||
|
|
|||
|
//
|
|||
|
// Mask used to toggle Chain4 bit in the Sequencer's Memory Mode register.
|
|||
|
//
|
|||
|
|
|||
|
#define CHAIN4_MASK 0x08
|
|||
|
|
|||
|
//
|
|||
|
// Default text mode setting for various registers, used to restore their
|
|||
|
// states if VGA detection fails after they've been modified.
|
|||
|
//
|
|||
|
|
|||
|
#define MEMORY_MODE_TEXT_DEFAULT 0x02
|
|||
|
#define BIT_MASK_DEFAULT 0xFF
|
|||
|
#define READ_MAP_DEFAULT 0x00
|
|||
|
|
|||
|
//
|
|||
|
// Palette-related info.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Highest valid DAC color register index.
|
|||
|
//
|
|||
|
|
|||
|
#define VIDEO_MAX_COLOR_REGISTER 0xFF
|
|||
|
|
|||
|
//
|
|||
|
// Highest valid palette register index
|
|||
|
//
|
|||
|
|
|||
|
#define VIDEO_MAX_PALETTE_REGISTER 0x0F
|
|||
|
|