; Interrupt Controller example ; This code services software (ISR0-ISR7) interrupts. ; To request interrupt simply set SSCIRn[SETn] bit in INTC in PER. ; See implementation description under pdf\simulator_api_lib.pdf org d:0x1000 ; --- Interrupt service routine --- int0: stwu r4,-4(r1) ; push registers to stack stwu r3,-4(r1) mfspr r4,0x1a stwu r4,-4(r1) mfspr r4,0x1b stwu r4,-4(r1) lis r3,0xfff4 ori r3,r3,0x8010 lwz r4,0x0(r3) ; clear int request and read vector srwi r4,r4,2 li r3,0x8000 mtmsr r3 ; enable ints in MSR cmpi CR0,r4,0x8 ; if priority is equal or more than 8 bc 0,0,not_soft_int ; do not clear the flag lis r3,0xfff4 ori r3,r3,0x8020 add r3,r3,r4 li r4,0x1 stb r4,0x0(r3) ; clear software int flag not_soft_int: lis r3,0xfff4 ori r3,r3,0x8018 li r4,0x0 stw r4,0x0(r3) ; end of interrupt li r3,0x0 mtmsr r3 ; disable ints in MSR lwz r4,0(r1) ; pop from stack addi r1,r1,4 mtspr 0x1b,r4 lwz r4,0(r1) addi r1,r1,4 mtspr 0x1a,r4 lwz r3,0(r1) addi r1,r1,4 lwz r4,0(r1) addi r1,r1,4 rfi ; --- INTC initialization --- start: li r1,0x100 ; set stack to 0x100 lis r3,0x0 ori r3,r3,int0 mtspr 0x194,r3 ; set IVOR4 lis r3,0xfff4 ori r3,r3,0x8008 li r4,0x0 stw r4,0x0(r3) ; set current priority to zero lis r3,0xfff4 ori r3,r3,0x8040 li r4,0x0 pri_loop: stb r4,0x0(r3) addi r3,r3,1 addi r4,r4,1 ; generate priority pattern xori r4,r4,0x8 cmpi CR0,r4,0x10 ; if not equal 0x10 bc 0,2,pri_loop ; jump to proceed loop lis r3,0x0 ori r3,r3,0x8000 mtmsr r3 ; enable ints in MSR ; --- infinite loop --- loop: nop nop b loop ; --- reset vector --- org d:0xfffffff8 b start