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.9 by cebix, 2001-06-29T12:51:20Z vs.
Revision 1.15 by cebix, 2004-01-12T15:29:22Z

# 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-2004 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 46 | Line 46 | static uint32 p;
46   static int slot_rom_size = 0;
47  
48  
49 // Check whether a mode with the specified depth exists
50 static bool has_depth(video_depth depth)
51 {
52        std::vector<video_mode>::const_iterator i = VideoModes.begin(), end = VideoModes.end();
53        while (i != end) {
54                if (i->depth == depth)
55                        return true;
56                ++i;
57        }
58        return false;
59 }
60
61
49   /*
50   *  Construct slot declaration ROM and copy it into the Mac ROM (must be called after VideoInit())
51   */
# Line 118 | 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 186 | 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;
196 <        uint32 vidModeParms1, vidModeParms2, vidModeParms4, vidModeParms8, vidModeParms16, vidModeParms32;
197 <        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 202 | 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 234 | Line 276 | bool InstallSlotROM(void)
276          Offs(0x24, vendorInfo);                         // Vendor Info
277          EndOfList();
278  
279 <        // Video sResource for default mode
238 <        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");
242        minorBase = p;
243        Long(VideoMonitor.mac_frame_base);      // Frame buffer base
244        minorLength = p;
245        Long(0);                                                        // Frame buffer size (unspecified)
283  
284          videoDrvr = p;                                          // Video driver
285          Long(0x72);                                                     // Length
# Line 315 | 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);
320 <        vidModeParms4 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_4BIT);
321 <        vidModeParms8 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_8BIT);
322 <        vidModeParms16 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_16BIT);
323 <        vidModeParms32 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_32BIT);
324 <
325 <        vidMode1 = VModeDesc(vidModeParms1, false);
326 <        vidMode2 = VModeDesc(vidModeParms2, false);
327 <        vidMode4 = VModeDesc(vidModeParms4, false);
328 <        vidMode8 = VModeDesc(vidModeParms8, false);
329 <        vidMode16 = VModeDesc(vidModeParms16, true);
330 <        vidMode32 = VModeDesc(vidModeParms32, true);
331 <
332 <        sRsrcVideo = p;
333 <        Offs(0x01, videoType);                          // Video type descriptor
334 <        Offs(0x02, videoName);                          // Driver name
335 <        Offs(0x04, vidDrvrDir);                         // Driver directory
336 <        Rsrc(0x08, 0x4232);                                     // Hardware device ID ('B2')
337 <        Offs(0x0a, minorBase);                          // Frame buffer base
338 <        Offs(0x0b, minorLength);                        // Frame buffer length
339 <        Offs(0x40, gammaDir);                           // Gamma directory
340 <        Rsrc(0x7d, 6);                                          // Video attributes: Default to color, built-in
341 <        if (has_depth(VDEPTH_1BIT))
342 <                Offs(0x80, vidMode1);                   // Video mode parameters for 1 bit
343 <        if (has_depth(VDEPTH_2BIT))
344 <                Offs(0x81, vidMode2);                   // Video mode parameters for 2 bit
345 <        if (has_depth(VDEPTH_4BIT))
346 <                Offs(0x82, vidMode4);                   // Video mode parameters for 4 bit
347 <        if (has_depth(VDEPTH_8BIT))
348 <                Offs(0x83, vidMode8);                   // Video mode parameters for 8 bit
349 <        if (has_depth(VDEPTH_16BIT))
350 <                Offs(0x84, vidMode16);                  // Video mode parameters for 16 bit
351 <        if (has_depth(VDEPTH_32BIT))
352 <                Offs(0x85, vidMode32);                  // Video mode parameters for 32 bit
353 <        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 428 | 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 463 | Line 467 | void ChecksumSlotROM(void)
467          p[slot_rom_size - 10] = 0;
468          p[slot_rom_size - 9] = 0;
469          uint32 crc = 0;
470 <        for (uint32 i=0; i<slot_rom_size; i++) {
470 >        for (int i=0; i<slot_rom_size; i++) {
471                  crc = (crc << 1) | (crc >> 31);
472                  crc += p[i];
473          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines