]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm_Fx3.s85
Update copyright date ready for tagging V10.1.0.
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm_Fx3.s85
1 ;/*\r
2 ; * FreeRTOS Kernel V10.1.0\r
3 ; * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4 ; *\r
5 ; * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6 ; * this software and associated documentation files (the "Software"), to deal in\r
7 ; * the Software without restriction, including without limitation the rights to\r
8 ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9 ; * the Software, and to permit persons to whom the Software is furnished to do so,\r
10 ; * subject to the following conditions:\r
11 ; *\r
12 ; * The above copyright notice and this permission notice shall be included in all\r
13 ; * copies or substantial portions of the Software.\r
14 ; *\r
15 ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16 ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17 ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18 ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19 ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20 ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21 ; *\r
22 ; * http://www.FreeRTOS.org\r
23 ; * http://aws.amazon.com/freertos\r
24 ; *\r
25 ; * 1 tab == 4 spaces!\r
26 ; */\r
27 ; Note: Select the correct include files for the device used by the application.\r
28 #include "FreeRTOSConfig.h"\r
29 ;------------------------------------------------------------------------------\r
30 \r
31 ; Functions used by scheduler\r
32 ;------------------------------------------------------------------------------\r
33     EXTERN    vTaskSwitchContext\r
34     EXTERN    xTaskIncrementTick\r
35 \r
36 ; Variables used by scheduler\r
37 ;------------------------------------------------------------------------------\r
38     EXTERN    pxCurrentTCB\r
39     EXTERN    usCriticalNesting\r
40 \r
41 ; Functions implemented in this file\r
42 ;------------------------------------------------------------------------------\r
43     PUBLIC    vPortYield\r
44     PUBLIC    vPortStart\r
45 \r
46 ; Security ID definition\r
47 ;------------------------------------------------------------------------------\r
48 #define CG_SECURITY0    0FFH\r
49 #define CG_SECURITY1    0FFH\r
50 #define CG_SECURITY2    0FFH\r
51 #define CG_SECURITY3    0FFH\r
52 #define CG_SECURITY4    0FFH\r
53 #define CG_SECURITY5    0FFH\r
54 #define CG_SECURITY6    0FFH\r
55 #define CG_SECURITY7    0FFH\r
56 #define CG_SECURITY8    0FFH\r
57 #define CG_SECURITY9    0FFH\r
58 \r
59 ; Option Byte definitions\r
60 ;------------------------------------------------------------------------------\r
61 #define CG_OPTION7A     0x00\r
62 #define CG_OPTION7B     0x04\r
63 #define OPT7C           0x00\r
64 #define OPT7D           0x00\r
65 #define OPT7E           0x00\r
66 #define OPT7F           0x00\r
67 \r
68 ; Tick ISR Prototype\r
69 ;------------------------------------------------------------------------------\r
70         PUBWEAK `??MD_INTTM0EQ0??INTVEC 608`\r
71         PUBLIC MD_INTTM0EQ0\r
72 \r
73 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
74 `??MD_INTTM0EQ0??INTVEC 608` SYMBOL "??INTVEC 608", MD_INTTM0EQ0\r
75 \r
76 ;------------------------------------------------------------------------------\r
77 ;   portSAVE_CONTEXT MACRO\r
78 ;   Saves the context of the remaining general purpose registers\r
79 ;   and the usCriticalNesting Value of the active Task onto the task stack\r
80 ;   saves stack pointer to the TCB\r
81 ;------------------------------------------------------------------------------\r
82 portSAVE_CONTEXT MACRO\r
83 #if configDATA_MODE == 1                                        ; Using the Tiny data model\r
84     prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers\r
85     sst.w   r19,72[ep]\r
86     sst.w   r18,68[ep]\r
87     sst.w   r17,64[ep]\r
88     sst.w   r16,60[ep]\r
89     sst.w   r15,56[ep]\r
90     sst.w   r14,52[ep]\r
91     sst.w   r13,48[ep]\r
92     sst.w   r12,44[ep]\r
93     sst.w   r11,40[ep]\r
94     sst.w   r10,36[ep]\r
95     sst.w   r9,32[ep]\r
96     sst.w   r8,28[ep]\r
97     sst.w   r7,24[ep]\r
98     sst.w   r6,20[ep]\r
99     sst.w   r5,16[ep]\r
100     sst.w   r4,12[ep]\r
101 #else                                                           ; Using the Small/Large data model\r
102     prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers\r
103     sst.w   r19,68[ep]\r
104     sst.w   r18,64[ep]\r
105     sst.w   r17,60[ep]\r
106     sst.w   r16,56[ep]\r
107     sst.w   r15,52[ep]\r
108     sst.w   r14,48[ep]\r
109     sst.w   r13,44[ep]\r
110     sst.w   r12,40[ep]\r
111     sst.w   r11,36[ep]\r
112     sst.w   r10,32[ep]\r
113     sst.w   r9,28[ep]\r
114     sst.w   r8,24[ep]\r
115     sst.w   r7,20[ep]\r
116     sst.w   r6,16[ep]\r
117     sst.w   r5,12[ep]\r
118 #endif /* configDATA_MODE */\r
119     sst.w   r2,8[ep]\r
120     sst.w   r1,4[ep]\r
121     MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack\r
122     ld.w    lw1(usCriticalNesting)[r1],r2\r
123     sst.w   r2,0[ep]\r
124     MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB\r
125     ld.w    lw1(pxCurrentTCB)[r1],r2\r
126     st.w    sp,0[r2]\r
127     ENDM\r
128 ;------------------------------------------------------------------------------\r
129 \r
130 ;------------------------------------------------------------------------------\r
131 ;   portRESTORE_CONTEXT MACRO\r
132 ;   Gets stack pointer from the current TCB\r
133 ;   Restores the context of the usCriticalNesting value and general purpose\r
134 ;   registers of the selected task from the task stack\r
135 ;------------------------------------------------------------------------------\r
136 portRESTORE_CONTEXT MACRO\r
137     MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address\r
138     ld.w    lw1(pxCurrentTCB)[r1],sp\r
139     MOV     sp,r1\r
140     ld.w    0[r1],sp                        ; load stackpointer\r
141     MOV     sp,ep                           ; set stack pointer to element pointer\r
142     sld.w   0[ep],r1                        ; load usCriticalNesting value from stack\r
143     MOVHI   hi1(usCriticalNesting),r0,r2\r
144     st.w    r1,lw1(usCriticalNesting)[r2]\r
145     sld.w   4[ep],r1                        ; restore general purpose registers\r
146     sld.w   8[ep],r2\r
147 #if configDATA_MODE == 1                    ; Using Tiny data model\r
148     sld.w   12[ep],r4\r
149     sld.w   16[ep],r5\r
150     sld.w   20[ep],r6\r
151     sld.w   24[ep],r7\r
152     sld.w   28[ep],r8\r
153     sld.w   32[ep],r9\r
154     sld.w   36[ep],r10\r
155     sld.w   40[ep],r11\r
156     sld.w   44[ep],r12\r
157     sld.w   48[ep],r13\r
158     sld.w   52[ep],r14\r
159     sld.w   56[ep],r15\r
160     sld.w   60[ep],r16\r
161     sld.w   64[ep],r17\r
162     sld.w   68[ep],r18\r
163     sld.w   72[ep],r19\r
164     dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}\r
165 #else                                       ; Using Small/Large data model\r
166     sld.w   12[ep],r5\r
167     sld.w   16[ep],r6\r
168     sld.w   20[ep],r7\r
169     sld.w   24[ep],r8\r
170     sld.w   28[ep],r9\r
171     sld.w   32[ep],r10\r
172     sld.w   36[ep],r11\r
173     sld.w   40[ep],r12\r
174     sld.w   44[ep],r13\r
175     sld.w   48[ep],r14\r
176     sld.w   52[ep],r15\r
177     sld.w   56[ep],r16\r
178     sld.w   60[ep],r17\r
179     sld.w   64[ep],r18\r
180     sld.w   68[ep],r19\r
181     dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}\r
182 #endif /* configDATA_MODE */\r
183     ENDM\r
184 ;------------------------------------------------------------------------------\r
185 \r
186 ;------------------------------------------------------------------------------\r
187 ;   Restore the context of the first task that is going to run.\r
188 ;\r
189 ;   Input:  NONE\r
190 ;\r
191 ;   Call:   CALL    vPortStart\r
192 ;\r
193 ;   Output: NONE\r
194 ;------------------------------------------------------------------------------\r
195     RSEG CODE:CODE\r
196 vPortStart:\r
197     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
198     ld.w    0[sp],lp\r
199     ldsr    lp,5                            ; restore PSW\r
200     DI\r
201     ld.w    4[sp],lp                        ; restore LP\r
202     ld.w    8[sp],lp                        ; restore LP\r
203     ADD     0x0C,sp                         ; set SP to right position\r
204     EI\r
205     jmp     [lp]\r
206 ;------------------------------------------------------------------------------\r
207 \r
208 ;------------------------------------------------------------------------------\r
209 ;   Port Yield function to check for a Task switch in the cooperative and\r
210 ;   preemptive mode\r
211 ;\r
212 ;   Input:  NONE\r
213 ;\r
214 ;   Call:   CALL    vPortYield\r
215 ;\r
216 ;   Output: NONE\r
217 ;------------------------------------------------------------------------------\r
218 \r
219         RSEG CODE:CODE\r
220 vPortYield:\r
221 \r
222     add     -0x0C,sp                          ; prepare stack to save necessary values\r
223     st.w    lp,8[sp]                        ; store LP to stack\r
224     stsr    0,r31\r
225     st.w    lp,4[sp]                        ; store EIPC to stack\r
226     stsr    1,lp\r
227     st.w    lp,0[sp]                        ; store EIPSW to stack\r
228     portSAVE_CONTEXT                        ; Save the context of the current task.\r
229     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
230     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
231                                             ; ... scheduler decided should run.\r
232         ld.w    0[sp],lp                        ; restore EIPSW from stack\r
233     ldsr    lp,1\r
234     ld.w    4[sp],lp                        ; restore EIPC from stack\r
235     ldsr    lp,0\r
236     ld.w    8[sp],lp                        ; restore LP from stack\r
237     add     0x0C,sp                         ; set SP to right position\r
238 \r
239     RETI\r
240 \r
241 ;------------------------------------------------------------------------------\r
242 \r
243 ;------------------------------------------------------------------------------\r
244 ;   Perform the necessary steps of the Tick Count Increment and Task Switch\r
245 ;   depending on the chosen kernel configuration\r
246 ;\r
247 ;   Input:  NONE\r
248 ;\r
249 ;   Call:   ISR\r
250 ;\r
251 ;   Output: NONE\r
252 ;------------------------------------------------------------------------------\r
253 #if configUSE_PREEMPTION == 1               ; use preemptive kernel mode\r
254 \r
255 MD_INTTM0EQ0:\r
256 \r
257     add     -0x0C,sp                          ; prepare stack to save necessary values\r
258     st.w    lp,8[sp]                        ; store LP to stack\r
259     stsr    0,r31\r
260     st.w    lp,4[sp]                        ; store EIPC to stack\r
261     stsr    1,lp\r
262     st.w    lp,0[sp]                        ; store EIPSW to stack\r
263     portSAVE_CONTEXT                        ; Save the context of the current task.\r
264     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
265     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
266     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
267                                             ; ... scheduler decided should run.\r
268     ld.w    0[sp],lp                        ; restore EIPSW from stack\r
269     ldsr    lp,1\r
270     ld.w    4[sp],lp                        ; restore EIPC from stack\r
271     ldsr    lp,0\r
272     ld.w    8[sp],lp                        ; restore LP from stack\r
273     add     0x0C,sp                         ; set SP to right position\r
274 \r
275     RETI\r
276 ;------------------------------------------------------------------------------\r
277 #else                                       ; use cooperative kernel mode\r
278 \r
279 MD_INTTM0EQ0:\r
280     prepare {lp,ep},8,sp\r
281     sst.w   r1,4[ep]\r
282     sst.w   r5,0[ep]\r
283     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
284     sld.w   0[ep],r5\r
285     sld.w   4[ep],r1\r
286     dispose 8,{lp,ep}\r
287     RETI\r
288 #endif /* configUSE_PREEMPTION */\r
289 \r
290 ;------------------------------------------------------------------------------\r
291         COMMON INTVEC:CODE:ROOT(2)\r
292         ORG 608\r
293 `??MD_INTTM0EQ0??INTVEC 608`:\r
294         JR MD_INTTM0EQ0\r
295 \r
296         RSEG NEAR_ID:CONST:SORT:NOROOT(2)\r
297 `?<Initializer for usCriticalNesting>`:\r
298         DW 10\r
299 \r
300       COMMON INTVEC:CODE:ROOT(2)\r
301       ORG 40H\r
302 `??vPortYield??INTVEC 40`:\r
303         JR vPortYield\r
304 \r
305 ;------------------------------------------------------------------------------\r
306 ; set microcontroller security ID\r
307 \r
308       COMMON INTVEC:CODE:ROOT(2)\r
309       ORG 70H\r
310 `SECUID`:\r
311       DB CG_SECURITY0\r
312       DB CG_SECURITY1\r
313       DB CG_SECURITY2\r
314       DB CG_SECURITY3\r
315       DB CG_SECURITY4\r
316       DB CG_SECURITY5\r
317       DB CG_SECURITY6\r
318       DB CG_SECURITY7\r
319       DB CG_SECURITY8\r
320       DB CG_SECURITY9\r
321 \r
322 ;------------------------------------------------------------------------------\r
323 ; set microcontroller option bytes\r
324 \r
325       COMMON INTVEC:CODE:ROOT(2)\r
326       ORG 7AH\r
327 `OPTBYTES`:\r
328       DB CG_OPTION7A\r
329       DB CG_OPTION7B\r
330       DB OPT7C\r
331       DB OPT7D\r
332       DB OPT7E\r
333       DB OPT7F\r
334 \r
335       END