Commit a41bc9af8fc6fe89a7539f1c00e743f69643d744
1 parent
3bfd9da1
explicited S3 specific code - added more debug code
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@497 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
43 additions
and
3 deletions
hw/vga.c
... | ... | @@ -50,6 +50,10 @@ |
50 | 50 | |
51 | 51 | //#define DEBUG_VGA |
52 | 52 | //#define DEBUG_VGA_MEM |
53 | +//#define DEBUG_VGA_REG | |
54 | + | |
55 | +//#define DEBUG_S3 | |
56 | +#define CONFIG_S3VGA | |
53 | 57 | |
54 | 58 | #define MSR_COLOR_EMULATION 0x01 |
55 | 59 | #define MSR_PAGE_SELECT 0x20 |
... | ... | @@ -252,6 +256,9 @@ static uint32_t vga_ioport_read(CPUX86State *env, uint32_t addr) |
252 | 256 | break; |
253 | 257 | case 0x3c5: |
254 | 258 | val = s->sr[s->sr_index]; |
259 | +#ifdef DEBUG_VGA_REG | |
260 | + printf("vga: read SR%x = 0x%02x\n", s->sr_index, val); | |
261 | +#endif | |
255 | 262 | break; |
256 | 263 | case 0x3c7: |
257 | 264 | val = s->dac_state; |
... | ... | @@ -274,6 +281,9 @@ static uint32_t vga_ioport_read(CPUX86State *env, uint32_t addr) |
274 | 281 | break; |
275 | 282 | case 0x3cf: |
276 | 283 | val = s->gr[s->gr_index]; |
284 | +#ifdef DEBUG_VGA_REG | |
285 | + printf("vga: read GR%x = 0x%02x\n", s->gr_index, val); | |
286 | +#endif | |
277 | 287 | break; |
278 | 288 | case 0x3b4: |
279 | 289 | case 0x3d4: |
... | ... | @@ -282,6 +292,14 @@ static uint32_t vga_ioport_read(CPUX86State *env, uint32_t addr) |
282 | 292 | case 0x3b5: |
283 | 293 | case 0x3d5: |
284 | 294 | val = s->cr[s->cr_index]; |
295 | +#ifdef DEBUG_VGA_REG | |
296 | + printf("vga: read CR%x = 0x%02x\n", s->cr_index, val); | |
297 | +#endif | |
298 | +#ifdef DEBUG_S3 | |
299 | + if (s->cr_index >= 0x20) | |
300 | + printf("S3: CR read index=0x%x val=0x%x\n", | |
301 | + s->cr_index, val); | |
302 | +#endif | |
285 | 303 | break; |
286 | 304 | case 0x3ba: |
287 | 305 | case 0x3da: |
... | ... | @@ -354,6 +372,9 @@ static void vga_ioport_write(CPUX86State *env, uint32_t addr, uint32_t val) |
354 | 372 | s->sr_index = val & 7; |
355 | 373 | break; |
356 | 374 | case 0x3c5: |
375 | +#ifdef DEBUG_VGA_REG | |
376 | + printf("vga: write SR%x = 0x%02x\n", s->sr_index, val); | |
377 | +#endif | |
357 | 378 | s->sr[s->sr_index] = val & sr_mask[s->sr_index]; |
358 | 379 | break; |
359 | 380 | case 0x3c7: |
... | ... | @@ -378,6 +399,9 @@ static void vga_ioport_write(CPUX86State *env, uint32_t addr, uint32_t val) |
378 | 399 | s->gr_index = val & 0x0f; |
379 | 400 | break; |
380 | 401 | case 0x3cf: |
402 | +#ifdef DEBUG_VGA_REG | |
403 | + printf("vga: write GR%x = 0x%02x\n", s->gr_index, val); | |
404 | +#endif | |
381 | 405 | s->gr[s->gr_index] = val & gr_mask[s->gr_index]; |
382 | 406 | break; |
383 | 407 | case 0x3b4: |
... | ... | @@ -386,6 +410,9 @@ static void vga_ioport_write(CPUX86State *env, uint32_t addr, uint32_t val) |
386 | 410 | break; |
387 | 411 | case 0x3b5: |
388 | 412 | case 0x3d5: |
413 | +#ifdef DEBUG_VGA_REG | |
414 | + printf("vga: write CR%x = 0x%02x\n", s->cr_index, val); | |
415 | +#endif | |
389 | 416 | /* handle CR0-7 protection */ |
390 | 417 | if ((s->cr[11] & 0x80) && s->cr_index <= 7) { |
391 | 418 | /* can always write bit 4 of CR7 */ |
... | ... | @@ -403,6 +430,7 @@ static void vga_ioport_write(CPUX86State *env, uint32_t addr, uint32_t val) |
403 | 430 | s->cr[s->cr_index] = val; |
404 | 431 | break; |
405 | 432 | |
433 | +#ifdef CONFIG_S3VGA | |
406 | 434 | /* S3 registers */ |
407 | 435 | case 0x2d: |
408 | 436 | case 0x2e: |
... | ... | @@ -422,10 +450,16 @@ static void vga_ioport_write(CPUX86State *env, uint32_t addr, uint32_t val) |
422 | 450 | v = val & 3; |
423 | 451 | s->cr[0x69] = (s->cr[69] & ~0x0c) | (v << 2); |
424 | 452 | break; |
453 | +#endif | |
425 | 454 | default: |
426 | 455 | s->cr[s->cr_index] = val; |
427 | 456 | break; |
428 | 457 | } |
458 | +#ifdef DEBUG_S3 | |
459 | + if (s->cr_index >= 0x20) | |
460 | + printf("S3: CR write index=0x%x val=0x%x\n", | |
461 | + s->cr_index, val); | |
462 | +#endif | |
429 | 463 | break; |
430 | 464 | case 0x3ba: |
431 | 465 | case 0x3da: |
... | ... | @@ -507,7 +541,6 @@ static uint32_t vga_mem_readl(uint32_t addr) |
507 | 541 | return v; |
508 | 542 | } |
509 | 543 | |
510 | - | |
511 | 544 | /* called for accesses between 0xa0000 and 0xc0000 */ |
512 | 545 | void vga_mem_writeb(uint32_t addr, uint32_t val) |
513 | 546 | { |
... | ... | @@ -588,7 +621,7 @@ void vga_mem_writeb(uint32_t addr, uint32_t val) |
588 | 621 | case 3: |
589 | 622 | /* rotate */ |
590 | 623 | b = s->gr[3] & 7; |
591 | - val = ((val >> b) | (val << (8 - b))); | |
624 | + val = (val >> b) | (val << (8 - b)); | |
592 | 625 | |
593 | 626 | bit_mask = s->gr[8] & val; |
594 | 627 | val = mask16[s->gr[0]]; |
... | ... | @@ -787,15 +820,20 @@ static int update_basic_params(VGAState *s) |
787 | 820 | |
788 | 821 | full_update = 0; |
789 | 822 | /* compute line_offset in bytes */ |
823 | + line_offset = s->cr[0x13]; | |
824 | +#ifdef CONFIG_S3VGA | |
790 | 825 | v = (s->cr[0x51] >> 4) & 3; /* S3 extension */ |
791 | 826 | if (v == 0) |
792 | 827 | v = (s->cr[0x43] >> 2) & 1; /* S3 extension */ |
793 | - line_offset = s->cr[0x13] | (v << 8); | |
828 | + line_offset |= (v << 8); | |
829 | +#endif | |
794 | 830 | line_offset <<= 3; |
795 | 831 | |
796 | 832 | /* starting address */ |
797 | 833 | start_addr = s->cr[0x0d] | (s->cr[0x0c] << 8); |
834 | +#ifdef CONFIG_S3VGA | |
798 | 835 | start_addr |= (s->cr[0x69] & 0x1f) << 16; /* S3 extension */ |
836 | +#endif | |
799 | 837 | |
800 | 838 | /* line compare */ |
801 | 839 | line_compare = s->cr[0x18] | |
... | ... | @@ -1290,11 +1328,13 @@ void vga_update_display(void) |
1290 | 1328 | void vga_reset(VGAState *s) |
1291 | 1329 | { |
1292 | 1330 | memset(s, 0, sizeof(VGAState)); |
1331 | +#ifdef CONFIG_S3VGA | |
1293 | 1332 | /* chip ID for 8c968 */ |
1294 | 1333 | s->cr[0x2d] = 0x88; |
1295 | 1334 | s->cr[0x2e] = 0xb0; |
1296 | 1335 | s->cr[0x2f] = 0x01; /* XXX: check revision code */ |
1297 | 1336 | s->cr[0x30] = 0xe1; |
1337 | +#endif | |
1298 | 1338 | s->graphic_mode = -1; /* force full update */ |
1299 | 1339 | } |
1300 | 1340 | ... | ... |