FTN4,L, 
      PROGRAM RTMTG  (), 92065-16004  REV. 1901  780705 
C 
C  DATA BUFFERS AND STOREAGE
C 
      INTEGER FUNC1,FUNC2,A,E,F,R,X,AI(6),AO(6) 
      DIMENSION IBUF(72),IDCB1(144),IDCB2(144)
      DIMENSION IBUF4(6),IBUF5(6) 
C 
C 
C 
C 
C  RTM BRANCH AND MNEMONIC TABLE GENERATOR
C  MIKE SCHOENDORF
C  OCTOBER 22,1976
C 
C  SOURCE:        92065-18010 
C  RELOCATEABLE:  92065-16004  REV.1901  770518 
C 
C 
C 
C 
C 
C  MAXIMUM READ LENGTH FROM SESSION CONSOLE 
C 
      IL=72 
C 
C  "RTMTG"
C 
      CALL MESS1
C 
C  >
C 
50    CALL MESS2
C 
C  INITIALIZE END OF FILE, COMMAND, EDIT, ERROR, MESSAGE LENGTH 
C  AND LINE NUMBERS INDICATORS. 
C 
      E=0 
      FUNC1=0 
      FUNC2=0 
      IERR=0
      LEN=0 
      NUMB=0
C 
C  GET COMMAND FUNCTION 
C 
      CALL READ1(FUNC1,IERR)
C 
C  IF NOT EDIT, TABLE, LIST, OR END COMMANDS ERROR EXIT.
C 
      IF (IERR .NE. 0) GO TO 90 
C 
C  EDIT COMMAND 
C 
      IF (FUNC1 .EQ. 4)GO TO 995
C 
C  GET INPUT AND OUTPUT FILE NAMES
C 
      CALL GTFIL(5,IERR,0,AI,AO)
C 
C  CHECK FOR GTFIL ERR
C 
      IF (IERR .NE. 0)GO TO 910 
C 
C  OPEN INPUT FILE
C 
      CALL OPEN(IDCB1,IERR,AI(2),410B)
C 
C  CHECK FOR OPEN ERROR 
C 
      IF (IERR .LT. 0)GO TO 920 
C 
C  IF OUTPUT FILE FOR TABLE, OPEN WITH 110B 
C 
      IF (FUNC1 .EQ. 2)GO TO 95 
C 
C  OPEN OUTPUT FILE (LIST, EDIT)
C 
      CALL OPEN(IDCB2,IERR,AO(2),210B)
C 
C  CHECK FOR OPEN ERROR 
C 
55    IF (IERR .LT. 0)GO TO 70
C 
C  GO PROCESS EDIT, LIST, AND TABLE COMMANDS
C 
60    GO TO (100,700,800)FUNC1
C 
C  OPEN ERROR ON OUTPUT FILE. CHECK IF FILE EXISTS. 
C 
70    IF (IERR .EQ. -6)80,920 
C 
C  FILE DOESN'T EXIST, CREATE IT. 
C 
80    IF (FUNC1 .EQ. 2)GO TO 85 
C 
C  CREATE TYPE 4 OUTPUT FILE
C 
      CALL CREAT(IDCB2,IERR,AO(2),30,4,AO(6),AO(1)) 
C 
C  CHECK FOR CREATE ERROR 
C 
      IF (IERR .LT. 0)990,60
C 
C  CREATE TYPE 5 OUTPUT FILE
C 
85    CALL CREAT(IDCB2,IERR,AO(2),30,5,AO(6),AO(1)) 
C 
C  CHECK FOR CREATE ERROR 
C 
      IF (IERR .LT. 0)990,60
C 
C  COMMAND ERROR
C 
90    CALL ERR2 
      GO TO 50
C 
C  OPEN OUTPUT FILE (TABLES)
C 
95    CALL OPEN(IDCB2,IERR,AO(2),110B)
      GO TO 55
