?? calmasm.s
字號(hào):
/**********************************************
* Calmasm.s
* coded by hjahn@ce.cnu.ac.kr
* date :
**********************************************/
;INCLUDE int_defs.s
CodingArea SECTION CODE
GLOBAL _MK_StartHighPriorityTask
GLOBAL _MK_ContextSwitch
GLOBAL _MK_InterruptDisable
GLOBAL _MK_InterruptEnable
GLOBAL _MK_InterruptRestore
GLOBAL _MK_StartHeapAddress
GLOBAL _MK_LocalControlInterrupt
// GLOBAL _MK_IRQHandler
GLOBAL _MK_FIQHandler
EXTERN |IMAGE$$DM$$BASE|
EXTERN |IMAGE$$CDATA_DM$$BASE|
EXTERN |IMAGE$$IDATA$$BASE|
EXTERN |IMAGE$$ZDATA$$BASE|
EXTERN |IMAGE$$ZDATA$$SIZE|
EXTERN |IMAGE$$UDATA$$BASE|
EXTERN |IMAGE$$STACK$$BASE|
EXTERN |IMAGE$$STACK$$LIMIT|
// EXTERN _MK_IntEnter
// EXTERN _MK_ServiceIRQ
// EXTERN _MK_IntExit
EXTERN _MK_ServiceFIQ
;****************************************************************************
; Function: void MK_StartHeapAddress(void **first_available_memory, int *Size)
;
; Input: a10 - return variable to UDATA start address
; Input :r2 - return variable to UDATA size
;****************************************************************************
ALIGN
_MK_StartHeapAddress
PUSH A12
PUSH A13
LD R1,#|IMAGE$$DM$$BASE|
LD R2,#|IMAGE$$CDATA_DM$$BASE|
LD R3,#|IMAGE$$IDATA$$BASE|
LD R4,#|IMAGE$$ZDATA$$BASE|
LD R5,#|IMAGE$$ZDATA$$SIZE|
LD R6,#|IMAGE$$UDATA$$BASE|
//LD R6,#|IMAGE$$STACK$$BASE|
//LD R7,#|IMAGE$$STACK$$LIMIT|
//LDW @[A10], A12
//LDW @[A11], A13
POP A13
POP A12
RET
;****************************************************************************
; Function: VOID MK_StartHighPriorityTask(ULONG *pCurrentStack)
;
; Input: A10 - Task Stack pointer
;****************************************************************************
ALIGN
_MK_StartHighPriorityTask
;Load sp
LDW R1,@[A10]
LDW R2,@[A10+2]
LD E15,R1
LD R15,R2
POP R0 ; SR
LD SR,R0
POP R0
POP R1
POP R2
POP R3
POP R4
POP R5
POP R6
POP R7
POP A8
POP A9
POP A10
POP A11
POP A12
POP A13
POP A14 ;LR
RET
;****************************************************************************
; Function: VOID MK_ContextSwitch(ULONG *pOldStack, ULONG *pNewStack);
;
; Input: A10 - pointer of Old Task
; A11 - pointer of New Task
;****************************************************************************
ALIGN
_MK_ContextSwitch
PUSH A14 ;first, we already made empty space
PUSH A13
PUSH A12
PUSH A11
PUSH A10
PUSH A9
PUSH A8
PUSH R7
PUSH R6
PUSH R5
PUSH R4
PUSH R3
PUSH R2
PUSH R1
PUSH R0
LD R0,SR
PUSH R0
LD R3,E15
LDW @[A10],R3
LDW @[A10+2],R15 ;to return old stack pointer
LDW R1,@[A11]
LDW R2,@[A11+2]
LD E15,R1
LD R15,R2
POP R0 ; SR
LD SR,R0
POP R0
POP R1
POP R2
POP R3
POP R4
POP R5
POP R6
POP R7
POP A8
POP A9
POP A10
POP A11
POP A12
POP A13
POP A14 ;LR
RET
/*
;****************************************************************************
; Function: MK_IRQHandler()
;
;****************************************************************************
ALIGN
_MK_IRQHandler
;CLRSR FE ;FRQ disalble
;CLRSR IE ;IRQ disalble
;CLRSR TE ;TRQ disalble
PUSH A14
PUSH A13
PUSH A12
PUSH A11
PUSH A10
PUSH A9
PUSH A8
PUSH R7
PUSH R6
PUSH R5
PUSH R4
PUSH R3
PUSH R2
PUSH R1
PUSH R0
LD R0,SPCH_IRQ
PUSH R0
LD R0,SPCL_IRQ
PUSH R0
LD R0,SSR_IRQ
PUSH R0
JSR _MK_IntEnter
JSR _MK_ServiceIRQ
JSR _MK_IntExit
POP R0
LD SSR_IRQ,R0
POP R0
LD SPCL_IRQ,R0
POP R0
LD SPCH_IRQ,R0
POP R0
POP R1
POP R2
POP R3
POP R4
POP R5
POP R6
POP R7
POP A8
POP A9
POP A10
POP A11
POP A12
POP A13
POP A14 ;LR
RET_IRQ
*/
;****************************************************************************
; Function: MK_FIQHandler()
;
;****************************************************************************
ALIGN
_MK_FIQHandler
; CLRSR FE ;FRQ disalble
;CLRSR IE ;IRQ disalble
;CLRSR TE ;TRQ disalble
PUSH A14
PUSH A13
PUSH A12
PUSH A11
PUSH A10
PUSH A9
PUSH A8
PUSH R7
PUSH R6
PUSH R5
PUSH R4
PUSH R3
PUSH R2
PUSH R1
PUSH R0
LD R0,SPCH_IRQ
PUSH R0
LD R0,SPCL_IRQ
PUSH R0
LD R0,SSR_IRQ
PUSH R0
JSR _MK_ServiceFIQ
POP R0
LD SSR_IRQ,R0
POP R0
LD SPCL_IRQ,R0
POP R0
LD SPCH_IRQ,R0
POP R0
POP R1
POP R2
POP R3
POP R4
POP R5
POP R6
POP R7
POP A8
POP A9
POP A10
POP A11
POP A12
POP A13
POP A14 ;LR
RET_FIQ
;****************************************************************************
; Function: int MK_InterruptDisable(void)
;
;****************************************************************************
ALIGN
_MK_InterruptDisable
PUSH A14
PUSH R0
LD R0,SR
LD R2,R0
CLRSR IE
CLRSR FE
POP R0
POP A14
RET
;****************************************************************************
; Function: int MK_InterruptEnable(void)
;
;****************************************************************************
ALIGN
_MK_InterruptEnable
PUSH A14
PUSH R0
LD R0,SR
LD R2,R0
SETSR IE
SETSR FE
POP R0
POP A14
RET
;****************************************************************************
; Function: void MK_InterruptRestore(int Flags)
;
;****************************************************************************
ALIGN
_MK_InterruptRestore
PUSH A14
PUSH R0
LD R0,R2
LD SR,R0
POP R0
POP A14
RET
;****************************************************************************
; Function: int MK_LocalControlInterrupt(int Flags)
; Input: R2 - new flag(0 or 1)
; Output: R2 - old flag(0 or 1)
;****************************************************************************
ALIGN
_MK_LocalControlInterrupt
PUSH A14 ;LR
PUSH R0
PUSH R4
LD R0,SR
AND R0,#0x0003 ;old IE bit(flag)
;clear IE, FE in SR
CLRSR IE
CLRSR FE
LD R4,R0 ;backup old flag
LD R0,R2
AND R0,#0x1
BRF 2 ;if new flag is 1, SR will be set
SETSR IE
SETSR FE
2
LD R2,R4 ;store old flag
POP R4
POP R0
POP R14 ;LR
RET
;====================================================================================
;
;====================================================================================
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -