Commit 1c1be3aa authored by Joseph Pranevich's avatar Joseph Pranevich Committed by Alexandre Julliard

Call the new console driver for some routines. This is not completely

done yet and more for testing purposes.
parent 791cd6a3
...@@ -7,6 +7,18 @@ ...@@ -7,6 +7,18 @@
#include "vga.h" #include "vga.h"
/* #define DEBUG_INT */ /* #define DEBUG_INT */
#include "debug.h" #include "debug.h"
#include "console.h"
static int conv_text_mode_attribute_attribute(char attribute);
static int conv_text_mode_attribute_fg_color(char attribute);
static int conv_text_mode_attribute_bg_color(char attribute);
static void write_char_attribute_at_cursor(char output, char page_num,
char attribute, short times);
static void scroll_window(int direction, char lines, char row1,
char col1, char row2, char col2, char attribute);
#define SCROLL_UP 1
#define SCROLL_DOWN 2
/********************************************************************** /**********************************************************************
* INT_Int10Handler * INT_Int10Handler
...@@ -40,6 +52,8 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -40,6 +52,8 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
case 0x00: /* SET VIDEO MODE */ case 0x00: /* SET VIDEO MODE */
/* Text Modes: (can xterm or similar change text rows/cols?) */ /* Text Modes: (can xterm or similar change text rows/cols?) */
/* Answer: Yes. We can add that later. */
/* Er, maybe. I thought resizeterm() did it, I was wrong. */
/* (mode) (text rows/cols) /* (mode) (text rows/cols)
0x00 - 40x25 0x00 - 40x25
0x01 - 40x25 0x01 - 40x25
...@@ -57,6 +71,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -57,6 +71,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
VGA_Exit(); VGA_Exit();
TRACE(int10, "Set Video Mode - Set to Text - 0x0%x\n", TRACE(int10, "Set Video Mode - Set to Text - 0x0%x\n",
AL_reg(context)); AL_reg(context));
CONSOLE_ClearScreen();
break; break;
case 0x13: case 0x13:
TRACE(int10, "Setting VGA 320x200 256-color mode\n"); TRACE(int10, "Setting VGA 320x200 256-color mode\n");
...@@ -73,7 +88,20 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -73,7 +88,20 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
break; break;
case 0x02: /* SET CURSOR POSITION */ case 0x02: /* SET CURSOR POSITION */
FIXME(int10, "Set Cursor Position - Not Supported\n"); /* BH = Page Number */ /* Not supported */
/* DH = Row */ /* 0 is left */
/* DL = Column */ /* 0 is top */
if (BH_reg(context))
{
FIXME(int10, "Set Cursor Position: Cannot set to page %d\n",
BH_reg(context));
}
else
{
CONSOLE_MoveCursor(DH_reg(context), DL_reg(context));
TRACE(int10, "Set Cursor Position: %d %d\n", DH_reg(context),
DL_reg(context));
}
break; break;
case 0x03: /* GET CURSOR POSITION AND SIZE */ case 0x03: /* GET CURSOR POSITION AND SIZE */
...@@ -92,11 +120,25 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -92,11 +120,25 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
break; break;
case 0x06: /* SCROLL UP WINDOW */ case 0x06: /* SCROLL UP WINDOW */
FIXME(int10, "Scroll Up Window - Not Supported\n"); /* AL = Lines to scroll */
/* BH = Attribute */
/* CH,CL = row, col upper-left */
/* DH,DL = row, col lower-right */
scroll_window(SCROLL_UP, AL_reg(context), CH_reg(context),
CL_reg(context), DH_reg(context), DL_reg(context),
BH_reg(context));
TRACE(int10, "Scroll Up Window %d\n", AL_reg(context));
break; break;
case 0x07: /* SCROLL DOWN WINDOW */ case 0x07: /* SCROLL DOWN WINDOW */
FIXME(int10, "Scroll Down Window - Not Supported\n"); /* AL = Lines to scroll */
/* BH = Attribute */
/* CH,CL = row, col upper-left */
/* DH,DL = row, col lower-right */
scroll_window(SCROLL_DOWN, AL_reg(context), CH_reg(context),
CL_reg(context), DH_reg(context), DL_reg(context),
BH_reg(context));
TRACE(int10, "Scroll Down Window %d\n", AL_reg(context));
break; break;
case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */ case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
...@@ -105,12 +147,29 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -105,12 +147,29 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
break; break;
case 0x09: /* WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION */ case 0x09: /* WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
/* AL = Character to display. */
/* BH = Page Number */ /* We can't write to non-0 pages, yet. */
/* BL = Attribute / Color */
/* CX = Times to Write Char */
/* !NOTE!: It appears as if the cursor is not advanced if CX > 1 */
write_char_attribute_at_cursor(AL_reg(context), BH_reg(context),
BL_reg(context), CX_reg(context));
if (CX_reg(context) > 1)
TRACE(int10, "Write Character and Attribute at Cursor Position "
"(Rep. %d) %c\n", CX_reg(context), AL_reg(context));
else
TRACE(int10, "Write Character and Attribute at Cursor"
"Position: %c\n", AL_reg(context));
break;
case 0x0a: /* WRITE CHARACTER ONLY AT CURSOR POSITION */ case 0x0a: /* WRITE CHARACTER ONLY AT CURSOR POSITION */
while (CX_reg(context)) { /* AL = Character to display. */
_lwrite16(1, &AL_reg(context), 1); /* BH = Page Number */ /* We can't write to non-0 pages, yet. */
(CX_reg(context))--; /* CX = Times to Write Char */
} TRACE(int10, "Write Character at Cursor\n");
break; write_char_attribute_at_cursor(AL_reg(context), BH_reg(context),
0, CX_reg(context));
break;
case 0x0b: case 0x0b:
switch BH_reg(context) { switch BH_reg(context) {
...@@ -139,12 +198,15 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -139,12 +198,15 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
case 0x0e: /* TELETYPE OUTPUT */ case 0x0e: /* TELETYPE OUTPUT */
TRACE(int10, "Teletype Output\n"); TRACE(int10, "Teletype Output\n");
_lwrite16(1, &AL_reg(context), 1); CONSOLE_Write(AL_reg(context), 0, 0, 0);
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 (0x0%x)\n", AL_reg(context));
AL_reg(context) = 0x5b; /* WHY ARE WE RETURNING THIS? */ /* Note: This should not be a constant value. */
AL_reg(context) = 0x07; /* 80x25 text mode */
AH_reg(context) = 80; /* 80 columns */
BH_reg(context) = 0; /* Display page 0 */
break; break;
case 0x10: case 0x10:
...@@ -218,7 +280,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -218,7 +280,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
break; break;
case 0x01: /* LOAD ROM MONOCHROME PATTERNS */ case 0x01: /* LOAD ROM MONOCHROME PATTERNS */
case 0x11: case 0x11:
FIXME(int10, "Load ROM Monochrome Patterns - Not Suppoted\n"); FIXME(int10, "Load ROM Monochrome Patterns - Not Supported\n");
break; break;
case 0x02: /* LOAD ROM 8x8 DOUBLE-DOT PATTERNS */ case 0x02: /* LOAD ROM 8x8 DOUBLE-DOT PATTERNS */
case 0x12: case 0x12:
...@@ -329,3 +391,117 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) ...@@ -329,3 +391,117 @@ void WINAPI INT_Int10Handler( CONTEXT *context )
INT_BARF( context, 0x10 ); INT_BARF( context, 0x10 );
} }
} }
static void write_char_attribute_at_cursor(char output, char page_num,
char attribute, short times)
{
/* !NOTE!: */
/* It appears that the cursor should not be advanced if times > 1 */
/* I will triple check this later but bzork.exe definately points this */
/* way */
int wattribute, fg_color, bg_color;
char x, y;
int must_reset = 0;
if (page_num) /* Only support one text page right now */
{
FIXME(int10, "Cannot write to alternate page %d", page_num);
return;
}
wattribute = conv_text_mode_attribute_attribute(attribute);
fg_color = conv_text_mode_attribute_fg_color(attribute);
bg_color = conv_text_mode_attribute_bg_color(attribute);
if (times > 1)
{
must_reset = 1;
CONSOLE_GetCursorPosition(&x, &y);
}
while (times)
{
CONSOLE_Write(output, fg_color, bg_color, attribute);
times--;
}
if (must_reset)
CONSOLE_MoveCursor(x, y);
}
static int conv_text_mode_attribute_fg_color(char attribute)
{
/* This is a local function to convert the color values
in text-mode attributes to Wine's scheme */
/* Foreground Color is stored in bits 3 through 0 */
/* 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
*/
/* FIXME - We need color values for those and some generic constants */
return 0; /* Bogus, temporary data. */
}
static int conv_text_mode_attribute_bg_color(char attribute)
{
/* This is a local function to convert the color values
in text-mode attributes to Wine's scheme */
/* Background Color is stored in bits 6 through 4 */
/* Colors same as above, but only the left column */
/* FIXME - We need color values for those and some generic constants */
return 0; /* Bogus, temporary data. */
}
static int conv_text_mode_attribute_attribute(char attribute)
{
/* This is a local function to convert the attribute values
in text-mode attributes to Wine's scheme */
/* If this has bit 7 set, then we need to blink */
if (255 && attribute)
{
/* return TEXT_ATTRIBUTE_BLINK; */
}
return 0; /* Bogus data */
}
static void scroll_window(int direction, char lines, char row1,
char col1, char row2, char col2, char attribute)
{
int wattribute, bg_color;
wattribute = conv_text_mode_attribute_attribute(attribute);
bg_color = conv_text_mode_attribute_bg_color(attribute);
if (!lines) /* Actually, clear the window */
{
CONSOLE_ClearWindow(row1, col1, row2, col2, bg_color, wattribute);
}
else if (direction == SCROLL_UP)
{
CONSOLE_ScrollUpWindow(row1, col1, row2, col2, lines, bg_color,
wattribute);
}
else
{
CONSOLE_ScrollDownWindow(row1, col1, row2, col2, lines, bg_color,
wattribute);
}
}
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "msdos.h" #include "msdos.h"
#include "miscemu.h" #include "miscemu.h"
#include "module.h" #include "module.h"
#include "console.h"
/********************************************************************** /**********************************************************************
* INT_Int16Handler * INT_Int16Handler
...@@ -31,11 +32,25 @@ void WINAPI INT_Int16Handler( CONTEXT *context ) ...@@ -31,11 +32,25 @@ void WINAPI INT_Int16Handler( CONTEXT *context )
switch AH_reg(context) { switch AH_reg(context) {
case 0x00: /* Get Keystroke */ case 0x00: /* Get Keystroke */
FIXME(int16, "Get Keystroke - Not Supported\n"); /* Returns: AH = Scan code
AL = ASCII character */
TRACE(int16, "Get Keystroke\n");
CONSOLE_GetKeystroke(&AH_reg(context), &AL_reg(context));
break; break;
case 0x01: /* Check for Keystroke */ case 0x01: /* Check for Keystroke */
FIXME(int16, "Check for Keystroke - Not Supported\n"); /* Returns: ZF set if no keystroke */
/* AH = Scan code */
/* AL = ASCII character */
TRACE(int16, "Check for Keystroke\n");
if (!CONSOLE_CheckForKeystroke(&AH_reg(context), &AL_reg(context)))
{
SET_ZFLAG(context);
}
else
{
RESET_ZFLAG(context);
}
break; break;
case 0x02: /* Get Shift Flags */ case 0x02: /* Get Shift Flags */
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "options.h" #include "options.h"
#include "miscemu.h" #include "miscemu.h"
#include "debug.h" #include "debug.h"
#include "console.h"
#if defined(__svr4__) || defined(_SCO_DS) #if defined(__svr4__) || defined(_SCO_DS)
/* SVR4 DOESNT do locking the same way must implement properly */ /* SVR4 DOESNT do locking the same way must implement properly */
#define LOCK_EX 0 #define LOCK_EX 0
...@@ -1043,14 +1044,14 @@ void WINAPI DOS3Call( CONTEXT *context ) ...@@ -1043,14 +1044,14 @@ void WINAPI DOS3Call( CONTEXT *context )
{ {
BOOL32 bSetDOSExtendedError = FALSE; BOOL32 bSetDOSExtendedError = FALSE;
#if 0
TRACE(int21, "AX=%04x BX=%04x CX=%04x DX=%04x " TRACE(int21, "AX=%04x BX=%04x CX=%04x DX=%04x "
"SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n", "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
AX_reg(context), BX_reg(context), CX_reg(context), DX_reg(context), AX_reg(context), BX_reg(context), CX_reg(context), DX_reg(context),
SI_reg(context), DI_reg(context), SI_reg(context), DI_reg(context),
(WORD)DS_reg(context), (WORD)ES_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context),
EFL_reg(context) ); EFL_reg(context) );
#endif
if (AH_reg(context) == 0x59) /* Get extended error info */ if (AH_reg(context) == 0x59) /* Get extended error info */
{ {
...@@ -1102,18 +1103,23 @@ void WINAPI DOS3Call( CONTEXT *context ) ...@@ -1102,18 +1103,23 @@ void WINAPI DOS3Call( CONTEXT *context )
break; break;
case 0x02: /* WRITE CHARACTER TO STANDARD OUTPUT */ case 0x02: /* WRITE CHARACTER TO STANDARD OUTPUT */
TRACE(int21, "Write Character to Standard Output\n");
CONSOLE_Write(DL_reg(context), 0, 0, 0);
break;
case 0x06: /* DIRECT CONSOLE IN/OUTPUT */ case 0x06: /* DIRECT CONSOLE IN/OUTPUT */
_lwrite16( 1, &DL_reg(context), 1); TRACE(int21, "Direct Console Input/Output\n");
CONSOLE_Write(DL_reg(context), 0, 0, 0);
break; break;
case 0x07: /* DIRECT CHARACTER INPUT WITHOUT ECHO */ case 0x07: /* DIRECT CHARACTER INPUT WITHOUT ECHO */
TRACE(int21,"DIRECT CHARACTER INPUT WITHOUT ECHO\n"); TRACE(int21,"DIRECT CHARACTER INPUT WITHOUT ECHO\n");
_lread16( 0, &AL_reg(context), 1); AL_reg(context) = CONSOLE_GetCharacter();
break; break;
case 0x08: /* CHARACTER INPUT WITHOUT ECHO */ case 0x08: /* CHARACTER INPUT WITHOUT ECHO */
TRACE(int21,"CHARACTER INPUT WITHOUT ECHO\n"); TRACE(int21,"CHARACTER INPUT WITHOUT ECHO\n");
_lread16( 0, &AL_reg(context), 1); AL_reg(context) = CONSOLE_GetCharacter();
break; break;
case 0x09: /* WRITE STRING TO STANDARD OUTPUT */ case 0x09: /* WRITE STRING TO STANDARD OUTPUT */
......
...@@ -2,15 +2,10 @@ ...@@ -2,15 +2,10 @@
* DOS interrupt 29h handler * DOS interrupt 29h handler
*/ */
#include <stdlib.h> #include "config.h"
#include <string.h> #include "wintypes.h"
#include <unistd.h> #include "winnt.h"
#include "console.h"
#include "ldt.h"
#include "drive.h"
#include "msdos.h"
#include "miscemu.h"
#include "module.h"
/********************************************************************** /**********************************************************************
* INT_Int29Handler * INT_Int29Handler
...@@ -20,6 +15,6 @@ ...@@ -20,6 +15,6 @@
void WINAPI INT_Int29Handler( CONTEXT *context ) void WINAPI INT_Int29Handler( CONTEXT *context )
{ {
/* Yes, it seems that this is really all this interrupt does. */ /* Yes, it seems that this is really all this interrupt does. */
_lwrite16( 1, &AL_reg(context), 1); CONSOLE_Write(AL_reg(context), 0, 0, 0);
} }
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