FTN4
      PROGRAM TGP7(5), 92080-1X366 REV.2026  800422                     
C 
C     SOURCE 92080-18366
C 
C 
C 
C     **************************************************************
C     * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  ALL RIGHTS    *
C     * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- *
C     * PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH-  *
C     * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.  *
C     **************************************************************
C 
C 
C 
C@ TGP - SEG#7 . COMPILE FORM . 10/AUG/77 . *JCM* 
C 
C      PRGMR : JEAN CHARLES MIARD (HPG) 
C 
C 
C*********************************************************************
C*                                                                   *
C*                 THIS IS A SEGMENT OF THE TGP PROGRAM WHICH        *
C*  COMPILES THE SOURCE USER'S ANSWERS STORED IN IFORM,JFORM,MFORM   *
C*  LFORM BUFFERS INTO A BINARY CODE DIRECTLY USABLE BY THE TMP      *
C*  PROGRAM TO DRIVE THE TRANSACTIONS. THIS BINARY CODE IS STORED    *
C*  IN KFORM .                                                       *
C*                                                                   *
C*        ACCORDING TO INDIC VALUE DIFFERENT TASKS ARE PERFORMED :   *
C*                                                                   *
C*          INDIC =  0 : NORMAL PATH . START COMPILATION .           *
C*                   2 : RETURN FROM TGP11 , IMAGE ADD STORAGE       *
C*                       SUCCESSFULLY PROCESSED                      *
C*                                                                   *
C*                                                                   *
C*********************************************************************
C 
C 
C DECLARATIONS COMMON VARIABLES ***************** 
C 
      COMMON ILU,ISCRN,IQST,ISKIP,INDIC 
      COMMON IFORM(780) 
      COMMON JFORM(1700)
      COMMON MFORM(28)
      COMMON LFORM(42)
      COMMON ITT
      COMMON IKEY(26,3) 
      COMMON IUMAX,IMMAX
      COMMON IMODB
      COMMON ILITE(15)
      COMMON IMAI(45,5) 
      COMMON IMFLG,IMAS,IMDT,IMKY 
      COMMON KFORM(2844)
      COMMON ILIBR(67)
      COMMON NIMAG
      COMMON IBASE(10)
C 
C   LOCAL VARIABLES **********
C 
      DIMENSION ITGP4(3),ITGP11(3),ITGP6(3),ISUM(4,2),JSUM(4,2) 
      DIMENSION IDUMP(17),IREAL(2),LISTOF(520),IBUF(52) 
C 
      LOGICAL INUM,ISSPA,ISBIT,RNUM,CMPB
C 
      EQUIVALENCE(LISTOF(1),KFORM(2185))
      EQUIVALENCE(LCTR,NIMAG) 
      EQUIVALENCE(LW,IMODB) 
      EQUIVALENCE(N2,KFORM(1059)) 
      EQUIVALENCE(IREAL,XREAL)
C 
      DATA ITGP4/2HTG,2HP4,2H  /
      DATA ITGP11/2HTG,2HPI,2H1 / 
      DATA ITGP6/2HTG,2HP6,2H  /
      DATA JBYTE/170/ 
      DATA JWORD/85/
C 
C********************************************************************** 
C 
C   ACCORDING INDIC VALUE GO TO THE REQUIRED PORTION OF TGP7
C 
C********************************************************************** 
C 
      IF(INDIC.EQ.2) GO TO 740
C 
C********************************************************************** 
C 
C   INDIC=0 COMPILE !!!!
C 
C********************************************************************** 
C 
C  INITIALISE KFORM 
C 
      DO 100 I=1,1058 
