return tc1.value;
} else if (reg == TC2VAL) {
return tc2.value;
- } else if (reg == SSSR) {
-// printf("!!! SSSR kludge! !!!\n");
+ } else if (reg == SSDR) {
+ // as per 5000A7B0 in 5mx rom
+ uint16_t ssiValue = 0;
+ switch (lastSSIRequest) {
+// case 0x9093: ssiValue = (uint16_t)(1156 - (touchY * 3.96)); break;
+// case 0xD0D3: ssiValue = (uint16_t)(2819 - (touchX * 3.91)); break;
+ case 0x9093: ssiValue = (uint16_t)(1156 - (touchY * 3.96)); break;
+ case 0xD0D3: ssiValue = (uint16_t)(1276 + (touchX * 3.91)); break;
+ case 0xA4A4: ssiValue = 3100; break; // MainBattery
+ case 0xE4E4: ssiValue = 3100; break; // BackupBattery
+ }
+
+ uint32_t ret = 0;
+ if (ssiReadCounter == 4) ret = (ssiValue >> 5) & 0x7F;
+ if (ssiReadCounter == 5) ret = (ssiValue << 3) & 0xF8;
+ ssiReadCounter++;
+ if (ssiReadCounter == 6) ssiReadCounter = 0;
+
+ // by hardware we should be clearing SSEOTI here, i think
+ // but we just leave it on to simplify things
+ return ret;
+ } else if (reg == SSSR) {
return 0;
} else if (reg == RTCDRL) {
-// uint16_t v = getRTC() & 0xFFFF;
uint16_t v = rtc & 0xFFFF;
// printf("RTCDRL: %04x\n", v);
return v;
} else if (reg == RTCDRU) {
-// uint16_t v = getRTC() >> 16;
uint16_t v = rtc >> 16;
// printf("RTCDRU: %04x\n", v);
return v;
uart1.writeReg32(reg & 0xFF, value);
} else if ((reg & 0xF00) == 0x700) {
uart2.writeReg32(reg & 0xFF, value);
+ } else if (reg == SSDR) {
+ if (value != 0)
+ lastSSIRequest = (lastSSIRequest >> 8) | (value & 0xFF00);
} else if (reg == TC1LOAD) {
tc1.load(value);
} else if (reg == TC1EOI) {
log("KERNEL MMU PAGES: v:%08x p:%08x size:%08x idx:%02x tableA:%08x tableB:%08x",
virtAddr, physAddr, regionSize, btIndex, pageTableA, pageTableB);
}
+
+ if (pc == 0x1576C) {
+ 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);
+ }
}
}
void Emulator::updateTouchInput(int32_t x, int32_t y, bool down) {
+ pendingInterrupts &= ~(1 << EINT3);
+ if (down)
+ pendingInterrupts |= (1 << EINT3);
+ touchX = x;
+ touchY = y;
}
}
(new QLabel("Copy/Paste", this))->setGeometry(rightX, bitH * 2, bitW, bitH);
(new QLabel("Zoom In", this))->setGeometry(rightX, bitH * 3, bitW, bitH);
(new QLabel("Zoom Out", this))->setGeometry(rightX, bitH * 4, bitW, bitH);
+ } else if (strcmp(who, "Series 5mx") == 0) {
+ int leftW = emu->getLCDOffsetX();
+ int leftH = emu->getLCDHeight() / 5;
+ (new QLabel("➡️", this))->setGeometry(0, leftH * 0, leftW, leftH);
+ (new QLabel("📄", this))->setGeometry(0, leftH * 1, leftW, leftH);
+ (new QLabel("📡", this))->setGeometry(0, leftH * 2, leftW, leftH);
+ (new QLabel("+", this))->setGeometry(0, leftH * 3, leftW, leftH);
+ (new QLabel("-", this))->setGeometry(0, leftH * 4, leftW, leftH);
+
+ int barX = 50;
+ int barY = leftH * 5;
+ int barW = (emu->getDigitiserWidth() - barX) / 8;
+ int barH = emu->getDigitiserHeight() - emu->getLCDHeight();
+ (new QLabel("System", this))->setGeometry(0, barY, barX, barH);
+ (new QLabel("Word", this))->setGeometry(barX + barW * 0, barY, barW, barH);
+ (new QLabel("Sheet", this))->setGeometry(barX + barW * 1, barY, barW, barH);
+ (new QLabel("Contacts", this))->setGeometry(barX + barW * 2, barY, barW, barH);
+ (new QLabel("Agenda", this))->setGeometry(barX + barW * 3, barY, barW, barH);
+ (new QLabel("Email", this))->setGeometry(barX + barW * 4, barY, barW, barH);
+ (new QLabel("Calc", this))->setGeometry(barX + barW * 5, barY, barW, barH);
+ (new QLabel("Jotter", this))->setGeometry(barX + barW * 6, barY, barW, barH);
+ (new QLabel("Extras", this))->setGeometry(barX + barW * 7, barY, barW, barH);
}
}