#include <stdint.h>
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <string.h>
 
 
 
// for non-boot area of 0x00000..0x1DFFF
 
#define ADDR_RANGE (0x1E000)
 
 
 
// fill value
 
#define FILL_VALUE (0xFF)
 
 
 
#include "ihex.h"
 
#include "crc.h"
 
 
 
 
 
uint8_t buffer[ADDR_RANGE];
 
 
 
int main(int argc, char ** argv)
 
{
 
        int was_error = 0;
 
 
 
        uint16_t crc;
 
 
 
 
 
        if( argc!=3 )
 
        {
 
                printf("Fix CRC for the ZXEvo AVR firmware in order to pass bootloader CRC check.\n");  
                printf("Usage: crcfix <infile> <outfile>\n");  
 
 
                if( argc==2 )
 
                {
 
                }
 
 
 
        }
 
 
 
 
 
        // parse input file
 
        was_error = was_error || !parse_ihex(buffer, 0, 0, ADDR_RANGE-2, FILL_VALUE, argv[1]);
 
 
 
/*
 
for(int i=0;i<ADDR_RANGE;i+=16)
 
{
 
printf("%05X:",i);
 
for(int j=0;j<16;j++)
 
printf("%02X",buffer[i+j]);
 
printf("\n");
 
}
 
 
 
buffer[0x1DFF0] = 0x4e;
 
buffer[0x1DFF1] = 0x6f;
 
buffer[0x1DFF2] = 0x20;
 
buffer[0x1DFF3] = 0x69;
 
buffer[0x1DFF4] = 0x6e;
 
buffer[0x1DFF5] = 0x66;
 
buffer[0x1DFF6] = 0x6f;
 
buffer[0x1DFF7] = 0x00;
 
buffer[0x1DFF8] = 0x00;
 
buffer[0x1DFF9] = 0x00;
 
buffer[0x1DFFA] = 0x00;
 
buffer[0x1DFFB] = 0x00;
 
buffer[0x1DFFC] = 0x76;
 
buffer[0x1DFFD] = 0xa9;
 
*/
 
 
 
 
 
        // calc CRC and put it into last two bytes of the buffer
 
        if( !was_error )
 
        {
 
                crc = calc_crc(buffer,ADDR_RANGE-2);
 
 
 
                buffer[ADDR_RANGE-2] = crc>>8;
 
                buffer[ADDR_RANGE-1] = crc;
 
        }
 
 
 
 
 
 
 
//printf("crc=%04x\n",crc);
 
 
 
 
 
/*
 
printf("<none>: %04x\n",calc_crc(NULL,0));
 
 
 
char * a="A";
 
printf("%s: %04x\n",a,calc_crc(a,strlen(a)));
 
 
 
a="123456789";
 
printf("%s: %04x\n",a,calc_crc(a,strlen(a)));
 
 
 
char b[256];
 
for(int i=0;i<256;i++) b[i]='A';
 
printf("256*\"A\": %04x\n",calc_crc(b,256));
 
*/
 
 
 
//printf("write_ihex! was_error=%d\n",was_error);
 
 
 
 
 
 
 
        // write back new IHEX with embedded CRC
 
        was_error = was_error || !write_ihex(buffer,0,0,ADDR_RANGE,argv[2]);
 
 
 
 
 
 
 
        return was_error ? 1 : 0;
 
}