fix IRQ14/IRQ15
This commit is contained in:
parent
4129c7e9c7
commit
80e5c01dd7
30
src/Wifi.cpp
30
src/Wifi.cpp
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue