summaryrefslogtreecommitdiff
path: root/vgasrc
diff options
context:
space:
mode:
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