1 |
|
/* |
2 |
|
* slot_rom.cpp - Slot declaration ROM |
3 |
|
* |
4 |
< |
* Basilisk II (C) 1996-2001 Christian Bauer |
4 |
> |
* Basilisk II (C) 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 |
42 |
|
// Index in srom |
43 |
|
static uint32 p; |
44 |
|
|
45 |
< |
|
46 |
< |
// Check whether a mode with the specified depth exists |
47 |
< |
static bool has_depth(video_depth depth) |
48 |
< |
{ |
49 |
< |
vector<video_mode>::const_iterator i = VideoModes.begin(), end = VideoModes.end(); |
50 |
< |
while (i != end) { |
51 |
< |
if (i->depth == depth) |
52 |
< |
return true; |
53 |
< |
++i; |
54 |
< |
} |
55 |
< |
return false; |
56 |
< |
} |
45 |
> |
// Length of slot ROM |
46 |
> |
static int slot_rom_size = 0; |
47 |
|
|
48 |
|
|
49 |
|
/* |
89 |
|
srom[p++] = data; |
90 |
|
} |
91 |
|
|
92 |
< |
static void String(char *str) |
92 |
> |
static void String(const char *str) |
93 |
|
{ |
94 |
|
while ((srom[p++] = *str++) != 0) ; |
95 |
|
if (p & 1) |
96 |
|
srom[p++] = 0; |
97 |
|
} |
98 |
|
|
99 |
< |
static void PString(char *str) |
99 |
> |
static void PString(const char *str) |
100 |
|
{ |
101 |
|
srom[p++] = strlen(str); |
102 |
|
while ((srom[p++] = *str++) != 0) ; |
105 |
|
srom[p++] = 0; |
106 |
|
} |
107 |
|
|
108 |
< |
static uint32 VModeParms(uint32 width, uint32 height, uint32 bytes_per_row, video_depth depth) |
108 |
> |
static uint32 VModeParms(const monitor_desc &m, video_depth depth) |
109 |
|
{ |
110 |
+ |
const video_mode &mode = m.get_current_mode(); |
111 |
+ |
|
112 |
|
uint32 ret = p; |
113 |
< |
Long(50); // Length |
114 |
< |
Long(0); // Base offset |
115 |
< |
Word(bytes_per_row); // Row bytes |
116 |
< |
Word(0); // Bounds |
113 |
> |
Long(50); // Length |
114 |
> |
Long(0); // Base offset |
115 |
> |
Word(m.get_bytes_per_row(depth, mode.resolution_id)); |
116 |
> |
Word(0); // Bounds |
117 |
|
Word(0); |
118 |
< |
Word(height); |
119 |
< |
Word(width); |
120 |
< |
Word(0); // Version |
121 |
< |
Word(0); // Pack type |
122 |
< |
Long(0); // Pack size |
123 |
< |
Long(0x00480000); // HRes |
124 |
< |
Long(0x00480000); // VRes |
118 |
> |
Word(mode.y); |
119 |
> |
Word(mode.x); |
120 |
> |
Word(0); // Version |
121 |
> |
Word(0); // Pack type |
122 |
> |
Long(0); // Pack size |
123 |
> |
Long(0x00480000); // HRes |
124 |
> |
Long(0x00480000); // VRes |
125 |
|
switch (depth) { |
126 |
|
case VDEPTH_1BIT: |
127 |
< |
Word(0); // Pixel type (indirect) |
128 |
< |
Word(1); // Pixel size |
129 |
< |
Word(1); // CmpCount |
130 |
< |
Word(1); // CmpSize |
127 |
> |
Word(0); // Pixel type (indirect) |
128 |
> |
Word(1); // Pixel size |
129 |
> |
Word(1); // CmpCount |
130 |
> |
Word(1); // CmpSize |
131 |
|
break; |
132 |
|
case VDEPTH_2BIT: |
133 |
< |
Word(0); // Pixel type (indirect) |
134 |
< |
Word(2); // Pixel size |
135 |
< |
Word(1); // CmpCount |
136 |
< |
Word(2); // CmpSize |
133 |
> |
Word(0); // Pixel type (indirect) |
134 |
> |
Word(2); // Pixel size |
135 |
> |
Word(1); // CmpCount |
136 |
> |
Word(2); // CmpSize |
137 |
|
break; |
138 |
|
case VDEPTH_4BIT: |
139 |
< |
Word(0); // Pixel type (indirect) |
140 |
< |
Word(4); // Pixel size |
141 |
< |
Word(1); // CmpCount |
142 |
< |
Word(4); // CmpSize |
139 |
> |
Word(0); // Pixel type (indirect) |
140 |
> |
Word(4); // Pixel size |
141 |
> |
Word(1); // CmpCount |
142 |
> |
Word(4); // CmpSize |
143 |
|
break; |
144 |
|
case VDEPTH_8BIT: |
145 |
< |
Word(0); // Pixel type (indirect) |
146 |
< |
Word(8); // Pixel size |
147 |
< |
Word(1); // CmpCount |
148 |
< |
Word(8); // CmpSize |
145 |
> |
Word(0); // Pixel type (indirect) |
146 |
> |
Word(8); // Pixel size |
147 |
> |
Word(1); // CmpCount |
148 |
> |
Word(8); // CmpSize |
149 |
|
break; |
150 |
|
case VDEPTH_16BIT: |
151 |
< |
Word(16); // Pixel type (direct) |
152 |
< |
Word(16); // Pixel size |
153 |
< |
Word(3); // CmpCount |
154 |
< |
Word(5); // CmpSize |
151 |
> |
Word(16); // Pixel type (direct) |
152 |
> |
Word(16); // Pixel size |
153 |
> |
Word(3); // CmpCount |
154 |
> |
Word(5); // CmpSize |
155 |
|
break; |
156 |
|
case VDEPTH_32BIT: |
157 |
< |
Word(16); // Pixel type (direct) |
158 |
< |
Word(32); // Pixel size |
159 |
< |
Word(3); // CmpCount |
160 |
< |
Word(8); // CmpSize |
157 |
> |
Word(16); // Pixel type (direct) |
158 |
> |
Word(32); // Pixel size |
159 |
> |
Word(3); // CmpCount |
160 |
> |
Word(8); // CmpSize |
161 |
|
break; |
162 |
|
} |
163 |
< |
Long(0); // Plane size |
164 |
< |
Long(0); // Reserved |
163 |
> |
Long(0); // Plane size |
164 |
> |
Long(0); // Reserved |
165 |
|
return ret; |
166 |
|
} |
167 |
|
|
175 |
|
return ret; |
176 |
|
} |
177 |
|
|
178 |
+ |
static uint32 VMonitor(const monitor_desc &m, uint32 videoType, uint32 videoName, uint32 vidDrvrDir, uint32 gammaDir) |
179 |
+ |
{ |
180 |
+ |
uint32 minorBase, minorLength; |
181 |
+ |
uint32 vidModeParms1, vidModeParms2, vidModeParms4, vidModeParms8, vidModeParms16, vidModeParms32; |
182 |
+ |
uint32 vidMode1, vidMode2, vidMode4, vidMode8, vidMode16, vidMode32; |
183 |
+ |
uint32 ret; |
184 |
+ |
|
185 |
+ |
minorBase = p; |
186 |
+ |
Long(m.get_mac_frame_base()); // Frame buffer base |
187 |
+ |
minorLength = p; |
188 |
+ |
Long(0); // Frame buffer size (unspecified) |
189 |
+ |
|
190 |
+ |
vidModeParms1 = VModeParms(m, VDEPTH_1BIT); |
191 |
+ |
vidModeParms2 = VModeParms(m, VDEPTH_2BIT); |
192 |
+ |
vidModeParms4 = VModeParms(m, VDEPTH_4BIT); |
193 |
+ |
vidModeParms8 = VModeParms(m, VDEPTH_8BIT); |
194 |
+ |
vidModeParms16 = VModeParms(m, VDEPTH_16BIT); |
195 |
+ |
vidModeParms32 = VModeParms(m, VDEPTH_32BIT); |
196 |
+ |
|
197 |
+ |
vidMode1 = VModeDesc(vidModeParms1, false); |
198 |
+ |
vidMode2 = VModeDesc(vidModeParms2, false); |
199 |
+ |
vidMode4 = VModeDesc(vidModeParms4, false); |
200 |
+ |
vidMode8 = VModeDesc(vidModeParms8, false); |
201 |
+ |
vidMode16 = VModeDesc(vidModeParms16, true); |
202 |
+ |
vidMode32 = VModeDesc(vidModeParms32, true); |
203 |
+ |
|
204 |
+ |
ret = p; |
205 |
+ |
Offs(0x01, videoType); // Video type descriptor |
206 |
+ |
Offs(0x02, videoName); // Driver name |
207 |
+ |
Offs(0x04, vidDrvrDir); // Driver directory |
208 |
+ |
Rsrc(0x08, 0x4232); // Hardware device ID ('B2') |
209 |
+ |
Offs(0x0a, minorBase); // Frame buffer base |
210 |
+ |
Offs(0x0b, minorLength); // Frame buffer length |
211 |
+ |
Offs(0x40, gammaDir); // Gamma directory |
212 |
+ |
Rsrc(0x7d, 6); // Video attributes: Default to color, built-in |
213 |
+ |
if (m.has_depth(VDEPTH_1BIT)) |
214 |
+ |
Offs(m.depth_to_apple_mode(VDEPTH_1BIT), vidMode1); // Video mode parameters for 1 bit |
215 |
+ |
if (m.has_depth(VDEPTH_2BIT)) |
216 |
+ |
Offs(m.depth_to_apple_mode(VDEPTH_2BIT), vidMode2); // Video mode parameters for 2 bit |
217 |
+ |
if (m.has_depth(VDEPTH_4BIT)) |
218 |
+ |
Offs(m.depth_to_apple_mode(VDEPTH_4BIT), vidMode4); // Video mode parameters for 4 bit |
219 |
+ |
if (m.has_depth(VDEPTH_8BIT)) |
220 |
+ |
Offs(m.depth_to_apple_mode(VDEPTH_8BIT), vidMode8); // Video mode parameters for 8 bit |
221 |
+ |
if (m.has_depth(VDEPTH_16BIT)) |
222 |
+ |
Offs(m.depth_to_apple_mode(VDEPTH_16BIT), vidMode16); // Video mode parameters for 16 bit |
223 |
+ |
if (m.has_depth(VDEPTH_32BIT)) |
224 |
+ |
Offs(m.depth_to_apple_mode(VDEPTH_32BIT), vidMode32); // Video mode parameters for 32 bit |
225 |
+ |
EndOfList(); |
226 |
+ |
return ret; |
227 |
+ |
} |
228 |
+ |
|
229 |
|
bool InstallSlotROM(void) |
230 |
|
{ |
231 |
|
uint32 boardType, boardName, vendorID, revLevel, partNum, date; |
232 |
|
uint32 vendorInfo, sRsrcBoard; |
233 |
|
|
234 |
< |
uint32 videoType, videoName, minorBase, minorLength, videoDrvr, vidDrvrDir; |
235 |
< |
uint32 defaultGamma, gammaDir, sRsrcVideo; |
193 |
< |
uint32 vidModeParms1, vidModeParms2, vidModeParms4, vidModeParms8, vidModeParms16, vidModeParms32; |
194 |
< |
uint32 vidMode1, vidMode2, vidMode4, vidMode8, vidMode16, vidMode32; |
234 |
> |
uint32 videoType, videoName, videoDrvr, vidDrvrDir; |
235 |
> |
uint32 defaultGamma, gammaDir; |
236 |
|
|
237 |
|
uint32 cpuType, cpuName, cpuMajor, cpuMinor, sRsrcCPU; |
238 |
|
|
240 |
|
|
241 |
|
uint32 sRsrcDir; |
242 |
|
|
243 |
+ |
vector<monitor_desc *>::const_iterator m, mend = VideoMonitors.end(); |
244 |
+ |
vector<uint32> sRsrcVideo; |
245 |
+ |
|
246 |
|
char str[256]; |
247 |
+ |
int i; |
248 |
|
p = 0; |
249 |
|
|
250 |
|
// Board sResource |
276 |
|
Offs(0x24, vendorInfo); // Vendor Info |
277 |
|
EndOfList(); |
278 |
|
|
279 |
< |
// Video sResource for default mode |
280 |
< |
videoType = p; // Literals |
236 |
< |
Word(3); Word(1); Word(1); Word(0x4232); // Display Video Apple 'B2' |
279 |
> |
videoType = p; |
280 |
> |
Word(3); Word(1); Word(1); Word(0x4232); // Display Video Apple 'B2' |
281 |
|
videoName = p; |
282 |
|
String("Display_Video_Apple_Basilisk"); |
239 |
– |
minorBase = p; |
240 |
– |
Long(VideoMonitor.mac_frame_base); // Frame buffer base |
241 |
– |
minorLength = p; |
242 |
– |
Long(VideoMonitor.mode.bytes_per_row * VideoMonitor.mode.y); // Frame buffer size |
283 |
|
|
284 |
|
videoDrvr = p; // Video driver |
285 |
|
Long(0x72); // Length |
352 |
|
Offs(0x80, defaultGamma); |
353 |
|
EndOfList(); |
354 |
|
|
355 |
< |
vidModeParms1 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_1BIT); |
356 |
< |
vidModeParms2 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_2BIT); |
317 |
< |
vidModeParms4 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_4BIT); |
318 |
< |
vidModeParms8 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_8BIT); |
319 |
< |
vidModeParms16 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_16BIT); |
320 |
< |
vidModeParms32 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_32BIT); |
321 |
< |
|
322 |
< |
vidMode1 = VModeDesc(vidModeParms1, false); |
323 |
< |
vidMode2 = VModeDesc(vidModeParms2, false); |
324 |
< |
vidMode4 = VModeDesc(vidModeParms4, false); |
325 |
< |
vidMode8 = VModeDesc(vidModeParms8, false); |
326 |
< |
vidMode16 = VModeDesc(vidModeParms16, true); |
327 |
< |
vidMode32 = VModeDesc(vidModeParms32, true); |
328 |
< |
|
329 |
< |
sRsrcVideo = p; |
330 |
< |
Offs(0x01, videoType); // Video type descriptor |
331 |
< |
Offs(0x02, videoName); // Driver name |
332 |
< |
Offs(0x04, vidDrvrDir); // Driver directory |
333 |
< |
Rsrc(0x08, 0x4232); // Hardware device ID ('B2') |
334 |
< |
Offs(0x0a, minorBase); // Frame buffer base |
335 |
< |
Offs(0x0b, minorLength); // Frame buffer length |
336 |
< |
Offs(0x40, gammaDir); // Gamma directory |
337 |
< |
Rsrc(0x7d, 6); // Video attributes: Default to color, built-in |
338 |
< |
if (has_depth(VDEPTH_1BIT)) |
339 |
< |
Offs(0x80, vidMode1); // Video mode parameters for 1 bit |
340 |
< |
if (has_depth(VDEPTH_2BIT)) |
341 |
< |
Offs(0x81, vidMode2); // Video mode parameters for 2 bit |
342 |
< |
if (has_depth(VDEPTH_4BIT)) |
343 |
< |
Offs(0x82, vidMode4); // Video mode parameters for 4 bit |
344 |
< |
if (has_depth(VDEPTH_8BIT)) |
345 |
< |
Offs(0x83, vidMode8); // Video mode parameters for 8 bit |
346 |
< |
if (has_depth(VDEPTH_16BIT)) |
347 |
< |
Offs(0x84, vidMode16); // Video mode parameters for 16 bit |
348 |
< |
if (has_depth(VDEPTH_32BIT)) |
349 |
< |
Offs(0x85, vidMode32); // Video mode parameters for 32 bit |
350 |
< |
EndOfList(); |
355 |
> |
for (m = VideoMonitors.begin(); m != mend; ++m) |
356 |
> |
sRsrcVideo.push_back(VMonitor(**m, videoType, videoName, vidDrvrDir, gammaDir)); |
357 |
|
|
358 |
|
// CPU sResource |
359 |
|
cpuType = p; // Literals |
431 |
|
// sResource directory |
432 |
|
sRsrcDir = p; |
433 |
|
Offs(0x01, sRsrcBoard); |
434 |
< |
Offs(0x80, sRsrcVideo); |
434 |
> |
for (m = VideoMonitors.begin(), i = 0; m != mend; ++m, ++i) |
435 |
> |
Offs((*m)->get_slot_id(), sRsrcVideo[i]); |
436 |
|
Offs(0xf0, sRsrcCPU); |
437 |
|
Offs(0xf1, sRsrcEther); |
438 |
|
EndOfList(); |
440 |
|
// Format/header block |
441 |
|
Offs(0, sRsrcDir); // sResource directory |
442 |
|
Long(p + 16); // Length of declaration data |
443 |
< |
Long(0); // CRC (calculated below) |
443 |
> |
Long(0); // CRC (calculated later) |
444 |
|
Word(0x0101); // Rev. level, format |
445 |
|
Long(0x5a932bc7); // Test pattern |
446 |
|
Word(0x000f); // Byte lanes |
447 |
|
|
448 |
+ |
// Copy slot ROM to Mac ROM |
449 |
+ |
slot_rom_size = p; |
450 |
+ |
memcpy(ROMBaseHost + ROMSize - slot_rom_size, srom, slot_rom_size); |
451 |
+ |
|
452 |
+ |
// Calculate checksum |
453 |
+ |
ChecksumSlotROM(); |
454 |
+ |
return true; |
455 |
+ |
} |
456 |
+ |
|
457 |
+ |
/* |
458 |
+ |
* Calculate slot ROM checksum (in-place) |
459 |
+ |
*/ |
460 |
+ |
|
461 |
+ |
void ChecksumSlotROM(void) |
462 |
+ |
{ |
463 |
|
// Calculate CRC |
464 |
+ |
uint8 *p = ROMBaseHost + ROMSize - slot_rom_size; |
465 |
+ |
p[slot_rom_size - 12] = 0; |
466 |
+ |
p[slot_rom_size - 11] = 0; |
467 |
+ |
p[slot_rom_size - 10] = 0; |
468 |
+ |
p[slot_rom_size - 9] = 0; |
469 |
|
uint32 crc = 0; |
470 |
< |
for (uint32 i=0; i<p; i++) { |
470 |
> |
for (int i=0; i<slot_rom_size; i++) { |
471 |
|
crc = (crc << 1) | (crc >> 31); |
472 |
< |
crc += srom[i]; |
472 |
> |
crc += p[i]; |
473 |
|
} |
474 |
< |
srom[p - 12] = crc >> 24; |
475 |
< |
srom[p - 11] = crc >> 16; |
476 |
< |
srom[p - 10] = crc >> 8; |
477 |
< |
srom[p - 9] = crc; |
451 |
< |
|
452 |
< |
// Copy slot ROM to Mac ROM |
453 |
< |
memcpy(ROMBaseHost + ROMSize - p, srom, p); |
454 |
< |
return true; |
474 |
> |
p[slot_rom_size - 12] = crc >> 24; |
475 |
> |
p[slot_rom_size - 11] = crc >> 16; |
476 |
> |
p[slot_rom_size - 10] = crc >> 8; |
477 |
> |
p[slot_rom_size - 9] = crc; |
478 |
|
} |