Home | History | Annotate | Line # | Download | only in nubus
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