⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calmasm.s

📁 samsung 9908DVD源代码,
💻 S
字号:
/**********************************************
 * 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -