gbdk-releases/sdcc/link/z80/lkihx.c
2015-01-10 16:25:09 +01:00

135 lines
4.3 KiB
C

/* lkihx.c */
/*
* (C) Copyright 1989-1995
* All Rights Reserved
*
* Alan R. Baldwin
* 721 Berkeley St.
* Kent, Ohio 44240
*/
#include <stdio.h>
#include <string.h>
//#include <alloc.h>
#include "aslink.h"
/*)Module lkihx.c
*
* The module lkihx.c contains the function to
* output the relocated object code in the
* Intel Hex format.
*
* lkihx.c contains the following function:
* VOID ihx(i)
*
* lkihx.c contains no local variables.
*/
/*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
* data bytes in this record. The
* characters are the result of converting
* 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.
*
* 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:
*
* 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.
*
* 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.
*
* 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.
*
* Checksum Field - The checksum field is the 8 bit binary
* sum of the record length field, the load
* address field, the record type field,
* and the data field. This sum is then
* negated (2's complement) and converted
* to two ascii characters, high digit
* first.
*/
/*)Function ihx(i)
*
* int i 0 - process data
* 1 - end of data
*
* The function ihx() outputs the relocated data
* in the standard Intel Hex format.
*
* local variables:
* Addr_T chksum byte checksum
*
* global variables:
* int hilo byte order
* 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
*
* side effects:
* The data is output to the file defined by ofp.
*/
VOID
ihx(i)
{
register Addr_T chksum;
if (i) {
if (hilo == 0) {
chksum = rtval[0];
rtval[0] = rtval[1];
rtval[1] = chksum;
}
for (i = 0, chksum = -2; i < rtcnt; i++) {
if (rtflg[i])
chksum++;
}
fprintf(ofp, ":%02X", chksum);
for (i = 0; i < rtcnt ; i++) {
if (rtflg[i]) {
fprintf(ofp, "%02X", rtval[i]);
chksum += rtval[i];
}
if (i == 1) {
fprintf(ofp, "00");
}
}
fprintf(ofp, "%02X\n", (-chksum) & 0xff);
} else {
fprintf(ofp, ":00000001FF\n");
}
}