MS-DOS PROGRAM PROFILER
                  FOR .EXE .COM FILES


I. PURPOSE

        The PROFIL program is designed to produce an execution
    profile of MS-DOS 1.25 or  2.00  .EXE  or  .COM  files  on
    8086/8088 systems  which  have a programmable interrupting
    clock.  The method employed is  to  chop  the  program  up
    into   a  sequence  of  "buckets"  and  to  increment  the
    appropriate (based on CS:IP) bucket count when  the  clock
    interrupts.  In  addition  there  are  counters  for  hits
    in the I/O system and the DOS so  some  idea  of  how  I/O
    or DOS  bound  a  program  is.  There is also a bucket for
    hits above the program area, you  might  get  counts  here
    if your program relocates itself, or goes haywire.

        The PROFIL  program  is  not  intended  as an end-user
    program, but rather  as  a  developement  tool.   To  this
    end it  is  not  particularly robust or friendly, but gets
    the job done.  The OEM must write a  PCLOCK  routine  (see
    PCLOCK.ASM) which  implements the hardware dependant clock
    interrupt.  The  implementation  should  be  evident  from
    examining the  source  code,  it  is  quite simple.  There
    is a CLOCKON routine  which  sets  up  a  clock  interrupt
    to  the  CLK_INTER  routine  every  DX  micro  seconds.  A
    CLOCKOFF routine which un-does CLOCKON.  And  a  LEAVE_INT
    routine which  is  responsible  for the actual "IRET" from
    the clock interrupt.  Also see the PROHIST  documentation.

II. USAGE

        The profiler is envoked by uttering:

            PROFIL fname.ext

    where the  filename  is  completly  specified,   including
    extension.  You  will  then  be  prompted  for  the number
    of paragraphs in one bucket.  This number  must  be  >  0,
    based on  this  number  the  number of buckets is computed
    by using the size of the executable file.  Next  you  will
    be  prompted  for  the  clock  interval,  and  lastly  for
    parameters to  the  program.   Type  the  parameters  just
    as if  you  were running the program at the command level.

    NOTE: If  a  "bad"  number  is entered for the bucket size
        or clock interval, you will be reprompted.

        When the program terminates, normally or  by  Cntrl-C,
    PROFIL  will  print  a  termination  message  (similar  to
    debug).  The output file will  be  fname.PRF  where  fname
    is the  same  as  the  file  containing  the program being
    profiled.

III. OUTPUT FORMAT

        The format of the  output  file  is  the  following  C
    type structure.

struct profdata {
 short clock_grain;  /* Clock sample interval in
                        micro-seconds*/
 short bucket_num;   /* The total number of buckets */
 short bucket_siz;   /* Number of paragraphs per bucket */
 short prog_low_pa;  /* The Paragraph number of the lower
                        bound on the sample area */
 short prog_high_pa; /* The Paragraph number of the upper
                        bound on the sample area */
 short dos_pa;       /* The Paragraph number of the I/O DOS
                        boundry */

/* When the clock interrupts the current segment is computed
from the CS:IP.  If this is below dos_pa it is an I/O hit,
if between dos_pa and prog_low_pa it is a DOS hit, if between
prog_low_pa and prog_high_pa the appropriate bucket number
is computed and that bucket count is incremented, if above
prog_high_pa then it is a high hit.  */

 short hit_io;       /* I/O bucket */
 short hit_dos;      /* DOS bucket */
 short hit_high;     /* Above program bucket */
};

short buckets[bucket_num];
/* The buckets *****NOTE: You can't declare it this way
(bucket_num is a variable), the size of this area is
determined by the value of bucket_num in the fixed header
*/
��������������������������������������������������������������