

/* programme pour la programmation d'un 68705P3 par le port d'imprimante PC,
on doit utiliser le montage prevu ...copyright @Fenard.X 1991 ...*/


char mess1[]= "Le 3 mai 91 fichier:FXPRGM70 PROGRAMMATEUR DE 68705P3\n";
char mess2[] = "Version adapt‚e pour Pentium II 233 : octobre 1998, Ph. KIEFFER\n" ;




#include <conio.h>
#include <string.h>

/* variables sauvegarde des ports ecrit */
unsigned char P_valcontrol,P_valstatus;

/* variables du ports e/s*/
int P_outdata,P_outcontrol,P_instatus;
/* trace */
char TR;
/*
P_outdata= 0x378;
P_outcontrol=0x37a;
P_instatus=0x379;
 ajouter 0x44 pour avoir la sortie imprimante sur carte monochrome */

/* P_outdata    -> sortie des datas sur le port imprimante */

/* P_outcontrol ->      B4 si 1 irq auto
			B3 select input (17) <=> 25 volts on
			B2 init printer (16) <=> reset
			B1 Auto fed (14)
			B0 strobe (1)           */

/* P_instatus   ->      B7 busy (11)
			B6 ack (10)
			B5 Paper error PE (12)
			B4 Select (13)
			B3 error (15)           */



/* ******************* subroutine de controle de la carte ********* */
/* en mode programmation:
-raz actif,raz non actif
- incremente:   clkup -> busy=0
		wait int=0 <=> wait pulse strobe -> busy=1
		recup DATA
		cldown */
/* configuration        */
void Base37()
{               printf("Base … 378H \n");
	      P_outdata= 0x378;
		P_outcontrol=0x37a;
		P_instatus=0x379;
};
void Base27()
{               printf("Base … 278H \n");
	      P_outdata= 0x278;
		P_outcontrol=0x27a;
		P_instatus=0x279;
};
void Base3B()
{
		printf("Base … 3BCH \n");
	      P_outdata= 0x378+0x44;
		P_outcontrol=0x37a+0x44;
		P_instatus=0x379+0x44;
};

 /*met la data et envoie un pulse de strobe */
void cpu_wd(data)
char data;
{
unsigned delai = 0 ;
outp(P_outdata,data);
outp(P_outcontrol,P_valcontrol|0x01); /* strobe low */
while (delai < 2000) {delai++ ;} ;
outp(P_outcontrol,P_valcontrol&0xfe); /* strobe high*/
 };
/*mise a l'etat off de la carte */
int Cpu_inact()
{/* P_outcontrol ->     B4 si 1 irq auto     (0 toujours)
			B3 select input (17) (1 = 25v)
			B2 init printer (16) (0 = reset)
			B1 Auto fed (14)
			B0 strobe (1) (0 = inactif )    */
	P_valcontrol=0x0;
	outp(P_outcontrol,0x0); /* 00000*/
	cpu_wd(0);
};

/* 25v off /cpu on sur la carte  */
void Cpu_on()
{       cpu_wd(0);      /* clr bascule D, data out=0*/
	P_valcontrol=0x4;
	outp(P_outcontrol,0x4); /* 00100*/ };

/* 12 et 25v on /cpu on sur la carte  */
void Cpu_on12_25()
{       cpu_wd(0);      /* clr bascule D, data out=0 */
	P_valcontrol=0xc;
	outp(P_outcontrol,0x8); /* 01000   25 on*/
	outp(P_outcontrol,0xc); /* 01100   25 on et fin raz */ };



/* ecrit une data dans le cpu */
int cpu_write(data)
char data;
{
unsigned long timeout=0;

 while (timeout <1000000 && (0x80 & inp(P_instatus)) ) /*busy */
 { timeout++;};
 if (timeout==1000000) {printf("timeout error\n");Cpu_inact();return(-1);};
cpu_wd(data);
if (0!=kbhit()) {if ('A'==(0x7f&getch()) )
	      {printf("\n Suspension de la programmation. Tapez sur une touche pour continuer\n");
		while(0==kbhit()) {};};
		};
return(0);
 };


