/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *                                                     *
  *                      AODUMP                         *
  *                                                     *
  *                  HEX DUMP ROUTINE                   *
  *                                                     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * *

          displays address and offset

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

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

       declare
           dptr           ptr,
           nbytes         bin fixed (15),
           display_addr   bit(1);

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

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

           do while (offset < lngth);
           j = min (offset+15, lngth);
           put skip edit (offseta,'') (b4,a(2));
           aptr = addr (data(offset));
           put edit (unspec (aptr),'') (b4, a(2));
           put edit ((data(i) do i = offset to j)) (b4, x(1));
           put edit ('') (col(62), 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 aodump;