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.1 by cebix, 1999-10-03T14:16:25Z vs.
Revision 1.9 by cebix, 2001-06-29T12:51:20Z

# Line 1 | Line 1
1   /*
2   *  slot_rom.cpp - Slot declaration ROM
3   *
4 < *  Basilisk II (C) 1996-1997 Christian Bauer
4 > *  Basilisk II (C) 1996-2001 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 + // Length of slot ROM
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  
62   /*
63   *  Construct slot declaration ROM and copy it into the Mac ROM (must be called after VideoInit())
# Line 102 | Line 118 | static void PString(char *str)
118                  srom[p++] = 0;
119   }
120  
121 + static uint32 VModeParms(uint32 width, uint32 height, uint32 bytes_per_row, video_depth depth)
122 + {
123 +        uint32 ret = p;
124 +        Long(50);                                       // Length
125 +        Long(0);                                        // Base offset
126 +        Word(bytes_per_row);            // Row bytes
127 +        Word(0);                                        // Bounds
128 +        Word(0);
129 +        Word(height);
130 +        Word(width);
131 +        Word(0);                                        // Version
132 +        Word(0);                                        // Pack type
133 +        Long(0);                                        // Pack size
134 +        Long(0x00480000);                       // HRes
135 +        Long(0x00480000);                       // VRes
136 +        switch (depth) {
137 +                case VDEPTH_1BIT:
138 +                        Word(0);                        // Pixel type (indirect)
139 +                        Word(1);                        // Pixel size
140 +                        Word(1);                        // CmpCount
141 +                        Word(1);                        // CmpSize
142 +                        break;
143 +                case VDEPTH_2BIT:
144 +                        Word(0);                        // Pixel type (indirect)
145 +                        Word(2);                        // Pixel size
146 +                        Word(1);                        // CmpCount
147 +                        Word(2);                        // CmpSize
148 +                        break;
149 +                case VDEPTH_4BIT:
150 +                        Word(0);                        // Pixel type (indirect)
151 +                        Word(4);                        // Pixel size
152 +                        Word(1);                        // CmpCount
153 +                        Word(4);                        // CmpSize
154 +                        break;
155 +                case VDEPTH_8BIT:
156 +                        Word(0);                        // Pixel type (indirect)
157 +                        Word(8);                        // Pixel size
158 +                        Word(1);                        // CmpCount
159 +                        Word(8);                        // CmpSize
160 +                        break;
161 +                case VDEPTH_16BIT:
162 +                        Word(16);                       // Pixel type (direct)
163 +                        Word(16);                       // Pixel size
164 +                        Word(3);                        // CmpCount
165 +                        Word(5);                        // CmpSize
166 +                        break;
167 +                case VDEPTH_32BIT:
168 +                        Word(16);                       // Pixel type (direct)
169 +                        Word(32);                       // Pixel size
170 +                        Word(3);                        // CmpCount
171 +                        Word(8);                        // CmpSize
172 +                        break;
173 +        }
174 +        Long(0);                                        // Plane size
175 +        Long(0);                                        // Reserved
176 +        return ret;
177 + }
178 +
179 + static uint32 VModeDesc(uint32 params, bool direct)
180 + {
181 +        uint32 ret = p;
182 +        Offs(0x01, params);                     // Video parameters
183 +        Rsrc(0x03, 1);                          // Page count
184 +        Rsrc(0x04, direct ? 2 : 0);     // Device type
185 +        EndOfList();
186 +        return ret;
187 + }
188 +
189   bool InstallSlotROM(void)
190   {
191          uint32 boardType, boardName, vendorID, revLevel, partNum, date;
192          uint32 vendorInfo, sRsrcBoard;
193  
194          uint32 videoType, videoName, minorBase, minorLength, videoDrvr, vidDrvrDir;
195 <        uint32 defaultGamma, gammaDir, vidModeParms, vidMode, sRsrcVideo;
195 >        uint32 defaultGamma, gammaDir, sRsrcVideo;
196 >        uint32 vidModeParms1, vidModeParms2, vidModeParms4, vidModeParms8, vidModeParms16, vidModeParms32;
197 >        uint32 vidMode1, vidMode2, vidMode4, vidMode8, vidMode16, vidMode32;
198  
199          uint32 cpuType, cpuName, cpuMajor, cpuMinor, sRsrcCPU;
200  
# Line 148 | Line 234 | bool InstallSlotROM(void)
234          Offs(0x24, vendorInfo);                         // Vendor Info
235          EndOfList();
236  
237 <        // Video sResource
237 >        // Video sResource for default mode
238          videoType = p;                                          // Literals
239 <        Word(3); Word(1); Word(1); Word(0x4232);                        // Display Video Apple 'B2'
239 >        Word(3); Word(1); Word(1); Word(0x4232);        // Display Video Apple 'B2'
240          videoName = p;
241          String("Display_Video_Apple_Basilisk");
242          minorBase = p;
243 <        Long(VideoMonitor.mac_frame_base);                                      // Frame buffer base
243 >        Long(VideoMonitor.mac_frame_base);      // Frame buffer base
244          minorLength = p;
245 <        Long(VideoMonitor.bytes_per_row * VideoMonitor.y);      // Frame buffer size
245 >        Long(0);                                                        // Frame buffer size (unspecified)
246  
247          videoDrvr = p;                                          // Video driver
248          Long(0x72);                                                     // Length
# Line 229 | Line 315 | bool InstallSlotROM(void)
315          Offs(0x80, defaultGamma);
316          EndOfList();
317  
318 <        vidModeParms = p;                                       // Video mode parameters
319 <        Long(50);                                                       // Length
320 <        Long(0);                                                        // Base offset
321 <        Word(VideoMonitor.bytes_per_row);       // Row bytes
322 <        Word(0);                                                        // Bounds
323 <        Word(0);
324 <        Word(VideoMonitor.y);
325 <        Word(VideoMonitor.x);
326 <        Word(0);                                                        // Version
327 <        Word(0);                                                        // Pack type
328 <        Long(0);                                                        // Pack size
329 <        Long(0x00480000);                                       // HRes
330 <        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();
318 >        vidModeParms1 = VModeParms(VideoMonitor.mode.x, VideoMonitor.mode.y, VideoMonitor.mode.bytes_per_row, VDEPTH_1BIT);
319 >        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
# Line 298 | Line 338 | bool InstallSlotROM(void)
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 <        Offs(0x80, vidMode);                            // Video mode parameters
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();
354  
355          // CPU sResource
# Line 385 | Line 436 | bool InstallSlotROM(void)
436          // Format/header block
437          Offs(0, sRsrcDir);                                      // sResource directory
438          Long(p + 16);                                           // Length of declaration data
439 <        Long(0);                                                        // CRC (calculated below)
439 >        Long(0);                                                        // CRC (calculated later)
440          Word(0x0101);                                           // Rev. level, format
441          Long(0x5a932bc7);                                       // Test pattern
442          Word(0x000f);                                           // Byte lanes
443  
444 +        // Copy slot ROM to Mac ROM
445 +        slot_rom_size = p;
446 +        memcpy(ROMBaseHost + ROMSize - slot_rom_size, srom, slot_rom_size);
447 +
448 +        // Calculate checksum
449 +        ChecksumSlotROM();
450 +        return true;
451 + }
452 +
453 + /*
454 + *  Calculate slot ROM checksum (in-place)
455 + */
456 +
457 + void ChecksumSlotROM(void)
458 + {
459          // Calculate CRC
460 +        uint8 *p = ROMBaseHost + ROMSize - slot_rom_size;
461 +        p[slot_rom_size - 12] = 0;
462 +        p[slot_rom_size - 11] = 0;
463 +        p[slot_rom_size - 10] = 0;
464 +        p[slot_rom_size - 9] = 0;
465          uint32 crc = 0;
466 <        for (int i=0; i<p; i++) {
466 >        for (uint32 i=0; i<slot_rom_size; i++) {
467                  crc = (crc << 1) | (crc >> 31);
468 <                crc += srom[i];
468 >                crc += p[i];
469          }
470 <        srom[p - 12] = crc >> 24;
471 <        srom[p - 11] = crc >> 16;
472 <        srom[p - 10] = crc >> 8;
473 <        srom[p - 9] = crc;
403 <
404 <        // Copy slot ROM to Mac ROM
405 <        memcpy(ROMBaseHost + ROMSize - p, srom, p);
406 <        return true;
470 >        p[slot_rom_size - 12] = crc >> 24;
471 >        p[slot_rom_size - 11] = crc >> 16;
472 >        p[slot_rom_size - 10] = crc >> 8;
473 >        p[slot_rom_size - 9] = crc;
474   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines