Root/lm32/logic/sakc/tools/srec2vram/srec2vram.c

1#define _GNU_SOURCE
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6#include <inttypes.h>
7
8uint32_t rambase;
9uint32_t ramsize;
10uint8_t *ram;
11
12#define HAVE_STRNDUP
13#ifndef HAVE_STRNDUP
14char* strndup(const char* s, size_t n) {
15       char* ret = malloc(n + 1);
16       if (ret == NULL) return(ret);
17       ret[n] = '\0';
18       return(memcpy(ret, s, n));
19}
20#endif
21
22void help()
23{
24    printf( "\nUsage: srec2vram <srect-file> <bram-base> <bram-size>\n\n" );
25    printf( " <bram-base> \t \n" );
26    printf( " <bram-size> \t \n\n" );
27};
28
29
30uint32_t parsehex(char *line, int start, int len)
31{
32    char *str;
33    uint32_t val;
34
35    str = strndup(line+start, len);
36    sscanf(str, "%x", &val);
37    free(str);
38
39// fprintf( stderr, "parsehex: %x\n", val );
40
41    return val;
42}
43
44void parseline(char *line, int start, int bytes, uint32_t addr)
45{
46    int i;
47    uint8_t val;
48
49// fprintf( stderr, "parsline: [0x%08x, 0x%08x)\n", addr, addr+bytes );
50
51    for(i=0; i<bytes; i++) {
52        if ( (rambase <= addr+i) && (addr+i < rambase+ramsize) ) {
53            val = (uint8_t)parsehex(line, start+(i*2), 2);
54            ram[addr-rambase+i] = val;
55        }
56    }
57}
58
59#define LINESIZE 200
60
61int main(int argc, char **argv)
62{
63    int err;
64    FILE *infile;
65
66    if (argc != 4) {
67        help();
68        exit(1);
69    }
70
71    //
72    err = sscanf(argv[2], "%x", &rambase);
73    if (err != 1) {
74        printf( "ERROR: Could not parse <bram-base> (%s)\n", argv[2] );
75        exit(1);
76    }
77        
78    
79    err = sscanf(argv[3], "%i", &ramsize);
80    if (err != 1) {
81        printf( "ERROR: Could not parse <bram-size> (%s)\n", argv[3] );
82        exit(1);
83    }
84
85    ram = malloc( ramsize );
86    fprintf( stderr, "Extracting [%08x,%08x) (size=0x%x)\n",
87        rambase, rambase+ramsize, ramsize );
88        
89    // Open SREC file
90    infile = fopen( argv[1], "r" );
91    if (infile == NULL) {
92        perror( "Could not open infile" );
93        exit(1);
94    }
95
96    // Read SREC file
97    while( !feof(infile) ) {
98        char errmsg[] = "Could not parse '%s'\n";
99        char line[LINESIZE];
100        uint32_t addr;
101        int len;
102
103        
104        fgets(line, LINESIZE, infile);
105        
106        // Is this a sane SREC line?
107        if (strlen(line) < 4) {
108            fprintf( stderr, errmsg, line );
109            continue;
110        }
111
112        if (line[0] != 'S') {
113            fprintf( stderr, errmsg, line );
114            continue;
115        }
116        
117        // record length
118        len = parsehex(line, 2, 2);
119
120        switch ( line[1] ) {
121        case '0':
122            continue;
123        case '1': // data, 2-byte address
124            addr = parsehex(line, 4, 4);
125            parseline(line, 8, len-3, addr);
126            break;
127        case '2': // data, 3-byte address
128            addr = parsehex(line, 4, 6);
129            parseline(line, 10, len-4, addr);
130            break;
131        case '3': // data, 4-byte address
132            addr = parsehex(line, 4, 8);
133            parseline(line, 12, len-5, addr);
134            break;
135        case '7': // 4-byte start address
136            break;
137        case '8': // 3-byte start address
138            break;
139        case '9': // 2-byte start address
140            break;
141        default:
142            fprintf( stderr, errmsg, line );
143
144        }
145    }
146
147    fclose( infile );
148
149    // Write output
150    int i;
151
152    for(i = 0; i < ramsize; i+=4) {
153        printf( "%02x%02x%02x%02x\n", ram[i+0], ram[i+1], ram[i+2], ram[i+3] );
154    }
155
156    return 0;
157}
158
159

Archive Download this file

Branches:
master



interactive