/* Inputs and outputs are chip NOT tester relative           */

#include <stdio.h>
#include <ctype.h>
#define LDEBUG 0
#define maxsigs 72
#define SG sigs[i]
#define fpf fprintf
#define foris for(i=0;i<sindex;i++)
#define g_s() get_sym(s,&t)
#define tbase 0x300
#define pins 68


/* Parser constants etc */
char cmt_start_ch      = '{',
     cmt_end_ch        = '}',
     line_cmt_ch       = '#',
     x_id_start_chs[]  = {'$','_','\0'},
     x_id_chs[]        = {'$','_','\0'},
     x_space_chs[]     = {';',':','@','=','\0'},
     op_chs[]          = {'+','*','/','\0'};
char *keys[] = { "END", "INPUT", "OUTPUT", "PIN", "BIDIR", "DEFPINS" };
#include "procs5.c"
char read_pin();
/* program vars */
int   sindex=0, vecnum=0, group=FALSE;
typedef enum {snone=0,early,late} stype;
typedef enum {end=0,set_group,get_group,set_dir,clock,newvec} comm;
stype skew=snone;
struct sig { char v,ov,rv,dir,odir,vt, name[N_L]; int pin; } sigs[maxsigs];
struct pinadd {int iaddr,oaddr; byte iv,ov,m,status;} pindata[maxsigs/8];

FILE *fo,*fs;

main(argc,argv)
int argc; char *argv[];
{int i,j,do_skew=FALSE;
 set_hardware();
 if (argc<2)

 if (arg_num(argc,argv,"-id")) {printf("Version JAN/5/89\n"); exit(0);}


/*------------------------------------------------------------------*/


printf("Test start\n");


/*-------- Read and deal with vectors ------------------------------*/
for(i=0;i<=maxsigs/8;i++) pindata[i].status='F';
for(i=1;i<=pins;i++) setp(i,'0');
for(i=1;i<=pins;i++)
{
  setp(i,'1');
  for(j=1;j<=pins;j++) printf("%c",read_pin(j));
  printf("  %d\n",i);
  if(read_pin(i) != '1') printf("Error pin %d does not map\n",i);
  setp(i,'0');
}


} /* main */

/*------------------------------------------------------------------*/
/*------------------------------------------------------------------*/

set_hardware()
{             /* maps pin numbers to expander device addresses */
 int i=0,j;   /* HARDWARE DEPENDANT ROUTINE */
 /* set outputs from tester */
 outp(tbase+3,0x80);
 outp(tbase+7,0x80);
 outp(tbase+0xb,0x80);
 /* set inputs to tester */
 outp(0x310+0x3,0x9b);
 outp(0x310+0x7,0x9b);
 outp(0x310+0xb,0x9b);
 /* set outputs from tester */
 for(i=0 ; i<=2;i++) outp(tbase+i,0xff);
 for(i=4 ; i<=6;i++) outp(tbase+i,0xff);
 for(i=8 ;i<=10;i++) outp(tbase+i,0xff);

 /* set up pindata vals, mask and addresses */
 while(i<=maxsigs/8)
  {pindata[i].iv=0xff; pindata[i].m=0; pindata[i++].ov=0;}
 for(i=0 ;i<= 2;i++) pindata[i].iaddr=i;
 for(i=3 ;i<= 5;i++) pindata[i].iaddr=i+1;
 for(i=6 ;i<=8 ;i++) pindata[i].iaddr=i+2;

 for(i=0 ;i<= 2;i++) pindata[i].oaddr=i+0x10;
 for(i=3 ;i<= 5;i++) pindata[i].oaddr=i+0x11;
 for(i=6 ;i<= 8;i++) pindata[i].oaddr=i+0x12;

}


sig_exists(sg)
char *sg;
{int i;
 for(i = 0;i!=sindex && strneq(sg,sigs[i].name);i++) ;
 if (strequ(sg,sigs[i].name)) return(TRUE);
  else return(FALSE);
}

/*
outp(a,d)
int a; byte d;
{if(LDEBUG) printf("outp %x %x\n",a,d);}

inp(a)
int a;
{int i=0; 
 if(LDEBUG)
 {while(i<maxsigs/8 && a != pindata[i].oaddr+tbase) i++;
  if(a!=pindata[i].oaddr+tbase) error("inp");
  printf("inp %x %x %d\n",a,pindata[i].m,i);} return(0);}
*/

setp(p,v)
int p; char v;
{p--;
 if(v=='1') pindata[p/8].iv=pindata[p/8].iv |1<<p%8;
    else pindata[p/8].iv=pindata[p/8].iv & ~(1<<p%8);
 if(!group) outp(tbase+pindata[p/8].iaddr,pindata[p/8].iv);
  else pindata[p/8].status='T';
 if(LDEBUG) printf("set pin %d to  %c\n",p+1,v);
}

char read_pin(p)
int p;
{
 p--;
 if(pindata[p/8].status=='F') /* check if its already read */
  {pindata[p/8].ov=inp(tbase+pindata[p/8].oaddr);
   pindata[p/8].status='F';}
 if(pindata[p/8].ov & 1<<p%8) return '1';
 return '0';
}