PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   1


ISIS-II PL/M-86 V2.0 COMPILATION OF MODULE ERASE
OBJECT MODULE PLACED IN ERA.OBJ
COMPILER INVOKED BY:  :F0: ERA.PLM XREF OPTIMIZE(3) DEBUG



              $compact
              $title ('ERA: Utility to Erase File for MP/M & CCP/M')
   1          erase:
              do;

              /*
                Revised:
                  19 Jan  80  by Thomas Rolander (MP/M 1.1)
                  19 July 81  by Doug Huskey     (MP/M II )
                   8 Aug  81  by Danny Horovitz  (MP/M-86 )
                  31 Jan  83  by Bill Fitler     (CCP/M-86 )
              */
              /* ERA checks if files are open by other users */

              $include (:f2:copyrt.lit)
          =
          =   /*
          =     Copyright (C) 1983
          =     Digital Research
          =     P.O. Box 579
          =     Pacific Grove, CA 93950
          =   */
          =

              $include (:f2:vaxcmd.lit)
          =
          =   /**** VAX commands for generation - read the name of this program 
          =           for PROGNAME below.
          =
          =       $ util := PROGNAME
          =       $ ccpmsetup             ! set up environment
          =       $ assign 'f$directory()' f1:        ! use local dir for temp files
          =       $ plm86 'util'.plm xref 'p1' optimize(3) debug
          =       $ link86 f2:scd.obj, 'util'.obj  to 'util'.lnk
          =       $ loc86 'util'.lnk od(sm(code,dats,data,stack,const)) -
          =             ad(sm(code(0),dats(10000h))) ss(stack(+32)) to 'util'.
          =       $ h86 'util'
          =
          =   ***** Then, on a micro:
          =       A>vax progname.h86 $fans
          =       A>gencmd progname data[b1000]
          =
          =   ***** Notes: Stack is increased for interrupts.  Const(ants) are last
          =           to force hex generation.
          =   ****/

              $include (:f2:vermpm.lit)
          =
          =   /*   This utility requires MP/M or Concurrent function calls */
          =
          =   /****** commented out for CCP/M-86 :
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   2


          =   declare Ver$OS literally '11h',
          =       Ver$Needs$OS literally '''Requires MP/M-86''';
          =    ******/
          =
   2   1  =   declare Ver$OS literally '14h',
          =       Ver$Needs$OS literally '''Requires Concurrent CP/M-86''';
          =
          =
   3   1  =   declare Ver$Mask literally '0fdh';  /* mask out Is_network bit */
          =
   4   1  =   declare Ver$BDOS literally '30h';   /* minimal BDOS version rqd */
          =

   5   1      declare
                  true    literally '1',
                  false   literally '0',
                  forever literally 'while true',
                  lit     literally 'literally',
                  proc    literally 'procedure',
                  dcl     literally 'declare',
                  addr    literally 'address',
                  cr      literally '13',
                  lf      literally '10',
                  ctrlc   literally '3',
                  ctrlx   literally '18h',
                  bksp    literally '8';

              $include (:f2:proces.lit)
          =
          =   /*
          =       Proces Literals MP/M-8086 II
          =   */
          =
   6   1  =   declare pnamsiz literally '8';
          =
   7   1  =   declare pd$hdr literally 'structure
          =     (link word,thread word,stat byte,prior byte,flag word,
          =     name (8) byte,uda word,dsk byte,user byte,ldsk byte,luser byte,
          =     mem word';
          =
   8   1  =   declare pd$structure literally 'pd$hdr,
          =     dvract word,wait word,org byte,net byte,parent word,
          =     cns byte,abort byte,conmode word,lst byte,sf3 byte,sf4 byte,sf5 byte,
          =     reservd (4) byte,pret word,scratch word)';
          =
   9   1  =     declare psrun                 lit '00',
          =             pspoll                lit '01',
          =             psdelay               lit '02',
          =             psswap                lit '03',
          =             psterm                lit '04',
          =             pssleep               lit '05',
          =             psdq                  lit '06',
          =             psnq                  lit '07',
          =             psflagwait            lit '08',
          =             psciowait             lit '09';
          =
  10   1  =     declare pf$sys                lit '00001h',
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   3


          =             pf$keep               lit '00002h',
          =             pf$kernal             lit '00004h',
          =             pf$pure               lit '00008h',
          =             pf$table              lit '00010h',
          =             pf$resource           lit '00020h',
          =             pf$raw                lit '00040h',
          =             pf$ctlc               lit '00080h',
          =             pf$active             lit '00100h',
          =             pf$tempkeep           lit '00200h',
          =             pf$ctld               lit '00400h',
          =             pf$childabort         lit '00800h',
          =             pf$noctls             lit '01000h';
          =
  11   1  =     declare pcm$11                lit '00001h',
          =             pcm$ctls              lit '00002h',
          =             pcm$rout              lit '00004h',
          =             pcm$ctlc              lit '00008h',
          =             pcm$ctlo              lit '00080h',
          =             pcm$rsx               lit '00300h';

              $include (:f2:uda.lit)
          =
          =   /* MP/M-86 II  User Data Area format - August 8, 1981 */
          =
  12   1  =   declare uda$structure lit 'structure (
          =       dparam          word,
          =       dma$ofst        word,
          =       dma$seg         word,
          =       func            byte,
          =       searchl         byte,
          =       searcha         word,
          =       searchabase     word,
          =       dcnt            word,
          =       dblk            word,
          =       error$mode      byte,
          =       mult$cnt        byte,
          =       df$password     (8) byte,
          =       pd$cnt          byte)';
          =


  13   1      dcl stack$siz lit '16';
  14   1      dcl int3 lit '0CCCCh';
  15   1      dcl plmstack (stack$siz) word public initial(
                  int3,int3,int3,int3, int3,int3,int3,int3,
                  int3,int3,int3,int3, int3,int3,int3,int3);
  16   1      dcl stack$size word public data(stack$siz + stack$siz);

                /**************************************
                 *                                    *
                 *       B D O S   INTERFACE          *
                 *                                    *
                 **************************************/


  17   1        mon1:
                  procedure (func,info) external;
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   4


  18   2            declare func byte;
  19   2            declare info address;
  20   2          end mon1;

  21   1        mon2:
                  procedure (func,info) byte external;
  22   2            declare func byte;
  23   2            declare info address;
  24   2          end mon2;

  25   1        mon3:
                  procedure (func,info) address external;
  26   2            declare func byte;
  27   2            declare info address;
  28   2          end mon3;

  29   1        mon4:
                  procedure (func,info) pointer external;
  30   2            declare func byte;
  31   2            declare info address;
  32   2          end mon4;



  33   1        declare cmdrv     byte    external;   /* command drive      */
  34   1        declare fcb (1)   byte    external;   /* 1st default fcb    */
  35   1        declare fcb16 (1) byte    external;   /* 2nd default fcb    */
  36   1        declare pass0     address external;   /* 1st password ptr   */
  37   1        declare len0      byte    external;   /* 1st passwd length  */
  38   1        declare pass1     address external;   /* 2nd password ptr   */
  39   1        declare len1      byte    external;   /* 2nd passwd length  */
  40   1        declare tbuff (1) byte    external;   /* default dma buffer */


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

  41   1        read$console:
                  procedure byte;
  42   2            return mon2 (1,0);
  43   2          end read$console;


  44   1        printchar: 
                  procedure(char);
  45   2          declare char byte;
  46   2          call mon1(2,char);
  47   2          end printchar;

  48   1        conin: 
                  procedure byte;
  49   2          return mon2(6,0fdh);
  50   2          end conin;

PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   5


  51   1        check$con$stat:
                  procedure byte;
  52   2            return mon2(11,0);
  53   2          end check$con$stat;

  54   1        print$buf:
                  procedure (buffer$address);
  55   2            declare buffer$address address;
  56   2            call mon1 (9,buffer$address);
  57   2          end print$buf;

  58   1        version: procedure address;
                  /* returns current cp/m version # */
  59   2          return mon3(12,0);
  60   2          end version;

  61   1        setdma: procedure(dma);
  62   2          declare dma address;
  63   2          call mon1(26,dma);
  64   2          end setdma;

  65   1        search:
                  procedure (fcb$address) byte;
  66   2            declare fcb$address address;
  67   2            return mon2 (17,fcb$address);
  68   2          end search;

  69   1        searchn:
                  procedure byte;
  70   2            return mon2 (18,0);
  71   2          end searchn;

  72   1        delete$file:
                  procedure (fcb$address) address;
  73   2            declare fcb$address address;
  74   2            return mon3 (19,fcb$address);
  75   2          end delete$file;

  76   1        get$user$code:
                  procedure byte;
  77   2            return mon2 (32,0ffh);
  78   2          end get$user$code;

                /* 0ff => return BDOS errors */
  79   1        return$errors:
                  procedure;
  80   2            call mon1 (45,0ffh);  
  81   2          end return$errors;

  82   1        terminate:
                  procedure;
  83   2            call mon1 (143,0);
  84   2          end terminate;

  85   1        declare
                  parse$fn structure (
                    buff$adr  address,
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   6


                    fcb$adr   address);
  86   1        declare (saveax,savecx) word external;  /* reg return vals, set in mon1 */

  87   1        parse: procedure;
  88   2          declare (retcode,errcode) word;

  89   2          call mon1(152,.parse$fn);
  90   2          retcode = saveax;
  91   2          errcode = savecx;
  92   2          if retcode = 0ffffh then       /* parse returned an error*/
  93   2             do;
  94   3               call print$buf(.('Invalid Filespec$'));
  95   3               if errcode = 23 then call print$buf(.(' (drive)$'));
  97   3               else if errcode = 24 then call print$buf(.(' (filename)$'));
  99   3               else if errcode = 25 then call print$buf(.(' (filetype)$'));
 101   3               else if errcode = 38 then call print$buf(.(' (password)$'));
                       call print$buf(.('.',13,10,'$')); call terminate;
 105   3             end;
 106   2          end parse;

 107   1      declare
                  pd$pointer pointer,
                  pd         based pd$pointer pd$structure;
 108   1      declare
                  uda$pointer pointer,
                  uda$ptr structure (
                             offset word,
                             segment word) at (@uda$pointer),
                  uda based uda$pointer uda$structure;

 109   1      get$uda: procedure;

 110   2          pd$pointer = mon4(156,0);
 111   2          uda$ptr.segment = pd.uda;
 112   2          uda$ptr.offset = 0;
 113   2          end get$uda;

                /**************************************
                 *                                    *
                 *         GLOBAL VARIABLES           *
                 *                                    *
                 **************************************/

 114   1        declare xfcb     byte initial(0);
 115   1        declare successful lit '0FFh';

                /**************************************
                 *                                    *
                 *       S U B R O U T I N E S        *
                 *                                    *
                 **************************************/


                                /* upper case character from console */
 116   1      crlf:   proc;
 117   2          call printchar(cr);
 118   2          call printchar(lf);
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   7


 119   2          end crlf;
              /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


                                /* fill string @ s for c bytes with f */
 120   1      fill:   proc(s,f,c);
 121   2          dcl s addr,
                      (f,c) byte,
                      a based s byte;

 122   2              do while (c:=c-1)<>255;
 123   3              a = f;
 124   3              s = s+1;
 125   3              end;
 126   2          end fill;
              /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


                                /* error message routine */
 127   1      error:   proc(code);
 128   2         declare
                    code byte;

 129   2          call printchar(' ');
 130   2          if code=1 then 
 131   2              call print$buf(.(cr,lf,'Disk I/O Error.$'));
 132   2          if code=2 then 
 133   2              call print$buf(.(cr,lf,'Drive $'));
 134   2          if code = 3 or code = 2 then
 135   2              call print$buf(.('Read Only$'));
 136   2          if code = 4 then
 137   2              call print$buf(.(cr,lf,'Invalid Filespec (drive).$'));
 138   2          if code = 5 then      
 139   2              call print$buf(.('Currently Opened$'));
 140   2          if code = 7 then
 141   2              call print$buf(.('Password Error$'));
 142   2          if code < 3 or code = 4 then 
 143   2              call terminate;
 144   2          end error;
              /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


                               /* print file name */
 145   1      print$file: procedure(fcbp);
 146   2              declare k byte;
 147   2              declare typ lit '9';        /* file type */
 148   2              declare fnam lit '11';        /* file type */
 149   2              declare
                          fcbp   addr,
                          fcbv   based fcbp (32) byte;

 150   2                  do k = 1 to fnam;
 151   3                  if k = typ then 
 152   3                 call printchar('.');
 153   3                  call printchar(fcbv(k) and 7fh);
 154   3                  end;
 155   2              end print$file;
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   8


              /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


                /* try to delete fcb at fcb$address
                          return error code if unsuccessful */
 156   1        delete:
                  procedure(fcb$address) byte;
 157   2          declare
                     fcb$address address,
                     fcbv based  fcb$address (32) byte,
                     error$code  address,
                     code        byte;
                     
 158   2          if xfcb then 
 159   2              fcbv(5) = fcbv(5) or 80h;
 160   2          call setdma(.fcb16);                   /* password */
 161   2          fcbv(0) = fcb(0);                      /* drive */
 162   2          error$code = delete$file(fcb$address);
 163   2          fcbv(5) = fcbv(5) and 7fh;             /* reset xfcb bit */
 164   2          if low(error$code) = 0FFh then do;
 166   3              code = high(error$code);
 167   3              if (code=1) or (code=2) or (code=4) then 
 168   3                  call error(code);
 169   3              return code;
 170   3              end;
 171   2          return successful;      
 172   2          end delete;
              /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


                                /* upper case character from console */
 173   1      ucase:   proc byte;
 174   2          dcl c byte;

 175   2          if (c:=conin) >= 'a' then
 176   2             if c < '{' then
 177   2                return(c-20h);
 178   2          return c;
 179   2          end ucase;
              /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


                                /* get password and place at fcb + 16 */
 180   1      getpasswd:   proc;
 181   2          dcl (i,c) byte;

 182   2          call crlf;
 183   2          call print$buf(.('Password ? ','$'));
 184   2      retry:
                  call fill(.fcb16,' ',8);
 185   2              do i = 0 to 7;
 186   3      nxtchr:
                      if (c:=ucase) >= ' ' then 
 187   3                  fcb16(i)=c;
 188   3              if c = cr then do;
 190   4                  call crlf;
 191   4                  goto exit;
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE   9


 192   4                  end;
 193   3              if c = ctrlx then
 194   3                  goto retry;
 195   3              if c = bksp then do;
 197   4                  if i<1 then
 198   4                      goto retry;
 199   4                  else do;
 200   5                      fcb16(i:=i-1)=' ';
 201   5                      goto nxtchr;
 202   5                      end;
 203   4                  end;
 204   3              if c = 3 then
 205   3                  call terminate;
 206   3              end;
 207   2      exit:
                  c = check$con$stat;   
 208   2          end getpasswd;
              /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


                                /* try deleting files one at a time */
 209   1        single$file:
                  procedure;
 210   2          declare (code,dcnt,sav$searchl) byte;
 211   2          declare (fcba,sav$dcnt) addr;

 212   2          file$err: procedure;
 213   3              call crlf;
 214   3              call print$buf(.('Not erased: $'));
 215   3              call print$file(fcba);
 216   3              call error(code);
 217   3              end file$err;

 218   2          call setdma(.tbuff);
 219   2          dcnt = search(.fcb);
 220   2              do while dcnt <> 0ffh;
 221   3              fcba = shl(dcnt,5) + .tbuff;
 222   3              sav$dcnt = uda.dcnt;
 223   3              sav$searchl = uda.searchl;
 224   3              if (code:=delete(fcba)) = 7 then do;
 226   4                  call file$err;
 227   4                  call getpasswd;
 228   4                  code = delete(fcba);
 229   4                  end;
 230   3              if code <> successful then 
 231   3                  call file$err;
 232   3              call setdma(.tbuff);
                      /* restore dcnt and search length of 11 */
 233   3              uda.dcnt = sav$dcnt;
 234   3              uda.searchl = sav$searchl;
 235   3              dcnt = searchn;
 236   3              end;
 237   2          end single$file;

                /**************************************
                 *                                    *
                 *       M A I N  P R O G R A M       *
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE  10


                 *                                    *
                 **************************************/


 238   1      declare (i,response,user,code) byte;
 239   1      declare ver address;
 240   1      declare last$dseg$byte byte
                initial (0);

 241   1      plm$start: procedure public;

 242   2          ver = version;
 243   2          if low(ver) < Ver$BDOS  or  (high(ver) and Ver$Mask) = 0 then do;
 245   3            call print$buf (.(cr,lf,Ver$Needs$OS,'$'));
 246   3            call mon1(0,0);
 247   3            end;

 248   2          parse$fn.buff$adr = .tbuff(1);
 249   2          parse$fn.fcb$adr = .fcb;
 250   2          user = get$user$code;
 251   2          call getuda;             /* get uda address */
 252   2          call return$errors;
 253   2          if fcb(17) <> ' ' then 
 254   2              if fcb(17) = 'X' then 
 255   2                  xfcb = true;
 256   2              else do;
 257   3                  call print$buf (.(
                            'Invalid Command Option.$'));
 258   3                  call terminate;
 259   3                  end;

 260   2          i = 0;
 261   2            do while fcb(i:=i+1) = '?';
 262   3            ;
 263   3            end;
 264   2          if i > 11 then
 265   2            if not xfcb then 
 266   2              do;
 267   3              call print$buf (.(
                        'Confirm delete all user files (Y/N)?','$'));
 268   3              response = read$console;
 269   3              if not ((response = 'y') or
                            (response = 'Y'))
                      then call terminate;
 271   3              end;
 272   2          call parse;
 273   2          if (code:=delete(.fcb)) <> successful then do;
 275   3              if code = 0 then 
 276   3                  call print$buf (.(cr,lf,
                          'File Not Found.','$'));
 277   3              else if code < 3 or code = 4 then 
 278   3                  call error(code);            /* fatal errors */
                      else 
 279   3                  call single$file;       /* single file error */
 280   3              end;
 281   2          call terminate;
 282   2        end plm$start;
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE  11



 283   1      end erase;
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE  12


