fixed bug 1255403
[fw/sdcc] / device / lib / _gptrgetc.c
index 00506fb86980c5f665c889314b223074267a816a..400af364f02a6df6fda30f6db3d05d2c3a5190fb 100644 (file)
    what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
 
-unsigned char _gptrgetc ()
+
+/* 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
 {
-    _asm
+/* This is the new version with pointers up to 16 bits.
+   B cannot be trashed */
+
+    gptr; /* hush the compiler */
+
+    __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
@@ -39,7 +99,7 @@ unsigned char _gptrgetc ()
         dec     a
         jz      00003$ ; 2 code
        dec     a
-       jz      00004$
+       jz      00004$  ; 3 pdata
        dec     a       ; 4 skip generic pointer
        dec     a
        jz      00001$  ; 5 idata
@@ -47,14 +107,14 @@ unsigned char _gptrgetc ()
     ;   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
@@ -62,7 +122,7 @@ unsigned char _gptrgetc ()
  00003$:
        ; clr     a  is already 0
         movc    a,@a+dptr
-        sjmp    00005$
+        ret
 ;
 ;   pointer to xternal stack
 ;
@@ -72,10 +132,11 @@ unsigned char _gptrgetc ()
 ;
 ;   restore and return
 ;
- 00005$:
         mov     r0,a
         pop     acc
-       xch     a,r0
-     _endasm ;
+        xch     a,r0
+        ret
+     __endasm;
 
 }
+#endif