diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c index 599aff104..aaf121f15 100644 --- a/hw/kdrive/fbdev/fbdev.c +++ b/hw/kdrive/fbdev/fbdev.c @@ -115,10 +115,6 @@ static Bool fbdevModeSupported (KdScreenInfo *screen, const KdMonitorTiming *t) { - /* XXX: Remove this */ - if (t->rate > 75) - return FALSE; - return TRUE; } @@ -172,7 +168,7 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv) screen->width = 1024; screen->height = 768; } - screen->rate = 75; + screen->rate = 103; /* FIXME: should get proper value from fb driver */ } if (!screen->fb[0].depth) screen->fb[0].depth = 16; diff --git a/hw/kdrive/src/kaa.c b/hw/kdrive/src/kaa.c index 0555f0307..ea2e5c738 100644 --- a/hw/kdrive/src/kaa.c +++ b/hw/kdrive/src/kaa.c @@ -100,8 +100,10 @@ kaaPixmapSave (ScreenPtr pScreen, KdOffscreenArea *area) pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pKaaPixmap->area = NULL; +#if 0 if (!pKaaPixmap->dirty) return; +#endif KdCheckSync (pPixmap->drawable.pScreen); diff --git a/hw/kdrive/src/kmode.c b/hw/kdrive/src/kmode.c index 7b3c43457..e79f5ff62 100644 --- a/hw/kdrive/src/kmode.c +++ b/hw/kdrive/src/kmode.c @@ -146,7 +146,13 @@ const KdMonitorTiming kdMonitorTimings[] = { 32, 208, 384, KdSyncPositive, /* 61.849 */ 1, 32, 38, KdSyncPositive, /* 65.937 */ }, - + + /* 1280x854 modes */ + { 1280, 854, 103, 12500, /* ADDED */ + 56, 16, 128, KdSyncPositive, /* 102.554 */ + 1, 216, 12, KdSyncPositive, + }, + /* 1280x960 modes */ { 1280, 960, 85, 148500, /* VESA */ 64, 224, 448, KdSyncPositive, /* 85.938 */ @@ -263,6 +269,7 @@ KdFindMode (KdScreenInfo *screen, return t; } } + ErrorF("Warning: mode not found, using default\n"); return &kdMonitorTimings[MONITOR_TIMING_DEFAULT]; } diff --git a/hw/kdrive/vesa/vbe.c b/hw/kdrive/vesa/vbe.c index 4bcedf08d..7fc891a09 100644 --- a/hw/kdrive/vesa/vbe.c +++ b/hw/kdrive/vesa/vbe.c @@ -638,6 +638,20 @@ VbeDPMS(Vm86InfoPtr vi, int mode) return TRUE; } +Bool +VbeBoot(Vm86InfoPtr vi) +{ + int code; + int bus = 1; + int device = 0; + int function = 0; + + vi->vms.regs.eax = (bus << 8) | (device << 3) | (function & 0x7); + code = VbeDoInterruptE6 (vi); + ErrorF ("Boot: %d\n", code); + return TRUE; +} + int VbeDoInterrupt10(Vm86InfoPtr vi) { @@ -677,3 +691,17 @@ VbeDoInterrupt10(Vm86InfoPtr vi) } return code; } + +int +VbeDoInterruptE6(Vm86InfoPtr vi) +{ + int code; + int oldax; + + oldax = vi->vms.regs.eax & 0xffff; + + code = Vm86DoPOST (vi); + ErrorF("POST (0x%04X): 0x%04X\n", + oldax, vi->vms.regs.eax & 0xffff); + return code; +} diff --git a/hw/kdrive/vesa/vbe.h b/hw/kdrive/vesa/vbe.h index 8aa3276d8..5d0ff5142 100644 --- a/hw/kdrive/vesa/vbe.h +++ b/hw/kdrive/vesa/vbe.h @@ -157,4 +157,10 @@ VbeDPMS(Vm86InfoPtr vi, int mode); int VbeDoInterrupt10(Vm86InfoPtr vi); +Bool +VbeBoot(Vm86InfoPtr vi); + +int +VbeDoInterruptE6(Vm86InfoPtr vi); + #endif diff --git a/hw/kdrive/vesa/vesa.c b/hw/kdrive/vesa/vesa.c index 004f35981..bcc871907 100644 --- a/hw/kdrive/vesa/vesa.c +++ b/hw/kdrive/vesa/vesa.c @@ -41,6 +41,7 @@ Bool vesa_verbose = FALSE; Bool vesa_force_text = FALSE; Bool vesa_restore_font = TRUE; Bool vesa_map_holes = TRUE; +Bool vesa_boot = FALSE; #define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver) @@ -216,6 +217,9 @@ vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv) if(!priv->vi) goto fail; + if (vesa_boot) + VbeBoot (priv->vi); + priv->modes = vesaGetModes (priv->vi, &priv->nmode); if (!priv->modes) @@ -1756,6 +1760,7 @@ vesaUseMsg (void) ErrorF("-map-holes Use contiguous memory map (For seg fault with rare BIOS)\n"); ErrorF("-verbose Emit diagnostic messages during BIOS initialization\n"); ErrorF("-force-text Always use standard 25x80 text mode on server exit or VT switch\n"); + ErrorF("-boot Soft boot video card\n"); /* XXX: usage for -vesatest, -no-map-holes (don't need?), * XXX: and -trash-font. Also in man page. */ } @@ -1802,6 +1807,9 @@ vesaProcessArgument (int argc, char **argv, int i) } else if(!strcmp(argv[i], "-trash-font")) { vesa_restore_font = FALSE; return 1; + } else if(!strcmp(argv[i], "-boot")) { + vesa_boot = TRUE; + return 1; } return 0; diff --git a/hw/kdrive/vesa/vm86.c b/hw/kdrive/vesa/vm86.c index d5289983b..9d1fa8bcf 100644 --- a/hw/kdrive/vesa/vm86.c +++ b/hw/kdrive/vesa/vm86.c @@ -219,7 +219,8 @@ Vm86DoInterrupt(Vm86InfoPtr vi, int num) off = MMW(vi,num * 4); if(MAKE_POINTER(seg, off) < ROM_BASE || MAKE_POINTER(seg, off) >= ROM_BASE + ROM_SIZE) { - ErrorF("Interrupt pointer doesn't point at ROM\n"); + ErrorF("Interrupt pointer (seg %x off %x) doesn't point at ROM\n", + seg, off); return -1; } memcpy(&(LM(vi,vi->ret_code)), retcode_data, sizeof(retcode_data)); @@ -244,6 +245,40 @@ Vm86DoInterrupt(Vm86InfoPtr vi, int num) return 0; } +int +Vm86DoPOST(Vm86InfoPtr vi) +{ + U16 seg, off; + int code; + + seg = 0xC000; + off = 3; + if(MAKE_POINTER(seg, off) < ROM_BASE || + MAKE_POINTER(seg, off) >= ROM_BASE + ROM_SIZE) { + ErrorF("BIOS pointer (seg %x off %x) doesn't point at ROM\n", + seg, off); + return -1; + } + memcpy(&(LM(vi,vi->ret_code)), retcode_data, sizeof(retcode_data)); + vi->vms.regs.ss = POINTER_SEGMENT(vi->stack_base); + vi->vms.regs.esp = STACK_SIZE; + PUSHW(vi, POINTER_SEGMENT(vi->ret_code)); + PUSHW(vi, POINTER_OFFSET(vi->ret_code)); + vi->vms.regs.cs = seg; + vi->vms.regs.eip = off; + OsBlockSignals (); + code = vm86_loop(vi); + OsReleaseSignals (); + if(code < 0) { + ErrorF("vm86 failed (errno %d)\n", errno); + return -1; + } else if(code != 0) { + ErrorF("vm86 returned 0x%04X\n", code); + return -1; + } else + return 0; +} + #define DEBUG_VBE 0 #if DEBUG_VBE #define DBG(x) ErrorF x; usleep(10*1000) diff --git a/hw/kdrive/vesa/vm86.h b/hw/kdrive/vesa/vm86.h index dce777b39..bd1ad43c0 100644 --- a/hw/kdrive/vesa/vm86.h +++ b/hw/kdrive/vesa/vm86.h @@ -136,6 +136,9 @@ Vm86Cleanup(Vm86InfoPtr vi); int Vm86DoInterrupt(Vm86InfoPtr vi, int num); +int +Vm86DoPOST(Vm86InfoPtr vi); + int Vm86IsMemory(Vm86InfoPtr vi, U32 i);