Commit 546fa6abd13240365ffd7afb5fd8795617a9131e

Authored by bellard
1 parent e875c40a

vga font change detection


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1141 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 17 additions and 5 deletions
hw/vga.c
... ... @@ -662,7 +662,7 @@ static uint32_t vga_mem_readl(void *opaque, target_phys_addr_t addr)
662 662 void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
663 663 {
664 664 VGAState *s = opaque;
665   - int memory_map_mode, plane, write_mode, b, func_select;
  665 + int memory_map_mode, plane, write_mode, b, func_select, mask;
666 666 uint32_t write_mask, bit_mask, set_mask;
667 667  
668 668 #ifdef DEBUG_VGA_MEM
... ... @@ -695,22 +695,26 @@ void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
695 695 if (s->sr[4] & 0x08) {
696 696 /* chain 4 mode : simplest access */
697 697 plane = addr & 3;
698   - if (s->sr[2] & (1 << plane)) {
  698 + mask = (1 << plane);
  699 + if (s->sr[2] & mask) {
699 700 s->vram_ptr[addr] = val;
700 701 #ifdef DEBUG_VGA_MEM
701 702 printf("vga: chain4: [0x%x]\n", addr);
702 703 #endif
  704 + s->plane_updated |= mask; /* only used to detect font change */
703 705 cpu_physical_memory_set_dirty(s->vram_offset + addr);
704 706 }
705 707 } else if (s->gr[5] & 0x10) {
706 708 /* odd/even mode (aka text mode mapping) */
707 709 plane = (s->gr[4] & 2) | (addr & 1);
708   - if (s->sr[2] & (1 << plane)) {
  710 + mask = (1 << plane);
  711 + if (s->sr[2] & mask) {
709 712 addr = ((addr & ~1) << 1) | plane;
710 713 s->vram_ptr[addr] = val;
711 714 #ifdef DEBUG_VGA_MEM
712 715 printf("vga: odd/even: [0x%x]\n", addr);
713 716 #endif
  717 + s->plane_updated |= mask; /* only used to detect font change */
714 718 cpu_physical_memory_set_dirty(s->vram_offset + addr);
715 719 }
716 720 } else {
... ... @@ -775,7 +779,9 @@ void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
775 779  
776 780 do_write:
777 781 /* mask data according to sr[2] */
778   - write_mask = mask16[s->sr[2]];
  782 + mask = s->sr[2];
  783 + s->plane_updated |= mask; /* only used to detect font change */
  784 + write_mask = mask16[mask];
779 785 ((uint32_t *)s->vram_ptr)[addr] =
780 786 (((uint32_t *)s->vram_ptr)[addr] & ~write_mask) |
781 787 (val & write_mask);
... ... @@ -1088,7 +1094,12 @@ static void vga_draw_text(VGAState *s, int full_update)
1088 1094 s->font_offsets[1] = offset;
1089 1095 full_update = 1;
1090 1096 }
1091   -
  1097 + if (s->plane_updated & (1 << 2)) {
  1098 + /* if the plane 2 was modified since the last display, it
  1099 + indicates the font may have been modified */
  1100 + s->plane_updated = 0;
  1101 + full_update = 1;
  1102 + }
1092 1103 full_update |= update_basic_params(s);
1093 1104  
1094 1105 line_offset = s->line_offset;
... ...
hw/vga_int.h
... ... @@ -116,6 +116,7 @@
116 116 uint32_t line_offset; \
117 117 uint32_t line_compare; \
118 118 uint32_t start_addr; \
  119 + uint32_t plane_updated; \
119 120 uint8_t last_cw, last_ch; \
120 121 uint32_t last_width, last_height; /* in chars or pixels */ \
121 122 uint32_t last_scr_width, last_scr_height; /* in pixels */ \
... ...