Revision 8454df8b hw/vga.c

b/hw/vga.c
378 378
    VGAState *s = opaque;
379 379
    uint32_t val;
380 380

  
381
    if (s->vbe_index <= VBE_DISPI_INDEX_NB)
382
        val = s->vbe_regs[s->vbe_index];
383
    else
381
    if (s->vbe_index <= VBE_DISPI_INDEX_NB) {
382
        if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) {
383
            switch(s->vbe_index) {
384
                /* XXX: do not hardcode ? */
385
            case VBE_DISPI_INDEX_XRES:
386
                val = VBE_DISPI_MAX_XRES;
387
                break;
388
            case VBE_DISPI_INDEX_YRES:
389
                val = VBE_DISPI_MAX_YRES;
390
                break;
391
            case VBE_DISPI_INDEX_BPP:
392
                val = VBE_DISPI_MAX_BPP;
393
                break;
394
            default:
395
                val = s->vbe_regs[s->vbe_index]; 
396
                break;
397
            }
398
        } else {
399
            val = s->vbe_regs[s->vbe_index]; 
400
        }
401
    } else {
384 402
        val = 0;
403
    }
385 404
#ifdef DEBUG_BOCHS_VBE
386 405
    printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val);
387 406
#endif
......
434 453
            s->bank_offset = (val << 16);
435 454
            break;
436 455
        case VBE_DISPI_INDEX_ENABLE:
437
            if (val & VBE_DISPI_ENABLED) {
456
            if ((val & VBE_DISPI_ENABLED) &&
457
                !(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
438 458
                int h, shift_control;
439 459

  
440 460
                s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = 
......
450 470
                    s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * 
451 471
                        ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3);
452 472
                s->vbe_start_addr = 0;
453
                
473

  
454 474
                /* clear the screen (should be done in BIOS) */
455 475
                if (!(val & VBE_DISPI_NOCLEARMEM)) {
456 476
                    memset(s->vram_ptr, 0, 
......
464 484
                s->cr[0x13] = s->vbe_line_offset >> 3;
465 485
                /* width */
466 486
                s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1;
467
                /* height */
487
                /* height (only meaningful if < 1024) */
468 488
                h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1;
469 489
                s->cr[0x12] = h;
470 490
                s->cr[0x07] = (s->cr[0x07] & ~0x42) | 
......
1310 1330
{
1311 1331
    int width, height;
1312 1332
    
1313
    width = (s->cr[0x01] + 1) * 8;
1314
    height = s->cr[0x12] | 
1315
        ((s->cr[0x07] & 0x02) << 7) | 
1316
        ((s->cr[0x07] & 0x40) << 3);
1317
    height = (height + 1);
1333
#ifdef CONFIG_BOCHS_VBE
1334
    if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {
1335
        width = s->vbe_regs[VBE_DISPI_INDEX_XRES];
1336
        height = s->vbe_regs[VBE_DISPI_INDEX_YRES];
1337
    } else 
1338
#endif
1339
    {
1340
        width = (s->cr[0x01] + 1) * 8;
1341
        height = s->cr[0x12] | 
1342
            ((s->cr[0x07] & 0x02) << 7) | 
1343
            ((s->cr[0x07] & 0x40) << 3);
1344
        height = (height + 1);
1345
    }
1318 1346
    *pwidth = width;
1319 1347
    *pheight = height;
1320 1348
}

Also available in: Unified diff