* src/mcs51/ralloc.c (getRegPtr, getRegGpr),
[fw/sdcc] / as / mcs51 / lkrloc.c
index b102545d1635bb21dbffefe1bd6a6cc78bdad438..baa056496fe455baa649ef505d3340fa5d790c1e 100644 (file)
@@ -16,7 +16,6 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <alloc.h>
 #include "aslink.h"
 
 /*)Module      lkrloc.c
  *     perform the relocation calculations.
  *
  *     lkrloc.c contains the following functions:
- *             addr_t  adb_b()
- *             addr_t  adb_lo()
- *             addr_t  adb_hi()
- *             addr_t  adw_w()
- *             addr_t  adw_lo()
- *             addr_t  adw_hi()
+ *             Addr_T  adb_b()
+ *             Addr_T  adb_lo()
+ *             Addr_T  adb_hi()
+ *             Addr_T  adw_w()
+ *             Addr_T  adw_lo()
+ *             Addr_T  adw_hi()
  *             VOID    erpdmp()
  *             VOID    errdmp()
- *             addr_t  evword()
+ *             Addr_T  evword()
  *             VOID    prntval()
  *             VOID    rele()
  *             VOID    relerr()
 /* Global which holds the upper 16 bits of the last 32 bit area adress
  * output. Useful only for iHex mode.
  */
-int    lastExtendedAddress;
+int    lastExtendedAddress=-1;
+
+/* Static variable which holds the index of last processed area.
+ * Useful only for iHex mode.
+ */
+static int lastAreaIndex = -1;
 
 /*)Function    VOID    reloc(c)
  *
@@ -213,14 +217,14 @@ relt()
  *             int     lkerr           error flag
  *             int     mode            relocation mode
  *             adrr_t  paga            paging base area address
- *             addr_t  pags            paging symbol address
- *             addr_t  pc              relocated base address
- *             addr_t  r               PCR relocation value
- *             addr_t  reli            relocation initial value
- *             addr_t  relv            relocation final value
+ *             Addr_T  pags            paging symbol address
+ *             Addr_T  pc              relocated base address
+ *             Addr_T  r               PCR relocation value
+ *             Addr_T  reli            relocation initial value
+ *             Addr_T  relv            relocation final value
  *             int     rindex          symbol / area index
- *             addr_t  rtbase          base code address
- *             addr_t  rtofst          rtval[] index offset
+ *             Addr_T  rtbase          base code address
+ *             Addr_T  rtofst          rtval[] index offset
  *             int     rtp             index into T data
  *             sym     **s             pointer to array of symbol pointers
  *
@@ -230,11 +234,11 @@ relt()
  *             FILE    *stderr         standard error device
  *
  *     called functions:
- *             addr_t  adb_b()         lkrloc.c
- *             addr_t  adb_lo()        lkrloc.c
- *             addr_t  adb_hi()        lkrloc.c
- *             addr_t  adw_w()         lkrloc.c
- *             addr_t  evword()        lkrloc.c
+ *             Addr_T  adb_b()         lkrloc.c
+ *             Addr_T  adb_lo()        lkrloc.c
+ *             Addr_T  adb_hi()        lkrloc.c
+ *             Addr_T  adw_w()         lkrloc.c
+ *             Addr_T  evword()        lkrloc.c
  *             int     eval()          lkeval.c
  *             int     fprintf()       c_library
  *             VOID    ihx()           lkihx.c
@@ -255,9 +259,9 @@ VOID
 relr()
 {
        register int mode;
-       register addr_t reli, relv;
+       register Addr_T reli, relv;
        int aindex, rindex, rtp, error;
-       addr_t r, rtbase, rtofst, paga, pags, pc;
+       Addr_T r, rtbase, rtofst, paga, pags, pc;
        struct areax **a;
        struct sym **s;
 
@@ -480,7 +484,7 @@ relr()
                 */
                if (mode & R_PCR && mode & R_BYTE) {
                        r = relv & ~0x7F;
-                       if (r != (addr_t) ~0x7F && r != 0)
+                       if (r != (Addr_T) ~0x7F && r != 0)
                                error = 2; 
                }
 
@@ -529,15 +533,21 @@ relr()
                 * This is another reason why we can't have areas greater
                 * than 64K yet, even in flat24 mode.
                 */
