WindEmu/WindCore/windermere.h

82 lines
2.4 KiB
C
Raw Normal View History

2019-12-19 00:27:23 +00:00
#pragma once
#include "emubase.h"
2019-12-24 23:34:02 +00:00
#include "wind_defs.h"
#include "hardware.h"
#include "etna.h"
2019-12-19 00:27:23 +00:00
namespace Windermere {
class Emulator : public EmuBase {
2019-12-21 11:09:58 +00:00
public:
2019-12-19 00:27:23 +00:00
uint8_t ROM[0x1000000];
uint8_t ROM2[0x40000];
uint8_t MemoryBlockC0[0x800000];
uint8_t MemoryBlockC1[0x800000];
uint8_t MemoryBlockD0[0x800000];
uint8_t MemoryBlockD1[0x800000];
enum { MemoryBlockMask = 0x7FFFFF };
2019-12-19 00:27:23 +00:00
2019-12-21 11:09:58 +00:00
private:
2019-12-19 00:27:23 +00:00
uint16_t pendingInterrupts = 0;
uint16_t interruptMask = 0;
uint32_t portValues = 0;
uint32_t portDirections = 0;
uint32_t pwrsr = 0x00002000; // cold start flag
uint32_t lcdControl = 0;
uint32_t lcdAddress = 0;
uint32_t rtc = 0;
2019-12-25 17:02:46 +00:00
uint16_t lastSSIRequest = 0;
int ssiReadCounter = 0;
2019-12-19 00:27:23 +00:00
2019-12-25 01:53:54 +00:00
uint32_t kScan = 0;
uint8_t keyboardColumns[8] = {0,0,0,0,0,0,0};
2019-12-25 17:02:46 +00:00
int32_t touchX = 0, touchY = 0;
2019-12-25 01:53:54 +00:00
2019-12-19 00:27:23 +00:00
Timer tc1, tc2;
UART uart1, uart2;
Etna etna;
bool halted = false, asleep = false;
2019-12-19 00:27:23 +00:00
uint32_t getRTC();
uint32_t readReg8(uint32_t reg);
uint32_t readReg32(uint32_t reg);
void writeReg8(uint32_t reg, uint8_t value);
void writeReg32(uint32_t reg, uint32_t value);
public:
MaybeU32 readPhysical(uint32_t physAddr, ValueSize valueSize) override;
bool writePhysical(uint32_t value, uint32_t physAddr, ValueSize valueSize) override;
2019-12-19 00:27:23 +00:00
private:
bool configured = false;
void configure();
const char *identifyObjectCon(uint32_t ptr);
void fetchStr(uint32_t str, char *buf);
void fetchName(uint32_t obj, char *buf);
void fetchProcessFilename(uint32_t obj, char *buf);
void debugPC(uint32_t pc);
void diffPorts(uint32_t oldval, uint32_t newval);
void diffInterrupts(uint16_t oldval, uint16_t newval);
2019-12-25 01:53:54 +00:00
uint32_t readKeyboard();
2019-12-19 00:27:23 +00:00
public:
Emulator();
2019-12-25 23:40:27 +00:00
uint8_t *getROMBuffer() override;
size_t getROMSize() override;
void loadROM(uint8_t *buffer, size_t size) override;
void executeUntil(int64_t cycles) override;
int32_t getClockSpeed() const override { return CLOCK_SPEED; }
2019-12-25 14:46:08 +00:00
const char *getDeviceName() const override;
int getDigitiserWidth() const override;
int getDigitiserHeight() const override;
int getLCDOffsetX() const override;
int getLCDOffsetY() const override;
int getLCDWidth() const override;
int getLCDHeight() const override;
2019-12-25 23:40:27 +00:00
void readLCDIntoBuffer(uint8_t **lines, bool is32BitOutput) const override;
2019-12-25 01:53:54 +00:00
void setKeyboardKey(EpocKey key, bool value) override;
2019-12-25 14:46:08 +00:00
void updateTouchInput(int32_t x, int32_t y, bool down) override;
2019-12-19 00:27:23 +00:00
};
}