mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Adds an allocator for pixels.
This commit is contained in:
parent
5fc91effb5
commit
e94e051c87
@ -179,23 +179,35 @@ void Nick::run_for(HalfCycles duration) {
|
|||||||
if(state_ == State::Border) {
|
if(state_ == State::Border) {
|
||||||
border_duration_ += next_event - window;
|
border_duration_ += next_event - window;
|
||||||
} else {
|
} else {
|
||||||
// TODO: something proper here.
|
if(!allocated_pointer_) {
|
||||||
uint16_t *const colour_pointer = reinterpret_cast<uint16_t *>(crt_.begin_data(1));
|
flush_pixels();
|
||||||
if(colour_pointer) *colour_pointer = 0xfff;
|
pixel_pointer_ = allocated_pointer_ = reinterpret_cast<uint16_t *>(crt_.begin_data(allocation_size));
|
||||||
crt_.output_level(next_event - window);
|
}
|
||||||
|
|
||||||
|
// TODO: real pixels.
|
||||||
|
if(allocated_pointer_) {
|
||||||
|
for(int c = 0; c < next_event - window; c++) {
|
||||||
|
pixel_pointer_[0] = uint16_t(0xfff ^ (window + c));
|
||||||
|
++pixel_pointer_;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pixel_pointer_ += next_event - window;
|
||||||
|
}
|
||||||
|
|
||||||
|
pixel_duration_ += next_event - window;
|
||||||
|
if(pixel_pointer_ - allocated_pointer_ == allocation_size) {
|
||||||
|
flush_pixels();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window = next_event;
|
window = next_event;
|
||||||
if(window == left_margin_) {
|
if(window == left_margin_) {
|
||||||
flush_border();
|
flush_border();
|
||||||
state_ = State::Pixels;
|
state_ = State::Pixels;
|
||||||
|
|
||||||
// TODO: probably allocate some pixels here?
|
|
||||||
}
|
}
|
||||||
if(window == right_margin_) {
|
if(window == right_margin_) {
|
||||||
|
flush_pixels();
|
||||||
state_ = State::Border;
|
state_ = State::Border;
|
||||||
|
|
||||||
// TODO: probably output pixels here?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -205,7 +217,7 @@ void Nick::run_for(HalfCycles duration) {
|
|||||||
if(state_ == State::Border) {
|
if(state_ == State::Border) {
|
||||||
flush_border();
|
flush_border();
|
||||||
} else {
|
} else {
|
||||||
// TODO: output pixels.
|
flush_pixels();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -236,6 +248,14 @@ void Nick::flush_border() {
|
|||||||
border_duration_ = 0;
|
border_duration_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Nick::flush_pixels() {
|
||||||
|
if(!pixel_duration_) return;
|
||||||
|
crt_.output_data(pixel_duration_, size_t(pixel_pointer_ - allocated_pointer_));
|
||||||
|
pixel_duration_ = 0;
|
||||||
|
pixel_pointer_ = nullptr;
|
||||||
|
allocated_pointer_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - CRT passthroughs.
|
// MARK: - CRT passthroughs.
|
||||||
|
|
||||||
void Nick::set_scan_target(Outputs::Display::ScanTarget *scan_target) {
|
void Nick::set_scan_target(Outputs::Display::ScanTarget *scan_target) {
|
||||||
|
@ -66,6 +66,12 @@ class Nick {
|
|||||||
// An accumulator for border output regions.
|
// An accumulator for border output regions.
|
||||||
int border_duration_ = 0;
|
int border_duration_ = 0;
|
||||||
void flush_border();
|
void flush_border();
|
||||||
|
|
||||||
|
// The destination for new pixels.
|
||||||
|
static constexpr int allocation_size = 320;
|
||||||
|
uint16_t *pixel_pointer_ = nullptr, *allocated_pointer_ = nullptr;
|
||||||
|
int pixel_duration_ = 0;
|
||||||
|
void flush_pixels();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user