- text mode split screen feature now present in display library wx

This commit is contained in:
Volker Ruppert 2004-04-10 13:40:01 +00:00
parent 1a637de59e
commit 852c895452

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////
// $Id: wx.cc,v 1.67 2004-02-15 12:40:06 vruppert Exp $
// $Id: wx.cc,v 1.68 2004-04-10 13:40:01 vruppert Exp $
/////////////////////////////////////////////////////////////////
//
// wxWindows VGA display for Bochs. wx.cc implements a custom
@ -97,6 +97,7 @@ static unsigned long wxFontX = 0;
static unsigned long wxFontY = 0;
static unsigned int text_rows=25, text_cols=80;
static Bit8u h_panning = 0, v_panning = 0;
static Bit16u line_compare = 1023;
static unsigned vga_bpp=8;
struct {
unsigned char red;
@ -1210,11 +1211,12 @@ void bx_wx_gui_c::text_update(Bit8u *old_text, Bit8u *new_text,
{
IFDBG_VGA(wxLogDebug (wxT ("text_update")));
unsigned char *old_line, *new_line;
unsigned char cAttr, cChar;
unsigned int curs, hchars, offset, rows, x, y, xc, yc, yc2;
Bit8u *old_line, *new_line, *text_base;
Bit8u cAttr, cChar;
unsigned int curs, hchars, offset, rows, x, y, xc, yc, yc2, cs_y;
Bit8u cfwidth, cfheight, cfheight2, font_col, font_row, font_row2;
bx_bool forceUpdate = 0, gfxchar;
Bit8u split_textrow, split_fontrow;
bx_bool forceUpdate = 0, gfxchar, split_screen;
UNUSED(nrows);
if(charmap_updated) {
@ -1227,6 +1229,10 @@ void bx_wx_gui_c::text_update(Bit8u *old_text, Bit8u *new_text,
h_panning = tm_info.h_panning;
v_panning = tm_info.v_panning;
}
if(tm_info.line_compare != line_compare) {
forceUpdate = 1;
line_compare = tm_info.line_compare;
}
// first invalidate character at previous and new cursor location
if((wxCursorY < text_rows) && (wxCursorX < text_cols)) {
@ -1244,10 +1250,24 @@ void bx_wx_gui_c::text_update(Bit8u *old_text, Bit8u *new_text,
rows = text_rows;
if (v_panning) rows++;
y = 0;
cs_y = 0;
text_base = new_text - tm_info.start_address;
split_textrow = (line_compare + v_panning) / wxFontY;
split_fontrow = ((line_compare + v_panning) % wxFontY) + 1;
split_screen = 0;
do {
hchars = text_cols;
if (h_panning) hchars++;
if (v_panning) {
if (split_screen) {
yc = line_compare + cs_y * wxFontY + 1;
font_row = 0;
if (rows == 1) {
cfheight = (wxScreenY - line_compare - 1) % wxFontY;
if (cfheight == 0) cfheight = wxFontY;
} else {
cfheight = wxFontY;
}
} else if (v_panning) {
if (y == 0) {
yc = 0;
font_row = v_panning;
@ -1266,10 +1286,13 @@ void bx_wx_gui_c::text_update(Bit8u *old_text, Bit8u *new_text,
font_row = 0;
cfheight = wxFontY;
}
if (!split_screen && (y == split_textrow)) {
if (split_fontrow < cfheight) cfheight = split_fontrow;
}
new_line = new_text;
old_line = old_text;
x = 0;
offset = y * tm_info.line_offset;
offset = cs_y * tm_info.line_offset;
do {
if (h_panning) {
if (hchars > text_cols) {
@ -1323,11 +1346,22 @@ void bx_wx_gui_c::text_update(Bit8u *old_text, Bit8u *new_text,
old_text+=2;
offset+=2;
} while (--hchars);
y++;
new_text = new_line + tm_info.line_offset;
old_text = old_line + tm_info.line_offset;
if (!split_screen && (y == split_textrow)) {
new_text = text_base;
forceUpdate = 1;
cs_y = 0;
if (tm_info.split_hpanning) h_panning = 0;
rows = ((wxScreenY - line_compare + wxFontY - 2) / wxFontY) + 1;
split_screen = 1;
} else {
y++;
cs_y++;
new_text = new_line + tm_info.line_offset;
old_text = old_line + tm_info.line_offset;
}
} while (--rows);
h_panning = tm_info.h_panning;
wxCursorX = cursor_x;
wxCursorY = cursor_y;