Commit 37dd208d38ab9f65f9e15fd7fe2f0b75bc83220a
1 parent
05f83f0f
VBE: 8 bit DACs + support for VBE BIOS IDs (Volker Ruppert)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2163 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
16 additions
and
4 deletions
hw/vga.c
| @@ -422,7 +422,9 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | @@ -422,7 +422,9 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | ||
| 422 | case VBE_DISPI_INDEX_ID: | 422 | case VBE_DISPI_INDEX_ID: |
| 423 | if (val == VBE_DISPI_ID0 || | 423 | if (val == VBE_DISPI_ID0 || |
| 424 | val == VBE_DISPI_ID1 || | 424 | val == VBE_DISPI_ID1 || |
| 425 | - val == VBE_DISPI_ID2) { | 425 | + val == VBE_DISPI_ID2 || |
| 426 | + val == VBE_DISPI_ID3 || | ||
| 427 | + val == VBE_DISPI_ID4) { | ||
| 426 | s->vbe_regs[s->vbe_index] = val; | 428 | s->vbe_regs[s->vbe_index] = val; |
| 427 | } | 429 | } |
| 428 | break; | 430 | break; |
| @@ -505,6 +507,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | @@ -505,6 +507,7 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) | ||
| 505 | /* XXX: the bios should do that */ | 507 | /* XXX: the bios should do that */ |
| 506 | s->bank_offset = 0; | 508 | s->bank_offset = 0; |
| 507 | } | 509 | } |
| 510 | + s->dac_8bit = (val & VBE_DISPI_8BIT_DAC) > 0; | ||
| 508 | s->vbe_regs[s->vbe_index] = val; | 511 | s->vbe_regs[s->vbe_index] = val; |
| 509 | break; | 512 | break; |
| 510 | case VBE_DISPI_INDEX_VIRT_WIDTH: | 513 | case VBE_DISPI_INDEX_VIRT_WIDTH: |
| @@ -921,9 +924,15 @@ static int update_palette256(VGAState *s) | @@ -921,9 +924,15 @@ static int update_palette256(VGAState *s) | ||
| 921 | palette = s->last_palette; | 924 | palette = s->last_palette; |
| 922 | v = 0; | 925 | v = 0; |
| 923 | for(i = 0; i < 256; i++) { | 926 | for(i = 0; i < 256; i++) { |
| 924 | - col = s->rgb_to_pixel(c6_to_8(s->palette[v]), | ||
| 925 | - c6_to_8(s->palette[v + 1]), | ||
| 926 | - c6_to_8(s->palette[v + 2])); | 927 | + if (s->dac_8bit) { |
| 928 | + col = s->rgb_to_pixel(s->palette[v], | ||
| 929 | + s->palette[v + 1], | ||
| 930 | + s->palette[v + 2]); | ||
| 931 | + } else { | ||
| 932 | + col = s->rgb_to_pixel(c6_to_8(s->palette[v]), | ||
| 933 | + c6_to_8(s->palette[v + 1]), | ||
| 934 | + c6_to_8(s->palette[v + 2])); | ||
| 935 | + } | ||
| 927 | if (col != palette[i]) { | 936 | if (col != palette[i]) { |
| 928 | full_update = 1; | 937 | full_update = 1; |
| 929 | palette[i] = col; | 938 | palette[i] = col; |
hw/vga_int.h
| @@ -49,6 +49,8 @@ | @@ -49,6 +49,8 @@ | ||
| 49 | #define VBE_DISPI_ID0 0xB0C0 | 49 | #define VBE_DISPI_ID0 0xB0C0 |
| 50 | #define VBE_DISPI_ID1 0xB0C1 | 50 | #define VBE_DISPI_ID1 0xB0C1 |
| 51 | #define VBE_DISPI_ID2 0xB0C2 | 51 | #define VBE_DISPI_ID2 0xB0C2 |
| 52 | +#define VBE_DISPI_ID3 0xB0C3 | ||
| 53 | +#define VBE_DISPI_ID4 0xB0C4 | ||
| 52 | 54 | ||
| 53 | #define VBE_DISPI_DISABLED 0x00 | 55 | #define VBE_DISPI_DISABLED 0x00 |
| 54 | #define VBE_DISPI_ENABLED 0x01 | 56 | #define VBE_DISPI_ENABLED 0x01 |
| @@ -103,6 +105,7 @@ | @@ -103,6 +105,7 @@ | ||
| 103 | uint8_t dac_read_index; \ | 105 | uint8_t dac_read_index; \ |
| 104 | uint8_t dac_write_index; \ | 106 | uint8_t dac_write_index; \ |
| 105 | uint8_t dac_cache[3]; /* used when writing */ \ | 107 | uint8_t dac_cache[3]; /* used when writing */ \ |
| 108 | + int dac_8bit; \ | ||
| 106 | uint8_t palette[768]; \ | 109 | uint8_t palette[768]; \ |
| 107 | int32_t bank_offset; \ | 110 | int32_t bank_offset; \ |
| 108 | int (*get_bpp)(struct VGAState *s); \ | 111 | int (*get_bpp)(struct VGAState *s); \ |