Fix rather stupid bug I overlooked when reading from the bootloader

This commit is contained in:
meepingsnesroms
2018-06-05 16:30:36 -07:00
parent 09ec6ed921
commit f68ffa2a9b
7 changed files with 38 additions and 8 deletions

View File

@@ -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]

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.6.1, 2018-06-05T05:29:49. -->
<!-- Written by QtCreator 4.6.1, 2018-06-05T15:25:14. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

View File

@@ -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);

View File

@@ -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*/

View File

@@ -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){

View File

@@ -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);

View File

@@ -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