Last DOS text mode patch

Jukka Heinonen jhei at iki.fi
Wed Apr 10 12:22:36 CDT 2002


After this patch, DOS Nethack erases screen properly.
As far as I can see, Nethack output is next to perfect
(default text color might still be wrong). Also,
this patch removes the last CONSOLE_ calls from 
DOSVM and Wine. And after this patch, I can let
DOSVM rest in peace (as far as I am concerned),
since I was starting to get bored with DOS stuff. 

Changelog:
  Removed obsolete text mode color and attribute code.
  Made routines for text mode scolling, clearing and getting 
  character at cursor use Windows console and VGA buffer.

Note:
  If this patch is accepted, directory "wine/console" becomes
  obsolete because no Wine source file references functions
  defined under that directory (this should be verified, though).  
  This directory should probably be removed from Wine.
 

Index: int10.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int10.c,v
retrieving revision 1.5
diff -u -r1.5 int10.c
--- int10.c     8 Apr 2002 20:11:28 -0000       1.5
+++ int10.c     10 Apr 2002 16:56:29 -0000
@@ -31,13 +31,9 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(int);
 
-static void conv_text_mode_attributes(char attribute, int *fg, int *bg,
-       int *wattribute);
 static void scroll_window(int direction, char lines, char row1, 
    char col1, char row2, char col2, char attribute);
 
-static int color_palette[16];
-
 #define SCROLL_UP 1
 #define SCROLL_DOWN 2
 
