summaryrefslogtreecommitdiff
path: root/vgasrc
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2014-10-22 20:57:37 -0400
committerKevin O'Connor <kevin@koconnor.net>2014-10-27 11:02:28 -0400
commitc9aecfcd14ec5dcddd93fd84dc02a8aee61dc63e (patch)
tree9843250f50d8e2a41a3a9c63ff63b8fb1e81bf6e /vgasrc
parent479fd7255fbc19224d93690916826932841abe2d (diff)
downloadqemu-seabios-c9aecfcd14ec5dcddd93fd84dc02a8aee61dc63e.tar.gz
vgabios: Refactor get/set_cursor_shape() code
Rework the code so that it is possible to calculate the current cursor shape even when not changing it. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'vgasrc')
-rw-r--r--vgasrc/stdvga.c6
-rw-r--r--vgasrc/stdvga.h2
-rw-r--r--vgasrc/vgabios.c53
3 files changed, 29 insertions, 32 deletions
diff --git a/vgasrc/stdvga.c b/vgasrc/stdvga.c
index 70cceed..00a0fc5 100644
--- a/vgasrc/stdvga.c
+++ b/vgasrc/stdvga.c
@@ -229,11 +229,11 @@ stdvga_vram_ratio(struct vgamode_s *vmode_g)
}
void
-stdvga_set_cursor_shape(u8 start, u8 end)
+stdvga_set_cursor_shape(u16 cursor_type)
{
u16 crtc_addr = stdvga_get_crtc();
- stdvga_crtc_write(crtc_addr, 0x0a, start);
- stdvga_crtc_write(crtc_addr, 0x0b, end);
+ stdvga_crtc_write(crtc_addr, 0x0a, cursor_type >> 8);
+ stdvga_crtc_write(crtc_addr, 0x0b, cursor_type);
}
void
diff --git a/vgasrc/stdvga.h b/vgasrc/stdvga.h
index df09bab..39753b4 100644
--- a/vgasrc/stdvga.h
+++ b/vgasrc/stdvga.h
@@ -92,7 +92,7 @@ void stdvga_load_font(u16 seg, void *src_far, u16 count
, u16 start, u8 destflags, u8 fontsize);
u16 stdvga_get_crtc(void);
int stdvga_vram_ratio(struct vgamode_s *vmode_g);
-void stdvga_set_cursor_shape(u8 start, u8 end);
+void stdvga_set_cursor_shape(u16 cursor_type);
void stdvga_set_cursor_pos(int address);
void stdvga_set_scan_lines(u8 lines);
u16 stdvga_get_vde(void);
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index 47bf581..786c009 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -50,36 +50,33 @@ calc_page_size(u8 memmodel, u16 width, u16 height)
}
}
-static void
-set_cursor_shape(u8 start, u8 end)
+// Determine cursor shape (taking into account possible cursor scaling)
+static u16
+get_cursor_shape(void)
{
- start &= 0x3f;
- end &= 0x1f;
-
- u16 curs = (start << 8) + end;
- SET_BDA(cursor_type, curs);
-
- if (!CONFIG_VGA_STDVGA_PORTS)
- return;
-
+ u16 cursor_type = GET_BDA(cursor_type);
u8 emulate_cursor = (GET_BDA(video_ctl) & 1) == 0;
+ if (!emulate_cursor)
+ return cursor_type;
+ u8 start = (cursor_type >> 8) & 0x3f;
+ u8 end = cursor_type & 0x1f;
u16 cheight = GET_BDA(char_height);
- if (emulate_cursor && (cheight > 8) && (end < 8) && (start < 0x20)) {
- if (end != (start + 1))
- start = ((start + 1) * cheight / 8) - 1;
- else
- start = ((end + 1) * cheight / 8) - 2;
- end = ((end + 1) * cheight / 8) - 1;
- }
- stdvga_set_cursor_shape(start, end);
+ if (cheight <= 8 || end >= 8 || start >= 0x20)
+ return cursor_type;
+ if (end != (start + 1))
+ start = ((start + 1) * cheight / 8) - 1;
+ else
+ start = ((end + 1) * cheight / 8) - 2;
+ end = ((end + 1) * cheight / 8) - 1;
+ return (start << 8) | end;
}
-static u16
-get_cursor_shape(u8 page)
+static void
+set_cursor_shape(u16 cursor_type)
{
- if (page > 7)
- return 0;
- return GET_BDA(cursor_type);
+ SET_BDA(cursor_type, cursor_type);
+ if (CONFIG_VGA_STDVGA_PORTS)
+ stdvga_set_cursor_shape(get_cursor_shape());
}
static void
@@ -158,9 +155,9 @@ set_scan_lines(u8 lines)
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);
+ set_cursor_shape(0x0607);
else
- set_cursor_shape(lines - 3, lines - 2);
+ set_cursor_shape(((lines - 3) << 8) | (lines - 2));
}
@@ -377,7 +374,7 @@ handle_1000(struct bregs *regs)
static void
handle_1001(struct bregs *regs)
{
- set_cursor_shape(regs->ch, regs->cl);
+ set_cursor_shape(regs->cx);
}
static void
@@ -390,7 +387,7 @@ handle_1002(struct bregs *regs)
static void
handle_1003(struct bregs *regs)
{
- regs->cx = get_cursor_shape(regs->bh);
+ regs->cx = GET_BDA(cursor_type);
struct cursorpos cp = get_cursor_pos(regs->bh);
regs->dl = cp.x;
regs->dh = cp.y;