Stubbed additional VGA registers

Marcus Meissner marcus at jet.franken.de
Fri Dec 9 13:03:53 CST 2005


On Fri, Dec 09, 2005 at 04:39:50AM -0500, Jeremiah Flerchinger wrote:
> Subject: [PATCH] Stubbed additional VGA register functionality:
> 
> Modified "dlls/winedos/vga.c" with additional comments on VGA registers.
> Added stubs for a large number of output registers and specific offsets.

Please do some indentation .... 

Ciao, Marcus
 
> ---
> 
> dlls/winedos/vga.c | 418 
> +++++++++++++++++++++++++++++++++++++++++++++++-----
> 1 files changed, 379 insertions(+), 39 deletions(-)
> 
> 754a4435ac517a77cc1e14ee025c26cb086ef56e
> diff --git a/dlls/winedos/vga.c b/dlls/winedos/vga.c
> index 9eb7447..cb7e866 100644
> --- a/dlls/winedos/vga.c
> +++ b/dlls/winedos/vga.c
> @@ -1,7 +1,7 @@
> /*
> * VGA hardware emulation
> *
> - * Copyright 1998 Ove K�en (with some help from Marcus Meissner)
> + * Copyright 1998 Ove K�en (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
> @@ -1079,31 +1079,382 @@ static PALETTEENTRY paldat;
> 
> void VGA_ioport_out( WORD port, BYTE val )
> {
> - switch (port) {
> - case 0x3c0:
> - if (vga_address_3c0)
> - vga_index_3c0 = val;
> - else
> - FIXME("Unsupported index, register 0x3c0: 0x%02x (value 0x%02x)\n",
> - vga_index_3c0, val);
> - vga_address_3c0 = !vga_address_3c0;
> - break;
> - case 0x3c4:
> - vga_index_3c4 = val;
> - break;
> - 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, register 0x3c4: 0x%02x (value 0x%02x)\n",
> + switch (port)
> + {
> + /*
> + * General Registers
> + */
> + case 0x3c2: /* Miscellaneous output */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7] - vertical sync polarity
> + * [6] - horizontal sync polarity
> + * [5] - page bit for odd/even mode: 0=low, 1=high (for diagnostic use)
> + * [4] - 0 (RESERVED)
> + * [2][3] - clock select bits:
> + * 00=25.175 MHz clock VGA, 14 MHz EGA
> + * 01=28.322 MHz clock VGA, 16 MHz EGA
> + * 10=external clock selected
> + * 11=reserved
> + * [1] - RAM enable/disable: 0=video RAM disabled, 1=video RAM enabled
> + * [0] - I/O address select bit: 0=0x3b? (MDA compatable), 1=0x3d? (CGA 
> compatible)
> + */
> + FIXME(":CRT_Controller_Register:Misc_output Unsupported VGA register: 
> 0x%04x (value 0x%02x)\n", port, val);
> + break;
> + case 0x3ba: /* Feature Control - MDA compatible */
> + case 0x3da: /* Feature Control - CGA compatible */
> + FIXME(":CRT_Controller_Register:Feature_Control Unsupported VGA 
> register: 0x%04x (value 0x%02x)\n", port, val);
> + break;
> + case 0x3c3: /* Video Subsystem enable */
> + FIXME(":CRT_Controller_Register:Video_Subsystem Unsupported VGA 
> register: 0x%04x (value 0x%02x)\n", port, val);
> + break;
> + /*
> + * CRT Controller Registers
> + */
> + case 0x3b4: /* Offset Value Address - MDA compatible */
> + case 0x3d4: /* Offset Value Address - CGA compatible */
> + vga_index_3d4 = val;
> + break;
> + case 0x3b5: /* CRT Controller - MDA compatible */
> + case 0x3d5: /* CRT Controller - CGA compatible */
> + switch(vga_index_3d4)
> + {
> + case 0: /* Total horizontal chars minus 5 default and minus 2 in EGA 
> compatability */
> + FIXME(":CRT_Controller_Register:Horiz_Chars Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 1: /* Horizontal display end characters minus 1 */
> + FIXME(":CRT_Controller_Register:Horiz_End Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 2: /* Start Horizontal Blanking */
> + FIXME(":CRT_Controller_Register:Horiz_Blank_Start Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 3: /* End Horizontal Blanking */
> + FIXME(":CRT_Controller_Register:Horiz_Blank_End Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 4: /* Start Horizontal retrace pulse */
> + FIXME(":CRT_Controller_Register:Horiz_Retrace_Start Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 5: /* Stop Horizontal retrace pulse */
> + FIXME(":CRT_Controller_Register:Horiz_Retrace_Stop Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 6: /* Total vertical scan lines */
> + FIXME(":CRT_Controller_Register:Vert_Lines Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 7: /* CRTC overflow */
> + FIXME(":CRT_Controller_Register:CRTC overflow Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 8: /* Preset row scan */
> + FIXME(":CRT_Controller_Register:Row_Scan Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 9: /* Maximum scan line */
> + FIXME(":CRT_Controller_Register:Max_Scan Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 10: /* Scan line for cursor start */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7] - Cursor ON/OFF Control: 1=cursor off, 0=cursor on
> + * [6][5] - Possibly 00 ?
> + * [4][3][2][1] - scan row for cursor start
> + */
> + FIXME(":CRT_Controller_Register:Cursor_Start Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 11: /* Scan line for cursor end */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7] - 0
> + * [6][5] - Cursor Skew Control: cursor is moved right 0 to 3 positions
> + * [4][3][2][1] - scan row for cursor end
> + */
> + FIXME(":CRT_Controller_Register:Cursor_End Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 12: /* Video buffer start address, high byte */
> + FIXME(":CRT_Controller_Register:Video_Buffer_High Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 13: /* Video buffer start address, low byte */
> + FIXME(":CRT_Controller_Register:Video_Buffer_Low Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 14: /* Cursor location, high-order byte of cursor address */
> + FIXME(":CRT_Controller_Register:Cursor_Pos_High Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 15: /* Cursor location, low-order byte of cursor address */
> + FIXME(":CRT_Controller_Register:Cursor_Pos_Low Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 16: /* Vertical retrace start */
> + FIXME(":CRT_Controller_Register:Vert_Retrace_Start Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 17: /* Vertical retrace end */
> + FIXME(":CRT_Controller_Register:Vert_Retrace_End Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 18: /* Last scan line of vertical display */
> + FIXME(":CRT_Controller_Register:Last_Vert_Scan Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 19: /* Additional word offset to next logical line */
> + FIXME(":CRT_Controller_Register:Next_Line_Offset Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 20: /* Scan line for underline character */
> + FIXME(":CRT_Controller_Register:Underline_Scan Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 21: /* Scan line to start vertical blanking */
> + FIXME(":CRT_Controller_Register:Vert_Blank_Scan_Start Unsupported 
> index: register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 22: /* Scan line to end vertical blanking */
> + FIXME(":CRT_Controller_Register:Vert_Blank_Scan_End Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 23: /* CRTC mode control */
> + FIXME(":CRT_Controller_Register:CRTC_Mode_Control Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + case 24: /* Line compare register */
> + FIXME(":CRT_Controller_Register:Line_Comp_Reg Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + break;
> + default:
> + FIXME(":CRT_Controller_Register Unsupported index: register 0x%04x, 
> index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3d4, val);
> + }
> + break;
> + /*
> + * Sequencer Registers
> + */
> + case 0x3c4: /* Offset Value Address */
> + vga_index_3c4 = val;
> + break;
> + case 0x3c5: /* Sequencer */
> + switch(vga_index_3c4)
> + {
> + case 0x00: /* Synchronous or Asynchronous reset */
> + FIXME(":Sequencer_Register:Reset Unsupported index: register 0x%04x, 
> index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3c4, val);
> + break;
> + case 0x01: /* Clocking Mode */
> + FIXME(":Sequencer_Register:Clocking_Mode Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3c4, val);
> + break;
> + case 0x02: /* Map Mask */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4] - 0000
> + * [3] - 1=map 3 enabled (intensity plane)
> + * [2] - 1=map 2 enabled (red plane)
> + * [1] - 1=map 1 enabled (green plane)
> + * [0] - 1=map 0 enabled (blue plane)
> + */
> + FIXME(":Sequencer_Register:Map_Mask Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3c4, val);
> + break;
> + case 0x03: /* Character Map Select */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6] - 00
> + * [5][3][2] - Map A Select: 000=map 0, 001=map 1, ... , 111=map 7
> + * [4][1][0] - Map A Select: 000=map 0, 001=map 1, ... , 111=map 7
> + */
> + FIXME(":Sequencer_Register:Map_Mask Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3c4, val);
> + break;
> + case 0x04: /* Sequencer: Memory Mode Register */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4] - 0000
> + * [3] - Access Mode Select:
> + * 1=enable bits 0 and 1 of the Char Map Select Register
> + * 0=enable sequential access of all maps (256-color modes only)
> + * [2] - Memory Addressing Mode Select:
> + * 1=sequential addressing mode
> + * 0=even addresses to maps 0 and 2
> + * odd addresses to maps 1 and 3
> + * [1] - extended memory status (always 1)
> + * [0] - 0
> + */
> + if(vga_fb_depth == 8)
> + VGA_SetWindowStart((val & 8) ? 0 : -1);
> + else
> + FIXME(":Sequencer_Register:Memory_Mode not supported in this mode.\n");
> + break;
> + default:
> + FIXME("Unsupported index, register 0x3c4: 0x%02x (value 0x%02x)\n",
> vga_index_3c4, val);
> - }
> - break;
> + }
> + break;
> + /*
> + * Graphics Controller Registers
> + */
> + case 0x3ce: /* Offset Value Address */
> + vga_index_3ce = val;
> + break;
> + case 0x3cf: /* Graphics Controller */
> + switch(vga_index_3ce)
> + {
> + case 0x00: /* Set/Reset */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4] - 0000
> + * [3] - 1=reset map 3 (intensity plane)
> + * [2] - 1=reset map 2 (red plane)
> + * [1] - 1=reset map 1 (green plane)
> + * [0] - 1=reset map 0 (blue plane)
> + */
> + FIXME(":Sequencer_Register:Set_Reset Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x01: /* Enable Set/Reset */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4] - 0000
> + * [3] - 1=enable map 3 (intensity plane)
> + * [2] - 1=enable map 2 (red plane)
> + * [1] - 1=enable map 1 (green plane)
> + * [0] - 1=enable map 0 (blue plane)
> + */
> + FIXME(":Sequencer_Register:Set_Reset_Enable Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x02: /* Color compare for read mode 1 operation */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4] - 0000
> + * [3] - 1=enable map 3 (intensity plane)
> + * [2] - 1=enable map 2 (red plane)
> + * [1] - 1=enable map 1 (green plane)
> + * [0] - 1=enable map 0 (blue plane)
> + */
> + FIXME(":Sequencer_Register:Set_Reset Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x03: /* Data rotate */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5] - 000
> + * [4][3] - Logical operation select:
> + * 00 = data unmodified
> + * 01 = data ANDed
> + * 10 = data ORed
> + * 11 = data XORed
> + * [2][1][0] - Rotate count: counter (0 to 7) of the positions to 
> rotate CPU data during memory write operations
> + */
> + FIXME(":Sequencer_Register:Data_Rotate Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x04: /* Read operation map select */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4][3][2] - 000000
> + * [1][0] - Select Map Operation
> + * 00 = select map 0
> + * 01 = select map 1
> + * 10 = select map 2
> + * 11 = select map 3
> + */
> + FIXME(":Sequencer_Register:Read_Map_Select Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x05: /* Select graphics mode */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7] - 0
> + * [6] - VGA 256-color mode select: 1 = enable 256-color mode, 0 = bit 
> 5 controls loading of shift register
> + * [5] - Shift Mode Selector: 1 = shift mode for mode 4 & 5 (CGA 
> compatible), 0 = normal shift mode
> + * [4] - Select odd/even mode: 1 = odd/even mode (CGA compatible), 0 = 
> normal mode
> + * [3] - Read type: 0 = read data from Read Map Select Reg, 1 = compare 
> results w/maps in Color Compare Reg
> + * [2] - 0
> + * [1][0] - Write Mode Select:
> + * 00 = select write mode 0
> + * 01 = select write mode 1
> + * 10 = select write mode 2
> + * 11 = select write mode 3
> + */
> + FIXME(":Sequencer_Register:Graphics_Mode Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x06: /* Miscellaneous operations - usually controlled by BIOS 
> mode change */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4] - 0000
> + * [3]2] - Memory Map Select
> + * 00 = 128K bytes at 0xa0000 (VGA_WINDOW_START)
> + * 01 = 64K bytes at 0xa0000
> + * 10 = 32K bytes at 0xb0000
> + * 11 = 32K bytes at 0xb8000 (VGA_AlphaBuffer)
> + * [1] - Odd/Even chaining mode select
> + * 1 = chain odd maps after even maps
> + * 0 = normal map chaining
> + * [0] - 1=don't compare map 0 (blue plane)
> + */
> + FIXME(":Sequencer_Register:Misc_Ops Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x07: /* Read mode 1 color don't care */
> + /*
> + * [7][6][5][4][3][2][1][0]
> + *
> + * [7][6][5][4] - 0000
> + * [3] - 1=don't compare map 3 (intensity plane)
> + * [2] - 1=don't compare map 2 (red plane)
> + * [1] - 1=don't compare map 1 (green plane)
> + * [0] - 1=don't compare map 0 (blue plane)
> + */
> + FIXME(":Sequencer_Register:Mode1_Color_NoCare Unsupported index: 
> register 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + case 0x08: /* Bit mask */
> + FIXME(":Sequencer_Register:Bit_Mask Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + break;
> + default:
> + FIXME(":Graphics_Controller_Register Unsupported index: register 
> 0x%04x, index 0x%02x (value 0x%02x)\n",
> + port, vga_index_3ce, val);
> + }
> + break;
> + /*
> + * Attribute Controller Registers
> + */
> + case 0x3c0:
> + if (vga_address_3c0)
> + vga_index_3c0 = val;
> + else
> + FIXME("Unsupported index, register 0x3c0: 0x%02x (value 0x%02x)\n",
> + vga_index_3c0, val);
> + vga_address_3c0 = !vga_address_3c0;
> + break;
> + /*
> + * Additional Palette Registers?
> + */
> case 0x3c8:
> palreg=val; palcnt=0; break;
> case 0x3c9:
> @@ -1113,20 +1464,9 @@ void VGA_ioport_out( WORD port, BYTE val
> palcnt=0;
> }
> break;
> - case 0x3ce:
> - vga_index_3ce = val;
> - break;
> - case 0x3cf:
> - FIXME("Unsupported index, register 0x3ce: 0x%02x (value 0x%02x)\n",
> - vga_index_3ce, val);
> - break;
> - case 0x3d4:
> - vga_index_3d4 = val;
> - break;
> - case 0x3d5:
> - FIXME("Unsupported index, register 0x3d4: 0x%02x (value 0x%02x)\n",
> - vga_index_3d4, val);
> - break;
> + /*
> + * Other Unsupported Registers
> + */
> default:
> FIXME("Unsupported VGA register: 0x%04x (value 0x%02x)\n", port, val);
> }
> -- 
> 0.99.9l
> 
> 
> 
> 



More information about the wine-devel mailing list