1{$ifdef NDS_INTERFACE} 2type 3 IRQ_MASK = cuint; 4const 5 IRQ_VBLANK : IRQ_MASK = (1 shl 0); (* vertical blank interrupt mask *) 6 IRQ_HBLANK : IRQ_MASK = (1 shl 1); (* horizontal blank interrupt mask *) 7 IRQ_VCOUNT : IRQ_MASK = (1 shl 2); (* vcount match interrupt mask *) 8 IRQ_TIMER0 : IRQ_MASK = (1 shl 3); (* timer 0 interrupt mask *) 9 IRQ_TIMER1 : IRQ_MASK = (1 shl 4); (* timer 1 interrupt mask *) 10 IRQ_TIMER2 : IRQ_MASK = (1 shl 5); (* timer 2 interrupt mask *) 11 IRQ_TIMER3 : IRQ_MASK = (1 shl 6); (* timer 3 interrupt mask *) 12 IRQ_NETWORK : IRQ_MASK = (1 shl 7); (* serial interrupt mask *) 13 IRQ_DMA0 : IRQ_MASK = (1 shl 8); (* DMA 0 interrupt mask *) 14 IRQ_DMA1 : IRQ_MASK = (1 shl 9); (* DMA 1 interrupt mask *) 15 IRQ_DMA2 : IRQ_MASK = (1 shl 10); (* DMA 2 interrupt mask *) 16 IRQ_DMA3 : IRQ_MASK = (1 shl 11); (* DMA 3 interrupt mask *) 17 IRQ_KEYS : IRQ_MASK = (1 shl 12); (* Keypad interrupt mask *) 18 IRQ_CART : IRQ_MASK = (1 shl 13); (* GBA cartridge interrupt mask *) 19 IRQ_IPC_SYNC : IRQ_MASK = (1 shl 16); (* IPC sync interrupt mask *) 20 IRQ_FIFO_EMPTY : IRQ_MASK = (1 shl 17); (* Send FIFO empty interrupt mask *) 21 IRQ_FIFO_NOT_EMPTY : IRQ_MASK = (1 shl 18); (* Receive FIFO empty interrupt mask *) 22 IRQ_CARD : IRQ_MASK = (1 shl 19); (* interrupt mask DS Card Slot *) 23 IRQ_CARD_LINE : IRQ_MASK = (1 shl 20); (* interrupt mask *) 24 IRQ_GEOMETRY_FIFO : IRQ_MASK = (1 shl 21); (* geometry FIFO interrupt mask *) 25 IRQ_LID : IRQ_MASK = (1 shl 22); (* interrupt mask hinge *) 26 IRQ_SPI : IRQ_MASK = (1 shl 23); (* SPI interrupt mask *) 27 IRQ_WIFI : IRQ_MASK = (1 shl 24); (* WIFI interrupt mask (ARM7)*) 28 IRQ_ALL : IRQ_MASK = (not 0); //$FFFFFF ? 29 30 31type 32 IRQ_MASKSAUX = cuint; 33const 34 IRQ_I2C : IRQ_MASKSAUX = (1 shl 6); (* Power Button interrupt mask (DSi ARM7) *) 35 IRQ_SDMMC : IRQ_MASKSAUX = (1 shl 8); (* Sdmmc interrupt mask (DSi ARM7) *) 36 37function IRQ_TIMER(n: cint): cint; inline; 38 39const 40 MAX_INTERRUPTS = 25; 41 42 43 44const 45 REG_IE : pcuint32 = pointer($04000210); 46 REG_AUXIE: pcuint32 = pointer($04000218); 47 REG_IF : pcuint32 = pointer($04000214); 48 REG_AUXIF: pcuint32 = pointer($0400021C); 49 REG_IME : pcuint32 = pointer($04000208); 50 51type 52 IME_VALUE = integer; 53const 54 IME_DISABLE : IME_VALUE = 0; (* Disable all interrupts. *) 55 IME_ENABLE : IME_VALUE = 1; (* Enable all interrupts not masked out in REG_IE *) 56 57 58type 59 TVoidFn = procedure of object; 60 61var 62// __irq_vector: array [0..0] of VoidFunctionPointer; cvar; external; 63// __irq_vector: array [0..0] of Pointer; cvar; external; 64// __irq_flags: array [0..0] of cuint32; cvar; external; 65// __irq_flags: pcuint32; cvar; external; 66// __irq_vector: ^VoidFunctionPointer; cvar; external; 67 68/// __irq_vector: Pointer; cvar; external; 69/// __irq_flags: pcuint32; cvar; external; 70 __irq_vector: Pointer; external name '__irq_vector'; 71 __irq_flags: pcuint32; external name '__irq_flags'; 72 __irq_flagsaux: pcuint32; external name '__irq_flagsaux'; 73 74 75{$define INTR_WAIT_FLAGS := __irq_flags} 76{$define INTR_WAIT_FLAGSAUX := __irq_flagsaux} 77{$define IRQ_HANDLER := __irq_vector} 78 79type 80 IntTable = record 81 handler: IntFn; 82 mask: cuint32; 83 end; 84 85procedure irqInit(); cdecl; external; 86procedure irqSet(irq: cuint32; handler: TVoidFn); cdecl; external; 87procedure irqSet(irq: cuint32; handler: pointer); cdecl; external; 88procedure irqSetAUX(irq: cuint32; handler: TVoidFn); cdecl; external; 89procedure irqSetAUX(irq: cuint32; handler: pointer); cdecl; external; 90procedure irqClear(irq: cuint32); cdecl; external; 91procedure irqClearAUX(irq: cuint32); cdecl; external; 92procedure irqInitHandler(handler: TVoidFn); cdecl; external; 93procedure irqInitHandler(handler: pointer); cdecl; external; 94procedure irqEnable(irq: cuint32); cdecl; external; 95procedure irqEnableAUX(irq: cuint32); cdecl; external; 96procedure irqDisable(irq: cuint32); cdecl; external; 97procedure irqDisableAUX(irq: cuint32); cdecl; external; 98 99procedure swiIntrWait(waitForSet: cuint32; flags: cuint32); cdecl; external; 100procedure swiWaitForVBlank(); cdecl; external; 101 102function setPowerButtonCB(CB: TVoidFn): TVoidFn; cdecl; external; 103 104function enterCriticalSection(): cint; inline; 105procedure leaveCriticalSection(oldIME: cint); inline; 106{$endif NDS_INTERFACE} 107 108{$ifdef NDS_IMPLEMENTATION} 109 110function IRQ_TIMER(n: cint): cint; inline; 111begin 112 result := (1 shl (n + 3)); 113end; 114 115function enterCriticalSection(): cint; inline; 116var 117 oldIME: cint; 118begin 119 oldIME := REG_IME^; 120 REG_IME^ := 0; 121 result := oldIME; 122end; 123 124procedure leaveCriticalSection(oldIME: cint); inline; 125begin 126 REG_IME^ := oldIME; 127end; 128 129{$endif NDS_IMPLEMENTATION} 130 131