Fix some invalid behavior with IMR, still have the power button issue

This commit is contained in:
meepingsnesroms
2018-11-29 21:28:12 -08:00
parent d65b544b38
commit 2d6b3372a7
3 changed files with 15 additions and 8 deletions

View File

@@ -106,5 +106,8 @@ I understand not everyone speaks English so I list both ROMs, I do all my testin
## License
<a rel="license" href="http://creativecommons.org/licenses/by-nc/3.0/us/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc/3.0/us/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc/3.0/us/">Creative Commons Attribution-NonCommercial 3.0 United States License</a>.
## Links
[Discord](https://discord.gg/hWSz8VN)
## Also see Mu's sister project
[🐿SquirrelJME](https://multiphasicapps.net)

View File

@@ -118,11 +118,11 @@ void setWriteProtectViolation(uint32_t address){
}
static void pllWakeCpuIfOff(void){
if(!pllIsOn() && pllWakeWait == -1){
//PLL is off and not already in the process of waking up
int8_t pllWaitTable[4] = {32, 48, 64, 96};
const int8_t pllWaitTable[4] = {32, 48, 64, 96};
//PLL is off and not already in the process of waking up
if(!pllIsOn() && pllWakeWait == -1)
pllWakeWait = pllWaitTable[registerArrayRead16(PLLCR) & 0x0003];
}
}
static void checkInterrupts(void){
@@ -728,14 +728,16 @@ void setHwRegister16(uint32_t address, uint16_t value){
break;
case IMR:
//this is a 32 bit register but Palm OS writes it as 16 bit chunks
//this is a 32 bit register but Palm OS writes to it as 16 bit chunks
registerArrayWrite16(IMR, value & 0x00FF);
registerArrayWrite16(ISR, registerArrayRead16(IPR) & registerArrayRead16(IMR));
checkInterrupts();
break;
case IMR + 2:
//this is a 32 bit register but Palm OS writes it as 16 bit chunks
registerArrayWrite16(IMR + 2, value & 0x03FF);
//this is a 32 bit register but Palm OS writes to it as 16 bit chunks
registerArrayWrite16(IMR + 2, value & 0x3FFF);
registerArrayWrite16(ISR + 2, registerArrayRead16(IPR + 2) & registerArrayRead16(IMR + 2));
checkInterrupts();
break;
case ISR:
@@ -1006,6 +1008,7 @@ void setHwRegister32(uint32_t address, uint32_t value){
case IMR:
registerArrayWrite32(IMR, value & 0x00FF3FFF);
registerArrayWrite32(ISR, registerArrayRead32(IPR) & registerArrayRead32(IMR));
checkInterrupts();
break;
case LSSA:

View File

@@ -264,8 +264,9 @@ static void updateCsdAddressLines(void){
static void setPllfsr(uint16_t value){
uint16_t oldPllfsr = registerArrayRead16(PLLFSR);
//change frequency if frequency protect bit isnt set
if(!(oldPllfsr & 0x4000)){
//frequency protect bit not set
registerArrayWrite16(PLLFSR, (value & 0x4FFF) | (oldPllfsr & 0x8000));//preserve CLK32 bit
palmSysclksPerClk32 = sysclksPerClk32();
}