/* 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';
}