/*lecture status */
int status05()
{
/* P_instatus   ->      B7 busy (11)
			B6 ack (10)
			B5 Paper error PE (12)
			B4 Select (13)
			B3 error (15)           */
if (inp(P_instatus)&0x80) printf("Busy = 1 -> Attente d'octet\n");
			else printf("Busy = 0 -> Pas en attente d'octet\n");
if (inp(P_instatus)&0x40) printf("Ack = 1 -> \n");
			else printf("Ack = 0 -> \n");
if (inp(P_instatus)&0x20) printf("Paper Error (PE) = 1 -> PC3 \n");
			else printf("Paper Error (PE) = 0 -> PC3 \n");
if (inp(P_instatus)&0x10) printf("Select = 1 -> En programmation \n");
			else printf("Select = 0 -> Fin de programmation \n");
if (inp(P_instatus)&0x08) printf("Error = 1 -> Erreur de v‚rification \n");
			else printf("Error = 0 -> V‚rif. ok \n");
};

/* fin des procedures en relation avec le hard */

/* transforme car recu en hex */
int dec_hex(carhex)
char carhex;
{carhex = carhex &0x7f;
if (carhex <=0x39) return(carhex-0x30);else return(carhex-0x37);};


/* teste de virginite du monochip */
void T_vierge()
{
signed int c;
	Cpu_on12_25();  /* raz bascule, cpu on */
	for(c=0;c<2049;c++)
		{
			if (-1==cpu_write(0))
			{printf( "Passe 1 ");
			printf("erreur en : %d\n",c);
			c=10000;
			};
		};
	if (c<10000)
	{printf("<<<<< ** Fin de fausse programmation ** >>>>>\n");
	printf("\n");

	for(c=0;c<2047;c++)
		{
			if (-1==cpu_write(0))
			{printf( "Passe 2 ");
			printf("erreur en : %d\n",c);
			c=10000;
			};

		};
	 };
};


/* ecriture du code dans le processeur */
int Ecrit_68705(input,ADC)
char *input[];
signed int ADC;
{
int in,adress;
char a,b,T,U;

/*liee a S1,S9 */
unsigned int NB,VAL;
signed int NBA;
/*liee au cpu */


/*      ADC=1;  /*adresse CPU */
	in=open (input,0);

if ( in == -1) {printf("Erreur ouverture\n");Cpu_inact();return(-1);};
	T=0;U=0;

	while (read(in,&a,1))

	{
	a=a&0x7f;
/* exemple de fichier motorola s9
S11302D0142406C615171602C617023A1581051707
S10A02E0FCA60AB71520F289
S1 04 0784 58 18
S10B07F8027A02B002BD0111F6
S9030000FC      */
	switch (T)
	      {
	 case 0 :
		if (a=='S') {T=1,U=0;};
	    break;
	 case 1: /*lecture nombre de hex dans NB */
		/* nombre octet en ligne = NB-3 */
		if (U==2) {NB=NB+dec_hex(a);T=2;U=0;NB=NB-3;break;};
		if (U==1) {NB= 16*dec_hex(a);U++;break;};
		if (U==0 && (a=='9') )
			{T=20;printf("fin de fichier S9\n");}
				 else U++;
	    break;
	 case 2: /*lecture adresse */
		if (U==3) {NBA=NBA+dec_hex(a);T=3;U=0;break;};
		if (U==2) {NBA=NBA+dec_hex(a)*0x10;U++;break;};
		if (U==1) {NBA=NBA+dec_hex(a)*0x100;U++;break;};
		if (U==0) {NBA=dec_hex(a)*0x1000;U++;break;};
	    break;
	 case 3: /*lecture octet */
		if (U==1) {VAL=VAL+dec_hex(a);
				/*ecriture data NBA VAL */
			if (ADC>NBA){printf("Erreur d'adresse"); T=21;};
		      while((ADC<NBA) && (T!=21) )
			   {if (-1==cpu_write(0))T=21;/*erreur*/
			   if (TR)printf (".");
			   ADC++; /* remplissage a  0 */};
			if (T!=21){
			if (TR) printf(" %04.4x -> %02.2x  \n",NBA,VAL);
			if (-1==cpu_write(VAL))T=21; /*erreur*/
			ADC++;
			NBA++;  /*adresse suivante */
			NB--;
			if ((NB==0) && (T!=21))T=0; /* next ligne */
			U=0;break;
			 };
		  };

		if (U==0) {VAL=dec_hex(a)*0x10;U++;break;};

	 case 20:       /* fin de fichier hex */
	    break;
	 case 21:       /* erreur */
	    break;
		};
	};
	in=close(in);
if ( (in == -1) || (T==21) ) return(-1);
	 return(0);
};




