fix IRQ14/IRQ15

This commit is contained in:
Arisotura 2022-09-04 15:41:59 +02:00
parent 4129c7e9c7
commit 80e5c01dd7
1 changed files with 19 additions and 11 deletions

View File

@ -52,6 +52,8 @@ const u32 kTimeCheckMask = ~(kTimerInterval - 1);
bool Enabled; bool Enabled;
bool PowerOn; bool PowerOn;
s32 TimerError;
u16 Random; u16 Random;
// general, always-on microsecond counter // general, always-on microsecond counter
@ -89,7 +91,7 @@ TXSlot TXSlots[6];
u8 RXBuffer[2048]; u8 RXBuffer[2048];
u32 RXBufferPtr; u32 RXBufferPtr;
u32 RXTime; int RXTime;
u32 RXHalfwordTimeMask; u32 RXHalfwordTimeMask;
u16 RXEndAddr; u16 RXEndAddr;
@ -300,7 +302,12 @@ void DoSavestate(Savestate* file)
void ScheduleTimer(bool first) void ScheduleTimer(bool first)
{ {
int delay = 33 * kTimerInterval; if (first) TimerError = 0;
s32 cycles = 33513982 * kTimerInterval;
cycles -= TimerError;
s32 delay = (cycles + 999999) / 1000000;
TimerError = (delay * 1000000) - cycles;
NDS::ScheduleEvent(NDS::Event_Wifi, !first, delay, USTimer, 0); NDS::ScheduleEvent(NDS::Event_Wifi, !first, delay, USTimer, 0);
} }
@ -721,7 +728,7 @@ bool ProcessTX(TXSlot* slot, int num)
{ {
if (slot->CurPhase == 1) if (slot->CurPhase == 1)
{ {
if (!(slot->CurPhaseTime & slot->HalfwordTimeMask & kTimeCheckMask)) if (!(slot->CurPhaseTime & slot->HalfwordTimeMask))
IOPORT(W_RXTXAddr)++; IOPORT(W_RXTXAddr)++;
} }
else if (slot->CurPhase == 2) else if (slot->CurPhase == 2)
@ -785,12 +792,12 @@ bool ProcessTX(TXSlot* slot, int num)
if (slot->Rate == 2) if (slot->Rate == 2)
{ {
len *= 4; len *= 4;
slot->HalfwordTimeMask = 0x7; slot->HalfwordTimeMask = 0x7 & kTimeCheckMask;
} }
else else
{ {
len *= 8; len *= 8;
slot->HalfwordTimeMask = 0xF; slot->HalfwordTimeMask = 0xF & kTimeCheckMask;
} }
slot->CurPhase = 1; slot->CurPhase = 1;
@ -1050,12 +1057,12 @@ void StartRX()
if (txrate == 0x14) if (txrate == 0x14)
{ {
RXTime *= 4; RXTime *= 4;
RXHalfwordTimeMask = 0x7; RXHalfwordTimeMask = 0x7 & kTimeCheckMask;
} }
else else
{ {
RXTime *= 8; RXTime *= 8;
RXHalfwordTimeMask = 0xF; RXHalfwordTimeMask = 0xF & kTimeCheckMask;
} }
u16 addr = IOPORT(W_RXBufWriteCursor) << 1; u16 addr = IOPORT(W_RXBufWriteCursor) << 1;
@ -1480,7 +1487,7 @@ void MSTimer()
{ {
if (IOPORT(W_USCompareCnt)) if (IOPORT(W_USCompareCnt))
{ {
if (USCounter == USCompare) if ((USCounter & ~0x3FF) == USCompare)
{ {
BlockBeaconIRQ14 = false; BlockBeaconIRQ14 = false;
SetIRQ14(0); SetIRQ14(0);
@ -1545,7 +1552,8 @@ void USTimer(u32 param)
if (IOPORT(W_USCompareCnt)) if (IOPORT(W_USCompareCnt))
{ {
u32 beaconus = (IOPORT(W_BeaconCount1) << 10) | (0x3FF - uspart); u32 beaconus = (IOPORT(W_BeaconCount1) << 10) | (0x3FF - uspart);
if (beaconus == IOPORT(W_PreBeacon)) SetIRQ15(); if ((beaconus & kTimeCheckMask) == (IOPORT(W_PreBeacon) & kTimeCheckMask))
SetIRQ15();
} }
if (!(uspart & kTimeCheckMask)) if (!(uspart & kTimeCheckMask))
@ -1638,7 +1646,7 @@ void USTimer(u32 param)
if (ComStatus & 0x1) if (ComStatus & 0x1)
{ {
RXTime -= kTimerInterval; RXTime -= kTimerInterval;
if (!(RXTime & RXHalfwordTimeMask & kTimeCheckMask)) if (!(RXTime & RXHalfwordTimeMask))
{ {
u16 addr = IOPORT(W_RXTXAddr) << 1; u16 addr = IOPORT(W_RXTXAddr) << 1;
if (addr < 0x1FFF) *(u16*)&RAM[addr] = *(u16*)&RXBuffer[RXBufferPtr]; if (addr < 0x1FFF) *(u16*)&RAM[addr] = *(u16*)&RXBuffer[RXBufferPtr];
@ -1647,7 +1655,7 @@ void USTimer(u32 param)
IOPORT(W_RXTXAddr) = addr >> 1; IOPORT(W_RXTXAddr) = addr >> 1;
RXBufferPtr += 2; RXBufferPtr += 2;
if (RXTime == 0) // finished receiving if (RXTime <= 0) // finished receiving
{ {
FinishRX(); FinishRX();
} }