M5Cardputer-C64-Emulator/src/t-hmi-c64/CIA.h

62 lines
1.7 KiB
C
Raw Normal View History

2025-02-15 12:45:04 +01:00
/*
Copyright (C) 2024 iEle <melephas@gmail.com>
Copyright (C) 2024 retroelec <retroelec42@gmail.com>
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
For the complete text of the GNU General Public License see
http://www.gnu.org/licenses/.
*/
#pragma once
#include <atomic>
#include <cstdint>
// register dc0d:
// - Interrupt Control Register when written to
// - is an Interrupt Latch Register when read from
// - read the clear-on-read register $dc0d will ACK all pending CIA 1 interrupts
class CIA
{
public:
uint8_t ciareg[0x10];
bool underflowTimerA;
uint8_t serbitnr;
uint8_t serbitnrnext;
uint8_t latchdc04;
uint8_t latchdc05;
uint8_t latchdc06;
uint8_t latchdc07;
uint8_t latchdc0d; // read latch register
uint16_t timerA;
uint16_t timerB;
std::atomic<bool> isTODRunning;
bool isTODFreezed;
std::atomic<bool> isAlarm;
std::atomic<uint8_t> latchrundc08; // TOD running
std::atomic<uint8_t> latchrundc09;
std::atomic<uint8_t> latchrundc0a;
std::atomic<uint8_t> latchrundc0b;
std::atomic<uint8_t> latchalarmdc08; // set alarm
std::atomic<uint8_t> latchalarmdc09;
std::atomic<uint8_t> latchalarmdc0a;
std::atomic<uint8_t> latchalarmdc0b;
CIA(bool isCIA1);
void init(bool isCIA1);
bool checkAlarm();
bool checkTimerA(uint8_t deltaT);
bool checkTimerB(uint8_t deltaT);
};