C 
C 
C  EDIT 
C 
C 
C 
C  INITIALIZE ADD, FIND, LINE NUMBER, DELETE LINE NUMBER INDICATORS.
C 
100   A=0 
      F=0 
      N=0 
      X=0 
C 
C  "BRANCH AND MNEMONIC SOURCE EDIT"
C 
      CALL MESS3
C 
C  - (PROMPT) 
C 
110   CALL MESS9
C 
C  GET EDIT COMMAND 
C 
130   CALL READ2(FUNC2,NUMB,IERR) 
C 
C  IF NOT END, ABORT, ADD, DELETE, END, FIND, OR REPLACE, 
C  COMMAND ERROR. 
C 
      IF (IERR .NE. 0)GO TO 190 
C 
C  GO TO ABORT, ADD, DELETE, END, FIND, REPLACE OR
C  FIND NEXT LINE.
C 
      GO TO(400,900,200,300,500,600,550)FUNC2 
C 
C  COMMAND ERROR
C 
190   CALL ERR2 
      GO TO 110 
C 
C 
C  ADD
C 
C 
C 
C  IF FIND PREVIOUS COMMAND, GO WRITE THE LINE. 
C 
200   IF (F .EQ. 1)GO TO 260
C 
C  READ FROM INPUT FILE 
C 
210   CALL READ3(IBUF,LEN)
C 
C  IF NO INPUT, ADD ERROR 
C 
      IF (LEN .EQ. 0) GO TO 960 
C 
C  WRITE ON OUTPUT FILE 
C 
      CALL WRITF(IDCB2,IERR,IBUF,LEN) 
C 
C  SET ADD FLAG INDICATOR 
C 
      A=1 
C 
C  GET NEXT EDIT COMMAND, IF NO WRITE ERROR.
C 
      IF (IERR .NE. 0)950,110 
C 
C  WRITE PENDING LINE TO OUTPUT FILE
C 
260   CALL WRITF(IDCB2,IERR,IBUF,LEN) 
C 
C  CLEAR FIND FLAG INDICATOR
C 
      F=0 
C 
C GET NEXT EDIT COMMAND, IF NO WRITE ERROR.OMMAND 
C 
      IF (IERR .NE. 0)950,210 
C 
C 
C  DELETE (N) 
C 
C 
C 
C  CLEAR DELETE LINE NUMBER INDICATOR 
C 
300   X=0 
C 
C  IF "FIND" PREVIOUS COMMAND, DON'T READ NEXT LINE.
C 
      IF (F .EQ. 1)GO TO 320
C 
C  IF DONE, GO PROMPT 
C 
310   IF (X .EQ. NUMB)GO TO 110 
C 
C  READ NEXT LINE FROM INPUT FILE 
C 
      CALL READF(IDCB1,IERR,IBUF,IL,LEN)
C 
C  CHECK FOR READ ERROR 
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  IF END OF FILE, OUTPUT TO SESSION CONSOLE "EOF"
C 
      IF (LEN .EQ. -1)GO TO 350 
C 
C  CLEAR "ADD" FLAG INDICATOR 
C 
      A=0 
C 
C  N = CURRENT LINE NUMBER
C 
      N=N+1 
C 
C  X = NUMBER OF LINES DELETED
C 
315   X=X+1 
C 
C  CHECK IF FINISHED
C 
      GO TO 310 
C 
C  IF NO LINES TO DELETE GET NEXT EDIT COMMAND
C 
320   IF (NUMB .EQ. 0)GO TO 110 
C 
C  CLEAR "FIND" PREVIOUS COMMAND INDICATOR
C 
      F=0 
      GO TO 315 
C 
C  SET "EOF" INDICATOR
C 
350   E=1 
C 
C  "EOF"
C 
      CALL MESS6
      GO TO 110 
C 
C 
C  END
C 
C 
C 
C  IF AT END OF INPUT, CLOSE INPUT AND OUTPUT FILES.
C 
400   IF (E .EQ.1)GO TO 900 
C 
C  IF "FIND" LAST COMMAND, GO WRITE LINE. 
C 
      IF (F .EQ. 1)GO TO 420
