Commit 546fa6abd13240365ffd7afb5fd8795617a9131e
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 */ \ | ... | ... |