/***  INTELHEX.CPP correction partielle sujet 2  ***/
#include <stdio.h>
#include <string.h>
//#include <conio.h>
char valhex(char aconv){
  static char hex[17]="0123456789ABCDEF";
  char i;
  i=0;
  while(aconv!=hex[i]) i++;
  return i;
}
void calculfcs(char chaine[]) {
  static char hexa[17]="0123456789ABCDEF";
  char nb,i;
  char termin[5];
  unsigned char result;
  nb=strlen(chaine);
  //result=((valhex(chaine[0]))<<4)+valhex(chaine[1]);
  result=0;
  for (i=1;i<nb;i=i+2)
	 //result^=chaine[i]; // calcul du ou exclusif
	 result += (((valhex(chaine[i]))<<4)+valhex(chaine[i+1]));
  //if (result>0)
  result=-result;
  //sprintf(termin,"%X",result);
    strncat(chaine,&hexa[result/16],1);
    strncat(chaine,&hexa[result%16],1);
  //  strncat(chaine,&termin[2],2);
}
main() {
  FILE *sortie;
  static char hexa[17]="0123456789ABCDEF";
  char trame[128],nomfichier[34];
  unsigned char nval,i,tab[255];
  //clrscr();
  printf("   ****************************************************");
  printf("\n   *****  Conversion valeur -> fichier Intel HEX  *****");
  printf("\n   ********  TP programmation de memoires  ************");
  printf("\n   ********  Version 0.1 (S. Moutou & Cie)  ***********");
  printf("\n   ****************************************************");
  printf("\n\nCombien de valeurs voulez-vous entrer ? ");
  scanf("%d",&nval);
  for (i=0;i<nval;i++) {
    printf("%d° valeur (en hexadecimal) : ",i+1);
    scanf("%x",&tab[i]);
  }
  printf ("\nQuel est votre nom de fichier de sauvegarde ? (extension .bin) ");
  scanf("%s",nomfichier);
  sortie=fopen(nomfichier,"w");
  fwrite(tab,1,16,sortie);
  fclose(sortie);
/*
  strcpy(trame,":");
  strncat(trame,&hexa[nval/16],1);
  strncat(trame,&hexa[nval%16],1);
  strcat(trame,"000000");
  for (i=0;i<nval;i++){
    strncat(trame,&hexa[tab[i]/16],1);
    strncat(trame,&hexa[tab[i]%16],1);
  }
  calculfcs(trame);
  printf("%s",trame);
  printf ("\nQuel est votre nom de fichier de sauvegarde ? (extension .hex) ");
  scanf("%s",nomfichier);
  sortie=fopen(nomfichier,"w");
  fprintf(sortie,trame);
  fprintf(sortie,"\n:00000001FF\n");
  fclose(sortie);
*/
}

