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; \ | ... | ... |