fix powcnt1 better (fixes manicminer homebrew)
note that 90% of all remaining desmume bugs can probably be fixed by more correct register emulation in a way done like this checkin. however I have not yet established a code pattern that I like for it so I am not sweeping through and changing them all at once yet.
This commit is contained in:
parent
721f0406c9
commit
bc3fd907e3
|
@ -1526,6 +1526,72 @@ void validateIF_arm9()
|
||||||
else if(MMU_new.gxstat.gxfifo_irq == 0) MMU.reg_IF[ARMCPU_ARM9] &= ~(1<<21);
|
else if(MMU_new.gxstat.gxfifo_irq == 0) MMU.reg_IF[ARMCPU_ARM9] &= ~(1<<21);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 readreg_POWCNT1(const int size, const u32 adr) {
|
||||||
|
switch(size)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
switch(adr)
|
||||||
|
{
|
||||||
|
case REG_POWCNT1: {
|
||||||
|
u8 ret = 0;
|
||||||
|
ret |= nds.power1.lcd?BIT(0):0;
|
||||||
|
ret |= nds.power1.gpuMain?BIT(1):0;
|
||||||
|
ret |= nds.power1.gfx3d_render?BIT(2):0;
|
||||||
|
ret |= nds.power1.gfx3d_geometry?BIT(3):0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
case REG_POWCNT1+1: {
|
||||||
|
u8 ret = 0;
|
||||||
|
ret |= nds.power1.gpuSub?BIT(1):0;
|
||||||
|
ret |= nds.power1.dispswap?BIT(7):0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 16:
|
||||||
|
case 32:
|
||||||
|
return readreg_POWCNT1(8,adr)|(readreg_POWCNT1(8,adr)<<8);
|
||||||
|
}
|
||||||
|
assert(false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static void writereg_POWCNT1(const int size, const u32 adr, const u32 val) {
|
||||||
|
switch(size)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
switch(adr)
|
||||||
|
{
|
||||||
|
case REG_POWCNT1:
|
||||||
|
nds.power1.lcd = BIT0(val);
|
||||||
|
nds.power1.gpuMain = BIT1(val);
|
||||||
|
nds.power1.gfx3d_render = BIT2(val);
|
||||||
|
nds.power1.gfx3d_geometry = BIT3(val);
|
||||||
|
break;
|
||||||
|
case REG_POWCNT1+1:
|
||||||
|
nds.power1.gpuSub = BIT1(val);
|
||||||
|
nds.power1.dispswap = BIT7(val);
|
||||||
|
if(nds.power1.dispswap)
|
||||||
|
{
|
||||||
|
//printf("Main core on top (vcount=%d)\n",nds.VCount);
|
||||||
|
MainScreen.offset = 0;
|
||||||
|
SubScreen.offset = 192;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//printf("Main core on bottom (vcount=%d)\n",nds.VCount);
|
||||||
|
MainScreen.offset = 192;
|
||||||
|
SubScreen.offset = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
case 32:
|
||||||
|
writereg_POWCNT1(8,adr,val&0xFF);
|
||||||
|
writereg_POWCNT1(8,adr+1,(val>>16)&0xFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static INLINE void MMU_IPCSync(u8 proc, u32 val)
|
static INLINE void MMU_IPCSync(u8 proc, u32 val)
|
||||||
{
|
{
|
||||||
//INFO("IPC%s sync 0x%04X (0x%02X|%02X)\n", proc?"7":"9", val, val >> 8, val & 0xFF);
|
//INFO("IPC%s sync 0x%04X (0x%02X|%02X)\n", proc?"7":"9", val, val >> 8, val & 0xFF);
|
||||||
|
@ -2315,11 +2381,15 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
|
||||||
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM9));
|
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM9));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case 0x4000247:
|
case REG_WRAMCNT:
|
||||||
/* Update WRAMSTAT at the ARM7 side */
|
/* Update WRAMSTAT at the ARM7 side */
|
||||||
T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, val);
|
T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case REG_POWCNT1:
|
||||||
|
writereg_POWCNT1(8,adr,val);
|
||||||
|
break;
|
||||||
|
|
||||||
case REG_VRAMCNTA:
|
case REG_VRAMCNTA:
|
||||||
case REG_VRAMCNTB:
|
case REG_VRAMCNTB:
|
||||||
case REG_VRAMCNTC:
|
case REG_VRAMCNTC:
|
||||||
|
@ -2605,28 +2675,7 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REG_POWCNT1:
|
case REG_POWCNT1:
|
||||||
{
|
writereg_POWCNT1(16,adr,val);
|
||||||
nds.power1.lcd = BIT0(val);
|
|
||||||
nds.power1.gpuMain = BIT1(val);
|
|
||||||
nds.power1.gfx3d_render = BIT2(val);
|
|
||||||
nds.power1.gfx3d_geometry = BIT3(val);
|
|
||||||
nds.power1.gpuSub = BIT9(val);
|
|
||||||
nds.power1.dispswap = BIT15(val);
|
|
||||||
|
|
||||||
if(val & (1<<15))
|
|
||||||
{
|
|
||||||
//printf("Main core on top (vcount=%d)\n",nds.VCount);
|
|
||||||
MainScreen.offset = 0;
|
|
||||||
SubScreen.offset = 192;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//printf("Main core on bottom (vcount=%d)\n",nds.VCount);
|
|
||||||
MainScreen.offset = 192;
|
|
||||||
SubScreen.offset = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case REG_EXMEMCNT:
|
case REG_EXMEMCNT:
|
||||||
|
@ -2963,6 +3012,10 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
|
||||||
case REG_SQRTCNT: MMU_new.sqrt.write16((u16)val); return;
|
case REG_SQRTCNT: MMU_new.sqrt.write16((u16)val); return;
|
||||||
case REG_DIVCNT: MMU_new.div.write16((u16)val); return;
|
case REG_DIVCNT: MMU_new.div.write16((u16)val); return;
|
||||||
|
|
||||||
|
|
||||||
|
case REG_POWCNT1: writereg_POWCNT1(32,adr,val); break;
|
||||||
|
|
||||||
|
|
||||||
//ensata handshaking port?
|
//ensata handshaking port?
|
||||||
case 0x04FFF010:
|
case 0x04FFF010:
|
||||||
if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_ack && val == 0x13579bdf)
|
if(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_ack && val == 0x13579bdf)
|
||||||
|
@ -3308,6 +3361,12 @@ u8 FASTCALL _MMU_ARM9_read08(u32 adr)
|
||||||
case REG_DIVCNT+2: printf("ERROR 8bit DIVCNT READ\n"); return 0;
|
case REG_DIVCNT+2: printf("ERROR 8bit DIVCNT READ\n"); return 0;
|
||||||
case REG_DIVCNT+3: printf("ERROR 8bit DIVCNT READ\n"); return 0;
|
case REG_DIVCNT+3: printf("ERROR 8bit DIVCNT READ\n"); return 0;
|
||||||
|
|
||||||
|
case REG_POWCNT1:
|
||||||
|
case REG_POWCNT1+1:
|
||||||
|
case REG_POWCNT1+2:
|
||||||
|
case REG_POWCNT1+3:
|
||||||
|
return readreg_POWCNT1(8,adr);
|
||||||
|
|
||||||
case eng_3D_GXSTAT:
|
case eng_3D_GXSTAT:
|
||||||
return MMU_new.gxstat.read(8,adr);
|
return MMU_new.gxstat.read(8,adr);
|
||||||
}
|
}
|
||||||
|
@ -3384,17 +3443,9 @@ u16 FASTCALL _MMU_ARM9_read16(u32 adr)
|
||||||
case REG_AUXSPICNT:
|
case REG_AUXSPICNT:
|
||||||
return MMU.AUX_SPI_CNT;
|
return MMU.AUX_SPI_CNT;
|
||||||
|
|
||||||
case REG_POWCNT1:
|
case REG_POWCNT1:
|
||||||
{
|
case REG_POWCNT1+2:
|
||||||
u16 ret = 0;
|
return readreg_POWCNT1(16,adr);
|
||||||
ret |= nds.power1.lcd?BIT(0):0;
|
|
||||||
ret |= nds.power1.gpuMain?BIT(1):0;
|
|
||||||
ret |= nds.power1.gfx3d_render?BIT(2):0;
|
|
||||||
ret |= nds.power1.gfx3d_geometry?BIT(3):0;
|
|
||||||
ret |= nds.power1.gpuSub?BIT(9):0;
|
|
||||||
ret |= nds.power1.dispswap?BIT(15):0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 0x04000130:
|
case 0x04000130:
|
||||||
case 0x04000136:
|
case 0x04000136:
|
||||||
|
@ -3510,6 +3561,9 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr)
|
||||||
|
|
||||||
case REG_GCDATAIN:
|
case REG_GCDATAIN:
|
||||||
return MMU_readFromGC<ARMCPU_ARM9>();
|
return MMU_readFromGC<ARMCPU_ARM9>();
|
||||||
|
|
||||||
|
case REG_POWCNT1:
|
||||||
|
return readreg_POWCNT1(32,adr);
|
||||||
}
|
}
|
||||||
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);
|
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue