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