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;
|