mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-22 12:33:29 +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) {
|
||||
border_duration_ += next_event - window;
|
||||
} else {
|
||||
// TODO: something proper here.
|
||||
uint16_t *const colour_pointer = reinterpret_cast<uint16_t *>(crt_.begin_data(1));
|
||||
if(colour_pointer) *colour_pointer = 0xfff;
|
||||
crt_.output_level(next_event - window);
|
||||
if(!allocated_pointer_) {
|
||||
flush_pixels();
|
||||
pixel_pointer_ = allocated_pointer_ = reinterpret_cast<uint16_t *>(crt_.begin_data(allocation_size));
|
||||
}
|
||||
|
||||
// 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;
|
||||
if(window == left_margin_) {
|
||||
flush_border();
|
||||
state_ = State::Pixels;
|
||||
|
||||
// TODO: probably allocate some pixels here?
|
||||
}
|
||||
if(window == right_margin_) {
|
||||
flush_pixels();
|
||||
state_ = State::Border;
|
||||
|
||||
// TODO: probably output pixels here?
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -205,7 +217,7 @@ void Nick::run_for(HalfCycles duration) {
|
||||
if(state_ == State::Border) {
|
||||
flush_border();
|
||||
} else {
|
||||
// TODO: output pixels.
|
||||
flush_pixels();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -236,6 +248,14 @@ void Nick::flush_border() {
|
||||
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.
|
||||
|
||||
void Nick::set_scan_target(Outputs::Display::ScanTarget *scan_target) {
|
||||
|
@ -66,6 +66,12 @@ class Nick {
|
||||
// An accumulator for border output regions.
|
||||
int border_duration_ = 0;
|
||||
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