Commit f83cf69b authored by Andreas Mohr's avatar Andreas Mohr Committed by Alexandre Julliard

Implemented mode setting things as well as VESA additions and other

things. Cleaned up DOSMEM_BiosData handling.
parent d58f61c0
...@@ -14,8 +14,70 @@ ...@@ -14,8 +14,70 @@
extern int DOSCONF_ReadConfig(void); extern int DOSCONF_ReadConfig(void);
/* msdos/dosmem.c */ /* msdos/dosmem.c */
#pragma pack(1)
typedef struct
{
WORD Com1Addr; /* 00: COM1 I/O address */
WORD Com2Addr; /* 02: COM2 I/O address */
WORD Com3Addr; /* 04: COM3 I/O address */
WORD Com4Addr; /* 06: COM4 I/O address */
WORD Lpt1Addr; /* 08: LPT1 I/O address */
WORD Lpt2Addr; /* 0a: LPT2 I/O address */
WORD Lpt3Addr; /* 0c: LPT3 I/O address */
WORD Lpt4Addr; /* 0e: LPT4 I/O address */
WORD InstalledHardware; /* 10: Installed hardware flags */
BYTE POSTstatus; /* 12: Power-On Self Test status */
WORD MemSize WINE_PACKED; /* 13: Base memory size in Kb */
WORD unused1 WINE_PACKED; /* 15: Manufacturing test scratch pad */
BYTE KbdFlags1; /* 17: Keyboard flags 1 */
BYTE KbdFlags2; /* 18: Keyboard flags 2 */
BYTE unused2; /* 19: Keyboard driver workspace */
WORD NextKbdCharPtr; /* 1a: Next character in kbd buffer */
WORD FirstKbdCharPtr; /* 1c: First character in kbd buffer */
WORD KbdBuffer[16]; /* 1e: Keyboard buffer */
BYTE DisketteStatus1; /* 3e: Diskette recalibrate status */
BYTE DisketteStatus2; /* 3f: Diskette motor status */
BYTE DisketteStatus3; /* 40: Diskette motor timeout */
BYTE DisketteStatus4; /* 41: Diskette last operation status */
BYTE DiskStatus[7]; /* 42: Disk status/command bytes */
BYTE VideoMode; /* 49: Video mode */
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 */
WORD VideoCursorType; /* 60: Video cursor type */
BYTE VideoCurPage; /* 62: Video current page */
WORD VideoCtrlAddr WINE_PACKED; /* 63: Video controller address */
BYTE VideoReg1; /* 65: Video mode select register */
BYTE VideoReg2; /* 66: Video CGA palette register */
DWORD ResetEntry WINE_PACKED; /* 67: Warm reset entry point */
BYTE LastIRQ; /* 6b: Last unexpected interrupt */
DWORD Ticks; /* 6c: Ticks since midnight */
BYTE TicksOverflow; /* 70: Timer overflow if past midnight */
BYTE CtrlBreakFlag; /* 71: Ctrl-Break flag */
WORD ResetFlag; /* 72: POST Reset flag */
BYTE DiskOpStatus; /* 74: Last hard-disk operation status */
BYTE NbHardDisks; /* 75: Number of hard disks */
BYTE DiskCtrlByte; /* 76: Disk control byte */
BYTE DiskIOPort; /* 77: Disk I/O port offset */
BYTE LptTimeout[4]; /* 78: Timeouts for parallel ports */
BYTE ComTimeout[4]; /* 7c: Timeouts for serial ports */
WORD KbdBufferStart; /* 80: Keyboard buffer start */
WORD KbdBufferEnd; /* 82: Keyboard buffer end */
BYTE RowsOnScreenMinus1; /* 84: EGA only */
WORD BytesPerChar WINE_PACKED; /* 85: EGA only */
BYTE ModeOptions; /* 87: EGA only */
BYTE FeatureBitsSwitches; /* 88: EGA only */
BYTE VGASettings; /* 89: VGA misc settings */
BYTE DisplayCombination; /* 8A: VGA display combinations */
BYTE DiskDataRate; /* 8B: Last disk data rate selected */
} BIOSDATA;
extern HANDLE16 DOSMEM_BiosDataSeg; extern HANDLE16 DOSMEM_BiosDataSeg;
extern HANDLE16 DOSMEM_BiosSysSeg; extern HANDLE16 DOSMEM_BiosSysSeg;
extern BIOSDATA * DOSMEM_BiosData();
extern BYTE * DOSMEM_BiosSys();
extern DWORD DOSMEM_CollateTable; extern DWORD DOSMEM_CollateTable;
......
...@@ -21,69 +21,8 @@ ...@@ -21,69 +21,8 @@
HANDLE16 DOSMEM_BiosDataSeg; /* BIOS data segment at 0x40:0 */ HANDLE16 DOSMEM_BiosDataSeg; /* BIOS data segment at 0x40:0 */
HANDLE16 DOSMEM_BiosSysSeg; /* BIOS ROM segment at 0xf000:0 */ HANDLE16 DOSMEM_BiosSysSeg; /* BIOS ROM segment at 0xf000:0 */
#pragma pack(1)
typedef struct
{
WORD Com1Addr; /* 00: COM1 I/O address */
WORD Com2Addr; /* 02: COM2 I/O address */
WORD Com3Addr; /* 04: COM3 I/O address */
WORD Com4Addr; /* 06: COM4 I/O address */
WORD Lpt1Addr; /* 08: LPT1 I/O address */
WORD Lpt2Addr; /* 0a: LPT2 I/O address */
WORD Lpt3Addr; /* 0c: LPT3 I/O address */
WORD Lpt4Addr; /* 0e: LPT4 I/O address */
WORD InstalledHardware; /* 10: Installed hardware flags */
BYTE POSTstatus; /* 12: Power-On Self Test status */
WORD MemSize WINE_PACKED; /* 13: Base memory size in Kb */
WORD unused1 WINE_PACKED; /* 15: Manufacturing test scratch pad */
BYTE KbdFlags1; /* 17: Keyboard flags 1 */
BYTE KbdFlags2; /* 18: Keyboard flags 2 */
BYTE unused2; /* 19: Keyboard driver workspace */
WORD NextKbdCharPtr; /* 1a: Next character in kbd buffer */
WORD FirstKbdCharPtr; /* 1c: First character in kbd buffer */
WORD KbdBuffer[16]; /* 1e: Keyboard buffer */
BYTE DisketteStatus1; /* 3e: Diskette recalibrate status */
BYTE DisketteStatus2; /* 3f: Diskette motor status */
BYTE DisketteStatus3; /* 40: Diskette motor timeout */
BYTE DisketteStatus4; /* 41: Diskette last operation status */
BYTE DiskStatus[7]; /* 42: Disk status/command bytes */
BYTE VideoMode; /* 49: Video mode */
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 */
WORD VideoCursorType; /* 60: Video cursor type */
BYTE VideoCurPage; /* 62: Video current page */
WORD VideoCtrlAddr WINE_PACKED; /* 63: Video controller address */
BYTE VideoReg1; /* 65: Video mode select register */
BYTE VideoReg2; /* 66: Video CGA palette register */
DWORD ResetEntry WINE_PACKED; /* 67: Warm reset entry point */
BYTE LastIRQ; /* 6b: Last unexpected interrupt */
DWORD Ticks; /* 6c: Ticks since midnight */
BYTE TicksOverflow; /* 70: Timer overflow if past midnight */
BYTE CtrlBreakFlag; /* 71: Ctrl-Break flag */
WORD ResetFlag; /* 72: POST Reset flag */
BYTE DiskOpStatus; /* 74: Last hard-disk operation status */
BYTE NbHardDisks; /* 75: Number of hard disks */
BYTE DiskCtrlByte; /* 76: Disk control byte */
BYTE DiskIOPort; /* 77: Disk I/O port offset */
BYTE LptTimeout[4]; /* 78: Timeouts for parallel ports */
BYTE ComTimeout[4]; /* 7c: Timeouts for serial ports */
WORD KbdBufferStart; /* 80: Keyboard buffer start */
WORD KbdBufferEnd; /* 82: Keyboard buffer end */
BYTE RowsOnScreenMinus1; /* 84: EGA only */
WORD BytesPerChar; /* 85: EGA only */
BYTE ModeOptions; /* 87: EGA only */
BYTE FeatureBitsSwitches; /* 88: EGA only */
BYTE unknown; /* 89: ??? */
BYTE DisplayCombination; /* 8A: VGA display combinations */
BYTE DiskDataRate; /* 8B: Last disk data rate selected */
} BIOSDATA;
#pragma pack(4) #pragma pack(4)
static BIOSDATA *pBiosData = NULL;
static char *DOSMEM_dosmem; static char *DOSMEM_dosmem;
DWORD DOSMEM_CollateTable; DWORD DOSMEM_CollateTable;
...@@ -206,6 +145,16 @@ static void DOSMEM_InitDPMI(void) ...@@ -206,6 +145,16 @@ static void DOSMEM_InitDPMI(void)
memcpy(wrapper, wrap_code, sizeof(wrap_code)); memcpy(wrapper, wrap_code, sizeof(wrap_code));
} }
BIOSDATA * DOSMEM_BiosData()
{
return (BIOSDATA *)DOSMEM_MemoryBase(0)+0x400;
}
BYTE * DOSMEM_BiosSys()
{
return DOSMEM_MemoryBase(0)+0xf0000;
}
/*********************************************************************** /***********************************************************************
* DOSMEM_FillBiosSegments * DOSMEM_FillBiosSegments
* *
...@@ -215,8 +164,13 @@ static void DOSMEM_FillBiosSegments(void) ...@@ -215,8 +164,13 @@ static void DOSMEM_FillBiosSegments(void)
{ {
BYTE *pBiosSys = (BYTE *)GlobalLock16( DOSMEM_BiosSysSeg ); BYTE *pBiosSys = (BYTE *)GlobalLock16( DOSMEM_BiosSysSeg );
BYTE *pBiosROMTable = pBiosSys+0xe6f5; BYTE *pBiosROMTable = pBiosSys+0xe6f5;
BIOSDATA *pBiosData = (BIOSDATA *)GlobalLock16( DOSMEM_BiosDataSeg );
pBiosData = (BIOSDATA *)GlobalLock16( DOSMEM_BiosDataSeg ); /* bogus 0xe0xx addresses !! Adapt int 0x10/0x1b if change needed */
BYTE *pVideoStaticFuncTable = pBiosSys+0xe000;
BYTE *pVideoStateInfo = pBiosSys+0xe010;
BYTE *p;
int i;
/* Clear all unused values */ /* Clear all unused values */
memset( pBiosData, 0, sizeof(*pBiosData) ); memset( pBiosData, 0, sizeof(*pBiosData) );
...@@ -244,7 +198,7 @@ static void DOSMEM_FillBiosSegments(void) ...@@ -244,7 +198,7 @@ static void DOSMEM_FillBiosSegments(void)
pBiosData->BytesPerChar = 0x10; pBiosData->BytesPerChar = 0x10;
pBiosData->ModeOptions = 0x64; pBiosData->ModeOptions = 0x64;
pBiosData->FeatureBitsSwitches = 0xf9; pBiosData->FeatureBitsSwitches = 0xf9;
pBiosData->unknown = 0x51; pBiosData->VGASettings = 0x51;
pBiosData->DisplayCombination = 0x08; pBiosData->DisplayCombination = 0x08;
pBiosData->DiskDataRate = 0; pBiosData->DiskDataRate = 0;
...@@ -259,6 +213,60 @@ static void DOSMEM_FillBiosSegments(void) ...@@ -259,6 +213,60 @@ static void DOSMEM_FillBiosSegments(void)
*(pBiosROMTable+0x8) = 0x00; /* feature byte 4 */ *(pBiosROMTable+0x8) = 0x00; /* feature byte 4 */
*(pBiosROMTable+0x9) = 0x00; /* feature byte 5 */ *(pBiosROMTable+0x9) = 0x00; /* feature byte 5 */
p = pVideoStaticFuncTable;
for (i=0; i < 7; i++)
*(p+i) = 0xff; /* modes supported 1 to 7 */
*(p+0x7) = 7; /* scan lines supported */
*(p+0x8) = 0; /* tot nr of char blocks in text mode */
*(p+0x9) = 0; /* max nr of active char blocks in text */
*(WORD *)(p+0xa) = 0x8ff; /* misc support flags */
*(WORD *)(p+0xc) = 0; /* reserved */
*(p+0xe) = 0x3f; /* save pointer function flags */
*(p+0xf) = 0; /* reserved */
p = pVideoStateInfo;
*(DWORD *)p = 0xf000e000; /* address of pVideoStaticFuncTable, FIXME: always real mode ? */
*(p+0x04) = /* current video mode, needs updates ! */
pBiosData->VideoMode;
*(WORD *)(p+0x05) = /* number of columns, needs updates ! */
pBiosData->VideoColumns;
*(WORD *)(p+0x07) = 0; /* length of regen (???) buffer in bytes */
*(WORD *)(p+0x09) = 0; /* starting address of regen (?) buffer */
*(WORD *)(p+0x0b) = 0; /* cursorpos page 0 */
*(WORD *)(p+0x0d) = 0; /* cursorpos page 1 */
*(WORD *)(p+0x0f) = 0; /* page 2 */
*(WORD *)(p+0x11) = 0; /* page 3 */
*(WORD *)(p+0x13) = 0; /* page 4 */
*(WORD *)(p+0x15) = 0; /* page 5 */
*(WORD *)(p+0x17) = 0; /* page 6 */
*(WORD *)(p+0x19) = 0; /* page 7 */
*(WORD *)(p+0x1b) = 0x0a0b; /* cursor size (start/end line) */
*(p+0x1d) = 0; /* active display page */
*(WORD *)(p+0x1e) = 0x3da; /* CRTC port address */
*(p+0x20) = 0x0; /* current setting of port 0x3x8 */
*(p+0x21) = 0x0; /* current setting of port 0x3x9 */
*(p+0x22) = 23; /* number of rows - 1 */
*(WORD *)(p+0x23) = 0x10; /* bytes/character */
*(p+0x25) = /* comb. of active display */
pBiosData->DisplayCombination;
*(p+0x26) = 0; /* DCC (???) of alternate display */
*(WORD *)(p+0x27) = 16; /* number of colors in current mode */
*(p+0x29) = 1; /* number of pages in current mode */
*(p+0x2a) = 3; /* number of scan lines active */
/* (0,1,2,3) = (200,350,400,480) */
*(p+0x2b) = 0; /* primary character block (?) */
*(p+0x2c) = 0; /* secondary character block (?) */
*(p+0x2d) = /* miscellaneous flags */
(pBiosData->VGASettings & 0x0f)
| ((pBiosData->ModeOptions & 1) << 4); /* cursor emulation */
*(p+0x2e) = 0; /* non-VGA mode support */
*(WORD *)(p+0x2f) = 0; /* reserved */
*(p+0x31) = /* video memory available */
(pBiosData->ModeOptions & 0x60 >> 5);
*(p+0x32) = 0; /* save pointer state flags */
*(p+0x33) = 4; /* display info and status */
/* BIOS date string */ /* BIOS date string */
strcpy((char *)pBiosSys+0xfff5, "13/01/99"); strcpy((char *)pBiosSys+0xfff5, "13/01/99");
...@@ -420,6 +428,7 @@ BOOL DOSMEM_Init(HMODULE16 hModule) ...@@ -420,6 +428,7 @@ BOOL DOSMEM_Init(HMODULE16 hModule)
*/ */
void DOSMEM_Tick( WORD timer ) void DOSMEM_Tick( WORD timer )
{ {
BIOSDATA *pBiosData = DOSMEM_BiosData();
if (pBiosData) pBiosData->Ticks++; if (pBiosData) pBiosData->Ticks++;
} }
......
...@@ -15,7 +15,7 @@ static void write_char_attribute_at_cursor(char output, char page_num, ...@@ -15,7 +15,7 @@ static void write_char_attribute_at_cursor(char output, char page_num,
static void scroll_window(int direction, char lines, char row1, static void scroll_window(int direction, char lines, char row1,
char col1, char row2, char col2, char attribute); char col1, char row2, char col2, char attribute);
static int color_pallet[16]; static int color_palette[16];
#define SCROLL_UP 1 #define SCROLL_UP 1
#define SCROLL_DOWN 2 #define SCROLL_DOWN 2
...@@ -56,8 +56,6 @@ static int color_pallet[16]; ...@@ -56,8 +56,6 @@ static int color_pallet[16];
void WINAPI INT_Int10Handler( CONTEXT *context ) void WINAPI INT_Int10Handler( CONTEXT *context )
{ {
static int registered_colors = FALSE; static int registered_colors = FALSE;
static int video_mode = 7;
static int video_columns = 80;
if (!registered_colors) if (!registered_colors)
{ {
...@@ -76,22 +74,22 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -76,22 +74,22 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
ternimal initialization as xx_Init() is no longer called on ternimal initialization as xx_Init() is no longer called on
startup. Which is what we want anyway. */ startup. Which is what we want anyway. */
color_pallet[0] = CONSOLE_AllocColor(WINE_BLACK); color_palette[0] = CONSOLE_AllocColor(WINE_BLACK);
color_pallet[1] = CONSOLE_AllocColor(WINE_BLUE); color_palette[1] = CONSOLE_AllocColor(WINE_BLUE);
color_pallet[2] = CONSOLE_AllocColor(WINE_GREEN); color_palette[2] = CONSOLE_AllocColor(WINE_GREEN);
color_pallet[3] = CONSOLE_AllocColor(WINE_CYAN); color_palette[3] = CONSOLE_AllocColor(WINE_CYAN);
color_pallet[4] = CONSOLE_AllocColor(WINE_RED); color_palette[4] = CONSOLE_AllocColor(WINE_RED);
color_pallet[5] = CONSOLE_AllocColor(WINE_MAGENTA); color_palette[5] = CONSOLE_AllocColor(WINE_MAGENTA);
color_pallet[6] = CONSOLE_AllocColor(WINE_BROWN); color_palette[6] = CONSOLE_AllocColor(WINE_BROWN);
color_pallet[7] = CONSOLE_AllocColor(WINE_LIGHT_GRAY); color_palette[7] = CONSOLE_AllocColor(WINE_LIGHT_GRAY);
color_pallet[8] = CONSOLE_AllocColor(WINE_DARK_GRAY); color_palette[8] = CONSOLE_AllocColor(WINE_DARK_GRAY);
color_pallet[9] = CONSOLE_AllocColor(WINE_LIGHT_BLUE); color_palette[9] = CONSOLE_AllocColor(WINE_LIGHT_BLUE);
color_pallet[10] = CONSOLE_AllocColor(WINE_LIGHT_GREEN); color_palette[10] = CONSOLE_AllocColor(WINE_LIGHT_GREEN);
color_pallet[11] = CONSOLE_AllocColor(WINE_LIGHT_CYAN); color_palette[11] = CONSOLE_AllocColor(WINE_LIGHT_CYAN);
color_pallet[12] = CONSOLE_AllocColor(WINE_LIGHT_RED); color_palette[12] = CONSOLE_AllocColor(WINE_LIGHT_RED);
color_pallet[13] = CONSOLE_AllocColor(WINE_LIGHT_MAGENTA); color_palette[13] = CONSOLE_AllocColor(WINE_LIGHT_MAGENTA);
color_pallet[14] = CONSOLE_AllocColor(WINE_YELLOW); color_palette[14] = CONSOLE_AllocColor(WINE_YELLOW);
color_pallet[15] = CONSOLE_AllocColor(WINE_WHITE); color_palette[15] = CONSOLE_AllocColor(WINE_WHITE);
registered_colors = TRUE; registered_colors = TRUE;
} }
...@@ -119,7 +117,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -119,7 +117,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
BX_reg(context)); BX_reg(context));
CONSOLE_ResizeScreen(40, 25); CONSOLE_ResizeScreen(40, 25);
CONSOLE_ClearScreen(); CONSOLE_ClearScreen();
video_columns = 40; DOSMEM_BiosData()->VideoColumns = 40;
break; break;
case 0x02: case 0x02:
case 0x03: case 0x03:
...@@ -129,7 +127,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -129,7 +127,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
BX_reg(context)); BX_reg(context));
CONSOLE_ResizeScreen(80, 25); CONSOLE_ResizeScreen(80, 25);
CONSOLE_ClearScreen(); CONSOLE_ClearScreen();
video_columns = 80; DOSMEM_BiosData()->VideoColumns = 80;
break; break;
case 0x13: case 0x13:
TRACE(int10, "Setting VESA 320x200 256-color mode\n"); TRACE(int10, "Setting VESA 320x200 256-color mode\n");
...@@ -233,14 +231,14 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -233,14 +231,14 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
default: default:
FIXME(int10,"VESA Set Video Mode (0x%x) - Not Supported\n", BX_reg(context)); FIXME(int10,"VESA Set Video Mode (0x%x) - Not Supported\n", BX_reg(context));
} }
video_mode = BX_reg(context); DOSMEM_BiosData()->VideoMode = BX_reg(context);
AL_reg(context) = 0x4f; AL_reg(context) = 0x4f;
AH_reg(context) = 0x00; AH_reg(context) = 0x00;
break; break;
case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */ case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */
AL_reg(context) = 0x4f; AL_reg(context) = 0x4f;
AH_reg(context) = 0x00; /* should probly check if a vesa mode has ben set */ AH_reg(context) = 0x00; /* should probly check if a vesa mode has ben set */
BX_reg(context) = video_mode; BX_reg(context) = DOSMEM_BiosData()->VideoMode;
break; break;
case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */ case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */
ERR(int10,"VESA SAVE/RESTORE Video State - Not Implemented\n"); ERR(int10,"VESA SAVE/RESTORE Video State - Not Implemented\n");
...@@ -302,8 +300,8 @@ else { ...@@ -302,8 +300,8 @@ else {
AL_reg(context)); AL_reg(context));
CONSOLE_ResizeScreen(40, 25); CONSOLE_ResizeScreen(40, 25);
CONSOLE_ClearScreen(); CONSOLE_ClearScreen();
video_mode = AL_reg(context); DOSMEM_BiosData()->VideoMode = AL_reg(context);
video_columns = 40; DOSMEM_BiosData()->VideoColumns = 40;
break; break;
case 0x02: case 0x02:
case 0x03: case 0x03:
...@@ -313,13 +311,13 @@ else { ...@@ -313,13 +311,13 @@ else {
AL_reg(context)); AL_reg(context));
CONSOLE_ResizeScreen(80, 25); CONSOLE_ResizeScreen(80, 25);
CONSOLE_ClearScreen(); CONSOLE_ClearScreen();
video_mode = AL_reg(context); DOSMEM_BiosData()->VideoMode = AL_reg(context);
video_columns = 80; DOSMEM_BiosData()->VideoColumns = 80;
break; break;
case 0x13: case 0x13:
TRACE(int10, "Setting VGA 320x200 256-color mode\n"); TRACE(int10, "Setting VGA 320x200 256-color mode\n");
VGA_SetMode(320,200,8); VGA_SetMode(320,200,8);
video_mode = AL_reg(context); DOSMEM_BiosData()->VideoMode = AL_reg(context);
break; break;
default: default:
FIXME(int10, "Set Video Mode (0x%x) - Not Supported\n", FIXME(int10, "Set Video Mode (0x%x) - Not Supported\n",
...@@ -349,9 +347,15 @@ else { ...@@ -349,9 +347,15 @@ else {
break; break;
case 0x03: /* GET CURSOR POSITION AND SIZE */ case 0x03: /* GET CURSOR POSITION AND SIZE */
FIXME(int10, "Get Cursor Position and Size - Not Supported\n"); {
CX_reg(context) = 0x0000; /* Bogus cursor data */ CHAR row, col;
DX_reg(context) = 0x0000;
FIXME(int10, "Get cursor position and size - partially supported\n");
CX_reg(context) = 0x0a0b; /* Bogus cursor data */
CONSOLE_GetCursorPosition(&row, &col);
DH_reg(context) = row;
DL_reg(context) = col;
}
break; break;
case 0x04: /* READ LIGHT PEN POSITION */ case 0x04: /* READ LIGHT PEN POSITION */
...@@ -392,7 +396,7 @@ else { ...@@ -392,7 +396,7 @@ else {
int bg, fg, attr; int bg, fg, attr;
if (BH_reg(context)) /* Write to different page */ if (BH_reg(context)) /* Write to different page */
{ {
FIXME(int10, "Read Character and Attribute at Cursor Position -" FIXME(int10, "Read character and attribute at cursor position -"
" Can't read from non-0 page\n"); " Can't read from non-0 page\n");
AL_reg(context) = ' '; /* That page is blank */ AL_reg(context) = ' '; /* That page is blank */
AH_reg(context) = 7; AH_reg(context) = 7;
...@@ -447,8 +451,8 @@ else { ...@@ -447,8 +451,8 @@ else {
foreground already is... FIXME */ foreground already is... FIXME */
TRACE(int10, "Set Background/Border Color: %d\n", TRACE(int10, "Set Background/Border Color: %d\n",
BL_reg(context)); BL_reg(context));
CONSOLE_SetBackgroundColor(color_pallet[0], CONSOLE_SetBackgroundColor(color_palette[0],
color_pallet[BL_reg(context)]); color_palette[BL_reg(context)]);
break; break;
case 0x01: /* SET PALETTE */ case 0x01: /* SET PALETTE */
FIXME(int10, "Set Palette - Not Supported\n"); FIXME(int10, "Set Palette - Not Supported\n");
...@@ -476,10 +480,10 @@ else { ...@@ -476,10 +480,10 @@ else {
break; break;
case 0x0f: /* GET CURRENT VIDEO MODE */ case 0x0f: /* GET CURRENT VIDEO MODE */
TRACE(int10, "Get Current Video Mode\n"); TRACE(int10, "Get current video mode\n");
/* Note: This should not be a constant value. */ /* Note: This should not be a constant value. */
AL_reg(context) = video_mode; AL_reg(context) = DOSMEM_BiosData()->VideoMode;
AH_reg(context) = video_columns; AH_reg(context) = DOSMEM_BiosData()->VideoColumns;
BH_reg(context) = 0; /* Display page 0 */ BH_reg(context) = 0; /* Display page 0 */
break; break;
...@@ -597,20 +601,24 @@ else { ...@@ -597,20 +601,24 @@ else {
case 0x12: /* ALTERNATE FUNCTION SELECT */ case 0x12: /* ALTERNATE FUNCTION SELECT */
switch BL_reg(context) { switch BL_reg(context) {
case 0x10: /* GET EGA INFO */ case 0x10: /* GET EGA INFO */
TRACE(int10, "EGA Info Requested\n"); TRACE(int10, "EGA info requested\n");
BH_reg(context) = 0x00; /* Color screen */ BH_reg(context) = 0x00; /* Color screen */
BL_reg(context) = 0x03; /* 256K EGA card */ BL_reg(context) =
CH_reg(context) = 0x00; /* Switch settings?? */ DOSMEM_BiosData()->ModeOptions >> 5; /* EGA memory size */
CL_reg(context) = 0x09; /* EGA+ card */ CX_reg(context) =
DOSMEM_BiosData()->FeatureBitsSwitches;
break; break;
case 0x20: /* ALTERNATE PRTSC */ case 0x20: /* ALTERNATE PRTSC */
FIXME(int10, "Install Alternate Print Screen - Not Supported\n"); FIXME(int10, "Install Alternate Print Screen - Not Supported\n");
break; break;
case 0x30: /* SELECT VERTICAL RESOULTION */ case 0x30: /* SELECT VERTICAL RESOULTION */
FIXME(int10, "Select Vertical Resoultion - Not Supported\n"); FIXME(int10, "Select vertical resolution - not supported\n");
break; break;
case 0x31: /* ENABLE/DISABLE PALETTE LOADING */ case 0x31: /* ENABLE/DISABLE DEFAULT PALETTE LOADING */
FIXME(int10, "Palette Loading - Not Supported\n"); FIXME(int10, "Default palette loading - not supported\n");
DOSMEM_BiosData()->VGASettings =
(DOSMEM_BiosData()->VGASettings & 0xf7) |
((AL_reg(context) == 1) << 3);
break; break;
case 0x32: /* ENABLE/DISABLE VIDEO ADDRERSSING */ case 0x32: /* ENABLE/DISABLE VIDEO ADDRERSSING */
FIXME(int10, "Video Addressing - Not Supported\n"); FIXME(int10, "Video Addressing - Not Supported\n");
...@@ -619,7 +627,9 @@ else { ...@@ -619,7 +627,9 @@ else {
FIXME(int10, "Gray Scale Summing - Not Supported\n"); FIXME(int10, "Gray Scale Summing - Not Supported\n");
break; break;
case 0x34: /* ENABLE/DISABLE CURSOR EMULATION */ case 0x34: /* ENABLE/DISABLE CURSOR EMULATION */
FIXME(int10, "Cursor Emulation - Not Supported\n"); TRACE(int10, "Set cursor emulation to %d\n", AL_reg(context));
DOSMEM_BiosData()->ModeOptions =
(DOSMEM_BiosData()->ModeOptions & 0xfe)|(AL_reg(context) == 1);
break; break;
case 0x36: /* VIDEO ADDRESS CONTROL */ case 0x36: /* VIDEO ADDRESS CONTROL */
FIXME(int10, "Video Address Control - Not Supported\n"); FIXME(int10, "Video Address Control - Not Supported\n");
...@@ -655,13 +665,36 @@ else { ...@@ -655,13 +665,36 @@ else {
break; break;
case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */ case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
FIXME(int10, "Get Functionality/State Information - Not Supported\n"); FIXME(int10, "Get functionality/state information - partially implemented\n");
if (BX_reg(context) == 0x0)
{
AL_reg(context) = 0x1b;
if (ISV86(context)) /* real */
ES_reg(context) = 0xf000;
else
ES_reg(context) = DOSMEM_BiosSysSeg;
BX_reg(context) = 0xe000;
}
break; break;
case 0x1c: /* SAVE/RESTORE VIDEO STATE */ case 0x1c: /* SAVE/RESTORE VIDEO STATE */
FIXME(int10, "Save/Restore Video State - Not Supported\n"); FIXME(int10, "Save/Restore Video State - Not Supported\n");
break; break;
case 0x4f: /* Get SuperVGA INFORMATION */
{
BYTE *p =
CTX_SEG_OFF_TO_LIN(context, ES_reg(context), DI_reg(context));
BOOL16 vesa20 = (*(DWORD *)p == "VBE2");
TRACE(int10, "Get SuperVGA information\n");
AH_reg(context) = 0;
*(WORD *)p = "VESA";
*(WORD *)(p+0x04) = 0x0200; /* VESA 2.0 */
*(DWORD *)(p+0x06) = NULL; /* pointer to OEM name */
*(DWORD *)(p+0x0a) = 0xfffffffd; /* capabilities flags :-) */
}
break;
default: default:
FIXME(int10, "Unknown - 0x%x\n", AH_reg(context)); FIXME(int10, "Unknown - 0x%x\n", AH_reg(context));
INT_BARF( context, 0x10 ); INT_BARF( context, 0x10 );
...@@ -712,8 +745,8 @@ static void conv_text_mode_attributes(char attribute, int *fg, int *bg, ...@@ -712,8 +745,8 @@ static void conv_text_mode_attributes(char attribute, int *fg, int *bg,
/* Background Color is stored in bits 6 through 4 */ /* Background Color is stored in bits 6 through 4 */
/* If this has bit 7 set, then we need to blink */ /* If this has bit 7 set, then we need to blink */
*fg = color_pallet[attribute & 15]; *fg = color_palette[attribute & 15];
*bg = color_pallet[(attribute & 112) / 16]; *bg = color_palette[(attribute & 112) / 16];
*wattribute = attribute & 128; *wattribute = attribute & 128;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment