1 | /*
|
---|
2 | =============================================================================
|
---|
3 | fpuproms.c -- Buchla 700 FPU Microcode PROM Utility
|
---|
4 | Version (see VER below) -- D.N. Lynx Crowe
|
---|
5 |
|
---|
6 | This program takes an ASCII file giving the microcode addresses
|
---|
7 | and data values, and creates 5 PROM files in Motorola S-Record format.
|
---|
8 |
|
---|
9 | The FPU700.DAT input file consists of 9 input fields, as follows:
|
---|
10 |
|
---|
11 | adr p1 p2 p2b p3 p3b p4 p4b p5
|
---|
12 |
|
---|
13 | where:
|
---|
14 |
|
---|
15 | adr is the address in decimal for the data
|
---|
16 | p1..p5 is the hex data for each prom
|
---|
17 |
|
---|
18 | PROM 2, PROM 3, and PROM 4 have separate data for each half, while the
|
---|
19 | data from the first half is duplicated in the second half for
|
---|
20 | PROM 1 and PROM 5.
|
---|
21 | =============================================================================
|
---|
22 | */
|
---|
23 |
|
---|
24 | #define VER "4 - 1987-09-11" /* version ID */
|
---|
25 |
|
---|
26 | #include "stdio.h"
|
---|
27 | #include "stddefs.h"
|
---|
28 |
|
---|
29 | extern short msrec();
|
---|
30 | extern char *memset();
|
---|
31 |
|
---|
32 | #define NFIELDS 9 /* number of input data fields */
|
---|
33 |
|
---|
34 | #define FN_IN "FPU700.DAT" /* input file name (stripped Wordstar file) */
|
---|
35 |
|
---|
36 | #define FN_P1 "FPU700P1.MOT" /* output file name - PROM 1 */
|
---|
37 | #define FN_P2 "FPU700P2.MOT" /* output file name - PROM 2 */
|
---|
38 | #define FN_P3 "FPU700P3.MOT" /* output file name - PROM 3 */
|
---|
39 | #define FN_P4 "FPU700P4.MOT" /* output file name - PROM 4 */
|
---|
40 | #define FN_P5 "FPU700P5.MOT" /* output file name - PROM 5 */
|
---|
41 |
|
---|
42 | FILE *fp; /* stream pointer */
|
---|
43 |
|
---|
44 | char prom[5][1024]; /* PROM images */
|
---|
45 |
|
---|
46 | short padr, p1, p2, p2b, p3, p3b, p4, p4b, p5; /* input variables */
|
---|
47 |
|
---|
48 | /* |
---|
49 |
|
---|
50 | */
|
---|
51 |
|
---|
52 | /*
|
---|
53 | =============================================================================
|
---|
54 | putfile(fn, n) -- output PROM file 'n' to file 'fn'
|
---|
55 | =============================================================================
|
---|
56 | */
|
---|
57 |
|
---|
58 | putfile(fn, n)
|
---|
59 | FILE *fn;
|
---|
60 | short n;
|
---|
61 | {
|
---|
62 | if (NULL EQ (fp = fopen(fn, "w"))) {
|
---|
63 |
|
---|
64 | printf("\nfpuproms: ERROR - unable to open output file [%s]\n",
|
---|
65 | fn);
|
---|
66 |
|
---|
67 | exit(1);
|
---|
68 | }
|
---|
69 |
|
---|
70 | msrec(fp, 0L, 1024L, prom[n]);
|
---|
71 | fclose(fp);
|
---|
72 | printf("fpuproms: PROM %d file [%s] written\n", n + 1, fn);
|
---|
73 | }
|
---|
74 |
|
---|
75 | /* |
---|
76 |
|
---|
77 | */
|
---|
78 |
|
---|
79 | /*
|
---|
80 | =============================================================================
|
---|
81 | main function -- Buchla 700 FPU Microcode PROM Utility
|
---|
82 | =============================================================================
|
---|
83 | */
|
---|
84 |
|
---|
85 | main()
|
---|
86 | {
|
---|
87 | register short i, rc;
|
---|
88 |
|
---|
89 | printf("Buchla 700 FPU Microcode PROM Utility -- Version %s\n\n", VER);
|
---|
90 |
|
---|
91 | if (NULL EQ (fp = fopen(FN_IN, "r"))) {
|
---|
92 |
|
---|
93 | printf("fpuproms: ERROR - Unable to open [%s] for input\n",
|
---|
94 | FN_IN);
|
---|
95 |
|
---|
96 | exit(1);
|
---|
97 | }
|
---|
98 |
|
---|
99 | padr = -1;
|
---|
100 | memset(prom, 0xFF, sizeof prom);
|
---|
101 |
|
---|
102 | /* |
---|
103 |
|
---|
104 | */
|
---|
105 | /* read the PROM data */
|
---|
106 |
|
---|
107 | printf("fpuproms: Reading PROM data from [%s]\n", FN_IN);
|
---|
108 |
|
---|
109 | for (;;) {
|
---|
110 |
|
---|
111 | rc = fscanf(fp, "%d %x %x %x %x %x %x %x %x",
|
---|
112 | &padr, &p1, &p2, &p2b, &p3, &p3b, &p4, &p4b, &p5);
|
---|
113 |
|
---|
114 | if (rc EQ EOF)
|
---|
115 | break;
|
---|
116 |
|
---|
117 | if (rc NE NFIELDS) {
|
---|
118 |
|
---|
119 | printf("\nfpuproms: ERROR - Invalid data near address %d\n",
|
---|
120 | padr);
|
---|
121 |
|
---|
122 | exit(1);
|
---|
123 | }
|
---|
124 |
|
---|
125 | if (padr LT 0 OR padr GT 511) {
|
---|
126 |
|
---|
127 | printf("\nfpuproms: ERROR - Address [%d] not in range 0..511\n",
|
---|
128 | padr);
|
---|
129 |
|
---|
130 | exit(1);
|
---|
131 | }
|
---|
132 |
|
---|
133 | prom[0][padr] = p1; /* PROM 1 */
|
---|
134 | prom[0][padr+512] = p1;
|
---|
135 |
|
---|
136 | prom[1][padr] = p2; /* PROM 2 */
|
---|
137 | prom[1][padr+512] = p2b;
|
---|
138 |
|
---|
139 | prom[2][padr] = p3; /* PROM 3 */
|
---|
140 | prom[2][padr+512] = p3b;
|
---|
141 |
|
---|
142 | prom[3][padr] = p4; /* PROM 4 */
|
---|
143 | prom[3][padr+512] = p4b;
|
---|
144 |
|
---|
145 | prom[4][padr] = p5; /* PROM 5 */
|
---|
146 | prom[4][padr+512] = p5;
|
---|
147 | }
|
---|
148 |
|
---|
149 | /* |
---|
150 |
|
---|
151 | */
|
---|
152 |
|
---|
153 | fclose(fp);
|
---|
154 |
|
---|
155 | printf("fpuproms: End of input file reached\n");
|
---|
156 |
|
---|
157 | /* write out the Motorola S-Record PROM data files */
|
---|
158 |
|
---|
159 | printf("\nfpuproms: Writing Motorola S-Record PROM data files\n");
|
---|
160 |
|
---|
161 | putfile(FN_P1, 0);
|
---|
162 | putfile(FN_P2, 1);
|
---|
163 | putfile(FN_P3, 2);
|
---|
164 | putfile(FN_P4, 3);
|
---|
165 | putfile(FN_P5, 4);
|
---|
166 |
|
---|
167 | printf("\nfpuproms: PROM file conversion complete\n");
|
---|
168 | exit(0);
|
---|
169 | }
|
---|
170 |
|
---|