summaryrefslogtreecommitdiff
path: root/vgasrc
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2016-08-04 17:02:16 -0400
committerKevin O'Connor <kevin@koconnor.net>2016-08-04 17:02:16 -0400
commit774f5cd627a1fd646e6b56d9acc18f34e485a430 (patch)
treef43cd5a292e08de0f628298b5dca5c1f0dc179e7 /vgasrc
parent27129d003f63d96624a90d052b9899bc7f900e07 (diff)
downloadqemu-seabios-774f5cd627a1fd646e6b56d9acc18f34e485a430.tar.gz
swcursor: Concentrate swcursor logic in swcursor.c
The software cursor code is not frequently used (only the coreboot framebuffer vga code uses it). Move its logic out of the main code and into swcursor.c. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'vgasrc')
-rw-r--r--vgasrc/swcursor.c37
-rw-r--r--vgasrc/vgabios.c8
-rw-r--r--vgasrc/vgabios.h5
-rw-r--r--vgasrc/vgafb.c5
-rw-r--r--vgasrc/vgainit.c4
5 files changed, 39 insertions, 20 deletions
diff --git a/vgasrc/swcursor.c b/vgasrc/swcursor.c
index 35f857a..83f4822 100644
--- a/vgasrc/swcursor.c
+++ b/vgasrc/swcursor.c
@@ -5,6 +5,7 @@
// This file may be distributed under the terms of the GNU LGPLv3 license.
#include "biosvar.h" // GET_BDA
+#include "bregs.h" // struct bregs
#include "vgabios.h" // handle_gfx_op
// Draw/undraw a cursor on the framebuffer by xor'ing the cursor cell
@@ -32,11 +33,9 @@ gfx_set_swcursor(struct vgamode_s *vmode_g, int enable, struct cursorpos cp)
}
// Draw/undraw a cursor on the screen
-void
-vgafb_set_swcursor(int enable)
+static void
+set_swcursor(int enable)
{
- if (!vga_emulate_text())
- return;
u8 flags = GET_BDA_EXT(flags);
if (!!(flags & BF_SWCURSOR) == enable)
// Already in requested mode.
@@ -63,3 +62,33 @@ vgafb_set_swcursor(int enable)
attr = (attr >> 4) | (attr << 4);
SET_FARVAR(GET_GLOBAL(vmode_g->sstart), *(u8*)dest_far, attr);
}
+
+// Disable virtual cursor if a vgabios call accesses the framebuffer
+void
+swcursor_pre_handle10(struct bregs *regs)
+{
+ if (!vga_emulate_text())
+ return;
+ switch (regs->ah) {
+ case 0x4f:
+ if (!CONFIG_VGA_VBE || regs->al != 0x02)
+ break;
+ // NO BREAK
+ case 0x00 ... 0x02:
+ case 0x05 ... 0x0e:
+ case 0x13:
+ set_swcursor(0);
+ break;
+ default:
+ break;
+ }
+}
+
+// Called by periodic (18.2hz) timer
+void
+swcursor_check_event(void)
+{
+ if (!vga_emulate_text())
+ return;
+ set_swcursor(GET_BDA(timer_counter) % 18 < 9);
+}
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index 2c8cc79..4e897c4 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -74,7 +74,6 @@ get_cursor_shape(void)
static void
set_cursor_shape(u16 cursor_type)
{
- vgafb_set_swcursor(0);
SET_BDA(cursor_type, cursor_type);
if (CONFIG_VGA_STDVGA_PORTS)
stdvga_set_cursor_shape(get_cursor_shape());
@@ -89,7 +88,6 @@ set_cursor_pos(struct cursorpos cp)
if (cp.page == GET_BDA(video_page)) {
// Update cursor in hardware
- vgafb_set_swcursor(0);
if (CONFIG_VGA_STDVGA_PORTS)
stdvga_set_cursor_pos((int)text_address(cp));
}
@@ -118,8 +116,6 @@ set_active_page(u8 page)
if (!vmode_g)
return;
- vgafb_set_swcursor(0);
-
// Calculate memory address of start of page
struct cursorpos cp = {0, 0, page};
int address = (int)text_address(cp);
@@ -268,8 +264,6 @@ vga_set_mode(int mode, int flags)
if (!vmode_g)
return VBE_RETURN_STATUS_FAILED;
- vgafb_set_swcursor(0);
-
int ret = vgahw_set_mode(vmode_g, flags);
if (ret)
return ret;
@@ -1103,6 +1097,8 @@ void VISIBLE16
handle_10(struct bregs *regs)
{
debug_enter(regs, DEBUG_VGA_10);
+ swcursor_pre_handle10(regs);
+
switch (regs->ah) {
case 0x00: handle_1000(regs); break;
case 0x01: handle_1001(regs); break;
diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h
index 9764020..ffbb729 100644
--- a/vgasrc/vgabios.h
+++ b/vgasrc/vgabios.h
@@ -134,7 +134,9 @@ void vgafb_write_pixel(u8 color, u16 x, u16 y);
u8 vgafb_read_pixel(u16 x, u16 y);
// swcursor.c
-void vgafb_set_swcursor(int enable);
+struct bregs;
+void swcursor_pre_handle10(struct bregs *regs);
+void swcursor_check_event(void);
// vbe.c
extern u32 VBE_total_memory;
@@ -145,7 +147,6 @@ extern u16 VBE_win_granularity;
#define VBE_VENDOR_STRING "SeaBIOS Developers"
#define VBE_PRODUCT_STRING "SeaBIOS VBE Adapter"
#define VBE_REVISION_STRING "Rev. 1"
-struct bregs;
void handle_104f(struct bregs *regs);
#endif // vgabios.h
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c
index 46a1ab8..57ecc9b 100644
--- a/vgasrc/vgafb.c
+++ b/vgasrc/vgafb.c
@@ -504,7 +504,6 @@ vgafb_write_pixel(u8 color, u16 x, u16 y)
struct vgamode_s *vmode_g = get_current_mode();
if (!vmode_g)
return;
- vgafb_set_swcursor(0);
struct gfx_op op;
init_gfx_op(&op, vmode_g);
@@ -529,7 +528,6 @@ vgafb_read_pixel(u16 x, u16 y)
struct vgamode_s *vmode_g = get_current_mode();
if (!vmode_g)
return 0;
- vgafb_set_swcursor(0);
struct gfx_op op;
init_gfx_op(&op, vmode_g);
@@ -599,7 +597,6 @@ void
vgafb_scroll(struct cursorpos win, struct cursorpos winsize
, int lines, struct carattr ca)
{
- vgafb_set_swcursor(0);
if (!lines) {
// Clear window
vgafb_clear_chars(win, winsize, ca);
@@ -630,7 +627,6 @@ vgafb_write_char(struct cursorpos cp, struct carattr ca)
struct vgamode_s *vmode_g = get_current_mode();
if (!vmode_g)
return;
- vgafb_set_swcursor(0);
if (GET_GLOBAL(vmode_g->memmodel) != MM_TEXT) {
gfx_write_char(vmode_g, cp, ca);
@@ -653,7 +649,6 @@ vgafb_read_char(struct cursorpos cp)
struct vgamode_s *vmode_g = get_current_mode();
if (!vmode_g)
return (struct carattr){0, 0, 0};
- vgafb_set_swcursor(0);
if (GET_GLOBAL(vmode_g->memmodel) != MM_TEXT)
return gfx_read_char(vmode_g, cp);
diff --git a/vgasrc/vgainit.c b/vgasrc/vgainit.c
index 40997db..6249e66 100644
--- a/vgasrc/vgainit.c
+++ b/vgasrc/vgainit.c
@@ -96,9 +96,7 @@ struct segoff_s Timer_Hook_Resume VAR16 VISIBLE16;
void VISIBLE16
handle_timer_hook(void)
{
- if (!vga_emulate_text())
- return;
- vgafb_set_swcursor(GET_BDA(timer_counter) % 18 < 9);
+ swcursor_check_event();
}
static void