support for Bochs VBE GETCAPS call so that -std-vga works again with new VGA BIOSes - 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
This commit is contained in:
bellard 2006-06-13 16:37:40 +00:00
parent 99589bdcd1
commit 8454df8b1e
2 changed files with 45 additions and 14 deletions

View File

@ -378,10 +378,29 @@ static uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr)
VGAState *s = opaque; VGAState *s = opaque;
uint32_t val; uint32_t val;
if (s->vbe_index <= VBE_DISPI_INDEX_NB) if (s->vbe_index <= VBE_DISPI_INDEX_NB) {
val = s->vbe_regs[s->vbe_index]; if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) {
else switch(s->vbe_index) {
/* XXX: do not hardcode ? */
case VBE_DISPI_INDEX_XRES:
val = VBE_DISPI_MAX_XRES;
break;
case VBE_DISPI_INDEX_YRES:
val = VBE_DISPI_MAX_YRES;
break;
case VBE_DISPI_INDEX_BPP:
val = VBE_DISPI_MAX_BPP;
break;
default:
val = s->vbe_regs[s->vbe_index];
break;
}
} else {
val = s->vbe_regs[s->vbe_index];
}
} else {
val = 0; val = 0;
}
#ifdef DEBUG_BOCHS_VBE #ifdef DEBUG_BOCHS_VBE
printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val); printf("VBE: read index=0x%x val=0x%x\n", s->vbe_index, val);
#endif #endif
@ -434,7 +453,8 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
s->bank_offset = (val << 16); s->bank_offset = (val << 16);
break; break;
case VBE_DISPI_INDEX_ENABLE: case VBE_DISPI_INDEX_ENABLE:
if (val & VBE_DISPI_ENABLED) { if ((val & VBE_DISPI_ENABLED) &&
!(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
int h, shift_control; int h, shift_control;
s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = 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)
s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] *
((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3);
s->vbe_start_addr = 0; s->vbe_start_addr = 0;
/* clear the screen (should be done in BIOS) */ /* clear the screen (should be done in BIOS) */
if (!(val & VBE_DISPI_NOCLEARMEM)) { if (!(val & VBE_DISPI_NOCLEARMEM)) {
memset(s->vram_ptr, 0, memset(s->vram_ptr, 0,
@ -464,7 +484,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
s->cr[0x13] = s->vbe_line_offset >> 3; s->cr[0x13] = s->vbe_line_offset >> 3;
/* width */ /* width */
s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1; s->cr[0x01] = (s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1;
/* height */ /* height (only meaningful if < 1024) */
h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1; h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1;
s->cr[0x12] = h; s->cr[0x12] = h;
s->cr[0x07] = (s->cr[0x07] & ~0x42) | s->cr[0x07] = (s->cr[0x07] & ~0x42) |
@ -1310,11 +1330,19 @@ static void vga_get_resolution(VGAState *s, int *pwidth, int *pheight)
{ {
int width, height; int width, height;
width = (s->cr[0x01] + 1) * 8; #ifdef CONFIG_BOCHS_VBE
height = s->cr[0x12] | if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {
((s->cr[0x07] & 0x02) << 7) | width = s->vbe_regs[VBE_DISPI_INDEX_XRES];
((s->cr[0x07] & 0x40) << 3); height = s->vbe_regs[VBE_DISPI_INDEX_YRES];
height = (height + 1); } else
#endif
{
width = (s->cr[0x01] + 1) * 8;
height = s->cr[0x12] |
((s->cr[0x07] & 0x02) << 7) |
((s->cr[0x07] & 0x40) << 3);
height = (height + 1);
}
*pwidth = width; *pwidth = width;
*pheight = height; *pheight = height;
} }

View File

@ -30,8 +30,9 @@
/* bochs VBE support */ /* bochs VBE support */
#define CONFIG_BOCHS_VBE #define CONFIG_BOCHS_VBE
#define VBE_DISPI_MAX_XRES 1024 #define VBE_DISPI_MAX_XRES 1600
#define VBE_DISPI_MAX_YRES 768 #define VBE_DISPI_MAX_YRES 1200
#define VBE_DISPI_MAX_BPP 32
#define VBE_DISPI_INDEX_ID 0x0 #define VBE_DISPI_INDEX_ID 0x0
#define VBE_DISPI_INDEX_XRES 0x1 #define VBE_DISPI_INDEX_XRES 0x1
@ -51,6 +52,8 @@
#define VBE_DISPI_DISABLED 0x00 #define VBE_DISPI_DISABLED 0x00
#define VBE_DISPI_ENABLED 0x01 #define VBE_DISPI_ENABLED 0x01
#define VBE_DISPI_GETCAPS 0x02
#define VBE_DISPI_8BIT_DAC 0x20
#define VBE_DISPI_LFB_ENABLED 0x40 #define VBE_DISPI_LFB_ENABLED 0x40
#define VBE_DISPI_NOCLEARMEM 0x80 #define VBE_DISPI_NOCLEARMEM 0x80
@ -72,7 +75,7 @@
#endif /* !CONFIG_BOCHS_VBE */ #endif /* !CONFIG_BOCHS_VBE */
#define CH_ATTR_SIZE (160 * 100) #define CH_ATTR_SIZE (160 * 100)
#define VGA_MAX_HEIGHT 1024 #define VGA_MAX_HEIGHT 2048
#define VGA_STATE_COMMON \ #define VGA_STATE_COMMON \
uint8_t *vram_ptr; \ uint8_t *vram_ptr; \