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.12 by cebix, 2001-07-11T19:26:13Z

# 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   /*
50   *  Construct slot declaration ROM and copy it into the Mac ROM (must be called after VideoInit())
# Line 102 | Line 105 | static void PString(char *str)
105                  srom[p++] = 0;
106   }
107  
108 + static uint32 VModeParms(const video_mode &mode, video_depth depth)
109 + {
110 +        uint32 ret = p;
111 +        Long(50);                                       // Length
112 +        Long(0);                                        // Base offset
113 +        Word(video_bytes_per_row(depth, mode.resolution_id));
114 +        Word(0);                                        // Bounds
115 +        Word(0);
116 +        Word(mode.y);
117 +        Word(mode.x);
118 +        Word(0);                                        // Version
119 +        Word(0);                                        // Pack type
120 +        Long(0);                                        // Pack size
121 +        Long(0x00480000);                       // HRes
122 +        Long(0x00480000);                       // VRes
123 +        switch (depth) {
124 +                case VDEPTH_1BIT:
125 +                        Word(0);                        // Pixel type (indirect)
126 +                        Word(1);                        // Pixel size
127 +                        Word(1);                        // CmpCount
128 +                        Word(1);                        // CmpSize
129 +                        break;
130 +                case VDEPTH_2BIT:
131 +                        Word(0);                        // Pixel type (indirect)
132 +                        Word(2);                        // Pixel size
133 +                        Word(1);                        // CmpCount
134 +                        Word(2);                        // CmpSize
135 +                        break;
136 +                case VDEPTH_4BIT:
137 +                        Word(0);                        // Pixel type (indirect)
138 +                        Word(4);                        // Pixel size
139 +                        Word(1);                        // CmpCount
140 +                        Word(4);                        // CmpSize
141 +                        break;
142 +                case VDEPTH_8BIT:
143 +                        Word(0);                        // Pixel type (indirect)
144 +                        Word(8);                        // Pixel size
145 +                        Word(1);                        // CmpCount
146 +                        Word(8);                        // CmpSize
147 +                        break;
148 +                case VDEPTH_16BIT:
149 +                        Word(16);                       // Pixel type (direct)
150 +                        Word(16);                       // Pixel size
151 +                        Word(3);                        // CmpCount
152 +                        Word(5);                        // CmpSize
153 +                        break;
154 +                case VDEPTH_32BIT:
155 +                        Word(16);                       // Pixel type (direct)
156 +                        Word(32);                       // Pixel size
157 +                        Word(3);                        // CmpCount
158 +                        Word(8);                        // CmpSize
159 +                        break;
160 +        }
161 +        Long(0);                                        // Plane size
162 +        Long(0);                                        // Reserved
163 +        return ret;
164 + }
165 +
166 + static uint32 VModeDesc(uint32 params, bool direct)
167 + {
168 +        uint32 ret = p;
169 +        Offs(0x01, params);                     // Video parameters
170 +        Rsrc(0x03, 1);                          // Page count
171 +        Rsrc(0x04, direct ? 2 : 0);     // Device type
172 +        EndOfList();
173 +        return ret;
174 + }
175 +
176   bool InstallSlotROM(void)
177   {
178          uint32 boardType, boardName, vendorID, revLevel, partNum, date;
179          uint32 vendorInfo, sRsrcBoard;
180  
181          uint32 videoType, videoName, minorBase, minorLength, videoDrvr, vidDrvrDir;
182 <        uint32 defaultGamma, gammaDir, vidModeParms, vidMode, sRsrcVideo;
182 >        uint32 defaultGamma, gammaDir, sRsrcVideo;
183 >        uint32 vidModeParms1, vidModeParms2, vidModeParms4, vidModeParms8, vidModeParms16, vidModeParms32;
184 >        uint32 vidMode1, vidMode2, vidMode4, vidMode8, vidMode16, vidMode32;
185  
186          uint32 cpuType, cpuName, cpuMajor, cpuMinor, sRsrcCPU;
187  
# Line 148 | Line 221 | bool InstallSlotROM(void)
221          Offs(0x24, vendorInfo);                         // Vendor Info
222          EndOfList();
223  
224 <        // Video sResource
224 >        // Video sResource for default mode
225          videoType = p;                                          // Literals
226 <        Word(3); Word(1); Word(1); Word(0x4232);                        // Display Video Apple 'B2'
226 >        Word(3); Word(1); Word(1); Word(0x4232);        // Display Video Apple 'B2'
227          videoName = p;
228          String("Display_Video_Apple_Basilisk");
229          minorBase = p;
230 <        Long(VideoMonitor.mac_frame_base);                                      // Frame buffer base
230 >        Long(VideoMonitor.mac_frame_base);      // Frame buffer base
231          minorLength = p;
232 <        Long(VideoMonitor.bytes_per_row * VideoMonitor.y);      // Frame buffer size
232 >        Long(0);                                                        // Frame buffer size (unspecified)
233  
234          videoDrvr = p;                                          // Video driver
235          Long(0x72);                                                     // Length
# Line 229 | Line 302 | bool InstallSlotROM(void)
302          Offs(0x80, defaultGamma);
303          EndOfList();
304  
305 <        vidModeParms = p;                                       // Video mode parameters
306 <        Long(50);                                                       // Length
307 <        Long(0);                                                        // Base offset
308 <        Word(VideoMonitor.bytes_per_row);       // Row bytes
309 <        Word(0);                                                        // Bounds
310 <        Word(0);
311 <        Word(VideoMonitor.y);
312 <        Word(VideoMonitor.x);
313 <        Word(0);                                                        // Version
314 <        Word(0);                                                        // Pack type
315 <        Long(0);                                                        // Pack size
316 <        Long(0x00480000);                                       // HRes
317 <        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();
305 >        vidModeParms1 = VModeParms(VideoMonitor.mode, VDEPTH_1BIT);
306 >        vidModeParms2 = VModeParms(VideoMonitor.mode, VDEPTH_2BIT);
307 >        vidModeParms4 = VModeParms(VideoMonitor.mode, VDEPTH_4BIT);
308 >        vidModeParms8 = VModeParms(VideoMonitor.mode, VDEPTH_8BIT);
309 >        vidModeParms16 = VModeParms(VideoMonitor.mode, VDEPTH_16BIT);
310 >        vidModeParms32 = VModeParms(VideoMonitor.mode, VDEPTH_32BIT);
311 >
312 >        vidMode1 = VModeDesc(vidModeParms1, false);
313 >        vidMode2 = VModeDesc(vidModeParms2, false);
314 >        vidMode4 = VModeDesc(vidModeParms4, false);
315 >        vidMode8 = VModeDesc(vidModeParms8, false);
316 >        vidMode16 = VModeDesc(vidModeParms16, true);
317 >        vidMode32 = VModeDesc(vidModeParms32, true);
318  
319          sRsrcVideo = p;
320          Offs(0x01, videoType);                          // Video type descriptor
# Line 298 | Line 325 | bool InstallSlotROM(void)
325          Offs(0x0b, minorLength);                        // Frame buffer length
326          Offs(0x40, gammaDir);                           // Gamma directory
327          Rsrc(0x7d, 6);                                          // Video attributes: Default to color, built-in
328 <        Offs(0x80, vidMode);                            // Video mode parameters
328 >        if (video_has_depth(VDEPTH_1BIT))
329 >                Offs(DepthToAppleMode(VDEPTH_1BIT), vidMode1);          // Video mode parameters for 1 bit
330 >        if (video_has_depth(VDEPTH_2BIT))
331 >                Offs(DepthToAppleMode(VDEPTH_2BIT), vidMode2);          // Video mode parameters for 2 bit
332 >        if (video_has_depth(VDEPTH_4BIT))
333 >                Offs(DepthToAppleMode(VDEPTH_4BIT), vidMode4);          // Video mode parameters for 4 bit
334 >        if (video_has_depth(VDEPTH_8BIT))
335 >                Offs(DepthToAppleMode(VDEPTH_8BIT), vidMode8);          // Video mode parameters for 8 bit
336 >        if (video_has_depth(VDEPTH_16BIT))
337 >                Offs(DepthToAppleMode(VDEPTH_16BIT), vidMode16);        // Video mode parameters for 16 bit
338 >        if (video_has_depth(VDEPTH_32BIT))
339 >                Offs(DepthToAppleMode(VDEPTH_32BIT), vidMode32);        // Video mode parameters for 32 bit
340          EndOfList();
341  
342          // CPU sResource
# Line 385 | Line 423 | bool InstallSlotROM(void)
423          // Format/header block
424          Offs(0, sRsrcDir);                                      // sResource directory
425          Long(p + 16);                                           // Length of declaration data
426 <        Long(0);                                                        // CRC (calculated below)
426 >        Long(0);                                                        // CRC (calculated later)
427          Word(0x0101);                                           // Rev. level, format
428          Long(0x5a932bc7);                                       // Test pattern
429          Word(0x000f);                                           // Byte lanes
430  
431 +        // Copy slot ROM to Mac ROM
432 +        slot_rom_size = p;
433 +        memcpy(ROMBaseHost + ROMSize - slot_rom_size, srom, slot_rom_size);
434 +
435 +        // Calculate checksum
436 +        ChecksumSlotROM();
437 +        return true;
438 + }
439 +
440 + /*
441 + *  Calculate slot ROM checksum (in-place)
442 + */
443 +
444 + void ChecksumSlotROM(void)
445 + {
446          // Calculate CRC
447 +        uint8 *p = ROMBaseHost + ROMSize - slot_rom_size;
448 +        p[slot_rom_size - 12] = 0;
449 +        p[slot_rom_size - 11] = 0;
450 +        p[slot_rom_size - 10] = 0;
451 +        p[slot_rom_size - 9] = 0;
452          uint32 crc = 0;
453 <        for (int i=0; i<p; i++) {
453 >        for (int i=0; i<slot_rom_size; i++) {
454                  crc = (crc << 1) | (crc >> 31);
455 <                crc += srom[i];
455 >                crc += p[i];
456          }
457 <        srom[p - 12] = crc >> 24;
458 <        srom[p - 11] = crc >> 16;
459 <        srom[p - 10] = crc >> 8;
460 <        srom[p - 9] = crc;
403 <
404 <        // Copy slot ROM to Mac ROM
405 <        memcpy(ROMBaseHost + ROMSize - p, srom, p);
406 <        return true;
457 >        p[slot_rom_size - 12] = crc >> 24;
458 >        p[slot_rom_size - 11] = crc >> 16;
459 >        p[slot_rom_size - 10] = crc >> 8;
460 >        p[slot_rom_size - 9] = crc;
461   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines