/*
 * VGA hardware emulation
 *
 * Copyright 1998 Ove Kåven (with some help from Marcus Meissner)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include <stdarg.h>
#include <string.h>

#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "wincon.h"
#include "dosexe.h"
#include "vga.h"
#include "ddraw.h"
#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(ddraw);

static IDirectDraw *lpddraw = NULL;
static IDirectDrawSurface *lpddsurf;
static IDirectDrawPalette *lpddpal;
static DDSURFACEDESC sdesc;

static BOOL vga_retrace_vertical;
static BOOL vga_retrace_horizontal;

/*
 * Size and location of VGA controller window to framebuffer.
 *
 * Note: We support only single window even though some
 *       controllers support two. This should not be changed unless
 *       there are programs that depend on having two windows.
 */
#define VGA_WINDOW_SIZE  (64 * 1024)
#define VGA_WINDOW_START ((char *)0xa0000)

/*
 * Size and location of CGA controller window to framebuffer.
 */
#define CGA_WINDOW_SIZE  (32 * 1024)
#define CGA_WINDOW_START ((char *)0xb8000)

/*
 * VGA controller memory is emulated using linear framebuffer.
 * This frambuffer also acts as an interface
 * between VGA controller emulation and DirectDraw.
 *
 * vga_fb_width: Display width in pixels. Can be modified when
 *               display mode is changed.
 * vga_fb_height: Display height in pixels. Can be modified when
 *                display mode is changed.
 * vga_fb_depth: Number of bits used to store single pixel color information.
 *               Each pixel uses (vga_fb_depth+7)/8 bytes because
 *               1-16 color modes are mapped to 256 color mode.
 *               Can be modified when display mode is changed.
 * vga_fb_pitch: How many bytes to add to pointer in order to move
 *               from one row to another. This is fixed in VGA modes,
 *               but can be modified in SVGA modes.
 * vga_fb_offset: Offset added to framebuffer start address in order
 *                to find the display origin. Programs use this to do
 *                double buffering and to scroll display. The value can
 *                be modified in VGA and SVGA modes.
 * vga_fb_size: How many bytes are allocated to framebuffer.
 *              VGA framebuffers are always larger than display size and
 *              SVGA framebuffers may also be.
 * vga_fb_data: Pointer to framebuffer start.
 * vga_fb_window: Offset of 64k window 0xa0000 in bytes from framebuffer start.
 *                This value is >= 0, if mode uses linear framebuffer and
 *                -1, if mode uses color planes. This value is fixed
 *                in all modes except 0x13 (256 color VGA) where
 *                0 means normal mode and -1 means Mode-X (unchained mode).
 */
static int   vga_fb_width;
static int   vga_fb_height;
static int   vga_fb_depth;
static int   vga_fb_pitch;
static int   vga_fb_offset;
static int   vga_fb_size = 0;
static char *vga_fb_data = 0;
static int   vga_fb_window = 0;
static int   vga_fb_window_size;
static char *vga_fb_window_data;
static PALETTEENTRY *vga_fb_palette;
static unsigned vga_fb_palette_index;
static unsigned vga_fb_palette_size;
static BOOL  vga_fb_bright;
static BOOL  vga_fb_enabled;

/*
 * VGA text mode data.
 *
 * vga_text_attr: Current active attribute.
 * vga_text_old: Last data sent to console. 
 *               This is used to optimize console updates.
 * vga_text_width:  Width of the text display in characters.
 * vga_text_height: Height of the text display in characters.
 * vga_text_x: Current cursor X-position. Starts from zero.
 * vga_text_y: Current cursor Y-position. Starts from zero.
 * vga_text_console: TRUE if stdout is console, 
 *                   FALSE if it is regular file.
 */
static BYTE  vga_text_attr;
static char *vga_text_old = NULL;
static BYTE  vga_text_width;
static BYTE  vga_text_height;
static BYTE  vga_text_x;
static BYTE  vga_text_y;
static BOOL  vga_text_console;

/*
 * VGA controller ports 0x3c0, 0x3c4, 0x3ce and 0x3d4 are
 * indexed registers. These ports are used to select VGA controller
 * subregister that can be written to or read from using ports 0x3c1,
 * 0x3c5, 0x3cf or 0x3d5. Selected subregister indexes are
 * stored in variables vga_index_*.
 *
 * Port 0x3c0 is special because it is both index and
 * data-write register. Flip-flop vga_address_3c0 tells whether
 * the port acts currently as an address register. Reading from port
 * 0x3da resets the flip-flop to address mode.
 */
static BYTE vga_index_3c0;
static BYTE vga_index_3c4;
static BYTE vga_index_3ce;
static BYTE vga_index_3d4;
static BOOL vga_address_3c0 = TRUE;

/*
 * List of supported video modes.
 *
 * should be expanded to contain most or all information
 * as required for SVGA VESA mode info block for VESA BIOS subsystem 1 (see _ModeInfoBlock)
 * this will allow proper support for FIXME items in VGA/VESA mode configuration
 *
 * FIXME - verify and define support for VESA modes
 * FIXME - add # bit planes, # video memory banks, & memory model
 */
static WORD VGA_CurrentMode;
static BOOL CGA_ColorComposite = FALSE;  /* behave like composite monitor */

const VGA_MODE VGA_modelist[] =
{
    /* Mode, ModeType, TextCols, TextRows, CharWidth, CharHeight, Width, Height, Depth, Colors, ScreenPages, Supported*/
    /* VGA modes */
    {0x0000,    TEXT, 40, 25,  9, 16,  360,  400,  0,  16, 8, TRUE},   /* VGA/CGA text mode 0 */
    {0x0001,    TEXT, 40, 25,  9, 16,  360,  400,  0,  16, 8, TRUE},   /* VGA/CGA text mode 1 */
    {0x0002,    TEXT, 80, 25,  9, 16,  360,  400,  0,  16, 8, TRUE},   /* VGA/CGA text mode 2 */
    {0x0003,    TEXT, 80, 25,  9, 16,  360,  400,  0,  16, 8, TRUE},   /* VGA/CGA text mode 3 */
    {0x0004, GRAPHIC, 40, 25,  8,  8,  320,  200,  2,   4, 1, TRUE},   /* VGA/CGA graphics mode 4 */
    {0x0005, GRAPHIC, 40, 25,  8,  8,  320,  200,  2,   4, 1, TRUE},   /* VGA/CGA graphics mode 5 */
    {0x0006, GRAPHIC, 80, 25,  8,  8,  640,  200,  1,   2, 1, TRUE},   /* VGA/CGA graphics mode 6 */
    {0x0007,    TEXT, 80, 25,  9, 16,  720,  400,  0,   0, 8, FALSE},   /* VGA text mode 7 - FIXME bad default address */
    {0x000d, GRAPHIC, 40, 25,  8,  8,  320,  200,  4,  16, 8, FALSE},   /* VGA graphics mode 13 */
    {0x000e, GRAPHIC, 80, 25,  8,  8,  640,  200,  4,  16, 4, FALSE},   /* VGA graphics mode 14 */
    {0x000f, GRAPHIC, 80, 25,  8, 14,  640,  350,  0,   0, 2, FALSE},   /* VGA graphics mode 15 */
    {0x0010, GRAPHIC, 80, 25,  8, 14,  640,  350,  4,  16, 2, FALSE},   /* VGA graphics mode 16 */
    {0x0011, GRAPHIC, 80, 30,  8, 16,  640,  480,  1,   2, 1, FALSE},   /* VGA graphics mode 17 */
    {0x0012, GRAPHIC, 80, 30,  8, 16,  640,  480,  4,  16, 1, FALSE},   /* VGA graphics mode 18 */
    {0x0013, GRAPHIC, 40, 25,  8,  8,  320,  200,  8, 256, 1, TRUE},   /* VGA graphics mode 19 */
    /* VESA 7-bit modes */
    {0x006a, GRAPHIC,  0,  0,  0,  0,  800,  600,  4,  16, 1, TRUE},   /* VESA graphics mode, same as 0x102 */
    /* VESA 15-bit modes */
    {0x0100, GRAPHIC,  0,  0,  0,  0,  640,  400,  8, 256, 1, TRUE},   /* VESA graphics mode */
    {0x0101, GRAPHIC,  0,  0,  0,  0,  640,  480,  8, 256, 1, TRUE},   /* VESA graphics mode */
    {0x0102, GRAPHIC,  0,  0,  0,  0,  800,  600,  4,  16, 1, TRUE},   /* VESA graphics mode */
    {0x0103, GRAPHIC,  0,  0,  0,  0,  800,  600,  8, 256, 1, TRUE},   /* VESA graphics mode */
    {0x0104, GRAPHIC,  0,  0,  0,  0, 1024,  768,  4,  16, 1, TRUE},   /* VESA graphics mode */
    {0x0105, GRAPHIC,  0,  0,  0,  0, 1024,  768,  8, 256, 1, TRUE},   /* VESA graphics mode */
    {0x0106, GRAPHIC,  0,  0,  0,  0, 1280, 1024,  4,  16, 1, TRUE},   /* VESA graphics mode */
    {0x0107, GRAPHIC,  0,  0,  0,  0, 1280, 1024,  8, 256, 1, TRUE},   /* VESA graphics mode */
    {0x0108,    TEXT,  0,  0,  0,  0,   80,   60,  0,   0, 1, TRUE},   /* VESA text mode */
    {0x0109,    TEXT,  0,  0,  0,  0,  132,   25,  0,   0, 1, TRUE},   /* VESA text mode */
    {0x010a,    TEXT,  0,  0,  0,  0,  132,   43,  0,   0, 1, TRUE},   /* VESA text mode */
    {0x010b,    TEXT,  0,  0,  0,  0,  132,   50,  0,   0, 1, TRUE},   /* VESA text mode */
    {0x010c,    TEXT,  0,  0,  0,  0,  132,   60,  0,   0, 1, TRUE},   /* VESA text mode */
    /* VESA 1.2 modes */
    {0x010d, GRAPHIC,  0,  0,  0,  0,  320,  200, 15,   0, 1, TRUE},   /* VESA graphics mode, 32K colors */
    {0x010e, GRAPHIC,  0,  0,  0,  0,  320,  200, 16,   0, 1, TRUE},   /* VESA graphics mode, 64K colors */
    {0x010f, GRAPHIC,  0,  0,  0,  0,  320,  200, 24,   0, 1, TRUE},   /* VESA graphics mode, 16.8 Million colors */
    {0x0110, GRAPHIC,  0,  0,  0,  0,  640,  480, 15,   0, 1, TRUE},   /* VESA graphics mode, 32K colors */
    {0x0111, GRAPHIC,  0,  0,  0,  0,  640,  480, 16,   0, 1, TRUE},   /* VESA graphics mode, 64K colors */
    {0x0112, GRAPHIC,  0,  0,  0,  0,  640,  480, 24,   0, 1, TRUE},   /* VESA graphics mode, 16.8 Million colors */
    {0x0113, GRAPHIC,  0,  0,  0,  0,  800,  600, 15,   0, 1, TRUE},   /* VESA graphics mode, 32K colors */
    {0x0114, GRAPHIC,  0,  0,  0,  0,  800,  600, 16,   0, 1, TRUE},   /* VESA graphics mode, 64K colors */
    {0x0115, GRAPHIC,  0,  0,  0,  0,  800,  600, 24,   0, 1, TRUE},   /* VESA graphics mode, 16.8 Million colors */
    {0x0116, GRAPHIC,  0,  0,  0,  0, 1024,  768, 15,   0, 1, TRUE},   /* VESA graphics mode, 32K colors */
    {0x0117, GRAPHIC,  0,  0,  0,  0, 1024,  768, 16,   0, 1, TRUE},   /* VESA graphics mode, 64K colors */
    {0x0118, GRAPHIC,  0,  0,  0,  0, 1024,  768, 24,   0, 1, TRUE},   /* VESA graphics mode, 16.8 Million colors */
    {0x0119, GRAPHIC,  0,  0,  0,  0, 1280, 1024, 15,   0, 1, TRUE},   /* VESA graphics mode, 32K colors */
    {0x011a, GRAPHIC,  0,  0,  0,  0, 1280, 1024, 16,   0, 1, TRUE},   /* VESA graphics mode, 64K colors */
    {0x011b, GRAPHIC,  0,  0,  0,  0, 1280, 1024, 24,   0, 1, TRUE},   /* VESA graphics mode, 16.8 Million colors */
    {0xffff,    TEXT,  0,  0,  0,  0,    0,    0,  0,   0, 1, FALSE}
};

/*
 * This mutex is used to protect VGA state during asynchronous
 * screen updates (see VGA_Poll). It makes sure that VGA state changes
 * are atomic and the user interface is protected from flicker and
 * corruption.
 *
 * The mutex actually serializes VGA operations and the screen update. 
 * Which means that whenever VGA_Poll occurs, application stalls if it 
 * tries to modify VGA state. This is not how real VGA adapters work,
 * but it makes timing and correctness issues much easier to deal with.
 */
static CRITICAL_SECTION vga_lock;
static CRITICAL_SECTION_DEBUG critsect_debug =
{
    0, 0, &vga_lock,
    { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
      0, 0, { (DWORD_PTR)(__FILE__ ": vga_lock") }
};
static CRITICAL_SECTION vga_lock = { &critsect_debug, -1, 0, 0, 0, 0 };

static void CALLBACK VGA_Poll( LPVOID arg, DWORD low, DWORD high );

static HWND vga_hwnd = NULL;

/*
 * CGA palette 1
 */
static PALETTEENTRY cga_palette1[] = {
  {0x00, 0x00, 0x00}, /* 0 - Black */
  {0x00, 0xAA, 0xAA}, /* 1 - Cyan */
  {0xAA, 0x00, 0xAA}, /* 2 - Magenta */
  {0xAA, 0xAA, 0xAA}  /* 3 - White */
};

/*
 * CGA palette 1 in the bright variant
 * intensities, when signalled to do so
 * in register 0x3d9
 */
static PALETTEENTRY cga_palette1_bright[] = {
  {0x00, 0x00, 0x00}, /* 0 - Black */
  {0x55, 0xFF, 0xFF}, /* 1 - Light cyan */
  {0xFF, 0x55, 0xFF}, /* 2 - Light magenta */
  {0xFF, 0xFF, 0xFF}, /* 3 - Bright White */
};

/*
 * CGA palette 2
 */
static PALETTEENTRY cga_palette2[] = {
  {0x00, 0x00, 0x00}, /* 0 - Black */
  {0x00, 0xAA, 0x00}, /* 1 - Green */
  {0xAA, 0x00, 0x00}, /* 2 - Red */
  {0xAA, 0x55, 0x00}  /* 3 - Brown */
};

/*
 * CGA palette 2 in the bright variant
 * intensities, when signalled to do so
 * in register 0x3d9
 */
static PALETTEENTRY cga_palette2_bright[] = {
  {0x00, 0x00, 0x00}, /* 0 - Black */
  {0x55, 0xFF, 0x55}, /* 1 - Light green */
  {0xFF, 0x55, 0x55}, /* 2 - Light red */
  {0xFF, 0xFF, 0x55}, /* 3 - Yellow */
};

/*
 *  VGA Palette Registers, in actual 16 bit color
 *  port 3C0H - 6 bit rgbRGB format
 *
 *  16 color accesses will use these pointers and insert
 *  entries from the 64-color palette (mode 18) into the default
 *  palette.   --Robert 'Admiral' Coeyman
 */
static char vga_16_palette[17]={
  0x00,  /* 0 - Black         */
  0x01,  /* 1 - Blue          */
  0x02,  /* 2 - Green         */
  0x03,  /* 3 - Cyan          */
  0x04,  /* 4 - Red           */
  0x05,  /* 5 - Magenta       */
  0x14,  /* 6 - Brown         */
  0x07,  /* 7 - White (Light gray)        */
  0x38,  /* 8 - Dark gray     */
  0x39,  /* 9 - Light blue    */
  0x3a,  /* A - Light green   */
  0x3b,  /* B - Light cyan    */
  0x3c,  /* C - Light red     */
  0x3d,  /* D - Light magenta */
  0x3e,  /* E - Yellow        */
  0x3f,  /* F - Bright White (White) */
  0x00   /* Border Color      */
};

/*
 *  Mode 19 Default Color Register Setting
 *  DAC palette registers, converted from actual 18 bit color to 24.
 */
static PALETTEENTRY vga_def_palette[256]={
/* red  green  blue */
  /* 16 colors in IRGB values */
  {0x00, 0x00, 0x00}, /* 0 (0) - Black */
  {0x00, 0x00, 0xAA}, /* 1 (1) - Blue */
  {0x00, 0xAA, 0x00}, /* 2 (2) - Green */
  {0x00, 0xAA, 0xAA}, /* 3 (3) - Cyan */
  {0xAA, 0x00, 0x00}, /* 4 (4) - Red */
  {0xAA, 0x00, 0xAA}, /* 5 (5) - Magenta */
  {0xAA, 0x55, 0x00}, /* 6 (6) - Brown */
  {0xAA, 0xAA, 0xAA}, /* 7 (7) - White (Light gray) */
  {0x55, 0x55, 0x55}, /* 8 (8) - Dark gray */
  {0x55, 0x55, 0xFF}, /* 9 (9) - Light blue */
  {0x55, 0xFF, 0x55}, /* 10 (A) - Light green */
  {0x55, 0xFF, 0xFF}, /* 11 (B) - Light cyan */
  {0xFF, 0x55, 0x55}, /* 12 (C) - Light red */
  {0xFF, 0x55, 0xFF}, /* 13 (D) - Light magenta */
  {0xFF, 0xFF, 0x55}, /* 14 (E) -  Yellow */
  {0xFF, 0xFF, 0xFF}, /* 15 (F) - Bright White (White) */
  /* 16 shades of gray */
  {0x00, 0x00, 0x00}, /* 16 (10) */
  {0x10, 0x10, 0x10}, /* 17 (11) */
  {0x20, 0x20, 0x20}, /* 18 (12) */
  {0x35, 0x35, 0x35}, /* 19 (13) */
  {0x45, 0x45, 0x45}, /* 20 (14) */
  {0x55, 0x55, 0x55}, /* 21 (15) */
  {0x65, 0x65, 0x65}, /* 22 (16) */
  {0x75, 0x75, 0x75}, /* 23 (17) */
  {0x8A, 0x8A, 0x8A}, /* 24 (18) */
  {0x9A, 0x9A, 0x9A}, /* 25 (19) */
  {0xAA, 0xAA, 0xAA}, /* 26 (1A) */
  {0xBA, 0xBA, 0xBA}, /* 27 (1B) */
  {0xCA, 0xCA, 0xCA}, /* 28 (1C) */
  {0xDF, 0xDF, 0xDF}, /* 29 (1D) */
  {0xEF, 0xEF, 0xEF}, /* 30 (1E) */
  {0xFF, 0xFF, 0xFF}, /* 31 (1F) */
  /* High Intensity group - 72 colors in 1/3 saturation groups (20H-37H high) */
  {0x00, 0x00, 0xFF}, /* 32 (20) */
  {0x41, 0x00, 0xFF}, /* 33 (21) */
  {0x82, 0x00, 0xFF}, /* 34 (22) */
  {0xBE, 0x00, 0xFF}, /* 35 (23) */
  {0xFF, 0x00, 0xFF}, /* 36 (24) */
  {0xFF, 0x00, 0xBE}, /* 37 (25) */
  {0xFF, 0x00, 0x82}, /* 38 (26) */
  {0xFF, 0x00, 0x41}, /* 39 (27) */
  {0xFF, 0x00, 0x00}, /* 40 (28) */
  {0xFF, 0x41, 0x00}, /* 41 (29) */
  {0xFF, 0x82, 0x00}, /* 42 (2A) */
  {0xFF, 0xBE, 0x00}, /* 43 (2B) */
  {0xFF, 0xFF, 0x00}, /* 44 (2C) */
  {0xBE, 0xFF, 0x00}, /* 45 (2D) */
  {0x82, 0xFF, 0x00}, /* 46 (2E) */
  {0x41, 0xFF, 0x00}, /* 47 (2F) */
  {0x00, 0xFF, 0x00}, /* 48 (30) */
  {0x00, 0xFF, 0x41}, /* 49 (31) */
  {0x00, 0xFF, 0x82}, /* 50 (32) */
  {0x00, 0xFF, 0xBE}, /* 51 (33) */
  {0x00, 0xFF, 0xFF}, /* 52 (34) */
  {0x00, 0xBE, 0xFF}, /* 53 (35) */
  {0x00, 0x82, 0xFF}, /* 54 (36) */
  {0x00, 0x41, 0xFF}, /* 55 (37) */
  /* High Intensity group - 72 colors in 2/3 saturation groups (38H-4FH moderate) */
  {0x82, 0x82, 0xFF}, /* 56 (38) */
  {0x9E, 0x82, 0xFF}, /* 57 (39) */
  {0xBE, 0x82, 0xFF}, /* 58 (3A) */
  {0xDF, 0x82, 0xFF}, /* 59 (3B) */
  {0xFF, 0x82, 0xFF}, /* 60 (3C) */
  {0xFF, 0x82, 0xDF}, /* 61 (3D) */
  {0xFF, 0x82, 0xBE}, /* 62 (3E) */
  {0xFF, 0x82, 0x9E}, /* 63 (3F) */
  {0xFF, 0x82, 0x82}, /* 64 (40) */
  {0xFF, 0x9E, 0x82}, /* 65 (41) */
  {0xFF, 0xBE, 0x82}, /* 66 (42) */
  {0xFF, 0xDF, 0x82}, /* 67 (43) */
  {0xFF, 0xFF, 0x82}, /* 68 (44) */
  {0xDF, 0xFF, 0x82}, /* 69 (45) */
  {0xBE, 0xFF, 0x82}, /* 70 (46) */
  {0x9E, 0xFF, 0x82}, /* 71 (47) */
  {0x82, 0xFF, 0x82}, /* 72 (48) */
  {0x82, 0xFF, 0x9E}, /* 73 (49) */
  {0x82, 0xFF, 0xBE}, /* 74 (4A) */
  {0x82, 0xFF, 0xDF}, /* 75 (4B) */
  {0x82, 0xFF, 0xFF}, /* 76 (4C) */
  {0x82, 0xDF, 0xFF}, /* 77 (4D) */
  {0x82, 0xBE, 0xFF}, /* 78 (4E) */
  {0x82, 0x9E, 0xFF}, /* 79 (4F) */
  /* High Intensity group - 72 colors in 3/3 saturation groups (50H-67H low) */
  {0xBA, 0xBA, 0xFF}, /* 80 (50) */
  {0xCA, 0xBA, 0xFF}, /* 81 (51) */
  {0xDF, 0xBA, 0xFF}, /* 82 (52) */
  {0xEF, 0xBA, 0xFF}, /* 83 (53) */
  {0xFF, 0xBA, 0xFF}, /* 84 (54) */
  {0xFF, 0xBA, 0xEF}, /* 85 (55) */
  {0xFF, 0xBA, 0xDF}, /* 86 (56) */
  {0xFF, 0xBA, 0xCA}, /* 87 (57) */
  {0xFF, 0xBA, 0xBA}, /* 88 (58) */
  {0xFF, 0xCA, 0xBA}, /* 89 (59) */
  {0xFF, 0xDF, 0xBA}, /* 90 (5A) */
  {0xFF, 0xEF, 0xBA}, /* 91 (5B) */
  {0xFF, 0xFF, 0xBA}, /* 92 (5C) */
  {0xEF, 0xFF, 0xBA}, /* 93 (5D) */
  {0xDF, 0xFF, 0xBA}, /* 94 (5E) */
  {0xCA, 0xFF, 0xBA}, /* 95 (5F) */
  {0xBA, 0xFF, 0xBA}, /* 96 (60) */
  {0xBA, 0xFF, 0xCA}, /* 97 (61) */
  {0xBA, 0xFF, 0xDF}, /* 98 (62) */
  {0xBA, 0xFF, 0xEF}, /* 99 (63) */
  {0xBA, 0xFF, 0xFF}, /* 100 (64) */
  {0xBA, 0xEF, 0xFF}, /* 101 (65) */
  {0xBA, 0xDF, 0xFF}, /* 102 (66) */
  {0xBA, 0xCA, 0xFF}, /* 103 (67) */
  /* Medium Intensity group - 72 colors in 1/3 saturation groups (68H-7FH high) */
  {0x00, 0x00, 0x71}, /* 104 (68) */
  {0x1C, 0x00, 0x71}, /* 105 (69) */
  {0x39, 0x00, 0x71}, /* 106 (6A) */
  {0x55, 0x00, 0x71}, /* 107 (6B) */
  {0x71, 0x00, 0x71}, /* 108 (6C) */
  {0x71, 0x00, 0x55}, /* 109 (6D) */
  {0x71, 0x00, 0x39}, /* 110 (6E) */
  {0x71, 0x00, 0x1C}, /* 111 (6F) */
  {0x71, 0x00, 0x00}, /* 112 (70) */
  {0x71, 0x1C, 0x00}, /* 113 (71) */
  {0x71, 0x39, 0x00}, /* 114 (72) */
  {0x71, 0x55, 0x00}, /* 115 (73) */
  {0x71, 0x71, 0x00}, /* 116 (74) */
  {0x55, 0x71, 0x00}, /* 117 (75) */
  {0x39, 0x71, 0x00}, /* 118 (76) */
  {0x1C, 0x71, 0x00}, /* 119 (77) */
  {0x00, 0x71, 0x00}, /* 120 (78) */
  {0x00, 0x71, 0x1C}, /* 121 (79) */
  {0x00, 0x71, 0x39}, /* 122 (7A) */
  {0x00, 0x71, 0x55}, /* 123 (7B) */
  {0x00, 0x71, 0x71}, /* 124 (7C) */
  {0x00, 0x55, 0x71}, /* 125 (7D) */
  {0x00, 0x39, 0x71}, /* 126 (7E) */
  {0x00, 0x1C, 0x71}, /* 127 (7F) */
  /* Medium Intensity group - 72 colors in 2/3 saturation groups (80H-97H moderate) */
  {0x39, 0x39, 0x71}, /* 128 (80) */
  {0x45, 0x39, 0x71}, /* 129 (81) */
  {0x55, 0x39, 0x71}, /* 130 (82) */
  {0x61, 0x39, 0x71}, /* 131 (83) */
  {0x71, 0x39, 0x71}, /* 132 (84) */
  {0x71, 0x39, 0x61}, /* 133 (85) */
  {0x71, 0x39, 0x55}, /* 134 (86) */
  {0x71, 0x39, 0x45}, /* 135 (87) */
  {0x71, 0x39, 0x39}, /* 136 (88) */
  {0x71, 0x45, 0x39}, /* 137 (89) */
  {0x71, 0x55, 0x39}, /* 138 (8A) */
  {0x71, 0x61, 0x39}, /* 139 (8B) */
  {0x71, 0x71, 0x39}, /* 140 (8C) */
  {0x61, 0x71, 0x39}, /* 141 (8D) */
  {0x55, 0x71, 0x39}, /* 142 (8E) */
  {0x45, 0x71, 0x39}, /* 143 (8F) */
  {0x39, 0x71, 0x39}, /* 144 (90) */
  {0x39, 0x71, 0x45}, /* 145 (91) */
  {0x39, 0x71, 0x55}, /* 146 (92) */
  {0x39, 0x71, 0x61}, /* 147 (93) */
  {0x39, 0x71, 0x71}, /* 148 (94) */
  {0x39, 0x61, 0x71}, /* 149 (95) */
  {0x39, 0x55, 0x71}, /* 150 (96) */
  {0x39, 0x45, 0x71}, /* 151 (97) */
  /* Medium Intensity group - 72 colors in 3/3 saturation groups (98H-AFH low) */
  {0x51, 0x51, 0x71}, /* 152 (98) */
  {0x59, 0x51, 0x71}, /* 153 (99) */
  {0x61, 0x51, 0x71}, /* 154 (9A) */
  {0x69, 0x51, 0x71}, /* 155 (9B) */
  {0x71, 0x51, 0x71}, /* 156 (9C) */
  {0x71, 0x51, 0x69}, /* 157 (9D) */
  {0x71, 0x51, 0x61}, /* 158 (9E) */
  {0x71, 0x51, 0x59}, /* 159 (9F) */
  {0x71, 0x51, 0x51}, /* 160 (A0) */
  {0x71, 0x59, 0x51}, /* 161 (A1) */
  {0x71, 0x61, 0x51}, /* 162 (A2) */
  {0x71, 0x69, 0x51}, /* 163 (A3) */
  {0x71, 0x71, 0x51}, /* 164 (A4) */
  {0x69, 0x71, 0x51}, /* 165 (A5) */
  {0x61, 0x71, 0x51}, /* 166 (A6) */
  {0x59, 0x71, 0x51}, /* 167 (A7) */
  {0x51, 0x71, 0x51}, /* 168 (A8) */
  {0x51, 0x71, 0x59}, /* 169 (A9) */
  {0x51, 0x71, 0x61}, /* 170 (AA) */
  {0x51, 0x71, 0x69}, /* 171 (AB) */
  {0x51, 0x71, 0x71}, /* 172 (AC) */
  {0x51, 0x69, 0x71}, /* 173 (AD) */
  {0x51, 0x61, 0x71}, /* 174 (AE) */
  {0x51, 0x59, 0x71}, /* 175 (AF) */
  /* Low Intensity group - 72 colors in 1/3 saturation groups (B0H-C7H high) */
  {0x00, 0x00, 0x41}, /* 176 (B0) */
  {0x10, 0x00, 0x41}, /* 177 (B1) */
  {0x20, 0x00, 0x41}, /* 178 (B2) */
  {0x31, 0x00, 0x41}, /* 179 (B3) */
  {0x41, 0x00, 0x41}, /* 180 (B4) */
  {0x41, 0x00, 0x31}, /* 181 (B5) */
  {0x41, 0x00, 0x20}, /* 182 (B6) */
  {0x41, 0x00, 0x10}, /* 183 (B7) */
  {0x41, 0x00, 0x00}, /* 184 (B8) */
  {0x41, 0x10, 0x00}, /* 185 (B9) */
  {0x41, 0x20, 0x00}, /* 186 (BA) */
  {0x41, 0x31, 0x00}, /* 187 (BB) */
  {0x41, 0x41, 0x00}, /* 188 (BC) */
  {0x31, 0x41, 0x00}, /* 189 (BD) */
  {0x20, 0x41, 0x00}, /* 190 (BE) */
  {0x10, 0x41, 0x00}, /* 191 (BF) */
  {0x00, 0x41, 0x00}, /* 192 (C0) */
  {0x00, 0x41, 0x10}, /* 193 (C1) */
  {0x00, 0x41, 0x20}, /* 194 (C2) */
  {0x00, 0x41, 0x31}, /* 195 (C3) */
  {0x00, 0x41, 0x41}, /* 196 (C4) */
  {0x00, 0x31, 0x41}, /* 197 (C5) */
  {0x00, 0x20, 0x41}, /* 198 (C6) */
  {0x00, 0x10, 0x41}, /* 199 (C7) */
  /* Low Intensity group - 72 colors in 2/3 saturation groups (C8H-DFH moderate) */
  {0x20, 0x20, 0x41}, /* 200 (C8) */
  {0x28, 0x20, 0x41}, /* 201 (C9) */
  {0x31, 0x20, 0x41}, /* 202 (CA) */
  {0x39, 0x20, 0x41}, /* 203 (CB) */
  {0x41, 0x20, 0x41}, /* 204 (CC) */
  {0x41, 0x20, 0x39}, /* 205 (CD) */
  {0x41, 0x20, 0x31}, /* 206 (CE) */
  {0x41, 0x20, 0x28}, /* 207 (CF) */
  {0x41, 0x20, 0x20}, /* 208 (D0) */
  {0x41, 0x28, 0x20}, /* 209 (D1) */
  {0x41, 0x31, 0x20}, /* 210 (D2) */
  {0x41, 0x39, 0x20}, /* 211 (D3) */
  {0x41, 0x41, 0x20}, /* 212 (D4) */
  {0x39, 0x41, 0x20}, /* 213 (D5) */
  {0x31, 0x41, 0x20}, /* 214 (D6) */
  {0x28, 0x41, 0x20}, /* 215 (D7) */
  {0x20, 0x41, 0x20}, /* 216 (D8) */
  {0x20, 0x41, 0x28}, /* 217 (D9) */
  {0x20, 0x41, 0x31}, /* 218 (DA) */
  {0x20, 0x41, 0x39}, /* 219 (DB) */
  {0x20, 0x41, 0x41}, /* 220 (DC) */
  {0x20, 0x39, 0x41}, /* 221 (DD) */
  {0x20, 0x31, 0x41}, /* 222 (DE) */
  {0x20, 0x28, 0x41}, /* 223 (DF) */
  /* Low Intensity group - 72 colors in 3/3 saturation groups (E0H-F7H low) */
  {0x2D, 0x2D, 0x41}, /* 223 (E0) */
  {0x31, 0x2D, 0x41}, /* 224 (E1) */
  {0x35, 0x2D, 0x41}, /* 225 (E2) */
  {0x3D, 0x2D, 0x41}, /* 226 (E3) */
  {0x41, 0x2D, 0x41}, /* 227 (E4) */
  {0x41, 0x2D, 0x3D}, /* 228 (E5) */
  {0x41, 0x2D, 0x35}, /* 229 (E6) */
  {0x41, 0x2D, 0x31}, /* 230 (E7) */
  {0x41, 0x2D, 0x2D}, /* 231 (E8) */
  {0x41, 0x31, 0x2D}, /* 232 (E9) */
  {0x41, 0x35, 0x2D}, /* 233 (EA) */
  {0x41, 0x3D, 0x2D}, /* 234 (EB) */
  {0x41, 0x41, 0x2D}, /* 235 (EC) */
  {0x3D, 0x41, 0x2D}, /* 236 (ED) */
  {0x35, 0x41, 0x2D}, /* 237 (EE) */
  {0x31, 0x41, 0x2D}, /* 238 (EF) */
  {0x2D, 0x41, 0x2D}, /* 239 (F0) */
  {0x2D, 0x41, 0x31}, /* 240 (F1) */
  {0x2D, 0x41, 0x35}, /* 241 (F2) */
  {0x2D, 0x41, 0x3D}, /* 242 (F3) */
  {0x2D, 0x41, 0x41}, /* 243 (F4) */
  {0x2D, 0x3D, 0x41}, /* 244 (F5) */
  {0x2D, 0x35, 0x41}, /* 245 (F6) */
  {0x2D, 0x31, 0x41}, /* 246 (F7) */
  /* Fill up remainder of palettes with black */
  {0,0,0}
};

/*
 *  Mode 18 Default Color Register Setting
 *  DAC palette registers, converted from actual 18 bit color to 24.
 *
 *  This palette is the dos default, converted from 18 bit color to 24.
 *  It contains only 64 entries of colors--all others are zeros.
 *      --Robert 'Admiral' Coeyman
 */
static PALETTEENTRY vga_def64_palette[256]={
/* red  green  blue */
  {0x00, 0x00, 0x00}, /* 0x00      Black      */
  {0x00, 0x00, 0xaa}, /* 0x01      Blue       */
  {0x00, 0xaa, 0x00}, /* 0x02      Green      */
  {0x00, 0xaa, 0xaa}, /* 0x03      Cyan       */
  {0xaa, 0x00, 0x00}, /* 0x04      Red        */
  {0xaa, 0x00, 0xaa}, /* 0x05      Magenta    */
  {0xaa, 0xaa, 0x00}, /* 0x06      */
  {0xaa, 0xaa, 0xaa}, /* 0x07      White (Light Gray) */
  {0x00, 0x00, 0x55}, /* 0x08      */
  {0x00, 0x00, 0xff}, /* 0x09      */
  {0x00, 0xaa, 0x55}, /* 0x0a      */
  {0x00, 0xaa, 0xff}, /* 0x0b      */
  {0xaa, 0x00, 0x55}, /* 0x0c      */
  {0xaa, 0x00, 0xff}, /* 0x0d      */
  {0xaa, 0xaa, 0x55}, /* 0x0e      */
  {0xaa, 0xaa, 0xff}, /* 0x0f      */
  {0x00, 0x55, 0x00}, /* 0x10      */
  {0x00, 0x55, 0xaa}, /* 0x11      */
  {0x00, 0xff, 0x00}, /* 0x12      */
  {0x00, 0xff, 0xaa}, /* 0x13      */
  {0xaa, 0x55, 0x00}, /* 0x14      Brown      */
  {0xaa, 0x55, 0xaa}, /* 0x15      */
  {0xaa, 0xff, 0x00}, /* 0x16      */
  {0xaa, 0xff, 0xaa}, /* 0x17      */
  {0x00, 0x55, 0x55}, /* 0x18      */
  {0x00, 0x55, 0xff}, /* 0x19      */
  {0x00, 0xff, 0x55}, /* 0x1a      */
  {0x00, 0xff, 0xff}, /* 0x1b      */
  {0xaa, 0x55, 0x55}, /* 0x1c      */
  {0xaa, 0x55, 0xff}, /* 0x1d      */
  {0xaa, 0xff, 0x55}, /* 0x1e      */
  {0xaa, 0xff, 0xff}, /* 0x1f      */
  {0x55, 0x00, 0x00}, /* 0x20      */
  {0x55, 0x00, 0xaa}, /* 0x21      */
  {0x55, 0xaa, 0x00}, /* 0x22      */
  {0x55, 0xaa, 0xaa}, /* 0x23      */
  {0xff, 0x00, 0x00}, /* 0x24      */
  {0xff, 0x00, 0xaa}, /* 0x25      */
  {0xff, 0xaa, 0x00}, /* 0x26      */
  {0xff, 0xaa, 0xaa}, /* 0x27      */
  {0x55, 0x00, 0x55}, /* 0x28      */
  {0x55, 0x00, 0xff}, /* 0x29      */
  {0x55, 0xaa, 0x55}, /* 0x2a      */
  {0x55, 0xaa, 0xff}, /* 0x2b      */
  {0xff, 0x00, 0x55}, /* 0x2c      */
  {0xff, 0x00, 0xff}, /* 0x2d      */
  {0xff, 0xaa, 0x55}, /* 0x2e      */
  {0xff, 0xaa, 0xff}, /* 0x2f      */
  {0x55, 0x55, 0x00}, /* 0x30      */
  {0x55, 0x55, 0xaa}, /* 0x31      */
  {0x55, 0xff, 0x00}, /* 0x32      */
  {0x55, 0xff, 0xaa}, /* 0x33      */
  {0xff, 0x55, 0x00}, /* 0x34      */
  {0xff, 0x55, 0xaa}, /* 0x35      */
  {0xff, 0xff, 0x00}, /* 0x36      */
  {0xff, 0xff, 0xaa}, /* 0x37      */
  {0x55, 0x55, 0x55}, /* 0x38      Dark Gray     */
  {0x55, 0x55, 0xff}, /* 0x39      Light Blue    */
  {0x55, 0xff, 0x55}, /* 0x3a      Light Green   */
  {0x55, 0xff, 0xff}, /* 0x3b      Light Cyan    */
  {0xff, 0x55, 0x55}, /* 0x3c      Light Red     */
  {0xff, 0x55, 0xff}, /* 0x3d      Light Magenta */
  {0xff, 0xff, 0x55}, /* 0x3e      Yellow        */
  {0xff, 0xff, 0xff}, /* 0x3f      White         */
  {0,0,0} /* The next 192 entries are all zeros  */
};

static HANDLE VGA_timer;
static HANDLE VGA_timer_thread;

/* set the timer rate; called in the polling thread context */
static void CALLBACK set_timer_rate( ULONG_PTR arg )
{
    LARGE_INTEGER when;

    when.u.LowPart = when.u.HighPart = 0;
    SetWaitableTimer( VGA_timer, &when, arg, VGA_Poll, 0, FALSE );
}

static DWORD CALLBACK VGA_TimerThread( void *dummy )
{
    for (;;) SleepEx( INFINITE, TRUE );
    return 0;
}

static void VGA_DeinstallTimer(void)
{
    if (VGA_timer_thread)
    {
        /*
         * Make sure the update thread is not holding
         * system resources when we kill it.
         *
         * Now, we only need to worry about update thread
         * getting terminated while in EnterCriticalSection 
         * or WaitForMultipleObjectsEx.
         *
         * FIXME: Is this a problem?
         */
        EnterCriticalSection(&vga_lock);

        CancelWaitableTimer( VGA_timer );
        CloseHandle( VGA_timer );
        TerminateThread( VGA_timer_thread, 0 );
        CloseHandle( VGA_timer_thread );
        VGA_timer_thread = 0;

        LeaveCriticalSection(&vga_lock);

        /*
         * Synchronize display. This makes sure that
         * changes to display become visible even if program 
         * terminates before update thread had time to run.
         */
        VGA_Poll( 0, 0, 0 );
    }
}

static void VGA_InstallTimer(unsigned Rate)
{
    if (!VGA_timer_thread)
    {
        VGA_timer = CreateWaitableTimerA( NULL, FALSE, NULL );
        VGA_timer_thread = CreateThread( NULL, 0, VGA_TimerThread, NULL, 0, NULL );
    }
    QueueUserAPC( set_timer_rate, VGA_timer_thread, (ULONG_PTR)Rate );
}

static BOOL VGA_IsTimerRunning(void)
{
    return VGA_timer_thread ? TRUE : FALSE;
}

static HANDLE VGA_AlphaConsole(void)
{
    /* this assumes that no Win32 redirection has taken place, but then again,
     * only 16-bit apps are likely to use this part of Wine... */
    return GetStdHandle(STD_OUTPUT_HANDLE);
}

static char*VGA_AlphaBuffer(void)
{
    return (char *)0xb8000;
}

/*** GRAPHICS MODE ***/

typedef struct {
  unsigned Xres, Yres, Depth;
  int ret;
} ModeSet;


/**********************************************************************
 *         VGA_SyncWindow
 *
 * Copy VGA window into framebuffer (if argument is TRUE) or
 * part of framebuffer into VGA window (if argument is FALSE).
 */
static void VGA_SyncWindow( BOOL target_is_fb )
{
    int size = vga_fb_window_size;

    /* Window does not overlap framebuffer. */
    if (vga_fb_window >= vga_fb_size)
        return;

    /* Check if window overlaps framebuffer only partially. */
    if (vga_fb_size - vga_fb_window < vga_fb_window_size)
        size = vga_fb_size - vga_fb_window;

    if (target_is_fb)
        memmove( vga_fb_data + vga_fb_window, vga_fb_window_data, size );
    else
        memmove( vga_fb_window_data, vga_fb_data + vga_fb_window, size );
}


static void WINAPI VGA_DoExit(ULONG_PTR arg)
{
    VGA_DeinstallTimer();
    IDirectDrawSurface_SetPalette(lpddsurf,NULL);
    IDirectDrawSurface_Release(lpddsurf);
    lpddsurf=NULL;
    IDirectDrawPalette_Release(lpddpal);
    lpddpal=NULL;
    IDirectDraw_Release(lpddraw);
    lpddraw=NULL;
}

static void WINAPI VGA_DoSetMode(ULONG_PTR arg)
{
    HRESULT	res;
    ModeSet *par = (ModeSet *)arg;
    par->ret=1;

    if (lpddraw) VGA_DoExit(0);
    if (!lpddraw) {
        res = DirectDrawCreate(NULL,&lpddraw,NULL);
        if (!lpddraw) {
            ERR("DirectDraw is not available (res = 0x%x)\n",res);
            return;
        }
        if (!vga_hwnd) {
            vga_hwnd = CreateWindowExA(0,"STATIC","WINEDOS VGA",
                                       WS_POPUP|WS_VISIBLE|SS_NOTIFY,0,0,
                                       par->Xres,par->Yres,0,0,0,NULL);
            if (!vga_hwnd) {
                ERR("Failed to create user window.\n");
                IDirectDraw_Release(lpddraw);
                lpddraw=NULL;
                return;
            }
        }
        else
            SetWindowPos(vga_hwnd,0,0,0,par->Xres,par->Yres,SWP_NOMOVE|SWP_NOZORDER);

        res=IDirectDraw_SetCooperativeLevel(lpddraw,vga_hwnd,DDSCL_FULLSCREEN|DDSCL_EXCLUSIVE);
        if (res != S_OK) {
	    ERR("Could not set cooperative level to exclusive (0x%x)\n",res);
	}

        res=IDirectDraw_SetDisplayMode(lpddraw,par->Xres,par->Yres,par->Depth);
        if (res != S_OK) {
            ERR("DirectDraw does not support requested display mode (%dx%dx%d), res = 0x%x!\n",par->Xres,par->Yres,par->Depth,res);
            IDirectDraw_Release(lpddraw);
            lpddraw=NULL;
            return;
        }

        res=IDirectDraw_CreatePalette(lpddraw,DDPCAPS_8BIT,NULL,&lpddpal,NULL);
        if (res != S_OK) {
	    ERR("Could not create palette (res = 0x%x)\n",res);
            IDirectDraw_Release(lpddraw);
            lpddraw=NULL;
            return;
        }

        res=IDirectDrawPalette_SetEntries(lpddpal,0,0,vga_fb_palette_size,vga_fb_palette);
        if (res != S_OK) {
           ERR("Could not set default palette entries (res = 0x%x)\n", res);
        }

        memset(&sdesc,0,sizeof(sdesc));
        sdesc.dwSize=sizeof(sdesc);
	sdesc.dwFlags = DDSD_CAPS;
	sdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
        res=IDirectDraw_CreateSurface(lpddraw,&sdesc,&lpddsurf,NULL);
        if (res != S_OK || !lpddsurf) {
            ERR("DirectDraw surface is not available\n");
            IDirectDraw_Release(lpddraw);
            lpddraw=NULL;
            return;
        }
        IDirectDrawSurface_SetPalette(lpddsurf,lpddpal);
        vga_retrace_vertical = vga_retrace_horizontal = FALSE;
        /* poll every 20ms (50fps should provide adequate responsiveness) */
        VGA_InstallTimer(20);
    }
    par->ret=0;
    return;
}

/**********************************************************************\
* VGA_GetModeInfo
*
* Returns mode information, given mode number
\**********************************************************************/
const VGA_MODE *VGA_GetModeInfo(WORD mode)
{
    const VGA_MODE *ModeInfo = VGA_modelist;

    /*
     * Filter out flags.
     */
    mode &= 0x17f;

    while (ModeInfo->Mode != 0xffff)
    {
        if (ModeInfo->Mode == mode)
            return ModeInfo;
        ModeInfo++;
    }
    return NULL;
}

static int VGA_SetGraphicMode(WORD mode)
{
    ModeSet par;
    int     newSize;

    /* get info on VGA mode & set appropriately */
    const VGA_MODE *ModeInfo = VGA_GetModeInfo(VGA_CurrentMode);
    /* check if we're assuming composite display */
    if ((mode == 6) && (CGA_ColorComposite))
    {
       vga_fb_width = (ModeInfo->Width / 4);
       vga_fb_height = ModeInfo->Height;
       vga_fb_depth = (ModeInfo->Depth * 4);
    }
    else
    {
       vga_fb_width = ModeInfo->Width;
       vga_fb_height = ModeInfo->Height;
       vga_fb_depth = ModeInfo->Depth;
    }
    vga_fb_offset = 0;
    vga_fb_pitch = vga_fb_width * ((vga_fb_depth + 7) / 8);

    newSize = vga_fb_width * vga_fb_height * ((vga_fb_depth + 7) / 8);
    if(newSize < 256 * 1024)
      newSize = 256 * 1024;

    if(vga_fb_size < newSize) {
      HeapFree(GetProcessHeap(), 0, vga_fb_data);
      vga_fb_data = HeapAlloc(GetProcessHeap(), 0, newSize);
      vga_fb_size = newSize;
    }

    if(vga_fb_width >= 640 || vga_fb_height >= 480) {
      par.Xres = vga_fb_width;
      par.Yres = vga_fb_height;
    } else {
      par.Xres = 640;
      par.Yres = 480;
    }

    /* Setup window */
    if(vga_fb_depth >= 8)
    {
      vga_fb_window_data = VGA_WINDOW_START;
      vga_fb_window_size = VGA_WINDOW_SIZE;
      vga_fb_palette = vga_def_palette;
      vga_fb_palette_size = 256;
    }
    else
    {
      vga_fb_window_data = CGA_WINDOW_START;
      vga_fb_window_size = CGA_WINDOW_SIZE;
      if(vga_fb_depth == 2)
      {
        /* Select default 2 bit CGA palette */
        vga_fb_palette = cga_palette1;
        vga_fb_palette_size = 4;
      }
      else
      {
        /* Top of VGA palette is same as 4 bit CGA palette */
        vga_fb_palette = vga_def_palette;
        vga_fb_palette_size = 16;
      }

      vga_fb_palette_index = 0;
      vga_fb_bright = 0;
    }

    /* Clean the HW buffer */
    memset(vga_fb_window_data, 0x00, vga_fb_window_size);

    /* Reset window start */
    VGA_SetWindowStart(0);

    par.Depth = (vga_fb_depth < 8) ? 8 : vga_fb_depth;

    MZ_RunInThread(VGA_DoSetMode, (ULONG_PTR)&par);
    return par.ret;
}

int VGA_SetMode(WORD mode)
{
    const VGA_MODE *ModeInfo;
    /* get info on VGA mode & set appropriately */
    VGA_CurrentMode = mode;
    ModeInfo = VGA_GetModeInfo(VGA_CurrentMode);

    /* check if mode is supported */
    if (ModeInfo->Supported)
    {
       FIXME("Setting VGA mode %i - Supported mode - Improve reporting of missing capabilities for modes & modetypes.\n", mode);
    }
    else
    {
       FIXME("Setting VGA mode %i - Unsupported mode - Will doubtfully work at all, but we'll try anyways.\n", mode);
    }

    /* set up graphic or text display */
    if (ModeInfo->ModeType == TEXT)
    {
       VGA_SetAlphaMode(ModeInfo->TextCols, ModeInfo->TextRows);
    }
    else
    {
       return VGA_SetGraphicMode(mode);
    }
    return 0; /* assume all good & return zero */
}

int VGA_GetMode(unsigned*Height,unsigned*Width,unsigned*Depth)
{
    if (!lpddraw) return 1;
    if (!lpddsurf) return 1;
    if (Height) *Height=sdesc.dwHeight;
    if (Width) *Width=sdesc.dwWidth;
    if (Depth) *Depth=sdesc.ddpfPixelFormat.u1.dwRGBBitCount;
    return 0;
}

static void VGA_Exit(void)
{
    if (lpddraw) MZ_RunInThread(VGA_DoExit, 0);
}

void VGA_SetPalette(PALETTEENTRY*pal,int start,int len)
{
    if (!lpddraw) return;
    IDirectDrawPalette_SetEntries(lpddpal,0,start,len,pal);
}

/* set a single [char wide] color in 16 color mode. */
void VGA_SetColor16(int reg,int color)
{
	PALETTEENTRY *pal;

    if (!lpddraw) return;
	pal= &vga_def64_palette[color];
        IDirectDrawPalette_SetEntries(lpddpal,0,reg,1,pal);
	vga_16_palette[reg]=(char)color;
}

/* Get a single [char wide] color in 16 color mode. */
char VGA_GetColor16(int reg)
{

    if (!lpddraw) return 0;
	return vga_16_palette[reg];
}

/* set all 17 [char wide] colors at once in 16 color mode. */
void VGA_Set16Palette(char *Table)
{
	PALETTEENTRY *pal;
	int c;

    if (!lpddraw) return;         /* return if we're in text only mode */
    memcpy( Table, vga_16_palette, 17 ); /* copy the entries into the table */

    for (c=0; c<17; c++) {                                /* 17 entries */
	pal= &vga_def64_palette[(int)vga_16_palette[c]];  /* get color  */
        IDirectDrawPalette_SetEntries(lpddpal,0,c,1,pal); /* set entry  */
	TRACE("Palette register %d set to %d\n",c,(int)vga_16_palette[c]);
   } /* end of the counting loop */
}

/* Get all 17 [ char wide ] colors at once in 16 color mode. */
void VGA_Get16Palette(char *Table)
{

    if (!lpddraw) return;         /* return if we're in text only mode */
    memcpy( vga_16_palette, Table, 17 ); /* copy the entries into the table */
}

static LPSTR VGA_Lock(unsigned*Pitch,unsigned*Height,unsigned*Width,unsigned*Depth)
{
    if (!lpddraw) return NULL;
    if (!lpddsurf) return NULL;
    if (IDirectDrawSurface_Lock(lpddsurf,NULL,&sdesc,0,0) != S_OK) {
        ERR("could not lock surface!\n");
        return NULL;
    }
    if (Pitch) *Pitch=sdesc.u1.lPitch;
    if (Height) *Height=sdesc.dwHeight;
    if (Width) *Width=sdesc.dwWidth;
    if (Depth) *Depth=sdesc.ddpfPixelFormat.u1.dwRGBBitCount;
    return sdesc.lpSurface;
}

static void VGA_Unlock(void)
{
    IDirectDrawSurface_Unlock(lpddsurf,sdesc.lpSurface);
}

/*
 * Set start of 64k window at 0xa0000 in bytes.
 * If value is -1, initialize color plane support.
 * If value is >= 0, window contains direct copy of framebuffer.
 */
void VGA_SetWindowStart(int start)
{
    if(start == vga_fb_window)
        return;

    EnterCriticalSection(&vga_lock);

    if(vga_fb_window == -1)
        FIXME("Remove VGA memory emulation.\n");
    else
        VGA_SyncWindow( TRUE );

    vga_fb_window = start;

    if(vga_fb_window == -1)
        FIXME("Install VGA memory emulation.\n");
    else
        VGA_SyncWindow( FALSE );

    LeaveCriticalSection(&vga_lock);
}

/*
 * Get start of 64k window at 0xa0000 in bytes.
 * Value is -1 in color plane modes.
 */
int VGA_GetWindowStart(void)
{
    return vga_fb_window;
}


/**********************************************************************
 *         VGA_DoShowMouse
 *
 * Callback for VGA_ShowMouse.
 */
static void WINAPI VGA_DoShowMouse( ULONG_PTR show )
{
    INT rv;

    do
    {
        rv = ShowCursor( show );
    }
    while( show ? (rv < 0) : (rv >= 0) );
}


/**********************************************************************
 *         VGA_ShowMouse
 *
 * If argument is TRUE, unconditionally show mouse cursor.
 * If argument is FALSE, unconditionally hide mouse cursor.
 * This only works in graphics mode.
 */
void VGA_ShowMouse( BOOL show )
{
    if (lpddraw)
        MZ_RunInThread( VGA_DoShowMouse, (ULONG_PTR)show );
}


/**********************************************************************
 *         VGA_UpdatePalette
 *
 * Update the current palette
 *
 * Note: When updating the current CGA palette, palette index 0
 * refers to palette2, and index 1 is palette1 (default palette)
 */
void VGA_UpdatePalette(void)
{
  /* Figure out which palette is used now */
  if(vga_fb_bright)
  {
    if(vga_fb_palette_index == 0)
    {
      vga_fb_palette = cga_palette2_bright;
    }
    else if(vga_fb_palette_index == 1)
    {
      vga_fb_palette = cga_palette1_bright;
    }
  }
  else
  {
    if(vga_fb_palette_index == 0)
    {
      vga_fb_palette = cga_palette2;
    }
    else if(vga_fb_palette_index == 1)
    {
      vga_fb_palette = cga_palette1;
    }
  }

  /* Now update the palette */
  VGA_SetPalette(vga_fb_palette,0,4);
}

/**********************************************************************
 *         VGA_SetBright
 *
 * Select if using a "bright" palette or not.
 * This is a property of the CGA controller
 */
void VGA_SetBright(BOOL bright)
{
  TRACE("%i\n", bright);

  /* Remember the "bright" value used by the CGA controller */
  vga_fb_bright = bright;
}

/**********************************************************************
 *         VGA_SetEnabled
 *
 * Select if output is enabled or disabled
 * This is a property of the CGA controller
 */
static void VGA_SetEnabled(BOOL enabled)
{
  TRACE("%i\n", enabled);

  /* Check if going from enabled to disabled */
  if(vga_fb_enabled && !enabled)
  {
    /* Clear frame buffer */
    memset(vga_fb_window_data, 0x00, vga_fb_window_size);
  }

  /* Remember the "enabled" value */
  vga_fb_enabled = enabled;
}

/**********************************************************************
 *         VGA_SetPaletteIndex
 *
 * Select the index of the palette which is currently in use
 * This is a property of the CGA controller
 */
void VGA_SetPaletteIndex(unsigned index)
{
  TRACE("%i\n", index);

  /* Remember the palette index, which is only used by CGA for now */
  vga_fb_palette_index = index;
}

/**********************************************************************
 *         VGA_WritePixel
 *
 * Write data to the framebuffer
 * This is a property of the CGA controller, but might be supported
 * later by other framebuffer types
 */
void VGA_WritePixel(unsigned color, unsigned page, unsigned col, unsigned row)
{
  int off;
  int bits;
  int pos;

  /* Calculate CGA byte offset */
  char *data = vga_fb_window_data;
  off = row & 1 ? (8 * 1024) : 0;
  off += (80 * (row/2));
  off += col/4;

  /* Calculate bits offset */
  pos = 6 - (col%4 * 2);

  /* Clear current data */
  bits = 0x03 << pos;
  data[off] &= ~bits;

  /* Set new data */
  bits = color << pos;
  data[off] |= bits;
}

/*** TEXT MODE ***/

/* prepare the text mode video memory copy that is used to only
 * update the video memory line that did get updated. */
static void VGA_PrepareVideoMemCopy(unsigned Xres, unsigned Yres)
{
    char *p, *p2;
    unsigned int i;

    /*
     * Allocate space for char + attr.
     */

    if (vga_text_old)
        vga_text_old = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 
                                vga_text_old, Xres * Yres * 2 );
    else
        vga_text_old = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 
                                 Xres * Yres * 2 );
    p = VGA_AlphaBuffer();
    p2 = vga_text_old;

    /* make sure the video mem copy contains the exact opposite of our
     * actual text mode memory area to make sure the screen
     * does get updated fully initially */
    for (i=0; i < Xres*Yres*2; i++)
	*p2++ = *p++ ^ 0xff; /* XOR it */
}

