Merge commit 'git-svn'
[fw/sdcc] / device / lib / _gptrgetc.c
index 45b79f3132d18c49f2d6a87830164df6090b6c03..400af364f02a6df6fda30f6db3d05d2c3a5190fb 100644 (file)
 
 /* the  return value is expected to be in acc, and not in the standard
  * location dpl. Therefore we choose return type void here: */
+
+#if 1
+
 void
-_gptrgetc (char *gptr) _naked
+_gptrgetc (char *gptr) __naked
 {
+/* This is the new version with pointers up to 16 bits.
+   B cannot be trashed */
+
     gptr; /* hush the compiler */
 
-    _asm
+    __asm
+    ;   save values passed
+    ;
+    ;   depending on the pointer type acc. to SDCCsymt.h
+    ;
+       jb              _B_7,codeptr$        ; >0x80 code               ; 3
+       jnb             _B_6,xdataptr$       ; <0x40 far                ; 3
+
+        mov     dph,r0 ; save r0 independant of regbank        ; 2
+        mov     r0,dpl ; use only low order address            ; 2
+
+       jb              _B_5,pdataptr$       ; >0x60 pdata              ; 3
+    ;
+    ;   Pointer to data space
+    ;
+        mov     a,@r0                                                                  ; 1
+        mov     r0,dph ; restore r0                                            ; 2
+        mov     dph,#0 ; restore dph                                   ; 2
+        ret                                                                                            ; 1
+    ;
+    ;   pointer to external stack or pdata
+    ;
+ pdataptr$:
+        movx    a,@r0                                                                  ; 1
+        mov     r0,dph ; restore r0                                            ; 2
+        mov     dph,#0 ; restore dph                                   ; 2
+        ret                                                                                            ; 1
+;
+;   pointer to xternal data
+;   pointer to code area
+;
+ codeptr$:
+ xdataptr$:
+        clr     a                                                                              ; 1
+        movc    a,@a+dptr                                                              ; 1
+        ret                                                                                            ; 1
+                                                                                                       ;===
+                                                                                                       ;28 bytes
+     __endasm;
+}
+
+#else
+
+void
+_gptrgetc (char *gptr) __naked
+{
+    gptr; /* hush the compiler */
+
+    __asm
     ;   save values passed
        xch    a,r0
        push   acc
@@ -53,14 +107,14 @@ _gptrgetc (char *gptr) _naked
     ;   any other value for type
     ;   return xFF
        mov     a,#0xff
-       sjmp    00005$
+       ret
     ;
     ;   Pointer to data space
     ;
  00001$:
        mov     r0,dpl     ; use only low order address
        mov     a,@r0
-        sjmp    00005$
+        ret
 ;
 ;   pointer to xternal data
 ;   pointer to code area
@@ -68,7 +122,7 @@ _gptrgetc (char *gptr) _naked
  00003$:
        ; clr     a  is already 0
         movc    a,@a+dptr
-        sjmp    00005$
+        ret
 ;
 ;   pointer to xternal stack
 ;
@@ -78,11 +132,11 @@ _gptrgetc (char *gptr) _naked
 ;
 ;   restore and return
 ;
- 00005$:
         mov     r0,a
         pop     acc
         xch     a,r0
         ret
-     _endasm ;
+     __endasm;
 
 }
+#endif