Revision 546fa6ab

b/hw/vga.c
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 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 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 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;
b/hw/vga_int.h
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 */           \

Also available in: Unified diff