1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-28 21:49:27 +00:00

Starts towards bitplane collection.

This commit is contained in:
Thomas Harte 2021-08-10 19:01:41 -04:00
parent fdd02ad6a6
commit ec9cb21fae
2 changed files with 48 additions and 22 deletions

View File

@ -220,31 +220,29 @@ template <int cycle> void Chipset::output() {
template <int cycle, bool stop_if_cpu> bool Chipset::perform_cycle() { template <int cycle, bool stop_if_cpu> bool Chipset::perform_cycle() {
constexpr auto BlitterFlag = DMAMask<DMAFlag::Blitter, DMAFlag::AllBelow>::value; constexpr auto BlitterFlag = DMAMask<DMAFlag::Blitter, DMAFlag::AllBelow>::value;
constexpr auto BitplaneFlag = DMAMask<DMAFlag::Bitplane, DMAFlag::AllBelow>::value;
constexpr auto CopperFlag = DMAMask<DMAFlag::Copper, DMAFlag::AllBelow>::value; constexpr auto CopperFlag = DMAMask<DMAFlag::Copper, DMAFlag::AllBelow>::value;
constexpr auto DiskFlag = DMAMask<DMAFlag::Disk, DMAFlag::AllBelow>::value; constexpr auto DiskFlag = DMAMask<DMAFlag::Disk, DMAFlag::AllBelow>::value;
if constexpr (cycle & 1) { // Update state as to whether bitplane fetching should happen now.
// Odd slot priority is: //
// // TODO: figure out how the hard stops factor into this.
// 1. Bitplanes. fetch_horizontal_ |= cycle == display_window_start_[0];
// 2. Copper, if interested. fetch_horizontal_ &= cycle != display_window_stop_[0];
// 3. Blitter.
// 4. CPU.
if((dma_control_ & CopperFlag) == CopperFlag) {
if(copper_.advance(uint16_t(((y_ & 0xff) << 8) | (cycle & 0xfe)))) {
return false;
}
} else {
copper_.stop();
}
} else { // Top priority: bitplane collection.
// Even slot use/priority: if(fetch_horizontal_ && fetch_vertical_ && (dma_control_ & BitplaneFlag) == BitplaneFlag) {
// TODO: offer a cycle for bitplane collection.
// Probably need to indicate odd or even?
}
if constexpr (cycle & 1) {
// Odd slot use/priority:
// //
// 1. Bitplane fetches. // 1. Bitplane fetches [dealt with above].
// 2. Disk, then audio, then sprites depending on region. // 2. Refresh, disk, audio, or sprites. Depending on region.
// 3. Blitter. //
// 4. CPU. // Blitter and CPU priority is dealt with below.
if constexpr (cycle >= 4 && cycle <= 6) { if constexpr (cycle >= 4 && cycle <= 6) {
if((dma_control_ & DiskFlag) == DiskFlag) { if((dma_control_ & DiskFlag) == DiskFlag) {
if(disk_.advance()) { if(disk_.advance()) {
@ -252,6 +250,18 @@ template <int cycle, bool stop_if_cpu> bool Chipset::perform_cycle() {
} }
} }
} }
} else {
// Bitplanes being dealt with, specific odd-cycle responsibility
// is just possibly to pass to the Copper.
//
// The Blitter and CPU are dealt with outside of the odd/even test.
if((dma_control_ & CopperFlag) == CopperFlag) {
if(copper_.advance(uint16_t(((y_ & 0xff) << 8) | (cycle & 0xfe)))) {
return false;
}
} else {
copper_.stop();
}
} }
// Down here: give first refusal to the Blitter, otherwise // Down here: give first refusal to the Blitter, otherwise
@ -335,6 +345,9 @@ template <bool stop_on_cpu> Chipset::Changes Chipset::run(HalfCycles length) {
line_cycle_ = 0; line_cycle_ = 0;
++y_; ++y_;
fetch_vertical_ |= y_ == display_window_start_[1];
fetch_vertical_ &= y_ != display_window_stop_[1];
if(y_ == frame_height_) { if(y_ == frame_height_) {
++changes.vsyncs; ++changes.vsyncs;
interrupt_requests_ |= InterruptMask<InterruptFlag::VerticalBlank>::value; interrupt_requests_ |= InterruptMask<InterruptFlag::VerticalBlank>::value;

View File

@ -137,17 +137,30 @@ class Chipset {
void set_image_data(int slot, uint16_t value); void set_image_data(int slot, uint16_t value);
} sprites_[8]; } sprites_[8];
// MARK: - Raster. // MARK: - Raster position and state.
int line_cycle_ = 0, y_ = 0; // Definitions related to PAL/NTSC.
int line_length_ = 227; int line_length_ = 227;
int frame_height_ = 312; int frame_height_ = 312;
int vertical_blank_height_ = 29; int vertical_blank_height_ = 29;
// Current raster position.
int line_cycle_ = 0, y_ = 0;
// class Bitplanes: public DMADevice {
//
// };
// Parameters affecting bitplane collection and output.
uint16_t display_window_start_[2] = {0, 0}; uint16_t display_window_start_[2] = {0, 0};
uint16_t display_window_stop_[2] = {0, 0}; uint16_t display_window_stop_[2] = {0, 0};
uint16_t fetch_window_[2] = {0, 0}; uint16_t fetch_window_[2] = {0, 0};
// Ephemeral bitplane collection state.
bool fetch_vertical_ = false, fetch_horizontal_ = false;
using BitplaneData = std::array<uint16_t, 6>;
BitplaneData next;
// MARK: - Copper. // MARK: - Copper.
class Copper: public DMADevice { class Copper: public DMADevice {