ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/slot_rom.cpp
Revision: 1.1
Committed: 1999-10-03T14:16:25Z (25 years, 1 month ago) by cebix
Branch: MAIN
Branch point for: cebix
Log Message:
Initial revision

File Contents

# Content
1 /*
2 * slot_rom.cpp - Slot declaration ROM
3 *
4 * Basilisk II (C) 1996-1997 Christian Bauer
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 /*
22 * SEE ALSO
23 * Inside Macintosh: Devices, chapter 2 "Slot Manager"
24 * Designing Cards and Drivers for the Macintosh Family, Second Edition
25 */
26
27 #include <stdio.h>
28 #include <string.h>
29
30 #include "sysdeps.h"
31 #include "cpu_emulation.h"
32 #include "main.h"
33 #include "video.h"
34 #include "emul_op.h"
35 #include "version.h"
36 #include "slot_rom.h"
37
38
39 // Temporary buffer for slot ROM
40 static uint8 srom[4096];
41
42 // Index in srom
43 static uint32 p;
44
45
46 /*
47 * Construct slot declaration ROM and copy it into the Mac ROM (must be called after VideoInit())
48 */
49
50 static void Offs(uint8 type, uint32 ptr)
51 {
52 uint32 offs = ptr - p;
53 srom[p++] = type;
54 srom[p++] = offs >> 16;
55 srom[p++] = offs >> 8;
56 srom[p++] = offs;
57 }
58
59 static void Rsrc(uint8 type, uint32 data)
60 {
61 srom[p++] = type;
62 srom[p++] = data >> 16;
63 srom[p++] = data >> 8;
64 srom[p++] = data;
65 }
66
67 static void EndOfList(void)
68 {
69 srom[p++] = 0xff;
70 srom[p++] = 0;
71 srom[p++] = 0;
72 srom[p++] = 0;
73 }
74
75 static void Long(uint32 data)
76 {
77 srom[p++] = data >> 24;
78 srom[p++] = data >> 16;
79 srom[p++] = data >> 8;
80 srom[p++] = data;
81 }
82
83 static void Word(uint16 data)
84 {
85 srom[p++] = data >> 8;
86 srom[p++] = data;
87 }
88
89 static void String(char *str)
90 {
91 while ((srom[p++] = *str++) != 0) ;
92 if (p & 1)
93 srom[p++] = 0;
94 }
95
96 static void PString(char *str)
97 {
98 srom[p++] = strlen(str);
99 while ((srom[p++] = *str++) != 0) ;
100 p--;
101 if (p & 1)
102 srom[p++] = 0;
103 }
104
105 bool InstallSlotROM(void)
106 {
107 uint32 boardType, boardName, vendorID, revLevel, partNum, date;
108 uint32 vendorInfo, sRsrcBoard;
109
110 uint32 videoType, videoName, minorBase, minorLength, videoDrvr, vidDrvrDir;
111 uint32 defaultGamma, gammaDir, vidModeParms, vidMode, sRsrcVideo;
112
113 uint32 cpuType, cpuName, cpuMajor, cpuMinor, sRsrcCPU;
114
115 uint32 etherType, etherName, etherDrvr, etherDrvrDir, sRsrcEther;
116
117 uint32 sRsrcDir;
118
119 char str[256];
120 p = 0;
121
122 // Board sResource
123 boardType = p; // Literals
124 Word(1); Word(0); Word(0); Word(0); // Board sResource
125 boardName = p;
126 String("Basilisk II Slot ROM");
127 vendorID = p;
128 String("Christian Bauer");
129 revLevel = p;
130 sprintf(str, "V%d.%d", VERSION_MAJOR, VERSION_MINOR);
131 String(str);
132 partNum = p;
133 String("BasiliskII");
134 date = p;
135 String(__DATE__);
136
137 vendorInfo = p; // Vendor Info
138 Offs(0x01, vendorID); // Vendor ID
139 Offs(0x03, revLevel); // Revision level
140 Offs(0x04, partNum); // Part number
141 Offs(0x05, date); // ROM build date
142 EndOfList();
143
144 sRsrcBoard = p;
145 Offs(0x01, boardType); // Board descriptor
146 Offs(0x02, boardName); // Board name
147 Rsrc(0x20, 0x4232); // Board ID ('B2')
148 Offs(0x24, vendorInfo); // Vendor Info
149 EndOfList();
150
151 // Video sResource
152 videoType = p; // Literals
153 Word(3); Word(1); Word(1); Word(0x4232); // Display Video Apple 'B2'
154 videoName = p;
155 String("Display_Video_Apple_Basilisk");
156 minorBase = p;
157 Long(VideoMonitor.mac_frame_base); // Frame buffer base
158 minorLength = p;
159 Long(VideoMonitor.bytes_per_row * VideoMonitor.y); // Frame buffer size
160
161 videoDrvr = p; // Video driver
162 Long(0x72); // Length
163 Word(0x4c00); Word(0); Word(0); Word(0);
164 Word(0x32); // Open offset
165 Word(0x36); // Prime offset
166 Word(0x3a); // Control offset
167 Word(0x46); // Status offset
168 Word(0x6c); // Close offset
169 PString(".Display_Video_Apple_Basilisk");
170 Word(1); // Driver version
171 Word(M68K_EMUL_OP_VIDEO_OPEN); // Open()
172 Word(0x4e75);
173 Word(0x70ff); // Prime()
174 Word(0x600e);
175 Word(M68K_EMUL_OP_VIDEO_CONTROL); // Control()
176 Word(0x0c68); Word(0x0001); Word(0x001a);
177 Word(0x6604);
178 Word(0x4e75);
179 Word(M68K_EMUL_OP_VIDEO_STATUS); // Status()
180 Word(0x3228); Word(0x0006); // IOReturn
181 Word(0x0801); Word(0x0009);
182 Word(0x670c);
183 Word(0x4a40);
184 Word(0x6f02);
185 Word(0x4240);
186 Word(0x3140); Word(0x0010);
187 Word(0x4e75);
188 Word(0x4a40);
189 Word(0x6f04);
190 Word(0x4240);
191 Word(0x4e75);
192 Word(0x2f38); Word(0x08fc);
193 Word(0x4e75);
194 Word(0x70e8); // Close()
195 Word(0x4e75);
196
197 vidDrvrDir = p; // Driver directory
198 Offs(0x02, videoDrvr); // sMacOS68020
199 EndOfList();
200
201 defaultGamma = p; // Gamma table
202 Long(38 + 0x100); // Length
203 Word(0x2000); // Resource ID
204 String("Mac HiRes Std Gamma");
205 Word(0); // Version
206 Word(0); // Type
207 Word(0); // FormulaSize
208 Word(1); // ChanCnt
209 Word(0x0100); // DataCnt
210 Word(8); // ChanWidth
211 Long(0x0005090B); Long(0x0E101315); Long(0x17191B1D); Long(0x1E202224);
212 Long(0x2527282A); Long(0x2C2D2F30); Long(0x31333436); Long(0x37383A3B);
213 Long(0x3C3E3F40); Long(0x42434445); Long(0x4748494A); Long(0x4B4D4E4F);
214 Long(0x50515254); Long(0x55565758); Long(0x595A5B5C); Long(0x5E5F6061);
215 Long(0x62636465); Long(0x66676869); Long(0x6A6B6C6D); Long(0x6E6F7071);
216 Long(0x72737475); Long(0x76777879); Long(0x7A7B7C7D); Long(0x7E7F8081);
217 Long(0x81828384); Long(0x85868788); Long(0x898A8B8C); Long(0x8C8D8E8F);
218 Long(0x90919293); Long(0x94959596); Long(0x9798999A); Long(0x9B9B9C9D);
219 Long(0x9E9FA0A1); Long(0xA1A2A3A4); Long(0xA5A6A6A7); Long(0xA8A9AAAB);
220 Long(0xABACADAE); Long(0xAFB0B0B1); Long(0xB2B3B4B4); Long(0xB5B6B7B8);
221 Long(0xB8B9BABB); Long(0xBCBCBDBE); Long(0xBFC0C0C1); Long(0xC2C3C3C4);
222 Long(0xC5C6C7C7); Long(0xC8C9CACA); Long(0xCBCCCDCD); Long(0xCECFD0D0);
223 Long(0xD1D2D3D3); Long(0xD4D5D6D6); Long(0xD7D8D9D9); Long(0xDADBDCDC);
224 Long(0xDDDEDFDF); Long(0xE0E1E1E2); Long(0xE3E4E4E5); Long(0xE6E7E7E8);
225 Long(0xE9E9EAEB); Long(0xECECEDEE); Long(0xEEEFF0F1); Long(0xF1F2F3F3);
226 Long(0xF4F5F5F6); Long(0xF7F8F8F9); Long(0xFAFAFBFC); Long(0xFCFDFEFF);
227
228 gammaDir = p; // Gamma directory
229 Offs(0x80, defaultGamma);
230 EndOfList();
231
232 vidModeParms = p; // Video mode parameters
233 Long(50); // Length
234 Long(0); // Base offset
235 Word(VideoMonitor.bytes_per_row); // Row bytes
236 Word(0); // Bounds
237 Word(0);
238 Word(VideoMonitor.y);
239 Word(VideoMonitor.x);
240 Word(0); // Version
241 Word(0); // Pack type
242 Long(0); // Pack size
243 Long(0x00480000); // HRes
244 Long(0x00480000); // VRes
245 switch (VideoMonitor.mode) {
246 case VMODE_1BIT:
247 Word(0); // Pixel type (indirect)
248 Word(1); // Pixel size
249 Word(1); // CmpCount
250 Word(1); // CmpSize
251 break;
252 case VMODE_2BIT:
253 Word(0); // Pixel type (indirect)
254 Word(2); // Pixel size
255 Word(1); // CmpCount
256 Word(2); // CmpSize
257 break;
258 case VMODE_4BIT:
259 Word(0); // Pixel type (indirect)
260 Word(4); // Pixel size
261 Word(1); // CmpCount
262 Word(4); // CmpSize
263 break;
264 case VMODE_8BIT:
265 Word(0); // Pixel type (indirect)
266 Word(8); // Pixel size
267 Word(1); // CmpCount
268 Word(8); // CmpSize
269 break;
270 case VMODE_16BIT:
271 Word(16); // Pixel type (direct)
272 Word(16); // Pixel size
273 Word(3); // CmpCount
274 Word(5); // CmpSize
275 break;
276 case VMODE_32BIT:
277 Word(16); // Pixel type (direct)
278 Word(32); // Pixel size
279 Word(3); // CmpCount
280 Word(8); // CmpSize
281 break;
282 }
283 Long(0); // Plane size
284 Long(0); // Reserved
285
286 vidMode = p; // Video mode description
287 Offs(0x01, vidModeParms); // Video parameters
288 Rsrc(0x03, 1); // Page count
289 Rsrc(0x04, IsDirectMode(VideoMonitor.mode) ? 2 :0); // Device type
290 EndOfList();
291
292 sRsrcVideo = p;
293 Offs(0x01, videoType); // Video type descriptor
294 Offs(0x02, videoName); // Driver name
295 Offs(0x04, vidDrvrDir); // Driver directory
296 Rsrc(0x08, 0x4232); // Hardware device ID ('B2')
297 Offs(0x0a, minorBase); // Frame buffer base
298 Offs(0x0b, minorLength); // Frame buffer length
299 Offs(0x40, gammaDir); // Gamma directory
300 Rsrc(0x7d, 6); // Video attributes: Default to color, built-in
301 Offs(0x80, vidMode); // Video mode parameters
302 EndOfList();
303
304 // CPU sResource
305 cpuType = p; // Literals
306 Word(10); Word(3); Word(0); Word(24); // CPU 68020
307 cpuName = p;
308 String("CPU_68020");
309 cpuMajor = p;
310 Long(0); Long(0x7fffffff);
311 cpuMinor = p;
312 Long(0xf0800000); Long(0xf0ffffff);
313
314 sRsrcCPU = p;
315 Offs(0x01, cpuType); // Type descriptor
316 Offs(0x02, cpuName); // CPU name
317 Offs(0x81, cpuMajor); // Major RAM space
318 Offs(0x82, cpuMinor); // Minor RAM space
319 EndOfList();
320
321 // Ethernet sResource
322 etherType = p; // Literals
323 Word(4); Word(1); Word(1); Word(0x4232); // Network Ethernet Apple 'B2'
324 etherName = p;
325 String("Network_Ethernet_Apple_BasiliskII");
326
327 etherDrvr = p; // Video driver
328 Long(0x88); // Length
329 Word(0x4400); Word(0); Word(0); Word(0);
330 Word(0x4a); // Open offset
331 Word(0x4e); // Prime offset
332 Word(0x52); // Control offset
333 Word(0x4e); // Status offset
334 Word(0x82); // Close offset
335 PString(".ENET");
336 Word(0x0111); Word(0x8000); // Driver version
337 Word(0);
338 PString("1.1.1 ");
339 PString("Basilisk II Ethernet Network Driver");
340 Word(M68K_EMUL_OP_ETHER_OPEN); // Open()
341 Word(0x4e75);
342 Word(0x70ef); // Prime()/Status()
343 Word(0x600c);
344 Word(M68K_EMUL_OP_ETHER_CONTROL); // Control()
345 Word(0x0c68); Word(0x0001); Word(0x001a);
346 Word(0x6602);
347 Word(0x4e75);
348 Word(0x3228); Word(0x0006); // IOReturn
349 Word(0x0801); Word(0x0009);
350 Word(0x670c);
351 Word(0x4a40);
352 Word(0x6f02);
353 Word(0x4240);
354 Word(0x3140); Word(0x0010);
355 Word(0x4e75);
356 Word(0x4a40);
357 Word(0x6f04);
358 Word(0x4240);
359 Word(0x4e75);
360 Word(0x2f38); Word(0x08fc);
361 Word(0x4e75);
362 Word(0x70e8); // Close()
363 Word(0x4e75);
364
365 etherDrvrDir = p; // Driver directory
366 Offs(0x02, etherDrvr); // sMacOS68020
367 EndOfList();
368
369 sRsrcEther = p;
370 Offs(0x01, etherType); // Type descriptor
371 Offs(0x02, etherName); // Driver name
372 Offs(0x04, etherDrvrDir); // Driver directory
373 Rsrc(0x07, 2); // Flags: OpenAtStart
374 Rsrc(0x08, 0x4232); // Hardware device ID ('B2')
375 EndOfList();
376
377 // sResource directory
378 sRsrcDir = p;
379 Offs(0x01, sRsrcBoard);
380 Offs(0x80, sRsrcVideo);
381 Offs(0xf0, sRsrcCPU);
382 Offs(0xf1, sRsrcEther);
383 EndOfList();
384
385 // Format/header block
386 Offs(0, sRsrcDir); // sResource directory
387 Long(p + 16); // Length of declaration data
388 Long(0); // CRC (calculated below)
389 Word(0x0101); // Rev. level, format
390 Long(0x5a932bc7); // Test pattern
391 Word(0x000f); // Byte lanes
392
393 // Calculate CRC
394 uint32 crc = 0;
395 for (int i=0; i<p; i++) {
396 crc = (crc << 1) | (crc >> 31);
397 crc += srom[i];
398 }
399 srom[p - 12] = crc >> 24;
400 srom[p - 11] = crc >> 16;
401 srom[p - 10] = crc >> 8;
402 srom[p - 9] = crc;
403
404 // Copy slot ROM to Mac ROM
405 memcpy(ROMBaseHost + ROMSize - p, srom, p);
406 return true;
407 }