mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-17 10:06:21 +00:00
52 lines
1.1 KiB
C++
52 lines
1.1 KiB
C++
//
|
|
// Copper.hpp
|
|
// Clock Signal
|
|
//
|
|
// Created by Thomas Harte on 16/09/2021.
|
|
// Copyright © 2021 Thomas Harte. All rights reserved.
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include "DMADevice.hpp"
|
|
|
|
namespace Amiga {
|
|
|
|
class Copper: public DMADevice<2> {
|
|
public:
|
|
using DMADevice<2>::DMADevice;
|
|
|
|
/// Offers a DMA slot to the Copper, specifying the current beam position and Blitter status.
|
|
///
|
|
/// @returns @c true if the slot was used; @c false otherwise.
|
|
bool advance_dma(uint16_t position, uint16_t blitter_status);
|
|
|
|
/// Forces a reload of address @c id (i.e. 0 or 1) and restarts the Copper.
|
|
template <int id> void reload() {
|
|
address_ = pointer_[id];
|
|
state_ = State::FetchFirstWord;
|
|
}
|
|
|
|
/// Sets the Copper control word.
|
|
void set_control(uint16_t c) {
|
|
control_ = c;
|
|
}
|
|
|
|
/// Forces the Copper into the stopped state.
|
|
void stop() {
|
|
state_ = State::Stopped;
|
|
}
|
|
|
|
private:
|
|
uint32_t address_ = 0;
|
|
uint16_t control_ = 0;
|
|
|
|
enum class State {
|
|
FetchFirstWord, FetchSecondWord, Waiting, Stopped,
|
|
} state_ = State::Stopped;
|
|
bool skip_next_ = false;
|
|
uint16_t instruction_[2]{};
|
|
};
|
|
|
|
}
|