194 lines
4.4 KiB
C
194 lines
4.4 KiB
C
|
|
//-------------------------------------------------------------------
|
|
//-------------------------------------------------------------------
|
|
//-------------------------------------------------------------------
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
//-------------------------------------------------------------------
|
|
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;ra<len;ra++)
|
|
{
|
|
|
|
if(add>maxadd) 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<maxadd;ra+=2)
|
|
//{
|
|
//printf("0x%04X: 0x%04X\n",ra,rom[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);
|
|
}
|
|
//-------------------------------------------------------------------
|
|
//-------------------------------------------------------------------
|
|
|