*DECK NDAS
      PROC NDAS; # NDA - NETWORK DUMP ANALYZER #
*IF DEF,IMS 
 #
**
*E
*     NETWORK PRODUCTS DOCUMENTATION
* 
*     NETWORK UTILITY INTERNAL MAINTAINENCE SPECIFICATION 
* 
*     NETWORK DUMP ANALYZER (NDA)          83/01/27 
* 
 #
*ENDIF
      BEGIN 
  
        XREF
          BEGIN 
          PROC ABORT;    #ABORT CONTROL POINT # 
          PROC MESSAGE;  #MESSAGE TO DAYFILE #
          PROC READSR;   #READ SEQUENTIAL FILE #
          PROC RECALL;   #PLACE ITEM IN RECALL STATUS # 
          PROC RETERN;   #RETURN DUMP INDEX AND DUMP FILES #
          PROC REWIND;   #REWIND FILE # 
          PROC WRITEF;   #WRITE END OF FILE # 
          PROC WRITEH;   #WRITE LINE TO OUTPUT #
          PROC WRITER;   #WRITE END OF RECORD ON FILE # 
          PROC WRITESR;  #WRITE SEQ FILE #
          PROC OPENSIO;  # OPEN SUPIO RANDOM FILE # 
          PROC CLOSSIO;  # CLOSE SUPIO RANDOM FILE #
          PROC FINDRI;   # SEARCH RECORD IDENT #
          PROC READRI;   # READ A RECORD BY RECORD IDENT #
          PROC WRITERI;  # WRITE A RECORD BY RECORD IDENT # 
          PROC READH;    # READ A LINE FROM INPUT # 
          PROC READ;     # READ A RECORD #
          PROC BKSP;     # BACKSPACE ONE RECORD # 
          PROC MOVE;     # MOVE A BLOCK OF MEMORY # 
          FUNC XCHD C(10);         # CONVERT OCTAL TO HEXADECIMAL # 
          FUNC XCDD C(10);         # CONVERT OCTAL TO DECIMAL # 
          FUNC XCOD C(10); #CONVERT OCTAL TO DISPLAY# 
          ITEM FDMP;     #DUMP FILES #
          ITEM OUTNDAS;  #OUTPUT FILE # 
          ITEM INPFIL;   # INPUT DIRECTIVE FILE # 
          ITEM NEUFILE;   # RANDOM WORKING FILE # 
          ITEM XLINP;    #LINES / PRINTER PAGE-- FROM SYSCOM# 
          END 
  
*CALL CRCOM 
# 
      DATA ITEMS USED IN NDA
# 
*CALL NDANSDD 
                                                          CONTROL EJECT;
          STATUS ECODE       #ERROR CODE INDEX FOR PARAMETERS # 
                 ILLPARAM,
                 ILLVAL,
                 NOVALUE, 
                 INVCHAR; 
  
