Revision 546fa6ab hw/vga.c
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; |
Also available in: Unified diff