|
|
1.1 root 1:
2: #include "definitions"
3: #define LINE 80
4: #define CRTN 0x0d
5: #define EOL '.'
6:
7: /* I/O ROUTINES TO CPU2 CONSOLE */
8:
9: writec(c)
10: char c;
11: {
12: putchar(c);
13: }
14:
15: writes(s)
16: char *s;
17: {
18: putstr(s);
19: }
20:
21: writeh(ix) /* 32 bits HEX */
22: long ix;
23: { register long count, mask, indx;
24: char c, str[9];
25:
26: if (ix==0) { writec('0'); return; }
27: indx = 0; count = 28;
28: mask = 0xf0000000;
29: str[8]='\0';
30: while (mask) {
31: c = ( (ix&mask) >> count )&0xf;
32: count -= 4;
33: if (indx==0) mask = 0xf000000;
34: else mask = mask >> 4;
35: if ((c>=0)&&(c<=9)) c=c+'0';
36: else c=c+'7';
37: str[indx++] = c;
38: }
39: /* replace leading 0 with space */
40: for (indx=0; indx<8; indx++) {
41: if (str[indx]!='0') break;
42: /* esle str[indx]=' '; */
43: }
44: writes(&str[indx]);
45: }
46:
47: /* Function to write a 32_bit decimal to Console
48: */
49: writed(ix)
50: long ix;
51: { char c;
52: register long div, lead0;
53:
54: if (ix==0) { writec('0'); return; }
55: if (ix<0) { writec('-'); ix = (~ix)+1; }
56: lead0 = 1;
57: div = 1000000000;
58: while (div) {
59: c = (ix/div)+'0';
60: ix = ix%div; /* Mod */
61: div /= 10;
62: if ((c=='0')&&(lead0)) c=' ';
63: else lead0 = 0;
64: if (c != ' ') writec(c);
65: }
66: }
67:
68: /* Function read 1 char from Console
69: */
70: char readc()
71: { char c, rdchar();
72:
73: writec(c = rdchar());
74: return(c);
75: }
76:
77: /* This function read a string of characters.
78: calling sequence : nochar = reads(s);
79: input argument : char *s;
80: return value : no. of char read; excluding NULL or CR.
81: */
82: reads(s)
83: char *s;
84: { register long ix;
85:
86: for(ix=0;;ix++) {
87: *s = readc();
88: if ((*s==NULL)||(*s==CR))
89: { *s = NULL; break; }
90: else s++;
91: }
92: return(ix);
93: }
94:
95:
96: /* This function read a string of HEX digit and
97: convert it to integer value.
98: calling sequence : stat = readh(ix);
99: input parameter : long *ix;
100: return value : (stat < 0) if error else (stat = 0);
101: */
102: /*
103: readh(ix)
104: long *ix;
105: { char line[ALINE], *getnum(), *del;
106: int nochar;
107:
108: if ( (nochar = reads(line)) > 8 ) return(-1);
109: if ( (del = getnum(line,ix,del,HEX)) < 0 ) return(-1);
110: else return(0);
111: }
112:
113: */
114:
115:
116:
117:
118: /* This function read a string of DEC digit and
119: convert it to integer value.
120: calling sequence : stat = readd(ix);
121: input parameter : long *ix;
122: return value : (stat < 0) if error else (stat = 0);
123: */
124:
125: /*
126: readd(ix)
127: long *ix;
128: { char line[ALINE], *getnum(), *del;
129: int nochar;
130:
131: if ( (nochar = reads(line)) > 11 ) return(-1);
132: if ( (del = getnum(line,ix,del,DEC)) < 0 ) return(-1);
133: else return(0);
134: }
135: */
136: echo(c) /* routine to get a test number, validate it
137: and set bits in a flag word. */
138:
139: int c;
140:
141: {
142:
143: #define ALL 00
144: #define VDDC 03
145: #define VIOC 05
146: #define MT 06
147:
148: int flag, valid;
149:
150: flag = 0;
151: valid = 1;
152:
153: while (valid){
154: c = readc();
155: switch(c){
156: case '0':
157: flag |= ALL;
158: valid = 0;
159: break;
160: case '1':
161: flag |= MT;
162: valid = 0;
163: break;
164: case '2':
165: flag |= VIOC;
166: valid = 0;
167: break;
168: case '3':
169: flag |= VDDC;
170: valid = 0;
171: break;
172: default:
173: writes(" invalid test number\n");
174: writes("\nRe-enter test number : ");
175: valid = 1;
176: break;
177: }
178: }
179: c = flag;
180: return(c);
181: }
182: getcont(c) /* routine to get controller number */
183: int c;
184: {
185: int valid, cont;
186: valid = 1;
187: writes("\n\nController number [0-3] : ");
188: while(valid){
189: c = readc();
190: switch(c){
191: case '0':
192: cont = 0;
193: valid = 0;
194: break;
195: case '1':
196: cont = 1;
197: valid = 0;
198: break;
199: case '2':
200: cont = 2;
201: valid = 0;
202: break;
203: case '3':
204: cont = 3;
205: valid = 0;
206: break;
207: default:
208: writes(" invalid controller number\n");
209: writes("\nRe-enter controller number : ");
210: valid = 1;
211: break;
212: }
213: }
214: return(cont);
215: }
216: gettype(c) /* routine to get type of disk */
217: int c;
218: {
219: int valid, type;
220: valid = 1;
221: writes("\n\nDisk type [0 = fsd, 1 = smd, 2 = xfd] : ");
222: while(valid){
223: c = readc();
224: switch(c){
225: case '0':
226: type = 0;
227: valid = 0;
228: break;
229: case '1':
230: type = 1;
231: valid = 0;
232: break;
233: case '2':
234: type = 2;
235: valid = 0;
236: break;
237: default:
238: writes(" invalid disk type\n");
239: writes("\nRe-enter disk type : ");
240: valid = 1;
241: break;
242: }
243: }
244: return(type);
245: }
246: /**********************************************************
247: Hex input routine, call fill and validates the characters
248: in the character buffer. Then returns the HEX value back to
249: the calling routine.
250: **********************************************************/
251: gethex()
252: {
253: char s[LINE];
254: int k[1],i,n;
255: n=0x0;
256: fill(s,k); /* Fill s[] */
257: for (i=0;i<k[0];++i) {
258: if (s[i] >= 'a' && s[i] <= 'f')
259: n=0x10*n+s[i]-'W';
260: if (s[i] >= 'A' && s[i] <= 'F')
261: n=0x10*n+s[i]-'7';
262: if (s[i] >= '0' && s[i] <= '9')
263: n=0x10*n+s[i]-'0';
264: if ((s[i] < '0' ) || (s[i] > '9' && s[i] < 'A') || (s[i] > 'F'
265: && s[i] < 'a') || (s[i] > 'f'))
266: {
267: writes("\nInvalid hex digit: "); writec(s[i]); writes(" (ignored)");
268: }
269: }
270: return(n);
271: }
272: /****************************************************
273: This routine fills a character buffer with characters
274: that are input on the console.
275: ****************************************************/
276: fill(s,k)
277: char s[];
278: int k[];
279: {
280: char c;
281: int i;
282: k[0]=0;
283: for (i=0;(c=readc())!=CRTN;++i)
284: {
285: if (k[0]>LINE - 1) break;
286: if (c==EOL) break;
287: s[i]=c;
288: ++k[0];
289: }
290: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.