/**********************************************************************
 *         VGA_SetAlphaMode
 *
 * Set VGA emulation to text mode.
 */
void VGA_SetAlphaMode(unsigned Xres,unsigned Yres)
{
    VGA_Exit();
    VGA_DeinstallTimer();
    
    VGA_PrepareVideoMemCopy(Xres, Yres);
    vga_text_width = Xres;
    vga_text_height = Yres;

    if (vga_text_x >= vga_text_width || vga_text_y >= vga_text_height)
        VGA_SetCursorPos(0,0);

    if(vga_text_console) {
        COORD size;
        size.X = Xres;
        size.Y = Yres;
        SetConsoleScreenBufferSize( VGA_AlphaConsole(), size );

        /* poll every 30ms (33fps should provide adequate responsiveness) */
        VGA_InstallTimer(30);
    }
}

/**********************************************************************
 *         VGA_InitAlphaMode
 *
 * Initialize VGA text mode handling and return default text mode.
 * This function does not set VGA emulation to text mode.
 */
void VGA_InitAlphaMode(unsigned*Xres,unsigned*Yres)
{
    CONSOLE_SCREEN_BUFFER_INFO info;

    if(GetConsoleScreenBufferInfo( VGA_AlphaConsole(), &info ))
    {
        vga_text_console = TRUE;
        vga_text_x = info.dwCursorPosition.X;
        vga_text_y = info.dwCursorPosition.Y;
        vga_text_attr = info.wAttributes;
        *Xres = info.dwSize.X;
        *Yres = info.dwSize.Y;
    } 
    else
    {
        vga_text_console = FALSE;
        vga_text_x = 0;
        vga_text_y = 0;
        vga_text_attr = 0x0f;
        *Xres = 80;
        *Yres = 25;
    }
}

