$title ('MP/M-86 2.0 Console Identification')
console:
do;

$include(copyrt.lit)

$include(vaxcmd.lit)

$include(comlit.lit)

dcl mpmproduct lit '11h';
dcl cpmversion lit '30h';

  mon1:
    procedure (func,info) external;
      declare func byte;
      declare info address;
    end mon1;

  mon2:
    procedure (func,info) byte external;
      declare func byte;
      declare info address;
    end mon2;

  mon3:
    procedure (func,info) address external;
      dcl func byte, info address;
    end mon3;

  /**************************************
   *                                    *
   *       B D O S   Externals          *
   *                                    *
   **************************************/

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

  print$console$buffer:
    procedure (buffer$address);
      declare buffer$address address;
      call mon1 (9,buffer$address);
    end print$console$buffer;

  version:
    procedure address;
      return mon3(12,0);
    end version;

  /**************************************
   *                                    *
   *       X D O S   Externals          *
   *                                    *
   **************************************/

  terminate:
    procedure;
      call mon1 (143,0);
    end terminate;

  get$console$number:
    procedure byte;
      return mon2 (153,0);
    end get$console$number;

  printb: procedure;
    call print$char(' ');
  end printb;

  pdecimal: procedure(v,prec,zerosup);
                         /* 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 print$char('0'+d);
            end;
        end;
end pdecimal;

dcl vers address initial (0);

  /*
    Main Program
  */

plmstart: procedure public;
    vers = version;
    if high(vers) <> mpmproduct or low(vers) <> cpmversion then
    do;
       call print$console$buffer(.(0dh,0ah,'Requires MP/M-86 2.0$'));
       call mon1(0,0);
    end;

    call print$console$buffer (.(0dh,0ah,'Console = $'));
    call p$decimal (get$console$number,100,true);
    call terminate;
end plmstart;

end console;
