mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-28 07:29:45 +00:00
Introduces filtering of the CRTC's vsync signal into the gate array.
This commit is contained in:
parent
cc8380c286
commit
f075fea78c
@ -147,7 +147,8 @@ class CRTCBusHandler {
|
|||||||
interrupt_timer_(interrupt_timer),
|
interrupt_timer_(interrupt_timer),
|
||||||
pixel_divider_(1),
|
pixel_divider_(1),
|
||||||
mode_(2),
|
mode_(2),
|
||||||
next_mode_(2) {
|
next_mode_(2),
|
||||||
|
cycles_into_hsync_(0) {
|
||||||
build_mode_tables();
|
build_mode_tables();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,8 +157,19 @@ class CRTCBusHandler {
|
|||||||
to produce based on the current palette and mode.
|
to produce based on the current palette and mode.
|
||||||
*/
|
*/
|
||||||
inline void perform_bus_cycle(const Motorola::CRTC::BusState &state) {
|
inline void perform_bus_cycle(const Motorola::CRTC::BusState &state) {
|
||||||
|
// The gate array waits 2µs to react to the CRTC's vsync signal, and then
|
||||||
|
// caps output at 4µs. Since the clock rate is 1Mhz, that's 2 and 4 cycles,
|
||||||
|
// respectively.
|
||||||
|
if(state.hsync) {
|
||||||
|
cycles_into_hsync_++;
|
||||||
|
} else {
|
||||||
|
cycles_into_hsync_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_hsync = (cycles_into_hsync_ >= 2 && cycles_into_hsync_ < 6);
|
||||||
|
|
||||||
// Sync is taken to override pixels, and is combined as a simple OR.
|
// Sync is taken to override pixels, and is combined as a simple OR.
|
||||||
bool is_sync = state.hsync || state.vsync;
|
bool is_sync = is_hsync || state.vsync;
|
||||||
|
|
||||||
// If a transition between sync/border/pixels just occurred, flush whatever was
|
// If a transition between sync/border/pixels just occurred, flush whatever was
|
||||||
// in progress to the CRT and reset counting.
|
// in progress to the CRT and reset counting.
|
||||||
@ -238,7 +250,7 @@ class CRTCBusHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for a trailing hsync; if one occurred then that's the trigger potentially to change
|
// check for a trailing CRTC hsync; if one occurred then that's the trigger potentially to change
|
||||||
// modes, and should also be sent on to the interrupt timer
|
// modes, and should also be sent on to the interrupt timer
|
||||||
if(was_hsync_ && !state.hsync) {
|
if(was_hsync_ && !state.hsync) {
|
||||||
if(mode_ != next_mode_) {
|
if(mode_ != next_mode_) {
|
||||||
@ -377,7 +389,10 @@ class CRTCBusHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int cycles_;
|
unsigned int cycles_;
|
||||||
|
|
||||||
bool was_enabled_, was_sync_, was_hsync_, was_vsync_;
|
bool was_enabled_, was_sync_, was_hsync_, was_vsync_;
|
||||||
|
int cycles_into_hsync_;
|
||||||
|
|
||||||
std::shared_ptr<Outputs::CRT::CRT> crt_;
|
std::shared_ptr<Outputs::CRT::CRT> crt_;
|
||||||
uint8_t *pixel_data_, *pixel_pointer_;
|
uint8_t *pixel_data_, *pixel_pointer_;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user