X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Flink%2Fhc08%2Flkihx.c;h=196f1dc23b54f34a6fa20d221f76d9be82df43eb;hb=5a1d5e778e85664f4e6657019348b4756b16eacb;hp=ff75e93174e2e4718aea1dec92856c34d513318f;hpb=249f3b9ab24db32c0496869c84a75518af44f407;p=fw%2Fsdcc diff --git a/as/link/hc08/lkihx.c b/as/link/hc08/lkihx.c index ff75e931..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 ihxEntendedLinearAddress(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 - * ihxEntendedLinearAddress() 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; - ihxEntendedLinearAddress(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; - ihxEntendedLinearAddress(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 ihxEntendedLinearAddress(i) +/*)Function ihxExtendedLinearAddress(i) * - * Addr_T i 16 bit extended linear address. + * Addr_T i 16 bit extended linear address. * - * The function ihxEntendedLinearAddress() 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 -ihxEntendedLinearAddress(Addr_T a) +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; }