2018-03-09 13:01:08 -05:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <cstdint>
|
2018-03-15 20:09:23 -04:00
|
|
|
#include <thread>
|
2018-03-09 13:01:08 -05:00
|
|
|
|
2018-12-03 17:37:19 -05:00
|
|
|
#include "irq.h"
|
2018-12-05 11:09:26 -05:00
|
|
|
#include "vixen/io.h"
|
2018-03-09 13:01:08 -05:00
|
|
|
|
2018-12-05 11:09:26 -05:00
|
|
|
namespace vixen {
|
2018-03-09 13:01:08 -05:00
|
|
|
|
|
|
|
#define PORT_PIT_DATA_0 0x40
|
|
|
|
#define PORT_PIT_DATA_1 0x41
|
|
|
|
#define PORT_PIT_DATA_2 0x42
|
|
|
|
#define PORT_PIT_COMMAND 0x43
|
|
|
|
|
2018-03-11 12:32:13 -04:00
|
|
|
#define PORT_PIT_BASE PORT_PIT_DATA_0
|
|
|
|
#define PORT_PIT_COUNT (PORT_PIT_COMMAND - PORT_PIT_DATA_0 + 1)
|
|
|
|
|
2018-03-11 12:04:09 -04:00
|
|
|
class i8254 : public IODevice {
|
2018-03-09 13:01:08 -05:00
|
|
|
public:
|
2018-12-05 20:33:58 -05:00
|
|
|
i8254(IRQHandler& irqHandler, float tickRate = 1000.0f);
|
2018-03-16 18:59:33 -04:00
|
|
|
virtual ~i8254();
|
2018-03-09 13:01:08 -05:00
|
|
|
void Reset();
|
|
|
|
|
2018-03-11 13:04:56 -04:00
|
|
|
bool MapIO(IOMapper *mapper);
|
2018-03-09 13:01:08 -05:00
|
|
|
|
2018-03-11 12:04:09 -04:00
|
|
|
bool IORead(uint32_t port, uint32_t *value, uint8_t size) override;
|
|
|
|
bool IOWrite(uint32_t port, uint32_t value, uint8_t size) override;
|
2018-03-11 13:04:56 -04:00
|
|
|
|
|
|
|
void Run();
|
2018-03-09 13:01:08 -05:00
|
|
|
private:
|
2018-12-05 20:33:58 -05:00
|
|
|
IRQHandler& m_irqHandler;
|
2018-03-09 13:01:08 -05:00
|
|
|
float m_tickRate;
|
|
|
|
bool m_running;
|
2018-03-15 20:09:23 -04:00
|
|
|
|
|
|
|
std::thread m_timerThread;
|
2018-03-09 13:01:08 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|