1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
/*
* Copyright (C) 1992 Clarendon Hill Software.
*
* Permission is granted to any individual or institution to use, copy,
* or redistribute this software, provided this copyright notice is retained.
*
* This software is provided "as is" without any expressed or implied
* warranty. If this software brings on any sort of damage -- physical,
* monetary, emotional, or brain -- too bad. You've got no one to blame
* but yourself.
*
* The software may be modified for your own purposes, but modified versions
* must retain this notice.
*/
/*
Modified by Timothy Mann, 1996 and later
$Id: load_hex.c,v 1.8 2008/06/26 04:39:56 mann Exp $
*/
#include "error.h"
#include <stdio.h> /* FILE */
#include <stdlib.h>
#define BUFFER_SIZE 256
extern void hex_transfer_address(int address);
extern void hex_data(int address, int value);
static int hex_byte(char *string)
{
char buf[3];
buf[0] = string[0];
buf[1] = string[1];
buf[2] = '\0';
return(strtol(buf, (char **)NULL, 16));
}
int load_hex(FILE *file)
{
char buffer[BUFFER_SIZE];
char *b;
int num_bytes;
int address;
int check;
int value;
int high = 0;
while(fgets(buffer, BUFFER_SIZE, file))
{
if(buffer[0] == ':')
{
/* colon */
b = buffer + 1;
/* number of bytes on the line */
num_bytes = hex_byte(b); b += 2;
check = num_bytes;
/* the starting address */
address = hex_byte(b) << 8; b += 2;
address |= hex_byte(b); b+= 2;
check += (address >> 8) + (address & 0xff);
/* a zero? */
b += 2;
/* the data */
if(num_bytes == 0)
{
/* Transfer address */
hex_transfer_address(address);
} else {
while(num_bytes--)
{
value = hex_byte(b); b += 2;
hex_data(address++, value);
check += value;
}
if (address > high) high = address;
/* the checksum */
value = hex_byte(b);
if(((0x100 - check) & 0xff) != value)
{
fatal("bad checksum from hex file");
}
}
}
}
return high;
}
|