Commit 8454df8b1e7662bdbe423e6494200a5aa9d619ae
1 parent
99589bdc
support for Bochs VBE GETCAPS call so that -std-vga works again with new VGA BIO…
…Ses - added support for modes up to 1600x1200x32 in -std-vga case git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1957 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
45 additions
and
14 deletions
hw/vga.c
| ... | ... | @@ -378,10 +378,29 @@ static uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr) |
| 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,7 +453,8 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) |
| 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,7 +470,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) |
| 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,7 +484,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) |
| 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,11 +1330,19 @@ static void vga_get_resolution(VGAState *s, int *pwidth, int *pheight) |
| 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 | } | ... | ... |
hw/vga_int.h
| ... | ... | @@ -30,8 +30,9 @@ |
| 30 | 30 | /* bochs VBE support */ |
| 31 | 31 | #define CONFIG_BOCHS_VBE |
| 32 | 32 | |
| 33 | -#define VBE_DISPI_MAX_XRES 1024 | |
| 34 | -#define VBE_DISPI_MAX_YRES 768 | |
| 33 | +#define VBE_DISPI_MAX_XRES 1600 | |
| 34 | +#define VBE_DISPI_MAX_YRES 1200 | |
| 35 | +#define VBE_DISPI_MAX_BPP 32 | |
| 35 | 36 | |
| 36 | 37 | #define VBE_DISPI_INDEX_ID 0x0 |
| 37 | 38 | #define VBE_DISPI_INDEX_XRES 0x1 |
| ... | ... | @@ -51,6 +52,8 @@ |
| 51 | 52 | |
| 52 | 53 | #define VBE_DISPI_DISABLED 0x00 |
| 53 | 54 | #define VBE_DISPI_ENABLED 0x01 |
| 55 | +#define VBE_DISPI_GETCAPS 0x02 | |
| 56 | +#define VBE_DISPI_8BIT_DAC 0x20 | |
| 54 | 57 | #define VBE_DISPI_LFB_ENABLED 0x40 |
| 55 | 58 | #define VBE_DISPI_NOCLEARMEM 0x80 |
| 56 | 59 | |
| ... | ... | @@ -72,7 +75,7 @@ |
| 72 | 75 | #endif /* !CONFIG_BOCHS_VBE */ |
| 73 | 76 | |
| 74 | 77 | #define CH_ATTR_SIZE (160 * 100) |
| 75 | -#define VGA_MAX_HEIGHT 1024 | |
| 78 | +#define VGA_MAX_HEIGHT 2048 | |
| 76 | 79 | |
| 77 | 80 | #define VGA_STATE_COMMON \ |
| 78 | 81 | uint8_t *vram_ptr; \ | ... | ... |