:ST,S,$TC16,5 
FTN4,L,T
      PROGRAM TCGEN 
C           TERMINAL CONFIGURATION PROGRAM (TCS/B) - 9/74 
C 
C     REV B SUPPORTS MULTIPLE  LOGICAL DRIVERS, SPECIFICALLY
C           ATD01 AND ATD02. TERMINALS SUPPORTED INCLUDE
C           1) H2600 - HP 2600
C           2) H2615 - HP 2615
C           3) H2749 - HP 2749
C           4) H2762 - HP 2762
C           5) G1200 - GE TERMINET 1200 
C           6) P2616 - HP 2616 PAGE MODE (PMT01)
C           7) P2640 - HP2640 PAGE MODE (PMT02) 
C           8) H2640 - HP2640 CHAR. MODE (ATD01)
C           9) H7260 - HP7260 GRENOBLE MS CARD READER 
C                       (ACR01) 
C 
C     REV B ALSO SUPPORTS THE SYNCHRONOUS LINE CONTROL
C     PACKAGE AND TCS INITIALIZATION. 
C 
C 
C     THIS PROGRAM GENERATES (WITH THE AID OF THE DOS ASSEMBLER) A
C     RELOCATABLE TABLE FOR USE WITH THE CONFIGURATION SUBROUTINE 
C     "CNFIG". THE PROGRAM PROVIDES FOR OPERATION WITH TCS AND
C     ATD01. PARAMETER INPUT MAY BE FROM THE SYSTEM CONSOLE OR
C     FROM A BATCH DEVICE. THE PROGRAM REQUIRES THAT AN ASCII FILE
C     "C$$$1" BE SETUP FOR STORING THE SOURCE GENERATED. 50 SECTORS 
C     SHOULD BE SUFFICIENT. 
C 
C     TO OPERATE
C     :CL 
C     :PR,TCGEN[,L]   L=LOGICAL UNIT FOR INPUT,0 OR 1 FOR CONSOLE 
C 
C 
      DIMENSION IBUF(3) 
      DIMENSION IMAG(40),LABLE(3) 
      DIMENSION LINK(6,9) 
      DIMENSION LINKX(6,9)
      INTEGER ASMB(3),FNAME(3)
      INTEGER EXEC
      INTEGER FINDL 
      INTEGER OPND(3),TERM(3) 
      INTEGER ASCII(3)
      LOGICAL RBIN
      EQUIVALENCE (LINKX(1,1),LINK(4,1))
      EQUIVALENCE(ASCII(1),IMAG(7)) 
      EQUIVALENCE(LABLE(1),IMAG(1)) 
      EQUIVALENCE(OPND(1),IMAG(6))
      DATA ASMB/2HAS,2HMB,2H  / 
      DATA FNAME/2HC$,2H$$,2H1 /
901   FORMAT("ASMB,L")
902   FORMAT(6X,"NAM")
903   FORMAT(6X,"ENT")
904   FORMAT(6X,"EQU *")
905   FORMAT(6X,"DEC")
906   FORMAT(6X,"OCT")
920   FORMAT(6X,"BSS")
907   FORMAT(6X,"EXT")
908   FORMAT(6X,"END")
910   FORMAT("CONFIGURATION NAME=_")
911   FORMAT("TERMINAL USED=_") 
912   FORMAT("LU=_")
914   FORMAT("HALF/FULL DUPLEX=_")
915   FORMAT("SECONDARY CHANNEL?_") 
916   FORMAT("ECHO?_")
917   FORMAT("TRACE LENGTH=_")
918   FORMAT("TERMINAL TYPE=_") 
919   FORMAT(6X,"DEF")
921   FORMAT(6X,"NOP")
922   FORMAT("TCS USED?_")
923   FORMAT("QUEUE LENGTH=_")
924   FORMAT("FILE NAME=_") 
925   FORMAT("FILE NO.=_")
926   FORMAT("SEGMENT NAME=_")
927   FORMAT(6X,"EXT TCS")
928   FORMAT(6X,"JSB TCS")
929   FORMAT(6X,"DEF PQ$")
930   FORMAT(6X,"DEF SG$")
931   FORMAT(6X,"ABS S$") 
932   FORMAT(6X,"DEF DR$")
933   FORMAT(6X,"ASC 3,") 
934   FORMAT(6X,"DEF T")
935   FORMAT("PQ$   BSS") 
936   FORMAT("SG$   EQU *") 
937   FORMAT("S$    EQU") 
938   FORMAT("DR$   BSS") 
939   FORMAT("T     EQU *") 
940   FORMAT("PRIVILEGED TERMINAL?_") 
941   FORMAT("SLC USED?_")
942   FORMAT("SLC") 
943   FORMAT("ASCII/EBCDIC CODE?_") 
944   FORMAT("CRC/VRC BLOCK CHECK?_") 
945   FORMAT("HASP STATION?_")
946   FORMAT("SWITCHED LINE?_") 
947   FORMAT("PRIMARY STATION?_") 
948   FORMAT("SYNCHRONOUS?_") 
949   FORMAT("MTO USED?_")
951   FORMAT("MTO") 
950   FORMAT(2X,3A2,2X,"IS NOT DEFINED AS A TERMINAL")
952   FORMAT("GENERATE CONTROL BLOCKS?_") 
953   FORMAT("ACTIVE CONTROL BLOCKS=_") 
954   FORMAT("RESERVE CONTROL BLOCKS=_")
955   FORMAT("STACK LENGTH=_")
956   FORMAT("CB$") 
957   FORMAT(6X,"DEF *+1")
958   FORMAT("MAX NO. OF FILES=_")
959   FORMAT(6X,"DEF *+",I6)
960   FORMAT("CHARACTER TRACE LENGTH=_")
961   FORMAT("EVENT TRACE LENGTH=_")
1000  FORMAT("H2600 ATD01 H2615 ATD01 H2749 ATD01 H2762 ATD01 ",
     *       "G1200 ATD02 P2616 PMT01 P2640 PMT02 H2640 ATD01 ",
     *       "H7260 ACR01 ")
      CALL RMPAR(IMAG)
C----SET NUMBER OF DEVICES IN LINK
      ND = 9
C----FILL LINK TABLE WITH TERMINAL&DRIVER 
      CALL CODE 
      WRITE(LINK,1000)
      LU=IMAG(1)
C----DEFAULT TO CONSOLE IF NO INPUT SPECIFIED 
      IF(LU.EQ.0)LU=1 
C----INITIALIZE SECTOR INDEX
      IX=0
C----CLEAR LU COUNT 
      LUCNT=0 
C----O/P ASMB,L 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,901) 
      CALL LINE(IMAG,IX)
C----I/P CONFIGURATION NAME 
      IF(LU.NE.1)GOTO 110 
      WRITE(LU,910) 
110   READ(LU,115)IBUF
115   FORMAT(3A2) 
C----O/P NAM XXXX,6 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,902) 
      DO 116 J=1,3
      IF(IBUF(J).EQ.2H  )GOTO 117 
      IF(IAND(IBUF(J),377B).EQ.40B)GOTO 118 
116   OPND(J)=IBUF(J) 
119   CONTINUE
      CALL LINE(IMAG,IX)
C----O/P ENT XXXX 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,903) 
      OPND(1)=IBUF(1) 
      OPND(2)=IBUF(2) 
      OPND(3)=IBUF(3) 
      CALL LINE(IMAG,IX)
C----O/P XXXX   EQU * 
      CALL FLUSH (IMAG,40)
      CALL CODE 
      WRITE(IMAG,904) 
      DO 120 J=1,3
120   LABLE(J)=IBUF(J)
      CALL LINE(IMAG,IX)
C----CLEAR MTO FLAG 
      MTFLG=0 
C----MTO OPERATION? 
      IF(LU.NE.1)GOTO 125 
      WRITE(LU,949) 
125   IF(RBIN(2HNO,2HYE,LU))GOTO 126
C----O/P EXT MTO
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,927) 
      CALL CODE 
      WRITE(OPND,951) 
      CALL LINE(IMAG,IX)
C----O/P JSB MTO
      CALL CODE 
      WRITE(IMAG,928) 
      CALL CODE 
      WRITE(OPND,951) 
C----SET MTO FLAG 
      MTFLG=1 
      GOTO 305
C----TCS OPERATION
126   CONTINUE
      IF(LU.NE.1)GOTO 300 
      WRITE(LU,922) 
300   IF(RBIN(2HNO,2HYE,LU))GOTO 310
C----O/P EXT TCS
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,927) 
      CALL LINE(IMAG,IX)
C----O/P JSB TCS
      CALL CODE 
      WRITE (IMAG,928)
305   CALL LINE(IMAG,IX)
C-----O/P   DEF PQ$ 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,929) 
      CALL LINE(IMAG,IX)
C----I/P QUEUE LENGTH 
315   IF(LU.NE.1)GOTO 320 
      WRITE(LU,923) 
320   READ(LU,*)LQ
      IF(LQ)315,315,325 
325   CALL FLUSH(IMAG,40) 
C----O/P DEC N
      CALL CODE 
      WRITE(IMAG,905) 
      CALL CODE 
      WRITE(OPND,180)LQ 
      CALL LINE(IMAG,IX)
C----O/P DEF SG$
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,930) 
      CALL LINE(IMAG,IX)
