blob: ae7230ba10f632630fda72eda90456ce4711df5a [file] [log] [blame] [raw]
#pragma once
#include "mem.h"
#include "cpu.h"
template <typename T>
class StaticList
{
public:
static const unsigned int maxSlots = 16;
StaticList(unsigned int dev, T* instance) {
if (!refCount) {
for(unsigned int i = 0; i < maxSlots; i++) {
itemHeap[i] = item[i] = 0;
}
}
if (dev < maxSlots) {
item[dev] = instance;
}
slotNr = dev;
itemHeap[refCount] = instance;
refCount++;
}
~StaticList() {
item[slotNr] = NULL;
refCount--;
itemHeap[refCount] = NULL;
}
static T *itemHeap[maxSlots];
protected:
static unsigned int refCount;
static T *item[maxSlots];
unsigned int slotNr;
friend class TED;
};
template <typename T> unsigned int StaticList<T>::refCount = 0;
template <typename T> T *StaticList<T>::item[StaticList::maxSlots];
template <typename T> T *StaticList<T>::itemHeap[StaticList::maxSlots];
class DRVMEM;
class CPU;
class Mem;
class Cpu;
class Clockable : public StaticList<Clockable>
{
public:
Clockable(unsigned int dn) : StaticList<Clockable>(dn, this), devNr_(dn) {
}
virtual ~Clockable() {}
// Clock the drive (1 cycle)
//virtual
void Clock();
// Clock the drive (n cycles)
//virtual
void Clock(unsigned int n);
inline unsigned int getDevNr() {
return devNr_;
}
inline unsigned int getClockRate() {
return ClockRate;
}
inline unsigned long getClockCount() {
return ClockCount;
}
DRVMEM *getDriveMemHandler() {
return static_cast<DRVMEM*>(Mem);
};
// Obtain pointer to the CPU object
CPU *getDriveCpu() {
return static_cast<CPU*>(Cpu);
};
unsigned long ClockRate;
unsigned long ClockCount;
protected:
CPU *Cpu;
DRVMEM *Mem;
unsigned int devNr_;
};
inline void Clockable::Clock(unsigned int n)
{
do {
Mem->EmulateTick();
Cpu->process();
} while (--n);
}
inline void Clockable::Clock()
{
Mem->EmulateTick();
Cpu->process();
}