C 
C  READ NEXT LINE 
C 
410   CALL READF(IDCB1,IERR,IBUF,IL,LEN)
C 
C  CHECK FOR READ ERROR 
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  IF AT END OF FILE, GO CLOSE INPUT AND OUTPUT FILES.
C 
      IF (LEN .EQ. -1)GO TO 900 
C 
C  WRITE PENDING LINE TO OUTPUT FILE
C 
420   CALL WRITF(IDCB2,IERR,IBUF,LEN) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)950,410 
C 
C 
C  FIND 
C 
C 
C 
C  CHECK FOR END OF FILE
C 
500   IF (E .EQ. 1)GO TO 350
C 
C  CHECK IF "ADD" PREVIOUS COMMAND
C 
      IF (A .EQ. 1)GO TO 570
C 
C  CHECK IF "REPLACE" PREVIOUS COMMAND
C 
      IF (R .EQ. 1)GO TO 570
C 
C  CHECK IF "FIND" PREVIOUS COMMAND 
C 
      IF (F .EQ. 1)GO TO 530
C 
C  CHECK IF AT START OF INPUT FILE
C 
505   IF (N .EQ. 0)GO TO 580
C 
C  IF LINE SOUGHT IS LESS THAN CURRENT LINE, ERROR
C  IF LINE SOUGHT = CURRENT LINE STOP LOOKING 
C  IF LINE SOUGHT > CURRENT LINE, KEEP LOOKING. 
C 
510   IF (NUMB-N)970,540,520
C 
C  CLEAR "ADD" FLAG INDICATOR 
C 
520   A=0 
C 
C  READ NEXT LINE 
C 
      CALL READF(IDCB1,IERR,IBUF,IL,LEN)
C 
C  CHECK FOR READ ERROR 
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  CHECK FOR END OF FILE
C 
      IF (LEN .EQ. -1)GO TO 980 
C 
C  GO WRITE LINE
C 
530   CALL WRITF(IDCB2,IERR,IBUF,LEN) 
C 
C  N = CURRENT LINE NUMBER
C 
      N=N+1 
C 
C  CLEAR "FIND" FLAG INDICATOR
C 
      F=0 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)950,510 
C 
C  CHECK FOR END OF FILE
C 
540   IF (E .EQ. 1)GO TO 350
C 
C  READ NEXT LINE 
C 
      CALL READF(IDCB1,IERR,IBUF,IL,LEN)
C 
C  CHECK FOR END OF FILE
C 
      IF (LEN .EQ. -1)GO TO 350 
C 
C  CHECK IF READ ERROR
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  OUTPUT CURRENT LINE NUMBER 
C 
      CALL MESS4(N) 
C 
C  OUTPUT CURRENT LINE
C 
      CALL MESSA(IBUF,LEN)
C 
C  SET "FIND" FLAG INDICATOR
C 
      F=1 
C 
C  GO GET NEXT EDIT COMMAND 
C 
      GO TO 130 
C 
C 
C  FIND NEXT LINE 
C 
C 
C 
C  CHECK FOR END OF FILE
C 
550   IF (E .EQ. 1)GO TO 350
C 
C  N = CURRENT LINE NUMBER
C 
      N=N+1 
C 
C  IF "FIND" PREVIOUS COMMAND, WRITE PENDING LINE,
C  ELSE SET FOR NEXT LINE READ. 
C 
      IF (F .EQ. 1)560,565
C 
C  WRITE PENDING LINE 
C 
560   CALL WRITF(IDCB2,IERR,IBUF,LEN) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  SET LINE SOUGHT = PENDING LINE 
C 
565   NUMB=N
C 
C  GO READ LINE 
C 
      GO TO 590 
C 
C  CHECK IF AT START OF FILE
C 
570   IF (N .EQ. 0)GO TO 580
C 
C  CHECK IF LINE SOUGHT <, =, OR > PENDING LINE.
C 
      IF (NUMB-N)970,970,580