/**********************************************************************
 *         VGA_GetAlphaMode
 *
 * Get current text mode. Returns TRUE and sets resolution if
 * any VGA text mode has been initialized.
 */
BOOL VGA_GetAlphaMode(unsigned*Xres,unsigned*Yres)
{
    if (vga_text_width != 0 && vga_text_height != 0) {
        *Xres = vga_text_width;
        *Yres = vga_text_height;
        return TRUE;
    } else
        return FALSE;
}

void VGA_SetCursorShape(unsigned char start_options, unsigned char end)
{
    CONSOLE_CURSOR_INFO cci;

    /* standard cursor settings:
     * 0x0607 == CGA, 0x0b0c == monochrome, 0x0d0e == EGA/VGA */

    /* calculate percentage from bottom - assuming VGA (bottom 0x0e) */
    cci.dwSize = ((end & 0x1f) - (start_options & 0x1f))/0x0e * 100;
    if (!cci.dwSize) cci.dwSize++; /* NULL cursor would make SCCI() fail ! */
    cci.bVisible = ((start_options & 0x60) != 0x20); /* invisible ? */

    SetConsoleCursorInfo(VGA_AlphaConsole(),&cci);
}

void VGA_SetCursorPos(unsigned X,unsigned Y)
{
    vga_text_x = X;
    vga_text_y = Y;
}

