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) { return(-1); } } } }
/** * M100 I * Init memory for the M100 tests. (Automatically applied on the first M100.) */ void init_free_memory(char *ptr, int16_t size) { SERIAL_ECHOLNPGM("Initializing free memory block.\n\n"); size -= 250; // -250 to avoid interrupt activity that's altered the stack. if (size < 0) { SERIAL_ECHOLNPGM("Unable to initialize.\n"); return; } ptr += 8; // move a few bytes away from the heap just because we don't want // to be altering memory that close to it. memset(ptr, TEST_BYTE, size); SERIAL_ECHO(size); SERIAL_ECHOLNPGM(" bytes of memory initialized.\n"); for (int16_t i = 0; i < size; i++) { if (ptr[i] != TEST_BYTE) { SERIAL_ECHOPAIR("? address : ", hex_address(ptr + i)); SERIAL_ECHOLNPAIR("=", hex_byte(ptr[i])); SERIAL_EOL(); } } }