Hi all, I was completely and utterly flabbergasted when I found out that IDA DOS version is working (almost) beautifully on wineconsole ! Thus I decided to implement a missing set cursor shape functionality right away. BTW, "almost" meaning that the display is perfect (see http://home.arcor.de/wineshots/ida.png), but it is still very SLOOOW. I guess now there's some real incentive to improve something... -- Andreas Mohr Stauferstr. 6, D-71272 Renningen, Germany
Determining best CVS host... Using CVSROOT :pserver:cvs@rhlx01.fht-esslingen.de:/home/wine Index: dlls/winedos/int10.c =================================================================== RCS file: /home/wine/wine/dlls/winedos/int10.c,v retrieving revision 1.13 diff -u -r1.13 int10.c --- dlls/winedos/int10.c 31 May 2002 23:40:54 -0000 1.13 +++ dlls/winedos/int10.c 29 Jun 2002 22:38:22 -0000 @@ -36,11 +36,10 @@ #define SCROLL_UP 1 #define SCROLL_DOWN 2 -/* FIXME: is row or column first? */ static void BIOS_GetCursorPos(BIOSDATA*data,unsigned page,unsigned*X,unsigned*Y) { - *X = data->VideoCursorPos[page*2]; - *Y = data->VideoCursorPos[page*2+1]; + *X = data->VideoCursorPos[page*2]; /* column */ + *Y = data->VideoCursorPos[page*2+1]; /* row */ } static void BIOS_SetCursorPos(BIOSDATA*data,unsigned page,unsigned X,unsigned Y) @@ -365,7 +364,9 @@ break; case 0x01: /* SET CURSOR SHAPE */ - FIXME("Set Cursor Shape - Not Supported\n"); + TRACE("Set Cursor Shape start %d end %d options %d\n", CH_reg(context) & 0x1f, CL_reg(context) & 0x1f, CH_reg(context) & 0xe0); + data->VideoCursorType = CX_reg(context); /* direct copy */ + VGA_SetCursorShape(CH_reg(context), CL_reg(context)); break; case 0x02: /* SET CURSOR POSITION */ Index: dlls/winedos/vga.c =================================================================== RCS file: /home/wine/wine/dlls/winedos/vga.c,v retrieving revision 1.14 diff -u -r1.14 vga.c --- dlls/winedos/vga.c 24 Jun 2002 22:57:28 -0000 1.14 +++ dlls/winedos/vga.c 29 Jun 2002 22:38:22 -0000 @@ -473,6 +473,21 @@ if (Yres) *Yres=info.dwSize.Y; } +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) { COORD pos; Index: dlls/winedos/vga.h =================================================================== RCS file: /home/wine/wine/dlls/winedos/vga.h,v retrieving revision 1.8 diff -u -r1.8 vga.h --- dlls/winedos/vga.h 31 May 2002 23:40:54 -0000 1.8 +++ dlls/winedos/vga.h 29 Jun 2002 22:38:22 -0000 @@ -40,6 +40,7 @@ /* text mode */ int VGA_SetAlphaMode(unsigned Xres,unsigned Yres); void VGA_GetAlphaMode(unsigned*Xres,unsigned*Yres); +void VGA_SetCursorShape(unsigned char start_options,unsigned char end); void VGA_SetCursorPos(unsigned X,unsigned Y); void VGA_GetCursorPos(unsigned*X,unsigned*Y); void VGA_WriteChars(unsigned X,unsigned Y,unsigned ch,int attr,int count); Index: include/miscemu.h =================================================================== RCS file: /home/wine/wine/include/miscemu.h,v retrieving revision 1.48 diff -u -r1.48 miscemu.h --- include/miscemu.h 31 May 2002 23:06:48 -0000 1.48 +++ include/miscemu.h 29 Jun 2002 22:38:22 -0000 @@ -60,7 +60,7 @@ WORD VideoColumns; /* 4a: Number of columns */ WORD VideoPageSize; /* 4c: Video page size in bytes */ WORD VideoPageStartAddr; /* 4e: Video page start address */ - BYTE VideoCursorPos[16]; /* 50: Cursor position for 8 pages */ + BYTE VideoCursorPos[16]; /* 50: Cursor position for 8 pages, column/row order */ WORD VideoCursorType; /* 60: Video cursor type */ BYTE VideoCurPage; /* 62: Video current page */ WORD VideoCtrlAddr WINE_PACKED; /* 63: Video controller address */