  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.