*CALL SIODEFS 
  
  
          DEF LOCAL #3#;     # SEND MESSAGE TO LOCAL DAYFILE           #
          DEF NBWORD   #60#;     #NUMBER OF BITS IN ONE CM WORD # 
          DEF CWRDSIZE #10#;     #NUMBER OF CHARACTERS IN ONE CM WORD # 
          DEF LNSIZE    #16#;     #NO OF 16 BIT WORDS IN OUTPUT LINE #
          DEF DNTABL  #4#;         #MAX NUM OF DUMPS SELECTED - 1 # 
          DEF BIGPARM  #3#;        #MAX LENGTH OF ANY PARAMETER # 
          DEF PNLEN #6#;     #MAX NUM OF CHAR IN SOME VALUES #
          DEF DISZERO  #O"33"#;  #DISPLAY CODE FOR ZERO # 
          DEF DISNINE  #O"44"#;  #DISPLAY CODE FOR NINE # 
          DEF DISPLA  #O"01"#;    # DISPLAY CODE FOR A #
          DEF DISPLF  #O"06"#;    # DISPLAY CODE FOR F #
          DEF DISPLZ  #O"32"#;    # DISPLAY CODE FOR Z #
          DEF DISPLUS  #O"45"#;  #DISPLAY CODE FOR PLUS # 
          DEF BLANK    #" "#;    #CHARACTER BLANK # 
          DEF PARAREA  #O"2"#;   #LOC OF PARAM AREA # 
          DEF NUMPAREA  #O"64"#;   #LOC OF NUMBER OF PARAMS PRESENT # 
          DEF EQUAL  #O"02"#;      #EQUALS SIGN CODE #
          DEF CONT  #O"00"#;       #CONTINUATION MARK CODE #
          DEF COMMA  #O"01"#;      #COMMA CODE #
          DEF PARTERM  #O"17"#;    #PARAM TERMINATING CODE #
          DEF NR  #O"16220000000000"#;
          DEF LO  #O"14170000000000"#;
          DEF DN  #O"04160000000000"#;
          DEF NPU  #O"16202500000000"#; 
          DEF B  #O"02000000000000"#; 
          DEF E  #O"05000000000000"#; 
          DEF AD #O"01040000000000"#; 
          DEF OPTION # 0 #;  # MESSAGE DISPLAY TO SYSTEM AND LOCAL     #
                             #  DAYFILE AND A AND B DISPLAY            #
          DEF OUTFILE  #" OUTPUT"#; #NAME OF OUTPUT FILE #
          DEF DMPFILE  #"DMPFILE"#; #DUMP FILE ERROR NAME # 
          DEF DMPINDX  #"NDA4IND"#; #DIRECTORY FILE NAME #
          DEF OUTPUT   # OUTNDAS #; 
          DEF INPUT # INPFIL #; 
          DEF MAXTCB #50#;   # MAXIMUM NUMBER OF TCBS PER LCB # 
          DEF MAXPGREG # 10 #;     # MAX LENGTH OF PAGE REG IN CM WORDS#
  
      COMMON FDMPB; 
        BEGIN 
          ARRAY FDMPBF [0:O"3500"] S(1);  # CONTAINS 64*28 + 1         #
          BEGIN 
          ITEM FDMPBUF U(0,0,60); 
          END 
        END 
                                                          CONTROL EJECT;
  
  
      ITEM EBCDIC       B;           # *EBCDIC* CONVERSION FLAG # 
  
          ITEM ERRFLG  B=FALSE;  #ERROR ON CALL CARD FLAG#
          ITEM ERROR B=FALSE;  #EXIT LOOP-PROCESS ANOTHER DUMP FILE#
          ITEM ILLVALF B=FALSE;   # FLAGS ILLEGAL PARAMETER VALUE # 
          ITEM MACROMEM B=TRUE;    #LIST MACRO MEMORY FLAG #
          ITEM NONPU B=TRUE;   #FLAG TO INDICATE NO DUMPS FOUND#
          ITEM NOPARAM B=FALSE;    #ILLEGAL PARAMETER FLAG #
          ITEM NOTMAC B=FALSE;  # NOT MACRO MEMORY RECORD FLAG #
          ITEM PBUFIN B=FALSE;  # BUFIN IN ONEWORD NOT POINTED YET     #
          ITEM PREG B;       # PAGE REGISTER EXISTS FLAG               #
          ITEM PRINTIT B;    # INDICATES LINE IS NOT A DUPLICATE       #
          ITEM REGISTERS B=TRUE;   #LIST REGISTERS FLAG # 
          ITEM PAGEREG B=TRUE;         # LIST PAGE REGISTERS FLAG      #
          ITEM R7 B;         # TRUE IF ITS AN R7 DUMP FILE             #
          ITEM STATSRCH B;       #STATUS RECORD FLAG #
          ITEM WRCH B;             #FLAG TO INDICATE DUMP OF REMOTE NPU#
          ITEM INPDIR B=TRUE;      # FLAG TO INDICATE INPUT DIRECTIVE # 
          ITEM EXPAND B=FALSE;         # EXPAND LISTING FLAG #
          ITEM IEOF B=FALSE; # END OF FILE FLAG # 
          ITEM SUPERR B;     # SUPIO ERROR INDICATOR #
          ITEM HEADRB B;     # HEAD RECORD EXIST FLAG # 
          ITEM FILE1B B;     # FILE 1 RECORD EXIST FLAG # 
          ITEM NDFFIRSTRD B = TRUE;  # NDF FIRST READ INDICATOR        #
          ITEM IFIRSTRD B = TRUE;  # INPUT FILE FIRST READ INDICATOR   #
          ITEM STATRB B;     # STATUS RECORD EXIST FLAG # 
          ITEM CKSUMB B;     # CHECKSUM RECORD EXIST FLAG # 
          ITEM MACROB B;     # MACRO MEMORY EXIST FLAG #
          ITEM TEMPB B;      # TEMP FLAG #
          ITEM ERRIND B;     # ERROR FLAG # 
  
  
          ITEM IOSTAT U;         #STATUS RETURNED ON SUPIO FUNCTIONS #
          ITEM BEGADD  U=0;  #BEGINNING ADDRESS FOR FORM2 # 
          ITEM ENDADD  U=0;  #ENDING ADDRESS FOR FORM2 #
          ITEM CHNUM  U=0;   #VARIABLE SET FOR INPUT INTO XCOD# 
          ITEM EQNUM  U=0;   #VARIABLE SET FOR INPUT INTO XCOD# 
          ITEM CKSM U;           #INPUT ITEM FOR NUMBER CONVERSION #
          ITEM INWD U=0;     #DATA HOLDING VAR FOR PROC CALLS # 
          ITEM ASCN U;       #CHAR INDEX FOR ASCII OUTPUT # 
          ITEM DNI U;            #DUMP INDEX #
          ITEM SRCHIND U;    #DUMMY VARIABLE FOR SEARCH # 
          ITEM RECKEY U;     # RECORD KEY FOR RANDOM FILE # 
          ITEM RULES U;      # RULE FROM INPUT DIRECTIVES # 
          ITEM STATREC U;    # STATUS RECORD FROM DUMP FILE # 
          ITEM CKSUMREC U;   # CHECKSUM RECORD FROM DUMP FILE # 
          ITEM TEMPU1 U;     # TEMP AREA FOR U TYPE ITEM #
          ITEM TEMPU2 U;     # TEMP AREA FOR U TYPE ITEM #
          ITEM CCIND  I;     #CONVERSION BOUNDARY INDEX # 
          ITEM CIND     I;        #INDEX FOR SEARCH#
          ITEM DNTABIX I;         #INDEX #
          ITEM FINDI I ;           #INDEX # 
          ITEM FINDNEXT I;       #INDEX # 
          ITEM I I;                #INDEX # 
          ITEM ICD I;        # INDEX #
          ITEM IND I;        # INDEX #
          ITEM IX1    I;     #INDEX # 
          ITEM J I;              #INDEX # 
          ITEM K I;          #INDEX # 
          ITEM STIND I;          #INDEX # 
          ITEM CCOUNT I;           #CHAR COUNT FOR PARAMETERS # 
          ITEM CCOUNT2 I;    #HOLDS CHAR COUNT FOR PARAMETERS#
          ITEM RC I;             #REASON CODE RETURNED ON ATTACH CALL # 
          ITEM LENGTH I;         #LENGTH OF READ/WRITE BUFFER # 
          ITEM RCCT I;       # WAIT TIME BETWEEN ATTACH CALLS          #
  
          ITEM I01 I;        # INDEX #
          ITEM I02 I;        # INDEX #
          ITEM I03 I;        # INDEX #
          ITEM I04 I;        # INDEX #
          ITEM I05 I;        # INDEX #
          ITEM LOOP01 I;     # LOOP COUNTER # 
          ITEM LOOP02 I;     # LOOP COUNTER # 
          ITEM PAGENO I=0;   # CURRENT PAGE NUMBER IN OUTPUT LISTING #
          ITEM LINENO I;     # CURRENT LINE NUMBER IN OUTPUT LISTING #
          ITEM DUMMYI I;     # DUMMY INDEX #
          ITEM INSPLN I=16;  # INSTANCES PER LINE IN RULE 3 # 
          ITEM CBWPLN I=26;  # WORDS PER LINE # 
          ITEM WODPLN I=16;  # WORDS PER LINE IN OUTPUT # 
          ITEM LCBPLN I=8;   # NUMBER OF LCB PER LINE # 
          ITEM TCBPLN I=15;  # NUMBER OF TCB PER LINE # 
          ITEM PTBPLN I=8;   # PORT TABLES PER LINE # 
          ITEM TEMPC1 C(10); # TEMP AREA FOR C TYPE ITEM #
          ITEM TEMPC2 C(10); # TEMP AREA FOR C TYPE ITEM #
  
          ITEM TEMP C(10);   #HOLDS OCTAL VALUE TO BE CONVERTED#
          ITEM XNPU C(7) = 0;      #SPECIFIED NPU NAME #
          ITEM DFNAME C(8);   # NPU DUMP FILE NAME          # 
          ITEM FILEREC C(1);     #DUMP FILE RECORD TYPE CODE #
          ITEM BEGADDR C(6) = "      ";  #BEGIN ADDRESS IN HEX #
          ITEM ENDADDR C(6) = "      ";  #END ADDRESS IN HEX #
          ITEM GDATE C(7); # DATE PASSED BY NDA CALL                   #
  
          ARRAY ASCIITAB [0:127] S(1);   # ASCII CONVERSION TABLE      #
            BEGIN 
            ITEM ASCVAL U(0,54,6);
            ITEM ASCCHR C(0,54,1) = [ 
                                     32(" "), 
                                        " ",
                                        "!",
                                        """", 
                                        "#",
                                        "$",
                                        "%",
                                        "&",
                                        "'",
                                        "(",
                                        ")",
                                        "*",
                                        "+",
                                        ",",
                                        "-",
                                        ".",
                                        "/",
                                        "0",
                                        "1",
                                        "2",
                                        "3",
                                        "4",
                                        "5",
                                        "6",
                                        "7",
                                        "8",
                                        "9",
                                        ":",
                                        ";",
                                        "<",
                                        "=",
                                        ">",
                                        "?",
                                        "@",
                                        "A",
                                        "B",
                                        "C",
                                        "D",
                                        "E",
                                        "F",
                                        "G",
                                        "H",
                                        "I",
                                        "J",
                                        "K",
                                        "L",
                                        "M",
                                        "N",
                                        "O",
                                        "P",
                                        "Q",
                                        "R",
                                        "S",
                                        "T",
                                        "U",
                                        "V",
                                        "W",
                                        "X",
                                        "Y",
                                        "Z",
                                        "[",
                                        "\",
                                        "]",
                                        "^",
                                        "_",
                                        " ",
                                        "A",
                                        "B",
                                        "C",
                                        "D",
                                        "E",
                                        "F",
                                        "G",
                                        "H",
                                        "I",
                                        "J",
                                        "K",
                                        "L",
                                        "M",
                                        "N",
                                        "O",
                                        "P",
                                        "Q",
                                        "R",
                                        "S",
                                        "T",
                                        "U",
                                        "V",
                                        "W",
                                        "X",
                                        "Y",
                                        "Z",
                                      5(" ")
                                    ];
            END 
  
      ARRAY EBCDICTAB [0:255] S(1);  # *EBCDIC* CONVERSION TABLE #
        BEGIN 
        ITEM EBCDVAL    U(00,54,06) = 
          [ 
          72(O"55"),                                        # 00 - 47 # 
          O"55",O"55",O"61",O"57",O"72",O"51",O"45",O"66",  # 48 - 4F # 
          O"67",O"55",O"55",O"55",O"55",O"55",O"55",O"55",  # 50 - 57 # 
          O"55",O"55",O"62",O"53",O"47",O"52",O"77",O"76",  # 58 - 5F # 
          O"46",O"50",O"55",O"55",O"55",O"55",O"55",O"55",  # 60 - 67 # 
          O"55",O"55",O"75",O"56",O"63",O"65",O"73",O"71",  # 68 - 6F # 
          8(O"55"),                                         # 70 - 77 # 
          O"55",O"74",O"00",O"60",O"74",O"70",O"54",O"64",  # 78 - 7F # 
          O"55",O"01",O"02",O"03",O"04",O"05",O"06",O"07",  # 80 - 87 # 
          O"10",O"11",O"55",O"55",O"55",O"55",O"55",O"55",  # 88 - 8F # 
          O"55",O"12",O"13",O"14",O"15",O"16",O"17",O"20",  # 90 - 97 # 
          O"21",O"22",O"55",O"55",O"55",O"55",O"55",O"55",  # 98 - 9F # 
          O"55",O"76",O"23",O"24",O"25",O"26",O"27",O"30",  # A0 - A7 # 
          O"31",O"32",O"55",O"55",O"55",O"55",O"55",O"55",  # A8 - AF # 
          16(O"55"),                                        # B0 - BF # 
          O"61",O"01",O"02",O"03",O"04",O"05",O"06",O"07",  # C0 - C7 # 
          O"10",O"11",O"55",O"55",O"55",O"55",O"55",O"55",  # C8 - CF # 
          O"62",O"12",O"13",O"14",O"15",O"16",O"17",O"20",  # D0 - D7 # 
          O"21",O"22",O"55",O"55",O"55",O"55",O"55",O"55",  # D8 - DF # 
          O"75",O"55",O"23",O"24",O"25",O"26",O"27",O"30",  # E0 - E7 # 
          O"31",O"32",O"55",O"55",O"55",O"55",O"55",O"55",  # E8 - EF # 
          O"33",O"34",O"35",O"36",O"37",O"40",O"41",O"42",  # F0 - F7 # 
          O"43",O"44",O"55",O"55",O"55",O"55",O"55",O"55",  # F8 - FF # 
          ];
        END 
  
          ITEM HEAD C(140)="0ADDRESS  0     1     2     3     4     5 
  6     7     8     9     A     B     C     D     E     F   ";
                                 #ADDRESS HEADER FOR OUTPUT OF DUMP # 
          ITEM TTL1 C(70)="1                                        BASE
 FILE 1 REGISTERS        ";            # REPORT HEADING # 
          ITEM TTL4 C(60)="1
 MACRO MEMORY  ";                #REPORT HEADING #
          ITEM TTL2 C(60)="1                                           P
AGE REGISTERS  ";              # REPORT HEADER                         #
           CONTROL EJECT; 
  
*CALL SIOBASE 
  
          BASED ARRAY CPARAMS;
            BEGIN            #IMAGE OF CALL PARAMETER AREA #
            ITEM CPARCODE U(0,56,4);
            ITEM CPARREC U(0,0,42); 
            ITEM CPARVAL C(0,0,7);
            END 
  
          BASED ARRAY PRA64;
            BEGIN            #PARAMETER COUNT AREA #
            ITEM NOCPWDS U(0,42,18);
            END 
  
          BASED ARRAY CCARD [0:0] S(1); 
            BEGIN            #CONTROL CARD IMAGE #
            ITEM CCRD C(0,0,80);
            END 
  
  
          ARRAY TTL [0:0] S(14);
            BEGIN            # HEADING INFORMATION #
            ITEM TTL0 C(0,0,100); 
            ITEM TTL01 C(10,0,17)=[" "];
            ITEM TTL02 C(11,42,4)=["PAGE"]; 
            ITEM PAGNUM C(12,6,8);   # PAGE NUMBER #
            ITEM TTL03 C(12,54,9)=[" "];
            ITEM TTL04 U(13,42,18)=[0]; 
            END 
  
          ARRAY INPBUF [0:0] S(8);
            BEGIN            # INPUT BUFFER FOR INPUT DIRECTIVE FILE #
            ITEM INPBUFC C(0,0,80);  # INPUT DIRECTIVE STRING # 
            ITEM RULEI   C(0,0,1);   # RULE SPECIFIED IN DIRECTIVE #
            END 
  
          ARRAY HEADREC [0:2] S(1); 
            BEGIN            # SAVE AREA FOR HEAD RECORD IN DUMP FILE # 
            ITEM HEADREC0 U(0,0,60);
            END 
  
          ARRAY FILE1REC [0:70] S(1); 
            BEGIN            # SAVE AREA FOR FILE 1 RECORD IN DUMP FILE#
            ITEM FILE1REC1 U(0,0,60); 
            END 
  
          ARRAY PAGREGREC [0:10] S(1);
            BEGIN            # SAVE AREA FOR PAGE REGISTER IN DUMP FILE#
            ITEM PAGREGREC1 U(0,0,60);
            END 
  
          ARRAY PARAMI [0:15] S(1); 
            BEGIN            # INPUT PARAMETERS IN DIRECTIVE #
            ITEM PARAMT U(0,0,60);
            END 
  
          ARRAY OUTBUF [0:0] S(14); 
            BEGIN            # WORKING AREA FOR FILE OUTPUT # 
            ITEM CCNTRL C(0,0,1) = [" "];      # CARRIAGE CONTROL # 
            ITEM STRING C(0,0,137)=[" "]; 
            ITEM ZEROED U(13,42,18) = [0];     # ZERO FILLED #
            END 
  
          BASED ARRAY DMPBUF [0:BUFLEN] S(1); 
            BEGIN            #DUMP FILE RECORDS # 
              ITEM DMPWD U(0,0,60); 
            END 
          ARRAY DMPBUF1 [0:BUFLEN] S(1);
            BEGIN            # CIO BUFFER AREA FOR DUMP FILE RECORD # 
              ITEM DMPWD1 U(0,0,60);
            END 
  
          ARRAY DMPBUF2 [0:BUFLEN] S(1);
            BEGIN            # CIO BUFFER AREA FOR DUMP FILE #
              ITEM DMPWD2 U(0,0,60);
            END 
  
  
          ARRAY BUFIND [0:15] S(1); 
            BEGIN            #INDEX INTO 16 WORD BUFFER # 
              ITEM BUFWD U(0,0,30)=[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,4]; 
              ITEM BUFBIT U(0,30,30)=[0,16,32,48,4,20,36,52,8,24,40,56, 
                                      12,28,44,0];
            END 
  
          ARRAY PARMSG [0:0] S(4);     #ERROR MESSAGE OUTPUT FORMAT#
            BEGIN 
              ITEM ERRMESS  C(0,0,30); #ERROR MESSAGE TEXT# 
              ITEM ERRPARAM C(3,0,7);  #PARAMETER IN ERROR# 
              ITEM ENDBLK   U(3,42,18)=[0]; #ZERO FILL REST OF WORD#
            END 
  
          ARRAY BLLINE [0:0] S(3);
            BEGIN            # PRINT 3 BLANK LINES  # 
              ITEM BLFILL C(0,0,30) = [O"00"];
            END 
  
  
          ARRAY PRDN [0:0] S(10); 
            BEGIN            #PRINT DUMP NUMBER AND CALL CARD IMAGE # 
              ITEM PRDN1 C(0,0,17)=["1NPU DUMP FILE = "]; 
              ITEM PRDN2 C(1,42,8); 
              ITEM PRDN3 C(2,0,60) = [" "];      # CARD IMAGE          #
              ITEM NDAVER C(8,0,13) = [" NDA VER 2.0-"];  #NDA VERSION #
              ITEM NDALEV C(9,18,5);                      # AND LEVEL  #
              ITEM NDAZR C(9,48,2) = ["  "];
            END 
  
          ARRAY PRDATE [0:0] S(2);
            BEGIN            #DATE DUMP WAS GENERATED # 
              ITEM PRDATE1 C(0,0,12)=["0DATE       "];
              ITEM PRDATE2 C(1,12,8); 
            END 
  
          ARRAY PRNPU [0:0] S(2); 
            BEGIN            #NPU NAME OF DUMP #
              ITEM PRNPU1 C(0,0,12)=["0NPU NAME   "]; 
              ITEM PRNPU2 C(1,12,7);
              ITEM PRNPU3 C(1,54,1)=[" "];
            END 
  
          ARRAY PRTIME [0:0] S(2);
            BEGIN            #TIME DUMP WAS GENERATED # 
              ITEM PRTIME1 C(0,0,12)=["0TIME       "];
              ITEM PRTIME2 C(1,12,7); 
              ITEM PRTIME3 C(1,54,1); 
            END 
  
      ARRAY PRNNODE [0:0] S(2); 
        BEGIN 
        ITEM PRNNODE1 C(0,0,15) = ["0NPU NODE     "]; 
        ITEM PRNNODE2 C(1,12,2);
        ITEM PRNNODEZ U(1,30,30) = [ 0 ]; 
        END 
  
      ARRAY PRHALT [0:0] S(2);
        BEGIN 
        ITEM PRHALT1 C(0,0,16) = ["0HALT CODE      "];
        ITEM PRHALT2 C(1,12,4); 
        ITEM PRHALTZ U(1,36,24) = [ 0 ];
        END 
  
      ARRAY PRPREG [0:0] S(2);
        BEGIN 
        ITEM PRPREG1 C(0,0,16) = ["0P REGISTER     "];
        ITEM PRPREG2 C(1,12,4); 
        ITEM PRPREGZ U(1,36,24) = [ 0 ];
        END 
  
          ARRAY SEQLINE [0:0] S(4); 
            BEGIN 
              ITEM SEQQ C(0,0,40)=["-*****RECORD SEQUENCING ERROR*****
    "]; 
            END 
  
      ARRAY PRCOMP [0:0] S(5);
        BEGIN 
        ITEM PRCOMP1 C(0,0,31) =
          ["PROCESSING COMPLETE ON XXXXXXX."];
        ITEM PRCOMP2 C(2,18,7); 
        ITEM PRCOMPZ U(3,6,54) = [ 0 ]; 
        END 
  
          ARRAY ERRARRY [0:3] S(3); # ARRAY OF ERROR MESSAGES # 
            ITEM ERRTEXT C(0,0,30) =
              ["   ILLEGAL NDA CALL PARAMETER ",
               "  PARAMETER VALUE ILLEGAL FOR ",
               "   VALUE NEEDED FOR PARAMETER ",
               " INVALID CHARACTER AFTER ITEM "]; 
  
  
          ARRAY WRERR [0:0] S(5); 
            BEGIN            # ERROR MESSAGE FOR SUPIO #
              ITEM WRMESS C(0,0,32)=["   I/O ERROR      IN         ON"];
              ITEM WRCODE C(1,18,4);   # ERROR CODE # 
              ITEM WRFILE C(2,6,7);    # FILE NAME #
              ITEM WRREC C(3,12,8);    # ACTION # 
              ITEM WRZERO U(4,0,60)=[0];
            END 
  
          ARRAY OUTBUFI  [0:0] S(9);
            BEGIN            # A COPY OF DIRECTIVE WHEN ERROR # 
              ITEM CCNTRLI  C(0,0,1)=[" "];      # CARRIAGE CONTROL # 
              ITEM INPBUFD  C(0,6,80);
              ITEM ZEROI1   U(8,6,54)=[0];
            END 
  
          ARRAY HEADERR [0:0] S(5); 
            BEGIN            # HEADER RECORD MISSING IN DUMP FILE # 
              ITEM HEADERR1 C(0,0,48)=["1*** ERROR --- HEAD RECORD NOT I
N DUMP FILE. ***"]; 
              ITEM HEADERR2 U(4,48,12)=[0]; 
            END 
  
          ARRAY DIRMES1  [0:0] S(6);
            BEGIN            # DIRECTIVE ERROR MESSAGE #
              ITEM DIRMES12 C(0,6,20)=["*** ERROR IN FIELD ("]; 
              ITEM ERRFIELD C(2,6,5);  # ERROR FIELD #
              ITEM DIRMES13 C(2,36,25)=["), MUST BE 5 HEX. DIGITS."]; 
              ITEM ZEROI2   U(5,6,54)=[0];
            END 
  
          ARRAY DIRMES2  [0:0] S(6);
            BEGIN            # DIRECTIVE ERROR MESSAGE #
              ITEM DIRMES21 C(0,0,1)=["0"]; 
              ITEM DIRMES22 C(0,6,20)=["*** ERROR IN COLUMN "]; 
              ITEM DIRMES23 C(2,6,4);  # ERROR FIELD #
              ITEM DIRMES24 C(2,30,25)=[", MUST BE BLANK OR COMMA."]; 
              ITEM ZEROI3   U(5,0,60)=[0];
            END 
  
          ARRAY COL1ERR [0:0] S(5); 
            BEGIN  # RULE ERROR IN DIRECTIVE #
              ITEM COL1ER1 C(0,0,42)=[" *** ERROR IN INPUT DIRECTIVE COL
UMN 1 ***"];
              ITEM COL1ER2 U(4,12,48)=[0];
            END 
  
          ARRAY CBSERR [0:0] S(6);
            BEGIN            # CONTINUOUS STRUCTURES DIRECTIVE ERROR #
              ITEM CBSER1 C(0,0,51)=[" PARAMETER FIRST IS GREATER THAN L
AST IN DIRECTIVE."];
              ITEM CBSER2 U(5,06,54)=[0]; 
            END 
  
          ARRAY CIOERR [0:0] S(7);
            BEGIN            # CIRCULAR BUFFER DIRECTIVE ERROR #
              ITEM CIOER1 C(0,0,60)=[" PARAMETER OLDEST MUST BE BETWEEN 
FWA AND LWA OF CIO BUFFER."]; 
              ITEM CIOER2 I(6,00,60)=[0]; 
            END 
  
          ARRAY NOMEAN [0:0] S(4);
            BEGIN            # NO MEANINGFUL DATA IN CIO BUFFER # 
              ITEM NOMEA1 C(0,0,38)=[" *** NO MEANINGFUL DATA IN BUFFER 
 ***"]; 
              ITEM NOMEA2 U(3,48,12)=[0]; 
            END 
  
          ARRAY CIOLIM [0:0] S(4);
            BEGIN            # SIZE EXCEED CIO BUFFER LIMIT # 
              ITEM CIOLI1 C(0,0,38)=[" *** SIZE EXCEED CIO BUFFER LIMIT.
 ***"]; 
              ITEM CIOLI2 U(3,48,12)=[0]; 
            END 
  
          ARRAY NOPATT [0:0] S(4);
            BEGIN            # DESIRED PATTERN NOT FOUND #
              ITEM NOPAT1 C(0,0,35)=[" *** DESIRED PATTERN NOT FOUND ***
 "];
              ITEM NOPAT2 U(3,30,30)=[0]; 
            END 
  
          ARRAY LCBERR [0:0] S(7);
            BEGIN 
              ITEM LCBER1 C(0,0,63)=[" PARAMETER FTCB/NTCB MUST BE LESS 
THAN LCBL/TCBL IN DIRECTIVE. "];
              ITEM LCBER2 U(6,18,42)=[0]; 
            END 
  
          ARRAY TCBERR [0:0] S(6);
            BEGIN            # TCB CHAINS EXCEED MAXIMUM #
              ITEM TCBER1 C(0,0,50)=[" TCB CHAINS EXCEED MAXIMUM NUMBER 
OF TCBS PER LCB."]; 
              ITEM TCBER2 U(5,0,60)=[0];
            END 
  
          ARRAY PTBERR [0:0] S(6);
            BEGIN            # PORT TABLE DIRECTIVE ERROR # 
              ITEM PTBER1 C(0,0,50)=[" PARAMETER MUXP AND/OR MUXID IS GR
EATER THAN PTTL."]; 
              ITEM PTBER2 U(5,0,60)=[0];
            END 
  
*CALL NAMLEV
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*     1. PROC NAME:             AUTHOR:               DATE: 
*        NDAS                E. SULLIVAN            77/01/31
*                            JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        NDAS IS THE MAIN ENTRY POINT INTO THE SYMPL PORTION OF NDA.
*        THIS PROCEDURE CONTROLS THE TOP LEVEL OF NDA PROCESSING. 
* 
*     3. METHOD USED: 
*        CALL THE ROUTINE (CRACK) TO CHECK THE NDA CALL PARAMETERS. 
*        IF I PARAMETER IS SPECIFIED, THE INPUT DIRECTIVES ARE
*        COPIED ONTO THE OUTPUT FILE. 
*        IF THERE ARE NO ERRORS, THEN DUMPS ARE PROCESSED.  DNPROC IS 
*        CALLED TO PROCESS THE DUMP INFORMATION.
* 
*     4. ENTRY PARAMETERS:  
*        NONE 
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        CRACK      CONTROL CARD CRACKING PROCEDURE - SYMPL 
*        DNPROC     PROCESS DUMP FILE - SYMPL 
*        READDIR    COPY INPUT DIRECTIVES TO OUTPUT 
*        RETERN     RETURN FILE 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
      BEGIN 
  
      XREF
        ITEM ZZZZINP; 
  
      ITEM EOF B = FALSE;    # END OF INPUT DUMP FILE INDICATOR        #
  
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
      CRACK;
      IF INPDIR 
      THEN                   # COPY INPUT DIRECTIVES TO OUTPUT FILE    #
        READDIR;
      FOR I = 1 WHILE NOT EOF DO
        BEGIN 
        DNPROC(EOF);
        END 
      RETERN(ZZZZINP);
      END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        CRACK               E. SULLIVAN            77/01/31
*                            W. L. CHENG            80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        PROCESS NDA CALL PARAMETERS. 
* 
*     3. METHOD USED: 
*        THE CRACKED PARAMETER AREA AT RA+2 IS USED TO DETERMINE
*        THE VALIDITY AND VALUE OF PARAMETERS PRESENT. THE ENTIRE 
*        PARAMETER LIST IS EXAMINED EACH TIME CRACK IS CALLED.
*        VALID PARAMETERS CAUSE FLAGS TO BE SET AND/OR VALUES TO
*        BE PLACED IN CERTAIN VARIABLES.  ANY ERROR CAUSES NDA TO 
*        ABORT. 
* 
*     4. ENTRY PARAMETERS:  
*        NONE 
* 
*     5. EXIT PARAMETERS: 
*        INPUTFN   CONTAINS THE NAME OF DIRECTIVE FILE
*        BEGADD    CONTAINS BEGINNING DUMP ADDRESS OF MACRO MEMORY
*        ENDADD    CONTAINS ENDING DUMP ADDRESS OF MACRO MEMORY 
*        REGISTERS FALSE IF FILE REGISTER DUMP NOT WANTED 
*        MACROMEM  FALSE IF MACRO MEMORY DUMP NOT WANTED
*        INPDIR    TRUE  IF DIRECTIVE PROCESSING SELECTED 
*        EXPAND    TRUE  IF EXPANSION OF DUPLICATE LINES SPECIFIED
* 
*     6. COMDECKS CALLED
*        NONE 
* 
*     7. ROUTINES CALLED
*        FINDZERO  GET LENGTH OF CURRENT PARAMETER/VALUE - SYMPL
*        BADPARM   PROCESS CALL PARAMETER ERRORS - SYMPL
*        DISHEX    CONVERT DISPLAY CODE TO HEXADECIMAL - SYMPL
*        MESSAGE   WRITE MESSAGE TO DAYFILE - SUPIO 
*        PRDFILE   FLUSH OUTPUT BUFFER TO ASSURE DAYFILE - SYMPL
*        ABORT     ABORT PROGRAM - MACREL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
      PROC CRACK; 
        BEGIN                # NDA CALL PARAMETERS CRACKING # 
          XREF
            BEGIN 
            ITEM INPUT U; 
            ITEM NDF U; 
            ITEM OUTPUT U;
            END 
  
          DEF NDAPARN   # 7 #;       # MAX NUMBER OF *NDA* PARAMETERS # 
  
          SWITCH PAR$RTN ER$RTN,L$RTN,NDF$RTN,BA$RTN,EA$RTN,
                         LO$RTN,CV$RTN,I$RTN; 
          ARRAY NDAPAR[1:NDAPARN];
            BEGIN            # LEGAL KEYWORDS IN NDA CALL STATEMENT # 
              ITEM NDAPARM U(0,0,42)=[O"14000000000000",    # L   # 
                                      O"16040600000000",    # NDF # 
                                      O"02010000000000",    # BA  # 
                                      O"05010000000000",    # EA  # 
                                      O"14170000000000",    # LO  # 
                                      O"03260000000000",    # CV #
                                      O"11000000000000"];   # I   # 
            END 
          ITEM ERFLAG B;     # ERROR FLAG # 
  
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          P<CPARAMS> = PARAREA;    # PARAMETER AREA STARTS FROM RA+2   #
          P<PRA64> = NUMPAREA;     # AREA HOLDING NUMBER OF PARAMETERS #
  
          EBCDIC = FALSE;            # PRESET *ASCII* CONVERSION #
  
          DNTABIX = 0;
          IF NOCPWDS NQ 0          # ANY PARAMETER IN CALL STATEMENT   #
          THEN
            FOR I=0 STEP 1 UNTIL NOCPWDS
            DO
              BEGIN                # EXAMINE PARAMETER AREA            #
                NOPARAM = FALSE;
                FINDZERO((CPARVAL[I]),CCOUNT);
                IF CCOUNT GR BIGPARM
                THEN               # TOO MANY CHARACTERS IN PARAMETER  #
                  BADPARM(ECODE"ILLPARAM",(CPARVAL[I]),CCOUNT); 
                ELSE
                  BEGIN 
                    I02 = 0;
                    FOR I01 = 1 STEP 1 UNTIL NDAPARN
                    DO             # SEARCH LEGAL PARAMETER ARRAY # 
                      IF CPARREC[I] EQ NDAPARM[I01] 
                      THEN
                        BEGIN 
                          I02 = I01;
                          I01 = NDAPARN;
                        END 
                    GOTO PAR$RTN[I02];   # GO TO CORRESPONDING ROUTINE #
 TESTTER:                          # TEST FOR TERMINATING CHARACTER # 
                    IF CPARCODE[I] EQ COMMA 
                    THEN           # COMMA FOLLOWS PARAMETER, OK #
                      TEST I; 
                    IF CPARCODE[I] EQ PARTERM 
                    THEN           # QUIT PARMETER PROCESSING # 
                      BEGIN 
                        I = NOCPWDS;
                        TEST I; 
                      END 
                    IF NOT NOPARAM
                    THEN           # INVALID IF OTHER THAN , OR ) # 
                      BADPARM(ECODE"INVCHAR",(CPARVAL[I]),CCOUNT);
                    I = I + 1;
                    FOR FINDI=I STEP 1 UNTIL NOCPWDS
                    DO
                      BEGIN 
                        IF CPARCODE[FINDI] EQ COMMA 
                        THEN       # COMMA FOUND #
                          BEGIN 
                            I = FINDI;
                            FINDI = NOCPWDS;
                            TEST FINDI; 
                          END 
                        IF CPARCODE[FINDI] EQ PARTERM 
                        THEN       # TERMINATOR FOUND # 
                          BEGIN 
                            I = NOCPWDS;
                            FINDI = NOCPWDS;
                          END 
                      END  #FINDI#
                  END 
              END  #I#
          IF BEGADDR NQ "      "
          THEN                     # CONVERT DISPLAY TO HEX # 
            DISHEX(BEGADDR,BEGADD,6,ERFLAG);
          ELSE
            BEGADD = 0; 
          IF ENDADDR NQ "      "
          THEN                     # CONVERT DISPLAY TO HEX # 
            DISHEX(ENDADDR,ENDADD,6,ERFLAG);
          ELSE
            ENDADD = O"777777"; 
          IF BEGADD GR ENDADD 
          THEN
            BEGIN 
              ERRMESS[0] = ERRTEXT[1];
              ERRPARAM[0] = "BA/EA  ";  # BA/EA VALUE IS INVALID #
              MESSAGE(PARMSG,OPTION); 
              PRDFILE;             # FLUSH BUFFER TO ASSURE DAYFILE # 
              ABORT;
            END 
          IF ERRFLG 
          THEN               # ERROR IN CRACKING PARAMETERS # 
            ABORT;
          RETURN;                  # RETURN TO MAIN PROC #
 ER$RTN:                           # PARAMETER NOT RECOGNIZED # 
          BADPARM(ECODE"ILLPARAM",(CPARVAL[I]),CCOUNT); 
          GOTO TESTTER; 
 L$RTN:                      # L PARAMETER WAS SPECIFIED               #
          IF CPARCODE[I] NQ EQUAL 
          THEN               # NO VALUE WAS SPECIFIED                  #
            BEGIN 
            BADPARM(ECODE"NOVALUE",(CPARVAL[I]),CCOUNT);
            END 
          ELSE               # AN EQUAL SIGN WAS PRESENT               #
            BEGIN 
            CCOUNT2 = CCOUNT; 
            I = I + 1;
            FINDZERO((CPARVAL[I]),CCOUNT);  # GET PARAMETER LENGTH     #
            FOR J = 0 STEP 1 UNTIL CCOUNT - 1 DO
              BEGIN          # CHECK FOR VALID FILE NAME               #
              IF ( C<J,1>CPARVAL[I] LS DISPLA ) OR
                ( C<J,1>CPARVAL[I] GR DISNINE ) 
              THEN           # ILLEGAL FILE NAME                       #
                BEGIN 
                BADPARM(ECODE"ILLVAL",CPARVAL[I-1],CCOUNT2);
                GOTO TESTTER; 
                END 
              END 
            P<SIOFET> = LOC(OUTPUT);
            FETLFN[0] = C<0,7>CPARVAL[I]; 
            END 
          GOTO TESTTER; 
 NDF$RTN: 
          IF CPARCODE[I] NQ EQUAL 
          THEN               # NO VALUE WAS SPECIFIED                  #
            BEGIN 
            BADPARM(ECODE"NOVALUE",(CPARVAL[I]),CCOUNT);
            END 
          ELSE
            BEGIN 
            CCOUNT2 = CCOUNT; 
            I = I + 1;
            FINDZERO((CPARVAL[I]),CCOUNT);  # GET PARAMETER LENGTH     #
            FOR J = 0 STEP 1 UNTIL CCOUNT - 1 DO
              BEGIN          # CHECK FOR VALID FILE NAME               #
              IF (C<J,1>CPARVAL[I] LS DISPLA) OR
                (C<J,1>CPARVAL[I] GR DISNINE) 
              THEN           #ILLEGAL FILE NAME                        #
                BEGIN 
                BADPARM(ECODE"ILLVAL",CPARVAL[I-1],CCOUNT2);
                GOTO TESTTER; 
                END 
              END 
            P<SIOFET> = LOC(NDF); 
            FETLFN[0] = C<0,7>CPARVAL[I]; 
            END 
          GOTO TESTTER; 
 BA$RTN:  
 EA$RTN:                           # KEYWORDS BA/EA ARE PROCESS HERE #
          IF CPARCODE[I] NQ EQUAL 
          THEN                     # VALUE EXPECTED FOLLOWED BY = # 
            BADPARM(ECODE"NOVALUE",(CPARVAL[I]),CCOUNT);
          ELSE
            BEGIN 
              CCOUNT2 = CCOUNT; 
              I = I + 1;
              FINDZERO((CPARVAL[I]),CCOUNT);
              K = 0;
              FOR J=0 STEP 1 UNTIL CCOUNT - 1 
              DO
                BEGIN              # CHECK IF VALUE IS LEGAL HEX DIGIT #
                  K = B<J*6,6>CPARVAL[I]; 
                  IF ((K LS DISZERO) OR (K GR DISNINE)) AND 
                     ((K LS DISPLA) OR (K GR DISPLF)) 
                  THEN
                    ILLVALF = TRUE; 
                END 
              IF CCOUNT GR PNLEN OR ILLVALF 
              THEN
                BEGIN              # ILLEGAL VALUE FOUND #
                  ILLVALF = FALSE;
                  BADPARM(ECODE"ILLVAL",(CPARVAL[I-1]),CCOUNT2);
                END 
              ELSE
                BEGIN              # SAVE PARAMETER IN BEGADDR,ENDADDR #
                  IF I02 EQ 3 
                  THEN             # MUST BE B PARAMETER #
                    BEGIN 
                      C<0,6>BEGADDR = "000000"; 
                      C<6-CCOUNT,CCOUNT>BEGADDR = C<0,CCOUNT>CPARVAL[I];
                    END 
                  ELSE
                    BEGIN 
                      C<0,6>ENDADDR = "000000"; 
                      C<6-CCOUNT,CCOUNT>ENDADDR = C<0,CCOUNT>CPARVAL[I];
                    END 
                END 
            END 
          GOTO TESTTER; 
 LO$RTN:                           # LIST OPTION SPECIFIED #
          IF CPARCODE[I] NQ EQUAL  # NO EQUAL SIGN, CHECK AGAIN # 
          THEN
            BADPARM(ECODE"NOVALUE",(CPARVAL[I]),CCOUNT);
          ELSE
            BEGIN 
              REGISTERS = FALSE;   # RESET LIST OPTIONS AT FIRST #
              MACROMEM = FALSE; 
              PAGEREG = FALSE;
              CCOUNT2 = CCOUNT; 
              I = I + 1;
              FINDZERO((CPARVAL[I]),CCOUNT);  # EXAMINE OPTIONS # 
              IF CCOUNT GR BIGPARM
              THEN
                BADPARM(ECODE"ILLVAL",(CPARVAL[I-1]),CCOUNT2);
              ELSE
                BEGIN 
                FOR CCIND=0 STEP 1 UNTIL CCOUNT - 1 
                DO
                  BEGIN 
                  IF C<CCIND,1>CPARVAL[I] EQ "R"
                  THEN
                    BEGIN 
                    REGISTERS = TRUE; 
                    PAGEREG = TRUE; 
                    END 
                  ELSE
                    BEGIN 
                    IF C<CCIND,1>CPARVAL[I] EQ "M"
                    THEN
                      MACROMEM = TRUE;
                    ELSE
                      BEGIN 
                      IF C<CCIND,1>CPARVAL[I] EQ "E"
                      THEN
                        EXPAND = TRUE;
                      ELSE
                        BADPARM(ECODE"ILLVAL",(CPARVAL[I-1]),CCOUNT2);
                      END 
                    END 
                  END 
                END 
              IF EXPAND AND NOT REGISTERS AND NOT MACROMEM
              THEN
                BEGIN 
                REGISTERS = TRUE; 
                MACROMEM = TRUE;
                PAGEREG = TRUE; 
                END 
            END 
          GOTO TESTTER; 
  
CV$RTN:                              # CONVERSION MODE SPECIFIED #
  
          IF CPARCODE[I] NQ EQUAL 
          THEN                       # PARAMETER NOT EQUIVALENCED # 
            BEGIN 
            BADPARM(ECODE"NOVALUE",(CPARVAL[I]),CCOUNT);
            GOTO TESTTER;            # TEST FOR TERMINATOR #
            END 
  
          I = I + 1;                 # SET INDEX TO PARAMETER VALUE # 
          FINDZERO((CPARVAL[I]),CCOUNT);  # GET SIZE OF VALUE # 
  
          IF CCOUNT NQ 2
            OR ((C<0,2>CPARVAL[I] NQ "AS")
              AND (C<0,2>CPARVAL[I] NQ "EB")) 
          THEN                       # ILLEGAL VALUE FOR PARAMETER #
            BEGIN 
            BADPARM(ECODE"ILLVAL",CPARVAL[I-1],2);
            GOTO TESTTER;            # TEST FOR TERMINATOR #
            END 
  
          IF C<0,2>CPARVAL[I] EQ "EB" 
          THEN                       # *EBCDIC* CONVERSION SELECTED # 
            BEGIN 
            EBCDIC = TRUE;           # SET *EBCDIC* CONVERSION FLAG # 
            END 
  
          GOTO TESTTER;              # TEST FOR TERMINATOR #
  
 I$RTN:                            # DIRECTIVE EXISTENCE ACKNOWLEDGED # 
          IF CPARCODE[I] NQ EQUAL 
          THEN
            IF (CPARCODE[I] EQ PARTERM) OR (CPARCODE[I] EQ COMMA) 
            THEN
              INPDIR = TRUE;
            ELSE
              BADPARM(ECODE"NOVALUE",(CPARVAL[I]),CCOUNT);
          ELSE
            BEGIN 
              I = I + 1;
              FINDZERO((CPARVAL[I]),CCOUNT);
              IF (CCOUNT EQ 1) AND (C<0,1>CPARVAL[I] EQ DISZERO)
              THEN           # I=0, NO DIRECTIVE FILE                  #
                BEGIN 
                INPDIR = FALSE; 
                GOTO TESTTER; 
                END 
              FOR J = 0 STEP 1 UNTIL CCOUNT - 1 DO
                BEGIN        # CHECK FOR VALID FILE NAME               #
                IF ( C<J,1>CPARVAL[I] LS DISPLA ) 
                  OR ( C<J,1>CPARVAL[I] GR DISNINE )
                THEN         # ILLEGAL FILE NAME                       #
                  BEGIN 
                  BADPARM(ECODE"ILLVAL",CPARVAL[I-1],1);
                  GOTO TESTTER; 
                  END 
                END 
              P<SIOFET> = LOC(INPUT); 
              FETLFN[0] = C<0,7>CPARVAL[I]; 
              INPDIR = TRUE;
            END 
          GOTO TESTTER; 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        BADPARM             E. SULLIVAN            77/01/31
*                            W. L. CHENG            80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        OUTPUTS ERROR MESSAGES FROM PARAMETER PROCESSING DEPENDING ON
*        THE CODE PASSED TO IT FROM CRACK.
* 
*     3. METHOD USED
*        THE ERROR MESSAGE CODE PASSED FROM CRACK TO BADPARM INDICATES
*        WHICH ERROR MESSAGE IS TO BE OUTPUT.  IF THE PARAMETER WAS 
*        NOT LEGAL, A FLAG IS SET SO THAT ONLY ONE ERROR MESSAGE FOR
*        THE PARAMETER WILL BE OUTPUT.
* 
*     4. ENTRY PARAMETERS:  
*        NUMBER    SUBSCRIPT INDICATING WHICH ERROR HAS OCCURRED
*        VALUE     PARAMETER/VALUE IN ERROR 
*        COUNT     NUMBER OF CHARACTERS IN VALUE
* 
*     5. EXIT PARAMETERS: 
*        ERRFLG    SET TRUE 
*        NOPARAM   SET TRUE TO INDICATE CURRENT PARAM IS ILLEGAL
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        MESSAGE   WRITE MESSAGE TO DAYFILE - SUPIO 
*        PRDFILE   FLUSH OUTPUT BUFFER TO ASSURE DAYFILE MESSAGE- SYMPL 
* 
*     8. DAYFILE MESSAGES:  
*        ILLEGAL NDA CALL PARAMETER XXXXXXX            FATAL ERROR
*        PARAMETER VALUE ILLEGAL FOR XXXXXXX           FATAL ERROR
*        VALUE NEEDED FOR PARAMETER XXXXXXX            FATAL ERROR
*        INVALID CHARACTER AFTER ITEM XXXXXXX          FATAL ERROR
* 
 #
*ENDIF
      PROC BADPARM(NUMBER,(VALUE),COUNT); 
        BEGIN 
          ITEM NUMBER I;          #ERROR MESSAGE SUBSCRIPT# 
          ITEM VALUE  I;          #PARAMETER TO BE PUT IN MESSAGE#
          ITEM COUNT  I;          #PARAMETER CHARACTER COUNT# 
  
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
#     THIS PROCEDURE FORMATS AND OUTPUTS THE ERROR MESSAGES 
      ASSOCIATED WITH THE CONTROL CARD CRACKING PROCEDURE             # 
          ERRMESS[0] = "                              ";
          ERRPARAM[0] = "       ";
          ERRMESS[0] = ERRTEXT[NUMBER]; 
          C<0,COUNT>ERRPARAM[0] = C<0,COUNT>VALUE;
          MESSAGE(PARMSG,OPTION); #WRITE ERROR MESSAGE #
          PRDFILE;           # FLUSH OUTPUT BUFFER TO ASSURE DAYFILE  # 
          ERRFLG = TRUE;
          IF NUMBER EQ ECODE"ILLPARAM"
          THEN
            NOPARAM = TRUE; 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FINDZERO            E. SULLIVAN            77/01/31
*                            W. L. CHENG            80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        RETURNS THE CHARACTER COUNT OF A SPECIFIED PARAMETER OR VALUE
*        AS GIVEN BY THE PROCEDURE CRACK. 
* 
*     3. METHOD USED: 
*        THE PARAMETER, AS SPECIFIED IN THE CALL TO FINDZERO IS 
*        SEARCHED UNTIL A CHARACTER WITH VALUE ZERO IS FOUND. 
*        THE NUMBER OF NONZERO CHARACTERS BEFORE THIS FIRST ZERO IS 
*        RETURNED.
* 
*     4. ENTRY PARAMETERS:  
*        SRCHVAU   PARAMETER WHOSE CHARACTERS ARE TO BE COUNTED 
* 
*     5. EXIT PARAMETERS: 
*        NUMCHARS  NUMBER OF CHARACTERS IN SRCHVAL
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        NONE 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
      PROC FINDZERO((SRCHVAL),NUMCHARS);
        BEGIN 
          ITEM NUMCHARS I;        #NUMBER OF NONZERO CHARACTERS#
          ITEM SRCHVAL  C(7);     #PARAMER CHARACTERS TO BE SEARCHED# 
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
#     THIS PROCEDURE EXAMINES THE SEVEN CHARACTER FILED SRCHVAL 
      AND COUNTS THE NUMBER OF CHARACTERS PRESENT.  THE SEARCH
      STOPS ON ENCOUNTERING THE FIRST ZERO.                           # 
          NUMCHARS = 0;           #INITIALIZATION#
          FOR CIND = 0 STEP 1 UNTIL 6  DO 
            IF C<CIND,1>SRCHVAL NQ O"00"
            THEN
              NUMCHARS = NUMCHARS + 1;
        END 
CONTROL EJECT;
      PROC READDIR; 
      BEGIN 
*IF DEF,IMS 
# 
**
*E
*     1. PROC NAME:          AUTHOR:             DATE:  
*        READDIR             M.E.VATCHER         81/04/01 
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        COPIES INPUT DIRECTIVES TO OUTPUT FILE AND TO ZZZZINP. 
* 
*     3. METHODS USED:  
*        PRINT A HEADING. CALL READI TO GET A DIRECTIVE AND 
*        PRINTH TO COPY IT TO THE OUTPUT FILE. COPY THE LINES TO
*        THE ZZZZINP FILE. LOOP TILL THE END OF DIRECTIVES. 
* 
*     4. ENTRY PARAMETERS:  
*        NONE 
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        MESSAGE    WRITE MESSAGE TO DAYFILE
*        PRINTH     WRITE A LINE TO OUTPUT FILE 
*        READI      RAD INPUT FILE
*        WRITEH     WRITE A CODED LINE IN H FORMAT
*        WRITER     WRITE END OF RECORD TO FILE 
* 
*     8. DAYFILE MESSAGE: 
*        DIRECTIVE FILE XXXXXXX EMPTY.
* 
* 
# 
*ENDIF
      XREF
        BEGIN 
        FUNC XSFW C(10);
        ITEM ZZZZINP; 
        END 
  
      DEF LOCAL #3#;
  
      ITEM TEMPC C(10); 
  
      ARRAY DIREMPTY [0:0] S(3);
        BEGIN 
        ITEM DIREMPTY1 C(0,0,29) =
          ["DIRECTIVE FILE XXXXXXX EMPTY."];
        ITEM DIREMPTY2 C(1,30,7); 
        ITEM DIREMPTYZ U(2,48,12) = [ 0 ];
        END 
  
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
      TTL0 = "1          *** A COPY OF INPUT DIRECTIVES ***"; 
      HEADING;
      STRING = " "; 
      FOR DUMMYI = 0 WHILE NOT IEOF DO
        BEGIN 
        READI;
        IF IEOF 
        THEN                 # END OF INPUT FILE                       #
          BEGIN 
          IF IFIRSTRD 
          THEN               # DIRECTIVE FILE IS EMPTY                 #
            BEGIN 
            TEMPC = XSFW(C<0,7>INPUT);
            DIREMPTY2[0] = C<0,7>TEMPC; 
            MESSAGE(DIREMPTY,LOCAL);
            END 
          TEST DUMMYI;
          END 
        IFIRSTRD = FALSE; 
        INPBUFD = INPBUFC;
        PRINTH(OUTBUFI,9);
        WRITEH(ZZZZINP,INPBUF,8); 
        END 
      WRITER(ZZZZINP,"R");
      END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        DNPROC              JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        DEPENDING ON FLAGS SET BY PROCEDURE CRACK, DNPROC PROCESSES
*        THE DUMP RECORD PASSED BY THE MAIN PROCEDURE. DNPROC CALLS 
*        THE PROCEDURE BLDFILE TO REFORMAT THE DUMP RECORD INTO A 
*        RANDOM FILE. IF THE INPUT DIRECTIVE FILE IS PRESENT, A 
*        DIRECTIVE FILE IS READ AND THE CORRESPONDING FORMAT ROUTINE IS 
*        CALLED TO PROCESS IT.
* 
*     3. METHOD USED: 
*        PROCEDURE PREP IS CALLED TO DETERMINE IF THE DUMP RECORD IS
*        IN MULTI-HOST NPU DUMP RECORD FORMAT. IF SO, THE DUMP RECORD 
*        IS CONVERTED BACK INTO THE PRE-MULTI-HOST FORMAT FOR 
*        SUBSEQUENT PROCESSING. 
*        IF DIRECTIVES FILE PRESENT, READ A DIRECTIVE AND CONVERT THE 
*        PARAMETERS TO OCTAL, THEN GOTO CORRESPONDING FORMAT ROUTINE TO 
*        PROCESS DUMP INFORMATION. IF THERE IS  NO DIRECTIVES FILE, DUMP
*        PROCESS IS  CONTROLED BY PARAMETERS ON NDA CALL. THE DUMP FILE 
*        IS RETURNED WHEN ALL PROCESSING ON THE DUMP FILE IS COMPLETE.
* 
*     4. ENTRY PARAMETERS:  
*        LISTT      SET TRUE IF REPORT LISTING WANTED 
*        REGISTERS  TRUE IF REGISTERS ARE TO BE PROCESSED 
*        MACROMEM   TRUE IF MACRO MEMORY IS TO BE PROCESSED 
* 
*     5. EXIT PARAMETERS: 
*        EOF        END OF FILE INDICATOR 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
* 
*        BLDFILE    COPY DUMP FILE TO RANDOM WORK FILE NEUFILE - SYMPL
*        MOVE       MOVE A BLOCK OF MEMORY WORDS - SUPIO
*        FORM1      FORMAT HEADER RECORD - SYMPL
*        HEADING    PRINT HEADING INFORMATION - SYMPL 
*        READI      READ A INPUT DIRECTIVE - SYMPL
*        SYNCHK     SYNTAX CHECK AND CONVERSION - SYMPL 
*        CLOSSIO    CLOSE SUPIO RANDOM FILE - SUPIO 
*        RETERN     RETURN FILE - SUPIO 
*        REWIND     REWIND FILE - SUPIO 
*        RECALL     PUT PROGRAM OR FUNCTION IN RECALL STATUS - MACREL 
*        MESSAGE    WRITE A MESSAGE TO DAYFILE - MACREL 
*        PREP       DUMP RECORD PREPROCEESOR
*        PRINTH     PRINT A LINE TO OUTPUT - SYMPL
*        FORMAT0    FORMAT COMMENT CARDS - SYMPL
*        FORMAT1    FILE 1 AND MACRO MEMORY INTERPRETER - SYMPL 
*        FORMAT3    FORMAT CONTINUOUS DATA STRUCTURES - SYMPL 
*        FORMAT4    FORMAT CIRCULAR BUFFER - SYMPL
*        FORMAT9    FORMAT FILE 1 AND MACRO MEMORY RECORDS - SYMPL
*        FORMATA    FORMAT LCB/TCB - SYMPL
*        FORMATB    FORMAT PORT/MUX TABLES - SYMPL
*        FORMATF    FINISH - SYMPL
* 
*     8. DAYFILE MESSAGES:  
*        PROCESSING COMPLETE ON DMPAXXX 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         PROCESS DUMP FROM INPUT DIRECTIVES                           #
#                                                                      #
#**********************************************************************#
      PROC DNPROC(EOF); 
        BEGIN 
          XREF
            BEGIN 
            ITEM FDMP;
            ITEM ZZZZINP; 
            END 
          SWITCH RULE RULE0,RULE1,RULE2,RULE3,RULE4,RULE5,RULE6,RULE7,
                      RULE8,RULE9,RULEA,RULEB,RULEC,RULED,RULEE,RULEF;
          ITEM EOF B; 
          ITEM ERRI B;       # ERROR FLAG # 
      CONTROL EJECT;
#*********************************************************************# 
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#*********************************************************************# 
  
          PAGENO = 0;        # RESET PAGE NUMBER #
          LINENO = 0;        # RESET LINE NUMBER #
          SUPERR = FALSE;    # INITIAL FLAG # 
          PREP(EOF);         # CALL PREPROCESSOR                       #
          IF EOF
          THEN
            RETURN;          # ***** EXIT *****                        #
  
          BLDFILE;           # COPY DUMP FILE TO A RANDOM FILE #
          IF SUPERR 
          THEN               # ERROR IN BUILDING RANDOM FILE #
            BEGIN 
            RETURN;          # RETURN TO MAIN LOOP #
            END 
          FORM1;             # PRINT TITLE PAGE # 
          STRING = " ";      # CLEAR WORKING BUFFER # 
          IF NOT INPDIR 
          THEN               # DIRECTIVE FILE NOT PRESENT # 
            BEGIN 
            IF REGISTERS
            THEN
              BEGIN        # PRINT FILE 1 REGISTERS TO OUTPUT # 
              TTL0 = TTL1;         # MOVE HEADER #
              RULES = 8;           # SET FILE 1 TO BE DUMPED #
              HEADING;             # WRITE HEADING #
              FORMAT9;             # FORMAT FILE 1 DUMP # 
              FILE1B = FALSE;       # CLEAR FILE1 REG FLAG   #
              END 
            IF PAGEREG AND R7 
            THEN
              BEGIN          # PRINT PAGE REGISTERS TO OUTPUT          #
              TTL0 = TTL2;   # MOVE HEADER                             #
              RULES = 7;     # SET PAGE REGISTERS TO BE DUMPED         #
              HEADING;       # WRITE HEADING                           #
              FORMAT9;       # FORMAT PAGE REG DUMP                    #
              PREG = FALSE;  # CLEAR PAGE REGISTER FLAG                #
              END 
            IF MACROMEM 
            THEN           # PRINT MACRO MEMORY TO OUTPUT # 
              BEGIN 
              TTL0 = TTL4;         # FORMAT TITLE LINE #
              RULES = 9;           # SET MACRO MEMORY TO BE DUMPED #
              HEADING;             # WRITE HEADING #
              FORMAT9;             # FORMAT MACRO MEMORY DUMP # 
              END 
            END 
          ELSE
            BEGIN            # DIRECTIVE CONTROL DUMP # 
            RULES = 0;
            REWIND(ZZZZINP);
            READ(ZZZZINP);
            RECALL(ZZZZINP);
            IEOF = FALSE;  # RESET END OF FILE INDICATOR #
            FOR DUMMYI=0 STEP 1 WHILE NOT IEOF
            DO
              BEGIN 
              LENGTH = 8; 
              READH(ZZZZINP,INPBUF,LENGTH,IOSTAT);
              RECALL(ZZZZINP);
              IF IOSTAT NQ 0
              THEN
                BEGIN 
                IEOF = TRUE;
                TEST DUMMYI;
                END 
            IF RULEI NQ " " 
            THEN       # IF NEW RULE SPECIFIED #
              BEGIN 
              DISHEX(RULEI,RULES,1,ERRI); # CONVERT RULE TO HEX#
              IF ERRI 
              THEN   # RULE ERROR # 
                RULES = 14;    # SET TO INVALID RULE #
              C<0,11>TTL0 = "1";
              C<11,90>TTL0 = C<10,70>INPBUFC; 
              HEADING;         # WRITE HEADING #
              IF RULES LS 5 OR RULES EQ 10 OR RULES EQ 11 
              THEN
                TEST DUMMYI;
              END 
              SYNCHK(ERRI);    # SYNTAX CHECK AND CONVERSION #
              IF ERRI          # DIRECTIVE ERROR THEN NEXT #
              THEN
                TEST DUMMYI;
                  GOTO RULE[RULES];    # GOTO FORMAT ROUTINE BY RULE #
 RULE0: 
                  FORMAT0;             # FORMAT COMMENTS CARD # 
                  TEST DUMMYI;
 RULE1: 
 RULE2: 
                  FORMAT1;             # FILE 1 OR MACROMEM INTERPRETER#
                  TEST DUMMYI;
 RULE3: 
                  FORMAT3;             # FORMAT CONTIGUOUS BLOCK #
                  TEST DUMMYI;
 RULE4: 
                  FORMAT4;             # FORMAT CIRCULAR BUFFERS #
                  TEST DUMMYI;
 RULE7: 
 RULE8: 
 RULE9: 
                  FORMAT9;             # FORMAT FILE 1 OR MACROMEM DUMP#
                  TEST DUMMYI;         # OR PAGE REGISTERS             #
 RULEA: 
                  FORMATA;             # FORMAT LCB/TCB # 
                  TEST DUMMYI;
 RULEB: 
                  FORMATB;             # FORMAT PORT TABLE AND MUXLCBS #
                  TEST DUMMYI;
 RULEF: 
                  FORMATF;             # END OF NDA DIRECTIVES #
                  TEST DUMMYI;
 RULE5: 
 RULE6: 
 RULEC: 
 RULED: 
 RULEE:                                # INVALID RULES #
                  INPBUFD = INPBUFC;   # MOVE DIRECTIVE FOR MESSAGE # 
                  PRINTH(OUTBUFI,9);   # PRINT ERROR DIRECTIVE #
                  PRINTH(COL1ERR,5);   # PRINT ERROR MESSAGE #
                  RULES = 0;
                  TEST DUMMYI;
                END 
            END 
          CLOSSIO(LOC(NEUFILE),"REWIND"); 
          RETERN(NEUFILE);   # RETURN RANDOM WORK FILE #
          RETERN(FDMP); 
          WRITER(OUTPUT,"R");# FLUSH OUTPUT BUFFER                     #
          DMPWD1[0] = 0;     # CLEAR DUMP FILE BUFFER # 
          DMPWD2[0] = 0;     # CLEAR DUMP FILE BUFFER # 
          MESSAGE(PRCOMP,LOCAL);  # PROCESSING COMPLETE ON XXXXXXX     #
        END 
      CONTROL EJECT;
      PROC PREP(EOF); 
      BEGIN 
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:          AUTHOR:             DATE:  
*        PREP                M.E. VATCHER        81/04/13 
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        THIS PROCEDURE WILL REFORMAT A MULTI-HOST NPU DUMP RECORD
*        TO PRE-MULTI-HOST DUMP FILE FORMAT.
* 
*     3. METHODS USED:  
*        INITIATE READ OF NPU DUMP RECORD 
*        IF HEADER RECORD INDICATES A MULTI-HOST FORMAT:  
*          FORMAT PRE-MULTIHOST HEADER RECORD FROM 7700 TABLE,
*          WRITE HEADER TO FILE FDMP, 
*          FOR ALL DUMP BLOCKS IN THE DUMP RECORD:  
*            READ DUMP BLOCK HEADER,
*            BUILD BEGINNING ADDRESS TABLE FOR ADDRESS SEQUENCING,
*            FOR ALL DUMP PACKETS WITHIN THE DUMP BLOCK:  
*              READ DUMP PACKET HEADER, GET BEGINNING ADDRESS, AND
*              USING THE BEGINNING ADDRESS TABLE, FIND PLACE ( IN 
*              IN ASCENDING ADDRESSES ) IN WRITE BUFFER.
*            WRITER DUMP BLOCK RECORD.
* 
*     4. ENTRY PARAMETERS:  
*        NONE 
* 
*     5. EXIT PARAMETERS: 
*        EOF        END OF FILE INDICATOR 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        ABORT      ABORT PROGRAM 
*        MESSAGE    WRITE MESSAGE TO DAYFILE
*        READ       READ FILE 
*        READW      READ WORDS FROM FILE
*        RECALL     GIVE UP CPU 
*        REWIND     REWIND FILE 
*        WRITER     FLUSH FILE AND WRITE EOR
*        XCHD       CONVERT HEXADECIMALS TO DISPLAY CODE
*        XSFW       BLANK-FILLED WORD 
* 
*     8. DAYFILE MESSAGES:  
*        DUMP FILE XXXXXXX EMPTY. 
*        PREMATURE END OF FILE ON XXXXXXX.
* 
 #
*ENDIF
  
      XREF
        BEGIN 
        ITEM FDMP U;
        ITEM NDF U; 
        PROC READW; 
        FUNC XCHD C(10);
        FUNC XSFW C(10);
        END 
  
      DEF LOCAL #3#;
  
      ITEM BA U;             # BEGINNING ADDRESS                       #
      ITEM BC U;             # BATCH COUNT                             #
      ITEM CURBA U;          # CURRENT BEGINNING ADDRESS               #
      ITEM EA U;             # ENDING ADDRESS                          #
      ITEM EOR B = FALSE;    # END OF RECORD INDICATOR                 #
      ITEM EOF B;            # END OF FILE INDICATOR                   #
      ITEM STATIS U;         # RETURNED STATUS FROM READW              #
      ITEM TEMPC C(10); 
      ITEM WC U;             # 60 BIT WORD COUNT                       #
  
      ARRAY DB [0:63] S(1); 
        BEGIN 
        ITEM DBBA U(0,0,24);  # BEGINNING ADDRESS                      #
        ITEM DBLEN U(0,24,12);  # LENGTH OF DUMP PACKET                #
        ITEM DBZ U(0,36,24) = [ 0 ];
        END 
  
      ARRAY NDFBF [0:16] S(1);
        BEGIN 
        ITEM NDFBUF U(0,0,60);
        END 
  
      ARRAY DFE [0:0] S(3); 
        BEGIN 
        ITEM DFE1 C(0,0,25) = [" DUMP FILE XXXXXXX EMPTY"]; 
        ITEM DFE2 C(1,06,7);
        ITEM DFEZ U(2,24,36) = [ 0 ]; 
        END 
  
      ARRAY PEOF [0:0] S(4);
        BEGIN 
        ITEM PEOF1 C(0,0,34) = [" PREMATURE END OF FILE ON XXXXXXX."];
        ITEM PEOF2 C(2,36,7); 
        ITEM PEOFZ U(3,18,42) = [ 0 ];
        END 
  
      BASED ARRAY DBUFFER [0:0] S(1); 
        BEGIN 
        ITEM DBUFFER1 U(0,0,60);
        END 
  
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
      READ(NDF);
      RECALL(NDF);
      P<SIOFET> = LOC(NDF); 
      IF FETSTAT[0] EQ RDEOF OR FETSTAT[0] EQ RDEOI 
      THEN
        BEGIN                # END OF FILE                             #
        IF NDFFIRSTRD 
        THEN                 #NDF IS EMPTY                             #
          BEGIN 
          TEMPC = XSFW(C<0,7>NDF);
          DFE2[0] = C<0,7>TEMPC;
          MESSAGE(DFE,LOCAL); 
          ABORT;
  
          END 
        EOF = TRUE; 
        RETURN;              # ***** EXIT *****                        #
  
        END 
      NDFFIRSTRD = FALSE;    # NEXT READ WILL NOT BE THE FIRST         #
      READW(NDF,NDFBF,17,STATIS); 
      IF B<0,12>NDFBUF[0] NQ O"7700"
      THEN                   # SKIP THE PREPROCESSOR                   #
        BEGIN                # ITS AN R5 FORMAT DUMP FILE              #
        R7 = FALSE;          # NOT AN R7 DUMP FILE                     #
        C<0,7>FDMP = C<0,7>NDF;  # PUT DUMP FILE NAME IN FDMP FET      #
        DFNAME = C<0,7>NDF;  # SET DUMP FILE NAME FOR OUTPUT           #
        REWIND(FDMP); 
        RECALL(FDMP); 
        PRCOMP2[0] = C<0,7>NDF;  # FOR PROCESSING COMPLETE MESSAGE     #
        RETURN;              # ***** EXIT *****                        #
  
        END 
      IF STATIS NQ 0
      THEN                   # PREMATURE END OF RECORD                 #
        BEGIN 
        TEMPC = XSFW(C<0,7>NDF);
        PEOF2[0] = C<0,7>TEMPC; 
        MESSAGE(PEOF,LOCAL);
        ABORT;
  
        END 
      R7 = TRUE;             # ITS AN R7 FORMAT DUMP FILE              #
      PRCOMP2[0] = C<0,7>NDFBUF[1];  # FOR PROCESSING COMPLETE MSG     #
      DFNAME = C<0,7>NDFBUF[1];        # SET DUMP FILE NAME FOR OUTPUT #
                                       # IN FORM1 PROC                 #
      B<0,18>FDMPBUF[0] = 0;
      C<3,7>FDMPBUF[0] = C<0,7>NDFBUF[3];  # SET FIRST PART OF TIME    #
      C<0,1>FDMPBUF[1] = C<7,1>NDFBUF[3];  # SET SECOND PART OF TIME   #
      C<2,8>FDMPBUF[1] = C<0,8>NDFBUF[2];  # SET DATE                  #
      C<0,7>FDMPBUF[2] = C<0,7>NDFBUF[15]; # SET NODE NAME             #
      C<7,3>FDMPBUF[2] = 0;                # ZERO FILL REST OF WORD 2  #
      TEMPC = XCHD(B<36,8>NDFBUF[16]);
      PRNNODE2[0] = C<8,2>TEMPC;
      TEMPC = XCHD(B<44,16>NDFBUF[16]); 
      PRHALT2[0] = C<6,4>TEMPC; 
      TEMPC = XCHD(B<44,16>NDFBUF[15]); 
      PRPREG2[0] = C<6,4>TEMPC; 
      P<SIOFET> = LOC(FDMP);
      FETFST[0] = LOC(FDMPBF);
      FETLMT[0] = FETFST[0] + O"3501";
      FETOUT[0] = FETFST[0];
      FETIN[0] = FETFST[0] + 3; 
      WRITER(FDMP); 
  
      EOR = FALSE;
      FOR I=1 WHILE NOT EOR DO
        BEGIN 
        FETIN[0] = FETFST[0];  #RESET FDMP FET POINTERS                #
        FETOUT[0] = FETFST[0];
        READW(NDF,NDFBF,1,STATIS);
        IF STATIS NQ 0
        THEN                 # END OF RECORD                           #
          BEGIN 
          EOR = TRUE; 
          TEST I; 
          END 
  
        B<0,3>FDMPBUF[0] = B<0,3>NDFBUF[0];   # SET RECORD TYPE FIELD  #
        BC = B<4,8>NDFBUF[0];  # GET BATCH COUNT                       #
        BA = B<12,24>NDFBUF[0];  # GET BEGINNING ADDRESS               #
        EA = B<36,24>NDFBUF[0];  # GET ENDING ADDRESS FOR THIS BATCH   #
        B<12,24>FDMPBUF[0] = BA;
        B<36,24>FDMPBUF[0] = EA;
        FETIN[0] = FETIN[0] + 1;  # KEEP TRACK OF PLACE IN FDMP FET    #
        CURBA = BA;          # SET CURRENT BEGINNING ADDRESS           #
        FOR J = 0 STEP 1 WHILE CURBA LQ EA DO 
          BEGIN 
          DBBA[J] = CURBA;
          IF CURBA + 105 GR EA
          THEN               # LAST PACKET OF BATCH                    #
            DBLEN[J] = EA - CURBA + 1;
          ELSE
            DBLEN[J] = 105; 
          CURBA = CURBA + DBLEN[J]; 
          END 
        FOR J = 1 STEP 1 UNTIL BC DO
          BEGIN 
          READW(NDF,NDFBF,1,STATIS);
          IF STATIS NQ 0
          THEN               # PREMATURE END OF FILE                   #
            BEGIN 
            TEMPC = XSFW(C<0,7>NDF);
            PEOF2[0] = C<0,7>TEMPC; 
            MESSAGE(PEOF,LOCAL);
            ABORT;
  
            END 
          WC = B<0,12>NDFBUF[0];  # 60 BIT WORD COUNT OF DUMP PACKET   #
          BA = B<36,24>NDFBUF[0];  # ACTUAL BA OF DUMP PACKET          #
          FOR K=0 STEP 1 UNTIL BC DO
            BEGIN 
            IF BA EQ DBBA[K]
            THEN
              BEGIN          # MOVE DATA TO APPROPRIATE PLACE          #
              P<DBUFFER> = LOC(FDMPBUF[0]) + K*28 + 1;
              READW(NDF,DBUFFER,WC-1,STATIS); 
              IF STATIS NQ 0
              THEN           # PREMATURE END OF RECORD                 #
                BEGIN 
                TEMPC = XSFW(C<0,7>NDF);
                PEOF2[0] = C<0,7>TEMPC; 
                MESSAGE(PEOF,LOCAL);
                ABORT;
  
                END 
              FETIN[0] = FETIN[0] + WC - 1; 
              END 
            END 
          END 
        WRITER(FDMP,"R"); 
        END 
      END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        BLDFILE             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        BLDFILE COPIES THE DUMP FILE DMPAXXX TO A RANDOM WORK FILE 
*        NEUFILE. 
* 
*     3. METHOD USED: 
*        READ RECORDS FROM DUMP FILE DMPAXXX, IF RECORD TYPE OTHER THAN 
*        MACRO MEMORY RECORD,THEN SAVE IN CORE, IF MACRO MEMORY RECORDS 
*        FOUND, THEN COPY THE RECORD TO A SUPIO RANDOM FILE WITH END
*         ADDRESS AND BEGIN ADDRESS OF THIS RECORD FOR KEY VALUE. 
* 
*     4. ENTRY PARAMETERS:  
*        NONE 
* 
*     5. EXIT PARAMETERS: 
*        HEADRB     TRUE IF HEAD RECORD PRESENT IN DUMP FILE
*        FILE1B     TRUE IF FILE 1 RECORD PRESENT IN DUMP FILE
*        STATRB     TRUE IF STATUS RECORD PRESENT IN DUMP FILE
*        CKSUMB     TRUE IF CHECKSUM RECORD PRESENT IN DUMP FILE
*        MACROB     TRUE IF MACRO MEMORY RECORD PRESENT 
* 
*     6. COMDECKS CALLED
*        NONE 
* 
*     7. ROUTINES CALLED
*        REWIND     REWIND FILE 
*        RECALL     PUT PROGRAM IN RECALL STATUS - MACREL 
*        OPENSIO    OPEN SUPIO FILE - SUPIO 
*        CLOSSID    CLOSE SUPIO FILE - SUPIO
*        READSR     READ A SEQUENTIAL RECORD - SUPIO
*        MOVE       MOVE A BLOCK OF MEMORY WORDS - MACREL 
*        WRITERI    WRITE A RANDOM RECORD - SUPIO 
*        WRITERR    WRITE A SUPIO ERROR MESSAGE - SYMPL 
*        PRINTH     PRINT A LINE TO OUTPUT - SYMPL
*        RETERN     RETURN FILE - MACREL
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         PROCEDURE TO COPY DUMP FILE TO A RANDOM FILE                 #
#                                                                      #
#**********************************************************************#
      PROC BLDFILE; 
        BEGIN                # COPY DUMP FILE TO RANDOM FILE NEUFILE #
          ITEM NOTEOF B=TRUE;          # END OF FILE FLAG # 
          ITEM ICODE U=0;    # RECORD TYPE #
          ITEM II;           # INDEX #
          SWITCH RECCOD RECOD0,RECOD1,RECOD2,RECOD3,RECOD4,RECOD5,
                        RECOD6; 
      CONTROL EJECT;
#*********************************************************************# 
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          P<DMPBUF> = LOC(DMPBUF1);    # LOCATE DUMP FILE BUFFER #
          HEADRB = FALSE;    # INITIAL FLAG # 
          FILE1B = FALSE; 
          STATRB = FALSE; 
          CKSUMB = FALSE; 
          MACROB = FALSE; 
          PREG = FALSE; 
          NOTEOF = TRUE;
          REWIND(FDMP);      # REWIND DUMP FILE # 
          RECALL(FDMP); 
          OPENSIO(LOC(NEUFILE),"NEW",IOSTAT);    # OPEN RANDOM FILE # 
          IF IOSTAT NQ 0
          THEN               # OPEN ERROR # 
            WRITERR("NEUFILE","OPENING ",IOSTAT);   # ISSUE ERROR MESS# 
          FOR DUMMYI=0 WHILE NOTEOF 
          DO
            BEGIN 
              LENGTH = BUFLEN;         # SET BUFFER LENGTH #
              READSR(LOC(FDMP),LOC(DMPBUF),LENGTH,IOSTAT); # READ A REC#
              IF IOSTAT EQ RDEOF OR IOSTAT EQ RDEOI 
              THEN            # END OF FILE ENCOUNTERED # 
                BEGIN 
                  NOTEOF = FALSE; 
                  TEST DUMMYI;
                END 
              ELSE           # NOT END OF FILE #
                IF IOSTAT NQ 0 AND IOSTAT NQ RDEOR
                  THEN       # READ ERROR # 
                    WRITERR(FDMP,"READING ",IOSTAT);
              ICODE = B<0,3>DMPWD[0];  # GET RECORD TYPE FROM RECORD #
              IF ICODE GR 6 
              THEN           # INVALID RECORD TYPE #
                ICODE = 3;
              GOTO RECCOD[ICODE];      # GO TO CORRESPONDING ROUTINE #
 RECOD0:                     # RECORD TYPE 0, HEADER #
              HEADRB = TRUE;           # HEADER RECORD EXIST #
              MOVE(3,DMPBUF,HEADREC);  # SAVE HEADER #
              TEST DUMMYI;   # TEST END OF FILE CONDITION # 
 RECOD1:                     # RECORD TYPE 1, FILE 1 REGISTERS #
              FILE1B = TRUE;           # FILE 1 EXIST # 
              MOVE(71,DMPBUF,FILE1REC);# SAVE FILE 1 IN CORE #
              B<36,24>FILE1REC1[0] = B<36,24>FILE1REC1[0] - 
                B<12,24>FILE1REC1[0]; 
              B<12,24>FILE1REC1[0] = 0; 
              TEST DUMMYI;   # TEST END OF FILE CONDITION # 
 RECOD2:                   # RECORD TYPE 2, PAGE REGISTER RECORD EXISTS#
              PREG = TRUE;   # PAGE REGISTER RECORD EXISTS             #
              MOVE(MAXPGREG,DMPBUF,PAGREGREC);#SAVE PAG REG IN CORE#
              B<36,24>PAGREGREC1[0] = B<36,24>PAGREGREC1[0] - 
                B<12,24>PAGREGREC1[0];
              B<12,24>PAGREGREC1[0] = 0;
              TEST DUMMYI;   # TEST END OF FILE CONDITION              #
 RECOD3:                     # INVALID RECORD TYPE #
              STRING = " UNRECOGNIZED RECORD IN DUMP FILE ";
              PRINTH(OUTBUF,14);       # PRINT ERROR MESSAGE #
              STRING = " "; 
              TEST DUMMYI;   # TEST END OF FILE CONDITION # 
 RECOD4:                     # RECORD TYPE 4, MACRO MEMORY RECORDS #
              MACROB = TRUE;           # MACRO MEMORY RECORD EXIST #
              B<0,12>RECKEY = 0;       # CONSTRUCT RECORD KEY # 
              B<12,24>RECKEY = B<36,24>DMPWD[0];
              B<36,24>RECKEY = B<12,24>DMPWD[0];
              WRITERI(LOC(NEUFILE),RECKEY,LOC(DMPBUF),LENGTH,IOSTAT); 
                             # WRITE A RECORD TO RANDOM FILE #
              IF IOSTAT NQ 0
              THEN           # WRITE ERROR #
                WRITERR("NEUFILE","WRITING ",IOSTAT); 
              TEST DUMMYI;   # TEST END OF FILE CONDITION # 
 RECOD5:                     # RECORD TYPE 5, CHECKSUM RECORD # 
              CKSUMB = TRUE; # SET CHECKSUM RECORD EXIST FLAG # 
              CKSUMREC = DMPWD[0];     # SAVE CHECKSUM RECORD IN CORE # 
              TEST DUMMYI;   # TEST END OF FILE CONDITION # 
 RECOD6:                     # RECORD TYPE 6, STATUS RECORD # 
              STATRB = TRUE; # SET STATUS RECORD EXIST FLAG # 
              STATREC = DMPWD[0];      # SAVE STATUS RECORD IN CORE # 
              TEST DUMMYI;   # TEST END OF FILE CONDITION # 
            END 
          CLOSSIO(LOC(NEUFILE),"REWIND");        # CLOSE RANDOM FILE #
          OPENSIO(LOC(NEUFILE),"READ",IOSTAT);   # OPEN FILE FOR READ # 
          IF IOSTAT NQ 0
          THEN               # OPEN ERROR # 
            WRITERR("NEUFILE","OPENING ",IOSTAT); 
       END
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORM1               E. SULLIVAN            77/01/31
*                            JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORM1 FORMATS THE INFORMATION IN THE DUMP FILE HEADER AND
*        WRITES THIS TO OUTPUT. 
* 
*     3. METHOD USED: 
*        DATA FIELDS ARE TAKEN FROM THE RECORD IN CORE, CONVERTED TO
*        OCTAL DISPLAY IF NECESSARY, AND WRITTEN TO OUTPUT IN THE PROPER
*        FORMAT.
* 
*     4. ENTRY PARAMETERS:  
*        HEADRB     SET TRUE IF HEADER RECORD PRESENT 
*        STATRB     SET TRUE IF STATUS RECORD PRESENT 
*        CKSUMB     SET TRUE IF CHECKSUM RECORD PRENSET 
*        HEADREC    CONTAINS HEADER RECORD
*        STATREC    CONTAINS STATUS RECORD
*        CKSUMREC   CONTAINS CHECKSUM RECORD
*        DNDIS      CONTAINS DISPLAY CODE OF DUMP FILE NUMBER 
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        XCOD      CONVERT OCTAL TO DISPLAY CODE - SUPIO
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        HEXDIS     CONVERT HEXADECIMAL TO DISPLAY CODE - SYMPL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#         FORMAT HEADER RECORD PROCEDURE                               #
#                                                                      #
#**********************************************************************#
      PROC FORM1; 
        BEGIN 
          IF NOT HEADRB 
          THEN               # HEAD RECORD NOT IN DUMP FILE # 
            BEGIN 
              PRINTH(HEADERR,5);
              RETURN; 
            END 
          P<CCARD> = O"70";  # CONTROL CARD IMAGE AREA #
          PRDN2[0] = DFNAME; # SET UP DUMP FILE NAME FOR HEADER # 
          FOR ICD=0 STEP 1 WHILE C<ICD,1>CCRD[0] NQ O"00" 
          DO                 # MOVE CHARACTERS UNTIL END OF CARD #
            C<ICD+10,1>PRDN3[0] = C<ICD,1>CCRD[0];
          NDAVER[0] = NAMVER[0];       # FILL IN NDA VERSION NO.# 
          C<0,4>NDAVER[0] = " NDA"; 
          NDALEV[0] = NAMLV[0]; 
          MOVE(10,PRDN,TTL); # MOVE HEADING INFORMATION # 
          RULES = 0;
          HEADING;           # WRITE HEADING #
          PRINTH(BLLINE,3); 
          PRINTH(BLLINE,3); 
          PRTIME2[0] = C<3,7>HEADREC0[0]; 
          PRTIME3[0] = C<0,1>HEADREC0[1]; 
          PRINTH(PRTIME,2);  # PRINT TIME LINE #
          PRDATE2[0] = C<2,8>HEADREC0[1]; 
          PRINTH(PRDATE,2);  # PRINT DATE LINE #
          PRNPU2[0] = C<0,7>HEADREC0[2];
          PRINTH(PRNPU,2);   # PRINT NPU NAME LINE #
          IF R7 
          THEN               # ITS AN R7 FORMAT DUMP FILE              #
            BEGIN            # PRINT ADDITIONAL INFORMATION            #
            PRINTH(PRNNODE,2);
            PRINTH(PRHALT,2); 
            PRINTH(PRPREG,2); 
            END 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        SYNCHK              JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        SYNCHK SYNTAX CHECK THE INPUT DIRECTIVES AND CONVERT THE 
*        PARAMETERS ON DIRECTIVE TO HEXADECIMAL.
* 
*     3. METHOD USED: 
*        SYNCHK CALL THE SUBROUTINE DISHEX TO CONVERT PARAMETERS TO 
*        HEXADECIMAL AND SAVE IT IN PARAMETER ARRAY PARAMT. IF ERROR
*        FLAG SET BY DISHEX, THEN PRINT THE ERROR MESSAGE AND SET 
*        DIRECTIVE ERROR FLAG DIRERR. 
* 
*     4. ENTRY PARAMETERS:  
*        RULES      RULE NUMBER OF THIS DIRECTIVE 
* 
*     5. EXIT PARAMETERS: 
*        DIRERR     DIRECTIVE ERROR FLAG
*        PARAMT     ARRAY CONTAINS INPUT PARAMETERS 
* 
*     6. COMDECKS CALLED
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        DISHEX     CONVERT DISPLAY CODE TO HEXADECIMAL - SYMPL 
*        PRINTH     PRINT A LINE TO OUTPUT - SYMPL
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#         INPUT DIRECTIVES SYNTAX CHECK AND CONVERSION                 #
#                                                                      #
#**********************************************************************#
      PROC SYNCHK(DIRERR);
        BEGIN                # INPUT DIRECTIVES SYNTAX CHECK #
          ARRAY NUMPARA [0:15] S(1);
            BEGIN  # NUMBER OF PARAMER FOR CORRESPONDING RULE # 
         ITEM NUMPAR U(0,0,60)=[0,1,1,5,7,0,0,0,0,0,7,8,0,0,0,0]; 
            END 
          ITEM DIRERR B;     # ERROR FLAG # 
          ITEM III I;        # INDEX #
          ITEM I;            # INDEX #
          ITEM WORKCI C(10);           # WORKING AREA # 
          ITEM WORKUI U;               # WORKING AREA # 
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          DIRERR = FALSE;    # RESET ERROR FLAG # 
          FOR I= 1 STEP 1 UNTIL NUMPAR[RULES] 
          DO
            BEGIN 
              III = (I - 1) * 6 + 1;   # START POSITION # 
              WORKCI = C<III,5> INPBUFC;
              DISHEX(WORKCI,WORKUI,5,DIRERR);    # CONVERT TO HEX. #
              IF DIRERR 
              THEN           # ERROR IN CONVERSION #
                BEGIN 
                  INPBUFD = INPBUFC;
                  PRINTH(OUTBUFI,9);   # PRINT THE ERROR DIRECTIVE #
                  ERRFIELD = WORKCI;
                  PRINTH(DIRMES1,6);   # PRINT ERROR MESSAGE #
                  PRINTH(BLLINE,1);    # PRINT A BLANK LINE # 
                  RETURN; 
                END 
              IF C<(I-1)*6,1>INPBUFC NQ " " AND C<(I-1)*6,1>INPBUFC 
                 NQ "," 
              THEN           # SEPERATOR ERROR #
                BEGIN 
                  DIRERR = TRUE;
                  INPBUFD = INPBUFC;
                  PRINTH(OUTBUFI,9);
                  III = (I - 1) * 6 + 1;
                  WORKCI = XCDD(III); 
                  DIRMES23 = C<6,4> WORKCI; 
                  PRINTH(DIRMES2,6);   # PRINT ERROR MESSAGE #
                  PRINTH(BLLINE,1);    # PRINT A BLANK LINE # 
                  RETURN; 
                END 
              PARAMT[I-1] = WORKUI;    # SAVE PARAMETER FOR LATER USE # 
            END 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        READI               JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        READI READ A INPUT DIRECTIVE FROM FILE SPECIFIED IN NDA CONTROL
*        STATEMENT. 
* 
*     3. METHOD USED: 
*        READI USE THE NOS DATA TRANSFER MACRO READH TO READ A INPUT
*        DIRECTIVE INTO CORE. 
* 
*     4. ENTRY PARAMETERS:  
*        NONE 
* 
*     5. EXIT PARAMETERS: 
*        IOSTAT     RETURNED STATUS 
*        IEOF       END OF FILE FLAG
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        READH      READ A CODED LINE - MACREL
*        RECALL     PUT THE PROGRAM INTO RECALL STATUS - MACREL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         READ INPUT DIRECTIVE PROCEDURE                               #
#                                                                      #
#**********************************************************************#
      PROC READI; 
        BEGIN                # READ A INPUT DIRECTIVE # 
          LENGTH = 8; 
          READH(INPUT,INPBUF,LENGTH,IOSTAT);     # READ A CARD #
          RECALL(INPUT);
          IF IOSTAT NQ 0
          THEN               # READ ERROR OR END OF FILE #
            IEOF = TRUE;     # SET END OF FILE INDICATOR #
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMAT0             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMAT0 MOVE THE COMMENT LINES TO THE OUTPUT LISTING TO PROCESS
*        DIRECTIVE RULE O.
* 
*     3. METHOD USED: 
*        FORMAT0 MOVE A COMMENT LINE TO THE OUTPUT BUFFER AND CALL
*        SUBROUTINE PRINTH TO PRINT THE LINE. 
* 
*     4. ENTRY PARAMETERS:  
*        INPBUF     THE COMMENT LINE READ FROM INPUT DIRECTIVES.
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         PROCESS COMMENTS CARDS PROCEDURE                             #
#                                                                      #
#**********************************************************************#
      PROC FORMAT0; 
        BEGIN                # PRINT COMMENTS CARDS TO OUTPUT # 
          BASED ARRAY INPBUF0 [0:0] S(8); 
            BEGIN            # COMMENTS FROM INPUT #
              ITEM COMENTI0 C(1,0,60);
            END 
          ARRAY OUTBUF0 [0:0] S(8); 
            BEGIN            # OUTPUT BUFFER #
              ITEM CCNTRL01 C(0,0,1) = [" "];    # CARRIAGE CONTROL # 
              ITEM FILLER01 C(0,6,9) = [" "]; 
              ITEM COMENTO0 C(1,0,60); # COMMENTS # 
              ITEM ZEROEND0 U(7,0,60) = [0];
            END 
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          P<INPBUF0> = LOC(INPBUF);    # LOCATE INPUT BUFFER #
          COMENTO0 = COMENTI0;         # MOVE COMMENTS #
          PRINTH(OUTBUF0,8);           # PRINT COMMENT #
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMAT1             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMAT1 ISOLATE AND INTERPRET THE FILE 1 REGISTER LOCATIONS AND
*        MACRO MEMORY LOCATIONS TO PROCESS DIRECTIVE RULE 1 AND 2.
* 
*     3. METHOD USED: 
*        FORMAT1 CALL SUBROUTINE ONEWORD TO GET THE 16-BITS DATA WORD 
*        FROM RANDOM WORK FILE.  EVENTUALLY FORMAT1 CALL PRINTH TO PRINT
*        THE LINE.
* 
*     4. ENTRY PARAMETERS:  
*        INPBUF     CONTAINS THE INPUT DIRECTIVE LINE.
*        RULES      RULE ON DIRECTIVE TO BE PROCESSED.
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        ONEWORD    GET A 16-BITS WORD FROM RANDOM WORK FILE - SYMPL
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         FILE 1 AND MACRO MEMORY INTERPRETER                          #
#                                                                      #
#**********************************************************************#
      PROC FORMAT1; 
        BEGIN                # INTERPRETE THE FILE 1 OR MACRO MEMORY #
          BASED ARRAY INPAR1 [0:0] S(1);
            BEGIN            # INPUT PARAMETER FOR RULES 1 AND 2 #
              ITEM ADDR U(0,0,60);
            END 
          ARRAY OUTBUF1 [0:0] S(9); 
            BEGIN            # OUTPUT BUFFER #
              ITEM CCNTRL11 C(0,0,1) = [" "];    # CARRIAGE CONTROL # 
              ITEM FILLER11 C(0,6,6) = [" (LOC "];
              ITEM REGLOCO1 C(0,42,5); # LOCATION # 
              ITEM FILLER12 C(1,12,2) = [") "]; 
              ITEM REGCONO1 C(1,24,4);
              ITEM FILLER13 C(1,48,2) = ["  "]; 
              ITEM COMENTO1 C(2,0,64); # CONTENTS # 
              ITEM ZEROEND1 U(8,24,36) = [0]; 
            END 
          ITEM WORKC1 C(10); # WORKING AREA # 
          ITEM WORKU1 U;     # WORKING AREA # 
      CONTROL EJECT;
          P<INPAR1> = LOC(PARAMI);    # LOCATE INPUT PARAMETERS # 
          REGLOCO1 = C<1,5>INPBUFC;    # MOVE LOCATION #
          COMENTO1 = C<06,64>INPBUFC;  # MOVE COMMENTS #
          WORKU1 = RULES + 1;       # SET RECORD TYPE. FILE 1 OR MEM# 
          ONEWORD(ADDR,WORKC1,WORKU1);     # GET ONE WORD # 
          REGCONO1 = WORKC1;
          PRINTH(OUTBUF1,9);
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMAT3             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMAT3 ISOLATE AND LIST FIXED LENGTH DATA STRUCTURES HAVING 
*        ONE OR MORE INSTANCE TO PROCESS DIRECTIVE RULE 3.
* 
*     3. METHOD USED: 
*        FORMAT3 CALL ONEWORD TO GET POINTER WORD FROM RANDOM WORK FILE.
*        IF POINTER WORD MISSING THEN PRINT A ERROR MESSAGE AND RETURN
*        TO DNPROC, ELSE CALL ONEWORD TO RETRIEVE DATA FROM RANDOM FILE 
*        FORMAT THE LINE AND CALL PRINTH TO PRINT THE LINE. 
* 
*     4. ENTRY PARAMETERS:  
*        INPBUFC    CONTAINS THE INPUT DIRECTIVE LINE 
*        PARAMI     CONTAINS THE INPUT PARAMETERS ON DIRECTIVE LINE 
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        HEADING    PRINT THE HEADING INFORMATION - SYMPL 
*        ONEWORD    GET A 16-BITS WORD FROM RANDOM WORK FILE - SYMPL
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        PTRMISS    PRINT THE POINTER WORD MISSING MESSAGE - SYMPL
*        XCHD       CONVER OCTAL TO HEXADECIMAL DISPLAY CODE - MACREL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#          PROCESS CONTINUOUS DATA STRUCTURES PROCEDURE                #
#                                                                      #
#**********************************************************************#
      PROC FORMAT3; 
        BEGIN                # FORMAT CONTIGUOUS BLOCK STRUCTURES # 
          BASED ARRAY INPAR3  [0:0] S(5); 
            BEGIN            # PARAMETERS FROM INPUT DIRECTIVES # 
              ITEM PNTR U(0,0,60);
              ITEM SIZE U(1,0,60);
              ITEM INDX U(2,0,60);
              ITEM FIRST U(3,0,60); 
              ITEM LAST U(4,0,60);
            END 
          ITEM PNTRY U; 
      CONTROL EJECT;
          P<INPAR3> = LOC(PARAMI);
          IF FIRST GR LAST
          THEN               # ERROR #
            BEGIN 
              INPBUFD = INPBUFC;       # MOVE DIRECTIVE FOR MESSAGE # 
              PRINTH(OUTBUFI,9);       # PRINT ERROR DIRECTIVE #
              PRINTH(CBSERR,6);        # PRINT ERROR MESSAGE #
              PRINTH(BLLINE,1);        # PRINT A BLANK LINE # 
              RETURN; 
            END 
          ONEWORD(PNTR,PNTRY,1);       # GET THE POINTER WORD FROM MEM #
          IF B<24,1>PNTRY EQ 1
          THEN               # POINTER WORD MISSING # 
            BEGIN 
              PTRMISS(PNTR);
              RETURN; 
            END 
          LOOP01 = (LAST - FIRST) / INSPLN;       # LOOP COUNT #
          FOR I01=0 STEP 1 UNTIL LOOP01 
          DO
            BEGIN 
              IF I01 EQ LOOP01
              THEN
                LOOP02 = (LAST-FIRST)-(LAST-FIRST) / INSPLN * INSPLN; 
              ELSE
                LOOP02 = INSPLN - 1;
              IF (LINENO + SIZE + 3) GR XLINP 
              THEN           # SIZE BEYOND THE BOTTOM OF PRESENT PAGE # 
                HEADING;     # START A NEW PAGE # 
              C<7,40>STRING = C<30,40> INPBUFC; 
              PRINTH(OUTBUF,14); # PRINT THE CURRENT LINE # 
              STRING = " ";      # CLEAR OUTPUT BUFFER #
              C<1,6>STRING = "OFFSET";
              FOR I02=0 STEP 1 UNTIL LOOP02 
              DO             # FORMAT A INDEX TITLE LINE #
                BEGIN 
                  TEMPC1 =XCHD(FIRST+I01*INSPLN+I02); # CONVERT TO HEX #
                  C<I02*7+10,4>STRING = C<6,4>TEMPC1; 
                END 
              PRINTH(OUTBUF,14);       # PRINT INDEX TITLE LINE # 
              STRING = " "; 
              FOR I02=0 STEP 1 UNTIL SIZE - 1 
              DO
                BEGIN        # FORMAT THE DETAIL LINE # 
                  TEMPC1 = XCHD(I02);  # CONVERT OFFSET TO HEX #
                  C<1,6>STRING = C<6,4>TEMPC1;
                  FOR I03=0 STEP 1 UNTIL LOOP02 
                  DO
                   BEGIN
                      TEMPU1 = PNTRY + (I01*INSPLN+I03) * SIZE + I02; 
                      ONEWORD(TEMPU1,TEMPC1,3);  # GET DATA FROM FILE  #
                      C<I03*7+10,4>STRING = TEMPC1; 
                    END 
                  PRINTH(OUTBUF,14);   # PRINT THE DETAIL LINE #
                  STRING = " "; 
                END 
              PRINTH(BLLINE,1);        # PRINT BLANK LINE BETWEEN STRU.#
              PRINTH(BLLINE,1); 
            END 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMAT4             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMAT4 ISOLATE AND LIST THE CONTENT OF CIRCULAR BUFFERS IN
*        CHRONOLOGICAL ORDER TO PROCESS DIRECTIVE RULE 4. 
* 
*     3. METHOD USED: 
*        FORMAT4 CALL ONEWORD TO GET POINTER WORDS FROM RANDOM WORK FILE
*        1 IF POINTER WORDS MISSING THEN PRINT A ERROR MESSAGE AND
*        RETURN TO DNPROC, ELSE CALL ONEWORD TO RETRIEVE DATA WORDS FROM
*        RANDOM WORK FILE, FORMAT THE LINE AND CALL PRINTH TO PRINT THE 
*        LINE.
* 
*     4. ENTRY PARAMETERS:  
*        INPBUFC    CONTAINS THE INPUT DIRECTIVE LINE.
*        PARAMI     CONTAINS THE PARAMETERS ON DIRECTIVE LINE.
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        ONEWORD    GET A 16-BITS WORD FROM RANDOM WORK FILE - SYMPL
*        PTRMISS    PRINT THE POINTER WORD MISSING MESSAGE - SYMPL
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        HEXDIS     CONVERT HEXADECIMAL TO DISPLAY CODE - SYMPL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         FORMAT CIRCULAR BUFFER PROCEDURE                             #
#                                                                      #
#**********************************************************************#
      PROC FORMAT4; 
        BEGIN                # FORMAT CIRCULAR IO BUFFERS # 
          BASED ARRAY INPAR4 [0:0] S(7);
            BEGIN            # INPUT PARAMETERS FOR RULE 4 #
              ITEM FWA  U(0,0,60);     # POINTER TO FWA OF CIO BUFFERS #
              ITEM NEXT U(1,0,60);     # POINTER TO OLDEST ITEM # 
              ITEM LWA  U(2,0,60);     # POINTER TO LWA OF CIO BUFFERS #
              ITEM FLAG U(3,0,60);   # POINTER TO MEANINGFUL DATA FLAG #
              ITEM PTRN U(4,0,60);     # PATTERN OF DELIMITER # 
              ITEM MASK U(5,0,60);     # MASK FOR ISOLATING DELIMITER # 
              ITEM SIZE U(6,0,60);     # LENGTH OF FIXED LENGTH DATA #
            END 
          ITEM BEGNY U;      # FWA ADDRESS OF CIO BUFFERS # 
          ITEM NEXTY U;      # OLDEST ITEM ADDRESS #
          ITEM LASTY U;      # LWA ADDRESS OF CIO BUFFERS # 
          ITEM FLAGY U;      # MEANINGFUL DATA FLAG # 
          ITEM CIOEND B;     # END OF BUFFER FLAG # 
          ITEM WORADR U;     # WORD ADDRESS # 
          ITEM PASSI  B;     # FIRST PASS FLAG #
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          P<INPAR4> = LOC(PARAMI);     # LOCATE INPUT PARAMETERS #
          ONEWORD(FLAG,FLAGY,0);       # GET FLAG WORD #
          IF FLAGY EQ 0 
          THEN               # NO MEANINGFUL DATA IN BUFFERS #
            BEGIN 
              INPBUFD = INPBUFC;       # MOVE DIRECTIVE FOR MESSAGE # 
              PRINTH(OUTBUFI,9);       # PRINT ERROR DIRECTIVE #
              PRINTH(NOMEAN,4);        # PRINT ERROR MESSAGE #
              PRINTH(BLLINE,1);        # PRINT A BLANK LINE # 
              RETURN; 
            END 
          ONEWORD(FWA,BEGNY,0);        # GET FWA ADDRESS #
          ONEWORD(NEXT,NEXTY,0);       # GET OLDEST ITEM ADDRESS #
          ONEWORD(LWA,LASTY,0);        # GET LWA ADDRESS #
          IF B<24,1>FLAGY EQ 1 OR B<24,1>BEGNY EQ 1 OR
             B<24,1>NEXTY EQ 1 OR B<24,1>LASTY EQ 1 
          THEN               # POINTER WORD MISSING # 
            BEGIN 
              IF B<24,1>FLAGY EQ 1 THEN PTRMISS(FLAG);
              IF B<24,1>BEGNY EQ 1 THEN PTRMISS(FWA); 
              IF B<24,1>NEXTY EQ 1 THEN PTRMISS(NEXT);
              IF B<24,1>LASTY EQ 1 THEN PTRMISS(LWA); 
              RETURN;        # RETURN TO PROCESS NEXT DIRECTIVE # 
            END 
          IF NOT ( NEXTY GQ BEGNY AND LASTY GQ NEXTY )
          THEN               # ERROR IN CIO FWA OR LWA OR NEXT ADDRESS #
            BEGIN 
              INPBUFD = INPBUFC;       # MOVE DIRECTIVE FOR MESSAGE # 
              PRINTH(OUTBUFI,9);       # PRINT ERROR DIRECTIVE #
              PRINTH(CIOERR,7);        # PRINT ERROR MESSAGE #
              PRINTH(BLLINE,1); 
              RETURN; 
            END 
          C<10,28> STRING = C<42,28> INPBUFC;    # MOVE HEADER #
          C<3,3> STRING = "LOC";
          PRINTH(OUTBUF,14);           # PRINT HEADER LINE #
          STRING = " "; 
          WORADR = NEXTY; 
          IF SIZE NQ 0
          THEN               # MUST BE FIXED LENGTH DATA STRUCTURES # 
            BEGIN 
              FOR I01 = 0 STEP 1 UNTIL SIZE - 1 
              DO
                BEGIN 
                  I02 = I01 - I01 / CBWPLN * CBWPLN;
                  IF I02 EQ 0 
                  THEN       # FORMAT FIRST WORD ADDRESS #
                    BEGIN 
                      HEXDIS(WORADR,TEMPC1,4);   # CONVERT TO DISPLAY # 
                      C<2,4> STRING = TEMPC1; 
                    END 
                  ONEWORD(WORADR,TEMPC1,3);      # GET ONE DATA WORD #
                   C<I02*5+7,4> STRING = TEMPC1;
                  IF I02 EQ CBWPLN-1 OR I01 EQ SIZE-1 
                  THEN       # LINE FILLED #
                    BEGIN 
                    PRINTH(OUTBUF,14);           # PRINT ONE DATA LINE #
                      STRING = " "; 
                    END 
                  IF WORADR EQ LASTY
                  THEN       # LWA ADDRESS REACHED #
                    WORADR = BEGNY;    # SET ADDRESS TO FWA # 
                  ELSE
                    WORADR = WORADR + 1;         # INCREASE ONE # 
                  IF WORADR EQ NEXTY AND I01 NQ SIZE-1
                  THEN       # CIO LIMITE REACHED # 
                    BEGIN 
              INPBUFD = INPBUFC;       # MOVE DIRECTIVE FOR MESSAGE # 
              PRINTH(OUTBUFI,9);       # PRINT ERROR DIRECTIVE #
              PRINTH(CIOLIM,4);        # PRINT ERROR MESSAGE #
              PRINTH(BLLINE,1);        # PRINT A BLANK LINE # 
                      I01 = SIZE; 
                    END 
                END 
            END 
          ELSE               # VARIABLE LENGTH DATA STRUCTURE # 
            BEGIN 
              CIOEND = FALSE;          # INITIAL FLAG # 
              PASSI = TRUE; 
              FOR I01=0 STEP 1 WHILE NOT CIOEND 
              DO
                BEGIN 
                  ONEWORD(WORADR,TEMPU1,1);      # GET ONE DATA WORD #
                  IF (B<44,16>TEMPU1 LAN B<44,16>MASK) EQ B<44,16>PTRN
                  THEN       # DESIRED PATTERN FOUND #
                    BEGIN 
                      IF PASSI
                      THEN   # FIRST PATTERN THEN SET PROCESS FLAG #
                        BEGIN 
                          I01 = 0;
                          PASSI = FALSE;
                        END 
                      ELSE
                        CIOEND = TRUE;
                    END 
                  IF NOT PASSI
                  THEN       # DESIRED DATA FOUND PROCESS HERE #
                    BEGIN 
                      I02 = I01 - I01 / CBWPLN * CBWPLN;
                      IF I02 EQ 0 
                      THEN   # FORMAT FIRST WORD ADDRESS #
                        BEGIN 
                          HEXDIS(WORADR,TEMPC1,4);
                          C<2,4> STRING = TEMPC1; 
                        END 
                      HEXDIS(TEMPU1,TEMPC1,4);   # CONVERT TO DISPLAY # 
                      C<I02*5+7,4> STRING = TEMPC1; 
                    END 
                      IF WORADR EQ LASTY
                      THEN   # LWA ENCOUNTER THEN SET TO FWA #
                        WORADR = BEGNY; 
                      ELSE
                        WORADR = WORADR + 1;     # INCREASE ONE # 
                      IF WORADR EQ NEXTY
                      THEN   # CIO LIMIT REACHED #
                        CIOEND = TRUE;
                  IF NOT PASSI
                  THEN       # TEST FOR LINE FILLED # 
                    BEGIN 
                      IF I02 EQ CBWPLN-1 OR CIOEND
                      THEN   # LINE FILLED #
                        BEGIN 
                        PRINTH(OUTBUF,14);       # PRINT DATA LINE #
                          STRING = " "; 
                        END 
                    END 
                END 
              IF PASSI
              THEN           # NO DATA FOUND #
                BEGIN 
              INPBUFD = INPBUFC;       # MOVE DIRECTIVE FOR MESSAGE # 
              PRINTH(OUTBUFI,9);       # PRINT ERROR DIRECTIVE #
              PRINTH(NOPATT,4);        # PRINT ERROR MESSAGE #
              PRINTH(BLLINE,1);        # PRINT A BLANK LINE # 
                END 
            END 
              PRINTH(BLLINE,1);        # PRINT A BLANK LINE BETWEEN SEC#
              PRINTH(BLLINE,1); 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME              AUTHOR:               DATE: 
*        FORMAT9             JACOB C. K. CHEN 
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMAT9 FORMAT THE FILE 1 AND MACR MEMORY RECORDS INTO OUTPUT
*        LISTING TO PROCESS DIRECTIVE RULE 8 AND 9. 
* 
*     3. METHOD USED: 
*        FORMAT9 CALL ONEWORD TO RETRIEVE DATA WORDS FROM RANDOM WORK 
*        FILE OR FROM CORE, CONVERT THEM INTO ASCII DISPLAY CODE, FORMAT
*        THEM IN OUPUT LISTING LINE, CALL PRINTH TO PRIN THE LINE.
* 
*     4. ENTRY PARAMETERS:  
*        RULES
*        BEGADD     OCTAL VALUE OF REPORT BEGINNING ADDRESS SET 
*        ENDADD     OCTAL VALUE OF REPORT ENDING ADDRESS SET
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        HEXDIS     CONVERT HEXADECIMAL TO DISPLAY CODE - SYMPL 
*        ONEWORD    GET A 16-BITS WORD FROM RANDOM WORK FILE - SYMPL
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        MOVE       MOVE A BLOCK OF MEMORY WORDS - MACREL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         FORMAT MACRO MEMORY RECORDS AND FILE 1 RECORD PROCEDURE      #
#                                                                      #
#**********************************************************************#
      PROC FORMAT9; 
        BEGIN                # FORMAT FILE 1 AND MACRO MEM RECORDS #
          BASED ARRAY OUTLINE [0:0] S(14);
            BEGIN            # WORKING AREA FOR OUTPUT LISTING #
              ITEM DISADR C(0,6,6);    # ADDRESS OF THIS LINE # 
              ITEM DUPLIC C(0,42,2);   # DUPLCATED LINE INDICATOR # 
              ITEM OUTLIN C(0,0,140); 
              ITEM OUTLIN1 C(0,54,96); # HEX DISPLAY CODE PORTION # 
              ITEM OUTLIN2 C(10,30,32);# ASCII DISPLAY CODE PORTION # 
            END 
  
          ARRAY OUTLINE8 [0:0] S(14); 
            BEGIN            # WORKING AREA FOR OUTPUT LISTING #
              ITEM OUTLIN8 C(0,0,137)=[" "];
              ITEM LIN8END U(13,42,18)=[0]; 
            END 
  
          ARRAY OUTLINE9 [0:0] S(14); 
            BEGIN            # WORKING AREA FOR OUTPUT LISTING #
              ITEM OUTLIN9 C(0,0,137)=[" "];
              ITEM LIN9END U(13,42,18)=[0]; 
            END 
  
          ARRAY DISPOSP [0:15] S(1);
            BEGIN            # HEX. DISPLAY CODE POSITION # 
              ITEM DISPOS U(0,52,8)=[0,6,12,18,24,30,36,42,48,54,60,66, 
                                     72,78,84,90];
            END 
  
          ARRAY ASCPOSP [0:15] S(1);
            BEGIN            # ASCII DISPLAY CODE POSITION #
              ITEM ASCPOS U(0,52,8)=[0,2,4,6,8,10,12,14,16,18,20,22,24, 
                                     26,28,30]; 
            END 
  
          ITEM TYPE9 I;      # FLAG TO INDICATE FILE 1 OR MACRO MEM#
          ITEM DMPBEG U;     # BEGIN ADDRESS TO BE PRINTED #
          ITEM DMPEND U;     # END   ADDRESS TO BE PRINTED #
          ITEM LINEADR U=0;  # CURRENT LINE ADDRESS # 
          ITEM LASTADR U=0;  # ADDRESS OF LAST LINE PRINTED # 
          ITEM DATAMISS C(110)="          --    --    --    --    --
--    --    --    --    --    --    --    --    --    --    --        ";
                             # DATA MISSING IN DUMP FILE #
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          IF RULES EQ 8 
          THEN               # FILE 1 REGISTERS TO BE PRINTED # 
            BEGIN 
              TYPE9 = 6;     # FILE 1 RECORD AND CONVERSION WANTED #
              DMPBEG = B<12,24>FILE1REC1[0];
              DMPEND = B<36,24>FILE1REC1[0];
            END 
          ELSE               # MACRO MEMORY RECORDS TO BE PRINTED # 
            BEGIN 
            IF RULES EQ 7    # PAGE REGISTER RECORDS TO BE PRINTED     #
            THEN
              BEGIN 
              TYPE9 = 6;
              DMPBEG = B<12,24>PAGREGREC1[0];# SET BEGIN ADDRESS       #
              DMPEND = B<36,24>PAGREGREC1[0]; 
              END 
            ELSE
              BEGIN 
              TYPE9 = 7;     # MACRO MEM RECORDS AND CONVERSION WANTED #
              DMPBEG = BEGADD;         # SET BEGIN ADDRESS #
              DMPEND = ENDADD;         # SET END ADDRESS #
              DMPWD1[0] = 0; # CLEAR BUFFER TO FORCE READ IN GETRAN # 
              DMPWD2[0] = 0;
              END 
            END 
          I01 = DMPBEG - DMPBEG / WODPLN * WODPLN;
          IF I01 NQ 0 
          THEN               # ROUND BEGIN ADDRESS #
            DMPBEG = DMPBEG - I01;
          P<OUTLINE> = LOC(OUTLINE8);  # LOCATE OUTPUT WORKING AREA # 
          FOR I01=DMPBEG STEP 1 UNTIL DMPEND
          DO                 # FORMAT DUMP RECORDS HERE # 
            BEGIN 
              I02 = I01 - I01 / WODPLN * WODPLN;
              IF I02 EQ 0 
              THEN           # CONVERT LINE ADDRESS TO DISPLAY #
                BEGIN 
                  HEXDIS(I01,TEMPC1,6); 
                  DISADR = TEMPC1;
                  LINEADR = I01;       # SAVE LINE ADDRESS #
                END 
              ONEWORD(I01,TEMPC1,TYPE9);
              C<DISPOS[I02],4>OUTLIN1[0] = TEMPC1;
              C<ASCPOS[I02],2>OUTLIN2[0] = C<5,2>TEMPC1;
              IF I02 EQ WODPLN - 1 OR I01 EQ DMPEND 
              THEN           # LINE FILLED #
                BEGIN 
                  IF I01 EQ DMPEND
                  THEN
                    BEGIN    # PRINT LAST LINE #
                      PRINTIT = TRUE;  # SET PRINT FLAG # 
                      I03 = WODPLN - I02 - 1; 
                      IF I03 NQ 0 
                      THEN   # CLEAR BUFFER OF DATAS AFTER END ADDRESS #
                        BEGIN 
                          C<(I02+1)*6,I03*6>OUTLIN1 = " ";
                          C<(I02+1)*2,I03*2>OUTLIN2 = " ";
                        END 
                    END 
                  ELSE       # TEST FOR DUPLICATED LINE # 
                    BEGIN 
                      PRINTIT = FALSE; # INITIAL FLAG # 
                      IF C<9,94>OUTLIN8 NQ C<9,94>OUTLIN9 
                      THEN   # NOT A DUPLICATED LINE #
                        PRINTIT = TRUE; 
                      IF NOT PRINTIT AND EXPAND 
                      THEN   # TEST FOR DATA MISSING IN DUMP FILE # 
                        IF C<9,94>OUTLIN NQ C<9,94>DATAMISS 
                        THEN # NOT DATA MISSING # 
                          PRINTIT = TRUE;   # EXPAND LISTING WANTED # 
                    END 
                  IF PRINTIT
                  THEN       # PRINT THE LINE # 
                    BEGIN 
                      IF LINEADR GR LASTADR + WODPLN
                      THEN   # SET DUPLICATED LINE SYMBOL ** IN OUTPUT #
                        DUPLIC = "**";
                      ELSE
                        DUPLIC = "  ";
                      LASTADR = LINEADR;         # RESET LAST LINE ADDR#
                      PRINTH(OUTLINE,14); 
                       IF P<OUTLINE> EQ LOC(OUTLINE8) 
                      THEN   # LOCATE ANOTHER WORKING BUFFER #
                        P<OUTLINE> = LOC(OUTLINE9); 
                      ELSE
                        P<OUTLINE> = LOC(OUTLINE8); 
                    END 
                END 
              IF IOSTAT EQ RDEOI
              THEN           # END OF FILE #
                I01 = DMPEND;          # SET INDEX TO END # 
            END 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMATA             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMATA ISOLATE AND LIST THE CONTENT OF LCBS WITH ITS
*        SUBORDINATE TCBS TO PROCESS DIRECTIVE RULE A.
* 
*     3. METHOD USED: 
*        FORMATA COUNT THE NUMBER OF TCBS WITH A LCB TO DECIDE HOW MANY 
*        LCB-TCB WE MUST FORMAT IN ONE LINE. IF A LCB WITH MORE 
*        THAN 15 TCBS THEN CALL FORMATA1 TO FORMAT IT, ELSE CALL
*        FORMATA2 TO FORMAT ONE OR MORE THAN ONE LCBS IN ONE LINE.
* 
*     4. ENTRY PARAMETERS:  
*        INPBUFC    CONTAINS THE INPUT DIRECTIVE LINE.
*        PARAMI     CONTAINS THE INPUT PARAMETERS ON DIRECTIVE LINE.
* 
*     5. EXIT PARAMETERS: 
*        TCBCNT     TCB COUNT WITH A LCB
*        TCBADR     LCB/TCB ADDRESS POINTER 
*        CNT        COUNT OF LCB WE MUST FORMAT THEM IN ONE LINE
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        ONEWORD    GET A 16-BITS WORD FROM RANDOM WORK FILE - SYMPL
*        PTRMISS    PRINT THE POINTER WORD MISSING MESSAGE - SYMPL
*        HEADING    PRINT THE HEADING INFORMATION - SYMPL 
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        FORMATA1   FORMAT A LCB WITH MORE THAN 15 TCBS - SYMPL 
*        FORMATA2   FORMAT ONE OR MORE THAN ONE LCB IN ONE LINE - SYMPL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         FORMAT LCB/TCB PROCEDURE                                     #
#                                                                      #
#**********************************************************************#
      PROC FORMATA; 
        BEGIN  #FORMATA#     # FORMAT LCB/TCB OR LCB/CCB               #
          BASED ARRAY INPARA [0:0] S(7);
            BEGIN            # INPUT PARAMETERS FOR RULE A #
              ITEM LCBP U(0,0,60);     # POINTER TO FIRST LCB # 
              ITEM LCBL U(1,0,60);     # LENGTH OF LCB DATA STRUCTURE # 
              ITEM FTCB U(2,0,60);     # INDEX TO FIRST TCB # 
              ITEM TCBL U(3,0,60);     # LENGTH OF TCB STRUCTURE #
              ITEM NTCB U(4,0,60);     # INDEX TO NEXT TCB #
              ITEM NLCB U(5,0,60);     # NUMBER OF LCB TO BE LISTED # 
              ITEM LCBX U(6,0,60);     # FIRST LCB TO BE LISTED # 
            END 
  
          ARRAY TCBADDR[0:15] S(1); 
            BEGIN            # TCB ADDRESS #
              ITEM TCBADR U(0,0,60);   # TCB ADDRESS #
            END 
  
          ARRAY TCBNUMB [0:15] S(1);
            BEGIN 
              ITEM TCBNUM U(0,0,60);   # TCB NUMBER # 
            END 
  
          ARRAY TCBCOUNT [0:7] S(1);
            BEGIN 
              ITEM TCBCNT U(0,0,60);   # TCB COUNT #
            END 
  
          ITEM LCBPY  U;     # FIRST LCB ADDRESS #
          ITEM NLCBY  U;     # NUMBER OF LCB TO BE LISTED # 
          ITEM CNT    I;     # COUNT #
          ITEM TCBPTR U;     # TCB POINTER #
          ITEM NXTTCB U;     # NEXT TCB POINTER # 
          ITEM LCBADR U;     # LCB ADDRESS #
          ITEM TOTALT I;     # TOTAL OF TCB # 
      CONTROL EJECT;
          P<INPARA> = LOC(PARAMI);     # LOCATE INPUT PARAMETERS #
          IF FTCB GR LCBL OR NTCB GR TCBL 
          THEN               # ERROR IN DIRECTIVE # 
            BEGIN 
              INPBUFD = INPBUFC;       # MOVE DIRECTIVE FOR MESSAGE # 
              PRINTH(OUTBUFI,9);       # PRINT ERROR DIRECTIVE #
              PRINTH(LCBERR,7);        # PRINT ERROR MESSAGE #
              PRINTH(BLLINE,1);        # PRINT A BLANK LINE # 
              RETURN; 
            END 
          ONEWORD(LCBP,LCBPY,1);       # GET LCB ADDRESS FROM DUMP FILE#
          IF NLCB EQ 0
          THEN               # JUST ONE LCB TO BE LISTED #
            NLCBY = 1;
          ELSE               # GET THE NUMBER OF LCBS TO BE LISTED #
            ONEWORD(NLCB,NLCBY,0);     # GET NUMBER OF LCBS FROM FILE # 
          IF NLCBY EQ 0 
          THEN               # SET NUMBER TO MINIMUM #
            NLCBY = 1;
          IF B<24,1>LCBPY EQ 1 OR B<24,1>NLCBY EQ 1 
          THEN               # POINTER WORD MISSING # 
            BEGIN 
              IF B<24,1>LCBPY EQ 1 THEN PTRMISS(LCBP);
              IF B<24,1>NLCBY EQ 1 THEN PTRMISS(NLCB);
              RETURN; 
            END 
          FOR I01=0 STEP 1 UNTIL 15 
          DO                 # INITIAL VALUE #
            BEGIN 
              TCBNUM[I01] = 0;
              TCBADR[I01] = 0;
            END 
          FOR I01=LCBX STEP 1 UNTIL NLCBY + LCBX - 1
          DO
            BEGIN 
              LCBADR = LCBPY + LCBL * I01;
              FOR I02=0 STEP 1 UNTIL 7
              DO             # INITIAL TCB COUNT ARRAY #
                TCBCNT[I02] = 0;
              TOTALT = 0; 
              FOR I02=0 STEP 1 UNTIL LCBPLN-1 
              DO             # DETERMINE HOW MANY LCBS IN ONE LINE #
                BEGIN 
                  IF (I01 + I02) LQ NLCBY + LCBX - 1
                  THEN
                    BEGIN 
                      TCBPTR = LCBADR + I02 * LCBL + FTCB;
                      ONEWORD(TCBPTR,NXTTCB,1);  # GET NEXT TCB POINTER#
                      FOR I03=0 STEP 1 WHILE B<44,16>NXTTCB NQ 0
                      DO     # COUNT TCB #
                        BEGIN 
                          TCBPTR = NXTTCB + NTCB;# NEXT TCB POINTER # 
                          ONEWORD(TCBPTR,NXTTCB,1);   # GET NEXT TCB #
                          IF NXTTCB NQ 0
                          THEN         # SAVE TCB POINTER # 
                            TCBCNT [I02] = TCBCNT [I02] + 1;
                          IF TCBCNT[I02] GQ MAXTCB
                          THEN         # TCB CHAINS EXCEED MAXIMUM #
                            BEGIN      # ERROR IN TCB CHAIN # 
                              IF I02 EQ 0 
                              THEN
                                BEGIN 
                                  INPBUFD = INPBUFC;
                                  PRINTH(OUTBUFI,9);
                                  PRINTH(TCBERR,6); 
                                  PRINTH(BLLINE,1); 
                                END 
                              NXTTCB = 0;        # FORCE LOOP END # 
                            END 
                        END 
                      IF TCBCNT[I02] EQ 0 
                      THEN
                        TCBCNT[I02] = 1;
                      TOTALT = TOTALT + TCBCNT[I02] + 1;  # COUNT TOTAL#
                      IF TOTALT EQ LCBPLN * 2 
                      THEN   # EACH LCB WITH ONE TCB #
                        BEGIN 
                          CNT = I02;
                          I02 = LCBPLN - 1; 
                         END
                       IF TOTALT GR LCBPLN * 2
                       THEN  # EXCEED LINE SIZE # 
                        BEGIN 
                         IF I02 GR 0
                          THEN
                            CNT = I02 - 1;       # ROUND COUNT TO LAST #
                          ELSE
                            CNT = 0;
                          I02 = LCBPLN - 1; 
                        END 
                    END 
                  ELSE
                    BEGIN 
                      CNT = I02 - 1;
                      I02 = LCBPLN - 1; 
                    END 
                END 
              IF LCBL GQ TCBL 
              THEN           # SET LENGTH TO LCB LENGTH # 
                I05 = LCBL - 1; 
              ELSE           # SET LENGTH TO TCB LENGTH # 
                I05 = TCBL - 1; 
              IF (LINENO + I05 + 3) GR XLINP
              THEN           # STRUCTURE EXCEED PAGE SIZE # 
                HEADING;     # PRINT HEADER INFORMATION # 
              C<10,28> STRING = C<42,28> INPBUFC; 
              PRINTH(OUTBUF,14); # PRINT HEADER LINE #
              STRING = " "; 
              IF CNT EQ 0 AND TCBCNT[0] GR TCBPLN 
              THEN           # FORMAT ONE LCB WITH MORE THAN 15 TCBS #
                BEGIN 
                  FORMATA1; 
                END 
              ELSE           # ONE OR MORE THAN ONE LCBS IN ONE LINE #
                BEGIN 
                  FORMATA2; 
                  I01 = I01 + CNT;     # RESET COUNTER #
                END 
            END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMATA1            JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMATA1 FORMAT THE LCB WITH MORE THAN 15 TCBS AND PRINT THEM
*        INTO OUTPUT LISTING. 
* 
*     3. METHOD USED: 
*        FORMATA1 CALL ONEWORD TO GET DATA WORDS FROM RANDOM WORK FILE, 
*        CALL HEXDIS TO CDNVERT HEXADECIMAL TO DISPLAY, FORMAT THEM INTO
*        OUTPUT LINE AND CALL PRINTH TO PRINT IT. 
* 
*     4. ENTRY PARAMETERS:  
*        TCBCNT     CONTAINS NUMBER OF TCBS WITH THIS LCB.
*        TCBADR     CONTAINS LCB/TCB ADDRESS POINTER. 
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        HEXDIS     CONVERT HEXADECIMAL TO DISPLAY - SYMPL
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        ONEWORD    GET A 16-BITS WORD FROM RANDOM WORK FILE - SYMPL
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         PROCESS MORE THAN 15 TCBS WITH ONE LCB FOR RULES A.          #
#                                                                      #
#**********************************************************************#
      PROC FORMATA1;
        BEGIN  #FORMATA1#    # FORMAT LCB WITH MORE THAN 15 TCBS #
          LOOP01 = TCBCNT[0] / TCBPLN; # LOOP COUNTER # 
          FOR I02=0 STEP 1 UNTIL LOOP01 
          DO
            BEGIN 
              IF I02 EQ LOOP01
              THEN
                LOOP02 = TCBCNT[0] - TCBCNT[0] / TCBPLN * TCBPLN; 
              ELSE
                LOOP02 = TCBPLN;
              C<1,6> STRING = "OFFSET"; 
              IF I02 EQ 0 
              THEN           # FORMAT OFFSET LINE # 
                BEGIN 
                  C<10,3>STRING = "LCB";
                  HEXDIS(I01,TEMPC1,3); 
                  C<13,3>STRING = TEMPC1; 
                END 
              FOR I03=0 STEP 1 UNTIL LOOP02 - 1 
              DO
                BEGIN 
                  I04 = I02 * TCBPLN + I03; 
                  HEXDIS(I04,TEMPC1,3); 
                  C<I03*7+20,3>STRING = TEMPC1; 
                  C<I03*7+17,3>STRING = "TCB";
                END 
              PRINTH(OUTBUF,14);
              STRING = " "; 
              C<2,5> STRING = "LOC..";
              IF I02 EQ 0 
              THEN           # FORMAT ADDRESS LINE #
                BEGIN 
                  HEXDIS(LCBADR,TEMPC1,4);       # CONVERT TO DISPLAY # 
                  C<10,4> STRING = TEMPC1;
                  TCBADR[0] = LCBADR; 
                END 
              FOR I03=1 STEP 1 UNTIL LOOP02 
              DO
                BEGIN 
                  IF I03 EQ 1 AND I02 EQ 0
                  THEN
                    TEMPU1 = TCBADR[I03 - 1] + FTCB;
                  ELSE
                    TEMPU1 = TCBADR[I03 - 1] + NTCB;
                  ONEWORD(TEMPU1,TEMPC1,3); 
                  B<0,44> TCBADR[I03] = 0;
                  B<44,16> TCBADR[I03] = B<44,16> TEMPC1; 
                  C<I03*7+10,4> STRING = TEMPC1;
                END 
              PRINTH(OUTBUF,14);
              STRING = " "; 
              FOR I03=0 STEP 1 UNTIL I05
              DO             # FORMAT OFFSET #
                BEGIN 
                  TEMPC1 = XCHD(I03); 
                  C<3,4> STRING = C<6,4> TEMPC1;
                  FOR I04=0 STEP 1 UNTIL LOOP02 
                  DO         # FORMAT DATA LINE # 
                    BEGIN 
                      IF (I04 EQ 0 AND I03 LS LCBL AND I02 EQ 0) OR 
                       (I04 NQ 0 AND I03 LS TCBL) 
                      THEN
                        BEGIN 
                          ONEWORD(TCBADR[I04]+I03,TEMPC1,3);
                          C<I04*7+10,4> STRING = TEMPC1;
                        END 
                   END
                  PRINTH(OUTBUF,14);   # PRINT DATA LINE #
                  STRING = " ";        # CLEAR OUTPUT BUFFER #
                END 
              TCBADR[0] = TCBADR[LOOP02]; 
              PRINTH(BLLINE,1);        # BLANK LINE BETWEEN SECTION # 
              PRINTH(BLLINE,1); 
              IF (LINENO + I05 + 3) GR XLINP
              THEN           # SIZE EXCEED PAGE LIMIT # 
                HEADING;     # START A NEW PAGE # 
                  C<10,28> STRING = C<42,28> INPBUFC; 
                  PRINTH(OUTBUF,14); # PRINT HEADER LINE #
                  STRING = " "; 
            END 
        END  #FORMATA1# 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMATA2            JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMATA2 FORMAT ONE OR MORE THAN ONE LCBS IN A OUTPUT LINE, AND
*        PRINT THE LINE TO OUTPUT LISTING.
* 
*     3. METHOD USED: 
*        FORMATA2 CALL ONEWORD TO GET DATA WORDS FROM RANDOM WORK FILE, 
*        CALL HEXDIS TO CONVERT HEXADECIMAL TO DISPLAY, FORMAT THEM INTO
*        OUTPUT LINE AND CALL PRINTH TO PRINT IT. 
* 
*     4. ENTRY PARAMETERS:  
*        CNT        COUNT OF LCBS IN ONE LINE 
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        ONEWORD    GET A 16-BIT  WORD FROM RANDOM WORK FILE - SYMPL
*        HEXDIS     CONVERT HEXADECIMAL TO DISPLAY - SYMPL
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        XCHD       CONVERT OCTAL TO HEXADECIMAL DISPLAY - SUPIO
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         FORMAT ONE OR MANY LCB WITH ITS TCB IN ONE LINE.             #
#                                                                      #
#**********************************************************************#
      PROC FORMATA2;         # FORMAT MORE THAN ONE LCBS IN ONE LINE #
        BEGIN  #FORMATA2# 
          I04 = 0;
          FOR I02=I01 STEP 1 UNTIL CNT + I01
          DO
            BEGIN 
              TCBNUM[I04] = I02;
              B<0,1> TCBNUM[I04] = 1; 
              TCBADR[I04] = LCBPY + LCBL * I02; 
              I04 = I04 + 1;
              FOR I03=1 STEP 1 UNTIL TCBCNT[I02 - I01]
              DO
                BEGIN        # GET LCB/TCB ADDRESS #
                  TCBNUM[I04] = I03 - 1;         # SAVE TCB NUMBER #
                  IF I03 EQ 1 
                  THEN       # GET TCB POINTER FROM LCB # 
                    TEMPU1 = TCBADR[I04-1] + FTCB;
                  ELSE       # GET TCB POINTER FROM LAST TCB #
                    TEMPU1 = TCBADR[I04-1] + NTCB;
                  ONEWORD(TEMPU1,TEMPU2,1); # GET POINTER FROM FILE # 
                  TCBADR[I04] = TEMPU2;     # SAVE LCB/TCB ADDRESS #
                  I04 = I04 + 1;
                END 
            END 
          C<1,6> STRING = "OFFSET"; 
          FOR I02=0 STEP 1 UNTIL I04-1
          DO                 # FORMAT LCB NUMBER LINE # 
            BEGIN 
              IF B<0,1>TCBNUM[I02] EQ 1 
              THEN
                C<I02*7+10,3>STRING = "LCB";
              ELSE
                C<I02*7+10,3>STRING = "TCB";
              HEXDIS(TCBNUM[I02],TEMPC1,3); 
              C<I02*7+13,3>STRING = TEMPC1; 
            END 
          PRINTH(OUTBUF,14); # PRINT LCB NUMBER LINE #
          STRING = " "; 
          C<2,5> STRING = "LOC..";
          FOR I02=0 STEP 1 UNTIL I04 - 1
          DO                 # FORMAT LOCATION LINE # 
            IF TCBADR[I02] NQ 0 
            THEN
            BEGIN 
              HEXDIS(TCBADR[I02],TEMPC1,4); 
              C<I02*7+10,4> STRING = TEMPC1;
            END 
          PRINTH(OUTBUF,14);           # PRINT LOCATION LINE #
          STRING = " ";      # CLEAR OUTPUT BUFFER #
          FOR I02=0 STEP 1 UNTIL I05
          DO                 # FORMAT DATA LINE # 
            BEGIN 
              TEMPC1 = XCHD(I02);      # CONVERT TO HEX. DIS. # 
              C<3,4> STRING = C<6,4> TEMPC1;
              FOR I03=0 STEP 1 UNTIL I04-1
              DO             # FORMAT DATA LINE # 
                BEGIN 
                  IF (B<0,1>TCBNUM[I03] EQ 1 AND I02 LS LCBL) OR
                      (B<0,1>TCBNUM[I03] NQ 1 AND I02 LS TCBL AND 
                       TCBADR[I03] NQ 0)
                  THEN
                    BEGIN 
                      TEMPU1 = TCBADR[I03] + I02; 
                      ONEWORD(TEMPU1,TEMPC1,3); 
                      C<I03*7+10,4> STRING = TEMPC1;
                    END 
                END 
              PRINTH(OUTBUF,14);       # PRINT DATA LINE #
              STRING = " ";            # CLEAR OUTPUT BUFFER #
            END 
          PRINTH(BLLINE,1);            # BLANK LINE BETWEEN SECTION # 
          PRINTH(BLLINE,1); 
        END  #FORMATA2# 
        END  #FORMATA#
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMATB             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMATB ISOLATE AND LIST THE CONTENT OF THE PORT TABLE WITH ITS
*        SUBORDINATE MUX LCBS TO PROCESS DIRECTIVE RULE B.
* 
*     3. METHOD USED: 
*        FORMATB CALL ONEWORD TO GET POINTER WORDS FROM RANDOM WORK FILE
*        , IF POINTER WORDS MISSING THEN CALL PTRMISS TO PRINT THE ERROR
*        MESSAGE AND RETURN TO DNPROC,ELSE CALL ONEWORD TO RETREIVE DATA
*        WORDS FROM RANDOM WORK FILE, CALL HEXDIS TO CONVERT DATA TO
*        DISPLAY AND CALL PRINTH TO PRINT THE FORMATTED LINE. 
* 
*     4. ENTRY PARAMETERS:  
*        INPBUFC    CONTAINS THE INPUT DIRECTIVE LINE 
*        PARAMI     CONTAINS THE PARAMETERS ON DIRECTIVE LINE.
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        ONEWORD    GET A 16-BITS WORD FROM RANDOM WORK FILE - SYMPL
*        PTRMISS    PRINT THE POINTER WORD MISSING MESSAGE - SYMPL
*        HEADING    PRINT THE HEADING INFORMATION - SYMPL 
*        PRINTH     PRINT A LINE TO OUTPUT LISTING - SYMPL
*        HEXDIS     CONVERT HEXADECIMAL TO DISPLAY CODE - SYMPL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         FORMAT PORT TABLES AND ITS  ASSOCIATED MUX TABLES PROCEDURE  #
#                                                                      #
#**********************************************************************#
      PROC FORMATB; 
        BEGIN                # FORMAT PORT AND MUX TABLES # 
          BASED ARRAY INPARB [0:0] S(8);
            BEGIN            # INPUT PARAMETERS FOR RULE B #
              ITEM PTTP U(0,0,60);     # FIRST PORT TABLE POINTER # 
              ITEM PTTL U(1,0,60);     # PORT TABLE LENGTH #
              ITEM MUXP U(2,0,60);         # MUX TABLE POINTER #
              ITEM MUXL U(3,0,60);     # MUX TABLE LENGTH # 
              ITEM PTRN U(4,0,60);     # PATTERN FOR VALID MUX TABLE #
              ITEM MASK U(5,0,60);     # MASK FOR ISOLATING PATTERN # 
              ITEM TSTX U(6,0,60);     # VALIDITY TESTING WORD INDEX #
              ITEM NPTT U(7,0,60);     # POINTER TO NO. OF PORT TABLE # 
            END 
  
          ARRAY PTADR  [0:15] S(1); 
            BEGIN            # PORT AND MUX TABLE ADDRESS # 
              ITEM PTADDR U(0,0,60);
            END 
  
          ITEM PTTPY U;      # CONTENT OF PORT TABLE POINTER #
          ITEM NPTTY U;      # NUMBER OF PORT TO BE LISTED #
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          P<INPARB> = LOC(PARAMI);     # LOCATE INPUT PARAMETER # 
          ONEWORD(PTTP,PTTPY,0);       # GET PORT TABLE POINTER # 
          IF MUXP GR PTTL OR TSTX GR PTTL 
          THEN               # ERROR IN DIRECTIVE # 
            BEGIN 
              INPBUFD = INPBUFC;       # MOVE DIRECTIVE FOR MESSAGE # 
              PRINTH(OUTBUFI,9);       # PRINT ERROR DIRECTIVE #
              PRINTH(PTBERR,6);        # PRINT ERROR MESSAGE #
              PRINTH(BLLINE,1);        # PRINT A BLANK LINE # 
              RETURN; 
            END 
          ONEWORD(NPTT,NPTTY,0);       # GET NUMBER OF PORTS TO BE LIST#
          IF B<24,1>PTTPY EQ 1 OR B<24,1>NPTTY EQ 1 
          THEN               # POINTER WORD MISSING # 
            BEGIN 
              IF B<24,1>PTTPY EQ 1 THEN PTRMISS(PTTP);
              IF B<24,1>NPTTY EQ 1 THEN PTRMISS(NPTT);
              RETURN; 
            END 
          IF PTTL GQ MUXL 
          THEN
            I03 = PTTL - 1; 
          ELSE
            I03 = MUXL - 1; 
          LOOP01 = (NPTTY - 1) / PTBPLN;
          FOR I01=0 STEP 1 UNTIL LOOP01 
          DO
            BEGIN 
              IF I01 EQ LOOP01
              THEN           # LAST LOOP #
                LOOP02 = (NPTTY - 1) - (NPTTY - 1) / PTBPLN * PTBPLN; 
              ELSE           # NOT LAST LOOP #
                LOOP02 = PTBPLN - 1;
              IF (LINENO + I03 + 3) GR XLINP
              THEN           # STRUCTURE BEYOND END OF PAGE # 
                HEADING;
              C<10,22> STRING = C<48,22> INPBUFC;    # MOVE HEADING # 
              PRINTH(OUTBUF,14); # PRINT THE HEDER LINE # 
              STRING = " "; 
              FOR I02=0 STEP 1 UNTIL LOOP02 
              DO             # FORMAT IDENTIFICATION LINE # 
                BEGIN 
                  HEXDIS(I01*PTBPLN+I02,TEMPC1,3);
                  C<I02*14+10,4> STRING = "PORT"; 
                  C<I02*14+14,3> STRING = TEMPC1; 
                  C<I02*14+18,3> STRING = "MUX";
                END 
              C<1,6> STRING = "OFFSET"; 
              PRINTH(OUTBUF,14);       # PRINT ID LINE #
              STRING = " ";            # CLEAR OUTPUT BUFFER #
              C<2,5> STRING = "LOC..";
              FOR I02=0 STEP 1 UNTIL LOOP02 
              DO             # FORMAT STRUCTURE ADDRESS LINE #
                BEGIN 
                  PTADDR[I02*2] = PTTPY + (I01*PTBPLN+I02) *PTTL; 
                  ONEWORD(PTADDR[I02*2]+TSTX,TEMPU2,1); 
                  IF (TEMPU2 LAN MASK) EQ PTRN
                  THEN       # GET MUX POINTER FROM DUMP FILE # 
                    BEGIN 
                      ONEWORD(PTADDR[I02*2]+MUXP,TEMPU1,1); 
                      PTADDR[I02*2+1] = TEMPU1; 
                    END 
                  ELSE       # NOT A VALID MUX TABLE #
                    PTADDR[I02*2+1] = 0;         # SET ADDRESS TO ZERO #
                  HEXDIS(PTADDR[I02*2],TEMPC1,4);# CONVERT TO DIS. #
                  C<I02*14+10,4> STRING = TEMPC1; 
                  IF PTADDR[I02*2+1] NQ 0 
                  THEN
                    BEGIN 
                      HEXDIS(PTADDR[I02*2+1],TEMPC1,4); 
                      C<I02*14+17,4> STRING = TEMPC1; 
                    END 
                END 
              PRINTH(OUTBUF,14);       # PRINT ADDRESS LINE # 
              STRING = " ";  # CLEAR OUTPUT BUFFER #
              FOR I04=0 STEP 1 UNTIL I03
              DO             # FORMAT DETAIL DATA LINE #
                BEGIN 
                  TEMPC1 = XCHD(I04);  # CONVERT OFFSET TO HEX. DIS. #
                  C<3,4> STRING = C<6,4> TEMPC1;
                  FOR I02=0 STEP 1 UNTIL LOOP02 
                  DO
                    BEGIN 
                      IF I04 LS PTTL
                      THEN
                        BEGIN          # RETRIVE DATA FROM DUMP FILE #
                          ONEWORD(PTADDR[I02*2]+I04,TEMPC1,3);
                          C<I02*14+10,4> STRING = TEMPC1; 
                        END 
                      IF I04 LS MUXL AND PTADDR[I02*2+1] NQ 0 
                      THEN
                        BEGIN          # GET MUX TABLE DATA # 
                          ONEWORD(PTADDR[I02*2+1]+I04,TEMPC1,3);
                          C<I02*14+17,4> STRING = TEMPC1; 
                        END 
                    END 
                  PRINTH(OUTBUF,14);   # PRINT DETAIL DATA LINE # 
                  STRING = " ";        # CLEAR OUTPUT BUFFER #
                END 
              PRINTH(BLLINE,1);         # BLANK LINE #
              PRINTH(BLLINE,1); 
            END 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        FORMATF             JACOB C. K. CHEN      80/02/01 
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        FORMATF PROCESS THE FINISH DIRECTIVE.
* 
*     3. METHOD USED: 
*        FORMATF SET THE END OF FILE FLAG ON TO FORCE END OF DIRECTIVES 
*        PROCESSING.
* 
*     4. ENTRY PARAMETERS:  
*        NONE 
* 
*     5. EXIT PARAMETERS: 
*        IEOF       END OF FILE FLAG OF INPUT DIRECTIVES FILE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED
*        NONE 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         PROCESS FINISH DIRECTIVE PROCEDURE                           #
#                                                                      #
#**********************************************************************#
      PROC FORMATF; 
        BEGIN                # PROCESS FINISH DIRECTIVE # 
          IEOF = TRUE;
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        ONEWORD             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        GET ONE 16-BIT WORD FROM RANDOM FILE AND CONVERT IT TO DISPLAY 
*        CODE SUITABLE FOR OUTPUT 
* 
*     3. METHOD USED: 
*        USE ONE FLAG AS FILE 1 REGISTER OR MACRO MEMORY DUMP INDICATOR,
*        ANOTHER FLAG AS CONVERSION INDICATOR. IF DATA MISSING SET NO 
*        DATA FLAG ON THEN RETURN TO CALLING PROCEDURE
* 
*     4. ENTRY PARAMETERS:  
*        WODADR     WORD ADDRESS IN DUMP RECORD.
*        TYPE       USE BIT 59 AND 58 AS DUMP TYPE AND CONVERSION FLAG
* 
*     5. EXIT PARAMETERS: 
*        WODOUT     FOR DATA OUTPUT AND NO DATA FLAG BIT
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        HEXDIS     CONVERT HEX TO DISPLAY CODE - SYMPL 
*        GETRAN     GET A RANDOM RECORD FROM NEVFILE - SYMPL
* 
*     8. DAYFILE MESSAGES:  
*        NONE.
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         GET A 16 BITS WORD RROM RANDOM FILE                          #
#                                                                      #
#**********************************************************************#
      PROC ONEWORD((WODADR),WODOUT,(TYPE)); 
        BEGIN                # GET A 16 BITS WORD FROM RANDOM FILE #
          BASED ARRAY BUFIN [0:0] S(1); 
            BEGIN            # DUMP FILE BUFFER # 
              ITEM BUFWD U(0,0,60); 
              ITEM BUFBEG U(0,12,24);  # BEGIN ADDRESS OF BUFFER #
              ITEM BUFEND U(0,36,24);  # END ADDRESS OF BUFFER #
            END 
          ITEM WODPOS U;     # WORD POSITION #
          ITEM BITPOS U;     # BIT POSITION # 
          ITEM WODADR U;     # ADDRESS #
          ITEM TEMPC1 C(10);           # WORK AREA #
          ITEM TYPE I;       # INDEX #
          ITEM NODATA C(10)=" -- ";    # DATA MISSING IN DUMP FILE #
          ITEM WODOUT U;               # WORD RETURN #
          ITEM I;            # INDEX #
      CONTROL EJECT;
#*********************************************************************# 
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#*********************************************************************# 
  
          WODOUT = 0;        # CLEAR OUTPUT WORD #
          IF PBUFIN 
          THEN
            BEGIN 
            IF RULES EQ 9 
              AND B<0,3>BUFWD[0] EQ MACREC
              AND WODADR GR BUFBEG[0] 
              AND WODADR LQ BUFEND[0] 
            THEN               # DISIRED WORD ALREADY IN BUFFER # 
              GOTO MOVEDATA;
  
            END 
          IF B<59,1> TYPE EQ 1
          THEN               # MARO MEMORY RECORD WANTED #
            BEGIN 
              IF NOT MACROB 
              THEN           # NO MEMORY RECORD IN DUMP FILE #
                BEGIN 
                  B<0,24>WODOUT = B<0,24>NODATA; # DATA MISSING # 
                  B<24,1>WODOUT = 1;   # SET FLAG TO INDICATE DATA MISS#
                  B<30,6>WODOUT = " ";
                  B<36,6>WODOUT = " ";
                  RETURN; 
                END 
              GETRAN(WODADR);          # GET A RECORD BY KEY #
              IF IOSTAT EQ 0
              THEN
                BEGIN 
                P<BUFIN> = LOC(DMPBUF);# LOCATE RECORD BUFFER # 
                PBUFIN = TRUE;
                END 
              ELSE                     # RECORD NOT IN FILE # 
                BEGIN 
                  B<0,24> WODOUT = B<0,24> NODATA;    # DATA MISSING #
                  B<24,1> WODOUT = 1;  # SET DATA MISSING FLAG #
                  B<30,6>WODOUT = " ";
                  B<36,6>WODOUT = " ";
                  RETURN; 
                END 
            END 
          ELSE
            BEGIN    # NOT MACRO MEM,THEN MUST BE FILE1 OR PAGE REG   # 
              IF FILE1B AND WODADR LQ 255 
              THEN
                BEGIN 
                P<BUFIN> = LOC(FILE1REC);        # LOCATE BUFFER #
                PBUFIN = TRUE;
                END 
              ELSE
                BEGIN        # NOT FILE1 DUMP REC # 
                  IF PREG AND WODADR LQ 32          # PAGE REGISTER # 
                  THEN
                    BEGIN 
                    P<BUFIN> = LOC(PAGREGREC);
                    PBUFIN = TRUE;
                    END 
                  ELSE       # DATA NOT IN DUMP FILE                   #
                    BEGIN 
                    B<0,24> WODOUT = B<0,24> NODATA;
                    B<24,1> WODOUT = 1;#SET FLAG TO INDICATE DATA MISS# 
                    B<30,6>WODOUT = " ";
                    B<36,6>WODOUT = " ";
                    RETURN; 
                    END 
                END 
            END 
          WODADR = WODADR - BUFBEG[0]; # COUNT DATA ADDRESS IN BUFFER # 
          WODPOS = WODADR * 16 / 60;   # CACULATE WORD POSITION # 
          BITPOS = WODADR * 16 - WODPOS * 60;    # BIT POSITION # 
 MOVEDATA:  
          FOR I=0 STEP 1 UNTIL 3
          DO                 # MOVE A 16 BITS WORD TO WORD OUT #
            BEGIN 
              B<I*4+44,4>WODOUT = B<BITPOS,4>BUFWD[WODPOS+1]; 
              IF BITPOS GQ 56 
              THEN           # SPAN TO NEXT WORD #
                BEGIN 
                  BITPOS = 0;          # RESET BIT POSITION # 
                   WODPOS = WODPOS + 1;          # SET WORD POSITION #
                END 
              ELSE
                BITPOS = BITPOS + 4;
            END 
          IF B<58,1> TYPE EQ 1
          THEN               # CONVERTION TO DISPLAY CODE DESIRED # 
            BEGIN 
              HEXDIS(WODOUT,TEMPC1,4); # CONVERT TO DISPLAY # 
              B<0,24> WODOUT = B<0,24> TEMPC1;
            END 
          IF B<57,1>TYPE EQ 1 
            AND NOT EBCDIC
          THEN               # CONVERT TO ASCII WANTED #
            BEGIN 
              IF B<44,1>WODOUT EQ 1 
              THEN
                B<30,6>WODOUT = " ";
              ELSE
                B<30,6>WODOUT = ASCVAL[B<44,8>WODOUT];
              IF B<52,1>WODOUT EQ 1 
              THEN
                B<36,6>WODOUT = " ";
              ELSE
                B<36,6>WODOUT = ASCVAL[B<52,8>WODOUT];
            END 
  
          ELSE                       # NOT *ASCII* CONVERSION # 
            BEGIN  # NOT *ASCII* #
  
            IF B<57,1>TYPE EQ 1 
              AND EBCDIC
            THEN                     # *EBCDIC* CONVERSION SELECTED # 
              BEGIN 
              B<30,6>WODOUT = EBCDVAL[B<44,8>WODOUT]; 
              B<36,6>WODOUT = EBCDVAL[B<52,8>WODOUT]; 
              END 
  
            END  # NOT *ASCII* #
  
        END 
                                                         CONTROL EJECT; 
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        GETRAN              JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        GET A RANDOM RECORD FROM NEUFILE WITH ADDRESS SPECIFIED
* 
*     3. METHOD USED: 
*        USE TWO BUFFERS AS DUMP BUFFERS FOR INCREASED I/O SPEED
*        IF RECORD NOT FOUND IN TWO BUFFERS TRY TO GET ANOTHER
*        RECORD FROM RANDOM FILE NEUFILE WITH RECORD ID AND ADDRESS 
*        SPECIFIED. 
* 
*     4. ENTRY PARAMETERS:  
*        ADDRES     KEY ADDRESS 
*        MACREC     MACRO MEMORY RECORD TYPE
*        DMPBUF1    DUMP FILE RECORDS BUFFER 1
*        DMPBUF2    DUMP FILE RECORDS BUFFER 2
* 
*     5. EXIT PARAMETERS: 
*        IOSTAT     STATUS RETURNED ON SUPIO FUNCTIONS
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        FINDRI     GET RECORD ID - SYMPL 
*        READRI     READ A RECORD FROM RANDOM FILE - SYMPL
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         GET A RANDOM RECORD FROM NEUFILE WITH BEGIN ADDRESS          #
#                                                                      #
#**********************************************************************#
      PROC GETRAN ((ADDRES)); 
        BEGIN                # GET A RECORD BY KEY #
          ITEM ADDRES U;     # KEY ADDRESS #
      CONTROL EJECT;
          IF B<0,3>DMPWD[0] EQ MACREC AND ADDRES GQ B<12,24>DMPWD[0]
             AND ADDRES LQ B<36,24>DMPWD[0] 
          THEN
            BEGIN            # RECORD ALREADY IN BUFFER # 
              IOSTAT = 0;    # RESET RETURN CODE #
              RETURN; 
            END 
          ELSE
            BEGIN            # CHECK ANOTHER BUFFER # 
              IF P<DMPBUF> EQ LOC(DMPBUF1)
              THEN           # LOCATE BUFFER ADDRESS #
                P<DMPBUF> = LOC(DMPBUF2); 
              ELSE
                P<DMPBUF> = LOC(DMPBUF1); 
              IF B<0,3>DMPWD[0] EQ MACREC AND ADDRES GQ B<12,24>DMPWD[0]
                 AND ADDRES LQ B<36,24>DMPWD[0] 
              THEN
                BEGIN        # RECORD IN THIS BUFFER #
                  IOSTAT = 0;     # RESET STATUS #
                  RETURN; 
                END 
            END 
          P<SIOFET> = LOC(NEUFILE);    # LOCATE FET ADDRESS # 
          P<SIOINDX> = FETINDX[0];     # LOCATE SUPERVISOR INDEX #
          RECKEY = 0;        # RESET KEY VALUE #
          B<12,24>RECKEY = ADDRES;
          FINDRI (LOC(SIOINDX),RECKEY,TEMP,TEMPB);    # GET RECORD ID # 
          IF TEMP LQ LINDX[0] 
          THEN               # RECORD FOUND # 
            BEGIN 
              IF B<36,24>RI[TEMP] GR ADDRES 
              THEN
                IOSTAT = BADRI;        # SET BAD RECORD STATUS #
              ELSE
                BEGIN 
                  RECKEY = RI[TEMP];             # MOVE RECORD ID # 
                  LENGTH = BUFLEN;
                  READRI(LOC(NEUFILE),RECKEY,LOC(DMPBUF),LENGTH,IOSTAT);
                             # READ A RECORD FROM RANDOM FILE # 
                END 
            END 
          ELSE               # RECORD AFTER LAST RECORD # 
            IOSTAT = RDEOI;  # SET END OF FILE STATUS # 
          IF IOSTAT EQ RDEOR
          THEN
            IOSTAT = 0; 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        PRINTH              JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        WRITE A DETAIL LINE TO OUTPUT WITH HEADING ON EACH PAGE
* 
*     3. METHOD USED: 
*        WRITE A FORMATTED LINE TO CIO BUFFER WITH 140 CHARACTERS LONG
*        IF TOTAL LINE IN A PAGE EXCEED XLINP THEN START A NEW PAGE 
*        WITH SUITABLE HEADING AT THE TOP OF EACH PAGE
* 
*     4. ENTRY PARAMETERS:  
*        OUTLEN     LINE LENGTH 
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        WRITEH     WRITE THE LINE TO CIO BUFFER--SUPIO 
*        RECALL     SET PROGRAM/FUNCTION IN RECALL STATUS--MACREL 
*        HEADING    WRITE HEADING INFORMATION--SYMPL
* 
*     8. DAYFILE MESSAGE: 
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         WRITE A DETAIL LINE TO OUTPUT                                #
#                                                                      #
#**********************************************************************#
      PROC PRINTH(OUTBUF,OUTLEN); 
        BEGIN                # WRITE A LINE TO OUTPUT # 
          ITEM OUTBUF C(140);          # OUTPUT LINE #
          ITEM OUTLEN U;     # LINE LENGTH #
      CONTROL EJECT;
          WRITEH(OUTPUT,OUTBUF,OUTLEN);# WRITE THE LINE TO CIO BUFFER # 
          RECALL(OUTPUT); 
          LINENO = LINENO + 1;         # COUNT LINE NUMBER #
          IF LINENO GR XLINP
          THEN               # START A NEW PAGE # 
            HEADING;         # PRINT HEADING INFORMATION #
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        HEADING             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        PROCESS HEADING INFORMATION FOR EACH PAGE
* 
*     3. METHOD USED: 
*        USE TTL0 AS  DIFFERENT KIND OF OUTPUT TITLE BUFFER, IF MACRO 
*        MEMORY OR FILE 1 REGISTER DUMP, THEN WRITE ANOTHER OUTPUT
*        TITLE FROM HEAD FOR THEM 
* 
*     4. ENTRY PARAMETERS:  
*        TTL0       HEADING INFORMATION BUFFER
*        HEAD       HEADING INFORMATION FOR MACRO MEM AND FILE 1 REG. 
*        BLLINE     BLANK LINE. 
*        RULES      MACRO MEM OR FILE 1 DUMP INDICATOR
* 
*     5. EXIT PARAMETERS: 
*         LINENO    CURRENT LINE NUMBER IN LISTING
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        WRITEH     WRITE A LINE OF DATA TO FILE--SUPIO 
*        RECALL     SET PROGRAM/FUNCTION IN RECALL STATUS--MACREL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         PROCESS HEADING INFORMATION                                  #
#                                                                      #
#**********************************************************************#
      PROC HEADING; 
        BEGIN                # PRINT HEADING INFORMATION #
          PAGENO = PAGENO + 1;
          TEMPC2 = XCDD(PAGENO);
          PAGNUM = C<2,8>TEMPC2;
          WRITEH(OUTPUT,TTL,14);
          RECALL(OUTPUT); 
          WRITEH(OUTPUT,BLLINE,1);     # PRINT A BLANK LINE # 
          RECALL(OUTPUT); 
          IF RULES EQ 7 OR RULES EQ 8 OR RULES EQ 9 
          THEN     # IF MACRO MEM FILE 1, OR PAGE REG THEN ANOTHER LINE#
            BEGIN 
              WRITEH(OUTPUT,HEAD,14); 
              RECALL(OUTPUT); 
              LINENO = 5;    # RESET LINE NUMBER #
            END 
          ELSE
            LINENO = 3; 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        DISHEX              JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        CONVERT DISPLAY CODE TO HEXADECIMAL
* 
*     3. METHOD USED: 
*        THIS PROCEDURE CONVERTS 6-BIT DISPLAY CODE TO 4-BIT HEXADECIMAL
*        DEPENDING ON THE CHARACTER LENGTH ( CHARLEN ) DEMAND, IF INPUT 
*        DISIN OUT OF RANGE THEN SET ERROR FLAG ERRORI TRUE 
* 
*     4. ENTRY PARAMETERS:  
*        DISIN      INPUT DISPLAY CODE TO BE CONVERTED
*        CHARLEN    LENGTH OF DISPLAY CODE TO BE CONVERTED
* 
*     5. EXIT PARAMETERS: 
*        HEXOUT     OUTPUT HEXADECIMAL. 
*        ERRORI     ERROR FLAG FOR UNSUITABLE DISPLAY CODE
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        NONE 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         CONVERT THE DISPLAY CODE TO HEXADECIMAL                      #
#                                                                      #
#**********************************************************************#
      PROC DISHEX(DISIN,HEXOUT,CHARLEN,ERRORI); 
        BEGIN                # CONVERT DISPLAY TO HEX. #
          ITEM DISIN C(10);  # DISPLAY CODE TO BE CONVERTED # 
          ITEM HEXOUT U;     # CONVERTED HEXADECIMAL #
          ITEM CHARLEN U;    # LENGTH TO BE CONVERTED # 
          ITEM ERRORI B;     # ERROR FLAG # 
          ITEM I;            # INDEX #
          ITEM IPOS;         # INDEX #
      CONTROL EJECT;
#**********************************************************************#
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          ERRORI = FALSE;    # INITIAL FLAG # 
          HEXOUT = 0;        # CLEAR OUTPUT WORD #
          FOR I=0 STEP 1 UNTIL CHARLEN-1
          DO
            BEGIN 
              IPOS = (15 + I - CHARLEN) * 4;
              IF C<I,1>DISIN LQ "F" AND C<I,1>DISIN GQ "A"
              THEN
                B<IPOS,4>HEXOUT = C<I,1>DISIN + 9;
              ELSE
                IF (C<I,1>DISIN GQ DISZERO) AND (C<I,1>DISIN LQ DISNINE)
                THEN
                  B<IPOS,4>HEXOUT = C<I,1>DISIN - DISZERO;
                ELSE         # THERE ARE NON HEX. DIGIT # 
                  ERRORI = TRUE;       # SET ERROR FLAG # 
            END 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        HEXDIS              JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        CONVERT HEXADECIMAL TO DISPLAY CODE
* 
*     3. METHOD USED: 
*        THIS PROCEDURE CONVERT 4-BIT HEXADECIMAL TO 6-BIT DISPLAY CODE 
*        DEPENDING ON THE LENGTH ( LEN ) DEMAND, PUT CONVERTED DISPLAY
*        CODE IN DISOUT 
* 
*     4. ENTRY PARAMETERS:  
*        HEXIN     INPUT HEXADECIMAL TO BE CONVERTED
*        LEN        LENGTH FOR CONVERSION 
* 
*     5. EXIT PARAMETERS: 
*        DISOUT     OUTPUT DISPLAY CODE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        NONE 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         CONVERT THE HEXADECIMAL TO DISPLAY CODE                      #
#                                                                      #
#**********************************************************************#
      PROC HEXDIS((HEXIN),DISOUT,(LEN));
        BEGIN                # CONVERT HEX. TO DISPLAY CODE # 
          ITEM DISOUT C(10); # CONVERTED DISPLAY CODE # 
          ITEM HEXIN U;      # HEX. TO BE CONVERTED # 
          ITEM LEN I;        # INDEX #
          ITEM I;            # INDEX #
      CONTROL EJECT;
#*********************************************************************# 
#                                                                      #
#                            CODE BEGINS HERE                          #
#                                                                      #
#**********************************************************************#
  
          FOR I=0 STEP 1 UNTIL LEN - 1
          DO
            BEGIN 
              IF B<(15+I-LEN)*4,4>HEXIN LQ 9
              THEN
                C<I,1>DISOUT = B<(15+I-LEN)*4,4>HEXIN + DISZERO;
              ELSE
                C<I,1>DISOUT = B<(15+I-LEN)*4,4>HEXIN - 9;
            END 
        END 
          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        PTRMISS             JACOB C. K. CHEN       80/02/01
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        PRINT POINTER MISSING ERROR MESSAGE
* 
*     3. METHOD USED: 
*        IF POINTER MISSING THEN PRINT INPUT ERROR DIRECTIVE TOGETHER 
*        WITH OTHER PROPER ERROR MESSAGE
* 
*     4. ENTRY PARAMETERS:  
*        POINTER     POINTER WHICH IS NOT IN THE DUMP FILE
*        BLLINE      BLANK LINE 
*        INPBUFC     INPUT DIRECTIVE BUFFER 
*        OUTBUF      OUTPUT ERROR DIRECTIVE/MESSAGE BUFFER
* 
*     5. EXIT PARAMETERS: 
*        NONE 
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        PRINTH      WRITE A DETAIL LINE TO OUTPUT. - SYMPL 
*        HEXDIS      CONVERT HEXADECIMAL TO DISPLAY CODE. - SYMPL 
* 
*     8. DAYFILE MESSAGES:  
*        NONE 
* 
 #
*ENDIF
#**********************************************************************#
#                                                                      #
#         PRINT POINTER WORD MISSING ERROR MESSAGE                     #
#                                                                      #
#**********************************************************************#
      PROC PTRMISS((POINTER));
        BEGIN                # PRINT POINTER WORD MISSING MESSAGE # 
          ITEM POINTER U;    # POINTER THAT NOT IN DUMP FILE #
          ITEM WORKCP C(10); # WORKING AREA # 
      CONTROL EJECT;
          STRING = " ";      # CLEAR OUTPUT BUFFER #
          C<1,80>STRING = INPBUFC;     # PRINT ERROR DIRECTIVE #
          PRINTH(BLLINE,1);  # PRINT A BLANK LINE # 
          PRINTH(OUTBUF,14);
          STRING = " ERROR IN POINTER(    ), DATA MISSING IN DUMP FILE";
          HEXDIS(POINTER,WORKCP,4);    # CONVERT TO DISPLAY CODE #
          C<18,4>STRING = WORKCP; 
          PRINTH(OUTBUF,14); # PRINT ERROR MESSAGE #
          PRINTH(BLLINE,1);  # PRINT A BLANK LINE # 
          STRING = " "; 
        END 
                                                          CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME:             AUTHOR:               DATE: 
*        WRITERR              E. SULLIVAN           77/01/31
* 
*     2. FUNCTIONAL DESCRIPTION:  
*        PROCESSES ERRORS RETURNED FROM CALLS TO SUPIO FUNCTION WRITESR.
* 
*     3. METHOD USED: 
*        AN UNSATISFACTORY STATUS CODE RETURNED FROM WRITESR CAUSES 
*        WRITERR TO BE CALLED.  AN ERROR MESSAGE IS FORMATTED AND 
*        WRITTEN TO OUTPUT AFTER WHICH AN ERROR IS FLAGGED. 
* 
*     4. ENTRY PARAMETERS:  
*        FNAME      FILE ON WHICH WRITESR ERROR WAS RETURNED
*        REC        RECORD TYPE CURRENTLY BEING PROCESSED 
*        CODE       ERROR CODE RESPONSE FROM WRITESR
* 
*     5. EXIT PARAMETERS: 
*        WERRFLG    SET TRUE
* 
*     6. COMDECKS CALLED: 
*        NONE 
* 
*     7. ROUTINES CALLED: 
*        MESSAGE    WRITE MESSAGE TO DAYFILE--SUPIO 
*        PRDFILE    FLUSH OUTPUT BUFFER TO ASSURE A DAYFILE MESSAGE 
*        XCOD       CONVERT OCTAL TO DISPLAY - MACREL 
* 
*     8. DAYFILE MESSAGES:  
*        SUPIO ERROR XXXX IN XXXXXXX WHEN WRITING RECORD X
* 
 #
*ENDIF
      PROC WRITERR(FNAME,REC,(CODE)); 
        BEGIN 
          ITEM FNAME C(7);   #FILE IN ERROR # 
          ITEM REC C(8);
          ITEM CODE U;       #ERROR CODE RETURNED # 
      CONTROL EJECT;
          WRREC[0] = REC;    #FORMAT MESSAGE #
          TEMP = XCOD(CODE);
          WRCODE[0] = C<6,4>TEMP; 
          WRFILE[0] = FNAME;
          MESSAGE(WRERR,OPTION);       #OUTPUT MESSAGE #
          PRDFILE;           # FLUSH OUTPUT BUFFER TO ASSURE DAYFILE   #
          SUPERR = TRUE;
        END 
      CONTROL EJECT;
*IF DEF,IMS 
 #
**
*E
*     1. PROC NAME           AUTHOR              DATE 
*        PRDFILE             S.D.LEE             78/02/24 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        PRDFILE WILL ASSURE THAT THE DAYFILE IS PRINTED WHEN NDA ABORTS
*        WITH AN ERROR LOGGED IN THE DAYFILE. 
* 
*     3. METHOD USED
*        THREE BLANK LINES ARE WRITTEN TO THE OUTPUT FILE AND 
*        THE OUTPUT BUFFER IS FLUSHED TO ASSURE THE ERROR IN THE
*        DAYFILE ARE PRINTED. 
* 
*     4. ENTRY PARAMETERS 
*        NONE 
* 
*     5. EXIT PARAMETERS
*        NONE 
* 
*     6. COMDECKS CALLED
*        NONE 
* 
*     7. ROUTINES CALLED
*        WRITEH     WRITE A LINE OF DATA TO FILE
*        WRITER     WRITE A RECORD OF DATA TO FILE
* 
*     8. DAYFILE MESSAGES 
*        NONE 
 #
*ENDIF
      PROC PRDFILE; 
        BEGIN 
          WRITEH(OUTPUT,BLLINE,3);     # OUTPUT 3 BLANK LINES  #
          RECALL(OUTPUT); 
          WRITER(OUTPUT,0);            # FLUSH OUT CIO BUFFER  #
          RECALL(OUTPUT); 
        END 
        END 
      TERM
