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
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,
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
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 */
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
67 mov r0
,dph
; restore r0
; 2
68 mov dph
,#0 ; restore dph ; 3
71 ; pointer to external stack
or pdata
75 sjmp dataptrrestore$
; 2
77 ; pointer to code area
80 ; implementation
for SiLabs C8051F12x
93 ; pointer to xternal data
96 ; implementation
for xram a16
-a21 tied to P3
106 #elif defined DSDCC_MODEL_MEDIUM
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 */
118 ; depending on the pointer type acc
. to SDCCsymt
.h
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
132 mov r0
,b
; restore r0
; 2
135 ; pointer to xternal stack
or pdata
139 mov r0
,b
; restore r0
; 2
142 ; pointer to code area
, max
15 bits
145 ; 0x8000 <= dptr
<= 0xFFFF
146 ; no need to AND dph
and restore from B
if hardware wraps code memory
153 ; pointer to xternal data
, max
14 bits
156 ; 0 <= dptr
<= 0x3FFF
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 */
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
190 mov r0
,dph
; restore r0
; 2
191 mov dph
,#0 ; restore dph ; 3
194 ; pointer to xternal stack
or pdata
198 sjmp dataptrrestore$
; 2
200 ; pointer to code area
, max
16 bits
207 ; pointer to xternal data
, max
16 bits
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: */
224 _gptrgetWord (unsigned *gptr
)
226 gptr
; /* hush the compiler */
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
248 ; pointer to xternal data
257 ; pointer to code area
268 ; pointer to xternal stack
280 mov r0
,dph
; restore r0
281 mov dph
,#0 ; restore dph