C 
C  SET TO GET NEXT LINE 
C 
580   N=N+1 
C 
C  CLEAR "ADD" AND "REPLACE" INDICATORS 
C 
590   A=0 
      R=0 
      GO TO 510 
C 
C 
C REPLACE 
C 
C 
C 
C  IF AT END, OUTPUT "EOF" TO SESSION CONSOLE.
C 
600   IF (E .EQ. 1)GO TO 350
C 
C  SET "REPLACE" FLAG INDICATOR 
C 
      R=1 
C 
C  IF "FIND" PREVIOUS COMMAND, GET REPLACEMENT LINE 
C 
      IF (F .EQ. 1)GO TO 610
C 
C  N = CURRENT LINE NUMBER
C 
      N=N+1 
C 
C  READ NEXT LINE 
C 
      CALL READF(IDCB1,IERR,IBUF,IL,LEN)
C 
C  CHECK FOR READ ERROR 
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  CHECK FOR END OF FILE
C 
      IF (LEN .EQ. -1)GO TO 350 
C 
C  OUTPUT CURRENT LINE NUMBER 
C 
      CALL MESS4(N) 
C 
C  OUTPUT CURRENT LINE
C 
      CALL MESSA(IBUF,LEN)
C 
C  GET REPLACEMENT LINE 
C 
610   CALL READ3(IBUF,LEN)
C 
C  CHECK FOR REPLACEMENT ERROR
C 
      IF (LEN .EQ. 0)GO TO 985
C 
C  CLEAR FIND AND ADD FLAG INDICATORS 
C 
      F=0 
      A=0 
C 
C  WRITE ON OUTPUT FILE 
C 
      CALL WRITF(IDCB2,IERR,IBUF,LEN) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)950,110 
C 
C 
C  BRANCH AND MNEMONIC TABLE GENERATOR
C 
C 
C 
C  "BRANCH TABLE GENERATOR" 
C 
700   CALL MESS7
C 
C  N = NUMBER OF BRANCH TABLE ENTRIES 
C 
      N=0 
C 
C  FORMAT NAM RECORD
C 
C     NAM BMTBL 
C 
      CALL NAMRC(IBUF)
C 
C  OUTPUT NAM RECORD
C 
      CALL WRITF(IDCB2,IERR,IBUF,17)
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  FORMAT ENTRY RECORD
C 
C   ENT BRTBL 
C 
      CALL ENTBT(IBUF)
C 
C  OUTPUT ENTRY RECORD
C 
      CALL WRITF(IDCB2,IERR,IBUF,7) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  FORMAT DBL RECORD
C 
C   BRTBL DEF *+1 
C 
      CALL ENTBR(IBUF)
C 
C  OUTPUT DBL RECORD
C 
      CALL WRITF(IDCB2,IERR,IBUF,6) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  READ NEXT BRANCH TABLE ENTRY 
C 
720   CALL READF(IDCB1,IERR,IBUF,IL,LEN)
C 
C  CHECK FOR READ ERROR 
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  CHECK FOR END OF FILE
C 
      IF (LEN .EQ. -1)GO TO 750 
C 
C  GO PARSE LINE
C 
      CALL PARS1(IBUF,LEN,IBUF4,IBUF5,IERR) 
C 
C  CHECK FOR SYNTAX ERROR 
C 
      IF (IERR .NE. 0)GO TO 790 
C 
C  N = BRANCH TABLE NUMBER ENTRY
C 
      N=N+1 
C 
C  WRITE EXTERNAL RECORD
C 
      CALL WRITF(IDCB2,IERR,IBUF4,6)
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  WRITE DBL RECORD 
C 
      CALL WRITF(IDCB2,IERR,IBUF5,9)
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  GET NEXT BRANCH TABLE ENTRY
C 
      GO TO 720 
