1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-30 19:30:17 +00:00
CLK/Machines/ZX8081/Video.hpp

57 lines
1.5 KiB
C++
Raw Normal View History

//
// Video.hpp
// Clock Signal
//
// Created by Thomas Harte on 06/06/2017.
// Copyright 2017 Thomas Harte. All rights reserved.
//
#ifndef Machines_ZX8081_Video_hpp
#define Machines_ZX8081_Video_hpp
#include "../../Outputs/CRT/CRT.hpp"
#include "../../ClockReceiver/ClockReceiver.hpp"
namespace ZX8081 {
2017-06-06 22:01:33 +00:00
/*!
Packages a ZX80/81-style video feed into a CRT-compatible waveform.
While sync is active, this feed will output the sync level.
While sync is inactive, this feed will output the white level unless it is supplied
with a byte to output. When a byte is supplied for output, it will be interpreted as
a 1-bit graphic and output over the next 4 cycles, picking between the white level
and the black level.
*/
class Video {
public:
2017-06-06 22:01:33 +00:00
/// Constructs an instance of the video feed; a CRT is also created.
Video();
2017-06-06 22:01:33 +00:00
/// @returns The CRT this video feed is feeding.
Outputs::CRT::CRT *get_crt();
2017-06-06 22:01:33 +00:00
2018-04-15 22:00:51 +00:00
/// Advances time by @c half-cycles.
void run_for(const HalfCycles);
2017-06-06 22:01:33 +00:00
/// Forces output to catch up to the current output position.
void flush();
2017-06-06 22:01:33 +00:00
/// Sets the current sync output.
void set_sync(bool sync);
2017-06-06 22:01:33 +00:00
/// Causes @c byte to be serialised into pixels and output over the next four cycles.
void output_byte(uint8_t byte);
private:
bool sync_ = false;
uint8_t *line_data_ = nullptr;
uint8_t *line_data_pointer_ = nullptr;
unsigned int cycles_since_update_ = 0;
std::unique_ptr<Outputs::CRT::CRT> crt_;
2017-06-06 22:01:33 +00:00
void flush(bool next_sync);
};
}
#endif /* Video_hpp */