//------------------------------------------------------------------- //------------------------------------------------------------------- //------------------------------------------------------------------- #include #include #include //------------------------------------------------------------------- unsigned char mem[0x10000]; #define ROMMASK 0x00FFFF unsigned short rom[ROMMASK+1]; FILE *fpout; unsigned char gstring[80]; unsigned char newline[1024]; //----------------------------------------------------------------------------- int readhex ( FILE *fp ) { //unsigned int errors; unsigned int addhigh; unsigned int add; unsigned int ra; //unsigned int rb; //unsigned int pages; //unsigned int page; unsigned int line; unsigned char checksum; unsigned int len; unsigned int maxadd; unsigned char t; addhigh=0; memset(rom,0x55,sizeof(rom)); line=0; while(fgets(newline,sizeof(newline)-1,fp)) { line++; //printf("%s",newline); if(newline[0]!=':') { printf("Syntax error <%u> no colon\n",line); continue; } gstring[0]=newline[1]; gstring[1]=newline[2]; gstring[2]=0; len=strtoul(gstring,NULL,16); checksum=0; for(ra=0;ra<(len+5);ra++) { gstring[0]=newline[(ra<<1)+1]; gstring[1]=newline[(ra<<1)+2]; gstring[2]=0; checksum+=(unsigned char)strtoul(gstring,NULL,16); } if(checksum) { printf("checksum error <%u>\n",line); } gstring[0]=newline[3]; gstring[1]=newline[4]; gstring[2]=newline[5]; gstring[3]=newline[6]; gstring[4]=0; add=strtoul(gstring,NULL,16); add|=addhigh; if(add>0x80000) { printf("address too big 0x%04X\n",add); return(1); } if(len&1) { printf("length odd\n"); return(1); } gstring[0]=newline[7]; gstring[1]=newline[8]; gstring[2]=0; t=(unsigned char)strtoul(gstring,NULL,16); //;llaaaattdddddd //01234567890 switch(t) { default: printf("UNKOWN type %02X <%u>\n",t,line); break; case 0x00: len>>=1; for(ra=0;ramaxadd) maxadd=add; gstring[0]=newline[(ra<<2)+9+2]; gstring[1]=newline[(ra<<2)+9+3]; gstring[2]=newline[(ra<<2)+9+0]; gstring[3]=newline[(ra<<2)+9+1]; gstring[4]=0; rom[add>>1]=(unsigned short)strtoul(gstring,NULL,16); fprintf(fpout," 0x%04X, //%08X\n",rom[add>>1],add>>1); add+=2; } break; case 0x01: printf("End of data\n"); break; case 0x02: gstring[0]=newline[9]; gstring[1]=newline[10]; gstring[2]=newline[11]; gstring[3]=newline[12]; gstring[4]=0; addhigh=strtoul(gstring,NULL,16); addhigh<<=16; printf("addhigh %08X\n",addhigh); break; } } //printf("%u lines processed\n",line); //printf("%08X\n",maxadd); //if(maxadd&0x7F) //{ //maxadd+=0x80; //maxadd&=0xFFFFFF80; //printf("%08X\n",maxadd); //} //for(ra=0;ra>1]); //} return(0); } //------------------------------------------------------------------- int main ( int argc, char *argv[] ) { FILE *fp; //unsigned int ra; if(argc<2) { printf("hex file not specified\n"); return(1); } fp=fopen(argv[1],"rt"); if(fp==NULL) { printf("error opening file [%s]\n",argv[1]); return(1); } fpout=fopen("blinker.h","wt"); if(fpout==NULL) return(1); fprintf(fpout,"\nconst unsigned short rom[0x80]=\n{\n"); if(readhex(fp)) return(1); fprintf(fpout,"};\n\n"); fclose(fpout); return(0); } //------------------------------------------------------------------- //-------------------------------------------------------------------