00001 #ifndef _PA_Interrupt 00002 #define _PA_Interrupt 00003 00004 #ifdef __cplusplus 00005 extern "C" { 00006 #endif 00007 00014 typedef void(*funcpointer)(void); 00015 00016 extern volatile u8 PA_Newframe; 00017 00018 extern volatile u8 PA_vblok; // Passe à 1 quand VBL activé... 00019 00020 00021 extern u32 PA_CPU; // Pourcentage CPU... 00022 extern u32 PA_MaxCPU; // Max CPU... 00023 extern u32 PA_lines; // Nombre de lignes, pour faire le calcul... 00024 extern u8 PA_VBLCount; // Compte le nombre de VBL avant qu'on en arrive à un tour 00025 extern u8 PA_nVBLs; 00026 extern s32 PA_VBLCounter[16]; // VBL counters available 00027 extern bool PA_VBLCounterOn[16]; // On or off 00028 00029 extern funcpointer CustomVBL; 00030 00031 extern volatile s32 PA_TestVBLs; 00032 00033 /* 00034 //Interrupt Registers 00035 #ifndef REG_IME 00036 #define REG_IME *(u32*)0x04000208 00037 #endif 00038 #ifndef REG_IE 00039 #define REG_IE *(u32*)0x04000210 00040 #endif 00041 #ifndef REG_IF 00042 #define REG_IF *(u32*)0x04000214 00043 #endif*/ 00044 00045 /* 00046 #define REG_INTERRUPT IRQ_HANDLE 00047 #define REG_DISPSTAT DISP_SR 00048 */ 00049 00050 //#define REG_VCOUNT _REG16(0x04000006) 00051 /* 00052 // Interrupts 00053 #define INTVBLANK 0x0001 00054 #define INTHBLANK 0x0002 00055 #define INTVCOUNT 0x0004 00056 #define INTTIMER0 0x0008 00057 #define INTTIMER1 0x0010 00058 #define INTTIMER2 0x0020 00059 #define INTTIMER3 0x0040 00060 #define INTCOM 0x0080 00061 #define INTDMA0 0x0100 00062 #define INTDMA1 0x0200 00063 #define INTDMA2 0x0400 00064 #define INTDMA3 0x0800 00065 #define INTBUTTON 0x1000 00066 #define INTCART 0x2000 00067 00068 #define INT_VBLANK 0 00069 #define INT_HBLANK 1 00070 #define INT_VCOUNT 2 00071 #define INT_TIMER0 3 00072 #define INT_TIMER1 4 00073 #define INT_TIMER2 5 00074 #define INT_TIMER3 6 00075 #define INT_COM 7 00076 #define INT_DMA0 8 00077 #define INT_DMA1 9 00078 #define INT_DMA2 10 00079 #define INT_DMA3 11 00080 #define INT_KEY 12 00081 #define INT_CART 13*/ 00082 00083 #define ENABLE_VBLANK 8 00084 #define ENABLE_HBLANK 16 00085 #define ENABLE_VCOUNT 32 00086 00087 /* 00088 // Pour activer les timers, que pour moi... 00089 // TIMER O 00090 #define TIMER0COUNT *(volatile u16 *)(0x04000100) 00091 #define TIMER0CNT *(volatile u16 *)(0x04000102) 00092 #define TIMER0CNT_TIMER_START (TIMER0CNT |= 0x0080) 00093 #define TIMER0CNT_IRQ_ENABLE (TIMER0CNT |= 0x0040) 00094 #define PA_EnableTimer0() {TIMER0CNT_TIMER_START; TIMER0CNT_IRQ_ENABLE;} 00095 00096 #define TIMER0CNT_TIMER_STOP (TIMER0CNT &= 0xFF7F) 00097 #define TIMER0CNT_IRQ_DISABLE (TIMER0CNT &= 0xFFBF) 00098 #define PA_DisableTimer0() {TIMER0CNT_TIMER_STOP; TIMER0CNT_IRQ_DISABLE;} 00099 00100 // TIMER 1 00101 #define TIMER1COUNT *(volatile u16 *)(0x04000104) 00102 #define TIMER1CNT *(volatile u16 *)(0x04000106) 00103 #define TIMER1CNT_TIMER_START (TIMER1CNT |= 0x0080) 00104 #define TIMER1CNT_IRQ_ENABLE (TIMER1CNT |= 0x0040) 00105 #define PA_EnableTimer1() {TIMER1CNT_TIMER_START; TIMER1CNT_IRQ_ENABLE;} 00106 00107 #define TIMER1CNT_TIMER_STOP (TIMER1CNT &= 0xFF7F) 00108 #define TIMER1CNT_IRQ_DISABLE (TIMER1CNT &= 0xFFBF) 00109 #define PA_DisableTimer1() {TIMER1CNT_TIMER_STOP; TIMER1CNT_IRQ_DISABLE;} 00110 00111 // TIMER 2 00112 #define TIMER2COUNT *(volatile u16 *)(0x04000108) 00113 #define TIMER2CNT *(volatile u16 *)(0x0400010A) 00114 #define TIMER2CNT_TIMER_START (TIMER2CNT |= 0x0080) 00115 #define TIMER2CNT_IRQ_ENABLE (TIMER2CNT |= 0x0040) 00116 #define PA_EnableTimer2() {TIMER2CNT_TIMER_START; TIMER2CNT_IRQ_ENABLE;} 00117 00118 #define TIMER2CNT_TIMER_STOP (TIMER2CNT &= 0xFF7F) 00119 #define TIMER2CNT_IRQ_DISABLE (TIMER2CNT &= 0xFFBF) 00120 #define PA_DisableTimer2() {TIMER2CNT_TIMER_STOP; TIMER2CNT_IRQ_DISABLE;} 00121 00122 // TIMER 3 00123 #define TIMER3COUNT *(volatile u16 *)(0x0400010C) 00124 #define TIMER3CNT *(volatile u16 *)(0x0400010E) 00125 #define TIMER3CNT_TIMER_START (TIMER3CNT |= 0x0080) 00126 #define TIMER3CNT_IRQ_ENABLE (TIMER3CNT |= 0x0040) 00127 #define PA_EnableTimer3() {TIMER3CNT_TIMER_START; TIMER3CNT_IRQ_ENABLE;} 00128 00129 #define TIMER3CNT_TIMER_STOP (TIMER3CNT &= 0xFF7F) 00130 #define TIMER3CNT_IRQ_DISABLE (TIMER3CNT &= 0xFFBF) 00131 #define PA_DisableTimer3() {TIMER3CNT_TIMER_STOP; TIMER3CNT_IRQ_DISABLE;} 00132 00133 */ 00134 00135 00136 //extern funcpointer interruptfunc[14]; 00137 00138 00139 void interruptfunction(void); 00140 00152 void PA_vblFunc(void); 00153 00154 00163 extern inline void PA_InitVBL(void) { 00164 //irqInit(); 00165 irqSet(IRQ_VBLANK, PA_vblFunc); 00166 irqEnable(IRQ_VBLANK); 00167 } 00168 00169 //PA_StartInt(INT_VBLANK, PA_vblFunc) 00170 00171 00178 //void PA_ResetInterrupts(void); 00179 00193 //void PA_StartInt(u8 inter, funcpointer interfunc); 00194 /*extern inline void PA_StartInt(u8 inter, funcpointer interfunc){ 00195 irqSet(inter, interfunc); 00196 irqEnable(inter); 00197 }*/ 00198 00207 /*extern inline void PA_StopInt(u8 inter){ 00208 irqDisable(inter); 00209 }*/ 00210 00211 00217 #define PA_GetVcount() (REG_VCOUNT&511) 00218 00224 void PA_VBLCountersReset(void); 00225 00234 extern inline void PA_VBLCounterStart(u8 nCounter){ 00235 PA_VBLCounter[nCounter] = 0; 00236 PA_VBLCounterOn[nCounter] = 1; 00237 } 00238 00247 extern inline void PA_VBLCounterPause(u8 nCounter){ 00248 PA_VBLCounterOn[nCounter] = 0; 00249 } 00250 00251 00260 extern inline void PA_VBLCounterUnpause(u8 nCounter){ 00261 PA_VBLCounterOn[nCounter] = 1; 00262 } 00263 00264 00265 extern inline void PA_VBLFunctionInit(funcpointer VBLFunc){ 00266 CustomVBL = VBLFunc; 00267 } 00268 00269 extern inline void PA_VBLFunctionReset(void){ 00270 PA_VBLFunctionInit(PA_Nothing); 00271 } 00272 00273 00274 00275 00276 00277 00278 00279 // end of Interrupts 00281 00282 #ifdef __cplusplus 00283 } 00284 #endif 00285 #endif 00286 00287