FreeCalypso > hg > freecalypso-reveng
view frbl/test/frbl2.c @ 323:cefa700d1b8f
frbl: beginning of frbl2test
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 05 Mar 2020 22:05:01 +0000 |
parents | |
children | 43c92df87ac6 |
line wrap: on
line source
#include <sys/types.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> #include "srecreader.h" extern char *target_ttydev; extern int target_fd; extern struct srecreader srimage; #define MAX_IMAGE_LEN 32768 static u_char codeimage[MAX_IMAGE_LEN]; static unsigned codeimage_len; static uint32_t loadaddr; read_srec_image() { u_char *writep; uint32_t endaddr; int i; if (open_srec_file(&srimage) < 0) exit(1); for (;;) { if (read_s_record(&srimage) < 0) exit(1); switch (srimage.record_type) { case '0': if (srimage.lineno == 1) continue; fprintf(stderr, "%s: S0 record found in line %d (expected in line 1 only)\n", srimage.filename, srimage.lineno); exit(1); case '3': case '7': if (s3s7_get_addr_data(&srimage) < 0) exit(1); break; default: fprintf(stderr, "%s line %d: S%c record type not supported\n", srimage.filename, srimage.lineno, srimage.record_type); exit(1); } if (srimage.record_type == '7') break; /* must be S3 */ if (srimage.datalen < 1) { fprintf(stderr, "%s line %d: S3 record has zero data length\n", srimage.filename, srimage.lineno); exit(1); } if (srimage.datalen & 1) { fprintf(stderr, "%s line %d: S3 record has odd data length\n", srimage.filename, srimage.lineno); exit(1); } if (srimage.addr & 1) { fprintf(stderr, "%s line %d: S3 record has odd address\n", srimage.filename, srimage.lineno); exit(1); } /* handle first record */ if (!codeimage_len) { endaddr = loadaddr = srimage.addr; writep = codeimage; } if (srimage.addr != endaddr) { fprintf(stderr, "%s line %d: address discontinuity\n", srimage.filename, srimage.lineno); exit(1); } if (codeimage_len + srimage.datalen > MAX_IMAGE_LEN) { fprintf(stderr, "%s line %d: max image length exceeded\n", srimage.filename, srimage.lineno); exit(1); } /* reverse byte order */ for (i = 0; i < srimage.datalen; i += 2) { *writep++ = srimage.record[i+6]; *writep++ = srimage.record[i+5]; } endaddr += srimage.datalen; codeimage_len += srimage.datalen; } /* got S7 */ fclose(srimage.openfile); if (!codeimage_len) { fprintf(stderr, "%s line %d: S7 without any preceding S3 data records\n", srimage.filename, srimage.lineno); exit(1); } if (srimage.addr != loadaddr) { fprintf(stderr, "%s line %d: S7 address differs from image load address\n", srimage.filename, srimage.lineno); exit(1); } /* all good */ return(0); } frbl_test_main() { read_srec_image(); /* remainder to be implemented */ }