Your Manufacturer Number Attention hardware manufacturers. If you are developing a hardware expansion product for the Amiga then you will need to obtain a special manufacturer ID number from Amigan Software to identify your product. This manufacturer number is used by the Amiga to link your hardware with its driver software at boot time. Your manufacturer number is part of the special protocol that the Amiga uses to automatically configure all expansion devices on the bus without the user having to cut jumpers or adjust dip switches. This is called auto-config. At start-up time, the system first polls each board in the system and assigns the board its own address space. If it is a memory board, its RAM is linked into the memory free pool. Later in the boot sequence, after DOS is initialized, the binddrivers program is run. Binddrivers will search the directory SYS:Expansion for the drivers that go with the boards. To do this binddrivers looks in the Tool Type field of all icon files in SYS:Expansion. If the first seven bytes of the Tool Type field are "PRODUCT", then this is an icon file for a driver. Binddrivers will then attempt to match the drivers it has found with the boards that were found earlier. This is where your manufacturer number comes in. Your manufacturer number goes in two places. First, it is burned in hex form into the PAL which is part of ALL auto-config expansion products. Second, it appears in ASCII in the Tool Type field of the icon file for your product's driver. By matching these two numbers, the Amiga can automatically configure your board and bind it's software driver into the system as well. The manufacturer's number is a 16-bit ID which appears in PAL offsets $10-$17. There is also an 8-bit product number which you assign. The product number is for uniquely identifying different products from the same vendor. The product number will appear in PAL offsets $04-$07. This gives you a total of 24 bits to identify each of your products. These 24 bits of information in the PAL which identify your product are matched against the information in the Tool Type field of all icon files in the SYS:Expansion drawer. For example, suppose you are manufacturer #1019. You have two products, #1 and #2 which both use the same driver. The icon for your driver for these two products would have a Tool Type set to "PRODUCT=1019/1|1019/2". This means: I am an icon for a driver that works with product number 1 or 2 from manufacturer 1019, now bind me. Spaces are not legal. Here are two other examples: PRODUCT=1208/11 is the Tool Type for a driver for product 11 from manufacturer number 1208. PRODUCT=1017 is the Tool Type for a driver for any product from manufacturer number 1017. For an informal explanation of the auto-configuration process, see the chapter on Software Expansion Architecture from the 2nd Annual Amiga Developer's Conference Notes (available on ADCD 2.1). For the details of timing, power, the PAL equations and PAL address specifications and the expansion library documentation, see sections 3.1 to 3.3 of the A500/A2000 Technical Reference Manual ($40). The original auto-config spec appears in the A1000 Schematics and Expansion Specification ($20). Manufacturer's numbers are assigned by Amigan Software. Your manufacturer number is NOT the same as your developer number. To obtain your unique manufacturer number email jrj76@optusnet.com.au. Be sure and include your name, email, developer number (if any), and the type of expansion product you are developing. For those doing prototype boards, we have a temporary hacker's number set aside. The auto-config process makes the addition of expansion products to the system very easy. All the user has to do is put the board in any slot and copy the driver from the release disk to his own SYS:Expansion drawer. Everything else is automatic. There are no jumpers or dip switches to set. Best of all, you will get a lot less support calls asking how to make your product work with the XYZ-Corp-battery-backed-clock. ------------------------Code Starts Here--------------------------- /*-----------------------------------------------*/ /* Here is a short program which will tell you */ /* about the expansion boards configured in your */ /* system without you opening up the machine. */ /* Code by Bill Koester of CATS */ /*-----------------------------------------------*/ #include #include struct ExpansionBase *ExpansionBase; void main(); void cleanup(); void printdev(); void main() { struct ConfigDev *MyConfigDev; /*----------------------------------*/ /* Open the expansion library, */ /* if there is a problem then exit */ /*----------------------------------*/ ExpansionBase =(struct ExpansionBase *) OpenLibrary(EXPANSIONNAME,0); if(ExpansionBase==NULL) { printf("Error opening expansion library!!\n"); cleanup(); exit(0); } /*--------------------------------------------*/ /* Use FindConfigDev to get info on the first */ /* expansion board on the list maintained by */ /* Exec. If there are no expansion boards in */ /* the system then exit. */ /*--------------------------------------------*/ MyConfigDev = NULL; /*--------------------------------------------------*/ /* FindConfigDev(oldConfigDev,manufacturer,product) */ /* oldConfigDev = NULL for the top of the list */ /* manufacturer = -1 for any manufacturer */ /* product = -1 for any product */ /*--------------------------------------------------*/ MyConfigDev = FindConfigDev(NULL,-1,-1); if(MyConfigDev==NULL) { printf("No Configured Devices found!!\n"); cleanup(); exit(0); } printdev(MyConfigDev); /*-----------------------------------*/ /* OK, there is at least one board, */ /* so loop and get the entire list */ /* printing as we go with printdev() */ /*-----------------------------------*/ while(MyConfigDev = FindConfigDev(MyConfigDev,-1,-1)) { printdev(MyConfigDev); } cleanup(); } /*-------------------*/ /* Close up shop... */ /*-------------------*/ void cleanup() { if(ExpansionBase) CloseLibrary(ExpansionBase); } /*----------------------------------*/ /* Print out the contents of the */ /* dev structure for this expansion */ /* product. */ /*----------------------------------*/ void printdev(dev) struct ConfigDev *dev; { char buff[200]; printf("Flags = "); if(dev->cd_Flags==NULL) printf("NULL "); if(dev->cd_Flags&CDF_SHUTUP) printf("CDF_SHUTUP "); if(dev->cd_Flags&CDF_CONFIGME) printf("CDF_CONFIGME "); printf("\n"); printf("Board Address = %x\n",dev->cd_BoardAddr); printf("Board Size = %d bytes\n",dev->cd_BoardSize); printf("Slot Address = %d\n",dev->cd_SlotAddr); printf("Slot Size = %d\n",dev->cd_SlotSize); printf("Driver code at %x\n",dev->cd_Driver); printf("er_Type = %x\n",dev->cd_Rom.er_Type); printf("er_Product = %x\n",dev->cd_Rom.er_Product); printf("er_Flags = %x\n",dev->cd_Rom.er_Flags); printf("er_Reserved03 = %x\n",dev->cd_Rom.er_Reserved03); printf("er_Manufacturer = %x\n",dev->cd_Rom.er_Manufacturer); printf("er_SerialNumber = %x\n",dev->cd_Rom.er_SerialNumber); printf("er_InitDiagVec = %x\n",dev->cd_Rom.er_InitDiagVec); printf("er_Reserved0c = %x\n",dev->cd_Rom.er_Reserved0c); printf("er_Reserved0d = %x\n",dev->cd_Rom.er_Reserved0d); printf("er_Reserved0e = %x\n",dev->cd_Rom.er_Reserved0e); printf("er_Reserved0f = %x\n",dev->cd_Rom.er_Reserved0f); printf("Hit Return to continue:\n"); gets(buff); }