X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Flink%2Fhc08%2Flkihx.c;fp=as%2Flink%2Fhc08%2Flkihx.c;h=196f1dc23b54f34a6fa20d221f76d9be82df43eb;hb=22ec133e94d056a395025c302b6c331c8cd04658;hp=824e41529ea5b8f2f31724b9e0e3e68ebce9d1a6;hpb=b7fec7bdb767e95165097f43e52cf1cbc4ee6017;p=fw%2Fsdcc
diff --git a/as/link/hc08/lkihx.c b/as/link/hc08/lkihx.c
index 824e4152..196f1dc2 100644
--- a/as/link/hc08/lkihx.c
+++ b/as/link/hc08/lkihx.c
@@ -1,36 +1,43 @@
-/* lkihx.c */
+/* lkihx.c
-/*
- * (C) Copyright 1989-1995
- * All Rights Reserved
- *
- * Alan R. Baldwin
- * 721 Berkeley St.
- * Kent, Ohio 44240
- */
+ Copyright (C) 1989-1995 Alan R. Baldwin
+ 721 Berkeley St., Kent, Ohio 44240
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see . */
#include
#include
#include "aslink.h"
-/*)Module lkihx.c
+/*)Module lkihx.c
*
- * The module lkihx.c contains the function to
- * output the relocated object code in the
- * Intel Hex format.
+ * The module lkihx.c contains the function to
+ * output the relocated object code in the
+ * Intel Hex format.
*
- * lkihx.c contains the following functions:
- * VOID hexRecord(addr, rtvalIndex)
- * VOID ihx(i)
- * VOID ihxExtendedLinearAddress(a)
+ * lkihx.c contains the following functions:
+ * VOID hexRecord(addr, rtvalIndex)
+ * VOID ihx(i)
+ * VOID ihxExtendedLinearAddress(a)
*
- * local variables: hexPageOverrun, lastHexAddr
+ * local variables: hexPageOverrun, lastHexAddr
*/
/*Intel Hex Format
* Record Mark Field - This field signifies the start of a
* record, and consists of an ascii colon
- * (:).
+ * (:).
*
* Record Length Field - This field consists of two ascii
* characters which indicate the number of
@@ -39,35 +46,35 @@
* the number of bytes in binary to two
* ascii characters, high digit first. An
* End of File record contains two ascii
- * zeros in this field.
+ * zeros in this field.
*
* Load Address Field - This field consists of the four ascii
* characters which result from converting
* the the binary value of the address in
* which to begin loading this record. The
- * order is as follows:
+ * order is as follows:
*
- * High digit of high byte of address.
- * Low digit of high byte of address.
- * High digit of low byte of address.
- * Low digit of low byte of address.
+ * High digit of high byte of address.
+ * Low digit of high byte of address.
+ * High digit of low byte of address.
+ * Low digit of low byte of address.
*
* In an End of File record this field con-
* sists of either four ascii zeros or the
* program entry address. Currently the
- * entry address option is not supported.
+ * entry address option is not supported.
*
* Record Type Field - This field identifies the record type,
* which is either 0 for data records or 1
* for an End of File record. It consists
* of two ascii characters, with the high
* digit of the record type first, followed
- * by the low digit of the record type.
+ * by the low digit of the record type.
*
* Data Field - This field consists of the actual data,
* converted to two ascii characters, high
* digit first. There are no data bytes in
- * the End of File record.
+ * the End of File record.
*
* Checksum Field - The checksum field is the 8 bit binary
* sum of the record length field, the load
@@ -75,7 +82,7 @@
* and the data field. This sum is then
* negated (2's complement) and converted
* to two ascii characters, high digit
- * first.
+ * first.
*/
/* Static variable which holds the count of hex page overruns
@@ -90,173 +97,173 @@ static int hexPageOverrun = 0;
unsigned int lastHexAddr = 0;
-/*)Function hexRecord(addr, rtvalIndex)
+/*)Function hexRecord(addr, rtvalIndex)
*
- * unsigned addr starting address of hex record
- * int rtvalIndex starting index into the rtval[] array
+ * unsigned addr starting address of hex record
+ * int rtvalIndex starting index into the rtval[] array
*
- * The function hexRecord() outputs the relocated data
- * in the standard Intel Hex format (with inserting
- * the extended address record if necessary).
+ * The function hexRecord() outputs the relocated data
+ * in the standard Intel Hex format (with inserting
+ * the extended address record if necessary).
*
- * local variables:
- * Addr_T chksum byte checksum
- * int i index for loops
- * int overrun temporary storage for hexPageOverrun
- * int bytes counter for bytes written
+ * local variables:
+ * Addr_T chksum byte checksum
+ * int i index for loops
+ * int overrun temporary storage for hexPageOverrun
+ * int bytes counter for bytes written
*
- * global variables:
- * FILE * ofp output file handle
- * int rtcnt count of data words
- * int rtflg[] output the data flag
- * Addr_T rtval[] relocated data
+ * global variables:
+ * FILE * ofp output file handle
+ * int rtcnt count of data words
+ * int rtflg[] output the data flag
+ * Addr_T rtval[] relocated data
*
- * functions called:
- * int fprintf() c_library
- * ihxExtendedLinearAddress() lkihx.c
- * hexRecord() lkihx.c (recursion)
+ * functions called:
+ * int fprintf() c_library
+ * ihxExtendedLinearAddress() lkihx.c
+ * hexRecord() lkihx.c (recursion)
*
- * side effects:
- * hexPageOverrun is eventually incremented,
- * lastHexAddr is updated
+ * side effects:
+ * hexPageOverrun is eventually incremented,
+ * lastHexAddr is updated
*/
VOID
hexRecord(unsigned addr, int rtvalIndex)
{
- Addr_T chksum;
- int i, overrun, bytes;
+ Addr_T chksum;
+ int i, overrun, bytes;
- for (i = rtvalIndex, chksum = 0; i < rtcnt; i++) {
- if (rtflg[i]) {
- if (addr + ++chksum > 0xffff)
- break;
- }
- }
- if (chksum == 0)
- return; // nothing to output
+ for (i = rtvalIndex, chksum = 0; i < rtcnt; i++) {
+ if (rtflg[i]) {
+ if (addr + ++chksum > 0xffff)
+ break;
+ }
+ }
+ if (chksum == 0)
+ return; // nothing to output
- if (lastHexAddr > addr) {
- overrun = hexPageOverrun + 1;
- ihxExtendedLinearAddress(lastExtendedAddress + overrun);
- hexPageOverrun = overrun;
- hexRecord(addr, rtvalIndex);
- return;
- }
+ if (lastHexAddr > addr) {
+ overrun = hexPageOverrun + 1;
+ ihxExtendedLinearAddress(lastExtendedAddress + overrun);
+ hexPageOverrun = overrun;
+ hexRecord(addr, rtvalIndex);
+ return;
+ }
- lastHexAddr = addr;
- fprintf(ofp, ":%02X%04X00", chksum, addr);
- chksum += (addr >> 8) + (addr & 0xff);
- for (i = rtvalIndex, bytes = 0; i < rtcnt; i++) {
- if (rtflg[i]) {
- fprintf(ofp, "%02X", rtval[i]);
- chksum += rtval[i];
+ lastHexAddr = addr;
+ fprintf(ofp, ":%02X%04X00", chksum, addr);
+ chksum += (addr >> 8) + (addr & 0xff);
+ for (i = rtvalIndex, bytes = 0; i < rtcnt; i++) {
+ if (rtflg[i]) {
+ fprintf(ofp, "%02X", rtval[i]);
+ chksum += rtval[i];
#if 0
- if (addr + ++bytes > 0xffff) {
- if (rflag) {
- fprintf(ofp, "%02X\n", (0-chksum) & 0xff);
- overrun = hexPageOverrun + 1;
- ihxExtendedLinearAddress(lastExtendedAddress + overrun);
- hexPageOverrun = overrun;
- hexRecord(0, i + 1);
- return;
- } else {
- fprintf(stderr,
- "warning: extended linear address encountered; "
- "you probably want the -r flag.\n");
- }
- }
+ if (addr + ++bytes > 0xffff) {
+ if (rflag) {
+ fprintf(ofp, "%02X\n", (0-chksum) & 0xff);
+ overrun = hexPageOverrun + 1;
+ ihxExtendedLinearAddress(lastExtendedAddress + overrun);
+ hexPageOverrun = overrun;
+ hexRecord(0, i + 1);
+ return;
+ } else {
+ fprintf(stderr,
+ "warning: extended linear address encountered; "
+ "you probably want the -r flag.\n");
+ }
+ }
#endif
- }
- }
- fprintf(ofp, "%02X\n", (0-chksum) & 0xff);
+ }
+ }
+ fprintf(ofp, "%02X\n", (0-chksum) & 0xff);
}
-/*)Function ihx(i)
+/*)Function ihx(i)
*
- * int i 0 - process data
- * 1 - end of data
+ * int i 0 - process data
+ * 1 - end of data
*
- * The function ihx() calls the hexRecord() function for processing data
- * or writes the End of Data record to the file defined by ofp.
+ * The function ihx() calls the hexRecord() function for processing data
+ * or writes the End of Data record to the file defined by ofp.
*
- * local variables:
- * Addr_T n auxiliary variable
+ * local variables:
+ * Addr_T n auxiliary variable
*
- * global variables:
- * int hilo byte order
- * FILE * ofp output file handle
- * Addr_T rtval[] relocated data
+ * global variables:
+ * int hilo byte order
+ * FILE * ofp output file handle
+ * Addr_T rtval[] relocated data
*
- * functions called:
- * VOID hexRecord() lkihx.c
- * int fprintf() c_library
+ * functions called:
+ * VOID hexRecord() lkihx.c
+ * int fprintf() c_library
*
- * side effects:
- * The sequence of rtval[0], rtval[1] is eventually changed.
+ * side effects:
+ * The sequence of rtval[0], rtval[1] is eventually changed.
*/
VOID
ihx(i)
{
- Addr_T n;
- if (i) {
- if (ap->a_flag & A_NOLOAD)
- return;
- if (hilo == 0) {
- n = rtval[0];
- rtval[0] = rtval[1];
- rtval[1] = n;
- }
- hexRecord((rtval[0]<<8) + rtval[1], 2);
- } else {
- fprintf(ofp, ":00000001FF\n");
- }
+ Addr_T n;
+ if (i) {
+ if (ap->a_flag & A_NOLOAD)
+ return;
+ if (hilo == 0) {
+ n = rtval[0];
+ rtval[0] = rtval[1];
+ rtval[1] = n;
+ }
+ hexRecord((rtval[0]<<8) + rtval[1], 2);
+ } else {
+ fprintf(ofp, ":00000001FF\n");
+ }
}
-/*)Function ihxNewArea(i)
+/*)Function ihxNewArea(i)
* The function ihxNewArea() is called when processing of new area is started.
* It resets the value of lastHexAddr.
- */
+ */
VOID
ihxNewArea()
{
- lastHexAddr = 0;
+ lastHexAddr = 0;
}
-/*)Function ihxExtendedLinearAddress(i)
+/*)Function ihxExtendedLinearAddress(i)
*
- * Addr_T i 16 bit extended linear address.
+ * Addr_T i 16 bit extended linear address.
*
- * The function ihxExtendedLinearAddress() writes an extended
- * linear address record (type 04) to the output file.
+ * The function ihxExtendedLinearAddress() writes an extended
+ * linear address record (type 04) to the output file.
*
- * local variables:
- * Addr_T chksum byte checksum
+ * local variables:
+ * Addr_T chksum byte checksum
*
- * global variables:
- * FILE * ofp output file handle
+ * global variables:
+ * FILE * ofp output file handle
*
- * functions called:
- * int fprintf() c_library
+ * functions called:
+ * int fprintf() c_library
*
- * side effects:
- * The data is output to the file defined by ofp.
- * hexPageOverrun and lastHexAddr is cleared
+ * side effects:
+ * The data is output to the file defined by ofp.
+ * hexPageOverrun and lastHexAddr is cleared
*/
VOID
ihxExtendedLinearAddress(Addr_T a)
{
- Addr_T chksum;
-
+ Addr_T chksum;
+
/* The checksum is the complement of the bytes in the
* record: the 2 is record length, 4 is the extended linear
* address record type, plus the two address bytes.
- */
- chksum = 2 + 4 + (a & 0xff) + ((a >> 8) & 0xff);
-
+ */
+ chksum = 2 + 4 + (a & 0xff) + ((a >> 8) & 0xff);
+
fprintf(ofp, ":02000004%04X%02X\n", a & 0xffff, (0-chksum) & 0xff);
- hexPageOverrun = 0;
- lastHexAddr = 0;
+ hexPageOverrun = 0;
+ lastHexAddr = 0;
}