CROSS-REFERENCE LISTING
-----------------------


   DEFN  ADDR   SIZE  NAME, ATTRIBUTES, AND REFERENCES
  ----- ------ -----  --------------------------------


    121  0000H     1  A. . . . . . . . .    BYTE BASED(S)        123 
    107  0021H     1  ABORT. . . . . . .    BYTE MEMBER(PD)
      5               ADDR . . . . . . .    LITERALLY       121  149  211 
      5               BKSP . . . . . . .    LITERALLY       195 
     85  0000H     2  BUFFADR. . . . . .    WORD MEMBER(PARSEFN)      248 
     54  0004H     2  BUFFERADDRESS. . .    WORD PARAMETER AUTOMATIC        55   56 
    181  003DH     1  C. . . . . . . . .    BYTE       186  187  188  193  195  204  207 
    120  0004H     1  C. . . . . . . . .    BYTE PARAMETER AUTOMATIC       121  122 
    174  003BH     1  C. . . . . . . . .    BYTE       175  176  177  178 
     44  0004H     1  CHAR . . . . . . .    BYTE PARAMETER AUTOMATIC        45   46 
     51  0033H    15  CHECKCONSTAT . . .    PROCEDURE BYTE STACK=0008H          207 
     33  0000H     1  CMDRV. . . . . . .    BYTE EXTERNAL(4)
    107  0020H     1  CNS. . . . . . . .    BYTE MEMBER(PD)
    157  003AH     1  CODE . . . . . . .    BYTE       166  167  168  169 
    238  0044H     1  CODE . . . . . . .    BYTE       273  275  277  278 
    127  0004H     1  CODE . . . . . . .    BYTE PARAMETER AUTOMATIC       128  130  132  134  136  138  140  142
                                            
    210  003EH     1  CODE . . . . . . .    BYTE       216  224  228  230 
     48  0024H    15  CONIN. . . . . . .    PROCEDURE BYTE STACK=0008H          175 
    107  0022H     2  CONMODE. . . . . .    WORD MEMBER(PD)
      5               CR . . . . . . . .    LITERALLY       117  131  133  137  188  245  276 
    116  015AH    17  CRLF . . . . . . .    PROCEDURE STACK=000EH          182  190  213 
      5               CTRLC. . . . . . .    LITERALLY
      5               CTRLX. . . . . . .    LITERALLY       193 
    108  000EH     2  DBLK . . . . . . .    WORD MEMBER(UDA)
      5               DCL. . . . . . . .    LITERALLY
    210  003FH     1  DCNT . . . . . . .    BYTE       219  220  221  235 
    108  000CH     2  DCNT . . . . . . .    WORD MEMBER(UDA)          222  233 
    156  0233H    91  DELETE . . . . . .    PROCEDURE BYTE STACK=0016H          224  228  273 
     72  0090H    16  DELETEFILE . . . .    PROCEDURE WORD STACK=000AH          162 
    108  0012H     8  DFPASSWORD . . . .    BYTE ARRAY(8) MEMBER(UDA)
     61  0004H     2  DMA. . . . . . . .    WORD PARAMETER AUTOMATIC        62   63 
    108  0002H     2  DMAOFST. . . . . .    WORD MEMBER(UDA)
    108  0004H     2  DMASEG . . . . . .    WORD MEMBER(UDA)
    108  0000H     2  DPARAM . . . . . .    WORD MEMBER(UDA)
    107  0012H     1  DSK. . . . . . . .    BYTE MEMBER(PD)
    107  0018H     2  DVRACT . . . . . .    WORD MEMBER(PD)
      1  0002H        ERASE. . . . . . .    PROCEDURE STACK=0000H
     88  0026H     2  ERRCODE. . . . . .    WORD        91   95   97   99  101 
    127  018BH   112  ERROR. . . . . . .    PROCEDURE STACK=0010H          168  216  278 
    157  0030H     2  ERRORCODE. . . . .    WORD       162  164  166 
    108  0010H     1  ERRORMODE. . . . .    BYTE MEMBER(UDA)
    207  032FH        EXIT . . . . . . .    LABEL      191 
    120  0006H     1  F. . . . . . . . .    BYTE PARAMETER AUTOMATIC       121  123 
      5               FALSE. . . . . . .    LITERALLY
     34  0000H     1  FCB. . . . . . . .    BYTE ARRAY(1) EXTERNAL(5)      161  219  249  253  254  261  273 
     35  0000H     1  FCB16. . . . . . .    BYTE ARRAY(1) EXTERNAL(6)      160  184  187  200 
    211  0032H     2  FCBA . . . . . . .    WORD       215  221  224  228 
    156  0004H     2  FCBADDRESS . . . .    WORD PARAMETER AUTOMATIC       157  159  161  162  163 
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE  13


     65  0004H     2  FCBADDRESS . . . .    WORD PARAMETER AUTOMATIC        66   67 
     72  0004H     2  FCBADDRESS . . . .    WORD PARAMETER AUTOMATIC        73   74 
     85  0002H     2  FCBADR . . . . . .    WORD MEMBER(PARSEFN)      249 
    145  0004H     2  FCBP . . . . . . .    WORD PARAMETER AUTOMATIC       149  153 
    149  0000H    32  FCBV . . . . . . .    BYTE BASED(FCBP) ARRAY(32)          153 
    157  0000H    32  FCBV . . . . . . .    BYTE BASED(FCBADDRESS) ARRAY(32)         159  161  163 
    212  03BAH    29  FILEERR. . . . . .    PROCEDURE STACK=0014H          226  231 
    120  016BH    32  FILL . . . . . . .    PROCEDURE STACK=0008H          184 
    107  0006H     2  FLAG . . . . . . .    WORD MEMBER(PD)
    148               FNAM . . . . . . .    LITERALLY       150 
      5               FOREVER. . . . . .    LITERALLY
     29  0000H     1  FUNC . . . . . . .    BYTE PARAMETER        30 
     17  0000H     1  FUNC . . . . . . .    BYTE PARAMETER        18 
    108  0006H     1  FUNC . . . . . . .    BYTE MEMBER(UDA)
     21  0000H     1  FUNC . . . . . . .    BYTE PARAMETER        22 
     25  0000H     1  FUNC . . . . . . .    BYTE PARAMETER        26 
    180  02AEH   137  GETPASSWD. . . . .    PROCEDURE STACK=0012H          227 
    109  0132H    40  GETUDA . . . . . .    PROCEDURE STACK=0008H          251 
     76  00A0H    15  GETUSERCODE. . . .    PROCEDURE BYTE STACK=0008H          250 
                      HIGH . . . . . . .    BUILTIN         166  243 
    238  0041H     1  I. . . . . . . . .    BYTE       260  261  264 
    181  003CH     1  I. . . . . . . . .    BYTE       185  187  197  200 
     21  0000H     2  INFO . . . . . . .    WORD PARAMETER        23 
     17  0000H     2  INFO . . . . . . .    WORD PARAMETER        19 
     25  0000H     2  INFO . . . . . . .    WORD PARAMETER        27 
     29  0000H     2  INFO . . . . . . .    WORD PARAMETER        31 
     14               INT3 . . . . . . .    LITERALLY        15 
    146  0039H     1  K. . . . . . . . .    BYTE       150  151  153 
    240  0045H     1  LASTDSEGBYTE . . .    BYTE INITIAL
    107  0014H     1  LDSK . . . . . . .    BYTE MEMBER(PD)
     37  0000H     1  LEN0 . . . . . . .    BYTE EXTERNAL(8)
     39  0000H     1  LEN1 . . . . . . .    BYTE EXTERNAL(10)
      5               LF . . . . . . . .    LITERALLY       118  131  133  137  245  276 
    107  0000H     2  LINK . . . . . . .    WORD MEMBER(PD)
      5               LIT. . . . . . . .    LITERALLY         9   10   11   12   13   14  115  147  148 
                      LOW. . . . . . . .    BUILTIN         164  243 
    107  0024H     1  LST. . . . . . . .    BYTE MEMBER(PD)
    107  0015H     1  LUSER. . . . . . .    BYTE MEMBER(PD)
    107  0016H     2  MEM. . . . . . . .    WORD MEMBER(PD)
     17  0000H        MON1 . . . . . . .    PROCEDURE EXTERNAL(0) STACK=0000H         46   56   63   80   83   89
                                             246 
     21  0000H        MON2 . . . . . . .    PROCEDURE BYTE EXTERNAL(1) STACK=0000H         42   49   52   67   70
                                              77 
     25  0000H        MON3 . . . . . . .    PROCEDURE WORD EXTERNAL(2) STACK=0000H         59   74 
     29  0000H        MON4 . . . . . . .    PROCEDURE POINTER EXTERNAL(3) STACK=0000H          110 
    108  0011H     1  MULTCNT. . . . . .    BYTE MEMBER(UDA)
    107  0008H     8  NAME . . . . . . .    BYTE ARRAY(8) MEMBER(PD)
    107  001DH     1  NET. . . . . . . .    BYTE MEMBER(PD)
    186  02D4H        NXTCHR . . . . . .    LABEL      201 
    108  0000H     2  OFFSET . . . . . .    WORD MEMBER(UDAPTR)       112 
    107  001CH     1  ORG. . . . . . . .    BYTE MEMBER(PD)
    107  001EH     2  PARENT . . . . . .    WORD MEMBER(PD)
     87  00CDH   101  PARSE. . . . . . .    PROCEDURE STACK=000EH          272 
     85  0020H     4  PARSEFN. . . . . .    STRUCTURE        89  248  249 
     36  0000H     2  PASS0. . . . . . .    WORD EXTERNAL(7)
     38  0000H     2  PASS1. . . . . . .    WORD EXTERNAL(9)
     11               PCM11. . . . . . .    LITERALLY
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE  14


     11               PCMCTLC. . . . . .    LITERALLY
     11               PCMCTLO. . . . . .    LITERALLY
     11               PCMCTLS. . . . . .    LITERALLY
     11               PCMROUT. . . . . .    LITERALLY
     11               PCMRSX . . . . . .    LITERALLY
    107  0000H    48  PD . . . . . . . .    STRUCTURE BASED(PDPOINTER)          111 
    108  001AH     1  PDCNT. . . . . . .    BYTE MEMBER(UDA)
      7               PDHDR. . . . . . .    LITERALLY       107 
    107  0028H     4  PDPOINTER. . . . .    POINTER         107  110  111 
      8               PDSTRUCTURE. . . .    LITERALLY       107 
     10               PFACTIVE . . . . .    LITERALLY
     10               PFCHILDABORT . . .    LITERALLY
     10               PFCTLC . . . . . .    LITERALLY
     10               PFCTLD . . . . . .    LITERALLY
     10               PFKEEP . . . . . .    LITERALLY
     10               PFKERNAL . . . . .    LITERALLY
     10               PFNOCTLS . . . . .    LITERALLY
     10               PFPURE . . . . . .    LITERALLY
     10               PFRAW. . . . . . .    LITERALLY
     10               PFRESOURCE . . . .    LITERALLY
     10               PFSYS. . . . . . .    LITERALLY
     10               PFTABLE. . . . . .    LITERALLY
     10               PFTEMPKEEP . . . .    LITERALLY
     15  0000H    32  PLMSTACK . . . . .    WORD ARRAY(16) PUBLIC INITIAL
    241  03D7H   246  PLMSTART . . . . .    PROCEDURE PUBLIC STACK=001EH
      6               PNAMSIZ. . . . . .    LITERALLY
    107  002CH     2  PRET . . . . . . .    WORD MEMBER(PD)
     54  0042H    16  PRINTBUF . . . . .    PROCEDURE STACK=000AH           94   96   98  100  102  103  131  133
                                             135  137  139  141  183  214  245  257  267  276 
     44  0011H    19  PRINTCHAR. . . . .    PROCEDURE STACK=000AH          117  118  129  152  153 
    145  01FBH    56  PRINTFILE. . . . .    PROCEDURE STACK=0010H          215 
    107  0005H     1  PRIOR. . . . . . .    BYTE MEMBER(PD)
      5               PROC . . . . . . .    LITERALLY       116  120  127  173  180 
      9               PSCIOWAIT. . . . .    LITERALLY
      9               PSDELAY. . . . . .    LITERALLY
      9               PSDQ . . . . . . .    LITERALLY
      9               PSFLAGWAIT . . . .    LITERALLY
      9               PSNQ . . . . . . .    LITERALLY
      9               PSPOLL . . . . . .    LITERALLY
      9               PSRUN. . . . . . .    LITERALLY
      9               PSSLEEP. . . . . .    LITERALLY
      9               PSSWAP . . . . . .    LITERALLY
      9               PSTERM . . . . . .    LITERALLY
     41  0002H    15  READCONSOLE. . . .    PROCEDURE BYTE STACK=0008H          268 
    107  0028H     4  RESERVD. . . . . .    BYTE ARRAY(4) MEMBER(PD)
    238  0042H     1  RESPONSE . . . . .    BYTE       268  269 
     88  0024H     2  RETCODE. . . . . .    WORD        90   92 
    184  02BBH        RETRY. . . . . . .    LABEL      194  198 
     79  00AFH    15  RETURNERRORS . . .    PROCEDURE STACK=0008H          252 
    120  0008H     2  S. . . . . . . . .    WORD PARAMETER AUTOMATIC       121  123  124 
    211  0034H     2  SAVDCNT. . . . . .    WORD       222  233 
     86  0000H     2  SAVEAX . . . . . .    WORD EXTERNAL(12)          90 
     86  0000H     2  SAVECX . . . . . .    WORD EXTERNAL(13)          91 
    210  0040H     1  SAVSEARCHL . . . .    BYTE       223  234 
    107  002EH     2  SCRATCH. . . . . .    WORD MEMBER(PD)
     65  0071H    16  SEARCH . . . . . .    PROCEDURE BYTE STACK=000AH          219 
    108  0008H     2  SEARCHA. . . . . .    WORD MEMBER(UDA)
