/* * Interrupts * * Handle interrupts, the levels. * */ #include #include #include int register_handler(uint8_t priority, uint8_t intr, void (*func)()) { int i; uint8_t level = 0b01111111; uint32_t *adr = MBAR_ADDRESS; uint8_t ol = 0,op = 0; intr &= 63; priority &= 7; if( intr <= 0 ) return -1; for(i=1;i<64;i++) if( i!=intr ) { if( MCF_INTC_ICR(i)&7 == priority ) clear_bit_nr(level,(MCF_INTC_ICR(i)>>3)&7); } for(i=0;1<7;i++) if( level&(1<=7 ) return -1; // Make sure priority level is high, before changing registers __asm__ volatile ( "move.w sr,d0\n\t" \ "move.w d0,-(sp) \n\t" \ "move.w #0x2700,sr\n\t" \ : \ : \ : "d0","memory" \ ); if( intr < 32 ) clear_bit(MCF_INTC_IMRL,(1<