void VGA_GetCursorPos(unsigned*X,unsigned*Y)
{
    if (X) *X = vga_text_x;
    if (Y) *Y = vga_text_y;
}

static void VGA_PutCharAt(unsigned x, unsigned y, BYTE ascii, int attr)
{
    const VGA_MODE *ModeInfo = VGA_GetModeInfo(VGA_CurrentMode);
    if ( ModeInfo->ModeType == TEXT )
    {
       char *dat = VGA_AlphaBuffer() + ((vga_text_width * y + x) * 2);
       dat[0] = ascii;
       if (attr>=0)
          dat[1] = attr;
    }
    else
    {
       FIXME("Write %c at (%i,%i) - not yet supported in graphic modes.\n", (char)ascii, x, y);
    }
}

void VGA_WriteChars(unsigned X,unsigned Y,unsigned ch,int attr,int count)
{
    EnterCriticalSection(&vga_lock);

    while (count--) 
        VGA_PutCharAt(X + count, Y, ch, attr);

    LeaveCriticalSection(&vga_lock);
}

void VGA_PutChar(BYTE ascii)
{
    DWORD w;

    EnterCriticalSection(&vga_lock);

    switch(ascii) {
    case '\b':
        if (vga_text_x)
        {
            vga_text_x--;
            VGA_PutCharAt(vga_text_x, vga_text_y, ' ', 0);
        }
        break;

    case '\t':
        vga_text_x += ((vga_text_x + 8) & ~7) - vga_text_x;
        break;

    case '\n':
        vga_text_y++;
        vga_text_x = 0;
        break;

    case '\a':
        break;

    case '\r':
        vga_text_x = 0;
        break;

    default:
        VGA_PutCharAt(vga_text_x, vga_text_y, ascii, vga_text_attr);
        vga_text_x++;
    }

    if (vga_text_x >= vga_text_width)
    {
        vga_text_x = 0;
        vga_text_y++;
    }

    if (vga_text_y >= vga_text_height)
    {
        vga_text_y = vga_text_height - 1;
        VGA_ScrollUpText( 0, 0, 
                          vga_text_height - 1, vga_text_width - 1, 
                          1, vga_text_attr );
    }

    /*
     * If we don't have a console, write directly to standard output.
     */
    if(!vga_text_console)
        WriteFile(VGA_AlphaConsole(), &ascii, 1, &w, NULL);

    LeaveCriticalSection(&vga_lock);
}

