mirror of
https://github.com/libretro/Mu.git
synced 2026-09-23 07:05:37 +00:00
Fix rather stupid bug I overlooked when reading from the bootloader
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user