diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2012-02-04 12:40:02 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2012-02-04 12:41:13 -0500 |
commit | 2469f89528a7da83eb608dfc86fda5fc780b8f92 (patch) | |
tree | 38d975f9367476700be9ee8e9742b55287d128e2 /vgasrc/vbe.c | |
parent | 9f857fc97c0cdfa6f18a43d1548cd91014766c26 (diff) | |
download | seabios-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.c | 32 |
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 |