diff --git a/WEGA/src/cmd/pburn/pb.devud.c b/WEGA/src/cmd/pburn/pb.devud.c new file mode 100644 index 0000000..479aec4 --- /dev/null +++ b/WEGA/src/cmd/pburn/pb.devud.c @@ -0,0 +1,172 @@ +/************************************************************************ +* * +* pburn - eprom programmer * +* * +* pb1.devud.c : wega p8000/16-bit-teil * +* * +************************************************************************/ + +#define nit "not interruption, execution of read or write prom, please wait\n" +#define true 1 + +extern int warning, errflag, error, fd, fd1, cfd, cfd1; +extern char eprombuf[0x4000]; + +char zei; +int fd2, k; +unsigned lang; + + +/* read prom ueber "dev/ud" (16-bit/8-bit-schnittstelle p8000) + ----------------------------------------------------------- */ + +readprom(test,tpe,adrepr,lepr,pbufepr) +int tpe; +unsigned adrepr, lepr; +char test; +char *pbufepr; +{ +char *bpbufepr; + + set_del(); + bpbufepr=pbufepr; + header (1,tpe,adrepr,lepr); + if (errflag==true) {res_del(); return;} + read (fd2,&zei,1); + switch (zei) { + case 0: break; + case 1: error=12; printf("\n"); outerr(); close (fd2); res_del(); return; + case 2: error=13; printf("\n"); outerr(); close (fd2); res_del(); return; + } + lang=lepr; + do + { + for (k=64;(lang>0) && (k>0);lang--,k--,bpbufepr++) + read (fd2,bpbufepr,1); + zei='q'; + write (fd2, &zei, 1); + }while (lang>0); + + if (test!= ' ') {for (warning=0;lepr>0;lepr--,pbufepr++) + {if (*pbufepr != 0xff) {warning=9; + if (test=='t') {outwar(); break;} + else break;}}} + close (fd2); + res_del(); +} + + +/* write prom ueber "dev/ud/ (16-bit/8-bit-schnittstelle p8000) + ------------------------------------------------------------ */ + +writeprom (tpe,adrepr,lepr,pbufepr) +int tpe; +unsigned adrepr, lepr; +char *pbufepr; +{ + set_del(); + header (2,tpe,adrepr,lepr); + if (errflag==true) {res_del(); return;} + lang=lepr; + do + { + for (k=64;(lang>0) && (k>0);lang--,k--,pbufepr++) + write (fd2,pbufepr,1); + read (fd2, &zei, 1); + }while (lang>0); + + read (fd2,&zei,1); + switch (zei) { + case 0: break; + case 1: error=12; printf("\n"); outerr(); break; + case 2: error=13; printf("\n"); outerr(); break; + } + close (fd2); + res_del(); +} + + +/* output header (read/write; typ prom; begadr prom; laenge prom */ + +header (rw,tpe,adre,lange) + +char rw; +int tpe; +unsigned adre, lange; +{ + fd2=open ("/dev/ud",2); + if (fd2==-1) {error=11; printf("\n"); outerr(); return;} + zei='P'; + write (fd2,&zei,1); /* P - programmer */ + write (fd2,&rw,1); /* read or write */ + zei=tpe & 0x00ff; + write (fd2,&zei,1); /* typ prom */ + lang=adre; + adre=adre>>8; + adre=adre & 0x00ff; + zei=adre; + write (fd2,&zei,1); /* begadr prom high */ + lang=lang & 0x00ff; + zei=lang; + write (fd2,&zei,1); /* low */ + lang=lange; + lange=lange>>8; + lange=lange & 0x00ff; + zei=lange; + write (fd2,&zei,1); /* laenge prom high */ + lang=lang & 0x00ff; + zei=lang; + write (fd2,&zei,1); /* low */ + + read (fd2, &zei, 1); /* acknowledge */ + +} + +#include + +int del = 0; +int del_pro(); + +set_del() +{ + signal (SIGINT ,del_pro); /* int-signal del-taste einfangen */ + signal (SIGHUP ,SIG_IGN); /* weitere signale ignorieren */ + + signal (SIGQUIT,SIG_IGN); + signal (SIGILL ,SIG_IGN); + signal (SIGTRAP,SIG_IGN); + signal (SIGIOT ,SIG_IGN); + signal (SIGSEGV,SIG_IGN); + signal (SIGSYS ,SIG_IGN); + signal (SIGPIPE,SIG_IGN); + signal (SIGALRM,SIG_IGN); + signal (SIGTERM,SIG_IGN); +} + +res_del() +{ + signal (SIGINT ,SIG_DFL); /* int-signal del-taste freigeben */ + signal (SIGHUP ,SIG_DFL); + signal (SIGQUIT,SIG_DFL); + signal (SIGILL ,SIG_DFL); + signal (SIGTRAP,SIG_DFL); + signal (SIGIOT ,SIG_DFL); + signal (SIGSEGV,SIG_DFL); + signal (SIGSYS ,SIG_DFL); + signal (SIGPIPE,SIG_DFL); + signal (SIGALRM,SIG_DFL); + signal (SIGTERM,SIG_DFL); + + if (del==1) {if (cfd==1) close (fd); + if (cfd1==1) close (fd1); + exit (0);} +} + +del_pro() +{ + signal (SIGINT, SIG_IGN); + del=1; + printf ("%s",nit); +} + +