0
|
1 /* makerom.c
|
|
2 Read standard input as S-records and build ROM image file v09.rom
|
|
3 ROM starts at 0x8000 and is 32K.
|
|
4 */
|
|
5
|
|
6 #include <stdio.h>
|
|
7 #include <stdlib.h>
|
|
8 #include <strings.h>
|
|
9
|
|
10 static int sum,charindex;
|
|
11 unsigned char mem[0x8000];
|
|
12 char linebuf[130];
|
|
13
|
|
14 void
|
|
15 hexerr()
|
|
16 {
|
|
17 fprintf(stderr,"Illegal character in hex number\n");
|
|
18 exit(1);
|
|
19 }
|
|
20
|
|
21 int gethex()
|
|
22 {
|
|
23 int c;
|
|
24 c=linebuf[charindex++];
|
|
25 if(c<'0')hexerr();
|
|
26 if(c>'9') { if(c<'A')hexerr();else c-=7; }
|
|
27 c-='0';
|
|
28 return c;
|
|
29 }
|
|
30
|
|
31 int getbyte()
|
|
32 {
|
|
33 int b;
|
|
34 b=gethex();
|
|
35 b=b*16+gethex();
|
|
36 sum=(sum+b)&0xff;
|
|
37 return b;
|
|
38 }
|
|
39
|
|
40 int
|
|
41 main()
|
|
42 {
|
|
43 FILE *romfile;
|
|
44 unsigned int i,length,addr;
|
|
45 for(i=0;i<0x8000;i++)mem[i]=0xff; /*set unused locations to FF */
|
|
46 for(;;) {
|
|
47 if(fgets(linebuf,128,stdin)==NULL)break;
|
|
48 if(strlen(linebuf))linebuf[strlen(linebuf)]=0;
|
|
49 if(linebuf[0]=='S'&&linebuf[1]=='1') {
|
|
50 sum=0;charindex=2;
|
|
51 length=getbyte();
|
|
52 if(length<3) {
|
|
53 fprintf(stderr,"Illegal length in data record\n");
|
|
54 exit(1);
|
|
55 }
|
|
56 addr=getbyte();
|
|
57 addr=(addr<<8)+getbyte();
|
|
58 if((long)addr+length-3>0x10000||addr<0x8000) {
|
|
59 fprintf(stderr,"Address 0x%x out of range\n",addr);
|
|
60 exit(1);
|
|
61 }
|
|
62 for(i=0;i!=length-3;i++)mem[addr-0x8000+i]=getbyte();
|
|
63 getbyte();
|
|
64 if(sum!=0xff) {
|
|
65 fprintf(stderr,"Checksum error\n");
|
|
66 exit(1);
|
|
67 }
|
|
68 }
|
|
69 }
|
|
70 romfile=fopen("v09.rom","wb");
|
|
71 if(!romfile) {
|
|
72 fprintf(stderr,"Cannot create file v09.rom\n");
|
|
73 exit(1);
|
|
74 }
|
|
75 fwrite(mem,0x8000,1,romfile);
|
|
76 fclose(romfile);
|
|
77 exit(0);
|
|
78 }
|