void VGA_ClearText(unsigned row1, unsigned col1,
                   unsigned row2, unsigned col2,
                   BYTE attr)
{
    unsigned x, y;

    EnterCriticalSection(&vga_lock);

    for(y=row1; y<=row2; y++)
        for(x=col1; x<=col2; x++)
            VGA_PutCharAt(x, y, 0x20, attr);

    LeaveCriticalSection(&vga_lock);
}

void VGA_ScrollUpText(unsigned row1,  unsigned col1,
                      unsigned row2,  unsigned col2,
                      unsigned lines, BYTE attr)
{
    char    *buffer = VGA_AlphaBuffer();
    unsigned y;

    EnterCriticalSection(&vga_lock);

    /*
     * Scroll buffer.
     */
    for (y = row1; y <= row2 - lines; y++)
        memmove( buffer + col1 + y * vga_text_width * 2,
                 buffer + col1 + (y + lines) * vga_text_width * 2,
                 (col2 - col1 + 1) * 2 );

    /*
     * Fill exposed lines.
     */
    for (y = max(row1, row2 - lines + 1); y <= row2; y++)
        VGA_WriteChars( col1, y, ' ', attr, col2 - col1 + 1 );

    LeaveCriticalSection(&vga_lock);
}

void VGA_ScrollDownText(unsigned row1,  unsigned col1,
                        unsigned row2,  unsigned col2,
                        unsigned lines, BYTE attr)
{
    char    *buffer = VGA_AlphaBuffer();
    unsigned y;

    EnterCriticalSection(&vga_lock);

    /*
     * Scroll buffer.
     */
    for (y = row2; y >= row1 + lines; y--)
        memmove( buffer + col1 + y * vga_text_width * 2,
                 buffer + col1 + (y - lines) * vga_text_width * 2,
                 (col2 - col1 + 1) * 2 );

    /*
     * Fill exposed lines.
     */
    for (y = row1; y <= min(row1 + lines - 1, row2); y++)
        VGA_WriteChars( col1, y, ' ', attr, col2 - col1 + 1 );

    LeaveCriticalSection(&vga_lock);
}

