Hackfix and re-enable strtoull and wcstoull, see bug #3798.
[sdcc.git] / sdcc / device / lib / _gptrget.c
blob30c15f2678b2664ed6a181bb43545e8f337fcd2a
1 /*-------------------------------------------------------------------------
2 _gptrget.c - get value for a generic pointer
4 Copyright (c) 1999, Sandeep Dutta . sandeep.dutta@usa.net
6 This library is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this library; see the file COPYING. If not, write to the
18 Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
19 MA 02110-1301, USA.
21 As a special exception, if you link this library with other files,
22 some of which are compiled with SDCC, to produce an executable,
23 this library does not by itself cause the resulting executable to
24 be covered by the GNU General Public License. This exception does
25 not however invalidate any other reasons why the executable file
26 might be covered by the GNU General Public License.
27 -------------------------------------------------------------------------*/
29 /* not all devices use P2 to page pdata memory, therefore __XPAGE was
30 introduced. On some targets __XPAGE itself is a paged SFR so it is
31 not safe for all platforms to set this. Furthermore some targets
32 can be configured to behave differently for movx @dptr vs. movx @Ri
33 (don't drive high byte of address bus for movx @Ri only) */
34 #define USE_PDATA_PAGING_REGISTER 0
36 __sbit __at (0xF7) B_7;
37 __sbit __at (0xF6) B_6;
38 __sbit __at (0xF5) B_5;
40 /* the return value is expected to be in acc, and not in the standard
41 * location dpl. Therefore we choose return type void here: */
42 #if defined DSDCC_MODEL_HUGE
43 void
44 _gptrget (char *gptr) __naked
46 /* This is the banked version with pointers up to 23 bits.
47 B cannot be trashed */
49 gptr; /* hush the compiler */
51 __asm
53 ; depending on the pointer type acc. to SDCCsymt.h
55 jb _B_7,codeptr$ ; >0x80 code ; 3
56 jnb _B_6,xdataptr$ ; <0x40 far ; 3
58 mov dph,r0 ; save r0 independent of regbank ; 2
59 mov r0,dpl ; use only low order address ; 2
61 jb _B_5,pdataptr$ ; >0x60 pdata ; 3
63 ; Pointer to data space
65 mov a,@r0 ; 1
66 dataptrrestore$:
67 mov r0,dph ; restore r0 ; 2
68 mov dph,#0 ; restore dph ; 3
69 ret ; 1
71 ; pointer to external stack or pdata
73 pdataptr$:
74 movx a,@r0 ; 1
75 sjmp dataptrrestore$ ; 2
77 ; pointer to code area
79 codeptr$:
80 ; implementation for SiLabs C8051F12x
81 mov a,b ; 2
82 anl a,#0x03 ; 2
83 swap a ; 1
84 push _PSBANK ; 2
85 anl _PSBANK,#0x0F ; 3
86 orl _PSBANK,a ; 2
88 clr a ; 1
89 movc a,@a+dptr ; 1
90 pop _PSBANK ; 2
91 ret ; 1
93 ; pointer to xternal data
95 xdataptr$:
96 ; implementation for xram a16-a21 tied to P3
97 mov _P3,b ; 3
99 movx a,@dptr ; 1
100 ret ; 1
101 ;===
102 ;45 bytes
103 __endasm;
106 #elif defined DSDCC_MODEL_MEDIUM
108 void
109 _gptrget (char *gptr) __naked
111 /* This is the non-banked version with pointers up to 15 bits.
112 Assumes B is free to be used */
114 gptr; /* hush the compiler */
116 __asm
118 ; depending on the pointer type acc. to SDCCsymt.h
120 mov a,dph ; 2
121 jb acc[7],codeptr$ ; >0x80 code ; 3
122 jnb acc[6],xdataptr$ ; <0x40 far ; 3
124 mov b,r0 ; save r0 independent of regbank ; 2
125 mov r0,dpl ; use only low order address ; 2
127 jb acc[5],pdataptr$ ; >0x60 pdata ; 3
129 ; Pointer to data space
131 mov a,@r0 ; 1
132 mov r0,b ; restore r0 ; 2
133 ret ; 1
135 ; pointer to xternal stack or pdata
137 pdataptr$:
138 movx a,@r0 ; 1
139 mov r0,b ; restore r0 ; 2
140 ret ; 1
142 ; pointer to code area, max 15 bits
144 codeptr$:
145 ; 0x8000 <= dptr <= 0xFFFF
146 ; no need to AND dph and restore from B if hardware wraps code memory
147 anl dph,#0x7F ; 3
148 clr a ; 1
149 movc a,@a+dptr ; 1
150 mov dph,b ; 3
151 ret ; 1
153 ; pointer to xternal data, max 14 bits
155 xdataptr$:
156 ; 0 <= dptr <= 0x3FFF
157 movx a,@dptr ; 1
158 ret ; 1
159 ;===
160 ;34 bytes
161 __endasm;
164 #else
166 void
167 _gptrget (char *gptr) __naked
169 /* This is the new version with pointers up to 16 bits.
170 B cannot be trashed */
172 gptr; /* hush the compiler */
174 __asm
176 ; depending on the pointer type acc. to SDCCsymt.h
178 jb _B_7,codeptr$ ; >0x80 code ; 3
179 jnb _B_6,xdataptr$ ; <0x40 far ; 3
181 mov dph,r0 ; save r0 independent of regbank ; 2
182 mov r0,dpl ; use only low order address ; 2
184 jb _B_5,pdataptr$ ; >0x60 pdata ; 3
186 ; Pointer to data space
188 mov a,@r0 ; 1
189 dataptrrestore$:
190 mov r0,dph ; restore r0 ; 2
191 mov dph,#0 ; restore dph ; 3
192 ret ; 1
194 ; pointer to xternal stack or pdata
196 pdataptr$:
197 movx a,@r0 ; 1
198 sjmp dataptrrestore$ ; 2
200 ; pointer to code area, max 16 bits
202 codeptr$:
203 clr a ; 1
204 movc a,@a+dptr ; 1
205 ret ; 1
207 ; pointer to xternal data, max 16 bits
209 xdataptr$:
210 movx a,@dptr ; 1
211 ret ; 1
212 ;===
213 ;28 bytes
214 __endasm;
217 #endif
219 #ifdef __SDCC_ds390
220 /* the return value is expected to be in acc/acc1, and not in the standard
221 * location dpl/dph. Therefore we choose return type void here: */
223 void
224 _gptrgetWord (unsigned *gptr)
226 gptr; /* hush the compiler */
228 __asm
230 ; depending on the pointer type acc. to SDCCsymt.h
232 jb _B_7,00003$ ; >0x80 code
233 jnb _B_6,00002$ ; <0x40 far
235 mov dph,r0 ; save r0 independent of regbank
236 mov r0,dpl ; use only low order address
238 jb _B_5,00004$ ; >0x60 pdata
240 ; Pointer to data space
242 mov acc1,@r0
243 inc r0
244 mov a,@r0
245 inc dpl
246 sjmp 00005$
248 ; pointer to xternal data
250 00002$:
251 movx a,@dptr
252 mov acc1,a
253 inc dptr
254 movx a,@dptr
255 sjmp 00006$
257 ; pointer to code area
259 00003$:
260 clr a
261 movc a,@a+dptr
262 mov acc1,a
263 clr a
264 inc dptr
265 movc a,@a+dptr
266 sjmp 00006$
268 ; pointer to xternal stack
270 00004$:
271 movx a,@r0
272 mov acc1,a
273 inc r0
274 movx a,@r0
275 inc dpl
277 ; restore and return
279 00005$:
280 mov r0,dph ; restore r0
281 mov dph,#0 ; restore dph
282 00006$:
283 xch a,acc1
284 __endasm;
288 #endif