IBM XGA 1024*768 interlaced IBM XGA-NI 1024*768 Non-interlaced All register accesses happen through a block of 16 registers starting at a adapter dependent register (called xga in the following). The register xga+0Ah works as an indexed register i.e.. xga+0Ah is the index register and xga+0Bh is the data register. Also a block of 128 bytes memory mapped registers exists, primarily used for the accelerator functions. General note: When writing to XGA registers undefined bits must be set to 0 unless otherwise specified. When reading the undefined bits may be truly undefined, i.e. random. 0100h W(R): Identification Word bit 0-15 Identification Word ID'ng the XGA board. 8FDAh = The IBM XGA-NI. 8FDBh = Original IBM XGA (8FD8h-8FDBh is reserved for IBM XGA's). VESA defines the following ranges for XGA compatible boards: 240h-27Fh, 830h-0A7F, 0A90h-0BFFh and 8FD0h-8FD3h(reserved) Note: POS register access must be enabled. 0102h (R/W): XGA Configuration Register bit 0 XGA_ENABLE. If set the XGA registers can be accessed, when cleared only the POS registers (100h-105h) can be accessed. 1-3 INSTANCE. IDs the particular XGA adapter (there can be up to 8 in a system). This value is used to define the XGA base address (21x0h) and which 128 byte block of the 1KB external memory the memory mapped registers are located in. 4-7 EXT_MEM_ADDR. Defines the address the 8KB (usually 7KB ROM and 1KB dedicated to XGA memory mapped registers) external memory is mapped to: 0 = 0C000h, 1 = 0C2000h, 2 = 0C4000h, 3 = 0C6000h 4 = 0C800h, 5 = 0CA000h, 6 = 0CC000h, 7 = 0CE000h 8 = 0D000h, 9 = 0D2000h, 0A = 0D4000h, 0B = 0D6000h 0C = 0D800h, 0D = 0DA000h, 0E = 0DC000h, 0F = 0DE000h The external memory can be disabled by clearing the EXT_MEM_ENABLE bit in the Bus Arbitration Register (103h). 0103h (R/W): Bus Arbitration Register bit 1 EXT_MEM_ENABLE. If set the 8KB external memory block can be accesses, if clear only the 1KB memory mapped registers can be accessed. 2 FAIR_ENABLE. If set the MCA fairness protocol is enabled. 3-6 ARB_LEVEL. The MCA bus arbitration level. Note: for VESA systems set 106h to 0 to access this register. 0104h (R/W): Display Memory Base Address bit 0 DISP_MEM_ACCESS. If set the display memory is mapped as a contiguous 4MB chunk at the address described below. 1-7 DISP_MEM_BASE. The upper 7 bits (25-31) of the display memory address. Bit 22-24 is taken from the INSTANCE field of register 102h. Note: for VESA local bus systems set 106h to 0 to access this register. 0104h index 1 (R): Manufactor ID low (VESA) bit 0-7 Low byte of manufactor ID. Note: Set 106h to 1 to read this register Note: This register may be implemented as Read only or Read/Write. 0104h index 2 (R): Manufactor ID high (VESA) bit 0-7 High byte of manufactor ID. This register is optional and reads as 0 if not implemented Note: Set 106h to 2 to read this register Note: This register may be implemented as Read only or Read/Write. 0104h index 3 (R/W): VGA BIOS Configuration (VESA) bit 0 VGA BIOS ROM Decode Enabled if set 1-3 VGA BIOS ROM Decode Location. VGA BIOS ROM at: 0: C000h, 1: C800h, 2: D000h, 3: D800h, 4: E000h, 5: E800h Note: Set 106h to 1 to read this register 0105h (R/W): 1MB Aperture Base Address bit 0-3 BASE_1MB. Determines the address of the 1MB aperture where the video memory will be mapped. 0 indicates that a 1MB block could not be found in the lower 16MB of the address space. Note: When writing to this register bits 4-7 must be written as 1101b, i.e.. 0BFh. 0106h W(W): POS index (VESA) bit 0-15 This register determines the content of register 0103h and 0104h. Values 4-0Fh are reserved. When this register is 0 the registers at 0103h and 0104h are fully compatible with the IBM XGA and XGA-NI. For 0103h only index 0 is defined, for 0104 index 0-3 are defined. 0109h (R/W): ISA POS Enable (VESA - ISA) bit 0-2 Instance Number (must match the instance (i.e.. 1) to enable) 3 Setup Mode Enable. If set the POS registers (0100h-0107h) may be accessed. Note: VESA reserves 0108h-010Fh for systems with more than one XGA, but currently only implements instance 1 (0109h). 21x0h (R/W): Operating Mode Register bit 0-2 DISPLAY_MODE. 0 = VGA mode, disable XGA address decode 1 = VGA mode, enable XGA address decode 2 = 132 column text mode, disable XGA address decode 3 = 132 column text mode, enable XGA address decode. 4 = XGA Extended Graphics mode. 3 REG_FORMAT. If set the memory mapped registers use Motorola or "Big-endian" format rather than Intel or "little-endian". In Big-endian format the byte order in each double word (4 bytes) is swapped except for the Short Stroke (2Ch) and Command (7Ch) registers. 4 (XGA-NI only) MFI_CTRL_ENAB. If set the MFI Control register (index 6Dh) is enabled. This bit is write only. 21x1h (R/W): Video Memory Aperture Control bit 0-1 MEMWIN_ACCESS. 0 = disable 64k aperture 1 = enable 64k aperture at 0A0000h 2 = enable 64k aperture at 0B0000h 21x4h (R/W): Interrupt Enable Register bit 0 START_BLNK_ENAB. If set an interrupt is issued at the start of the Vertical Blanking period. 1 START_PIC_ENAB. If set an interrupt is issued when the Vertical Blanking period ends, i.e.. at the start of the frame. 2 SPRT_DSPCMP_ENAB. If set an interrupt is issued when the hardware sprite has been displayed, i.e.. when the beam passes the lower right corner. 6 ACCESS_REJ_ENAB. If set an interrupt is issued if the XGA Memory Registers are written to while an XGA command is active, which can corrupt the command. 7 CMD_DONE_ENAB. If set an interrupt is issued whenever a graphics command completes. Note: These bits control the issuing of IRQ2 interrupts. 21x5h (R/W): Interrupt Status Register bit 0 START_BLNK_STAT. Set when the Vertical Blanking starts. 1 START_PIC_STAT. Set when the Vertical Blanking ends. 2 SPRT_DSPCMP_STAT. Set when the beam passes the hardware sprite. 6 ACCESS_REJ_STAT. Set if the XGA Memory Registers are written to while an XGA command is active. 7 CMD_DONE_STAT. Set whenever an XGA command completes. Note: These bits are set whenever the specified event occurs and remains set until cleared by writing a 1 to the field. The bits are set whether the corresponding flag in 21x4h is enabled or not. 21x6h (R/W): Virtual Memory Control bit 0 ENAB_VIRT_LU. If set all XGA addresses are translated through the 386 Memory Management Unit, if clear all addresses are physical. 2 USER_SUPER. If set the XGA performs access checking. It also generates an I/O exception when this register is written to. If clear no access or I/O control is performed. 6 PROT_VIOL_ENAB. If set the XGA will issue an IRQ2 interrupt when a memory protection violation occurs. 7 PAGE_NP_ENAB. If set the XGA will issue an IRQ2 interrupt when a virtual page is accessed which is not in memory. 21x7h (R/W): Virtual Memory Interrupt Status Register bit 6 PROT_VIOL_STAT. Set if a protection violation was found. 7 PAGE_NP_STAT. Set if a not-present page has been accessed. Note: The bits are set whether or not the corresponding flag in 21x6h is set. The bits are cleared by writing a 1 to the bit, but as this will cause a page retry of the failed access, care should be taken. 21x8h (R/W): Video Memory Aperture Index. bit 0-5 MEMWIN_BANK. If in 64k aperture mode, this defines the 64k block mapped at 0A0000h or 0B0000h. If in 1MB aperture mode bits 4-5 defines which 1MB block is mapped at the 1MB aperture. bits 0-3 should be set to 0. 21x9h (R/W): Memory Access Mode bit 0-2 MEMPIX_SIZE. Defines bits/pixel. 0 = 1bit, 1 = 2 bits, 2 = 4 bits, 3 = 8 bits, 4 = 16 bits. 3 MEMPIX_FORMAT. If set the video memory is in Motorola or "Big- endian" format. 21xAh (R/W): Index Register bit 0-7 The index for the following access to 21xB. 21xBh accesses the index register set in 21xAh. 21xCh-21xFh accesses the index register set in 21xAh + 0-3. I.e.. a word read of 210Eh (and thus 210Fh) will read (index+2 & index+3). 21xAh index 0 (R/W): Memory Configuration 0 bit 0-1 VRAM_SERDATA_WID. The width of serial VRAM transfers. 1 = 16bit, 2 = 32bit. 21xAh index 1 (R/W): Memory Configuration 1 bit 0 VRAM_RASCAS_EXT. If set extended CAS and RAS cycles are used for all cycles except refresh. 1 VRAM_RAS_PRECH. If set extended RAS precharge time is used between consecutive VRAM cycles. 2 VRAM_REF_EXT. If set extended CAS and RAS cycles are used for refresh. 21xAh index 2 (R/W): Memory Configuration 2 bit 3 VRAM_SER_LEN. If set the VRAM serializer is 512 bits long rather than 256 bits. 21xAh index 4 (R): Auto-Configuration bit 0 (XGA,XGA-NI) BUS_SIZE. If set the XGA is in a 32bit system (MCA, EISA, LocalBus), if clear it is in an ISA slot and no 4MB aperture mode. 0,3 (VESA) BUS_SIZE. 0 = 16bit, 1 = 32 bit, 2 = 8 bit. 4-5 (VESA) Subsystem Interface Configuration. 0 = MCA, 1 = ISA, 3 = EISA. 21xAh index 0Ch (R/W): State A Data Note: The XGA state can be saved by suspending the current operation in the Control Register, then reading the number of DWORDs from the State A Data register specified in the State A Length Memory register, then reading the number of DWORDs from the State B Data Register specified in the State B Length Memory Register and finally saving the frame buffer. To restore the state follow the procedure in reverse order ending with enabling the suspended operation in the Control Register. 21xAh index 0Dh (R/W): State B Data Note: see State Save/Restore process under 21xAh index 0Ch. 21xAh index 10h W(R/W): Horizontal Total bit 0-15 Total number of character clocks in a scanline. The number of pixels in a scanline is (value+1)*8 21xAh index 12h W(R/W): Horizontal Displayed. bit 0-15 Number of displayed character clocks in a scanline. The number of displayed pixels is (value+1)*8 21xAh index 14h W(R/W): Horizontal Blanking Start. bit 0-15 The character clock at which blanking starts relative to the start of display. The pixel is (value+1)*8 21xAh index 16h W(R/W): Horizontal Blanking End. bit 0-15 The character clock at which blanking ends relative to the start of display. The pixel is (value+1)*8 21xAh index 18h W(R/W): Horizontal Sync Start. bit 0-15 The character clock at which Horizontal Sync starts relative to the start of display. In pixels: (value+1)*8 21xAh index 1Ah W(R/W): Horizontal Sync End. bit 0-15 The character clock at which Horizontal Sync ends relative to the start of display. In pixels: (value+1)*8 21xAh index 1Ch (W): Horizontal Sync Position 1. bit 5-6 SYNC_PULSE_DLY1. Can delay the sync pulses half a character clock 0 = no change, 2 = delay sync 4 pixels. Note: This register should be programmed with the same value as index 1Eh. 21xAh index 1Eh (W): Horizontal Sync Position 2. bit 1-2 SYNC_PULSE_DLY2. Can delay the sync pulses half a character clock 0 = no change, 2 = delay sync 4 pixels. Note: This register should be programmed with the same value as index 1Ch. 21xAh index 20h W(R/W): Vertical Total. bit 0-10 Total number of scanlines (-1) in a frame. 21xAh index 22h W(R/W): Vertical Displayed End. bit 0-10 Number of displayed scanlines (-1). 21xAh index 24h W(R/W): Vertical Blanking Start. bit 0-10 The scanline relative to the start of display where the Vertical Blanking Starts. 21xAh index 26h W(R/W): Vertical Blanking End. bit 0-10 The scanline relative to the start of display where the Vertical Blanking Ends. 21xAh index 28h W(R/W): Vertical Sync Start. bit 0-10 The scanline relative to the start of display where the Vertical Sync Starts. 21xAh index 2Ah (R/W): Vertical Sync End. bit 0-7 The scanline relative to the start of display where the Vertical Sync Ends. 21xAh index 2Ch W(R/W): Vertical Line Compare. bit 0-10 The scanline relative to the start of display where the display wraps to line 0. 21xAh index 30h W(R/W): Sprite Position X bit 0-10 The X position of the Sprite Hotspot in pixels. 21xAh index 32h (R/W): Sprite Hotspot X bit 0-5 The X hotspot position of the sprite from the left. 21xAh index 33h W(R/W): Sprite Position Y bit 0-10 The Y position of the Sprite Hotspot in pixels. 21xAh index 35h (R/W): Sprite Hotspot Y bit 0-5 The Y hotspot position of the sprite from the top. 21xAh index 36h (R/W): Sprite Control. bit 0 If set the sprite is displayed on the screen. Note: Sprite display must be disabled when modifying the sprite data. 21xAh index 38h (R/W): Sprite Color 0 Red bit 0-7 The red level of sprite color 0. Note: In the original XGA bits 0-1 are ignored. 21xAh index 39h (R/W): Sprite Color 0 Green bit 0-7 The green level of sprite color 0. Note: In the original XGA bits 0-1 are ignored. 21xAh index 3Ah (R/W): Sprite Color 0 Blue bit 0-7 The blue level of sprite color 0. Note: In the original XGA bits 0-1 are ignored. 21xAh index 3Bh (R/W): Sprite Color 1 Red bit 0-7 The red level of sprite color 0. Note: In the original XGA bits 0-1 are ignored. 21xAh index 3Ch (R/W): Sprite Color 1 Green bit 0-7 The green level of sprite color 0. Note: In the original XGA bits 0-1 are ignored. 21xAh index 3Dh (R/W): Sprite Color 1 Blue bit 0-7 The blue level of sprite color 0. Note: In the original XGA bits 0-1 are ignored. 21xAh index 40h 24(R/W): Start Address. bit 0-18 The start display address in units of 8 bytes. 21xAh index 43h W(R/W): Pixel Map Width. bit 0-10 Length of scanline in units of 8 bytes. 21xAh index 50h (R/W): Display Control 1. bit 0-1 BLANK_DISP. 0 = display blanked, CRTC reset. 1 = display blanked, preparing CRTC reset 3 = Normal operation. 3 INTERLACED. If set the display is interlaced. 4 FEATURE_ENAB. If set the feature connector is enabled. usually enabled in VGA modes and disabled in 132 column text modes and extended XGA modes. 6-7 SYNC_POLAR. Sync polarity (6=Vertical, 7=Horizontal). 0=768 lines, 1=400 lines, 2=350 lines, 3=480 lines Note: on writes bit 2 must be set to 1 and bit 5 must be preserved. 21xAh index 51h (R/W): Display Control 2. bit 0-2 DSPPIX_SIZE. Bits per pixel (for the CRT controller): 0=1 bpp, 1=2 bpp, 2=4 bpp, 3=8 bpp, 4=16 bpp 5 might be used for 24 bit on some clones. 4-5 HSCALE. Horizontal pixel replication: 0=Normal, 1=each pixel is doubled, 2=each pixel is quadrupled?? 6-7 VSCALE. Vertical pixel replication: 0=Normal, 1=each line is doubled, 2=each line is quadrupled?? 21xAh index 52h (R): Monitor ID and Gun Output bit 0-3 MONITOR_ID. Monitor types sensed from the monitor outputs: 9 IBM 8507/IBM 8604 Mono 1024x768 0Ah IBM 8514 Color 1024x768 0Bh IBM 8515 Color 1024x768 0Dh IBM 8503 Mono 640x480 0Eh IBM 8512/IBM 8513 Color 640x480 0Fh No monitor attached 5 RED_OUT. Current output of the red gun. 1=high, 0=low. 6 GREEN_OUT. Current output of the green gun. 1=high, 0=low. 7 BLUE_OUT. Current output of the blue gun. 1=high, 0=low. 21xAh index 54h (R/W): Clock Select 1. bit 0-1 CLK_SCALE. Divide factor for the clock: 0=no divide, 1=divide by 2 2-3 CLK_SEL1. Selects the video clock for the display: 0 = VGA 8-pixel text mode & 640x480 graphics If the CLK_SEL2 bit of the CLOCK_SEL2 register (21xAh index 70h) is set this is 132 column text mode. 1 = VGA 9-pixel text mode. 2 = Clock from the feature connector 3 = 1024x768 interlaced graphics 7 (XGA-NI only) PROG_CLK_SEL. If set and CLK_SEL1 and CLK_SEL2 are cleared, the PLL is selected as the clock source for the display. This bit should be cleared if CLK_SEL1 or CLK_SEL2 are non-zero. 21xAh index 55h (R/W): Border Color. bit 0-7 Palette index of the border or overscan color. 21xAh index 58h (R/W): PLL Program Register (XGA-NI only) bit 0-5 The value for the PLL. Value = (Desired frequency * Factor from FREQ_SCALE) - 65 6-7 FREQ_SCALE. Divisor for the frequency: 0 = Divide by 4. Allowing 16.25 - 32.00MHz in 0.25MHz steps 1 = Divide by 2. Allowing 32.50 - 64.00MHz in 0.50MHz steps 2 = No divide, allowing 65.00 - 128.00MHz in 1MHz steps Note: The XGA-NI should not be programmed for more than 90MHz. 21xAh index 59h (R/W): Direct Color Control (XGA-NI only) bit 0-2 DC_MODIF. This field controls how the missing red and blue bits are handled in 64k color mode. 0 = Zero Intensity Black mode. Set to 0. 1 = Non-Zero Color mode. Set to 1 unless color is 0. 2 = same as 0. 3 = Full Intensity White mode. Set to 1. 4 = Linearized Color mode. Set to most significant bit of same color (bit 4). 21xAh index 60h W(R/W): Sprite/Palette Address Index. bit 0-13 Index for the Palette (8 bits) and Sprite (14 bits). For sprite accesses the index will increment after each byte access, for palette access the index will increment after each 3 or 4 byte pixel. 21xAh index 62h (R/W): Sprite/Palette Index with Prefetch. bit 0-13 Index for the Palette (8 bit) or Sprite (14 bit). When this register is written the Palette & Sprite Prefetch registers (index 67h-69h and 6Bh) are loaded with the appropriate data from the Palette and Sprite and the index. 21xAh index 64h (R/W): Palette Mask bit 0-7 Each display byte is anded with this value before reaching the DAC. Usually set to 0FFh. 21xAh index 65h (R/W): Palette Data Port. bit 0-7 Palette data is read and written to this port. Each read or write of the register will increment the palette address, first through the Red, Green Blue cycle, and then increment the Palette Address Index. 21xAh index 66h (R/W): Palette Sequence bit 0-1 COLOR_COMPNT. Shows the next palette entry access: 0=Red, 1=Green, 2=Blue, 3="extra" 2 COLOR_FORMAT. If set the palette is organised as (Red, Blue, Green and extra), if clear the format is (Red, Green and Blue). The 4 byte format allows reading a full palette entry in one double word access from index 67h-69h 21xAh index 67h (R/W): Palette Red Prefetch bit 0-7 When the Palette Prefetch index (index 62h) is written this register is loaded with the red component. 21xAh index 68h (R/W): Palette Blue Prefetch bit 0-7 When the Palette Prefetch index (index 62h) is written this register is loaded with the blue component. 21xAh index 69h (R/W): Palette Green Prefetch bit 0-7 When the Palette Prefetch index (index 62h) is written this register is loaded with the green component. 21xAh index 6Ah (R/W): Sprite Data bit 0-7 Sprite data is read and written through this register, incrementing the Sprite Index (index 60h). Each byte contains 4 2bit pixels with the following values: 0=Sprite Color 0, 1=Sprite Color 1, 2=transparent, 3=Invert 21xAh index 6Bh (R/W): Sprite Data Prefetch bit 0-7 This register is loaded with sprite data when the Sprite Prefetch Index (index 62h) is written. 21xAh index 6Ch (R/W): Miscellaneous Control (XGA-NI only) bit 0 BLNK_REDBLUE. If set the red and blue outputs of the DAC are set to 0. 21xAh index 6Dh (R/W): MFI Control (XGA-NI only) bit 0 MFI_ENABLE. If set the remaining bits in this register are valid and textmode attributes are interpreted as MFI attributes: bit 0-3 Foreground color (same as VGA text mode) 4 If set the first and last pixel in the underline scanline is set (unless the character is underlined, in which case they are clear). 5 If set the character is underlined. 6 If set the character is reversed 7 If VGA character blink is enabled, this bit controls blinking, if not it sets the background color to 8. MFI blinking uses a 75% on/25% off-cycle as opposed to the VGA 50% blink cycle. 1 CURSOR_TYPE. If set the cursor reverses the ForeGround and background, if clear it uses the ForeGround color. 2 CURS_BLINK_DISAB. If set the cursor will not blink, if clear the cursor blinks at 1/32 the vertical refresh. 3 CONST_COLOR_CURS. If set the cursor is the color in CURS_COLOR, if clear the cursor is the ForeGround color. 4-7 CURS_COLOR. Color of the cursor in IRGB format if CONST_COLOR_CURS and NFI_ENABLE are set. 21xAh index 70h (R/W): Clock Select 2 bit 7 CLK_SEL2. Set in 132 column text mode, clear in other modes. 21xAh index 72h-73h. RESERVED for VESA extensions. 21xAh index 74h (R): DMA Channel Readback. (VESA - ISA bus only) bit 0 DMA Channel Enable. Indicates whether the DMA channel is enabled for bus-mastering. 1-3 DMA Channel Select. Selects the DMA channel for bus master arbitration. 0 = Channel 0, 1 = Channel 1, 2 = Channel 2, 3 = Channel 3, 5 = Channel 5, 6 = Channel 6, 7 = Channel 7 21xAh index 75h (?): Subsystem Vendor ID. (VESA) bit 0-7 After setting the index (port 21xAh) the first byte read from 21xBh is one of three values: 00h The subsystem vendor ID mechanism is not implemented. 01h-FEh Chip manufactor assigned subsystem vendor ID. FFh Read the register two times more to get the 16bit vendor ID. (low byte first). Any subsequent reads may return vendor specific information. Note: This register may or may not be writable at the discretion of the vendor. 21xAh index 76h-77h. RESERVED for manufactor expansion (VESA) Memory 00h D(W): Page Directory Base Address bit 0-31 The Physical 32bit address of the current MMU Page Table for the current task. As this start at a 4KB page the lower 12 bit are 0. This register is active only if the ENAB_VIRT_LU bit in the Virtual Memory Control register (21x6h bit 0) is set. This register can only be written if the USER_SUPER bit (21xAh bit 2) is set. Memory 04h D(R): Current Virtual Address bit 0-31 If a VM Hardware Not Present or Protection interrupt occurs This register will contain the physical address of the page that caused the fault. Bits 0-11 will always be 0. This register is only active if the ENAB_VIRT_LU bit in the Virtual Memory Control register (21x6h bit 0) is set. Memory 09h (R): Auxiliary Status Register (XGA-NI only) bit 7 AUX_BUSY. If this bit is set the XGA drawing engine is busy. This is the same bit as the BUSY bit of the Control Register (Memory 11h bit 7), but reading this register does not block the drawing engine. Memory 0Ch (R): State A Length bit 0-7 The number of double words to read from the State A register (21xAh index 0Ch) to perform a task save. Memory 0Dh (R): State B Length bit 0-7 The number of double words to read from the State B register (21xAh index 0Dh) to perform a task save. Memory 11h (R/W): Control Register bit 1 STATE_SAVRST. Signals XGA state save/restore. If set the state can be restored, if clear the state can be saved. The SUSPND_OPER must be set. 3 SUSPND_OPER. Set to 1 to suspend the XDA drawing operation. When the drawing operation has been suspended the OPER_SUSPND bit is set. To restart a suspended operation write 0 to this bit. 4 (R) OPER_SUSPND. If set an XGA drawing operation is suspended. 5 TERM_OPER. Set to 1 to terminate the current XGA operation. You must test for termination to complete, i.e.. until either the BUSY bit goes to 0, or the CMD_DONE_STAT bit of the Interrupt Status register (21x5h bit 7) is set. 7 BUSY. If set the XGA drawing engine is busy. You should not write to any memory registers while this bit is set. On the XGA-NI you should check the AUX_BUSY bit of the Auxiliary Status Register (Memory 9h bit 7), as reading this register will temporarily stop the drawing engine. Memory 12h (W): Pixel Map Index bit 0-1 MAP_INDEX. Selects which Pixel map register set is accessed through Memory register 14h-1Ch. 0 = Mask Map, 1 = Pixel Map A, 2 = Pixel Map B, 3 = Pixel Map C Memory 14h (W): Pixel Map n Base bit 0-31 The 32 bit address of the map. If the XGA is in VM mode (the ENAB_VIRT_LU bit in the Virtual Memory Control register (21x6h bit 0) is set) the address must be a logical address, else a physical one. If using BitBLT operations combined with mixes or color compares, the map must start on a Double word address. Memory 18h W(W): Pixel Map n Width bit 0-15 The number of pixels (-1) in a scanline in the map. If using BitBLT operations combined with mixes or color compares, the width of the map must be a multiple of 4 bytes. Memory 1Ah W(W): Pixel Map n height bit 0-15 The number of lines (-1) in the map. Memory 1Ch (W): Pixel Map n Format bit 0-2 PIXEL_SIZE. Bits per pixel in the map: 0 = 1 bit, 1 = 2 bits, 2 = 4 bits, 3 = 8 bits, 4 = 16 bits (XGA-NI and some clones), 5 = 24 bits on some clones. 3 PIX_FORMAT. If set the map is in Motorola format (Most significant byte stored first and lowest pixel in highest bit number), if clear in Intel format (Least significant byte stored first and lowest pixel in lowest bit number). In both cases each pixel has the least significant stored in the lowest bit number. Memory 20h W(R/W): Bresenham Error Term bit 0-15 Bresenham Error Term = 2 * (Delta Y) - (Delta X) - Fixup Fixup is either 0 or 1 depending on the direction of the line. This is a 2's complement number between -8192 and 8191 Memory 24h W(W): Bresenham Constant 1 bit 0-15 The Bresenham Constant 1 = 2 * (Delta Y) Known as "axial step constant" This is a 2's complement number between -8192 and 8191 Memory 28h W(W): Bresenham Constant 2 bit 0-15 The Bresenham Constant 2 = 2 * ((Delta Y) - (Delta X)) Known as "diagonal step constant". This is a 2's complement number between -8192 and 8191 Memory 2Ch D(W): Short Stroke Register bit 0-7 Stroke Code 1. First vector bit 0-3 LENGTH. The length in pixels (0-15). 4 ACTION. If set the vector is drawn and the current position is moved, if clear the current position is moved. 5-7 VECDIR. Direction of the short stroke vector in degrees counter-clockwise from the positive X-axis. 0=0, 1=45, 2=90, 3=135, 4=180, 5=225, 6=270, 7=315 8-15 Stroke Code 2. Second vector 16-23 Stroke Code 3. Third vector 24-31 Stroke Code 4. Fourth vector Note: Before using this register the Command register (Memory 7Ch) must be loaded with a Short Stroke command, the source and destination maps setup and the start position set in the Destination Map X (Memory 78h) and Destination Map Y (Memory 7Ah) registers. To execute one stroke vector, load it in Stroke Code 4, to execute 2, load them in Stroke Code 3 & 4 and to execute 4 load them in all 4 Strokes. A Stroke Code of 0 is a No-op. Memory 48h (W): Foreground Mix bit 0-7 The Foreground Mix: 0 = 0 (All bits cleared). 1 = Src AND Dst 2 = Src AND (NOT Dst) 3 = Src 4 = (NOT Src) AND Dst 5 = Dst 6 = Src XOR Dst 7 = Src OR Dst 8 = (NOT Src) And (NOT Dst) 9 = Src XOR (NOT Dst) 0Ah = Not Dst 0Bh = Src OR (NOT Dst) 0Ch = NOT Src 0Dh = (NOT Src) OR Dst 0Eh = (NOT Src) or (NOT Dst) 0Fh = 1 (all bits set) 10h = MAX(Src,Dst) 11h = MIN(Src,Dst) 12h = Src + Dst (with Saturate) 13h = Dst - Src (with Saturate) 14h = Src - Dst (with Saturate) 15h = (Src + Dst)/2 Src is the pixel from the color registers or the source map, Dst is pixel from the destination map. Saturate means that the result is limited by 0 and the max pixel value. Memory 49h (W): Background Mix bit 0-7 The Background Mix. Same values as the Foreground Mix (Memory 48h) Memory 4Ah (W): Color Compare Function bit 0-2 CC_COND. Color Compare condition on all pixel drawing operations: 0 Always true 1 Dst > CC 2 Dst == CC 3 Dst < CC 4 Always false 5 Dst >= CC 6 Dst != CC 7 Dst <= CC Dst refers to the pixel, and CC to the color specified in the Color Compare register (Memory 4Ch). The destination pixel is updated if the condition is false. The default setting of this register should be 4 (always false) in order to update all pixels. Memory 4Ch D(W): Color Compare Color bit 0-31 The color used in color compares. Memory 50h D(W): Plane Mask bit 0-31 This register can protect individual bits in a pixel from change by the drawing engine. A bit in a pixel can only be changed if the corresponding bit in this register is set. Memory 54h D(W): Carry Chain Mask bit 0-31 This register determines whether carries from arithmetic operations should be propagated to the next bit. If bit n is set any carry from the operations on bit n is propagated to bit n+1. Memory 58h D(W): Foreground Color bit 0-31 This is the ForeGround color for draw operations. Memory 5Ch D(W): Background Color bit 0-31 This is the background color for draw operations. Memory 60h W(W): Operation Dimension 1 bit 0-15 For BitBLT operations this is the pixel width of the BitBLT operation. For line operations this is the pixel length of the line (-1). This can be calculated as: MAX(abs(Delta X),abs(Delta Y)) The value must be between 0 and 4095. Memory 62h W(W): Operation Dimension 2 bit 0-15 This is the line height of the BitBLT operation (-1). The value must be between 0 and 4095. Memory 6Ch W(W): Mask Map Origin X Offset bit 0-15 The X offset in pixels of the Mask Map within the Destination Map. The value must be between 0 and 4095. Memory 6Eh W(W): Mask Map Origin Y Offset bit 0-15 The Y offset in pixels of the Mask Map within the Destination Map. The value must be between 0 and 4095. Memory 70h W(R/W): Source Map X bit 0-15 The X position of the first pixel used within the Source Map. The value must be between 0 and 4095. Memory 72h W(R/W): Source Map Y bit 0-15 The Y position of the first pixel used within the Source Map. The value must be between 0 and 4095. Memory 74h W(R/W): Pattern Map X bit 0-15 The X position of the first pixel used within the Pattern Map. The value must be between 0 and 4095. Memory 76h W(R/W): Pattern Map Y bit 0-15 The Y position of the first pixel used within the Pattern Map. The value must be between 0 and 4095. Memory 78h W(R/W): Destination Map X bit 0-15 The X position of the first pixel used within the Destination Map. The value should be between -2048 and 6143 (2's complement). Memory 7Ah W(R/W): Destination Map Y bit 0-15 The Y position of the first pixel used within the Destination Map. The value should be between -2048 and 6143 (2's complement). Memory 7Ch D(W): Command Register bit 0-2 OCTANT. Selects the direction of line draws and BitBLTs. bit 0 YMAJOR. If set the line is longer in the Y dimension than the X dimension. Not used for BitBLTs. 1 DEC_Y. If set the line is drawn in the negative Y direction. 2 DEC_X. If set the line is drawn in the negative X direction. 4-5 DRAW_MODE. Selects the drawing mode for line and short stroke ops: 0 = Draw all pixels. 1 = Draw all but the first pixel 2 = Draw all but the last pixel. 3 = Draw area boundary. 6-7 MASK_MODE. Selects the mask. 0 = No mask. 1 = Use mask boundary. The Mask Map X/Y Origin and Pixel Map 0 Width/Height registers define a rectangle. No pixel updates will occur outside the rectangle. 2 = Map Mask enabled. Pixels can only be updated if they are inside the rectangle AND the corresponding bit in the map is 1. 12-15 PATT_SRC. Selects the pattern. 1 = Pixel Map A, 2 = Pixel Map B, 3 = pixel Map C, 8 = Always ForeGround, 9 = Pattern from source data. The pattern selects whether the ForeGround or background data is used for the drawing operation. 16-19 DST_MAP. Selects the destination map. 1 = Pixel Map A, 2 = Pixel Map B, 3 = Pixel Map C 20-23 SRC_MAP. Selects the source map. 1 = Pixel Map A, 2 = Pixel Map B, 3 = Pixel Map C 24-27 COMMAND. The draw command: 2 = Short Stroke Read. 3 = Line Draw Read. 4 = Short Stroke Write. Puts the XGA in Short stroke mode. All actual draws happen by writes to the Short Stroke register. 5 = Line Draw Write. Writes a line in the destination map. Line direction and length are set in the Bresenham and Direction 1 registers. 8 = BitBLT. 9 = Inverting BitBLT. 0Ah = Area Fill. 28-29 FORE_SRC. The source of the ForeGround mix operation: 0 = Foreground color, 2 = Source Pixel Map. The ForeGround source is effective when a pattern map is used, and the corresponding bit in the pattern is 1, or when the pattern source is given as Foreground. 30-31 BACK_SRC. The source of the background mix operation: 0 = Background color, 2 = Source Pixel Map. The background source is effective when a pattern map is used, and the corresponding bit in the pattern is 0. Video Modes: 640x480 256 colors 640x480 65536 colors 800x600 16 colors 800x600 256 colors 800x600 65536 colors 1024x768 16 colors 1024x768 256 colors All modes use a linear address mode, where bits 16-23 of the address are in the Video Aperture Index register (xga+8), and the lower 16 bits are the offset from 0A000:0. In 16 color modes two pixels are stored in each byte. Even pixels are in bits 0-3 and odd pixels in bits 4-7. Address of pixel = (row *(pixels per row)+column) /2. In 256 color modes each pixel occupies a byte. The pixels are addressed in linear fashion. Address of pixel = row *(pixels per row) + column. In 65536 color modes each pixel occupies two bytes. Address of pixel = (row *(pixels per row)+column)*2. VESA XGA Real Mode BIOS Specification: ----------104E00------------------------- INT 10 - VESA XGA - Return XGA Environment Information AX = 4E00h ES:DI -> 256 byte buffer Return: AL = 4Eh if function supported. AH = 00h if function successful, errorcode if not. Buffer is filled with environment information: Offset Size Description: 00h 4 BYTEs signature ('VESA') 04h WORD VESA version. High byte is major version. 06h DWORD Pointer to NULL terminated OEMstring. 0Ah DWORD EnvironmentFlag: bit 0-1 System BUS: 0 = MCA, 1 = ISA, 3 = EISA. 2 If set bus mastering is available. 3-31 Reserved. 0Eh WORD Number of XGA installed. Functions 1-6 require a handle from 0 to (XGAs -1) to identify the desired XGA board. 10h - FFh Reserved. ----------104E01---------------------------- INT 10 - VESA XGA - Return XGA Subsystem Information AX = 4E01h DX = XGA handle (0 to (XGAs -1)) ES:DI -> 256 byte buffer. Return: AL = 4Eh if function supported. AH = 00h if function successful, errorcode if not. Buffer is filled with environment information: Offset Size Description: 00h DWORD Pointer to null-terminated board OEM string. 04h DWORD Capabilities: bit 0-1 Board Bus Architecture: 0=MCA, 1=ISA, 3=EISA 2-3 Reserved 4-6 DMA Channel assigned for acquiring bus mastership (only for ISA bus systems). 7 DMA Channel Status (ISA only). Enabled if set. 8-31 Reserved. 08h DWORD Pointer to 8KB XGA ROM (or NULL). 0Ch DWORD Pointer to the XGA memory mapped registers. 10h WORD Base address of XGA I/O registers (21x0h) 12h DWORD Pointer to start of physical video memory (0A000h:0 or 0B000h:0) 16h DWORD Physical address of 4MB aperture (or NULL if none). 1Ah DWORD Physical address of 1MB aperture (or NULL if none). 1Eh DWORD Physical address of 64KB aperture (or NULL if not enabled). 22h DWORD Physical address of OEM aperture (or NULL if none). 26h WORD Size of OEM aperture in 64KByte units. 28h DWORD Pointer to list of video modes. The list is a series of WORDs terminated by 0FFFFh. 2Ch WORD Number of 64KB blocks on the board. 2Eh DWORD XGA manufactor ID. Byte 0 is POS data index 1, Byte 1 is index 2 and byte 2 is 21xAh index 75h. 32h - FFh Reserved. ----------104E02----------------------------------- INT 10 - VESA XGA - Return XGA Mode Information AX = 4E02h CX = Video mode DX = XGA handle ES:DI -> 256 byte buffer Return: AL = 4Eh if function supported. AH = 00h if function successful, errorcode if not. Buffer is filled with mode information: Offset Size Description: 00h WORD Attributes of the mode: bit 0 If set the mode is supported 1 Reserved 2 If set output is supported by the BIOS 3 Reserved 4 If set this is a graphics mode (VGA registers inactive, XGA active), if clear this is a text mode (VGA registers active, XGA inactive) 02h WORD Bytes per logical scanline 04h WORD Horizontal Resolution in pixels 06h WORD Vertical Resolution in scanlines 08h BYTE Character Width in pixels 09h BYTE Character Height in pixels 0Ah BYTE Number of planes 0Bh BYTE Bits per pixels 0Ch BYTE Memory Model 0 = Text Mode 1 = CGA graphics 2 = Hercules graphics 3 = 4-planar graphics 4 = Packed Pixel 5 = Non-chain 4, 256 color 6 = Direct Color 7 = YUV-24 0Dh BYTE Number of Image Pages 0Eh BYTE Number of Red bits 0Fh BYTE Bit Position of Red bit field 10h BYTE Number of Green bits 11h BYTE Bit Position of Green bit field 12h BYTE Number of Blue bits 13h BYTE Bit Position of Blue bit field 14h BYTE Number of Reserved bits 15h BYTE Bit Position of Reserved bit field 16h - FFh Reserved ----------104E03----------------------------------- INT 10 - VESA XGA - Set XGA Video Mode AX = 4E03h BX = Video Mode CX = Other Command Flags bit 0 If clear the feature connector is set to the default state DX = XGA handle ES:DI -> 256 byte buffer Return: AL = 4Eh if function supported. AH = 00h if function successful, errorcode if not. ----------104E04----------------------------------- INT 10 - VESA XGA - Return Current Video Mode AX = 4E04h DX = XGA handle Return: AL = 4Eh if function supported. AH = 00h if function successful, errorcode if not. ----------104E05----------------------------------- INT 10 - VESA XGA - Set Feature Connector State AX = 4E05h BX = Feature Connector State bit 0 If set the Feature Connector is enabled. 1 If set Feature Connector is in Output Mode, if clear in Input Mode DX = XGA handle Return: AL = 4Eh if function supported. AH = 00h if function successful, errorcode if not. ----------104E06----------------------------------- INT 10 - VESA XGA - Return Feature Connector State AX = 4E06h DX = XGA handle Return: AL = 4Eh if function supported. AH = 00h if function successful, errorcode if not. BX = Feature Connector State bit 0 If set the Feature Connector is enabled. 1 If set the Feature Connector is in Output Mode, if clear in Input Mode. 2-15 Reserved(0) DMQS (Display Mode Query and Set) interface: Not supported on the original IBM XGA, only on XGA-NI (non-interlaced) and later models. ----------101F00----------------------------- INT 10 - VIDEO - XGA - GET DMQS DATA LENGTH AX = 1F00h Return: AL = 1Fh if supported BX = number of bytes of DMQS data ----------101F01----------------------------- INT 10 - VIDEO - XGA - READ DMQS DATA AX = 1F01h ES:DI -> user buffer for return data (call AX=1F00h for size) Return: AL = 1Fh if function supported Format of XGA DMQS buffer: Offset Size Description 00h WORD offset (in bytes) to DMQS data for next XGA instance 02h BYTE slot number 03h BYTE XGA implementation function level identifier 04h BYTE XGA implementation resolution level identifier 05h WORD vendor identifier - identifies card vendor 07h WORD vendor defined field 09h WORD XGA adapter I/O register base address 0Bh WORD XGA coprocessor register base address (paragraph--multiply by 10h to get physical address) 0Dh WORD 1 Megabyte system video memory aperture 0000h if not allocated (Multiply by 100000h to get physical address) 0Fh WORD 4 Megabyte system video memory aperture 0000h if not allocated (multiply by 100000h to get physical address) 11h WORD video memory base address (multiply by 100000h to get physical address) 13h WORD composite ID of the attached display 15h BYTE amount of video memory available, in multiples of 256K bytes 16h DWORD alternate XGA coprocessor register base address. 0 = none. 1Ah var DMQS Data for further XGA Instances (as above) Note: "Instances" refers to the capability of having up to 8 XGA adapters in one computer.