2021-07-22 22:43:07 +00:00
|
|
|
//
|
|
|
|
// Blitter.hpp
|
|
|
|
// Clock Signal
|
|
|
|
//
|
|
|
|
// Created by Thomas Harte on 22/07/2021.
|
|
|
|
// Copyright © 2021 Thomas Harte. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef Blitter_hpp
|
|
|
|
#define Blitter_hpp
|
|
|
|
|
|
|
|
#include <cstddef>
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
#include "../../ClockReceiver/ClockReceiver.hpp"
|
|
|
|
|
|
|
|
namespace Amiga {
|
|
|
|
|
|
|
|
class Blitter {
|
|
|
|
public:
|
|
|
|
Blitter(uint16_t *ram, size_t size);
|
|
|
|
|
|
|
|
// Various setters; it's assumed that address decoding is handled externally.
|
|
|
|
//
|
|
|
|
// In all cases where a channel is identified numerically, it's taken that
|
|
|
|
// 0 = A, 1 = B, 2 = C, 3 = D.
|
|
|
|
void set_control(int index, uint16_t value);
|
|
|
|
void set_first_word_mask(uint16_t value);
|
|
|
|
void set_last_word_mask(uint16_t value);
|
|
|
|
void set_pointer(int channel, int shift, uint16_t value);
|
|
|
|
void set_size(uint16_t value);
|
|
|
|
void set_minterms(uint16_t value);
|
|
|
|
void set_vertical_size(uint16_t value);
|
|
|
|
void set_horizontal_size(uint16_t value);
|
|
|
|
void set_modulo(int channel, uint16_t value);
|
|
|
|
void set_data(int channel, uint16_t value);
|
|
|
|
|
|
|
|
uint16_t get_status();
|
|
|
|
|
2021-07-23 01:16:23 +00:00
|
|
|
/// @returns The number of accesses required to complete the current
|
|
|
|
/// operation, if any, or 0 if no operation is pending.
|
|
|
|
int get_remaining_accesses();
|
2021-07-22 22:43:07 +00:00
|
|
|
|
2021-07-23 01:16:23 +00:00
|
|
|
/// Performs the next n accesses.
|
|
|
|
void run_for(int accesses);
|
2021-07-22 22:43:07 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
uint16_t *const ram_;
|
|
|
|
const size_t ram_size_;
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* Blitter_hpp */
|