PL/M-86 COMPILER    ERA: UTILITY TO ERASE FILE FOR MP/M & CCP/M                                                 PAGE  15


    108  000AH     2  SEARCHABASE. . . .    WORD MEMBER(UDA)
    108  0007H     1  SEARCHL. . . . . .    BYTE MEMBER(UDA)          223  234 
     69  0081H    15  SEARCHN. . . . . .    PROCEDURE BYTE STACK=0008H          235 
    108  0002H     2  SEGMENT. . . . . .    WORD MEMBER(UDAPTR)       111 
     61  0061H    16  SETDMA . . . . . .    PROCEDURE STACK=000AH          160  218  232 
    107  0025H     1  SF3. . . . . . . .    BYTE MEMBER(PD)
    107  0026H     1  SF4. . . . . . . .    BYTE MEMBER(PD)
    107  0027H     1  SF5. . . . . . . .    BYTE MEMBER(PD)
                      SHL. . . . . . . .    BUILTIN         221 
    209  0337H   131  SINGLEFILE . . . .    PROCEDURE STACK=001AH          279 
     13               STACKSIZ . . . . .    LITERALLY        15   16 
     16  0000H     2  STACKSIZE. . . . .    WORD PUBLIC DATA
    107  0004H     1  STAT . . . . . . .    BYTE MEMBER(PD)
    115               SUCCESSFUL . . . .    LITERALLY       171  230  273 
     40  0000H     1  TBUFF. . . . . . .    BYTE ARRAY(1) EXTERNAL(11)          218  221  232  248 
     82  00BEH    15  TERMINATE. . . . .    PROCEDURE STACK=0008H          104  143  205  258  270  281 
    107  0002H     2  THREAD . . . . . .    WORD MEMBER(PD)
      5               TRUE . . . . . . .    LITERALLY       255 
    147               TYP. . . . . . . .    LITERALLY       151 
    173  028EH    32  UCASE. . . . . . .    PROCEDURE BYTE STACK=000CH          186 
    108  0000H    27  UDA. . . . . . . .    STRUCTURE BASED(UDAPOINTER)         222  223  233  234 
    107  0010H     2  UDA. . . . . . . .    WORD MEMBER(PD)      111 
    108  002CH     4  UDAPOINTER . . . .    POINTER         108  222  223  233  234 
    108  002CH     4  UDAPTR . . . . . .    STRUCTURE AT         111  112 
     12               UDASTRUCTURE . . .    LITERALLY       108 
    238  0043H     1  USER . . . . . . .    BYTE       250 
    107  0013H     1  USER . . . . . . .    BYTE MEMBER(PD)
    239  0036H     2  VER. . . . . . . .    WORD       242  243 
      4               VERBDOS. . . . . .    LITERALLY       243 
      3               VERMASK. . . . . .    LITERALLY       243 
      2               VERNEEDSOS . . . .    LITERALLY       245 
      2               VEROS. . . . . . .    LITERALLY
     58  0052H    15  VERSION. . . . . .    PROCEDURE WORD STACK=0008H          242 
    107  001AH     2  WAIT . . . . . . .    WORD MEMBER(PD)
    114  0038H     1  XFCB . . . . . . .    BYTE INITIAL         158  255  265 



MODULE INFORMATION:

     CODE AREA SIZE     = 04CDH   1229D
     CONSTANT AREA SIZE = 012BH    299D
     VARIABLE AREA SIZE = 0046H     70D
     MAXIMUM STACK SIZE = 001EH     30D
     566 LINES READ
     0 PROGRAM ERROR(S)

END OF PL/M-86 COMPILATION
