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
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)
{
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;
}
}