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

📄 swi_handler.lst

📁 国外LPC2000系列的一些源程序,请大家快快下载
💻 LST
字号:
   1              	# 1 "Compil/srcWinARM/swi_handler.S"
   2              	# 1 "<built-in>"
   1              	/*****************************************************************************
   0              	
   0              	
   2              	 *   swi_handler.s: SWI handler file ARM 
   3              	 *   tested with ARM77TDMI and ARM77TDMI-S 
   4              	 *
   5              	 *   by Martin Thomas 
   6              	 *   http://www.siwawi.arubi.uni-kl.de/avr_projects
   7              	 *   based on information from ARM documents
   8              	 *
   9              	 *****************************************************************************/
  10              	 
  11              	/* 
  12              	  20060902 - SWI-handler in section .init if vectors in ROM
  13              	             SWI-handler in section .fastrun if vectors in RAM
  14              	*/
  15              	               
  16              	 
  17              	#include "swi_numbers.h"
   1              	#ifndef SWI_NUM_
   2              	#define SWI_NUM_
   3              	
   4              	/*
   5              	.set SWI_IRQ_DIS,	0
   6              	.set SWI_IRQ_EN,	1
   7              	.set SWI_FIQ_DIS,	2
   8              	.set SWI_FIQ_EN,	3
   9              	.set SWI_GET_CPSR,	4
  10              	.set SWI_IRQ_REST,	5
  11              	.set SWI_FIQ_REST,	6
  12              	*/
  13              	
  14              	#define SWI_NUM_IRQ_DIS	0
  15              	#define SWI_NUM_IRQ_EN	1
  16              	#define SWI_NUM_FIQ_DIS	2
  17              	#define SWI_NUM_FIQ_EN	3
  18              	#define SWI_NUM_GET_CPSR	4
  18              	
  19              	.set SWI_IRQ_DIS,	SWI_NUM_IRQ_DIS
  20              	.set SWI_IRQ_EN,	SWI_NUM_IRQ_EN
  21              	.set SWI_FIQ_DIS,	SWI_NUM_FIQ_DIS
  22              	.set SWI_FIQ_EN,	SWI_NUM_FIQ_EN
  23              	.set SWI_GET_CPSR,	SWI_NUM_GET_CPSR
  24              	.set SWI_IRQ_REST,	SWI_NUM_IRQ_REST
  25              	.set SWI_FIQ_REST,	SWI_NUM_FIQ_REST
  26              	
  27              	.set I_Bit, 0x80
  28              	.set F_Bit, 0x40
  29              	.set T_Bit, 0x20
  30              	
  31              	#ifdef ROM_RUN
  32              	#ifdef VECTORS_IN_RAM
  33              		.set VECTREMAPPED, 1
  34              	#else
  35              		.set VECTREMAPPED, 0
  36              	#endif
  37              	#endif
  38              	
  39              	#ifdef RAM_RUN
  40              		.set VECTREMAPPED, 0
  41              	#endif
  42              	
  43              	
  44              	.text
  45              	.arm
  46              	
  47              	/* Handler located in RAM if exception-vector in RAM */
  48              	.if (VECTREMAPPED)
  49              		.print "SWI-Handler in section .fastrun -> .data"
  50              		.section .fastrun, "ax"
  51              	.else
  52              		.print "SWI-Handler in section .init -> .text"
  53              		.section .init, "ax"
  54              	.endif
  55              	
  56              	
  57              	/* for external c-function (dummy provided at EOF if no 
  58              	   c-function should be used) */
  59              	.extern SWI_Handler_User
  60              	
  61              	  
  62              	.global SoftwareInterruptASM
  63              	.func   SoftwareInterruptASM
  64              	SoftwareInterruptASM:
  65 0000 10402DE9 		STMFD   sp!, {r4, lr}      /* store regs. */
  66 0004 00404FE1 		MRS     r4, spsr
  67 0008 200014E3 		TST     r4, #T_Bit             /* test for thumb */
  68 000c B2405E11 		LDRNEH  r4, [lr, #-2]          /* NE->thumb - get swi instruction code */
  69 0010 FF4CC413 		BICNE   r4, r4, #0xff00        /* NE->thumb - clear top 8 bits leaving swi "comment field"=number 
  70 0014 04401E05 		LDREQ   r4, [lr, #-4]          /* EQ->arm - get swi instruction code */
  71 0018 FF44C403 		BICEQ   r4, r4, #0xff000000    /* EQ->arm - clear top 8 bits leaving swi "comment field"=number */
  72 001c 060054E3 		CMP     r4, #MAX_SWI           /* range-check */
  73 0020 04F19F97 		LDRLS   pc, [pc, r4, LSL #2]   /* jump to routine if <= MAX (LS) */
  74              	
  75              	/* if none from the predefined SWIs match call the user磗-handler */
  76 0024 280000EA 		B       UserSWIHandler
  77              		
  78              	
  79              	/* Jump-Table */
  80              	SwiTableStart:
  81 0028 44000000 		.word IRQDisable	// 0
  82 002c 54000000 		.word IRQEnable		// 1
  83 0030 64000000 		.word FIQDisable	// 2
  84 0034 78000000 		.word FIQEnable		// 3
  85 0038 8C000000 		.word CPSRget		// 4
  86 003c 94000000 		.word IRQRestore	// 5
  87 0040 B0000000 		.word FIQRestore	// 6
  88              	SwiTableEnd:
  89              		.set MAX_SWI, ((SwiTableEnd-SwiTableStart)/4)-1
  90              	
  91              	IRQDisable:
  92 0044 00004FE1 		MRS     r0, SPSR                        /* Get SPSR = return value */
  93 0048 804080E3 		ORR     r4, r0, #I_Bit                  /* I_Bit set */
  94 004c 04F061E1 		MSR     SPSR_c, r4                      /* Set SPSR */
  95 0050 280000EA 		B       EndofSWI
  96              	   	
  97              	IRQEnable:
  98 0054 00004FE1 		MRS     r0, SPSR                        /* Get SPSR = return value */
  99 0058 8040C0E3 		BIC     r4, r0, #I_Bit                  /* I_Bit clear */
 100 005c 04F061E1 		MSR     SPSR_c, r4                      /* Set SPSR */
 101 0060 240000EA 		B       EndofSWI                       
 102              	 
 103              	FIQDisable:
 104 0064 00004FE1 		MRS     r0, SPSR
 105 0068 404080E3 		ORR     r4, r0, #F_Bit
 106 006c 400000E2 		AND     r0, r0, #F_Bit
 107 0070 04F061E1 		MSR     SPSR_c, r4
 108 0074 1F0000EA 		B       EndofSWI
 109              	
 110              	FIQEnable:
 111 0078 00004FE1 		MRS     r0, SPSR
 112 007c 4040C0E3 		BIC     r4, r0, #F_Bit
 113 0080 400000E2 		AND     r0, r0, #F_Bit
 114 0084 04F061E1 		MSR     SPSR_c, r4
 115 0088 1A0000EA 		B       EndofSWI
 116              	
 117              	CPSRget:
 118              		// LDR r0, =0xdeadbeef
 119 008c 00004FE1 		MRS     r0, SPSR                        /* Get SPSR */
 120 0090 180000EA 		B       EndofSWI                       
 121              	
 122              	IRQRestore:
 123 0094 00404FE1 		MRS     r4, SPSR                        /* Get SPSR */
 124 0098 800000E2 		AND     r0, r0, #I_Bit
 125 009c 800010E3 		TST     r0, #I_Bit             /* Test input for I_Bit */
 126 00a0 8040C403 		BICEQ   r4, r4, #I_Bit
 127 00a4 80408413 		ORRNE   r4, r4, #I_Bit
 128 00a8 04F061E1 		MSR     SPSR_c, r4
 129 00ac 110000EA 		B       EndofSWI
 130              	
 131              	FIQRestore:
 132 00b0 00404FE1 		MRS     r4, SPSR                        /* Get SPSR */
 133 00b4 400000E2 		AND     r0, r0, #F_Bit
 134 00b8 400010E3 		TST     r0, #F_Bit             /* Test input for F_Bit */
 135 00bc 4040C403 		BICEQ   r4, r4, #F_Bit
 136 00c0 40408413 		ORRNE   r4, r4, #F_Bit
 137 00c4 04F061E1 		MSR     SPSR_c, r4
 138 00c8 0A0000EA 		B       EndofSWI
 139              	
 140              	UserSWIHandler:
 141 00cc FE5F2DE9 		stmfd	sp!,{r1-r12,lr}
 142 00d0 00C04FE1 		mrs	r12, spsr
 143 00d4 00102DE9 		stmfd	sp!, {r12}
 144 00d8 1CC09FE5 		ldr     r12, =SWI_Handler_User
 145 00dc 0430A0E1 		mov     r3, r4 /* pass SWI-Number as Param */
 146 00e0 0FE0A0E1 		mov     lr, pc
 147 00e4 1CFF2FE1 		bx      r12    /* call c-function */
 148 00e8 0010BDE8 		ldmfd	sp!, {r12}
 149 00ec 0CF06FE1 		msr	spsr_cxsf, r12
 150 00f0 FE9FFDE8 		ldmfd	sp!, {r1-r12,pc}^  /* return-value in r0 */
 151 00f4 FFFFFFEA 		b	EndofSWI
 152              	
 153              	EndofSWI:
 154 00f8 1080FDE8 		LDMFD   sp!, {r4,pc}^
 155              	.endfunc
 156              	
 157              	#if 0
 158              	/* dummy if no c-function is available - TODO weak? */
 159              	SWI_Handler_User:
 160              		bx lr
 161              	#endif
 162              	
 163              	
 164 00fc 00000000 	.end
DEFINED SYMBOLS
                            *ABS*:00000000 Compil/srcWinARM/swi_handler.S
Compil/srcWinARM/swi_handler.S:19     *ABS*:00000000 SWI_IRQ_DIS
Compil/srcWinARM/swi_handler.S:20     *ABS*:00000001 SWI_IRQ_EN
Compil/srcWinARM/swi_handler.S:21     *ABS*:00000002 SWI_FIQ_DIS
Compil/srcWinARM/swi_handler.S:22     *ABS*:00000003 SWI_FIQ_EN
Compil/srcWinARM/swi_handler.S:23     *ABS*:00000004 SWI_GET_CPSR
Compil/srcWinARM/swi_handler.S:24     *ABS*:00000005 SWI_IRQ_REST
Compil/srcWinARM/swi_handler.S:25     *ABS*:00000006 SWI_FIQ_REST
Compil/srcWinARM/swi_handler.S:27     *ABS*:00000080 I_Bit
Compil/srcWinARM/swi_handler.S:28     *ABS*:00000040 F_Bit
Compil/srcWinARM/swi_handler.S:29     *ABS*:00000020 T_Bit
Compil/srcWinARM/swi_handler.S:33     *ABS*:00000001 VECTREMAPPED
Compil/srcWinARM/swi_handler.S:45     .text:00000000 $a
Compil/srcWinARM/swi_handler.S:64     .fastrun:00000000 SoftwareInterruptASM
Compil/srcWinARM/swi_handler.S:65     .fastrun:00000000 $a
                            *ABS*:00000006 MAX_SWI
Compil/srcWinARM/swi_handler.S:140    .fastrun:000000cc UserSWIHandler
Compil/srcWinARM/swi_handler.S:80     .fastrun:00000028 SwiTableStart
Compil/srcWinARM/swi_handler.S:81     .fastrun:00000028 $d
Compil/srcWinARM/swi_handler.S:91     .fastrun:00000044 IRQDisable
Compil/srcWinARM/swi_handler.S:97     .fastrun:00000054 IRQEnable
Compil/srcWinARM/swi_handler.S:103    .fastrun:00000064 FIQDisable
Compil/srcWinARM/swi_handler.S:110    .fastrun:00000078 FIQEnable
Compil/srcWinARM/swi_handler.S:117    .fastrun:0000008c CPSRget
Compil/srcWinARM/swi_handler.S:122    .fastrun:00000094 IRQRestore
Compil/srcWinARM/swi_handler.S:131    .fastrun:000000b0 FIQRestore
Compil/srcWinARM/swi_handler.S:88     .fastrun:00000044 SwiTableEnd
Compil/srcWinARM/swi_handler.S:92     .fastrun:00000044 $a
Compil/srcWinARM/swi_handler.S:153    .fastrun:000000f8 EndofSWI
Compil/srcWinARM/swi_handler.S:164    .fastrun:000000fc $d

UNDEFINED SYMBOLS
SWI_Handler_User

⌨️ 快捷键说明

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