From 32e59f1fb224890e16de3eaef4f99199ff2f8fb1 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Thu, 16 Feb 1989 13:01:52 +0000 Subject: [PATCH] WDOS Software --- WEGA/contrib/wdos/src/wdos.test.c | 242 ++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 WEGA/contrib/wdos/src/wdos.test.c diff --git a/WEGA/contrib/wdos/src/wdos.test.c b/WEGA/contrib/wdos/src/wdos.test.c new file mode 100644 index 0000000..2f500f1 --- /dev/null +++ b/WEGA/contrib/wdos/src/wdos.test.c @@ -0,0 +1,242 @@ +/************************************************************************** +*************************************************************************** + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1988 + Programm: wdos.test.c + + Bearbeiter : P. Hoge + Datum : 1.11.88 + Version : 1.1 + +*************************************************************************** + + Test-Programm fuer die MP600-Erweiterungskarten + +*************************************************************************** +**************************************************************************/ + + +#include +#include +#include +#include +#include + +extern errno; + +#define BUFLEN 5*512 + +int timeout; /* Signal-Flag */ +int parent, child1, child2; /* Prozess-Id's */ +int cpu2tty, cpu2lp, cpu2disk, cpu2ram; + +char *tty, *ttyname(); +char *progname; +struct termio targ; /* definiert in termio.h */ +struct termio savterm; /* original tty-Flags */ + +char buffer[BUFLEN]; + +/* + * Terminal Write-Protected setzen + * tty-Parameter sichern und "Raw"-Mode setzen + */ +settty() +{ + tty = ttyname(1); /* Terminal-Namen ermitteln */ + chmod(tty, 0600); + ioctl(0, TCGETA, &savterm); + ioctl(0, TCGETA, &targ); + targ.c_iflag = IXON|IXANY; + targ.c_oflag = 0; + targ.c_cflag &= ~PARENB; + targ.c_cflag |= (CS8|CSTOPB|CLOCAL|CREAD); + targ.c_lflag = 0; + targ.c_cc[VMIN] = 1; + targ.c_cc[VTIME] = 0; + ioctl(0, TCSETA, &targ); +} + +/* + * Restore tty-Parameter + */ +restty() +{ + ioctl(0, TCSETA, &savterm); + chmod(tty, 0622); +} + +/* + * Eingabe vom Terminal zu CPU2 senden + */ +term_to_cpu2() +{ + char c; + + while (1) { /* Schleife endet nie */ + read(0, &c, 1); + if ((c & 0x7f)==0x1c) { /* ^Backslash beendet Programm */ + intrupt(); + } else + write(cpu2tty, &c, 1); + } +} + +/* + * Ausgabe von CPU2 zum Terminal senden + */ +cpu2_to_term() +{ + register n_read; + + while (1) { + n_read = read(cpu2tty, buffer, BUFLEN); + write(1, buffer, n_read); + } +} + +/* + * Speicher-Lesen + */ +cpu2_ram() +{ + while (1) { + lseek(cpu2ram, 0x1000L,0); + read(cpu2ram, buffer, 512); + write(cpu2ram, buffer, 512); + lseek(cpu2ram, 0xf1000L,0); + read(cpu2ram, buffer, 512); + write(cpu2ram, buffer, 512); + } +} + + +/* + * Behandlung Alarm-Interrupt + */ +time_out() +{ + signal(SIGALRM, time_out); + timeout++; +} + +/* + * benutzt von Vater und Soehnen + */ +intrupt(sig) +int sig; +{ + int status; + + if (child1 && child2) { /* Vaterprozess */ + signal(SIGINT, SIG_IGN); /* ignoriere weiterer SIGINT */ + kill(child1, SIGINT); /* Soehne beenden */ + kill(child2, SIGINT); + wait(&status); /* auf Soehne */ + wait(&status); /* auf Soehne */ + restty(); + } else /* einer der Sohnprozesse */ + kill(parent, SIGINT); /* Vater beendet dann alle */ + /* Soehne und sich selbst */ + exit(0); +} + +main(argc, argv) +register argc; +register char *argv[]; +{ + register char *filname = (char *)0; + unsigned oflag; + + progname = argv[0]; + oflag = O_RDWR; + switch (--argc) { /* Kommandozeilen-Argumente auswerten */ + case 0: + filname = "/z/wdoslib/bios.test"; + break; + case 1: + if ((*++argv)[0] != '-') { /* Optionen ? */ + filname = *argv; /* Argument ist Dateiname */ + break; + } else { + if ((*argv)[1] == 'r') { + oflag = O_RDWR | O_NDELAY; /* O_NDELAY hier: */ + break; /* kein Reset fuer CPU */ + } + } + default: + printf ("Usage: %s [-resume | proto_test]\n", progname); + exit(1); + return; + } + if ((cpu2ram = open("/dev/cpu2rram", oflag)) == -1) { + printf ("%s: unable to open /dev/cpu2rram\n", progname); + exit(1); + return; + } + if (filname) + load(filname); + + if ((cpu2tty = open("/dev/cpu2tty", O_RDWR)) == -1) { + printf ("%s: unable to open /dev/cpu2tty\n", progname); + exit(1); + return; + } + /* folgende 2 Open sind fuer den Start des Prozessors + * erforderlich, werden aber im Test nicht benoetigt + */ + if ((cpu2lp = open("/dev/cpu2lp", O_RDONLY)) == -1) { + printf ("%s: unable to open /dev/cpu2lp\n", progname); + exit(1); + return; + } + if ((cpu2disk = open("/dev/cpu2disk", O_RDWR)) == -1) { + printf ("%s: unable to open /dev/cpu2disk\n", progname); + exit(1); + return; + } + settty(); + signal(SIGALRM, time_out); + signal(SIGHUP, intrupt); + signal(SIGINT, intrupt); + signal(SIGQUIT, intrupt); + signal(SIGTERM, intrupt); + + parent = getpid(); /* Prozess-Id dieses Prozesses */ + if ((child1 = fork()) == 0) /* Sohnprozess 1 */ + cpu2_to_term(); + if ((child2 = fork()) == 0) /* Sohnprozess 2 */ + cpu2_ram(); + term_to_cpu2(); /* Vater */ +} + +/* + * WDOS-Test (Datei bios.test) + * in den RAM der Erweiterungskarten laden + */ +load(filname) +register char *filname; +{ + register int fdr; + register int n_read; + struct stat stbuf; + + if ((fdr = open(filname, O_RDONLY)) == -1) { + printf ("%s: unable to open proto_file %s\n", progname, filname); + exit(1); + return; + } + fstat(fdr, &stbuf); + if ((stbuf.st_mode & S_IFDIR)|| /* ist es ein Directory ? */ + stbuf.st_size == 0L || /* Test der Laenge */ + stbuf.st_size > 0x10000L) { + printf("%s: invalid proto_file %s\n", progname, filname); + exit(1); + return; + } + /* Datei lesen und zu CPU2-RAM schreiben */ + lseek(cpu2ram, 0x100000L-stbuf.st_size, 0); /* RAM-Adresse einstellen */ + while ((n_read = read(fdr, buffer, BUFLEN)) > 0) + write(cpu2ram, buffer, n_read); + close(fdr); /* Close Files */ +}