C 
C  DETERMINE IF INPUT IS FROM PAPER TAPE
C 
750   CALL RWIND(X,IDCB1,IERR)
C 
C  CHECK FOR ERROR IN DETERMINING INPUT DEVICE
C 
      IF (IERR .NE. 0)GO TO 991 
C 
C  REWIND INPUT FILE  
C 
      CALL RWNDF(IDCB1,IERR)
C 
C  CHECK FOR REWIND ERROR 
C 
      IF (IERR .LT. 0)GO TO 991 
C 
C  IF PAPER TAPE INPUT OUTPUT MESSAGE 
C 
      IF (X .EQ. 1)760,780
C 
C  "REWIND SOURCE FILE" 
C 
760   CALL MESS8
C 
C  PAUSE UNTIL REWIND IS DONE, THEN ENTER GO,RTMTG TO CONTINUE. 
C 
      PAUSE 
C 
C  MNEMONIC TABLE GENERATOR 
C 
780   CALL MES10
C 
C  FORMAT ENTRY RECORD
C 
C   ENT MNTBL 
C 
      CALL ENTMT(IBUF)
C 
C  OUTPUT ENTRY RECORD
C 
      CALL WRITF(IDCB2,IERR,IBUF,7) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  FORMAT DBL RECORD
C 
C   MNTBL DEC -X
C 
C    WHERE X IS THE NUMBER OF BRANCH TABLE ENTRIES
C 
      CALL ENTMN(IBUF,N)
C 
C  OUTPUT DBL RECORD
C 
      CALL WRITF(IDCB2,IERR,IBUF,6) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF(IERR .NE. 0)GO TO 950
C 
C  SET MNEMONIC TABLE ENTRY NUMBER = 0
C 
      N=0 
C 
C  NUM = DBL RECORD LENGTH
C 
785   NUM=0 
C 
C  READ NEXT MNEMONIC TABLE ENTRY 
C 
      CALL READF(IDCB1,IERR,IBUF,IL,LEN)
C 
C  CHECK FOR READ ERROR 
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  CHECK FOR END OF FILE
C 
      IF (LEN .EQ. -1)GO TO 795 
C 
C  GO PARSE ENTRY 
C 
      CALL PARS2(IBUF,LEN,IBUF4,IERR,NUM) 
C 
C  CHECK FOR SYNTAX ERROR 
C 
      IF (IERR .NE. 0)GO TO 788 
C 
C  STEP TO NEXT MNEMONIC TABLE ENTRY
C 
      N=N+1 
C 
C  WRITE DBL RECORD 
C 
      CALL WRITF(IDCB2,IERR,IBUF4,NUM)
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)950,785 
C 
C  STEP TO NEXT MNEMONIC TABLE ENTRY
C 
788   N=N+1 
C 
C  SYN ERR IN LINE "N"
C 
      CALL ERR11(N) 
C 
C  READ NEXT LINE 
C 
      GO TO 785 
C 
C  STEP TO NEXT MNEMONIC TABLE ENTRY
C 
790   N=N+1 
C 
C  SYN ERR IN LINE "N"
C 
      CALL ERR11(N) 
C 
C  READ NEXT LINE 
C 
      GO TO 720 
C 
C  FORMAT END RECORD
C 
795   CALL ENDRC(IBUF)
C 
C  WRITE END RECORD 
C 
      CALL WRITF(IDCB2,IERR,IBUF,4) 
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  CLOSE INPUT FILE 
C 
      CALL CLOSE(IDCB1,IERR)
C 
C  CHECK FOR CLOSE ERROR
C 
      IF (IERR .LT. 0)GO TO 940 
C 
C  WRITE END OF FILE
C 
      CALL FCONT(IDCB2,IERR,100B) 
C 
C  CHECK FOR END OF FILE ERRROR 
C 
      IF (IERR .LT. 0)GO TO 940 
C 
C  CLOSE OUTPUT FILE
C 
      CALL CLOSE(IDCB2,IERR)
