From f68ffa2a9ba62a5aa8ca603cd197e8652a5b734a Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Tue, 5 Jun 2018 16:30:36 -0700 Subject: [PATCH] Fix rather stupid bug I overlooked when reading from the bootloader --- musashi/m68kcpu.h | 2 +- qtBuildSystem/Mu/Mu.pro.user | 2 +- qtBuildSystem/Mu/mainwindow.cpp | 2 +- specifications/emuFeatureRegistersSpec.h | 1 + src/emulator.c | 29 +++++++++++++++++++++++- src/hardwareRegisters.c | 9 ++++---- unimplementedFeatures.txt | 1 + 7 files changed, 38 insertions(+), 8 deletions(-) diff --git a/musashi/m68kcpu.h b/musashi/m68kcpu.h index 8cc6879..987b728 100755 --- a/musashi/m68kcpu.h +++ b/musashi/m68kcpu.h @@ -261,7 +261,7 @@ #define REG_DA m68ki_cpu.dar /* easy access to data and address regs */ #define REG_D m68ki_cpu.dar #define REG_A (m68ki_cpu.dar+8) -#define REG_PPC m68ki_cpu.ppc +#define REG_PPC m68ki_cpu.ppc #define REG_PC m68ki_cpu.pc #define REG_SP_BASE m68ki_cpu.sp #define REG_USP m68ki_cpu.sp[0] diff --git a/qtBuildSystem/Mu/Mu.pro.user b/qtBuildSystem/Mu/Mu.pro.user index 6e09cd8..4821c14 100644 --- a/qtBuildSystem/Mu/Mu.pro.user +++ b/qtBuildSystem/Mu/Mu.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/qtBuildSystem/Mu/mainwindow.cpp b/qtBuildSystem/Mu/mainwindow.cpp index 7611d35..b000b33 100644 --- a/qtBuildSystem/Mu/mainwindow.cpp +++ b/qtBuildSystem/Mu/mainwindow.cpp @@ -168,7 +168,7 @@ void MainWindow::on_notes_released(){ void MainWindow::on_ctrlBtn_clicked(){ if(!emu.isInited()){ //uint32_t error = emu.init(settings.value("resourceDirectory", "").toString() + "/palmos41-en-m515.rom", settings.value("resourceDirectory", "").toString() + "/bootloader-en-m515.rom", FEATURE_ACCURATE); - uint32_t error = emu.init(settings.value("resourceDirectory", "").toString() + "/palmos41-en-m515.rom", ""/*no bootloader for now*/, FEATURE_ACCURATE); + uint32_t error = emu.init(settings.value("resourceDirectory", "").toString() + "/palmos41-en-m515.rom", ""/*no bootloader for now*/, FEATURE_DEBUG); if(error == EMU_ERROR_NONE){ ui->calendar->setEnabled(true); ui->addressBook->setEnabled(true); diff --git a/specifications/emuFeatureRegistersSpec.h b/specifications/emuFeatureRegistersSpec.h index f70f6b1..e546cf2 100644 --- a/specifications/emuFeatureRegistersSpec.h +++ b/specifications/emuFeatureRegistersSpec.h @@ -20,6 +20,7 @@ These registers will do nothing it there corresponding feature bit is not set on #define FEATURE_HLE_APIS 0x00000020/*memcpy, memcmp, wait on timer will be replaced with the hosts function*/ #define FEATURE_EMU_HONEST 0x00000040/*tell the OS that its running in an emu, does nothing else*/ #define FEATURE_EXT_KEYS 0x00000080/*enables the OS 5 buttons, left, right and select*/ +#define FEATURE_DEBUG 0x00000100/*enables the debug commands, used to call Palm OS functions like native C functions*/ /*new features go here*/ /*registers*/ diff --git a/src/emulator.c b/src/emulator.c index 877a78a..1d17b28 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -214,6 +214,7 @@ uint32_t callTrap(bool fallthrough, const char* name, const char* prototype, ... return_pointer_t trapReturnPointers[10]; uint8_t trapReturnPointerIndex = 0; uint32_t callWriteOut = 0xFFFFFFE0; + uint32_t callStart; va_start(args, prototype); while(*params != ')'){ @@ -241,6 +242,8 @@ uint32_t callTrap(bool fallthrough, const char* name, const char* prototype, ... trapReturnPointers[trapReturnPointerIndex].hostPointer = va_arg(args, void*); trapReturnPointers[trapReturnPointerIndex].emuPointer = callWriteOut; trapReturnPointers[trapReturnPointerIndex].bytes = 1; + stackAddr -= 4; + m68k_write_memory_32(stackAddr, trapReturnPointers[trapReturnPointerIndex].emuPointer); callWriteOut += 2; trapReturnPointerIndex++; break; @@ -249,6 +252,8 @@ uint32_t callTrap(bool fallthrough, const char* name, const char* prototype, ... trapReturnPointers[trapReturnPointerIndex].hostPointer = va_arg(args, void*); trapReturnPointers[trapReturnPointerIndex].emuPointer = callWriteOut; trapReturnPointers[trapReturnPointerIndex].bytes = 2; + stackAddr -= 4; + m68k_write_memory_32(stackAddr, trapReturnPointers[trapReturnPointerIndex].emuPointer); callWriteOut += 2; trapReturnPointerIndex++; break; @@ -258,6 +263,8 @@ uint32_t callTrap(bool fallthrough, const char* name, const char* prototype, ... trapReturnPointers[trapReturnPointerIndex].hostPointer = va_arg(args, void*); trapReturnPointers[trapReturnPointerIndex].emuPointer = callWriteOut; trapReturnPointers[trapReturnPointerIndex].bytes = 4; + stackAddr -= 4; + m68k_write_memory_32(stackAddr, trapReturnPointers[trapReturnPointerIndex].emuPointer); callWriteOut += 4; trapReturnPointerIndex++; break; @@ -267,14 +274,34 @@ uint32_t callTrap(bool fallthrough, const char* name, const char* prototype, ... } //write to the bootloader memory, its not important when debugging + callStart = callWriteOut; m68k_write_memory_16(callWriteOut, 0x4E4F);//trap f opcode callWriteOut += 2; m68k_write_memory_16(callWriteOut, trap); callWriteOut += 2; + //end execution with CMD_EXECUTION_DONE + m68k_write_memory_16(callWriteOut, 0x23F9);//move.l imm imm opcode + callWriteOut += 2; + m68k_write_memory_32(callWriteOut, MAKE_EMU_CMD(CMD_EXECUTION_DONE)); + callWriteOut += 4; + m68k_write_memory_32(callWriteOut, EMU_REG_ADDR(EMU_CMD)); + callWriteOut += 4; + //23cf 00000000 + /* + m68k_write_memory_16(callWriteOut, 0x239F);//move.l imm to SP opcode + callWriteOut += 2; + m68k_write_memory_32(callWriteOut, EMU_REG_ADDR(EMU_CMD)); + callWriteOut += 4; + m68k_write_memory_16(callWriteOut, 0x2EB9);//move.l imm to address in SP opcode + callWriteOut += 2; + m68k_write_memory_32(callWriteOut, MAKE_EMU_CMD(CMD_EXECUTION_DONE)); + callWriteOut += 4; + */ + executionFinished = false; m68k_set_reg(M68K_REG_SP, stackAddr); - m68k_set_reg(M68K_REG_PC, callWriteOut - 4); + m68k_set_reg(M68K_REG_PC, callStart); //only setup the trap then fallthrough to normal execution, may be needed on app switch since the trap may not return if(!fallthrough){ diff --git a/src/hardwareRegisters.c b/src/hardwareRegisters.c index b38360b..536a63b 100644 --- a/src/hardwareRegisters.c +++ b/src/hardwareRegisters.c @@ -363,7 +363,8 @@ static void setEmuRegister(uint32_t address, uint32_t value){ switch(value){ case CMD_EXECUTION_DONE: #if defined(EMU_DEBUG) - executionFinished = true; + if(palmSpecialFeatures & FEATURE_DEBUG) + executionFinished = true; #endif break; @@ -468,7 +469,7 @@ uint8_t getHwRegister8(uint32_t address){ default: //bootloader if(address >= 0xE00) - registerArrayRead8(address); + return registerArrayRead8(address); #if defined(EMU_DEBUG) && defined(EMU_LOG_REGISTER_ACCESS_UNKNOWN) && !defined(EMU_LOG_REGISTER_ACCESS_ALL) else printUnknownHwAccess(address, 0, 8, false); @@ -540,7 +541,7 @@ uint16_t getHwRegister16(uint32_t address){ default: //bootloader if(address >= 0xE00) - registerArrayRead16(address); + return registerArrayRead16(address); #if defined(EMU_DEBUG) && defined(EMU_LOG_REGISTER_ACCESS_UNKNOWN) && !defined(EMU_LOG_REGISTER_ACCESS_ALL) else printUnknownHwAccess(address, 0, 16, false); @@ -578,7 +579,7 @@ uint32_t getHwRegister32(uint32_t address){ default: //bootloader if(address >= 0xE00) - registerArrayRead32(address); + return registerArrayRead32(address); #if defined(EMU_DEBUG) && defined(EMU_LOG_REGISTER_ACCESS_UNKNOWN) && !defined(EMU_LOG_REGISTER_ACCESS_ALL) else printUnknownHwAccess(address, 0, 32, false); diff --git a/unimplementedFeatures.txt b/unimplementedFeatures.txt index 78c6542..f58ce2a 100644 --- a/unimplementedFeatures.txt +++ b/unimplementedFeatures.txt @@ -46,6 +46,7 @@ swivelview register Fixed: +Bootloader memory access need to check REFREQ clock frequency in RTCCTL PLLCR CLKEN being off should also disable the SED1376 but this would require a bank refresh on writing to PLLCR proper clearing of timer interrupts