add DEL as an erase character
[unix-history] / usr / src / sys / vax / stand / imptst.c
CommitLineData
8ae0e4b4
KM
1/*
2 * Copyright (c) 1982 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
6 * @(#)imptst.c 6.2 (Berkeley) %G%
7 */
faeec66d 8
848a8eca 9#include "../h/param.h"
848a8eca 10#include "../h/inode.h"
a031a31b
SL
11
12#include "../vaxuba/ubareg.h"
13#include "../netinet/in.h"
14#include "../netinet/in_systm.h"
15#define IMPLEADERS
16#include "../netimp/if_imp.h"
17#include "../vaxif/if_acc.h"
18
848a8eca
SL
19#include "saio.h"
20#include "savax.h"
21
22#define min(a,b) (a<b ? a : b)
23#define BUFSIZ 512
24
25char input[132];
26struct imp_leader imps, *ip = &imps;
27char inbuf[BUFSIZ];
28int writeflg = 0;
29
30main()
31{
32 register error = 0, i, len;
33 short type, host, impno, link;
34 register struct accdevice *addr =
35 (struct accdevice *)ubamem(0, 0767700);
36
37 printf("imp interface diagnostic\n");
38 printf("read or write test(r or w)? ");
39 gets(input);
40 while (*input != 'r' && *input != 'w') {
41 printf("reply r or w: ");
42 gets(input);
43 }
44 if (*input == 'w') {
45 writeflg++;
46 printf("enter destination host number: ");
47 gets(input);
48 while ((host = (short)atol(input)) < 0 || host > 255) {
49 printf("range [0, 255], re-enter: ");
50 gets(input);
51 }
52 printf("imp number: ");
53 gets(input);
54 while ((impno = (short)atol(input)) < 0 || impno > 32767) {
55 printf("range [0, 32767], re-enter: ");
56 gets(input);
57 }
58 printf("link number: ");
59 gets(input);
60 while ((link = (short)atol(input)) < 0 || link > 255) {
61 printf("range [0, 255], re-enter: ");
62 gets(input);
63 }
64 }
65 printf("initialization starting...\n");
66 impinit();
67 /* send 3 noops and init imp leader buffer */
68 impnoops((struct control_leader *)ip);
69 printf("initialization complete\n");
70 if (writeflg) {
71 printf("starting write test...\n");
72 ip->il_host = host;
73 ip->il_imp = htons((u_short)impno);
74 ip->il_link = link;
75 while (!error)
76 error = impwrite(ip, sizeof (*ip));
77 printf("imp write error, ocsr=%b\n", (short)error,
78 ACC_OUTBITS);
79 } else {
80 printf("starting read test...\n");
81 while (!error) {
82printf("impread(%d)\n", sizeof (*ip));
83 error = impread(ip, sizeof (*ip));
84printf("impread, error=%b\n", error, ACC_INBITS);
85 printleader(ip);
86 len = ntohs(ip->il_length);
87printf("length=%d\n", len);
88 /* read any data */
89 while ((error & IN_EOM) == 0 &&
90 (error & ~IN_EOM) == 0 && len > 0) {
91 i = min(len, BUFSIZ);
92printf("impread(%d)\n", i);
93 error = impread(inbuf, i);
94 len -= i;
95printf("error=%b, len=%d\n", error, ACC_INBITS, len);
96 }
97 error &= ~IN_EOM;
98 if (error == 0 && (len > 0 || addr->iwc))
99 printf("imp input length mismatch\n");
100 }
101 printf("imp read error, icsr=%b\n", (short)error, ACC_INBITS);
102 }
103 printf("...imptest exiting\n");
104}
105
106impnoops(cp)
107 register struct control_leader *cp;
108{
109 register i, error;
110
111 bzero((caddr_t)cp, sizeof (struct control_leader));
112 cp->dl_format = IMP_NFF;
113 cp->dl_mtype = IMPTYPE_NOOP;
114 for (i = 0; i < IMP_DROPCNT + 1; i++ ) {
115 cp->dl_link = i;
116 if ((error = impwrite(ip, sizeof (*ip))) != 0) {
117 printf("imp init error, ocsr=%b\n", (short)error,
118 ACC_OUTBITS);
119 _stop();
120 }
121 }
122}
123
124impwrite(buf, len)
125 register struct imp *buf;
126 register len;
127{
128 register uba, error;
129 struct iob io;
130 register struct accdevice *addr =
131 (struct accdevice *)ubamem(0, 0767600);
132
133 /* set up uba mapping */
134 io.i_ma = (caddr_t)buf;
135 io.i_cc = len;
136 uba = ubasetup(&io, 0);
137
138 /* set regs and perform i/o */
139 addr->oba = (u_short)uba;
140 addr->owc = -((io.i_cc + 1) >> 1);
141 addr->ocsr = ((short) ((uba & 0x30000) >> 12) | OUT_ENLB | ACC_GO);
142 while ((addr->ocsr & ACC_RDY) == 0)
143 ;
144 error = addr->ocsr & (ACC_NXM|ACC_ERR);
145 ubafree(uba);
146 return(error);
147}
148
149impread(buf, len)
150 register struct imp *buf;
151 register len;
152{
153 register uba, error;
154 struct iob io;
155 register struct accdevice *addr =
156 (struct accdevice *)ubamem(0, 0767600);
157
158 /* set up uba mapping */
159 io.i_ma = (caddr_t)buf;
160 io.i_cc = len;
161 uba = ubasetup(&io, 0);
162 /* set regs and perform i/o */
163 addr->iba = (u_short)uba;
164 addr->iwc = -(io.i_cc >> 1);
165 addr->icsr = IN_MRDY | IN_WEN | ((uba & 0x30000) >> 12) | ACC_GO;
166 while ((addr->icsr & ACC_RDY) == 0)
167 ;
168 error = addr->icsr & (IN_EOM|ACC_ERR|IN_RMR|ACC_NXM);
169 ubafree(uba);
170 return(error);
171}
172
173impinit()
174{
175 register struct accdevice *addr =
176 (struct accdevice *)ubamem(0, 0767600);
177 register int i;
178
179 /*
180 * Reset the imp interface;
181 * the delays are pure guesswork.
182 */
183 addr->icsr = ACC_RESET; DELAY(5000);
184 addr->ocsr = ACC_RESET; DELAY(5000);
185 addr->ocsr = OUT_BBACK; DELAY(5000); /* reset host master ready */
186 addr->ocsr = 0;
187 addr->icsr = IN_MRDY | IN_WEN; /* close the relay */
188 DELAY(10000);
189 /* YECH!!! */
190 for (i = 0; i < 500; i++) {
191 if ((addr->icsr & IN_HRDY) &&
192 (addr->icsr & (IN_RMR | IN_IMPBSY)) == 0)
193 return;
194 addr->icsr = IN_MRDY | IN_WEN; DELAY(10000);
195 /* keep turning IN_RMR off */
196 }
197 printf("imp doesn't respond, icsr=%b, ocsr=%b\n",
198 addr->icsr, ACC_INBITS, addr->ocsr, ACC_OUTBITS);
199}
200
201/*
202 * Convert null-terminated ascii string to binary
203 * and return value.
204 * 1st char in string :
205 * 0 -> octal
206 * x -> hex
207 * else decimal
208 */
209atol(as)
210 register char *as;
211{
212 register value = 0;
213 register base = 10;
214 register sign = 1;
215 register digit = 0;
216
217aloop :
218 if ((digit = (*as++)) == 0)
219 return(value) ; /* null */
220 if (digit == '-') {
221 sign = -sign;
222 goto aloop ;
223 }
224 if (digit == '0')
225 base = 8 ;
226 else if (digit == 'x')
227 base = 16 ;
228 else
229 value = digit - '0';
230 while (digit = (*as++)) {
231 if (digit < '0')
232 return(0);
233 switch (base) {
234
235 case 8 :
236 if (digit > '7')
237 return(0);
238 digit -= '0';
239 break;
240
241 case 10 :
242 if (digit > '9')
243 return(0);
244 digit -= '0';
245 break;
246
247 case 16 :
248 if (digit <= '9') {
249 digit -= 060 ;
250 break;
251 }
252 if ((digit >= 'A') && (digit <= 'F')) {
253 digit -= 'A' + 10;
254 break;
255 }
256 if ((digit >= 'a') && (digit <= 'f')) {
257 digit -= 'a' + 10 ;
258 break;
259 }
260 return(0);
261 }
262 value = (value * base) + digit;
263 }
264 return (value * sign);
265}
266
267printleader(ip)
268 register struct imp_leader *ip;
269{
270 printbyte((char *)ip, 12);
271 printf("<fmt=%x,net=%x,flags=%x,mtype=", ip->il_format, ip->il_network,
272 ip->il_flags);
273 if (ip->il_mtype <= IMPTYPE_READY)
274 printf("%s,", impleaders[ip->il_mtype]);
275 else
276 printf("%x,", ip->il_mtype);
277 printf("htype=%x,host=%x,imp=%x,link=", ip->il_htype, ip->il_host,
278 ntohs(ip->il_imp));
279 if (ip->il_link == IMPLINK_IP)
280 printf("ip,");
281 else
282 printf("%x,", ip->il_link);
283 printf("subtype=%x,len=%x>\n",ip->il_subtype,ntohs(ip->il_length)>>3);
284}
285
286printbyte(cp, n)
287 register char *cp;
288 int n;
289{
290 register i, j, c;
291
292 for (i=0; i<n; i++) {
293 c = *cp++;
294 for (j=0; j<2; j++)
295 putchar("0123456789abcdef"[(c>>((1-j)*4))&0xf]);
296 putchar(' ');
297 }
298 putchar('\n');
299}