$title ('SDIR - Print')

/*
  Copyright (C) 1981
  Digital Research
  P.O. Box 579
  Pacific Grove, CA 93950

  Revised:
    14 Sept 81 by Danny Horovitz
*/

dprint:
do;
              /* print routines for extended directory */

declare dcl literally 'declare',
        lit literally 'literally',
        word lit 'address',
        true literally '1',
        false literally '0',
        boolean literally 'byte',
        cr literally '13',
        lf literally '10';

mon1: procedure(f,a) external;
    declare f byte, a address;
end mon1;

dcl debug byte external;

break: procedure external;
end break;

             /* fcb and dma buffer constants */
declare
    f$name           lit '1',        /* file name                           */
    fnamelen         lit '8',        /* file name length                    */
    f$type           lit '9',        /* file type field                     */
    f$typelen        lit '3';        /* type length                         */

        /* BDOS calls */

print$char: procedure(char) public;
    declare char byte;
    call mon1(2,char);
end print$char;

print: procedure(string$adr) public;
    dcl string$adr address;
    call mon1(9,string$adr);
    if debug then
       call break; 
end print;

printb: procedure public;
    call print$char(' ');
end printb;
 
crlf: procedure public;
    call print$char(cr);
    call print$char(lf);
end crlf;

printfn: procedure(fname$adr) public;
    dcl fname$adr address,
        file$name based fname$adr (1) byte,
        i byte;                                /* <filename> ' ' <filetype> */

    do i = 0 to f$namelen - 1;
        call printchar(file$name(i) and 7fh);
    end;
    call printchar(' ');
    do i = f$namelen to f$namelen + f$typelen - 1;
        call printchar(file$name(i) and 7fh);
    end;
end printfn;

pdecimal: procedure(v,prec,zerosup) public;
                         /* print value v, field size = (log10 prec) + 1  */
                         /* with leading zero suppression if zerosup = true */
    declare v address,                          /* value to print           */
            prec address,                       /* precision                */
            zerosup boolean,                    /* zero suppression flag    */
            d byte;                             /* current decimal digit    */

    do while prec <> 0;
        d = v / prec;                           /* get next digit           */
        v = v mod prec;                         /* get remainder back to v  */
        prec = prec / 10;                       /* ready for next digit     */
        if prec <> 0 and zerosup and d = 0 then
            call printb;
        else
        do;
            zerosup = false;
            call printchar('0'+d);
            end;
        end;
end pdecimal;

p3byte: procedure(byte3adr,prec) public;
                                   /* print 3 byte value with 0 suppression */
      dcl byte3adr address,        /* assume high order bit is < 10         */
          prec address,
          b3 based byte3adr structure (
          lword address,
          hbyte byte),
          i byte;

                                       /* prec = 1 for 6 chars, 2 for 7 */
      if b3.hbyte <> 0 then
      do;
          call pdecimal(b3.hbyte,prec,true);  /* 3 for 8 chars printed      */
          call pdecimal(b3.lword,10000,false);
      end;
      else
      do;
          i = 1;
          do while i <= prec;
              call printb;
              i = i * 10;
          end;
          call pdecimal(b3.lword,10000,true);
      end;
end p3byte;

end dprint;

                        

                                                                      
                                              