/* Programme principal */

main (argc, argv)
int argc ;
char *argv[] ;
{
char err,out,input[30],output[30], *infile, *outfile ;

if (argc < 2)
	{ printf ("Pr‚ciser le nom du fichier … programmer\n") ;
	  return (1) ;
	}
Base37();
printf("CPU off - 25 volts off\n");
Cpu_inact();
printf(mess1);
printf (mess2) ;

/*le corps de programme */

  for(out=0;out<10;)
   {
	if (err==-1)
		{printf ("Erreur de traitement\n");
		err=0;
		};
      printf("\n>> Z : Stoppe le 68705P3 \n");
	    printf( ">> C : 12 et 25v off / CPU on \n");
	  printf( ">> P : Programmation du 68705P3 et visualisation \n");
	    printf( ">> F : Programmation du 68705P3 sans visualisation\n");
	    printf( "       (A : suspension de la programmation)\n");
	  printf( ">> V : Test de virginit‚ du 68705P3 \n");
	    printf( ">> S : Statut du 68705P3 \n");
	    printf( ">> Q : Quitte\n");
	    printf( ">> O : Adresse carte 027XH (LPT2)\n");
	    printf( ">> I : Adresse carte 037XH (LPT1, d‚faut)\n\n" );

      switch (toupper(getch()))
      {
	 case 'Z' :
	    printf("CPU off - 25 volts off\n");
	    Cpu_inact();
	    break;

	 case 'C' :
	    Cpu_on();
	    printf("CPU on - 25 volts off\n");
	    break;

	 case 'P' :/*programmation*/
	    TR=1;
	    printf ("Fichier d'entr‚e : ") ;
	    strcpy (infile, argv [1]) ;
              strcat (infile, ".S19") ;
	    printf (infile) ;
	    printf ("\n") ;
	    printf("Mise ON du CPU\n");
	    Cpu_on12_25();      /* cpu on */
	    printf("Ecriture des datas\n");
	    if (-1!=Ecrit_68705(infile,0))
		   {printf("V‚rification des datas\n");
		/*      printf("Tapez sur une touche pour continuer\n");
			getch(); */
		    if (-1!=Ecrit_68705(infile,0))
		      {status05();
		    printf(" \n >>>>>> Tapez Z\n >>>>>> Coupez le courant avant d'enlever le monochip..\n\n");
		      };
		   };
	    break;
	  case 'F' :/*programmation*/
	    TR=0;
	    printf ("Fichier d'entr‚e : ") ;
	    strcpy (infile, argv [1]) ;
              strcat (infile, ".S19") ;
	    printf (infile) ;
	    printf ("\n") ;
	    printf("Mise ON du CPU\n");
	    Cpu_on12_25();      /* cpu on */
	    printf("Ecriture des datas\n");
	    if (-1!=Ecrit_68705(infile,0))
		   {printf("V‚rification des datas\n");
		    if (-1!=Ecrit_68705(infile,0))
		      {status05();
		    printf(" \n >>>>>> Tapez Z\n >>>>>> Coupez le courant avant d'enlever le monochip..\n\n");
		      };
		   };
	    break;

	 case 'V' :
	    printf("Vierge si \"v‚rifier\" et \"prog. ok\" allum‚s\n");
	  T_vierge();
	    status05();
	    Cpu_inact();
	    break;
	 case 'S' :
	    status05();
	    break;

	 case 'Q' :
	     out=10;
	     break;
	 case 'O' :
		Base27();
	  break;
	 case 'I' :
		Base37();
	  break;
	}
   }
}
