diff options
Diffstat (limited to 'src/NDS.h')
-rw-r--r-- | src/NDS.h | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/NDS.h b/src/NDS.h new file mode 100644 index 0000000..ed706af --- /dev/null +++ b/src/NDS.h @@ -0,0 +1,181 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NDS_H +#define NDS_H + +#include "types.h" + +namespace NDS +{ + +/*#define SCHED_BUF_LEN 64 + +typedef struct _SchedEvent +{ + u32 Delay; + void (*Func)(u32); + u32 Param; + struct _SchedEvent* PrevEvent; + struct _SchedEvent* NextEvent; + +} SchedEvent;*/ + +enum +{ + Event_LCD = 0, + + Event_Timer9_0, + Event_Timer9_1, + Event_Timer9_2, + Event_Timer9_3, + Event_Timer7_0, + Event_Timer7_1, + Event_Timer7_2, + Event_Timer7_3, + + Event_MAX +}; + +typedef struct +{ + void (*Func)(u32 param); + s32 WaitCycles; + u32 Param; + +} SchedEvent; + +enum +{ + IRQ_VBlank = 0, + IRQ_HBlank, + IRQ_VCount, + IRQ_Timer0, + IRQ_Timer1, + IRQ_Timer2, + IRQ_Timer3, + IRQ_RTC, + IRQ_DMA0, + IRQ_DMA1, + IRQ_DMA2, + IRQ_DMA3, + IRQ_Keypad, + IRQ_GBASlot, + IRQ_Unused14, + IRQ_Unused15, + IRQ_IPCSync, + IRQ_IPCSendDone, + IRQ_IPCRecv, + IRQ_CartSendDone, + IRQ_CartIREQMC, + IRQ_GXFIFO, + IRQ_LidOpen, + IRQ_SPI, + IRQ_Wifi +}; + +typedef struct +{ + u16 Reload; + u16 Cnt; + u32 Counter; + u32 CycleShift; + //SchedEvent* Event; + +} Timer; + +// hax +extern u32 IME[2]; +extern u32 IE[2]; +extern u32 IF[2]; +extern Timer Timers[8]; + +extern u16 ExMemCnt[2]; +extern u8 ROMSeed0[2*8]; +extern u8 ROMSeed1[2*8]; + +extern u8 ARM9BIOS[0x1000]; +extern u8 ARM7BIOS[0x4000]; + +bool Init(); +void DeInit(); +void Reset(); + +void SetupDirectBoot(); + +void RunFrame(); + +void PressKey(u32 key); +void ReleaseKey(u32 key); +void TouchScreen(u16 x, u16 y); +void ReleaseScreen(); + +/*SchedEvent* ScheduleEvent(s32 Delay, void (*Func)(u32), u32 Param); +void CancelEvent(SchedEvent* event); +void RunEvents(s32 cycles);*/ +void ScheduleEvent(u32 id, bool periodic, s32 delay, void (*func)(u32), u32 param); +void CancelEvent(u32 id); + +// DO NOT CALL FROM ARM7!! +void CompensateARM7(); + +void debug(u32 p); + +void Halt(); + +void MapSharedWRAM(u8 val); + +void SetIRQ(u32 cpu, u32 irq); +void ClearIRQ(u32 cpu, u32 irq); +bool HaltInterrupted(u32 cpu); +void StopCPU(u32 cpu, u32 mask); +void ResumeCPU(u32 cpu, u32 mask); + +void CheckDMAs(u32 cpu, u32 mode); + +u8 ARM9Read8(u32 addr); +u16 ARM9Read16(u32 addr); +u32 ARM9Read32(u32 addr); +void ARM9Write8(u32 addr, u8 val); +void ARM9Write16(u32 addr, u16 val); +void ARM9Write32(u32 addr, u32 val); + +u8 ARM7Read8(u32 addr); +u16 ARM7Read16(u32 addr); +u32 ARM7Read32(u32 addr); +void ARM7Write8(u32 addr, u8 val); +void ARM7Write16(u32 addr, u16 val); +void ARM7Write32(u32 addr, u32 val); + +u8 ARM9IORead8(u32 addr); +u16 ARM9IORead16(u32 addr); +u32 ARM9IORead32(u32 addr); +void ARM9IOWrite8(u32 addr, u8 val); +void ARM9IOWrite16(u32 addr, u16 val); +void ARM9IOWrite32(u32 addr, u32 val); + +u8 ARM7IORead8(u32 addr); +u16 ARM7IORead16(u32 addr); +u32 ARM7IORead32(u32 addr); +void ARM7IOWrite8(u32 addr, u8 val); +void ARM7IOWrite16(u32 addr, u16 val); +void ARM7IOWrite32(u32 addr, u32 val); + +} + +#endif // NDS_H |