nubus.c revision 1.1 1 1.1 briggs /*-
2 1.1 briggs * Copyright (C) 1993 Allen K. Briggs, Chris P. Caputo,
3 1.1 briggs * Michael L. Finch, Bradley A. Grantham, and
4 1.1 briggs * Lawrence A. Kesteloot
5 1.1 briggs * All rights reserved.
6 1.1 briggs *
7 1.1 briggs * Redistribution and use in source and binary forms, with or without
8 1.1 briggs * modification, are permitted provided that the following conditions
9 1.1 briggs * are met:
10 1.1 briggs * 1. Redistributions of source code must retain the above copyright
11 1.1 briggs * notice, this list of conditions and the following disclaimer.
12 1.1 briggs * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 briggs * notice, this list of conditions and the following disclaimer in the
14 1.1 briggs * documentation and/or other materials provided with the distribution.
15 1.1 briggs * 3. All advertising materials mentioning features or use of this software
16 1.1 briggs * must display the following acknowledgement:
17 1.1 briggs * This product includes software developed by the Alice Group.
18 1.1 briggs * 4. The names of the Alice Group or any of its members may not be used
19 1.1 briggs * to endorse or promote products derived from this software without
20 1.1 briggs * specific prior written permission.
21 1.1 briggs *
22 1.1 briggs * THIS SOFTWARE IS PROVIDED BY THE ALICE GROUP ``AS IS'' AND ANY EXPRESS OR
23 1.1 briggs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 1.1 briggs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 1.1 briggs * IN NO EVENT SHALL THE ALICE GROUP BE LIABLE FOR ANY DIRECT, INDIRECT,
26 1.1 briggs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 1.1 briggs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 1.1 briggs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 1.1 briggs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 1.1 briggs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 1.1 briggs * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 1.1 briggs *
33 1.1 briggs */
34 1.1 briggs #ident "$Id: nubus.c,v 1.1 1993/09/29 06:09:28 briggs Exp $"
35 1.1 briggs
36 1.1 briggs /*
37 1.1 briggs MF 8-24-93 first hack at a real nubus driver
38 1.1 briggs */
39 1.1 briggs
40 1.1 briggs #include "sys/param.h"
41 1.1 briggs #include "sys/systm.h"
42 1.1 briggs #include "../include/cpu.h"
43 1.1 briggs
44 1.1 briggs #include "nubus.h"
45 1.1 briggs
46 1.1 briggs
47 1.1 briggs /* TODO:
48 1.1 briggs be able to do "memcpy"s from the board, then i won't
49 1.1 briggs have to fill in structures by hand.
50 1.1 briggs
51 1.1 briggs get rid of extra crap calls that are useless
52 1.1 briggs
53 1.1 briggs I think the directory stuff is bogus, I need to find
54 1.1 briggs that other magic resource that tells me fancy stuff,
55 1.1 briggs I could be wrong.
56 1.1 briggs
57 1.1 briggs
58 1.1 briggs */
59 1.1 briggs
60 1.1 briggs
61 1.1 briggs struct dir *getRsrcByNum(struct slot *Slot,struct dir *p,int num,struct dir *out,int max);
62 1.1 briggs int print_rsrcinfo(struct slot *Slot,struct dir *p);
63 1.1 briggs char *GetStringInfo(struct slot *Slot,unsigned char *data1,char *space,int len);
64 1.1 briggs int printTree(struct slot *Slot,struct dir *root);
65 1.1 briggs long GetLongInfo(struct slot *,unsigned char *data);
66 1.1 briggs int FindMagic(unsigned long *data);
67 1.1 briggs int GetHeader(struct slot *Slot,unsigned long pos);
68 1.1 briggs unsigned char *IncPtr(struct slot *Slot,unsigned char *p,int size);
69 1.1 briggs char GetByteInfo(struct slot *Slot,unsigned char *data);
70 1.1 briggs int GetRsrcs(struct slot *Slot,unsigned char *p,struct dir *Dir,int maxdir);
71 1.1 briggs unsigned char *getDataAtRsrc(struct slot *Slot,struct dir *p,int num);
72 1.1 briggs short GetShortInfo(struct slot *Slot,unsigned char *data);
73 1.1 briggs
74 1.1 briggs /* this is the main I used in macos to get stuff out */
75 1.1 briggs #if 0
76 1.1 briggs main()
77 1.1 briggs {
78 1.1 briggs
79 1.1 briggs unsigned long *rawImage;
80 1.1 briggs struct imagedata image;
81 1.1 briggs struct dir *Dir;
82 1.1 briggs struct dir dirSpace[15];
83 1.1 briggs struct dir dirSpace2[10];
84 1.1 briggs unsigned long length;
85 1.1 briggs unsigned long offset;
86 1.1 briggs unsigned long nextoffset;
87 1.1 briggs int pos,i;
88 1.1 briggs unsigned char *data;
89 1.1 briggs struct slot Slot;
90 1.1 briggs
91 1.1 briggs // firstHeader=(char *)0xbfffff-40;
92 1.1 briggs
93 1.1 briggs data=(char *)SLOTADDR-100;
94 1.1 briggs
95 1.1 briggs for(i=0;i<100;i++)
96 1.1 briggs if (Slot.size=FindMagic( (long *)(data+i) ) )
97 1.1 briggs {
98 1.1 briggs /* printf("magic found at i=%d\n",i); */
99 1.1 briggs GetHeader(&Slot,SLOTADDR-100+i);
100 1.1 briggs break;
101 1.1 briggs }
102 1.1 briggs
103 1.1 briggs
104 1.1 briggs
105 1.1 briggs
106 1.1 briggs printf("main directory\n");
107 1.1 briggs print_rsrcinfo(&Slot,Slot.mainDir );
108 1.1 briggs
109 1.1 briggs Dir=getRsrcByNum(&Slot,Slot.mainDir,128,dirSpace,15);
110 1.1 briggs
111 1.1 briggs printf("image directory\n");
112 1.1 briggs print_rsrcinfo(&Slot,Dir);
113 1.1 briggs
114 1.1 briggs printTree(&Slot,Slot.mainDir);
115 1.1 briggs
116 1.1 briggs // get image param stuff
117 1.1 briggs Dir=getRsrcByNum(&Slot,Dir,128,dirSpace2,10);
118 1.1 briggs
119 1.1 briggs /* hopefully video mode params */
120 1.1 briggs rawImage=getDataAtRsrc(&Slot,Dir,1);
121 1.1 briggs
122 1.1 briggs image.whatTheHellIsThis=GetLongInfo(&Slot,rawImage);
123 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
124 1.1 briggs
125 1.1 briggs image.offset=GetLongInfo(&Slot,rawImage);
126 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
127 1.1 briggs
128 1.1 briggs image.rowbytes=GetShortInfo(&Slot,rawImage);
129 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
130 1.1 briggs
131 1.1 briggs image.top=GetShortInfo(&Slot,rawImage);
132 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
133 1.1 briggs
134 1.1 briggs image.left=GetShortInfo(&Slot,rawImage);
135 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
136 1.1 briggs
137 1.1 briggs image.bottom=GetShortInfo(&Slot,rawImage);
138 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
139 1.1 briggs
140 1.1 briggs image.right=GetShortInfo(&Slot,rawImage);
141 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
142 1.1 briggs
143 1.1 briggs image.version=GetShortInfo(&Slot,rawImage);
144 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
145 1.1 briggs
146 1.1 briggs image.packType=GetShortInfo(&Slot,rawImage);
147 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
148 1.1 briggs
149 1.1 briggs image.packSize=GetShortInfo(&Slot,rawImage);
150 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
151 1.1 briggs
152 1.1 briggs image.hRes=GetLongInfo(&Slot,rawImage);
153 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
154 1.1 briggs
155 1.1 briggs image.vRes=GetLongInfo(&Slot,rawImage);
156 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
157 1.1 briggs
158 1.1 briggs image.pixelType=GetShortInfo(&Slot,rawImage);
159 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
160 1.1 briggs
161 1.1 briggs image.pixelSize=GetShortInfo(&Slot,rawImage);
162 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
163 1.1 briggs
164 1.1 briggs
165 1.1 briggs }
166 1.1 briggs #endif /* main */
167 1.1 briggs
168 1.1 briggs int GetHeader(struct slot *Slot,unsigned long pos)
169 1.1 briggs {
170 1.1 briggs /* the pos passed in is the pos that the magic testvalue was found at */
171 1.1 briggs unsigned char *p;
172 1.1 briggs unsigned char *dirBase;
173 1.1 briggs
174 1.1 briggs switch (Slot->size)
175 1.1 briggs {
176 1.1 briggs case 1: /* char */
177 1.1 briggs pos-=14;
178 1.1 briggs break;
179 1.1 briggs case 2:
180 1.1 briggs pos-=28;
181 1.1 briggs break;
182 1.1 briggs case 4:
183 1.1 briggs pos-=56;
184 1.1 briggs break;
185 1.1 briggs }
186 1.1 briggs
187 1.1 briggs p=(unsigned char *)pos;
188 1.1 briggs
189 1.1 briggs Slot->head.offset=GetLongInfo(Slot,p);
190 1.1 briggs p=IncPtr(Slot,p,4);
191 1.1 briggs
192 1.1 briggs Slot->head.length=GetLongInfo(Slot,p);
193 1.1 briggs p=IncPtr(Slot,p,4);
194 1.1 briggs
195 1.1 briggs Slot->head.crc=GetLongInfo(Slot,p);
196 1.1 briggs p=IncPtr(Slot,p,4);
197 1.1 briggs
198 1.1 briggs Slot->head.romrev=GetByteInfo(Slot,p);
199 1.1 briggs p=IncPtr(Slot,p,1);
200 1.1 briggs
201 1.1 briggs Slot->head.format=GetByteInfo(Slot,p);
202 1.1 briggs p=IncPtr(Slot,p,1);
203 1.1 briggs
204 1.1 briggs Slot->head.tst=GetLongInfo(Slot,p);
205 1.1 briggs p=IncPtr(Slot,p,4);
206 1.1 briggs
207 1.1 briggs Slot->head.reserved=GetByteInfo(Slot,p);
208 1.1 briggs p=IncPtr(Slot,p,1);
209 1.1 briggs
210 1.1 briggs /* byte lanes should be used instead of size, this hasn't bitten me yet */
211 1.1 briggs Slot->head.bytelane=GetByteInfo(Slot,p);
212 1.1 briggs p=IncPtr(Slot,p,1);
213 1.1 briggs
214 1.1 briggs dirBase=(unsigned char *)(pos-(Slot->head.length-sizeof(struct header))*Slot->size);
215 1.1 briggs GetRsrcs(Slot,dirBase,Slot->mainDir,15);
216 1.1 briggs return 0;
217 1.1 briggs }
218 1.1 briggs
219 1.1 briggs
220 1.1 briggs printTree(struct slot *Slot,struct dir *root)
221 1.1 briggs {
222 1.1 briggs struct dir *b;
223 1.1 briggs unsigned char *c;
224 1.1 briggs struct dir *d;
225 1.1 briggs unsigned char *e;
226 1.1 briggs struct dir *f;
227 1.1 briggs unsigned char *g;
228 1.1 briggs struct dir *h;
229 1.1 briggs unsigned char *i;
230 1.1 briggs unsigned char *j;
231 1.1 briggs unsigned char *k;
232 1.1 briggs struct dir bSpace[15];
233 1.1 briggs struct dir cSpace[15];
234 1.1 briggs struct dir dSpace[15];
235 1.1 briggs struct dir fSpace[15];
236 1.1 briggs struct dir hSpace[15];
237 1.1 briggs char space[40];
238 1.1 briggs /* to get a good idea of what is happening here you should get the
239 1.1 briggs "slots" program from apple dts, it is so cool. Its the next
240 1.1 briggs best thing to actual docs, which i didn't have...
241 1.1 briggs */
242 1.1 briggs
243 1.1 briggs b=getRsrcByNum(Slot,root,1,bSpace,15);
244 1.1 briggs c=getDataAtRsrc(Slot,b,2);
245 1.1 briggs d=getRsrcByNum(Slot,b,0x24,dSpace,15);
246 1.1 briggs
247 1.1 briggs e=getDataAtRsrc(Slot,d,1);
248 1.1 briggs
249 1.1 briggs f=getRsrcByNum(Slot,root,0x80,fSpace,15);
250 1.1 briggs g=getDataAtRsrc(Slot,f,2);
251 1.1 briggs j=getDataAtRsrc(Slot,f,0x0a);
252 1.1 briggs k=getDataAtRsrc(Slot,f,0x0b);
253 1.1 briggs
254 1.1 briggs h=getRsrcByNum(Slot,root,0xa0,hSpace,15);
255 1.1 briggs i=getDataAtRsrc(Slot,h,2);
256 1.1 briggs
257 1.1 briggs printf("A\n");
258 1.1 briggs print_rsrcinfo(Slot,root);
259 1.1 briggs
260 1.1 briggs printf("B\n");
261 1.1 briggs print_rsrcinfo(Slot,b);
262 1.1 briggs
263 1.1 briggs printf("C\n");
264 1.1 briggs printf("%s\n",GetStringInfo(Slot,c,space,40));
265 1.1 briggs
266 1.1 briggs printf("D\n");
267 1.1 briggs print_rsrcinfo(Slot,d);
268 1.1 briggs
269 1.1 briggs printf("E\n");
270 1.1 briggs printf("%s\n",GetStringInfo(Slot,e,space,40));
271 1.1 briggs
272 1.1 briggs printf("F\n");
273 1.1 briggs print_rsrcinfo(Slot,f);
274 1.1 briggs
275 1.1 briggs
276 1.1 briggs printf("g\n");
277 1.1 briggs printf("%s\n",GetStringInfo(Slot,g,space,40));
278 1.1 briggs printf("Video RAM Base %lx\n", GetLongInfo(Slot,j) );
279 1.1 briggs printf("Video RAM Length %lx\n", GetLongInfo(Slot,k) );
280 1.1 briggs
281 1.1 briggs printf("H\n");
282 1.1 briggs print_rsrcinfo(Slot,h);
283 1.1 briggs
284 1.1 briggs printf("I\n");
285 1.1 briggs printf("%s\n",GetStringInfo(Slot,i,space,40));
286 1.1 briggs
287 1.1 briggs }
288 1.1 briggs
289 1.1 briggs
290 1.1 briggs print_rsrcinfo(struct slot *Slot,struct dir *p)
291 1.1 briggs {
292 1.1 briggs int i=0;
293 1.1 briggs int failsafe=20;
294 1.1 briggs
295 1.1 briggs if (p==NULL) return 1;
296 1.1 briggs while(failsafe--)
297 1.1 briggs {
298 1.1 briggs printf("RSRC %02x :%06lx\n",p[i].rsrc,p[i].offset);
299 1.1 briggs if (p[i].rsrc == 0xff) break;
300 1.1 briggs i++;
301 1.1 briggs }
302 1.1 briggs
303 1.1 briggs }
304 1.1 briggs
305 1.1 briggs struct dir *getRsrcByNum(struct slot *Slot,struct dir *p,int num,struct dir *out,int max)
306 1.1 briggs {
307 1.1 briggs int i=0;
308 1.1 briggs int failsafe=20;
309 1.1 briggs long nextoffset=0;
310 1.1 briggs unsigned char *base;
311 1.1 briggs
312 1.1 briggs if (p==NULL) return NULL;
313 1.1 briggs
314 1.1 briggs
315 1.1 briggs base=getDataAtRsrc(Slot,p,num);
316 1.1 briggs
317 1.1 briggs if (NULL==base) return NULL;
318 1.1 briggs
319 1.1 briggs GetRsrcs(Slot,base,out,max);
320 1.1 briggs
321 1.1 briggs return out;
322 1.1 briggs }
323 1.1 briggs
324 1.1 briggs char *GetStringInfo(struct slot *Slot,unsigned char *data,char *space,int len)
325 1.1 briggs {
326 1.1 briggs int i;
327 1.1 briggs char *p=space;
328 1.1 briggs
329 1.1 briggs if (NULL==data) return "";
330 1.1 briggs
331 1.1 briggs for(i=0;(i<len) && *data;i++,p++)
332 1.1 briggs {
333 1.1 briggs *p=GetByteInfo(Slot,data);
334 1.1 briggs data=IncPtr(Slot,data,1);
335 1.1 briggs }
336 1.1 briggs *p='\0';
337 1.1 briggs return space;
338 1.1 briggs }
339 1.1 briggs
340 1.1 briggs long GetLongInfo(struct slot *Slot,unsigned char *data)
341 1.1 briggs {
342 1.1 briggs long ret=0;
343 1.1 briggs
344 1.1 briggs switch (Slot->size)
345 1.1 briggs {
346 1.1 briggs case 1:
347 1.1 briggs ret= (unsigned long)data[0]<<24 | (unsigned long)data[1]<<16 | (unsigned long)data[2]<<8 |data[3] ;
348 1.1 briggs break;
349 1.1 briggs case 2:
350 1.1 briggs ret= (unsigned long)data[0]<<24 | (unsigned long)data[2]<<16 | (unsigned long)data[4]<<8 |data[6] ;
351 1.1 briggs break;
352 1.1 briggs case 4:
353 1.1 briggs ret= (unsigned long)data[0]<<24 | (unsigned long)data[4]<<16 | (unsigned long)data[8]<<8 |data[12] ;
354 1.1 briggs break;
355 1.1 briggs }
356 1.1 briggs
357 1.1 briggs return ret;
358 1.1 briggs }
359 1.1 briggs
360 1.1 briggs short GetShortInfo(struct slot *Slot,unsigned char *data)
361 1.1 briggs {
362 1.1 briggs short ret;
363 1.1 briggs
364 1.1 briggs switch (Slot->size)
365 1.1 briggs {
366 1.1 briggs case 1:
367 1.1 briggs ret= (unsigned long)data[0]<<8 |data[1] ;
368 1.1 briggs break;
369 1.1 briggs case 2:
370 1.1 briggs ret= (unsigned long)data[0]<<8 |data[2] ;
371 1.1 briggs break;
372 1.1 briggs case 4:
373 1.1 briggs ret= (unsigned long)data[0]<<8 |data[4] ;
374 1.1 briggs break;
375 1.1 briggs }
376 1.1 briggs
377 1.1 briggs return ret;
378 1.1 briggs }
379 1.1 briggs
380 1.1 briggs char GetByteInfo(struct slot *Slot,unsigned char *data)
381 1.1 briggs {
382 1.1 briggs /* boring .... */
383 1.1 briggs return data[0];
384 1.1 briggs }
385 1.1 briggs
386 1.1 briggs
387 1.1 briggs int FindMagic(unsigned long data[])
388 1.1 briggs {
389 1.1 briggs unsigned short *data2=(unsigned short *)data;
390 1.1 briggs unsigned char *data3=(unsigned char *)data;
391 1.1 briggs
392 1.1 briggs
393 1.1 briggs /* char data */
394 1.1 briggs if (((data3[0] )== 0x5a) &&
395 1.1 briggs ((data3[1] )== 0x93) &&
396 1.1 briggs ((data3[2] )== 0x2b) &&
397 1.1 briggs ((data3[3] )== 0xc7) )
398 1.1 briggs return 1;
399 1.1 briggs
400 1.1 briggs /* short data */
401 1.1 briggs
402 1.1 briggs if (((data3[0] )== 0x5a) &&
403 1.1 briggs ((data3[2] )== 0x93) &&
404 1.1 briggs ((data3[4] )== 0x2b) &&
405 1.1 briggs ((data3[6] )== 0xc7) )
406 1.1 briggs return 2;
407 1.1 briggs
408 1.1 briggs /* long data */
409 1.1 briggs if (((data3[0] )== 0x5a) &&
410 1.1 briggs ((data3[4] )== 0x93) &&
411 1.1 briggs ((data3[8] )== 0x2b) &&
412 1.1 briggs ((data3[12] )== 0xc7) )
413 1.1 briggs return 4;
414 1.1 briggs
415 1.1 briggs
416 1.1 briggs return 0;
417 1.1 briggs }
418 1.1 briggs
419 1.1 briggs unsigned char *IncPtr(struct slot *Slot,unsigned char *p,int size)
420 1.1 briggs {
421 1.1 briggs /* MF make this a macro someday */
422 1.1 briggs
423 1.1 briggs unsigned char *tmp=p;
424 1.1 briggs
425 1.1 briggs tmp=tmp+size*Slot->size;
426 1.1 briggs
427 1.1 briggs return tmp;
428 1.1 briggs
429 1.1 briggs }
430 1.1 briggs
431 1.1 briggs int GetRsrcs(struct slot *Slot,unsigned char *p,struct dir *Dir,int maxdir)
432 1.1 briggs {
433 1.1 briggs int i=0;
434 1.1 briggs /* MF if you alias memory here you will be fucked. */
435 1.1 briggs
436 1.1 briggs if (p==NULL) return;
437 1.1 briggs
438 1.1 briggs while(maxdir--)
439 1.1 briggs {
440 1.1 briggs long entry;
441 1.1 briggs
442 1.1 briggs entry=GetLongInfo(Slot,p);
443 1.1 briggs
444 1.1 briggs Dir[i].rsrc=(entry & 0xff000000) >> 24;
445 1.1 briggs Dir[i].offset=entry & 0x00ffffff;
446 1.1 briggs Dir[i].base=(unsigned long)p;
447 1.1 briggs p=IncPtr(Slot,p,4);
448 1.1 briggs if (Dir[i].rsrc==0xff)
449 1.1 briggs break;
450 1.1 briggs i++;
451 1.1 briggs }
452 1.1 briggs
453 1.1 briggs return 0;
454 1.1 briggs }
455 1.1 briggs
456 1.1 briggs unsigned char *getDataAtRsrc(struct slot *Slot,struct dir *p,int num)
457 1.1 briggs {
458 1.1 briggs int i=0;
459 1.1 briggs int failsafe=num;
460 1.1 briggs long nextoffset=0;
461 1.1 briggs unsigned char *base;
462 1.1 briggs
463 1.1 briggs if (p==NULL) return NULL;
464 1.1 briggs
465 1.1 briggs while(failsafe--)
466 1.1 briggs {
467 1.1 briggs if (p[i].rsrc==num)
468 1.1 briggs {
469 1.1 briggs base= (unsigned char *)( (unsigned long)Slot->size*p[i].offset+
470 1.1 briggs (unsigned long)p[i].base );
471 1.1 briggs return base;
472 1.1 briggs }
473 1.1 briggs if (p[i].rsrc==0xff) return NULL;
474 1.1 briggs i++;
475 1.1 briggs }
476 1.1 briggs
477 1.1 briggs
478 1.1 briggs
479 1.1 briggs return NULL;
480 1.1 briggs }
481 1.1 briggs
482 1.1 briggs
483 1.1 briggs int InitNubusSlot(unsigned long slotaddr,struct slot *newSlot)
484 1.1 briggs {
485 1.1 briggs int i=0;
486 1.1 briggs struct slot Slot;
487 1.1 briggs struct dir *b;
488 1.1 briggs struct dir bSpace[5];
489 1.1 briggs struct dir *d;
490 1.1 briggs struct dir dSpace[5];
491 1.1 briggs struct dir *f;
492 1.1 briggs struct dir fSpace[5];
493 1.1 briggs unsigned char *c;
494 1.1 briggs unsigned char *e;
495 1.1 briggs unsigned char *g;
496 1.1 briggs unsigned char *data;
497 1.1 briggs
498 1.1 briggs unsigned long slotend;
499 1.1 briggs
500 1.1 briggs
501 1.1 briggs
502 1.1 briggs slotend=slotaddr+NBMEMSIZE-1;
503 1.1 briggs data=(unsigned char *)slotend-100;
504 1.1 briggs
505 1.1 briggs
506 1.1 briggs for(i=0;i<100;i++)
507 1.1 briggs {
508 1.1 briggs /* lets be quite clear here, if magic is not on the card, then
509 1.1 briggs we will quite likely bus error, because we will read a long
510 1.1 briggs word when there are only 3 bytes left on the card, unless
511 1.1 briggs there is a card in the next slot that has readable memory starting
512 1.1 briggs at 0, so more than likely we crash, ohh well.
513 1.1 briggs
514 1.1 briggs The other day I heard (read) that the directory and the rest of
515 1.1 briggs the card can be in different formats, to this I say FUCK! So
516 1.1 briggs for the time being I will just assume the whole card is in the
517 1.1 briggs same format, and let it crash most heiniously on bizzare cards
518 1.1 briggs from hell, which I hear has lots of luke warm fresca on tap.
519 1.1 briggs */
520 1.1 briggs if (Slot.size=FindMagic( (unsigned long *)(data+i) ) )
521 1.1 briggs {
522 1.1 briggs GetHeader(&Slot,slotend-100+i);
523 1.1 briggs break;
524 1.1 briggs }
525 1.1 briggs }
526 1.1 briggs
527 1.1 briggs /* ohh ohh Mexico, i've never really been, but I'd sure like to go */
528 1.1 briggs if (Slot.size)
529 1.1 briggs {
530 1.1 briggs b=getRsrcByNum(&Slot,Slot.mainDir,1,bSpace,5);
531 1.1 briggs c=getDataAtRsrc(&Slot,b,2);
532 1.1 briggs d=getRsrcByNum(&Slot,b,0x24,dSpace,5);
533 1.1 briggs e=getDataAtRsrc(&Slot,d,1);
534 1.1 briggs f=getRsrcByNum(&Slot,Slot.mainDir,0x80,fSpace,5);
535 1.1 briggs g=getDataAtRsrc(&Slot,f,1);
536 1.1 briggs GetStringInfo(&Slot,c,Slot.name,40);
537 1.1 briggs /* printf("card is %s, ",Slot.name); */
538 1.1 briggs GetStringInfo(&Slot,e,Slot.manufacturer,40);
539 1.1 briggs /* printf("%s\n",Slot.manufacturer); */
540 1.1 briggs /* info here is two long words (cat,type,drvrsw,drvrhw) */
541 1.1 briggs Slot.type=(GetLongInfo(&Slot,g) & 0xffff0000) >> 16;
542 1.1 briggs /* printf("type is %x\n",Slot.type); */
543 1.1 briggs
544 1.1 briggs /* sounds so simple with the sun sinking low */
545 1.1 briggs
546 1.1 briggs }
547 1.1 briggs else
548 1.1 briggs return 1;
549 1.1 briggs /* this comment intentionally left meaningless */
550 1.1 briggs
551 1.1 briggs *newSlot=Slot;
552 1.1 briggs return 0;
553 1.1 briggs }
554 1.1 briggs
555 1.1 briggs struct imagedata *NUBUS_GetImageData(struct slot *Slot,
556 1.1 briggs struct imagedata *Rimage)
557 1.1 briggs {
558 1.1 briggs struct imagedata image;
559 1.1 briggs struct dir *Dir;
560 1.1 briggs struct dir dirSpace[10];
561 1.1 briggs struct dir dirSpace2[10];
562 1.1 briggs unsigned char *rawImage;
563 1.1 briggs
564 1.1 briggs
565 1.1 briggs Dir=getRsrcByNum(Slot,Slot->mainDir,128,dirSpace,10);
566 1.1 briggs Dir=getRsrcByNum(Slot,Dir,128,dirSpace2,10);
567 1.1 briggs
568 1.1 briggs rawImage=getDataAtRsrc(Slot,Dir,1);
569 1.1 briggs
570 1.1 briggs /* this is self documenting code, WHAT THE HELL IS THIS? */
571 1.1 briggs image.whatTheHellIsThis=GetLongInfo(Slot,rawImage);
572 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
573 1.1 briggs
574 1.1 briggs image.offset=GetLongInfo(Slot,rawImage);
575 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
576 1.1 briggs
577 1.1 briggs image.rowbytes=GetShortInfo(Slot,rawImage);
578 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
579 1.1 briggs
580 1.1 briggs image.top=GetShortInfo(Slot,rawImage);
581 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
582 1.1 briggs
583 1.1 briggs image.left=GetShortInfo(Slot,rawImage);
584 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
585 1.1 briggs
586 1.1 briggs image.bottom=GetShortInfo(Slot,rawImage);
587 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
588 1.1 briggs
589 1.1 briggs image.right=GetShortInfo(Slot,rawImage);
590 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
591 1.1 briggs
592 1.1 briggs image.version=GetShortInfo(Slot,rawImage);
593 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
594 1.1 briggs
595 1.1 briggs image.packType=GetShortInfo(Slot,rawImage);
596 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
597 1.1 briggs
598 1.1 briggs image.packSize=GetShortInfo(Slot,rawImage);
599 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
600 1.1 briggs
601 1.1 briggs image.hRes=GetLongInfo(Slot,rawImage);
602 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
603 1.1 briggs
604 1.1 briggs image.vRes=GetLongInfo(Slot,rawImage);
605 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
606 1.1 briggs
607 1.1 briggs image.pixelType=GetShortInfo(Slot,rawImage);
608 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
609 1.1 briggs
610 1.1 briggs image.pixelSize=GetShortInfo(Slot,rawImage);
611 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
612 1.1 briggs
613 1.1 briggs *Rimage=image;
614 1.1 briggs
615 1.1 briggs return Rimage;
616 1.1 briggs }
617