void VGA_GetCharacterAtCursor(BYTE *ascii, BYTE *attr)
{
    char *dat;

    dat = VGA_AlphaBuffer() + ((vga_text_width * vga_text_y + vga_text_x) * 2);

    *ascii = dat[0];
    *attr = dat[1];
}


/*** CONTROL ***/

/* FIXME: optimize by doing this only if the data has actually changed
 *        (in a way similar to DIBSection, perhaps) */
static void VGA_Poll_Graphics(void)
{
  unsigned int Pitch, Height, Width, X, Y;
  char *surf;
  char *dat = vga_fb_data + vga_fb_offset;
  int   bpp = (vga_fb_depth + 7) / 8;

  surf = VGA_Lock(&Pitch,&Height,&Width,NULL);
  if (!surf) return;

  /*
   * Synchronize framebuffer contents.
   */
  if (vga_fb_window != -1)
      VGA_SyncWindow( TRUE );

  /*
   * CGA framebuffer (160x200) - CGA_ColorComposite, special subtype of mode 6
   * This buffer is encoded as following:
   * - 4 bit pr. pixel, 2 pixels per byte
   * - 80 bytes per row
   * - Every second line has an offset of 8096
   */
  if(vga_fb_depth == 4 && vga_fb_width == 160 && vga_fb_height == 200){
    WORD off = 0;
    BYTE bits = 4;
    BYTE value;
    for(Y=0; Y<vga_fb_height; Y++, surf+=(Pitch*2)){
      for(X=0; X<vga_fb_width; X++){
        off = Y & 1 ? (8 * 1024) : 0;
        off += (80 * (Y/2));
        off += X/2;
        value = (dat[off] >> bits) & 0xF;
        surf[(X*4)+0] = value;
        surf[(X*4)+1] = value;
        surf[(X*4)+2] = value;
        surf[(X*4)+3] = value;
        surf[(X*4)+Pitch+0] = value;
        surf[(X*4)+Pitch+1] = value;
        surf[(X*4)+Pitch+2] = value;
        surf[(X*4)+Pitch+3] = value;
        bits -= 4;
        bits &= 7;
      }
    }
  }

  /*
   * CGA framebuffer (320x200)
   * This buffer is encoded as following:
   * - 2 bits per color, 4 pixels per byte
   * - 80 bytes per row
   * - Every second line has an offset of 8096
   */
  else if(vga_fb_depth == 2 && vga_fb_width == 320 && vga_fb_height == 200){
    WORD off = 0;
    BYTE bits = 6;
    BYTE value;
    /* Go thru rows */
    for(Y=0; Y<vga_fb_height; Y++, surf+=(Pitch*2)){
      for(X=0; X<vga_fb_width; X++){
        off = Y & 1 ? (8 * 1024) : 0;
        off += (80 * (Y/2));
        off += X/4;
        value = (dat[off] >> bits) & 0x3;
        surf[(X*2)] = value;
        surf[(X*2)+1] = value;
        surf[(X*2)+Pitch] = value;
        surf[(X*2)+Pitch+1] = value;
        bits -= 2;
        bits &= 7;
      }
    }
  }

  /*
   * Double VGA framebuffer (320x200 -> 640x400), if needed.
   */
  else if(Height >= 2 * vga_fb_height && Width >= 2 * vga_fb_width && bpp == 1)
    for (Y=0; Y<vga_fb_height; Y++,surf+=Pitch*2,dat+=vga_fb_pitch)
      for (X=0; X<vga_fb_width; X++) {
       BYTE value = dat[X];
       surf[X*2] = value;
       surf[X*2+1] = value;
       surf[X*2+Pitch] = value;
       surf[X*2+Pitch+1] = value;
      }
  /*
   * Linear Buffer, including mode 19
   */
  else
    for (Y=0; Y<vga_fb_height; Y++,surf+=Pitch,dat+=vga_fb_pitch)
      memcpy(surf, dat, vga_fb_width * bpp);

  VGA_Unlock();
}

static void VGA_Poll_Text(void)
{
    char *dat, *old, *p_line;
    unsigned int X, Y;
    CHAR_INFO ch[256]; /* that should suffice for the largest text width */
    COORD siz, off;
    SMALL_RECT dest;
    HANDLE con = VGA_AlphaConsole();
    BOOL linechanged = FALSE; /* video memory area differs from stored copy? */

    /* Synchronize cursor position. */
    off.X = vga_text_x;
    off.Y = vga_text_y;
    SetConsoleCursorPosition(con,off);

    dat = VGA_AlphaBuffer();
    old = vga_text_old; /* pointer to stored video mem copy */
    siz.X = vga_text_width; siz.Y = 1;
    off.X = 0; off.Y = 0;

    /* copy from virtual VGA frame buffer to console */
    for (Y=0; Y<vga_text_height; Y++) {
	linechanged = memcmp(dat, old, vga_text_width*2);
	if (linechanged)
	{
	    /*TRACE("line %d changed\n", Y);*/
	    p_line = dat;
            for (X=0; X<vga_text_width; X++) {
                ch[X].Char.AsciiChar = *p_line++;
                /* WriteConsoleOutputA doesn't like "dead" chars */
                if (ch[X].Char.AsciiChar == '\0')
                    ch[X].Char.AsciiChar = ' ';
                ch[X].Attributes = *p_line++;
            }
            dest.Top=Y; dest.Bottom=Y;
            dest.Left=0; dest.Right=vga_text_width+1;
            WriteConsoleOutputA(con, ch, siz, off, &dest);
	    memcpy(old, dat, vga_text_width*2);
	}
	/* advance to next text line */
	dat += vga_text_width*2;
	old += vga_text_width*2;
    }
}

