1 | /* |
---|
2 | |
---|
3 | Copyright (c) 2011 Red Hat Incorporated. |
---|
4 | All rights reserved. |
---|
5 | |
---|
6 | Redistribution and use in source and binary forms, with or without |
---|
7 | modification, are permitted provided that the following conditions are met: |
---|
8 | |
---|
9 | Redistributions of source code must retain the above copyright |
---|
10 | notice, this list of conditions and the following disclaimer. |
---|
11 | |
---|
12 | Redistributions in binary form must reproduce the above copyright |
---|
13 | notice, this list of conditions and the following disclaimer in the |
---|
14 | documentation and/or other materials provided with the distribution. |
---|
15 | |
---|
16 | The name of Red Hat Incorporated may not be used to endorse |
---|
17 | or promote products derived from this software without specific |
---|
18 | prior written permission. |
---|
19 | |
---|
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
---|
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
---|
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
---|
23 | DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY |
---|
24 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
---|
25 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
---|
26 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
---|
27 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
---|
28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
---|
29 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
30 | |
---|
31 | */ |
---|
32 | |
---|
33 | #ifdef __RL78_G10__ |
---|
34 | ; clobberable |
---|
35 | r8 = 0xffec8 |
---|
36 | r9 = 0xffec9 |
---|
37 | r10 = 0xffeca |
---|
38 | r11 = 0xffecb |
---|
39 | r12 = 0xffecc |
---|
40 | r13 = 0xffecd |
---|
41 | r14 = 0xffece |
---|
42 | r15 = 0xffecf |
---|
43 | ; preserved |
---|
44 | r16 = 0xffed0 |
---|
45 | r17 = 0xffed1 |
---|
46 | r18 = 0xffed2 |
---|
47 | r19 = 0xffed3 |
---|
48 | r20 = 0xffed4 |
---|
49 | r21 = 0xffed5 |
---|
50 | r22 = 0xffed6 |
---|
51 | r23 = 0xffed7 |
---|
52 | #else |
---|
53 | ; clobberable |
---|
54 | r8 = 0xffef0 |
---|
55 | r9 = 0xffef1 |
---|
56 | r10 = 0xffef2 |
---|
57 | r11 = 0xffef3 |
---|
58 | r12 = 0xffef4 |
---|
59 | r13 = 0xffef5 |
---|
60 | r14 = 0xffef6 |
---|
61 | r15 = 0xffef7 |
---|
62 | ; preserved |
---|
63 | r16 = 0xffee8 |
---|
64 | r17 = 0xffee9 |
---|
65 | r18 = 0xffeea |
---|
66 | r19 = 0xffeeb |
---|
67 | r20 = 0xffeec |
---|
68 | r21 = 0xffeed |
---|
69 | r22 = 0xffeee |
---|
70 | r23 = 0xffeef |
---|
71 | #endif |
---|
72 | |
---|
73 | /* The jump buffer has the following structure: |
---|
74 | R0 .. R23 3*8 bytes |
---|
75 | SP 2 bytes |
---|
76 | ES 1 byte |
---|
77 | CS 1 byte |
---|
78 | PC 4 bytes |
---|
79 | */ |
---|
80 | |
---|
81 | .macro _saveb ofs,reg |
---|
82 | mov a,\reg |
---|
83 | mov [hl+\ofs],a |
---|
84 | .endm |
---|
85 | .macro _save ofs,reg |
---|
86 | movw ax,\reg |
---|
87 | movw [hl+\ofs],ax |
---|
88 | .endm |
---|
89 | |
---|
90 | .global _setjmp |
---|
91 | .type _setjmp, @function |
---|
92 | _setjmp: |
---|
93 | ;; R8 = setjmp (jmp_buf *[sp+4].w) |
---|
94 | ;; must return zero !! |
---|
95 | push ax |
---|
96 | push hl |
---|
97 | push ax |
---|
98 | movw ax, [sp+10] |
---|
99 | movw hl, ax |
---|
100 | pop ax |
---|
101 | movw [hl], ax |
---|
102 | _save 2, bc |
---|
103 | _save 4, de |
---|
104 | pop ax |
---|
105 | movw [hl+6], ax |
---|
106 | _save 8, r8 |
---|
107 | _save 10, r10 |
---|
108 | _save 12, r12 |
---|
109 | _save 14, r14 |
---|
110 | _save 16, r16 |
---|
111 | _save 18, r18 |
---|
112 | _save 20, r20 |
---|
113 | _save 22, r22 |
---|
114 | |
---|
115 | ;; The sp we have now includes one more pushed reg, plus $PC |
---|
116 | movw ax, sp |
---|
117 | addw ax, #6 |
---|
118 | movw [hl+24], ax |
---|
119 | |
---|
120 | _saveb 26, es |
---|
121 | _saveb 27, cs |
---|
122 | _save 28, [sp+2] |
---|
123 | _save 30, [sp+4] |
---|
124 | |
---|
125 | clrw ax |
---|
126 | movw r8, ax |
---|
127 | pop ax |
---|
128 | ret |
---|
129 | |
---|
130 | .size _setjmp, . - _setjmp |
---|
131 | |
---|
132 | .macro _loadb ofs,reg |
---|
133 | mov a,[hl+\ofs] |
---|
134 | mov \reg,a |
---|
135 | .endm |
---|
136 | .macro _load ofs,reg |
---|
137 | movw ax,[hl+\ofs] |
---|
138 | movw \reg,ax |
---|
139 | .endm |
---|
140 | .macro _push ofs |
---|
141 | movw ax,[hl+\ofs] |
---|
142 | push ax |
---|
143 | .endm |
---|
144 | |
---|
145 | .global _longjmp |
---|
146 | .type _longjmp, @function |
---|
147 | _longjmp: |
---|
148 | ;; noreturn longjmp (jmp_buf *[sp+4].w, int [sp+6].w) |
---|
149 | movw ax, [sp+6] |
---|
150 | cmpw ax,#0 |
---|
151 | sknz |
---|
152 | onew ax |
---|
153 | movw r8, ax |
---|
154 | |
---|
155 | movw ax, [sp+4] |
---|
156 | movw hl, ax |
---|
157 | movw ax, [hl+24] |
---|
158 | movw sp, ax ; this is the *new* stack |
---|
159 | |
---|
160 | _push 30 ; high half of PC |
---|
161 | _push 28 ; low half of PC |
---|
162 | _push 6 ; HL |
---|
163 | _push 0 ; AX |
---|
164 | |
---|
165 | _load 2, bc |
---|
166 | _load 4, de |
---|
167 | |
---|
168 | _load 10, r10 |
---|
169 | _load 12, r12 |
---|
170 | _load 14, r14 |
---|
171 | _load 16, r16 |
---|
172 | _load 18, r18 |
---|
173 | _load 20, r20 |
---|
174 | _load 22, r22 |
---|
175 | |
---|
176 | _loadb 26, es |
---|
177 | _loadb 27, cs |
---|
178 | |
---|
179 | pop ax |
---|
180 | pop hl |
---|
181 | |
---|
182 | |
---|
183 | ret ; pops PC (4 bytes) |
---|
184 | |
---|
185 | .size _longjmp, . - _longjmp |
---|
186 | |
---|