ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/slot_rom.cpp
(Generate patch)

Comparing BasiliskII/src/slot_rom.cpp (file contents):
Revision 1.8 by gbeauche, 2001-06-28T21:36:46Z vs.
Revision 1.14 by cebix, 2002-04-25T11:00:30Z

# Line 1 | Line 1
1   /*
2   *  slot_rom.cpp - Slot declaration ROM
3   *
4 < *  Basilisk II (C) 1996-2001 Christian Bauer
4 > *  Basilisk II (C) 1997-2002 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
# Line 42 | Line 42 | static uint8 srom[4096];
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 <        std::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   /*
# Line 115 | Line 105 | static void PString(char *str)
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
115 >        Word(m.get_bytes_per_row(depth, mode.resolution_id));
116          Word(0);                                        // Bounds
117          Word(0);
118 <        Word(height);
119 <        Word(width);
118 >        Word(mode.y);
119 >        Word(mode.x);
120          Word(0);                                        // Version
121          Word(0);                                        // Pack type
122          Long(0);                                        // Pack size
# Line 183 | Line 175 | static uint32 VModeDesc(uint32 params, b
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  
# Line 199 | Line 240 | bool InstallSlotROM(void)
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
# Line 231 | Line 276 | bool InstallSlotROM(void)
276          Offs(0x24, vendorInfo);                         // Vendor Info
277          EndOfList();
278  
279 <        // Video sResource for default mode
235 <        videoType = p;                                          // Literals
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(0);                                                        // Frame buffer size (unspecified)
283  
284          videoDrvr = p;                                          // Video driver
285          Long(0x72);                                                     // Length
# Line 312 | Line 352 | bool InstallSlotROM(void)
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
# Line 425 | Line 431 | bool InstallSlotROM(void)
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();
# Line 433 | Line 440 | bool InstallSlotROM(void)
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   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines