start working on the RTC IRQ

This commit is contained in:
Arisotura 2023-10-28 17:45:16 +02:00
parent e67b3b7165
commit 9ccdc23fa0
3 changed files with 48 additions and 4 deletions

View File

@ -220,6 +220,7 @@ extern MemRegion SWRAM_ARM9;
extern MemRegion SWRAM_ARM7; extern MemRegion SWRAM_ARM7;
extern u32 KeyInput; extern u32 KeyInput;
extern u16 RCnt;
const u32 ARM7WRAMSize = 0x10000; const u32 ARM7WRAMSize = 0x10000;
extern u8* ARM7WRAM; extern u8* ARM7WRAM;

View File

@ -56,7 +56,6 @@ void WriteDateTime(int num, u8 val);
bool Init() bool Init()
{ {
State.MinuteCount = 0;
ResetState(); ResetState();
// indicate the power was off // indicate the power was off
@ -241,6 +240,28 @@ void ResetState()
} }
void SetIRQ(u8 irq)
{
u8 oldstat = State.IRQFlag;
State.IRQFlag |= irq;
State.StatusReg1 |= irq;
if ((!(oldstat & 0x30)) && (State.IRQFlag & 0x30))
{
if ((NDS::RCnt & 0xC100) == 0x8100)
{printf("IRQ\n");
// CHECKME: is the IRQ status readable in RCNT?
NDS::SetIRQ(1, NDS::IRQ_RTC);
}
}
}
void ClearIRQ(u8 irq)
{
State.IRQFlag &= ~irq;
}
u8 DaysInMonth() u8 DaysInMonth()
{ {
u8 numdays; u8 numdays;
@ -397,6 +418,29 @@ void ClockTimer(u32 param)
CountSecond(); CountSecond();
} }
if (State.StatusReg2 & (1<<3))
{
// 32KHz IRQ output
SetIRQ(0x10);
ClearIRQ(0x10);
}
else if ((State.StatusReg2 & 0x03) == 0x01)
{
// selected frequency steady interrupt
u32 mask = 0;
if (State.Alarm1[2] & (1<<0)) mask |= 0x4000;
if (State.Alarm1[2] & (1<<1)) mask |= 0x2000;
if (State.Alarm1[2] & (1<<2)) mask |= 0x1000;
if (State.Alarm1[2] & (1<<3)) mask |= 0x0800;
if (State.Alarm1[2] & (1<<4)) mask |= 0x0400;
if (mask && ((ClockCount & mask) != mask))
SetIRQ(0x10);
else
ClearIRQ(0x10);
}
ScheduleTimer(false); ScheduleTimer(false);
} }
@ -645,10 +689,7 @@ void CmdWrite(u8 val)
case 0x30: case 0x30:
if (InputPos == 1) if (InputPos == 1)
{
State.ClockAdjust = val; State.ClockAdjust = val;
Log(LogLevel::Debug, "RTC: CLOCK ADJUST = %02X\n", val);
}
break; break;
case 0x70: case 0x70:

View File

@ -35,6 +35,8 @@ struct StateData
u8 ClockAdjust; u8 ClockAdjust;
u8 FreeReg; u8 FreeReg;
u8 IRQFlag;
// DSi registers // DSi registers
u32 MinuteCount; u32 MinuteCount;
u8 FOUT1; u8 FOUT1;