Commit 8454df8b1e7662bdbe423e6494200a5aa9d619ae

Authored by bellard
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; \
... ...