control: Recalc framebuffer after each change.

This commit is contained in:
joevt
2024-01-29 17:41:34 -08:00
committed by dingusdev
parent b42437c458
commit 08fca7de69

View File

@@ -312,9 +312,23 @@ void ControlVideo::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
switch (offset >> 4) { switch (offset >> 4) {
case ControlRegs::PIPE_DELAY: case ControlRegs::PIPE_DELAY:
this->swatch_params[(offset >> 4) - ControlRegs::VFPEQ] = value & 0x3FF; this->swatch_params[(offset >> 4) - ControlRegs::VFPEQ] = value & 0x3FF;
if (value & ~0x3FF)
LOG_F(ERROR, "%s: write PIPE_DELAY %03x.%c = %0*x", this->name.c_str(), offset, SIZE_ARG(size), size * 2, value);
else
LOG_F(CONTROL, "%s: write PIPE_DELAY %03x.%c = %0*x", this->name.c_str(), offset, SIZE_ARG(size), size * 2, value);
if (this->display_enabled) {
this->enable_display();
}
break; break;
case ControlRegs::HEQ: case ControlRegs::HEQ:
this->swatch_params[(offset >> 4) - ControlRegs::VFPEQ] = value & 0xFFU; this->swatch_params[(offset >> 4) - ControlRegs::VFPEQ] = value & 0xFFU;
if (value & ~0xFFU)
LOG_F(ERROR, "%s: write HEQ %03x.%c = %0*x", this->name.c_str(), offset, SIZE_ARG(size), size * 2, value);
else
LOG_F(CONTROL, "%s: write HEQ %03x.%c = %0*x", this->name.c_str(), offset, SIZE_ARG(size), size * 2, value);
if (this->display_enabled) {
this->enable_display();
}
break; break;
case ControlRegs::VFPEQ: case ControlRegs::VFPEQ:
case ControlRegs::VFP: case ControlRegs::VFP:
@@ -331,6 +345,13 @@ void ControlVideo::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
case ControlRegs::HLFLN: case ControlRegs::HLFLN:
case ControlRegs::HSERR: case ControlRegs::HSERR:
this->swatch_params[(offset >> 4) - ControlRegs::VFPEQ] = value & 0xFFF; this->swatch_params[(offset >> 4) - ControlRegs::VFPEQ] = value & 0xFFF;
if (value & ~0xFFF)
LOG_F(ERROR, "%s: write %s %03x.%c = %0*x", this->name.c_str(), get_name_controlreg(offset), offset, SIZE_ARG(size), size * 2, value);
else
LOG_F(CONTROL, "%s: write %s %03x.%c = %0*x", this->name.c_str(), get_name_controlreg(offset), offset, SIZE_ARG(size), size * 2, value);
if (this->display_enabled) {
this->enable_display();
}
break; break;
case ControlRegs::CNTTST: case ControlRegs::CNTTST:
if (value) if (value)
@@ -346,10 +367,13 @@ void ControlVideo::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
if (value & RESET_TIMING) { // count 0-to-1 transitions if (value & RESET_TIMING) { // count 0-to-1 transitions
this->strobe_counter++; this->strobe_counter++;
if (this->strobe_counter >= 2) { if (this->strobe_counter >= 2) {
if (value & DISABLE_TIMING) if (value & DISABLE_TIMING) {
disable_display(); disable_display();
else this->display_enabled = false;
} else {
enable_display(); enable_display();
this->display_enabled = true;
}
} }
} }
} else } else
@@ -357,9 +381,15 @@ void ControlVideo::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
break; break;
case ControlRegs::GBASE: case ControlRegs::GBASE:
this->fb_base = value & 0x3FFFE0; this->fb_base = value & 0x3FFFE0;
if (this->display_enabled) {
this->enable_display();
}
break; break;
case ControlRegs::ROW_WORDS: case ControlRegs::ROW_WORDS:
this->row_words = value & 0x7FE0; this->row_words = value & 0x7FE0;
if (this->display_enabled) {
this->enable_display();
}
break; break;
case ControlRegs::MON_SENSE: { case ControlRegs::MON_SENSE: {
uint8_t dirs = ((value >> 3) & 7) ^ 7; uint8_t dirs = ((value >> 3) & 7) ^ 7;
@@ -383,6 +413,9 @@ void ControlVideo::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
break; break;
case ControlRegs::GSC_DIVIDE: case ControlRegs::GSC_DIVIDE:
this->clock_divider = value & 3; this->clock_divider = value & 3;
if (this->display_enabled) {
this->enable_display();
}
break; break;
case ControlRegs::REFRESH_COUNT: case ControlRegs::REFRESH_COUNT:
LOG_F(9, "Control: VRAM refresh count set to %d", value); LOG_F(9, "Control: VRAM refresh count set to %d", value);