X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=vgasrc%2Fvbe.c;h=c1b03f0aff7d1b9cff37bd5d0b926fe8cba0da47;hb=59f75d4bdc11e4f6bfea449347bdbf90c5a1fafc;hp=68d20259827cd28aeda174fa69dd75265290624e;hpb=3876b531222c53124b0eb154fb331c0c662f5e09;p=seabios.git diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c index 68d2025..c1b03f0 100644 --- a/vgasrc/vbe.c +++ b/vgasrc/vbe.c @@ -273,8 +273,37 @@ fail: static void vbe_104f07(struct bregs *regs) { - debug_stub(regs); - regs->ax = 0x0100; + struct vgamode_s *vmode_g = get_current_mode(); + if (! vmode_g) + goto fail; + int bpp = vga_bpp(vmode_g); + int linelength = vgahw_get_linelength(vmode_g); + if (linelength < 0) + goto fail; + + int ret; + switch (regs->bl) { + case 0x80: + case 0x00: + ret = vgahw_set_displaystart( + vmode_g, DIV_ROUND_UP(regs->cx * bpp, 8) + linelength * regs->dx); + if (ret) + goto fail; + break; + case 0x01: + ret = vgahw_get_displaystart(vmode_g); + if (ret < 0) + goto fail; + regs->dx = ret / linelength; + regs->cx = (ret % linelength) * 8 / bpp; + break; + default: + goto fail; + } + regs->ax = 0x004f; + return; +fail: + regs->ax = 0x014f; } static void @@ -291,6 +320,26 @@ vbe_104f0a(struct bregs *regs) regs->ax = 0x0100; } +static void +vbe_104f10(struct bregs *regs) +{ + switch (regs->bl) { + case 0x00: + regs->bx = 0x0f30; + break; + case 0x01: + SET_BDA(vbe_flag, regs->bh); + break; + case 0x02: + regs->bh = GET_BDA(vbe_flag); + break; + default: + regs->ax = 0x014f; + return; + } + regs->ax = 0x004f; +} + static void vbe_104fXX(struct bregs *regs) { @@ -317,6 +366,7 @@ handle_104f(struct bregs *regs) case 0x07: vbe_104f07(regs); break; case 0x08: vbe_104f08(regs); break; case 0x0a: vbe_104f0a(regs); break; + case 0x10: vbe_104f10(regs); break; default: vbe_104fXX(regs); break; } }