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,10 +378,29 @@ static uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr) | ||
| 378 | VGAState *s = opaque; | 378 | VGAState *s = opaque; |
| 379 | uint32_t val; | 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 | val = 0; | 402 | val = 0; |
| 403 | + } | ||
| 385 | #ifdef DEBUG_BOCHS_VBE | 404 | #ifdef DEBUG_BOCHS_VBE |
| 386 | printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val); | 405 | printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val); |
| 387 | #endif | 406 | #endif |
| @@ -434,7 +453,8 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | @@ -434,7 +453,8 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | ||
| 434 | s->bank_offset = (val << 16); | 453 | s->bank_offset = (val << 16); |
| 435 | break; | 454 | break; |
| 436 | case VBE_DISPI_INDEX_ENABLE: | 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 | int h, shift_control; | 458 | int h, shift_control; |
| 439 | 459 | ||
| 440 | s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = | 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,7 +470,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | ||
| 450 | s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * | 470 | s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * |
| 451 | ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); | 471 | ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); |
| 452 | s->vbe_start_addr = 0; | 472 | s->vbe_start_addr = 0; |
| 453 | - | 473 | + |
| 454 | /* clear the screen (should be done in BIOS) */ | 474 | /* clear the screen (should be done in BIOS) */ |
| 455 | if (!(val & VBE_DISPI_NOCLEARMEM)) { | 475 | if (!(val & VBE_DISPI_NOCLEARMEM)) { |
| 456 | memset(s->vram_ptr, 0, | 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,7 +484,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | ||
| 464 | s->cr[0x13] = s->vbe_line_offset >> 3; | 484 | s->cr[0x13] = s->vbe_line_offset >> 3; |
| 465 | /* width */ | 485 | /* width */ |
| 466 | s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1; | 486 | s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1; |
| 467 | - /* height */ | 487 | + /* height (only meaningful if < 1024) */ |
| 468 | h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1; | 488 | h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1; |
| 469 | s->cr[0x12] = h; | 489 | s->cr[0x12] = h; |
| 470 | s->cr[0x07] = (s->cr[0x07] & ~0x42) | | 490 | s->cr[0x07] = (s->cr[0x07] & ~0x42) | |
| @@ -1310,11 +1330,19 @@ static void vga_get_resolution(VGAState *s, int *pwidth, int *pheight) | @@ -1310,11 +1330,19 @@ static void vga_get_resolution(VGAState *s, int *pwidth, int *pheight) | ||
| 1310 | { | 1330 | { |
| 1311 | int width, height; | 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 | *pwidth = width; | 1346 | *pwidth = width; |
| 1319 | *pheight = height; | 1347 | *pheight = height; |
| 1320 | } | 1348 | } |
hw/vga_int.h
| @@ -30,8 +30,9 @@ | @@ -30,8 +30,9 @@ | ||
| 30 | /* bochs VBE support */ | 30 | /* bochs VBE support */ |
| 31 | #define CONFIG_BOCHS_VBE | 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 | #define VBE_DISPI_INDEX_ID 0x0 | 37 | #define VBE_DISPI_INDEX_ID 0x0 |
| 37 | #define VBE_DISPI_INDEX_XRES 0x1 | 38 | #define VBE_DISPI_INDEX_XRES 0x1 |
| @@ -51,6 +52,8 @@ | @@ -51,6 +52,8 @@ | ||
| 51 | 52 | ||
| 52 | #define VBE_DISPI_DISABLED 0x00 | 53 | #define VBE_DISPI_DISABLED 0x00 |
| 53 | #define VBE_DISPI_ENABLED 0x01 | 54 | #define VBE_DISPI_ENABLED 0x01 |
| 55 | +#define VBE_DISPI_GETCAPS 0x02 | ||
| 56 | +#define VBE_DISPI_8BIT_DAC 0x20 | ||
| 54 | #define VBE_DISPI_LFB_ENABLED 0x40 | 57 | #define VBE_DISPI_LFB_ENABLED 0x40 |
| 55 | #define VBE_DISPI_NOCLEARMEM 0x80 | 58 | #define VBE_DISPI_NOCLEARMEM 0x80 |
| 56 | 59 | ||
| @@ -72,7 +75,7 @@ | @@ -72,7 +75,7 @@ | ||
| 72 | #endif /* !CONFIG_BOCHS_VBE */ | 75 | #endif /* !CONFIG_BOCHS_VBE */ |
| 73 | 76 | ||
| 74 | #define CH_ATTR_SIZE (160 * 100) | 77 | #define CH_ATTR_SIZE (160 * 100) |
| 75 | -#define VGA_MAX_HEIGHT 1024 | 78 | +#define VGA_MAX_HEIGHT 2048 |
| 76 | 79 | ||
| 77 | #define VGA_STATE_COMMON \ | 80 | #define VGA_STATE_COMMON \ |
| 78 | uint8_t *vram_ptr; \ | 81 | uint8_t *vram_ptr; \ |