#include <stdio.h>
#include <string.h>
-#if !defined(_MSC_VER)
-#include <alloc.h>
-#endif
#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)
*
* 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
*
* 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
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;
*/
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;
}
* 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)
{
* 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
* 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
{
register int aindex, rindex;
int mode, rtp;
- addr_t relv;
+ Addr_T relv;
struct areax **a;
struct sym **s;
}
}
-/*)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
*
*/
-addr_t
+Addr_T
evword()
{
- register addr_t v;
+ register Addr_T v;
if (hilo) {
v = (eval() << 8);
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
*
*/
-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
* 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
*
*/
-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);
/*
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
* 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
*
*/
-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);
/*
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
* 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
*
*/
-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);
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
* 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
*
*/
-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);
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
* 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
*
*/
-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);
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
* 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
*
*/
-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);
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
* 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
* 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)
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
* 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
*
*/
-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);
/*
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
* 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
*
*/
-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);
/*
/*)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
VOID
prntval(fptr, v)
FILE *fptr;
-addr_t v;
+Addr_T v;
{
if (xflag == 0) {
fprintf(fptr, "%04X\n", v);