/* Source code of prmscan - program scanning system for PCI cards plugged   */
/* into Prometheus board. It demonstrates use of prometheus.library.        */

#define	__USE_SYSBASE

#include	<dos/dos.h>
#include	<exec/execbase.h>
#include	<exec/libraries.h>
#include	<exec/types.h>

#include	<proto/dos.h>
#include	<proto/exec.h>
#include	<proto/prometheus.h>

struct Library	*PrometheusBase;

const char *VString = "$VER: PrmScan 1.2 (26.7.2001) © 2001 Matay";

int main(int argc, int *argv[])
 {
  int	result = RETURN_FAIL;

  Printf("%s\n", (ULONG)&VString[6]);
  Printf("PCI cards listing:\n-------------------------------------------------\n");

  if (PrometheusBase = OpenLibrary(PROMETHEUSNAME, PROMETHEUSMINVERSION))
	{
 	 APTR board = NULL;
 	 ULONG vendor, device, revision, dclass, dsubclass, blkaddr, blksize;
 	 ULONG romaddr, romsize;
 	 WORD blk;

 	 while (board = Prm_FindBoardTags(board, TAG_END))
     {
      Prm_GetBoardAttrsTags(board,
       PRM_Vendor,    (ULONG)&vendor,
       PRM_Device,    (ULONG)&device,
       PRM_Revision,  (ULONG)&revision,
       PRM_Class,     (ULONG)&dclass,
       PRM_SubClass,  (ULONG)&dsubclass,
       TAG_END);

      Printf("Vendor %04lx, device %04lx, revision %ld.\n", vendor, device, revision);
      Printf("Device class %02lx, subclass %02lx.\n", dclass, dsubclass);

      for (blk = 0; blk < 6; blk++)
       {
        Prm_GetBoardAttrsTags(board,
         (ULONG)PRM_MemoryAddr0 + blk, (ULONG)&blkaddr,
         (ULONG)PRM_MemorySize0 + blk, (ULONG)&blksize,
         TAG_END);
        if (blkaddr && blksize)
         Printf("Address range: %08lx - %08lx.\n", blkaddr, blkaddr + blksize - 1);
       }

      Prm_GetBoardAttrsTags(board,
       PRM_ROM_Address,  (ULONG)&romaddr,
       PRM_ROM_Size,     (ULONG)&romsize,
       TAG_END);

      if (romaddr && romsize)
       Printf( "%ld kB of ROM at %08lx - %08lx.\n", romsize >> 10, romaddr, romaddr + romsize - 1);
      Printf( "-------------------------------------------------\n");
     }
    Printf ("\n");
    result = RETURN_OK;
    CloseLibrary( PrometheusBase );
   }
  else
   Printf( "No working Prometheus board found in the system.\n\n" );
  return( result );
 }