C 
C  CHECK FOR CLOSE ERROR
C 
      IF (IERR .LT. 0)GO TO 940 
C 
C  GET NEXT COMMAND 
C 
      GO TO 50
C 
C 
C  LIST  (ADD LINE NUMBERS TO INPUT FILE ENTRIES) 
C 
C 
C 
C  N = CURRENT LINE NUMBER
C 
800   N=0 
C 
C  "LIST" 
C 
      CALL MESS5
C 
C  STEP TO NEXT LINE
C 
810   N=N+1 
C 
C  PUT LINE NUMBER (N) IN OUTPUT BUFFER 
C 
      CALL CNUMD(N,IBUF)
C 
C  PUT NEXT LINE IN OUTPUT BUFFER 
C 
      CALL READF(IDCB1,IERR,IBUF(6),IL,LEN) 
C 
C  CHECK FOR READ ERROR 
C 
      IF (IERR .NE. 0)GO TO 930 
C 
C  CHECK FOR END OF FILE
C 
      IF (LEN .EQ. -1)GO TO 900 
C 
C  ADD 2 BLANKS TO OUTPUT BUFFER
C 
      IBUF(4)=20040B
      IBUF(5)=20040B
C 
C  SET OUTPUT LINE LENGTH 
C 
      LEN=LEN+4 
C 
C  GO WRITE LINE WITH ITS LINE NUMBER ATTACHED
C 
      CALL WRITF(IDCB2,IERR,IBUF(2),LEN)
C 
C  CHECK FOR WRITE ERROR
C 
      IF (IERR .NE. 0)GO TO 950 
C 
C  PROCESS NEXT LINE
C 
      GO TO 810 
C 
C 
C  ABORT
C 
C 
C 
C  CLOSE INPUT FILE 
C 
900   CALL CLOSE(IDCB1,IERR)
C 
C  CHECK FOR CLOSE ERROR
C 
      IF (IERR .LT. 0)901,905 
C 
C  CHECK IF DCB OPEN
C 
901   IF (IERR .EQ. -11)905,906 
C 
C  WRITE END OF FILE
C 
905   CALL FCONT(IDCB2,IERR,100B) 
C 
C  CHECK FOR END OF FILE ERROR
C 
      IF (IERR .LT. 0)GO TO 940 
C 
C  CLOSE OUTPUT FILE
C 
      CALL CLOSE(IDCB2,IERR)
C 
C  CHECK FOR CLOSE ERROR
C 
      IF (IERR .LT. 0)907,50
C 
C  CLOSE ERROR
C 
906   CALL ERR5 
C 
C  GO CLOSE OUTPUT FILE 
C 
      GO TO 905 
C 
C  CHECK IF DCB OPEN
C 
907   IF (IERR .EQ. -11)50,940
C 
C 
C  ERROR MESSAGES 
C 
C 
C 
C  GTFIL ERR
C 
910   CALL ERR1A
      GO TO 995 
C 
C  OPEN ERR 
C 
920   CALL ERR3 
      GO TO 50
C 
C  READ ERR 
C 
930   CALL ERR4 
      GO TO 900 
C 
C  CLOSE ERR
C 
940   CALL ERR5 
      GO TO 995 
C 
C  WRITE ERR
C 
950   CALL ERR6 
      GO TO 900 
C 
C  ADD ERR
C 
960   CALL ERR7 
      GO TO 110 
C 
C  SEQ ERR
C 
970   CALL ERR8 
      GO TO 110 
C 
C  LINE ERR 
C 
980   CALL ERR9 
      GO TO 110 
C 
C  REPL ERR 
C 
985   CALL ERR10
      GO TO 110 
C 
C  CREATE ERR 
C 
990   CALL ERR12
      GO TO 900 
C 
C  REWIND ERR 
C 
991   CALL ERR13
      GO TO 900 
C 
C  "RTMTG FINISHED" 
C 
995   CALL MESS0
      END 
      END$
                                                                                                                                                  