C----O/P ABS S$ 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,931) 
      CALL LINE(IMAG,IX)
C----O/P DEF DR$
      CALL CODE 
      WRITE(IMAG,932) 
      CALL LINE(IMAG,IX)
C----IF MTO GET FILE DIRECTORY SIZE 
      IF(MTFLG.EQ.0)GOTO 326
328   IF(LU.NE.1)GOTO 327 
      WRITE(LU,958) 
327   READ(LU,*)MTFLG 
      IF(MTFLG.LT.0)GOTO 328
C----O/P DEC N    (N=0 IF TCS)
326   CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,905) 
      CALL CODE 
      WRITE(OPND,180)MTFLG
      CALL LINE(IMAG,IX)
C----O/P DEF *+6N+1 
      IF(MTFLG.EQ.0)GOTO 330
      J=MTFLG*6+1 
      CALL CODE 
      WRITE(IMAG,959)J
      CALL LINE(IMAG,IX)
C----O/P BSS 6N 
      J=J-1 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,920) 
      CALL CODE 
      WRITE(OPND,180)J
      CALL LINE(IMAG,IX)
C----I/P FILES TO BE OPENED 
330   IF(LU.NE.1)GOTO 335 
      WRITE(LU,924) 
335   CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,933) 
      READ(LU,115)ASCII 
      IF(ASCII(1).EQ.2H/E)GOTO 350
      CALL LINE(IMAG,IX)
C----O/P ASC 6,ABCDE
345   IF(LU.NE.1)GOTO 340 
      WRITE(LU,925) 
340   CALL FLUSH(IMAG,40) 
C----I/P FILE # 
      READ(LU,*)NF
      IF(NF.LT.1)GOTO 345 
      IF(NF.GT.16) GOTO 345 
C----O/P DEC F
      CALL CODE 
      WRITE(IMAG,905) 
      CALL CODE 
      WRITE(OPND,180)NF 
      CALL LINE(IMAG,IX)
      GOTO 330
C----O/P NOP
350   CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,921) 
      CALL LINE(IMAG,IX)
C----O/P DEF T
      CALL CODE 
      WRITE(IMAG,934) 
      CALL LINE(IMAG,IX)
C----O/P PQ$  BSS LQ*9
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,935) 
      LQ=9*LQ 
      CALL CODE 
      WRITE(OPND,180)LQ 
      CALL LINE(IMAG,IX)
C----O/P SG$ EQU *
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,936) 
      CALL LINE(IMAG,IX)
      NS=0
C----I/P SEGMENTS 
360   IF(LU.NE.1)GOTO 365 
      WRITE(LU,926) 
365   CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,933) 
      READ(LU,115)ASCII 
      IF(ASCII(1).EQ.2H/E)GOTO 370
      NS=NS+1 
      CALL LINE(IMAG,IX)
C----O/P ASC 6,ABCDE
      GOTO 360
C----O/P S$  EQU NS 
370   CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,937) 
      CALL CODE 
      WRITE(OPND,180)NS 
      CALL LINE(IMAG,IX)
C----O/P DR$  BSS 11*NS 
      NS=11*NS
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,938) 
      CALL CODE 
      WRITE(OPND,180)NS 
      CALL LINE(IMAG,IX)
C---O/P T  EQU *
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,939) 
      CALL LINE(IMAG,IX)
      GOTO 130
C----O/P  NOP 
310   CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,921) 
      CALL LINE(IMAG,IX)
      GOTO 130
C----I/P TERMINAL USED
130   IF(LU.NE.1)GOTO 135 
      WRITE(LU,911) 
135   CALL FLUSH(IBUF,3)
      READ(LU,115)IBUF
      IF(IBUF(1).EQ.2H/E)GOTO 140 
C----O/P EXT XXXX 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,907) 
      DO 136 J=1,3
136   OPND(J)=IBUF(J) 
      CALL LINE(IMAG,IX)
C----FIND TERMINAL IN LINK ARRAY
      J=FINDL(LINK,IBUF,ND) 
      IF(J.NE.0)GOTO 131
      WRITE(1,950)IBUF
      PAUSE 
      GOTO 130
C----O/P EXT ATDXX
C----IF ENTRY ALREADY FLAGGED BYPASS
131   IF(IAND(LINK(6,J),377B).NE.40B)GOTO 130 
      DO 132 K=1,3
      KK=K+3
132   OPND(K)=LINK(KK,J)
      CALL LINE(IMAG,IX)
C----FLAG ALL MATCHING ENTRIES
133   J=FINDL(LINKX,OPND,ND)
      IF(J.EQ.0)GOTO 130
      LINKX(3,J)=LINKX(3,J)+1 
      GOTO 133
