067
11.03.2017, 12:50 Uhr
holm
|
es gibt auch die verschiedensten Inkarantionen von ihex2bin und bin2ihex für die unterschiedlichsten Plattformen. bei mir macht das ein selbst geschriebenenes, schon etwas älteres C Programm...
Das Zeuch sollte auch irgendwo auf meinem Server herumliegen, ist aber kein CP/M Programm und benötigt sicher Anpassungen.
Quellcode: | /*ihex2bin liest das inputfile bzw. die Standardeingabe und erwartet Intel-Hex-Format. Es wir ein Feld im Speicher angelegt und entsprechend dem Dateninhalt des Intel-hex-Files vergroessert und mit den Binaerdaten belegt. Die minimale Feldgroesse betraegt 2k, und wird dann entsprechend den Eproms jeweils verdoppelt. Nich benutzte Bytes werden mit 0xff initialisiert. Nach auftreten eines Blocks mit der Laenge 0 wird der Feldinhalt auf outfile bzw. Stdout ausgegeben. Tiffe 090893 */
#include <stdio.h> #include <stdlib.h>
unsigned char asc2hex(unsigned char high, unsigned char low) { unsigned char a,b; if((a=high)<=0x39){ a=a & 0x0f; } else { a=a & 0xdf; a=(a-7) & 0x0f; } b=a << 4; if((a=low)<=0x39){ a=a & 0x0f; } else { a=a & 0xdf; a=(a-7); a=a & 0x0f; } return(b | a); }
unsigned char mygetchar(FILE *fp) { unsigned char uch; while(1) { uch=fgetc(fp); if((uch != 0x0a) && (uch != 0x0d)) return(uch); } }
unsigned char gethex(FILE *fp) { unsigned char a,b; a=mygetchar(fp); b=mygetchar(fp); return(asc2hex(a,b)); }
main(int argc,char **argv) { unsigned char data,checksum,check; unsigned char * field; int i,endflag,oldbytes,bytes; unsigned int len,adress; FILE *fin, *fout; bytes=1024; /* initiale Feldlaenge */ endflag=0;
if(argc>3) { fprintf(stderr,"%s : Usage %s [infile] [outfile]\n",argv[0],argv[0]); exit(-1); }
if(argc==3) { if((fin=fopen(argv[1],"r"))==NULL) { fprintf(stderr,"%s : Can't open inputfile\n",argv[0]); exit(-1); } if((fout=fopen(argv[2],"w"))==NULL) { fprintf(stderr,"%s : Can't open outputfile\n",argv[0]); exit(-1); } }
if(argc==2) { if((fin=fopen(argv[1],"r"))==NULL) { fprintf(stderr,"%s : Can't open inputfile\n",argv[0]); exit(-1); } fout=stdout; }
if(argc==1) { fin=stdin; fout=stdout; }
if((field=(unsigned char *)malloc(bytes*sizeof(data)))==NULL){ fprintf(stderr,"ihex2bin: cant allocate memory\n"); exit(-1); } for(i=0;i<bytes;i++) { /* allozierten Speicher loeschen */ field[i]=0xff; }
while(!endflag){ if((data=mygetchar(fin))!=0x3a){ fprintf(stderr,"ihex2bin: stdin looks not like Intel Hex Format!\n"); exit(-1); } checksum=len=gethex(fin); /* Laenge */ if(len==0){ endflag++; /* letzter Block */ } data=gethex(fin); /* Adresse high */ checksum+=data; adress=data << 8; data=gethex(fin); /* Adresse low */ checksum+=data; adress=adress | data; /* Adresse komplett */ oldbytes=bytes; if(adress+len>bytes) { while(adress+len>bytes) { bytes+=bytes; } if((field=(unsigned char *)realloc(field,bytes*sizeof(data)))==NULL){ fprintf(stderr,"ihex2bin: cant allocate memory\n"); exit(-1); } for(i=oldbytes;i<bytes;i++){ field[i]=0xff; } } data=gethex(fin);/* Typ ueberlesen */ checksum+=data;
/* jetzt Daten */ for(i=adress;i<(len+adress);i++){ field[i]=data=gethex(fin); checksum+=data; } /* jetzt Pruefsumme holen*/
check=gethex(fin); /* Pruefsumme */ data=checksum+check; /* Summe modulo 256 muss 0 sein ! */ if(data!=0) { fprintf(stderr,"ihex2bin: checksum error %02X <> %02X\n", checksum,check); exit(-1); } } fwrite(field,bytes,sizeof(data),fout); free(field); fclose(fin); fclose(fout); exit(0); } ~
|
Nun erzähle uns mal die Auflösung des Rätsels mit HI und LO Marke bei SYS8...
Gruß,
Holm -- float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v; {s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+ (r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&& (A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;} Dieser Beitrag wurde am 11.03.2017 um 12:51 Uhr von holm editiert. |