/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *                                                     *
  *                       ADUMP                         *
  *                                                     *
  *                  HEX DUMP ROUTINE                   *
  *                                                     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * *

          displays address and data (no offset)

          dptr         =  ptr to data to be dumped
          nbytes       =  number of bytes to dump */

adump:proc(dptr,nbytes);
       %replace
           true   by  '1'b,
           false  by  '0'b;

       declare
           dptr           ptr,
           nbytes         bin fixed (15);

       declare
           data(0:127)    bit(8) based (dptr),
           (offset,lngth) fixed,
           aptr           ptr,
           (i,j)          fixed,
           c              char(1),
           chrptr         ptr,
           chr            char(1) based (chrptr);

       put skip;
       offset = 0;
       lngth = max (0, nbytes-1);

           do while (offset < lngth);
           j = min (offset+15, lngth);
           put skip;
           aptr = addr (data(offset));
           put edit (unspec (aptr), '') (b4, a(3));
           put edit ((data(i) do i = offset to j)) (8(b4, x(1)), x(1));
           put edit ('') (col(59), a);

               do i = offset to j;
               if data(i) > '1f'b4 & data(i) < '7f'b4 then do;
                   chrptr = addr(data(i));
                   c = chr;
                   end;
               else
                   c = '.';
               put edit (c) (a(1));
               end;
           offset = offset + 16;
           end;

       end adump;