baseport/syborg/specific/interrupts.cia
branchCompilerCompatibility
changeset 76 8e8bf3dcfd6b
parent 2 d55eb581a87c
equal deleted inserted replaced
59:62a56fb37080 76:8e8bf3dcfd6b
    48  ********************************************************************/
    48  ********************************************************************/
    49 
    49 
    50 __NAKED__ void SyborgInterrupt::MsTimerTick(TAny* /*aPtr*/)
    50 __NAKED__ void SyborgInterrupt::MsTimerTick(TAny* /*aPtr*/)
    51 {
    51 {
    52 	// Service 1ms tick interrupt
    52 	// Service 1ms tick interrupt
    53 	asm("ldr r1, __KHwCounterTimer");
    53 	asm("ldr r1, =KHwCounterTimer");
    54 	asm("push {r0}");
    54 	asm("push {r0}");
    55 	asm("mov r0, #1");
    55 	asm("mov r0, #1");
    56 	asm("str r0, [r1, #24]");
    56 	asm("str r0, [r1, #24]");
    57 	asm("pop {r0}");
    57 	asm("pop {r0}");
    58 	asm("b "CSM_ZN7NTimerQ4TickEv);
    58 	asm("b "CSM_ZN7NTimerQ4TickEv);
    59 	asm("bx lr");
    59 	asm("bx lr");
    60 
       
    61 	asm("__KHwCounterTimer:");
       
    62 	asm(".word %a0" : : "i" ((TInt)KHwBaseCounterTimer));
       
    63 }
    60 }
    64 
    61 
    65 /********************************************************************
    62 /********************************************************************
    66  * Interrupt handling/dispatch
    63  * Interrupt handling/dispatch
    67  ********************************************************************/
    64  ********************************************************************/
    70 // Must preserve r4-r11
    67 // Must preserve r4-r11
    71 // Uses r4,r5,r12
    68 // Uses r4,r5,r12
    72 __NAKED__ void SyborgInterrupt::IrqDispatch()
    69 __NAKED__ void SyborgInterrupt::IrqDispatch()
    73 {
    70 {
    74 	asm("push {r4,r5,lr} ");
    71 	asm("push {r4,r5,lr} ");
    75 	asm("ldr r4, __KHwBaseSic");
    72 	asm("ldr r4, =KHwBaseSic");
    76 	asm("ldr r12, __SicHandlerStart");
    73 	asm("ldr r12, =Handlers");
    77 	asm("ldr r5, [r4, #8]");  // r5 - pending interrupt
    74 	asm("ldr r5, [r4, #8]");  // r5 - pending interrupt
    78 	asm("adr lr, Clear");
    75 	asm("adr lr, Clear");
    79 	asm("add r12, r5, lsl #3");
    76 	asm("add r12, r5, lsl #3");
    80 	asm("ldm r12, {r0, pc}");
    77 	asm("ldm r12, {r0, pc}");
    81 	
    78 	
    82 	asm("Clear:");
    79 	asm("Clear:");
    83 	//	asm("str r5, [r4, #16]");        // TODO: error
    80 	//	asm("str r5, [r4, #16]");        // TODO: error
    84 	asm("pop {r4,r5,pc}");
    81 	asm("pop {r4,r5,pc}");
    85 
    82 
    86 	asm("__KHwBaseSic:");
       
    87 	asm(".word %a0" : : "i" ((TInt)KHwBaseSic));
       
    88 	asm("__SicHandlerStart:");
       
    89 	asm(".word %a0" : : "i" ((TInt)&Handlers[0]));
       
    90 }
    83 }
    91 
    84 
    92 __NAKED__ void SyborgInterrupt::FiqDispatch()
    85 __NAKED__ void SyborgInterrupt::FiqDispatch()
    93 {
    86 {
    94 	// FIQ dispatcher
    87 	// FIQ dispatcher