static void CALLBACK VGA_Poll( LPVOID arg, DWORD low, DWORD high )
{
    EnterCriticalSection(&vga_lock);

    if (lpddraw)
        VGA_Poll_Graphics();
    else
        VGA_Poll_Text();

    /*
     * Fake start of retrace.
     */
    vga_retrace_vertical = TRUE;

    LeaveCriticalSection(&vga_lock);
}

static BYTE palreg,palcnt;
static PALETTEENTRY paldat;

void VGA_ioport_out( WORD port, BYTE val )
{
    switch (port) {
        /* General Register - Feature Control */
        case 0x3ba:
           FIXME("Unsupported VGA register: general register - feature control 0x%04x (value 0x%02x)\n", port, val);
           break;
        /* Attribute Controller - Address/Other */
        case 0x3c0:
           if (vga_address_3c0)
               vga_index_3c0 = val;
           else
               FIXME("Unsupported index, VGA attribute controller register 0x3c0: 0x%02x (value 0x%02x)\n",
                     vga_index_3c0, val);
           vga_address_3c0 = !vga_address_3c0;
           break;
        /* General Register - Misc output */
        case 0x3c2:
           FIXME("Unsupported VGA register: general register - misc output 0x%04x (value 0x%02x)\n", port, val);
           break;
        /* General Register - Video subsystem enable */
        case 0x3c3:
           FIXME("Unsupported VGA register: general register - video subsystem enable 0x%04x (value 0x%02x)\n", port, val);
           break;
        /* Sequencer Register - Address */
        case 0x3c4:
           vga_index_3c4 = val;
           break;
        /* Sequencer Register - Other */
        case 0x3c5:
          switch(vga_index_3c4) {
               case 0x04: /* Sequencer: Memory Mode Register */
                  if(vga_fb_depth == 8)
                      VGA_SetWindowStart((val & 8) ? 0 : -1);
                  else
                      FIXME("Memory Mode Register not supported in this mode.\n");
                  break;
               default:
                  FIXME("Unsupported index, VGA sequencer register 0x3c4: 0x%02x (value 0x%02x)\n",
                        vga_index_3c4, val);
           }
           break;
        case 0x3c8:
            palreg=val; palcnt=0; break;
        case 0x3c9:
            ((BYTE*)&paldat)[palcnt++]=val << 2;
            if (palcnt==3) {
                VGA_SetPalette(&paldat,palreg++,1);
                palcnt=0;
            }
            break;
        /* Graphics Controller Register - Address */
        case 0x3ce:
            vga_index_3ce = val;
           break;
        /* Graphics Controller Register - Other */
        case 0x3cf:
           FIXME("Unsupported index, VGA graphics controller register - other 0x3ce: 0x%02x (value 0x%02x)\n",
                 vga_index_3ce, val);
           break;
        /* CRT Controller Register - Index (MDA) */
        case 0x3b4:
        /* CRT Controller Register - Index (CGA) */
        case 0x3d4:
           vga_index_3d4 = val;
           break;
        /* CRT Controller Register - Other (MDA) */
        case 0x3b5:
        /* CRT Controller Register - Other (CGA) */
        case 0x3d5:
           FIXME("Unsupported index, VGA crt controller register 0x3b4/0x3d4: 0x%02x (value 0x%02x)\n",
                 vga_index_3d4, val);
           break;
        /* Mode control register - 6845 Motorola (MDA) */
        case 0x3b8:
        /* Mode control register - 6845 Motorola (CGA) */
        case 0x3d8:
           /*
            *  xxxxxxx1 = 80x25 text
            *  xxxxxxx0 = 40x25 text (default)
            *  xxxxxx1x = graphics (320x200)
            *  xxxxxx0x = text
            *  xxxxx1xx = B/W
            *  xxxxx0xx = color
            *  xxxx1xxx = enable video signal
            *  xxx1xxxx = 640x200 B/W graphics
            *  xx1xxxxx = blink
            */

           /* check bits 6 and 7 */
           if (val & 0xC0)
           {
              FIXME("Unsupported value, VGA register 0x3d8: 0x%02x - bits 7 and 6 not supported.\n", val);
           }
           /* check bits 5 - blink on */
           if (val & 0x20)
           {
              FIXME("Unsupported value, VGA register 0x3d8: 0x%02x (bit 5) - blink is not supported.\n", val);
           }
           /* Enable Video Signal (bit 3) - Set the enabled bit */
           VGA_SetEnabled((val & 0x08) != 0);

           /* xxx1x010 - Detect 160x200, 16 color mode (CGA composite) */
           if( (val & 0x17) == 0x12 )
           {
             /* Switch to 160x200x4 composite mode - special case of mode 6 */
             CGA_ColorComposite = TRUE;
             VGA_SetMode(6);
           }
           else
           {
             /* turn off composite colors otherwise, including 320x200 (80x200 16 color) */
             CGA_ColorComposite = FALSE;
           }

           /* xxx0x100 - Detect VGA mode 0 */
           if( (val & 0x17) == 0x04 )
           {
             VGA_SetMode(0);
           }
           /* xxx0x000 - Detect VGA mode 1 */
           else if( (val & 0x17) == 0x00 )
           {
             VGA_SetMode(1);
           }
           /* xxx0x101 - Detect VGA mode 2 */
           else if( (val & 0x17) == 0x05 )
           {
             VGA_SetMode(2);
           }
           /* xxx0x001 - Detect VGA mode 3 */
           else if( (val & 0x17) == 0x01 )
           {
             VGA_SetMode(3);
           }
           /* xxx0x010 - Detect VGA mode 4 */
           else if( (val & 0x17) == 0x02 )
           {
             VGA_SetMode(4);
           }
           /* xxx0x110 - Detect VGA mode 5 */
           else if( (val & 0x17) == 0x06 )
           {
             VGA_SetMode(5);
           }
           /* xxx1x110 - Detect VGA mode 6 */
           else if( (val & 0x17) == 0x16 )
           {
             VGA_SetMode(6);
           }
           /* unsupported mode */
           else
           {
             FIXME("Unsupported value, VGA register 0x3d8: 0x%02x - unrecognized MDA/CGA mode\n", val); /* Set the enabled bit */
           }

           break;

        /* Colour control register (CGA) */
        case 0x3d9:
           /* Set bright */
           VGA_SetBright((val & 0x10) != 0);

           /* Set palette index */
           VGA_SetPaletteIndex((val & 0x20) != 0);

           /* Now update the palette */
           VGA_UpdatePalette();
           break;
        default:
            FIXME("Unsupported VGA register: 0x%04x (value 0x%02x)\n", port, val);
    }
}

BYTE VGA_ioport_in( WORD port )
{
    BYTE ret;

    switch (port) {
        /* Attribute Controller - Other */
        case 0x3c1:
           FIXME("Unsupported index, VGA attribute controller register 0x3c0: 0x%02x\n",
                 vga_index_3c0);
           return 0xff;
        /* General Register - Input status 0 */
        case 0x3c2:
           ret=0xff;
           FIXME("Unsupported VGA register: general register - input status 0 0x%04x\n", port);
           break;
        /* General Register - Video subsystem enable */
        case 0x3c3:
           ret=0xff;
           FIXME("Unsupported VGA register: general register - video subsystem enable 0x%04x\n", port);
           break;
        /* Sequencer Register - Other */
        case 0x3c5:
           switch(vga_index_3c4) {
               case 0x04: /* Sequencer: Memory Mode Register */
                    return (VGA_GetWindowStart() == -1) ? 0xf7 : 0xff;
               default:
                   FIXME("Unsupported index, register 0x3c4: 0x%02x\n",
                         vga_index_3c4);
                   return 0xff;
           }
        /* General Register -  DAC State */
        case 0x3c7:
           ret=0xff;
           FIXME("Unsupported VGA register: general register - DAC State 0x%04x\n", port);
           break;
        /* General Register - Feature control */
        case 0x3ca:
           ret=0xff;
           FIXME("Unsupported VGA register: general register - Feature control 0x%04x\n", port);
           break;
        /* General Register - Misc output */
        case 0x3cc:
           ret=0xff;
           FIXME("Unsupported VGA register: general register - Feature control 0x%04x\n", port);
           break;
        /* Graphics Controller Register - Other */
        case 0x3cf:
           FIXME("Unsupported index, register 0x3ce: 0x%02x\n",
                 vga_index_3ce);
           return 0xff;
        /* CRT Controller Register - Other (MDA) */
        case 0x3b5:
        /* CRT Controller Register - Other (CGA) */
        case 0x3d5:
           FIXME("Unsupported index, VGA crt controller register 0x3b4/0x3d4: 0x%02x\n",
                 vga_index_3d4);
           return 0xff;
        /* General Register - Input status 1 (MDA) */
        case 0x3ba:
        /* General Register - Input status 1 (CGA) */
        case 0x3da:
            /*
             * Read from this register resets register 0x3c0 address flip-flop.
             */
            vga_address_3c0 = TRUE;

            /*
             * Read from this register returns following bits:
             *   xxxx1xxx = Vertical retrace in progress if set.
             *   xxxxx1xx = Light pen switched on.
             *   xxxxxx1x = Light pen trigger set.
             *   xxxxxxx1 = Either vertical or horizontal retrace 
             *              in progress if set.
             */
            ret = 0;
            if (vga_retrace_vertical)
                ret |= 9;
            if (vga_retrace_horizontal)
                ret |= 3;
            
            /*
             * If VGA mode has been set, vertical retrace is
             * turned on once a frame and cleared after each read.
             * This might cause applications that synchronize with
             * vertical retrace to actually skip one frame but that
             * is probably not a problem.
             * 
             * If no VGA mode has been set, vertical retrace is faked
             * by toggling the value after every read.
             */
            if (VGA_IsTimerRunning())
                vga_retrace_vertical = FALSE;
            else
                vga_retrace_vertical = !vga_retrace_vertical;

            /*
             * Toggle horizontal retrace.
             */
            vga_retrace_horizontal = !vga_retrace_horizontal;
            break;

        default:
            ret=0xff;
            FIXME("Unsupported VGA register: 0x%04x\n", port);
    }
    return ret;
}

void VGA_Clean(void)
{
    VGA_Exit();
    VGA_DeinstallTimer();
}
