aboutsummaryrefslogtreecommitdiffstats
path: root/vgasrc
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2014-10-22 20:27:28 -0400
committerKevin O'Connor <kevin@koconnor.net>2014-10-27 11:02:28 -0400
commit479fd7255fbc19224d93690916826932841abe2d (patch)
tree7cf1d9e93df8af2df5495aec07ecea1cdc4e1342 /vgasrc
parentf4b1dbc9ac47d24a644462c91c5fb1514da3829b (diff)
downloadseabios-479fd7255fbc19224d93690916826932841abe2d.tar.gz
seabios-479fd7255fbc19224d93690916826932841abe2d.tar.xz
seabios-479fd7255fbc19224d93690916826932841abe2d.zip
vgabios: Set cursor shape fixes
The "cursor scaling" mode is determined by the first bit of the video_ctl bda value, not the modeset_ctl value. Also, on a set_scan_lines() call, the shape should be set to lines-3/lines-2 and the shape must be set after char_height has been updated. The existing cursor shape code matches the legacy "lgpl vgabios", but the behavior doesn't match bios documentation nor observations with an ati vga bios. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'vgasrc')
-rw-r--r--vgasrc/vgabios.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index 8ec6aa6..47bf581 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -62,9 +62,9 @@ set_cursor_shape(u8 start, u8 end)
if (!CONFIG_VGA_STDVGA_PORTS)
return;
- u8 modeset_ctl = GET_BDA(modeset_ctl);
+ u8 emulate_cursor = (GET_BDA(video_ctl) & 1) == 0;
u16 cheight = GET_BDA(char_height);
- if ((modeset_ctl & 0x01) && (cheight > 8) && (end < 8) && (start < 0x20)) {
+ if (emulate_cursor && (cheight > 8) && (end < 8) && (start < 0x20)) {
if (end != (start + 1))
start = ((start + 1) * cheight / 8) - 1;
else
@@ -79,7 +79,6 @@ get_cursor_shape(u8 page)
{
if (page > 7)
return 0;
- // FIXME should handle VGA 14/16 lines
return GET_BDA(cursor_type);
}
@@ -117,7 +116,6 @@ get_cursor_pos(u8 page)
struct cursorpos cp = { 0, 0, 0xfe };
return cp;
}
- // FIXME should handle VGA 14/16 lines
u16 xy = GET_BDA(cursor_pos[page]);
struct cursorpos cp = {xy, xy>>8, page};
return cp;
@@ -153,16 +151,16 @@ static void
set_scan_lines(u8 lines)
{
stdvga_set_scan_lines(lines);
- if (lines == 8)
- set_cursor_shape(0x06, 0x07);
- else
- set_cursor_shape(lines - 4, lines - 3);
SET_BDA(char_height, lines);
u16 vde = stdvga_get_vde();
u8 rows = vde / lines;
SET_BDA(video_rows, rows - 1);
u16 cols = GET_BDA(video_cols);
SET_BDA(video_pagesize, calc_page_size(MM_TEXT, cols, rows));
+ if (lines == 8)
+ set_cursor_shape(0x06, 0x07);
+ else
+ set_cursor_shape(lines - 3, lines - 2);
}
@@ -981,9 +979,7 @@ handle_101233(struct bregs *regs)
static void
handle_101234(struct bregs *regs)
{
- u8 v = (regs->al & 0x01) ^ 0x01;
- u8 v2 = GET_BDA(modeset_ctl) & ~0x01;
- SET_BDA(modeset_ctl, v | v2);
+ SET_BDA(video_ctl, (GET_BDA(video_ctl) & ~0x01) | (regs->al & 0x01));
regs->al = 0x12;
}