-               extendedAddress += ((a[aindex]->a_size) >> 16 & 0xffff);
+       //      extendedAddress += ((a[aindex]->a_size) >> 16 & 0xffff);
+       //      commented out by jr 
+               
+               if (lastAreaIndex != aindex) {
+                       lastAreaIndex = aindex;
+                       newArea();
+               }
                
                if (extendedAddress != lastExtendedAddress)
                {
                
-                   #if 0
-                   printf("output extended linear address record 0x%x\n",
-                           extendedAddress);
-                   #endif
+                   if (lastExtendedAddress!=-1) {
+                     printf("output extended linear address record 0x%x 0x%x\n",
+                            extendedAddress, lastExtendedAddress);
+                   }
                    
                    if (rflag)
                    {
@@ -597,7 +607,7 @@ char *errmsg[] = {
  *             areax   **a             pointer to array of area pointers
  *             int     aindex          area index
  *             int     mode            relocation mode
- *             addr_t  relv    relocation value
+ *             Addr_T  relv    relocation value
  *             int     rindex          symbol / area index
  *             int     rtp                     index into T data
  *             sym     **s                     pointer to array of symbol pointers
@@ -609,8 +619,8 @@ char *errmsg[] = {
  *             FILE *stderr    standard error device
  *
  *     called functions:
- *             addr_t adw_w()  lkrloc.c
- *             addr_t evword() lkrloc.c
+ *             Addr_T adw_w()  lkrloc.c
+ *             Addr_T evword() lkrloc.c
  *             int     eval()          lkeval.c
  *             int     fprintf()       c_library
  *             int     more()          lklex.c
@@ -628,7 +638,7 @@ relp()
 {
        register int aindex, rindex;
        int mode, rtp;
-       addr_t relv;
+       Addr_T relv;
        struct areax **a;
        struct sym **s;
 
@@ -737,13 +747,13 @@ rele()
        }
 }
 
-/*)Function    addr_t          evword()
+/*)Function    Addr_T          evword()
  *
  *     The function evword() combines two byte values
  *     into a single word value.
  *
  *     local variable:
- *             addr_t  v               temporary evaluation variable
+ *             Addr_T  v               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -757,10 +767,10 @@ rele()
  *
  */
 
-addr_t
+Addr_T
 evword()
 {
-       register addr_t v;
+       register Addr_T v;
 
        if (hilo) {
                v =  (eval() << 8);
@@ -772,7 +782,7 @@ evword()
        return(v);
 }
 
-/*)Function    addr_t          adb_b(v, i)
+/*)Function    Addr_T          adb_b(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -795,15 +805,15 @@ evword()
  *
  */
 
-addr_t
+Addr_T
 adb_b(v, i)
-register addr_t v;
+register Addr_T v;
 register int i;
 {
        return(rtval[i] += v);
 }
 
-/*)Function    addr_t          adb_lo(v, i)
+/*)Function    Addr_T          adb_lo(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -814,7 +824,7 @@ register int i;
  *     The MSB rtflg[] is cleared.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -830,12 +840,12 @@ register int i;
  *
  */
 
-addr_t
+Addr_T
 adb_lo(v, i)
-addr_t v;
+Addr_T v;
 int    i;
 {
-       register addr_t j;
+       register Addr_T j;
 
        j = adw_w(v, i);
        /*
@@ -849,7 +859,7 @@ int i;
        return (j);
 }
 
-/*)Function    addr_t          adb_hi(v, i)
+/*)Function    Addr_T          adb_hi(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -860,7 +870,7 @@ int i;
  *     The LSB rtflg[] is cleared.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -876,12 +886,12 @@ int       i;
  *
  */
 
-addr_t
+Addr_T
 adb_hi(v, i)
-addr_t v;
+Addr_T v;
 int    i;
 {
-       register addr_t j;
+       register Addr_T j;
 
        j = adw_w(v, i);
        /*
@@ -895,7 +905,7 @@ int i;
        return (j);
 }
 
-/*)Function    addr_t          adb_24_hi(v, i)
+/*)Function    Addr_T          adb_24_hi(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -906,7 +916,7 @@ int i;
  *     The LSB & middle byte rtflg[] is cleared.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -922,10 +932,10 @@ int       i;
  *
  */
 
-addr_t
-adb_24_hi(addr_t v, int i)
+Addr_T
+adb_24_hi(Addr_T v, int i)
 {
-       register addr_t j;
+       register Addr_T j;
 
        j = adw_24(v, i);
 
@@ -943,7 +953,7 @@ adb_24_hi(addr_t v, int i)
        return (j);
 }
 
-/*)Function    addr_t          adb_24_mid(v, i)
+/*)Function    Addr_T          adb_24_mid(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -954,7 +964,7 @@ adb_24_hi(addr_t v, int i)
  *     The LSB & MSB byte rtflg[] is cleared.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -970,10 +980,10 @@ adb_24_hi(addr_t v, int i)
  *
  */
 
-addr_t
-adb_24_mid(addr_t v, int i)
+Addr_T
+adb_24_mid(Addr_T v, int i)
 {
-       register addr_t j;
+       register Addr_T j;
 
        j = adw_24(v, i);
 
@@ -984,7 +994,7 @@ adb_24_mid(addr_t v, int i)
        return (j);
 }
 
-/*)Function    addr_t          adb_24_lo(v, i)
+/*)Function    Addr_T          adb_24_lo(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -995,7 +1005,7 @@ adb_24_mid(addr_t v, int i)
  *     The MSB & middle byte rtflg[] is cleared.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -1011,10 +1021,10 @@ adb_24_mid(addr_t v, int i)
  *
  */
 
-addr_t
-adb_24_lo(addr_t v, int i)
+Addr_T
+adb_24_lo(Addr_T v, int i)
 {
-       register addr_t j;
+       register Addr_T j;
 
        j = adw_24(v, i);
 
@@ -1032,7 +1042,7 @@ adb_24_lo(addr_t v, int i)
        return (j);
 }
 
-/*)Function    addr_t          adw_w(v, i)
+/*)Function    Addr_T          adw_w(v, i)
  *
  *             int     v               value to add to word
  *             int     i               rtval[] index
@@ -1042,7 +1052,7 @@ adb_24_lo(addr_t v, int i)
  *     The new value of rtval[i] / rtval[i+1] is returned.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -1055,12 +1065,12 @@ adb_24_lo(addr_t v, int i)
  *
  */
 
-addr_t
+Addr_T
 adw_w(v, i)
-register addr_t v;
+register Addr_T v;
 register int i;
 {
-       register addr_t j;
+       register Addr_T j;
 
        if (hilo) {
                j = v + (rtval[i] << 8) + (rtval[i+1] & 0xff);
@@ -1074,7 +1084,7 @@ register int i;
        return(j);
 }
 
-/*)Function    addr_t          adw_24(v, i)
+/*)Function    Addr_T          adw_24(v, i)
  *
  *             int     v               value to add to word
  *             int     i               rtval[] index
@@ -1084,7 +1094,7 @@ register int i;
  *     The new value of rtval[i] - rtval[i+2] is returned.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -1096,10 +1106,10 @@ register int i;
  *             The word value of rtval[] is changed.
  *
  */
-addr_t
-adw_24(addr_t v, int i)
+Addr_T
+adw_24(Addr_T v, int i)
 {
-       register addr_t j;
+       register Addr_T j;
 
        if (hilo) {
                j = v + ((rtval[i] & 0xff) << 16) 
@@ -1119,7 +1129,7 @@ adw_24(addr_t v, int i)
        return(j);
 }
 
-/*)Function    addr_t          adw_lo(v, i)
+/*)Function    Addr_T          adw_lo(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -1130,7 +1140,7 @@ adw_24(addr_t v, int i)
  *     The MSB rtval[] is zeroed.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -1145,12 +1155,12 @@ adw_24(addr_t v, int i)
  *
  */
 
-addr_t
+Addr_T
 adw_lo(v, i)
-addr_t v;
+Addr_T v;
 int    i;
 {
-       register addr_t j;
+       register Addr_T j;
 
        j = adw_w(v, i);
        /*
@@ -1164,7 +1174,7 @@ int       i;
        return (j);
 }
 
-/*)Function    addr_t          adw_hi(v, i)
+/*)Function    Addr_T          adw_hi(v, i)
  *
  *             int     v               value to add to byte
  *             int     i               rtval[] index
@@ -1176,7 +1186,7 @@ int       i;
  *     The MSB rtval[] is zeroed.
  *
  *     local variable:
- *             addr_t  j               temporary evaluation variable
+ *             Addr_T  j               temporary evaluation variable
  *
  *     global variables:
  *             hilo                    byte ordering parameter
@@ -1191,12 +1201,12 @@ int     i;
  *
  */
 
-addr_t
+Addr_T
 adw_hi(v, i)
-addr_t v;
+Addr_T v;
 int    i;
 {
-       register addr_t j;
+       register Addr_T j;
 
        j = adw_w(v, i);
        /*
@@ -1341,7 +1351,7 @@ char *str;
 /*)Function    VOID prntval(fptr, v)
  *
  *             FILE    *fptr   output file handle
- *             addr_t  v               value to output
+ *             Addr_T  v               value to output
  *
  *     The function prntval() outputs the value v, in the
  *     currently selected radix, to the device specified
@@ -1364,7 +1374,7 @@ char *str;
 VOID
 prntval(fptr, v)
 FILE *fptr;
-addr_t v;
+Addr_T v;
 {
        if (xflag == 0) {
                fprintf(fptr, "%04X\n", v);