C----I/P LU 
140   IF(LU.NE.1) GOTO 145
      WRITE(LU,912) 
145   READ(LU,115)IBUF
      IF(IBUF(1).EQ.2H/E) GOTO 900
C----INCREMENT LU COUNT 
      LUCNT=LUCNT+1 
      CALL CODE 
      READ(IBUF,*)LUX 
      CALL COMNT(1,LUX,1,IX)
C-----TEST FOR PRIVILEGED TERMINAL
      IF(LU.NE.1)GOTO 143 
      WRITE(LU,940) 
143   IF(RBIN(2HNO,2HYE,LU))GOTO 220
C----I/P TERMINAL TYPE
      IF(LU.NE.1)GOTO 146 
      WRITE(LU,918) 
146   CALL FLUSH(TERM,3)
      READ(LU,115)TERM
      CALL COMNT(2,TERM,3,IX) 
C----FIND TERMINAL IN LINK ARRAY
      JJ=FINDL(LINK,TERM,ND)
      IF(JJ.NE.0)GOTO 147 
      WRITE(1,950)TERM
      STOP
147   CONTINUE
C----I/P BAUD RATE
      CALL IBAUD(LU,IBR,J)
      CALL COMNT(3,IBR,1,IX)
      IDUX=0
C----I/P HALF/FULL DUPLEX 
      IF(LU.NE.1) GOTO 155
      WRITE(LU,914) 
155   IF(RBIN(2HFU,2HHA,LU))IDUX=4
C----I/P SECONDARY CHANNEL
      IF(LU.NE.1) GOTO 160
      WRITE(LU,915) 
160   IF(RBIN(2HYE,2HNO,LU))IDUX=IDUX+2 
C----I/P ECHO 
      KK=6
      IF(LU.NE.1)GOTO 165 
      IF(LINK(4,JJ).EQ.2HPM)GOTO 161
      WRITE(LU,916) 
165   IF(RBIN(2HYE,2HNO,LU))IDUX=IDUX+1 
      IF(IAND(IDUX,4).EQ.4)CALL COMNT(4,1,1,IX) 
      IF(IAND(IDUX,2).EQ.2)CALL COMNT(5,1,1,IX) 
      IF(LINK(4,JJ).EQ.2HPM)KK=7
      IF(IAND(IDUX,1).EQ.1)CALL COMNT(KK,1,1,IX)
C----I/P TRACE LENGTH 
      IF(LU.NE.1)GOTO 170 
      WRITE(LU,917) 
170   READ(LU,*)ITRCE 
C----INSURE TRACE TABLE LENGTH IS MULTIPLE OF 4 
      ITRCE = (ITRCE/4)*4 
      ITRCE=ITRCE+27
C----EQT EXT LENGTH FOR ACR01 = 31
      IF(LINK(4,JJ) .EQ. 2HAC) ITRCE=ITRCE+4
C----I/P DEC XX  EXTENSION LENGTH 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,905) 
      CALL CODE 
      WRITE(OPND,180)ITRCE
180   FORMAT(I6)
      CALL LINE(IMAG,IX)
195   IDUX=IDUX+(8*J) 
      IDUX=LUX+(1000B*IDUX) 
C----O/P OCT BBA0LL  (BB=BAUD RATE, A=LINE,LL=LU) 
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,906) 
      CALL CODE 
      WRITE(OPND,200)IDUX 
200   FORMAT(@6)
      CALL LINE(IMAG,IX)
C----O/P DEC XXXX    TERMINAL TYPE
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,919) 
      DO 210 J=1,3
210   OPND(J)=TERM(J) 
      CALL LINE(IMAG,IX)
C----O/P JSB ATDXX
205   CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,928) 
      DO 206 K=1,3
      KK=K+3
206   OPND(K)=LINK(KK,JJ) 
C----REMOVE FLAG BIT
      OPND(3)=IOR(IAND(OPND(3),177400B),40B)
      CALL LINE(IMAG,IX)
C---- O/P OCT TYPE
C---- ASYNCH. TERMINAL = 0
      IF(OPND(1).EQ.2HAT)J=0
      IF(OPND(1) .EQ. 2HAC) J=0 
C---- PAGE MODE TERMINAL = 1
      IF(OPND(1).EQ.2HPM)J=1
      CALL CODE 
      WRITE(IMAG,906) 
      CALL CODE 
      WRITE(OPND,200)J
      CALL LINE(IMAG,IX)
C----O/P BSS XX      RESERVE EXTENSION
      CALL FLUSH(IMAG,40) 
      CALL CODE 
      WRITE(IMAG,920) 
      ITRCE=ITRCE-5 
      CALL CODE 
      WRITE(OPND,180)ITRCE
          