mirror of
https://github.com/Treeki/WindEmu.git
synced 2025-07-02 20:49:32 +00:00
implement touch panel for Osaris
This commit is contained in:
@ -49,6 +49,7 @@ uint32_t Emulator::readReg32(uint32_t reg) {
|
||||
return flg;
|
||||
} else if (reg == SYSFLG1) {
|
||||
uint32_t flg = sysFlg1;
|
||||
flg |= 2; // external power present
|
||||
flg |= (rtcDiv << 16);
|
||||
// maybe set more stuff?
|
||||
return flg;
|
||||
@ -64,6 +65,21 @@ uint32_t Emulator::readReg32(uint32_t reg) {
|
||||
return tc2.value;
|
||||
} else if (reg == RTCDR) {
|
||||
return rtc;
|
||||
} else if (reg == SYNCIO) {
|
||||
switch (lastSyncioRequest & 0xFF) {
|
||||
case 0xC1: // DigitiserX
|
||||
return (touchX * 8) + 305;
|
||||
case 0x81: // DigitiserY
|
||||
return (touchY * 13.53) + 680;
|
||||
case 0x91: // MainBattery
|
||||
return 3000;
|
||||
case 0xD1: // BackupBattery
|
||||
return 3100;
|
||||
case 0xA1: // Reference
|
||||
return 1000;
|
||||
}
|
||||
log("SYNCIO read unknown:: req=%08x", lastSyncioRequest);
|
||||
return 0xFFFFFFFF;
|
||||
} else if (reg == PALLSW) {
|
||||
return lcdPalette & 0xFFFFFFFF;
|
||||
} else if (reg == PALMSW) {
|
||||
@ -149,6 +165,8 @@ void Emulator::writeReg32(uint32_t reg, uint32_t value) {
|
||||
tc2.load(value);
|
||||
} else if (reg == RTCDR) {
|
||||
rtc = value;
|
||||
} else if (reg == SYNCIO) {
|
||||
lastSyncioRequest = value & 0xFFFF;
|
||||
} else if (reg == PALLSW) {
|
||||
lcdPalette &= 0xFFFFFFFF00000000;
|
||||
lcdPalette |= value;
|
||||
@ -337,7 +355,7 @@ const char *Emulator::identifyObjectCon(uint32_t ptr) {
|
||||
if (ptr == readVirtualDebug(0x800008AC, V32).value()) return "library";
|
||||
// if (ptr == readVirtualDebug(0x800008B0, V32).value()) return "unk8B0"; // name always null
|
||||
// if (ptr == readVirtualDebug(0x800008B4, V32).value()) return "unk8B4"; // name always null
|
||||
return "???";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void Emulator::fetchStr(uint32_t str, char *buf) {
|
||||
@ -405,15 +423,46 @@ void Emulator::debugPC(uint32_t pc) {
|
||||
log("DPlatChunkHw MAPPING: v:%08x p:%08x size:%08x arg:%08x",
|
||||
virtAddr, physAddr, regionSize, a);
|
||||
}
|
||||
|
||||
if (pc == 0x16198) {
|
||||
uint32_t rawEvent = getGPR(0);
|
||||
uint32_t evtType = readVirtualDebug(rawEvent, V32).value_or(0);
|
||||
uint32_t evtTick = readVirtualDebug(rawEvent + 4, V32).value_or(0);
|
||||
uint32_t evtParamA = readVirtualDebug(rawEvent + 8, V32).value_or(0);
|
||||
uint32_t evtParamB = readVirtualDebug(rawEvent + 0xC, V32).value_or(0);
|
||||
const char *n = "???";
|
||||
switch (evtType) {
|
||||
case 0: n = "ENone"; break;
|
||||
case 1: n = "EPointerMove"; break;
|
||||
case 2: n = "EPointerSwitchOn"; break;
|
||||
case 3: n = "EKeyDown"; break;
|
||||
case 4: n = "EKeyUp"; break;
|
||||
case 5: n = "ERedraw"; break;
|
||||
case 6: n = "ESwitchOn"; break;
|
||||
case 7: n = "EActive"; break;
|
||||
case 8: n = "EInactive"; break;
|
||||
case 9: n = "EUpdateModifiers"; break;
|
||||
case 10: n = "EButton1Down"; break;
|
||||
case 11: n = "EButton1Up"; break;
|
||||
case 12: n = "EButton2Down"; break;
|
||||
case 13: n = "EButton2Up"; break;
|
||||
case 14: n = "EButton3Down"; break;
|
||||
case 15: n = "EButton3Up"; break;
|
||||
case 16: n = "ESwitchOff"; break;
|
||||
}
|
||||
log("EVENT %s: tick=%d params=%08x,%08x", n, evtTick, evtParamA, evtParamB);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int Emulator::getLCDWidth() const {
|
||||
return 320;
|
||||
}
|
||||
int Emulator::getLCDHeight() const {
|
||||
return 200;
|
||||
}
|
||||
const char *Emulator::getDeviceName() const { return "Osaris"; }
|
||||
int Emulator::getDigitiserWidth() const { return 440; }
|
||||
int Emulator::getDigitiserHeight() const { return 200; }
|
||||
int Emulator::getLCDOffsetX() const { return 60; }
|
||||
int Emulator::getLCDOffsetY() const { return 0; }
|
||||
int Emulator::getLCDWidth() const { return 320; }
|
||||
int Emulator::getLCDHeight() const { return 200; }
|
||||
|
||||
void Emulator::readLCDIntoBuffer(uint8_t **lines) const {
|
||||
if (lcdAddress == 0xC0000000) {
|
||||
int width = 320, height = 200;
|
||||
@ -568,4 +617,14 @@ void Emulator::setKeyboardKey(EpocKey key, bool value) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Emulator::updateTouchInput(int32_t x, int32_t y, bool down) {
|
||||
pendingInterrupts &= ~(1 << EINT2);
|
||||
if (down)
|
||||
pendingInterrupts |= (1 << EINT2);
|
||||
log("Touch: x=%d y=%d down=%s", x, y, down ? "yes" : "no");
|
||||
touchX = x;
|
||||
touchY = y;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -24,10 +24,12 @@ private:
|
||||
uint32_t rtc = 0;
|
||||
uint32_t rtcDiv = 0;
|
||||
uint64_t lcdPalette = 0;
|
||||
uint16_t lastSyncioRequest = 0;
|
||||
|
||||
uint32_t kScan = 0;
|
||||
uint8_t keyboardColumns[7] = {0,0,0,0,0,0,0};
|
||||
uint8_t keyboardExtra = 0;
|
||||
int32_t touchX = 0, touchY = 0;
|
||||
|
||||
Timer tc1, tc2;
|
||||
CLPS7600 pcCardController;
|
||||
@ -62,9 +64,15 @@ public:
|
||||
void loadROM(uint8_t *buffer, size_t size) override;
|
||||
void executeUntil(int64_t cycles) override;
|
||||
int32_t getClockSpeed() const override { return CLOCK_SPEED; }
|
||||
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;
|
||||
void readLCDIntoBuffer(uint8_t **lines) const override;
|
||||
void setKeyboardKey(EpocKey key, bool value) override;
|
||||
void updateTouchInput(int32_t x, int32_t y, bool down) override;
|
||||
};
|
||||
}
|
||||
|
@ -114,10 +114,16 @@ public:
|
||||
virtual void loadROM(uint8_t *buffer, size_t size) = 0;
|
||||
virtual void executeUntil(int64_t cycles) = 0;
|
||||
virtual int32_t getClockSpeed() const = 0;
|
||||
virtual const char *getDeviceName() const = 0;
|
||||
virtual int getDigitiserWidth() const = 0;
|
||||
virtual int getDigitiserHeight() const = 0;
|
||||
virtual int getLCDOffsetX() const = 0;
|
||||
virtual int getLCDOffsetY() const = 0;
|
||||
virtual int getLCDWidth() const = 0;
|
||||
virtual int getLCDHeight() const = 0;
|
||||
virtual void readLCDIntoBuffer(uint8_t **lines) const = 0;
|
||||
virtual void setKeyboardKey(EpocKey key, bool value) = 0;
|
||||
virtual void updateTouchInput(int32_t x, int32_t y, bool down) = 0;
|
||||
|
||||
std::unordered_set<uint32_t> &breakpoints() { return _breakpoints; }
|
||||
uint64_t currentCycles() const { return passedCycles; }
|
||||
|
@ -478,12 +478,14 @@ void Emulator::debugPC(uint32_t pc) {
|
||||
}
|
||||
|
||||
|
||||
int Emulator::getLCDWidth() const {
|
||||
return 640;
|
||||
}
|
||||
int Emulator::getLCDHeight() const {
|
||||
return 240;
|
||||
}
|
||||
const char *Emulator::getDeviceName() const { return "Series 5mx"; }
|
||||
int Emulator::getDigitiserWidth() const { return 695; }
|
||||
int Emulator::getDigitiserHeight() const { return 280; }
|
||||
int Emulator::getLCDOffsetX() const { return 45; }
|
||||
int Emulator::getLCDOffsetY() const { return 5; }
|
||||
int Emulator::getLCDWidth() const { return 640; }
|
||||
int Emulator::getLCDHeight() const { return 240; }
|
||||
|
||||
void Emulator::readLCDIntoBuffer(uint8_t **lines) const {
|
||||
if ((lcdAddress >> 24) == 0xC0) {
|
||||
const uint8_t *lcdBuf = &MemoryBlockC0[lcdAddress & MemoryBlockMask];
|
||||
@ -657,4 +659,7 @@ void Emulator::setKeyboardKey(EpocKey key, bool value) {
|
||||
}
|
||||
}
|
||||
|
||||
void Emulator::updateTouchInput(int32_t x, int32_t y, bool down) {
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -62,9 +62,15 @@ public:
|
||||
void loadROM(uint8_t *buffer, size_t size) override;
|
||||
void executeUntil(int64_t cycles) override;
|
||||
int32_t getClockSpeed() const override { return CLOCK_SPEED; }
|
||||
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;
|
||||
void readLCDIntoBuffer(uint8_t **lines) const override;
|
||||
void setKeyboardKey(EpocKey key, bool value) override;
|
||||
void updateTouchInput(int32_t x, int32_t y, bool down) override;
|
||||
};
|
||||
}
|
||||
|
Reference in New Issue
Block a user