100   KFORM(I)=0
C-----ISUMN & JSUMN ARE GLOBAL VARIABLES(DON'T USE LOCALLY) 
      ISUMN=0 
      JSUMN=0 
C 
C  IF TRANSACTION ACCESS AN IMAGE DATA BASE, GET DATA-BASE-CRC
C  AND STORE IT INTO THE FIRST WORD OF THE SOURCE SPEC. 
C 
102   IF(.NOT.ISBIT(ITT,1)) GO TO 105 
      CALL DBCRC(IBASE,I,J,K,ISTAT) 
      IF(ISTAT .NE. 0)  PAUSE  0705 
      CALL MOVEW(IFORM(38),IFORM,3) 
      IFORM(4)=I
C 
C***********************************************************************
C 
C  BUILD FORM HEADER (37 WORDS) 
C 
C***********************************************************************
C 
105   CALL MOVEW(IFORM(29),KFORM(2),3)
      IF(INUM(IFORM,63,4,KFORM(5))) STOP 1
      IF(INUM(IFORM,67,6,KFORM(6))) STOP 2
      KFORM(7)=IOR(IALF2(IUMAX),IMMAX)
C 
C-----WORD 10 
C 
C     -CRT? 
      IF(ISBIT(ITT,13)) CALL SETBT(KFORM(10),0,1) 
C     -WND (BAR CODE READER)? 
      IF(ISBIT(ITT,9)) CALL SETBT(KFORM(10),1,1)
C     -MSR (MAG STRIPE READER)? 
      IF(ISBIT(ITT,12)) CALL SETBT(KFORM(10),2,1) 
C     -ATC (AUTO-COMPLETING TS)?
      IF(IGET1(IFORM,1545).EQ.1HX) CALL SETBT(KFORM(10),15,1) 
C 
C-----WORD 11, GET THE FOLLOWING BITS: UP,DB,ADS,AKB,BG5,BG3, 
C                                          PRT,LOG,TM,CLK 
      KFORM(11)=IAND(ITT,6377B) 
C 
C-----DETERMINE MAX LIGHT NUMBER. 
C 
      DO 112 I=14,1,-1
      IF(ILITE(I).NE.0) GO TO 114 
112   CONTINUE
114   KFORM(12)=I 
C 
C-----WORD 14 
C 
      KFORM(14)=0 
      IF(.NOT.ISBIT(ITT,8)) GO TO 1141
C     -LIGHT # TO STAY LIT DURING ENTIRE TS.
      IF(INUM(IFORM,1546,2,KFORM(14))) PAUSE 7106 
C     -BLANK OUT DB FIELD 1ST IN CASE NO DB IS SPECIFIED. 
1141  CALL BLAN(KFORM,41,6) 
C     -DATA BASE USED?
      IF(.NOT.ISBIT(ITT,1)) GO TO 116 
C    -YES.  MOVE DATA BASE NAME TO HEADER 
      CALL MOVEW(IFORM(38),KFORM(21),3) 
C    -MOVE DB SECURITY CODE TO HEADER.
      IF(INUM(IFORM,81,5,KFORM(24))) PAUSE 7107 
C    -MOVE CR# TO HEADER. 
      IF(.NOT.INUM(IFORM,1534,5,KFORM(25))) GO TO 115 
      KFORM(25)=IGET2(IFORM,1534) 
C    -MOVE CRC TO HEADER. 
115   KFORM(27)=IFORM(4)
C    -MOVE HIGHEST LEVEL ACCESS WORD TO HEADER
      CALL MOVEW(IFORM(770),KFORM(28),3)
C***********************************************************************
C 
C  BUILD DUMMY STATE SQ=0 SFK DEFINITION
C 
C***********************************************************************
C 
C     N2 = KFORM ADDRESS OF 1ST WORD OF THIS STATE
C     N3 = CURRENT KFORM ADDRESS (INCREMENTED AS STATE IS BUILT)
C 
C    -SET ADDRESS POINTERS. 
116   N2=38 
      N3=N2+3 
C    -MOVE ERROR LABEL TO KFORM.
      CALL MOVCA(IFORM,1520,KFORM,N3*2-1,12)
      N3=N3+6 
C    -GET PREFIX KEY #
      JPREFX=0
      DO 118 I=1,26 
      IF(IKEY(I,1).EQ.10) GO TO 120 
118   CONTINUE
      GO TO 130 
120   JPREFX=I*2048 
130   KFORM(N3)=JPREFX
C    -GET MAX KEY#
      DO 134 MAXKEY=26,1,-1 
      IF(IKEY(MAXKEY,1).NE.0) GO TO 136 
2     IF(IKEY(MAXKEY,3).NE.0) GO TO 136 
134   CONTINUE
136   KFORM(N3)=IOR(KFORM(N3),MAXKEY) 
      MAX12=MAXKEY*256
      KFORM(12)=IOR(KFORM(12),MAX12)
C 
C 
C  SET SFK TERMINATOR BITS FOR KEYS 1-16
C 
      N3=N3+1 
      DO 160 I=1,16 
      IF(IKEY(I,2).EQ.1) CALL SETBT(KFORM(N3),(I-1),1)
160   CONTINUE
C    -SET SFK TERMINATOR BITS FOR KEYS 17-26
      N3=N3+1 
      DO 165 I=17,26
      IF(IKEY(I,2).EQ.1) CALL SETBT(KFORM(N3),(I-17),1) 
165   CONTINUE
      N3=N3+1 
C 
C  IPNTR IS CURRENT POINTER TO STRING VALUE * IPNTR=1 IS WORD 39 OF KFORM 
C  I  = CURRENT SFK NUMBER  (2 21)
C  J  = 1 IS NORMAL SFK * J=3 IS PREFIXED SFK (SEE IKEY DEFINITION :ANSWR)
C  IX =  CURRENT POINTER (BYTE) 
C  K  = REAL SFK NUMBER (2/11)
C  L  = CURRENT POINTER IN IFORM (1 THRU MAX OF 36) 
C 
C  POINTER DEFINITION : (BYTE)
C                      -SFK=0 : SFK NOT DEFINED 
C                      -SFK=IPNTR : SFK IS A STRING 
C                      -SFK FOR A FUNCTION :
C                           -BIT 7=1
C                           -BIT 6=1 IF A VALIDITY CHECK IS TO BE PERFORMED 
C                                    ON THE FUNCTION
C                           -BITS 0/5 :FUNCTION # 
C 
C-----CALCULATE WHERE THE "VALUE STRING OR FUNCTION LABEL" STORAGE WILL 
C     BEGIN & STORE IT INTO IPNTR.
      IPNTR=12+(MAXKEY+1)/2 
C    -ADD 5 MORE WORDS (FOR 10 KEYS) IF PREFIX KEY IS DEFINED.
      IF(JPREFX.NE.0) IPNTR=IPNTR+5 
C    -INCREMENT LOOP COUNT BY 10 IF PREFIX KEY IS DEFINED.
      LOOPCT=MAXKEY 
      IF(JPREFX.NE.0) LOOPCT=MAXKEY+10
C-----LOOP 230 GOES THRU THE TABLE OF KEYS(IKEY) & DOES THE FOLLOWING:
C     1. SETS UP THE TABLE OF POINTERS WHICH COMES AFTER THE TERMINATOR 
C        BIT WORDS. CURRENTLY THIS TABLE STARTS AT KFORM(50). 
C     2. STORES THE APPROPRIATE STRING (VALUE STRING OR FUNCTION LABEL) 
C        USING THE FORMAT SPECIFIED IN THE IMS WHERE THE POINTER IN (1) SAYS
C        IT IS. 
C     3. THIS IS DONE MAXKEY TIMES. REMEMBER MAXKEY MAY HAVE BEEN INCREMENTED 
C        BY 10 IF A PREFIX KEY IS DEFINED.
C 
      ISFKNO=87 
      ITEXT=89
      ILABEL=108
      DO 230 K=1,LOOPCT 
      I=K 
      J=1 
C    -180 WHILE NON-PREFIXED KEYS.
      IF(K.LE.MAXKEY) GO TO 180 
C    -SWITCH TO PREFIXED KEYS.
      I=K-MAXKEY
      J=3 
      ISFKNO=945
      ITEXT=947 
      ILABEL=966
C    -GET READY TO STORE THE POINTER. 
180   IX=IPNTR
C    -ZERO THE POINTER IF SFK IS NOT DEFINED. 
      IF(IKEY(I,J).EQ.0) IX=0 
C    -STORE THE POINTER IN LEFT OR RIGHT BYTE DEPENDING ON WHETHER KEY #
C     IS ODD OR EVEN. 
      IF(IAND(K,1).EQ.0) GO TO 182
C    -LEFT BYTE.
      N3=50+(K-1)/2 
      KFORM(N3)=IALF2(IX) 
      GO TO 184 
C    -RIGHT BYTE. 
182   KFORM(N3)=IOR(KFORM(N3),IX) 
C    -SKIP REST OF LOOP IS SFK IS NOT DEFINED.
184   IF(IX.EQ.0) GO TO 230 
C    -SET UP FOR SEARCH OF IFORM FOR KEY #
      N1=1
      N6=MAXKEY 
C    -190 WHILE DOING NON-PREFIXED KEYS.
      IF(J.EQ.1) GO TO 190
      N1=MAXKEY+1 
      N6=MAXKEY+10
C    -LOOP 199 SEARCHES IFORM UNTIL FINDING THE CORRECT KEY#, THEN
C     1. IF IT'S A FUNCTION KEY, GET IT'S LABEL & STORE IT IN KFORM 
C     2. IF IT'S A VALUE KEY, GET THE STRING VALUE & STORE IN KFORM.
190   DO 199 L=N1,N6
C    -GET KEY # & CONVERT IT TO INTEGER.
      IF(INUM(IFORM,(ISFKNO+(L-N1)*33),2,IZ)) PAUSE 260 
C    -CORRECT KEY # ? 
      IF(IZ.NE.I) GO TO 199 
C    -IS THIS A VALUE KEY OR FUNCTION KEY?
      IF(IKEY(I,J).NE.-1) GO TO 195 
C    -VALUE KEY. CALCULATE THE STRING LENGTH DROPPING TRAILING BLANKS.
      IL=LNCAR(IFORM,(ITEXT+(L-N1)*33),16)
C    -STORE THE LENGTH IN LEFT BYTE.
      KFORM(N2+IPNTR)=IL*256
C    -STORE THE STRING STARTING IN THE RIGHT BYTE.
      CALL MOVCA(IFORM,(ITEXT+(L-N1)*33),KFORM,((N2+IPNTR)*2),IL) 
C    -UPDATE IPNTR TO NEXT STRING ADDRESS.
      IPNTR=IPNTR+1+(IL/2)
      GO TO 199 
C    -FUNCTION KEY. CALCULATE STRING LENGTH OF LABEL(OMIT TRAILING BLANKS). 
195   IL=LNCAR(IFORM,(ILABEL+(L-N1)*33),12) 
C    -SET FS BIT & MERGE IT WITH THE FUNCTION NUMBER. 
      IX=200B+IKEY(I,J) 
C    -SET EC BIT IF VALIDITY CHECK REQUIRED.
      IF((IKEY(I,J).GT.4).AND.(IKEY(I,J).NE.10)) IX=IX+100B 
      IF(IKEY(I,J).EQ.14) CALL SETBT(IX,6,0)
C    -STORE THE FS/EC/FUNCTION NUMBER IN LEFT BYTE & LENGTH IN RIGHT BYTE.
      KFORM(N2+IPNTR)=IL+IALF2(IX)
C    -STORE THE LABEL STARTING IN NEXT WORD.
      IF(IAND(IL,1).EQ.1) IL=IL+1 
      CALL MOVCA(IFORM,(ILABEL+(L-N1)*33),KFORM,
     *     ((N2+IPNTR+1)*2-1),IL) 
C    -UPDATE IPNTR TO NEXT STRING ADDRESS.
      IPNTR=IPNTR+1+(IL/2)
220   GO TO 230 
199   CONTINUE
230   CONTINUE
C    -ERROR IF TOTAL LENGTH OF STATE MINUS 3 WORDS IS .GT. 256
      IF(IPNTR.GT.259) STOP 3 
C    -CALCULATE TRUE LENGTH MINUS 3.
      IX=IPNTR-3
      N1=N2 
C    -SPLIT THE STATE IF NECESSARY. 
      CALL SPLT(N1,IPNTR,KFORM,0) 
C    -STORE TOTAL LENGTH OF STATE MINUS 3.
      KFORM(N2+2)=IX
C    -STORE SAME LENGTH INTO TS HEADER
      KFORM(13)=IX
C    -NOW UPDATE TS TOTAL LENGTH IN TS HEADER.
      KFORM(1)=N1 
C 
C 
C 
C********************************************************************** 
C 
C   CONSTRUCTION OF AN U OR M STATE 
C 
C***********************************************************************
C 
C  HERE BEGINS THE CONSTRUCTION OF AN U OR M STATE .
C      GENERAL PARAMETERS : 
C                 N  : CURRENT POINTER IN IMAI ARRAY
C                 N1 : CURRENT STATE # FIRST IS 1 
C                 N2 : WORD ADDRESS OF FIRST WORD OF CURRENT STATE
C                 N3 : CURRENT ADDRESS IN KFORM 
C                 N4 : CURRENT RELATIVE ADDRESS IN DATA OUTPUT BUFFER 
C                 N5 : CURRENT OFFSET (WORDS) OF THE BEGINING OF STATE
C                      IN JFORM 
C                 N6 : LOCAL PARAMETER
C                 N7 : INPUT STRING LENGTH
C                 N8 : CURRENT OFFSET (CHARACTERS) OF THE BEGINING OF 
C                      STATE IN JFORM 
C                IAT : CURRENT ANSWER TYPE
C                 IX : LOCAL PARAMETER
C                 IY : LOCAL PARAMETER
C              JBYTE : # BYTES PER RECORD IN JFORM (CURRENTLY 170)
C              JWORD : # WORDS PER RECORD IN JFORM (CURRENTLY  85)
C                 LW : WORD POINTER IN LISTOF WHICH HOLDS THE DATA
C                      FOR THE OFF-LINE PRINT-OFF.
C               LCTR : COUNTER FOR THE TOTAL # OF OFF-LINE PRINT-OFF'S
C 
C 
C  INITIALISE PARAMETERS
C 
260   N1=1
      N2=KFORM(1) 
      IFAF=0
      ISUMN=0 
      LW=1
      LCTR=0
C 
C  RESERVE PLACE FOR SYSTEM ADDED INFORMATION 
C 
      N4=1
      IF(IGET1(MFORM,1).NE.1HX) GO TO 261 
      IMAI(41,5)=N4 
      N4=N4+2 
261   IF(IGET1(MFORM,2).NE.1HX) GO TO 262 
      IMAI(42,5)=N4 
      N4=N4+1 
262   IF(IGET1(MFORM,3).NE.1HX) GO TO 263 
      IMAI(43,5)=N4 
      N4=N4+3 
263   IF(IGET1(MFORM,4).NE.1HX) GO TO 265 
      IMAI(44,5)=N4 
      N4=N4+2 
C 
C 
C=========================================================================
C 
C HERE BEGINS THE LOOP
C EACH LOOP BUIDS A STATE CORRESPONDING TO A QUESTION 
C 
C 
265   IF(N1.GT.(IUMAX+IMMAX)) GO TO 625 
      N=2*N1-1
C    -GO BUILD FAF RECORD IF NECESSARY. 
      IF(.NOT.(ISBIT(IMAI(N,2),9))) GO TO 271 
      IF(IFAF.EQ.0) GO TO 654 
C 
C*************************************************************************
C 
C  BUILD STATE GENERAL INFORMATION
C 
C************************************************************************ 
C 
271   N5=(N1-1)*JWORD 
      N8=(N1-1)*JBYTE 
      IAT=JFORM(50+N5)
C 
C  INCLUDE FLAGS FOR DISPLAY,DEFAULT VALUE,INPUT FROM CARD READER ... 
C  IMAGE DELETE FLAG,LAST QUESTION STATE FLAG 
C  INCLUDES ALSO STATE QUALIFIER ,STATE INDEX...
C 
C    -DF. 
      IF(IGET1(JFORM,2+N8).EQ.1HX) KFORM(N2+1)=100000B
C    -DVF.
      IF(IGET1(JFORM,103+N8).EQ.1HX) KFORM(N2+1)=IOR(KFORM(N2+1),20000B)
C    -DEL.
      IF(ISBIT(IMFLG,2)) KFORM(N2+1)=IOR(KFORM(N2+1),400B)
C    -LST.
      IF(N1.EQ.IUMAX+IMMAX) KFORM(N2+1)=IOR(KFORM(N2+1),1000B)
C 
C  STATE INDEX AND STATE QUALIFIER
C 
      IF(N1.LE.IUMAX) KFORM(N2+1)=KFORM(N2+1)+40B+N1
      IF(N1.GT.IUMAX) KFORM(N2+1)=KFORM(N2+1)+100B+(N1-IUMAX)+IFAF
C 
C  ITEM TYPE AND STRING LENGTH (IN CHARS. 2 FOR INTEGERS,4 REALS) 
C 
      KFORM(N2+2)=IAT 
      IF(IAT.NE.0) GO TO 270
      N7=JFORM(25+N5) 
      KFORM(N2+2)=IOR(KFORM(N2+2),16*N7)
270   IF(IAT.EQ.1) KFORM(N2+2)=IOR(KFORM(N2+2),40B) 
      IF(IAT.EQ.2) KFORM(N2+2)=IOR(KFORM(N2+2),100B)
C 
C-----CRT OR PRINTER OR ALPHA DISPLAY USED? 
C 
      IF(.NOT.ISSPA(JFORM,N8+6,5) .AND. .NOT.ISBIT(ITT,7)) GO TO 280
C 
C-----IF CRT IS TO BE USED, SET LSC,SCL,OLD AS REQD.
C 
      IF(IGET1(JFORM,N8+6) .EQ. 1H ) GO TO 2711 
         IF(IGET1(JFORM,N8+6).EQ.1HL) CALL SETBT(KFORM(N2+6),15,1)
         IF(IGET1(JFORM,N8+7).EQ.1HS) CALL SETBT(KFORM(N2+6),14,1)
C 
C-----IF PRINTER IS USED, SET ANS,ONP IN HDR AS REQD. 
C 
2711  IF(IGET1(JFORM,N8+9).EQ.1H ) GO TO 272
      CALL SETBT(KFORM(N2+2),14,1)
      KFORM(11)=IOR(KFORM(11),400B) 
C 
C-----SET OUTPUT DEVICE: 1=CRT, 2=PRINTER, 3=BOTH.
C 
272   IF(ISSPA(JFORM,N8+6,2)) CALL SETBT(KFORM(N2+6),0,1) 
      IF(ISSPA(JFORM,N8+9,1)) CALL SETBT(KFORM(N2+6),1,1) 
C 
C-----IF THERE IS A LABEL FOR THE QUESTION, SET TTL & MOVE
C     LABEL TO KFORM. 
C 
273   IF(.NOT.ISSPA(JFORM,N8+11,16)) GO TO 274
C    -YES. SET TTL & MOVE TITLE TO KFORM. 
      KFORM(N2+2)=IOR(KFORM(N2+2),100000B)
      LNGT=LNCAR(JFORM,N8+11,16)
      IF(ISBIT(LNGT,0)) LNGT=LNGT+1 
      CALL MOVCA(JFORM,N8+11,KFORM,(N2+8)*2-1,LNGT) 
      KFORM(N2+7)=(LNGT/2)+1
C 
C-----IF SUMMARY (IE, OFF-LINE PRINT-OUT AT END OF TRANSACTION) GET TITLE?
C 
274   IF(IGET1(JFORM,N8+10).NE.1HX) GO TO 280 
C     SET TTL & STORE NO. OF BYTES IN LISTOF
C     -LABEL FOR ANSWER?
276   IF(.NOT.ISSPA(JFORM,N8+11,16)) GO TO 280
C     -YES.  GET # BYTES TO STORE.
      LNGT=LNCAR(JFORM,N8+11,16)
      IF(ISBIT(LNGT,0)) LNGT=LNGT+1 
      LISTOF(LW)=LNGT*16
      LISTOF(LW)=IOR(LISTOF(LW),100000B)
      LW=LW+1 
C     MOVE TITLE TO LISTOF. 
      CALL MOVCA(JFORM,N8+11,LISTOF,LW*2-1,LNGT)
      LW=LW+LNGT/2
      LCTR=LCTR+1 
C 
C  U QUESTION SEQUENCE STORAGE LENGTH ,QUESTION LIGHT,ITEM ADDRESS
C  IX IS QUESTION LIGHT 
C 
280   IF(N1.EQ.(IUMAX+1)) KFORM(8)=N4-1 
      IF(INUM(JFORM,N8+3,2,IX)) STOP 4
C    -QUESTION LIGHT #. 
      KFORM(N2+3)=IX*4096 
      IOFT=N4 
      IF(IAT.EQ.0) N4=N4+(N7+1)/2 
      IF(IAT.EQ.1) N4=N4+1
      IF(IAT.EQ.2) N4=N4+2
C 
C-----THIS SECTION DOES THE NON-KEYBOARD INPUT DEVICES. 
C 
C     WORD 5 (N2+4) 
C 
C-----IF NOT NON-KEYBOARD INPUT, JMP TO 290.
C 
      IF(IGET1(JFORM,N8+5).NE.1HX) GO TO 290
      ILN=2 
C 
C-----PROCESS USER WRITTEN INPUT MODULE.
C 
      IF(.NOT.ISSPA(JFORM,N8+153,5)) GO TO 281
      KFORM(N2+4)=31
      GO TO 290 
C 
C-----PROCESS TYPE V BADGE. 
C 
281   IF(.NOT.ISSPA(JFORM,N8+44,4)) GO TO 282 
      KFORM(N2+4)=2 
      IF(ISBIT(JFORM(N5+24),0)) CALL SETBT(KFORM(N2+4),15,1)
      ISTART=44 
      IEND=46 
      IF(ISSPA(JFORM,N8+43,1)) CALL SETBT(KFORM(N2+4),11,1) 
      IF(IGET1(JFORM,N8+43).EQ.1HN) CALL SETBT(KFORM(N2+4),15,1)
      GO TO 288 
C 
C-----PROCESS TYPE III BADGE & CARDS. 
C 
282   IF(IGET1(IFORM,1518).NE.1HX) GO TO 286
C    -YES. INIT THE CARD SPEC BITS. 
      KFORM(N2+4)=IAND(KFORM(N2+4),7777B) 
      KFORM(N2+4)=KFORM(N2+4)+1 
C    -NEW CARD? 
      IF(.NOT.ISSPA(JFORM,N8+35,4)) GO TO 284 
C    -YES. SET NEW CARD FLAG (CRD) & GET REST OF NEW SPECS. 
      CALL SETBT(KFORM(N2+4),11,1)
C    -GO SET CAO IF NC (NO CLOCK MARKS).
      IF(IGET2(JFORM,N8+37).EQ.2HNC) GO TO 283
C    -SET CNC.
      CALL SETBT(KFORM(N2+4),12,1)
C    -SET CAO IF CA (CLOCK AFTER DATA). 
      IF(IGET2(JFORM,N8+37).EQ.2HCA) CALL SETBT(KFORM(N2+4),13,1) 
      GO TO 283 
C    -SET CAO.
283   CALL SETBT(KFORM(N2+4),13,1)
C    -IF MARKS, SET MH. 
284   IF(IGET1(JFORM,N8+36).EQ.1HM) CALL SETBT(KFORM(N2+4),14,1)
C    -IF ASCII, SET AI (EVEN IF NOT A NEW CARD).
285   IF(ISBIT(JFORM(N5+24),0)) CALL SETBT(KFORM(N2+4),15,1)
      ISTART=39 
      IEND  =41 
      GO TO 288 
C 
C-----PROCESS BAR CODE READER.
C 
286   IF(.NOT.ISSPA(JFORM,N8+158,5)) GO TO 287
      KFORM(N2+4)=3 
      ISTART=159
      IEND=161
      ICODE=IGET1(JFORM,N8+158) 
      IF(ICODE.EQ.1HI) IWAND=0
      IF(ICODE.EQ.1HM) IWAND=1
      IF(ICODE.EQ.1HC) IWAND=2
      IF(ICODE.EQ.1HU) IWAND=3
      KFORM(N2+4)=KFORM(N2+4)+IWAND*256 
      IF(IGET1(JFORM,N8+158).NE.1H ) CALL SETBT(KFORM(N2+4),11,1) 
      IF(IGET1(JFORM,N8+170).EQ.1HX) CALL SETBT(KFORM(N2+4),7,1)
      GO TO 288 
C 
C-----IT WASN'T ANY OF THE ABOVE SO DEFAULT TO MAGSTRIPE READER.
C 
287   KFORM(N2+4)=4 
      IF(IGET1(JFORM,N8+163).NE.1H ) CALL SETBT(KFORM(N2+4),11,1) 
      ISTART=164
      IEND=167
      ILN=3 
C 
C-----GET STARTING & ENDING COLUMNS.
C 
288   IF(INUM(JFORM,N8+ISTART,ILN,IS)) PAUSE 276
      IF(INUM(JFORM,N8+IEND,ILN,IE)) PAUSE 277
C 
C-----CALCULATE LENGTH. IF IMAGE CARD, TRANSLATE CARD COL TO BYTES. 
C 
      IF(ISBIT(KFORM(N2+4),15)) GO TO 289 
      INDEV=IAND(KFORM(N2+4),37B) 
      IF(INDEV.NE.1 .AND. INDEV.NE.2) GO TO 289 
      IS=IS+IS-1
      IE=IE+IE
C 
C-----STORE CARD FIELD LENGTH & STARTING BYTE.
C 
289   ILENTH=IE-IS+1
      KFORM(N2+5)=IS
      KFORM(N2+5)=KFORM(N2+5)+ILENTH*256
C 
290   CONTINUE
C 
C 
C************************************************************************ 
C 
C THIS SECTION BUILDS THE DISPLAY INFORMATION PART OF 
C THE STATE.
C 
C************************************************************************ 
C 
C PRINT ?,STRING LENGTH,DISPLAYED ITEM TYPE 
C IX IS ITEM TYPE 
C IY IS DISPLAYED STRING LENGTH 
C IZ IS A VARIABLE LOCAL TO THE DISPLAY INFORMATION ROUTINE.
C IZ=0 NO TOTAL DISPLAY ON THIS ITEM. 
C IZ=1 SUM ITEM, BUT QUES.NE.DISPLAY
C IZ=2 SUM ITEM, AND QUES.EQ.DISPLAY
C 
C-----1ST, SET CURRENT ADDRESS IN KFORM INTO N3.
C 
      N3=N2+7 
      IF(ISBIT(KFORM(N2+2),15)) N3=N3+KFORM(N2+7) 
C IF NO DISPLAY STORE ITEM OFFSET IN OUTPUT BUFFER
      IZ=0
C    -DISPLAY?
      IF(IAND(KFORM(N2+1),100000B).NE.0) GO TO 291
C    -NO. NOW STORE ITEM RELATIVE ADDRESSES IN DATA OUTPUT BUFFER.
      IF(IAT.NE.3) KFORM(N2+3)=KFORM(N2+3)+IOFT 
      IF(IAT.NE.3) IMAI(N,5)=IOFT 
C    -IF OFF-LINE PRINT-OUT (IE, SUMMARY) WILL BE DONE AT THE END OF
C     THIS TRANSACTION, MOVE THE LENGTH, TYPE, & OUTPUT BUFFER
C     ADDRESS TO THE LIST-OFF SAVE BUFFER.
      IF(IGET1(JFORM,N8+10).NE.1HX) GO TO 320 
2901  LISTOF(LW)=IAND(KFORM(N2+2),7777B)
      LW=LW+1 
      LISTOF(LW)=IAND(KFORM(N2+3),7777B)
      LW=LW+1 
      LCTR=LCTR+1 
      GO TO 320 
C 
C    IMAGE DISPLAY  GET ITEM LENGTH AND TYPE
C 
291   IF(IMAI(N+1,1).EQ.0) GO TO 292
      IX=IAND(IMAI(N+1,2),30000B)/4096
      IY=IAND(IMAI(N+1,4),377B) 
C    -WILL A TOTAL BE DONE ON THIS DISPLAY ITEM?
      IF(IGET1(JFORM,N8+146).EQ.1HX) GO TO 2911 
C    -NO. SET IDF BIT.
      CALL SETBT(KFORM(N3),13,1)
      GO TO 293 
C    -YES. QUES ITEM = DISPLAY ITEM?
2911  IZ=1
      IF(CMPB(JFORM,N8+27,JFORM,N8+134,6)) IZ=2 
      GO TO 293 
C 
C  NON IMAGE DISPLAY
C    -DISPLAY ITEM TYPE.
292   IY=IGET1(JFORM,133+N8)
      IF(IY.EQ.2HS ) IX=0 
      IF(IY.EQ.2HI ) IX=1 
      IF(IY.EQ.2HR ) IX=2 
C    -DISPLAYED ITEM LENGTH.
      IY=JFORM(N5+66) 
C    -UDR 
293   IF(IMAI(N+1,1).NE.0) GO TO 295
      IF(ISSPA(JFORM,N8+126,5)) CALL SETBT(KFORM(N3),15,1)
C    -SUM.
295   IF(IZ.NE.0) CALL SETBT(KFORM(N3),12,1)
C    -NEXT WORD.
      N3=N3+1 
C    -SET TTL IF A TITLE FOR THE DISPLAY WILL BE PRINTED. 
C     IF(ISSPA(JFORM,N8+104,2)) GO TO 298 
297   IF(ISSPA(JFORM,N8+107,16)) CALL SETBT(KFORM(N3),15,1) 
C    -PRT.
298   IF(IGET1(JFORM,N8+105).EQ.1HX) CALL SETBT(KFORM(N3),14,1) 
C    -DISPLAYED ITEM TYPE.
      KFORM(N3)=KFORM(N3)+IX
C    -DISPLAYED ITEM LENGTH.
      IF(IX.EQ.0) KFORM(N3)=IOR(KFORM(N3),IY*16)
      IF(IX.EQ.1) KFORM(N3)=IOR(KFORM(N3),40B)
      IF(IX.EQ.2) KFORM(N3)=IOR(KFORM(N3),100B) 
C 
C  DISPLAY LIGHT #, DISPLAY ITEM ADDRESS
C 
C    -NEXT WORD.
300   N3=N3+1 
      IF(INUM(JFORM,101+N8,2,KFORM(N3))) STOP 5 
      KFORM(N3)=(KFORM(N3)*4096)
      KFORM(N3)=KFORM(N3)+IOFT
      IMAI(N+1,5)=IOFT
C     -SET ONP IN TS HEADER IF ON-LINE DISPLAY OR PRINT-OUT WILL BE DONE. 
      IF(ISSPA(JFORM,N8+104,2)) KFORM(11)=IOR(KFORM(11),400B) 
C 
302   N3=N3+1 
      IF(IX.EQ.0) INC=(IY+1)/2
      IF(IX.EQ.1) INC=1 
      IF(IX.EQ.2) INC=2 
      N4=N4+INC 
C 
C  STORE NOW QUESTION OFFSET IN OUTPUT BUFFER 
C 
      KFORM(N2+3)=KFORM(N2+3)+IOFT+INC
      IMAI(N,5)=IOFT+INC
C 
C-----IF OFF-LINE PRINT-OUT (IE, SUMMARY) WILL BE DONE AT THE END OF
C     THIS TRANSACTION FOR THIS DISPLAY ITEM, MOVE THE TITLE (IF ANY) 
C     OF THE PRINT-OUT, ITEM LENGTH, TYPE, & ADDRESS IN OUTPUT BUFFER 
C     INTO THE LIST-OFF SAVE BUFFER.
      IF(IGET1(JFORM,N8+10).NE.1HX) GO TO 304 
C    -SAVE THE ANSWER ADDRESSES AT THIS TIME. 
303   LISTOF(LW)=IAND(KFORM(N2+2),7777B)
      LW=LW+1 
      LISTOF(LW)=IAND(KFORM(N2+3),7777B)
      LW=LW+1 
      LCTR=LCTR+1 
304   IF(IGET1(JFORM,N8+106).NE.1HX) GO TO 309
307   IF(.NOT.ISSPA(JFORM,N8+107,16)) GO TO 308 
C    -SAVE THE DISPLAY TITLE. 
      LNGT=LNCAR(JFORM,N8+107,16) 
      IF(ISBIT(LNGT,0)) LNGT=LNGT+1 
      LISTOF(LW)=LNGT*16
      LISTOF(LW)=IOR(LISTOF(LW),100000B)
      LW=LW+1 
      CALL MOVCA(JFORM,N8+107,LISTOF,(LW*2-1),LNGT) 
      LW=LW+LNGT/2
      LCTR=LCTR+1 
C    -SAVE THE DISPLAY ITEM ADDRESS.
308   LISTOF(LW)=IAND(KFORM(N3-2),7777B)
      LW=LW+1 
      LISTOF(LW)=IAND(KFORM(N3-1),7777B)
      LW=LW+1 
      LCTR=LCTR+1 
C 
C  FOR NON IMAGE DISPLAY INCLUDE DISPLAY PROGRAM NAME 
C 
309   IF(IMAI(N+1,1).NE.0) GO TO 310
      CALL MOVCA(JFORM,126+N8,KFORM,(N3*2-1),5) 
      CALL PUTCA(KFORM,1H ,N3*2+4)
C    -NEXT FIELD. 
      N3=N3+4 
      GO TO 318 
                                                                                                                                                                                                                              