aboutsummaryrefslogtreecommitdiff
path: root/vgasrc/vbe.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2012-02-04 12:40:02 -0500
committerKevin O'Connor <kevin@koconnor.net>2012-02-04 12:41:13 -0500
commit2469f89528a7da83eb608dfc86fda5fc780b8f92 (patch)
tree38d975f9367476700be9ee8e9742b55287d128e2 /vgasrc/vbe.c
parent9f857fc97c0cdfa6f18a43d1548cd91014766c26 (diff)
downloadseabios-2469f89528a7da83eb608dfc86fda5fc780b8f92.zip
seabios-2469f89528a7da83eb608dfc86fda5fc780b8f92.tar.gz
seabios-2469f89528a7da83eb608dfc86fda5fc780b8f92.tar.bz2
vgabios: Implement VBE save/restore state function (func 04).
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'vgasrc/vbe.c')
-rw-r--r--vgasrc/vbe.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c
index 0ee69b4..505cb61 100644
--- a/vgasrc/vbe.c
+++ b/vgasrc/vbe.c
@@ -201,8 +201,36 @@ vbe_104f03(struct bregs *regs)
static void
vbe_104f04(struct bregs *regs)
{
- debug_stub(regs);
- regs->ax = 0x0100;
+ u16 seg = regs->es;
+ void *data = (void*)(regs->bx+0);
+ u16 states = regs->cx;
+ if (states & ~0x0f)
+ goto fail;
+ int ret;
+ switch (regs->dl) {
+ case 0x00:
+ ret = vgahw_size_state(states);
+ if (ret < 0)
+ goto fail;
+ regs->bx = ret / 64;
+ break;
+ case 0x01:
+ ret = vgahw_save_state(seg, data, states);
+ if (ret)
+ goto fail;
+ break;
+ case 0x02:
+ ret = vgahw_restore_state(seg, data, states);
+ if (ret)
+ goto fail;
+ break;
+ default:
+ goto fail;
+ }
+ regs->ax = 0x004f;
+ return;
+fail:
+ regs->ax = 0x014f;
}
void VISIBLE16