X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Fmcs51%2Flkrloc.c;h=52654d59f407b6ef69a5ebc444f0c96beda4a14f;hb=dee370495d8fdc04bd20807bd3ad3c50fc013a06;hp=b102545d1635bb21dbffefe1bd6a6cc78bdad438;hpb=e84c096709aa5210c71156dee96fea5e3c661f11;p=fw%2Fsdcc diff --git a/as/mcs51/lkrloc.c b/as/mcs51/lkrloc.c index b102545d..52654d59 100644 --- a/as/mcs51/lkrloc.c +++ b/as/mcs51/lkrloc.c @@ -16,7 +16,6 @@ #include #include -#include #include "aslink.h" /*)Module lkrloc.c @@ -25,15 +24,15 @@ * 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() @@ -50,7 +49,12 @@ /* 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,23 @@ 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 1 // jwk + if (lastExtendedAddress!=-1) { + printf("output extended linear address record 0x%x 0x%x\n", + extendedAddress, lastExtendedAddress); + } +#endif if (rflag) { @@ -597,7 +609,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 +621,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 +640,7 @@ relp() { register int aindex, rindex; int mode, rtp; - addr_t relv; + Addr_T relv; struct areax **a; struct sym **s; @@ -737,13 +749,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 +769,10 @@ rele() * */ -addr_t +Addr_T evword() { - register addr_t v; + register Addr_T v; if (hilo) { v = (eval() << 8); @@ -772,7 +784,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 +807,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 +826,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 +842,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 +861,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 +872,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 +888,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 +907,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 +918,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 +934,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 +955,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 +966,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 +982,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 +996,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 +1007,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 +1023,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 +1044,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 +1054,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 +1067,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 +1086,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 +1096,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 +1108,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 +1131,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 +1142,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 +1157,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 +1176,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 +1188,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 +1203,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 +1353,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 +1376,7 @@ char *str; VOID prntval(fptr, v) FILE *fptr; -addr_t v; +Addr_T v; { if (xflag == 0) { fprintf(fptr, "%04X\n", v);