@@ -90,46 +86,8 @@
 
 void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
 {
-    static int registered_colors = FALSE;
     BIOSDATA *data = DOSMEM_BiosData();
 
-    if (!registered_colors)
-    {
-        /* Colors:
-             0000b   black          1000b   dark gray
-             0001b   blue           1001b   light blue
-             0010b   green          1010b   light green
-             0011b   cyan           1011b   light cyan
-             0100b   red            1100b   light red
-             0101b   magenta        1101b   light magenta
-             0110b   brown          1110b   yellow
-             0111b   light gray     1111b   white
-        */
-        
-        /* These AllocColor calls have the side-effect of triggering 
-           terminal initialization as xx_Init() is no longer called on
-           startup. Which is what we want anyway. */
-
-        color_palette[0]  = CONSOLE_AllocColor(WINE_BLACK);
-        color_palette[1]  = CONSOLE_AllocColor(WINE_BLUE);
-        color_palette[2]  = CONSOLE_AllocColor(WINE_GREEN);
-        color_palette[3]  = CONSOLE_AllocColor(WINE_CYAN);
-        color_palette[4]  = CONSOLE_AllocColor(WINE_RED);
-        color_palette[5]  = CONSOLE_AllocColor(WINE_MAGENTA);
-        color_palette[6]  = CONSOLE_AllocColor(WINE_BROWN);
-        color_palette[7]  = CONSOLE_AllocColor(WINE_LIGHT_GRAY);
-        color_palette[8]  = CONSOLE_AllocColor(WINE_DARK_GRAY);
-        color_palette[9]  = CONSOLE_AllocColor(WINE_LIGHT_BLUE);
-        color_palette[10] = CONSOLE_AllocColor(WINE_LIGHT_GREEN);
-        color_palette[11] = CONSOLE_AllocColor(WINE_LIGHT_CYAN);
-        color_palette[12] = CONSOLE_AllocColor(WINE_LIGHT_RED);
-        color_palette[13] = CONSOLE_AllocColor(WINE_LIGHT_MAGENTA);
-        color_palette[14] = CONSOLE_AllocColor(WINE_YELLOW);
-        color_palette[15] = CONSOLE_AllocColor(WINE_WHITE);
-
-        registered_colors = TRUE;
-    }
-
     if(AL_reg(context) == 0x4F) { /* VESA functions */
        switch(AH_reg(context)) {
 
@@ -463,9 +421,6 @@
 
     case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
         {
-            /* Note here that color data returned is bogus, will fix later. */
-            char ch;
-            int bg, fg, attr;
             if (BH_reg(context)) /* Write to different page */
             {
                 FIXME("Read character and attribute at cursor position -"
@@ -474,12 +429,9 @@
                 AH_reg(context) = 7;
             }
             else
-            {
-                TRACE(
-                      "Read Character and Attribute at Cursor Position\n");
-                CONSOLE_GetCharacterAtCursor(&ch, &fg, &bg, &attr);
-                AL_reg(context) = ch;
-                AH_reg(context) = 7;   /* FIXME: We're assuming wh on bl */ 
+           {
+                TRACE("Read Character and Attribute at Cursor Position\n");
+                VGA_GetCharacterAtCursor(&AL_reg(context), &AH_reg(context));
             }
         }
         break;
@@ -522,10 +474,8 @@
                apparantly, the foreground or attribute of the background
                with this call, so we should check first to see what the
                foreground already is... FIXME */
-            TRACE("Set Background/Border Color: %d\n", 
+            FIXME("Set Background/Border Color: %d\n", 
                BL_reg(context));
-            CONSOLE_SetBackgroundColor(color_palette[0],
-               color_palette[BL_reg(context)]);   
             break;
         case 0x01: /* SET PALETTE */
             FIXME("Set Palette - Not Supported\n");
@@ -787,43 +737,20 @@
     }
 }
 
-static void conv_text_mode_attributes(char attribute, int *fg, int *bg,
-   int *wattribute)
-{
-    /* This is a local function to convert the text-mode attributes
-       to Wine's color and attribute scheme */
-
-    /* Foreground Color is stored in bits 3 through 0 */
-    /* Background Color is stored in bits 6 through 4 */
-    /* If this has bit 7 set, then we need to blink */
-
-    *fg = color_palette[attribute & 15];
-    *bg = color_palette[(attribute & 112) / 16];
-    *wattribute = attribute & 128;
-
-}
-
 static void scroll_window(int direction, char lines, char row1, 
    char col1, char row2, char col2, char attribute)
 {
-   int wattribute, bg_color, fg_color;
-
-   conv_text_mode_attributes(attribute, &fg_color, &bg_color,
-      &wattribute);
-
    if (!lines) /* Actually, clear the window */
    {
-      CONSOLE_ClearWindow(row1, col1, row2, col2, bg_color, wattribute);
+       VGA_ClearText(row1, col1, row2, col2, attribute);
    }
    else if (direction == SCROLL_UP)
    {
-      CONSOLE_ScrollUpWindow(row1, col1, row2, col2, lines, bg_color,
-         wattribute);
+       VGA_ScrollUpText(row1, col1, row2, col2, lines, attribute);
    }
    else
    {
-      CONSOLE_ScrollDownWindow(row1, col1, row2, col2, lines, bg_color,
-         wattribute);
+       VGA_ScrollDownText(row1, col1, row2, col2, lines, attribute);
    }
 }
    



Index: vga.h
===================================================================
RCS file: /home/wine/wine/dlls/winedos/vga.h,v
retrieving revision 1.5
diff -u -r1.5 vga.h
--- vga.h       8 Apr 2002 20:11:28 -0000       1.5
+++ vga.h       10 Apr 2002 17:03:06 -0000
@@ -42,6 +42,16 @@
 void VGA_WriteChars(unsigned X,unsigned Y,unsigned ch,int attr,int count);
 void VGA_PutChar(BYTE ascii);
 void VGA_SetTextAttribute(BYTE attr);
+void VGA_ClearText(unsigned row1, unsigned col1, 
+                  unsigned row2, unsigned col2,
+                  BYTE attr);
+void VGA_ScrollUpText(unsigned row1, unsigned col1, 
+                     unsigned row2, unsigned col2,
+                     unsigned lines, BYTE attr);
+void VGA_ScrollDownText(unsigned row1, unsigned col1, 
+                       unsigned row2, unsigned col2,
+                       unsigned lines, BYTE attr);
+void VGA_GetCharacterAtCursor(BYTE *ascii, BYTE *attr);
 
 /* control */
 void VGA_ioport_out(WORD port, BYTE val);




Index: vga.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/vga.c,v
retrieving revision 1.7
diff -u -r1.7 vga.c
--- vga.c       8 Apr 2002 20:11:28 -0000       1.7
+++ vga.c       10 Apr 2002 17:03:19 -0000
@@ -552,6 +552,62 @@
     SetConsoleTextAttribute(VGA_AlphaConsole(), attr);
 }
 
+void VGA_ClearText(unsigned row1, unsigned col1, 
+                  unsigned row2, unsigned col2,
+                  BYTE attr)
+{
+    unsigned width, height, x, y;
+    COORD off;
+    char *dat = VGA_AlphaBuffer();
+    HANDLE con = VGA_AlphaConsole();
+    VGA_GetAlphaMode(&width, &height);
+
+    EnterCriticalSection(&vga_lock); 
+
+    for(y=row1; y<=row2; y++) {
+        off.X = col1;
+       off.Y = y;
+       FillConsoleOutputCharacterA(con, ' ', col2-col1+1, off, NULL);
+       FillConsoleOutputAttribute(con, attr, col2-col1+1, off, NULL);
+
+       for(x=col1; x<=col2; x++) {
+           char *ptr = dat + ((width*y + x) * 2);
+           ptr[0] = ' ';
+           ptr[1] = attr;
+       }
+    }
+
+    LeaveCriticalSection(&vga_lock);
+}
+
+void VGA_ScrollUpText(unsigned row1, unsigned col1, 
+                     unsigned row2, unsigned col2,
+                     unsigned lines, BYTE attr)
+{
+    FIXME("not implemented\n");
+}
+
+void VGA_ScrollDownText(unsigned row1, unsigned col1, 
+                       unsigned row2, unsigned col2,
+                       unsigned lines, BYTE attr)
+{
+    FIXME("not implemented\n");
+}
+
+void VGA_GetCharacterAtCursor(BYTE *ascii, BYTE *attr)
+{
+    unsigned width, height, x, y;
+    char *dat;
+
+    VGA_GetAlphaMode(&width, &height);
+    VGA_GetCursorPos(&x, &y);
+    dat = VGA_AlphaBuffer() + ((width*y + x) * 2);
+
+    *ascii = dat[0];
+    *attr = dat[1];
+}
+
+
 /*** CONTROL ***/
 
 static void VGA_Poll_Graphics(void)




-- 
Jukka Heinonen <http://www.iki.fi/jhei/>



More information about the wine-patches mailing list