From bbb7c7c0388cc9fc010d5209d92fbddc963ba348 Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Sat, 9 Jun 2018 15:48:44 -0700 Subject: [PATCH] Fix sed1376 PIP ending too early Since I am unable to find out what is wrong with the touch screen I just ported the POSE EvtEnqueuePenPoint hack, it will be removed in the future if possible. --- qtBuildSystem/Mu/Mu.pro | 8 +-- .../Mu/{macos-resources => macos}/Info.plist | 0 src/emulator.c | 52 +++++++++-------- src/hardwareRegisters.c | 2 + src/hardwareRegistersAccessors.c.h | 4 +- src/sed1376.c | 6 +- tests/sed1376UnimplementedRegisterLog.txt | 57 +++++++++++++++++++ 7 files changed, 97 insertions(+), 32 deletions(-) rename qtBuildSystem/Mu/{macos-resources => macos}/Info.plist (100%) create mode 100644 tests/sed1376UnimplementedRegisterLog.txt diff --git a/qtBuildSystem/Mu/Mu.pro b/qtBuildSystem/Mu/Mu.pro index b62df05..9611272 100644 --- a/qtBuildSystem/Mu/Mu.pro +++ b/qtBuildSystem/Mu/Mu.pro @@ -23,16 +23,16 @@ DEFINES += QT_DEPRECATED_WARNINGS DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 # ios { -# QMAKE_INFO_PLIST = ios-resources/Info.plist +# QMAKE_INFO_PLIST = ios/Info.plist # } macx { - QMAKE_INFO_PLIST = macos-resources/Info.plist + QMAKE_INFO_PLIST = macos/Info.plist } CONFIG(debug, debug|release){ - DEFINES += EMU_DEBUG EMU_CUSTOM_DEBUG_LOG_HANDLER EMU_LOG_REGISTER_ACCESS_UNKNOWN -# DEFINES += EMU_OPCODE_LEVEL_DEBUG EMU_LOG_APIS + DEFINES += EMU_DEBUG EMU_CUSTOM_DEBUG_LOG_HANDLER +# DEFINES += EMU_OPCODE_LEVEL_DEBUG EMU_LOG_APIS EMU_LOG_REGISTER_ACCESS_UNKNOWN } QMAKE_CFLAGS += -std=c99 diff --git a/qtBuildSystem/Mu/macos-resources/Info.plist b/qtBuildSystem/Mu/macos/Info.plist similarity index 100% rename from qtBuildSystem/Mu/macos-resources/Info.plist rename to qtBuildSystem/Mu/macos/Info.plist diff --git a/src/emulator.c b/src/emulator.c index 23d075a..02c1b52 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -327,6 +327,28 @@ uint32_t callTrap(bool fallthrough, const char* name, const char* prototype, ... return trapReturn; } +void sendTouchEvents(){ + static input_t lastFrameInput = {0}; + bool locationChanged = lastFrameInput.touchscreenX != palmInput.touchscreenX || lastFrameInput.touchscreenY != palmInput.touchscreenY; + bool pressedChanged = lastFrameInput.touchscreenTouched != palmInput.touchscreenTouched; + + //proto: Err EvtEnqueuePenPoint(PointType *ptP); + //PointType is int16, int16 + if(locationChanged || pressedChanged){ + if(palmInput.touchscreenTouched){ + m68k_write_memory_16(0xFFFFFFE0 - 4, palmInput.touchscreenX); + m68k_write_memory_16(0xFFFFFFE0 - 2, palmInput.touchscreenY); + } + else{ + m68k_write_memory_16(0xFFFFFFE0 - 4, (uint16_t)-1); + m68k_write_memory_16(0xFFFFFFE0 - 2, (uint16_t)-1); + } + callTrap(false, "sysTrapEvtEnqueuePenPoint", "w(p)", 0xFFFFFFE0 - 4); + } + + lastFrameInput = palmInput; +} + uint32_t makePalmString(const char* str){ uint32_t strLength = strlen(str) + 1; uint32_t strData = callTrap(false, "sysTrapMemPtrNew", "p(l)", strLength); @@ -348,32 +370,16 @@ void sinfulExecution(){ if(!alreadyRun){ bool hasBooted = !memcmp(palmFramebuffer, finishedBooting.pixel_data, 160 * 160 * 2); if(hasBooted){ - /*proto: Err SysAppLaunch(UInt16 cardNo, LocalID dbID, UInt16 launchFlags, - UInt16 cmd, MemPtr cmdPBP, UInt32 *resultP) - SYS_TRAP(sysTrapSysAppLaunch); + /*proto:Err SysAppLaunch(UInt16 cardNo, LocalID dbID, UInt16 launchFlags, + UInt16 cmd, MemPtr cmdPBP, UInt32 *resultP); */ - /* - uint32_t palmString = makePalmString("Calculator"); + uint32_t palmString = makePalmString("Memo Pad"); if(palmString != 0){ uint32_t localId = callTrap(false, "sysTrapDmFindDatabase", "l(wp)", 0, palmString); callTrap(true, "sysTrapSysAppLaunch", "w(wlwwpp)", 0, localId, 0, 0, 0, 0); //dont free palmString yet } - */ - - //capture a single touch read - debugClearLogs(); - callTrap(false, "sysTrapHwrIRQ5Handler", "v()"); - debugLog("Touch Capture Finished\n"); - - /* - int16_t xPos; - int16_t yPos; - uint8_t touched; - callTrap(false, "sysTrapEvtGetPen", "v(WWB)", &xPos, &yPos, &touched); - */ - //debugLog("Touch Position:X:%d, Y:%d, Touched:%d\n", xPos, yPos, touched); alreadyRun = true; } @@ -863,6 +869,7 @@ uint32_t emulatorInstallPrcPdb(buffer_t file){ void emulateFrame(){ refreshInputState(); + sendTouchEvents(); while(palmCycleCounter < CRYSTAL_FREQUENCY / EMU_FPS){ if(palmCrystalCycles != 0.0 && !lowPowerStopActive){ @@ -891,6 +898,7 @@ bool emulateUntilDebugEventOrFrameEnd(){ #if defined(EMU_DEBUG) && defined(EMU_OPCODE_LEVEL_DEBUG) invalidBehaviorAbort = false; refreshInputState(); + sendTouchEvents(); while(palmCycleCounter < CRYSTAL_FREQUENCY / EMU_FPS){ if(palmCrystalCycles != 0.0 && !lowPowerStopActive){ @@ -916,15 +924,11 @@ bool emulateUntilDebugEventOrFrameEnd(){ sed1376Render(); - //launch app when framebuffer == touchscreen calibrate - sinfulExecution(); - return invalidBehaviorAbort; #else emulateFrame(); - //launch app when framebuffer == touchscreen calibrate - //sinfulExecution(); + sinfulExecution(); return false; #endif diff --git a/src/hardwareRegisters.c b/src/hardwareRegisters.c index d75a009..07af2c1 100644 --- a/src/hardwareRegisters.c +++ b/src/hardwareRegisters.c @@ -48,12 +48,14 @@ bool sed1376ClockConnected(){ } void refreshInputState(){ + /* uint16_t icr = registerArrayRead16(ICR); bool penIrqPin = !(ads7846PenIrqEnabled && palmInput.touchscreenTouched);//penIrqPin pulled low on touch //IRQ set as pin function and triggered if(!(registerArrayRead8(PFSEL) & 0x02) && penIrqPin == (bool)(icr & 0x0080)) setIprIsrBit(INT_IRQ5); + */ /* //IRQ set as pin function and triggered, the pen IRQ triggers when going low to high or high to low diff --git a/src/hardwareRegistersAccessors.c.h b/src/hardwareRegistersAccessors.c.h index 7edbd85..131d30e 100644 --- a/src/hardwareRegistersAccessors.c.h +++ b/src/hardwareRegistersAccessors.c.h @@ -255,8 +255,8 @@ static inline void setSpiCont2(uint16_t value){ } registerArrayWrite16(SPIDATA2, spi2Data); - debugLog("SPI2 transfer, ENABLE:%s, XCH:%s, IRQ:%s, IRQEN:%s, BITCOUNT:%d\n", boolString(value & 0x0200), boolString(value & 0x0100), boolString(value & 0x0080), boolString(value & 0x0400), (value & 0x000F) + 1); - debugLog("SPI2 transfer, before:0x%04X, after:0x%04X, PC:0x%08X\n", oldSpi2Data, spi2Data, m68k_get_reg(NULL, M68K_REG_PPC)); + //debugLog("SPI2 transfer, ENABLE:%s, XCH:%s, IRQ:%s, IRQEN:%s, BITCOUNT:%d\n", boolString(value & 0x0200), boolString(value & 0x0100), boolString(value & 0x0080), boolString(value & 0x0400), (value & 0x000F) + 1); + //debugLog("SPI2 transfer, before:0x%04X, after:0x%04X, PC:0x%08X\n", oldSpi2Data, spi2Data, m68k_get_reg(NULL, M68K_REG_PPC)); //unset XCH, transfers are instant since timing is not emulated value &= 0xFEFF; diff --git a/src/sed1376.c b/src/sed1376.c index 079041e..71880f1 100644 --- a/src/sed1376.c +++ b/src/sed1376.c @@ -139,6 +139,8 @@ uint8_t sed1376GetRegister(uint8_t address){ case GPIO_CONT_0: case GPIO_CONF_1: case GPIO_CONT_1: + case MEM_CLK: + case PIXEL_CLK: //simple read, no actions needed return sed1376Registers[address]; @@ -302,8 +304,8 @@ void sed1376Render(){ if(pictureInPictureEnabled){ uint16_t pipStartX = sed1376Registers[PIP_X_START_1] << 8 | sed1376Registers[PIP_X_START_0]; uint16_t pipStartY = sed1376Registers[PIP_Y_START_1] << 8 | sed1376Registers[PIP_Y_START_0]; - uint16_t pipEndX = sed1376Registers[PIP_X_END_1] << 8 | sed1376Registers[PIP_X_END_0]; - uint16_t pipEndY = sed1376Registers[PIP_Y_END_1] << 8 | sed1376Registers[PIP_Y_END_0]; + uint16_t pipEndX = (sed1376Registers[PIP_X_END_1] << 8 | sed1376Registers[PIP_X_END_0]) + 1; + uint16_t pipEndY = (sed1376Registers[PIP_Y_END_1] << 8 | sed1376Registers[PIP_Y_END_0]) + 1; if(rotation == 0 || rotation == 180){ pipStartX *= 32 / bitDepth; pipEndX *= 32 / bitDepth; diff --git a/tests/sed1376UnimplementedRegisterLog.txt b/tests/sed1376UnimplementedRegisterLog.txt new file mode 100644 index 0000000..62c9cbc --- /dev/null +++ b/tests/sed1376UnimplementedRegisterLog.txt @@ -0,0 +1,57 @@ +SED1376 register write 0x00 to 0x11, PC 0x10003346.(printed 1 times) +SED1376 register write 0x17 to 0x12, PC 0x1000335A.(printed 1 times) +SED1376 register write 0x13 to 0x14, PC 0x10003362.(printed 1 times) +SED1376 register write 0x0D to 0x16, PC 0x10003376.(printed 1 times) +SED1376 register write 0x00 to 0x17, PC 0x1000337E.(printed 1 times) +SED1376 register write 0xF0 to 0x18, PC 0x10003398.(printed 1 times) +SED1376 register write 0x00 to 0x19, PC 0x100033A0.(printed 1 times) +SED1376 register write 0x9F to 0x1C, PC 0x100033A6.(printed 1 times) +SED1376 register write 0x00 to 0x1D, PC 0x100033AE.(printed 1 times) +SED1376 register write 0x28 to 0x1E, PC 0x100033C2.(printed 1 times) +SED1376 register write 0x00 to 0x1F, PC 0x100033CA.(printed 1 times) +SED1376 register write 0x81 to 0x20, PC 0x100033DE.(printed 1 times) +SED1376 register write 0xB0 to 0x22, PC 0x100033E6.(printed 1 times) +SED1376 register write 0x00 to 0x23, PC 0x100033EE.(printed 1 times) +SED1376 register write 0x01 to 0x24, PC 0x10003402.(printed 1 times) +SED1376 register write 0x00 to 0x26, PC 0x1000340A.(printed 1 times) +SED1376 register write 0x00 to 0x27, PC 0x10003410.(printed 1 times) +SED1376 register write 0x00 to 0xB0, PC 0x100032C2.(printed 1 times) +SED1376 register write 0xCF to 0xB1, PC 0x100032C8.(printed 1 times) +SED1376 register write 0x00 to 0x11, PC 0x10085A62.(printed 1 times) +SED1376 register write 0x17 to 0x12, PC 0x10085A76.(printed 1 times) +SED1376 register write 0x13 to 0x14, PC 0x10085A7E.(printed 1 times) +SED1376 register write 0x0D to 0x16, PC 0x10085A92.(printed 1 times) +SED1376 register write 0x00 to 0x17, PC 0x10085A9A.(printed 1 times) +SED1376 register write 0xF0 to 0x18, PC 0x10085AB4.(printed 1 times) +SED1376 register write 0x00 to 0x19, PC 0x10085ABC.(printed 1 times) +SED1376 register write 0x9F to 0x1C, PC 0x10085AC2.(printed 1 times) +SED1376 register write 0x00 to 0x1D, PC 0x10085ACA.(printed 1 times) +SED1376 register write 0x28 to 0x1E, PC 0x10085ADE.(printed 1 times) +SED1376 register write 0x00 to 0x1F, PC 0x10085AE6.(printed 1 times) +SED1376 register write 0x81 to 0x20, PC 0x10085AFA.(printed 1 times) +SED1376 register write 0xB0 to 0x22, PC 0x10085B02.(printed 1 times) +SED1376 register write 0x00 to 0x23, PC 0x10085B0A.(printed 1 times) +SED1376 register write 0x01 to 0x24, PC 0x10085B1E.(printed 1 times) +SED1376 register write 0x00 to 0x26, PC 0x10085B26.(printed 1 times) +SED1376 register write 0x00 to 0x27, PC 0x10085B2C.(printed 1 times) +SED1376 register write 0x00 to 0xB0, PC 0x100859DE.(printed 1 times) +SED1376 register write 0xCF to 0xB1, PC 0x100859E4.(printed 1 times) +SED1376 register write 0x00 to 0x11, PC 0x10085A62.(printed 1 times) +SED1376 register write 0x17 to 0x12, PC 0x10085A76.(printed 1 times) +SED1376 register write 0x13 to 0x14, PC 0x10085A7E.(printed 1 times) +SED1376 register write 0x0D to 0x16, PC 0x10085A92.(printed 1 times) +SED1376 register write 0x00 to 0x17, PC 0x10085A9A.(printed 1 times) +SED1376 register write 0xF0 to 0x18, PC 0x10085AB4.(printed 1 times) +SED1376 register write 0x00 to 0x19, PC 0x10085ABC.(printed 1 times) +SED1376 register write 0x9F to 0x1C, PC 0x10085AC2.(printed 1 times) +SED1376 register write 0x00 to 0x1D, PC 0x10085ACA.(printed 1 times) +SED1376 register write 0x28 to 0x1E, PC 0x10085ADE.(printed 1 times) +SED1376 register write 0x00 to 0x1F, PC 0x10085AE6.(printed 1 times) +SED1376 register write 0x81 to 0x20, PC 0x10085AFA.(printed 1 times) +SED1376 register write 0xB0 to 0x22, PC 0x10085B02.(printed 1 times) +SED1376 register write 0x00 to 0x23, PC 0x10085B0A.(printed 1 times) +SED1376 register write 0x01 to 0x24, PC 0x10085B1E.(printed 1 times) +SED1376 register write 0x00 to 0x26, PC 0x10085B26.(printed 1 times) +SED1376 register write 0x00 to 0x27, PC 0x10085B2C.(printed 1 times) +SED1376 register write 0x00 to 0xB0, PC 0x100859DE.(printed 1 times) +SED1376 register write 0xCF to 0xB1, PC 0x100859E4.(printed 1 times)