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