/*********************************************************************/
/***     A UTILITY PROGRAM TO PROVIDE INTERRUPT VECTOR LISTINGS   ***/
/***         ALSO LOCATES OPTIONAL ROMS INSTALLED IN SYSTEM       ***/
/***                                                              ***/
/********************************************************************/
#include (string.h)
#include (stdlib.h)

struct vector {              /*global structure to store vectors*/
	unsigned int seg;
	unsigned int off;
} interrupt [256];          /*global array of actual vectors   */

******************************************************************/

main(argc, argv)
int argc;
char *argv[];
{
   int num,trgt1,trgt2;
   unsigned int far *ptr;  /* far pointer used to "peek" memory*/
   void listgrp(), listall(); /* void function declarations */
   for (num=0; num <= 255; num++) {  /* begin by reading all vectors */
     ptr = num * 4;
     interrupt [num].seg = *(ptr+1);
     interrupt [num].off = *ptr;
}
if (argc == 1)             /* if no args, list all vectors */
     listall();
else if (argc == 2) {     /* need either help or one vector */
  if ((! strcmpi(argv[1],"help"))||(! strcmpi[1], "?"))){
    puts("\nINTERRUPT - copyright 1986 by Andrew Fried\n");
    puts("Available Commands :\n");
    puts("\INT\"    Print listing of all interrupt vectors to STDOUT.");
    puts("\"INT n\"  Display single vector (n=decimal).");
    puts("\"INT n n\" Display range of vectors (n=decimal).");
    puts("\INT ?\" or \"INT ?" or "\INT help\"  print out this help list
            ing.");
    puts("\nNote: You may use the DOS \">\" command to redirect program
            output.");
   }
   else{
     trgt1 = atoi (arg[1]);
     listgrp(trgt1, trgt1);
   }
}
else if (argc == 3) {
     trgt1 = atoi(argv[1]);
     trgt2 = atoi(argv[2]);
     listgrp(trgt1,trgt2);
   }
}
/********************************************************************/

void listall()              /* produces full vector listing       */
{
   int num, r1,r2,r3;

   puts("    INTERRUPT VECTOR LISTING UTILITY                 ");

   for(num=0; num < 85; num++) {
     r1 = num * 3;
     r2 = r1 + 1;
     r3 = r2 + 1;
     printf("%03d [0x%02X] %04X:%04X     %03d [0x%02X] %04X:%04X  %03d
              [0x%02X] %04X:%04X\n",
         r1,r1, interrupt[r1].seg,interrupr[r1].off,
         r2,r2, interrupt[r2].seg,interrupt[r2].off,
         r3,r3, interrupt[r3].seg,interrupt[r3].off;
}
   printf("%s%03d [0x02X] %04X:%04X\n",
     "                            ",
     255,255, interrupt[255].seg,interrupt[255].off|);
   romcheck();           /* locate any rom signatures  */

/*******************************************************************/

void listgrp(start,stop)
int start, stop;
{

   int loop;

   if ((start<0 || (stop>255)||(start>stop))
     puts("Vector out of range! Program aborted...\n");
   else
     for(loop=start; loop(=stop; loop++)
       printf("%03d [0x%02X] %04X:%04X\n", loop,loop,interrupt[loop].
           seg,interrupt[loop].off);
}

/*********************************************************************/

romcheck()
{
   int count=0;
   unsigned long memloc;
   unsigned int far *ptr;

   for (memloc=0xC800000; memloc <=0F400000; memloc+=0x800000){
       ptr = memloc;
       if (*ptr==0xAA55) {
        count++;
        printf("\nROM BIOS Signature found at %041X:%041x...\n",
              memloc)>16,memloc&0xFFFF);
      }
   }
   if (count == 0)
     puts("\nNo ROM BIOS Signatures found in memory from C800:0000
             to F400:0000.\n");
   else
     printf("\nROMCHECK located a total of %d ROM Signature(s).\n",
             count);
      return(count);
  }

/********************************************************************/
                                                                                                    