FTN4
      SUBROUTINE ZTMP, 92903-16510 REV.1913  790203 
C 
C 
C     NAME:   ZTMP
C     SOURCE: &ZTMP'    92903-18510 
C     BINARY: %ZTMP'    92903-16510    PART OF  %ZTMP  92903-16510
C 
C     PMGR:   FRANCOIS GAULLIER 
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     THIS PROGRAM IS A PART OF THE:
C 
C                      DATA CAPTURE SOFTWARE
C                        ( D A T A C A P )
C 
C     IT USES FEATURES OF THE TERMINAL MONITOR SOFTWARE (TMS).
C 
C     THIS MODULE: ZTMP IS THE MAIN T.U.S. OF THE  TMP
C                   (TRANSACTION MONITOR PROGRAM) 
C 
C 
C**********************************************  F. GAULLIER  (HPG)  ***
C 
C 
      INTEGER TSMG(3),OFLPO(3),STORAG(3),ERRFL,FORMN,SQUAL,FMGST
     .,DITMTP,DITMLN,DOBUPT,STATPT,EDITPT,STCNT,FLDCNT,DEFVA
     .,STATE,STATLN,OUTLEN,OBUF,OBUFPT,OBULN,OBULNX,FORWJN
     .,BKSQ,BKIN,BKJN,FAF,IMGFLG,FAFRTB,XRTB,ENDCHN,CALCBU
     .,IMGSTA(4),TEMPB(256),CRBUF,PRTBUF(13),LFLF(5)
     .,LOGHD(8),LOGACK(4),JTMLN,JTMTP,JOBUP,EQUIVX(3) 
     .,BUFULL,OUTBUF,OUTDEV,ERRBF(3),ZERO(2),COLCNT 
D    .,ITEMPX(25) 
C 
C***   DEFINE LOGICAL FLAGS 
C 
      LOGICAL BEGNFL,BKSFL,BKSIP,WAITC,CALCFL,CALCIP,DEFKB
     .       ,FORWIP,TEMPL,M14,DDSPV
D    .       ,QXY 
C 
C***   DEFINE LOGICAL FUNCTIONS 
C 
      LOGICAL INUM,FEDIT,VEDIT,VALCK,USFKV,CNVTI,ICNVT,CALCU,ENDBK
     .        ,BKSEN,DOBKS,ENDMQ,CMPW,ISNUL,ISBIT,KBINP,ONLPR 
     .        ,ISBTW,TMSIF,JULIB
C 
C 
C***   TRUE COMMON
C 
      COMMON ICOM00(5)
C 
C***   1ST COMMON BLOCK 
C 
      COMMON LU,ICTLB,ITYP,IST,ITL,IMAGEX(8),ISAVRT(6)
     .      ,IOMODL(3),ERRFL,EDITPT,IFC,IOMTMP(2),ITSN,ITSSTP,ITIM0(6)
     .      ,LITE1,LITE2,OUTDEV,INPDEV,ITSNAM(5),OUTLEN,OUTBUF(40)
C 
C***   2ND COMMON BLOCK 
C 
      COMMON NUQ,NMQ,STATPT,INDEX,OBULN,L1,L2,OBUF(250) 
C 
C***   3RD COMMON BLOCK 
C 
      COMMON FORMN,SQUAL,JNDEX,FMGST,STATLN,STATE(80) 
C 
      COMMON INPLEN,INPBUF(100) 
C 
      COMMON ITEMTP,ITEMLN,OBUFPT,DITMTP,DITMLN,DOBUPT
     .      ,CRBUF(40),FLDCNT,STCNT,DEFKB,COLCNT
     .      ,IERTN,ITT,KEYN,INLNGT,INPSTA,INPITL,IMAGPT 
     .      ,BEGNFL,BKSFL,BKIN,BKJN,BKSIP,BKSQ,FORWIP,FORWJN
     .      ,WAITC,BUFULL,ENDCHN,CALCFL,CALCIP,CALCBU(4),FAF,IMGFLG 
     .      ,IDBNUM,LSTCLC
C 
C***   4TH COMMON BLOCK 
C 
      COMMON IUSER(21)
C 
C***   5TH COMMON BLOCK 
C 
      COMMON FAFRTB(6),XRTB(6,20),IMGBUF(256) 
C 
C***   LAST COMMON WORD 
C 
      COMMON ICOMEN 
C 
      EQUIVALENCE (CALCBU,IMECD)
     .           ,(JTMTP,EQUIVX(1)),(JTMLN,EQUIVX(2)) 
     .           ,(JOBUP,EQUIVX(3)) 
     .           ,(ISTATS,ITSNAM(1)),(ITRNLG,ITSNAM(2)) 
     .           ,(ISFK1,ITSNAM(3)) 
      EQUIVALENCE (IFEATR,INPBUF(1))
     .           ,(LUOXXX,ICOM00(1))
C 
      DATA OBULNX/250/
      DATA TSMG/2HTS,2HMG,2H  / 
     .    ,OFLPO/2HOF,2HLP,2HO /
      DATA STORAG/2HST,2HOR,2HA / 
      DATA LITERR/100000B/,LITTCP/100400B/,ZERO/2*0/
      DATA PRTBUF/2*20015B,2H**,2H**,2H* ,2HT.,2H  ,2H  ,2H  ,2H *
     .,2H**,2H**,6440B/ 
      DATA LFLF/5*6440B/,ERRBF/2H--,2H  ,2H--/
      DATA LOGHD/2HTM,2HP ,2H  ,2H  ,2H  ,2H  ,2H  ,2H  / 
      DATA LOGACK/77407B,20007B,20007B,20007B/
C 
C-----EXPLANATION OF VARIABLE NAME: 
C     ----------------------------- 
C 
C     ITEMTP, ITEMLN, OBUFPT   )       ITEM CHARACTERISTIC, TYPE, LEN,
C     DITMTP, DITMLN, DOBUPT   )                   ADDR. IN 'OBUF'
C     JTMTP,  JTMLN,  JOBUP    )    (MUST BE CONSECUTIVES WORDS IN MEMORY)
C 
C     FLAGS:
C     ------
C 
C   ERRFL   INTEG.   ERROR FLAG   (0 = NO ERROR)
C   IMGFLG  INTEG.   IMAGE USE IN THIS TS   (0 = NO IMAGE)
C   BUFULL  INTEG.   OUTPUT BUFFER 'OBUF' OVERFLOW  (0 = NO OVERFLOW) 
C   FAF     INTEG.   FAF STATE  (0 = NO FAF STATE FOUND YET)
C                               (1 = FAF STATE HAS BEEN PASSED FORWARD) 
C                               (2 = FAF STATE HAS BEEN PASSED WHEN BACKSP.)
C   ENDCHN  INTEG.   END OF CHAIN IN CHAINED DBGET CALL 
C                               (32767 = NO END OF CHAIN REACHED YET) 
C                               (32766 = 1ST RECORD OF THE CHAIN READ FOR 
C                                        TOTAL PURPOSE) 
C                               (N = END OF CHAIN HAS BEEN REACHED AT LINE
C                                        INDEX = N-1) 
C 
C   BEGNFL  LOGIC.   FIRST TIME TS IS EXECUTED (TRUE = 1ST TIME)
C   BKSFL   LOGIC.   BACKSPACE IN THE TS  (TRUE = RECALL HAS BEEN USED) 
C   BKSIP   LOGIC.   BACKSPACE IN PROCESS (TRUE = RECALL WAS THE LAST ANSWER) 
C   FORWIP  LOGIC.   FORWARD ADVANCE IN THE TS (TRUE = SKIP TERMINAL I/O) 
C   WAITC   LOGIC.   WAIT FOR TS COMPLETE (TRUE = ACCEPT ONLY TRANS. COMPL.)
C   DEFKB   LOGIC.   CURRENT INPUT IS FROM KBD INSTEAD OF CARD. 
C                               (TRUE = DEFAULTED TO KBD) 
C 
C 
C     VARIABLES:
C     ----------
C 
C   INDEX   INTEG.   LINE INDEX, 1 FOR U-QUESTION, 1 FOR 1ST LINE OF M-QUES., 
C                                2 FOR 2ND LINE OF M-QUES., ....
C   JNDEX   INTEG.   COLUMN INDEX, 1 FOR 1ST U OR M-QUES., 2 FOR 2ND U OR 
C                                M-QUES., ... 
C   SQUAL   INTEG.   STATE QUALIFIER, 0 FOR SFK DEFINITON 
C                                     1 FOR U-QUESTION
C                                     2 FOR M-QUESTION
C                                     3 FOR STORAGE DEFINITION ...
C   BKIN    INTEG.   )   KEEP THE STATE WHERE RECALL FUNCTION HAS BEEN USED 
C   BKJN    INTEG.   )        FOR THE 1ST TIME (LINE INDEX, COLUMN INDEX, 
C   BKSQ    INTEG.   )        STATE QUALFIER) 
C   STCNT   INTEG.   COUNT STATE FROM THE BEGINNING OF A CARD INPUT TO BACK 
C                       THE 1ST QUESTION OF THE CARD WHEN ERROR IS DETECTED 
C   IDBNUM  INTEG.   DATA BASE IDENTIFIER, REQUIRED IN ALL TBXXX CALLS. 
C 
C-----I/O MODULE INTERFACE VARIABLES
C 
C     IFC --> THE FUNCTION CODE FOR CHOOSING THE I/O MODULE 
C                FUNCTION.  N.B.  IFC MUST BE 1,2,3,4, OR 5!
C 
C     LITE1 --> HI AND LO BYTES CONTAIN LOGICAL NUMBERS FOR 
C                  PROMPTING LIGHTS TO BE LIT. (QUEST. LIGTH - DISPLAY LIGHT) 
C 
C     LITE2 --> HI AND LO BYTES CONTAIN LOGICAL NUMBERS FOR 
C                  PROMPTING LIGHTS TO BE LIT. (ERROR LIGHT  - TR. COMP. LI)
C 
C     OUTDEV --> OUTPUT DEVICE WORD.  DESCRIBES THE DEVICE TO 
C                   WHICH OUTPUT FROM TMP WILL BE WRITTEN. BITS 
C                   15, 1, AND 0 ARE THE POWER FAIL, PRINTER AND
C                   DISPLAY BITS, RESPECTIVELY. 
C 
C     INPDEV --> INPUT DEVICE WORD.  HI BYTE CONTAINS THE INPUT 
C                  DESCRIPTION--LO BYTE CONTAINS THE INPUT DEVICE 
C                  DESCRIPTION. 
C 
C     ITSNAM --> TS#-SC BUFFER.  FOR IFC=1,2 -- THE FORMAT OF ITSNAM
C                   IS AS FOLLOWS:
C                                   WORD 1 = 100000B
C                                   WORD 2 IS NOT USED
C                                   WORD 3 IS NOT USED
C                                   WORD 4 = TS#
C                                   WORD 5 = SC 
C 
C                    FOR IFC=4, THE FORMAT IS AS FOLLOWS: 
C 
C                                   WORD 1 IS NOT USED
C                                   WORD 2 IS NOT USED
C                          ISFK1 -- WORD 3 = SFK DEFINITION WORD #1 
C                                              (FOR SFK'S 1-16) 
C                          ISFK2 -- WORD 4 = SFK DEFINITION WORD #2 
C                                              (FOR SFK'S 17-32)
C 
C                    FOR IFC=5, THE FORMAT IS AS FOLLOWS: 
C 
C                         ISTATS -- WORD 1 = I/O MODULE COMPLETION STATUS 
C                         ITRNLG -- WORD 2 = I/O MODULE TRANS. LOG
C                                   WORD 3 = SFK DEFINITION (1-16)
C                                   WORD 4 = SFK DEFINTION (17-32)
C                                   WORD 5 IS NOT USED
C 
C     OUTLEN --> LENGTH IN BYTES OF THE INFORMATION TO BE WRITTEN 
C                   TO THE TERMINAL (LENGTH IN BYTES OF INFO. IN 'OUTBUF')
C 
C     OUTBUF --> BUFFER OF INFORMATION TO BE WRITTEN TO TERMINAL. 
C 
C     INPLEN -- LENGTH IN BYTES OF INFORMATION EXPECTED IN 'INPBUF'.
C 
C     INPBUF -- BUFFER OF INFORMATION READ FROM THE DATA-CAPTURE TERMINAL.
C                  N.B.  FOR IFC=3, INPBUF(1) IS THE 'REQUIRED TERMINAL 
C                        FEATURES WORD'.  IT IS EQUIV'D 'IFEATR'. 
C 
C 
C 
C 
C-----DEFINE LOCAL FUNCTION 
C 
      IRS12(M0)=IAND(IALF2(M0),360B)/16 
      LIGHN(M1)=IRS12(STATE(M1))*256
      IRS8(M2)=IAND(IALF2(M2),377B) 
      ITML(M5)=IAND(STATE(M5),7760B)/16 
      ITMT(M8)=IAND(STATE(M8),17B)
      IPT(M6,M7)=IAND(STATE(M7+1),7777B)+(M6-1)*L2
      IMPT(M8)=OBULN-M8*6*IMGFLG
      ENDBK(M9)=BKSEN(BKSFL,FAF,SQUAL,INDEX,JNDEX,BKSQ,BKIN,BKJN) 
      KBINP(M10)=IAND(STATE(4),37B).EQ.0
      ICNVT(M11)=CNVTI(ITEMTP,TEMPB,INLNGT,INPBUF)
      ONLPR(M13)=.NOT. ISBIT(STATE(2),14) 
      VALCK(M14)=VEDIT(M14,ITEMTP,STATE(EDITPT),INPBUF,K) 
C 
C 
C-----SWAP JUST THE PROGRAM AREA
C 
      CALL EXEC(22,2) 
C 
C------DEFINE COMMON BLOCK STRUCTURE, 
C 
      CALL TMDFN(ICOM00,LU,NUQ,FORMN,IUSER,FAFRTB,ICOMEN) 
C 
C       FROM THIS POINT, THIS PROGRAM IS REACTIVATED
C         FOR EACH INTERACTIVE DEVICE. (COMMON BLOCK # 1
C         IS ENABLED) 
C 
C 
C     CHECK TERMINAL TYPE FOR THE PROMPT
C 
      IF(ITYP .NE. 3070)  CALL TMSAB(34)
C 
C#####################################################################
D     WRITE(LUOXXX,7339)LU,ICOM00 
D7339 FORMAT("  FOR LU="I2,", CB0:"5I7) 
C#####################################################################
C 
C-----OK, IT IS A DATA-CAPTURE TERMINAL, SET UP THE RIGTH 
C     I/O MODULE NAME.
C 
      IOMODL=2HIO+100000B 
      IOMODL(2)=2HM7
      CALL EXEC(13,LU,IEQT5)
      I=0 
      J=IAND(IEQT5,37400B)/256
      IF(J .EQ. 47B)  I=2H0 
      IF(J .EQ. 07B)  I=2H5 
      IF(I .EQ. 0)   CALL TMSAB(35) 
      IOMODL(3)=I 
C 
C  GET TS# [-SC]
C 
100   CONTINUE
      IFC=1 
      OUTLEN=0
      LITE1=0 
105   LITE2=0 
      CALL TMSUB(IOMODL)
      IF(IST.EQ.0)GO TO 300 
      CALL TMSAB(36)
220   CONTINUE
      IF(ERRFL.GT.1)ERRFL=1 
      ERRBF(2)=IASC(EDITPT) 
      IFC=1 
      IF(EDITPT.EQ.1)IFC=2
      LITE1=128 
      OUTLEN=6
      IF(EDITPT.EQ.0)OUTLEN=0 
      CALL MOVEW(ERRBF,OUTBUF,3)
      GO TO 105 
C 
C------INVOKE T-M SUBROUTINE "TSMG" TO OPEN THIS FORM 
C 
  300 ASSIGN 350 TO I 
      CALL TMCBE(I,FORMN) 
      SQUAL=10
      JNDEX=LU
      CALL MOVEW(ITSNAM,STATE,5)
DDD   CALL DMPZ(ICOM00,5,22HCB0 BEFORE TMSUB (300),-22) 
DDD   CALL DMPZ(LU,84,3HCB1,3)
DDD   CALL DMPZ(NUQ,257,3HCB2,3)
DDD   CALL DMPZ(FORMN,266,3HCB3,3)
DDD   CALL DMPZ(STATE,80,6H*STATE,6)
DDD   CALL DMPZ(IUSER,21,3HCB4,3) 
DDD   CALL DMPZ(FAFRTB,382,3HCB5,3) 
      CALL TMSUB(TSMG)
DDD   CALL DMPZ(ICOM00,5,22HCB0 AFTER  TMSUB (300),-22) 
DDD   CALL DMPZ(LU,84,3HCB1,3)
DDD   CALL DMPZ(NUQ,257,3HCB2,3)
DDD   CALL DMPZ(FORMN,266,3HCB3,3)
DDD   CALL DMPZ(STATE,80,6H*STATE,6)
DDD   CALL DMPZ(IUSER,21,3HCB4,3) 
DDD   CALL DMPZ(FAFRTB,382,3HCB5,3) 
      IF(FMGST .EQ. 0)  GOTO 2000 
C-----ERROR ! 
      IF(FMGST .EQ. -1)  EDITPT=0 
      IF(FMGST .EQ. -6)  EDITPT=1 
C-----DISABLE 3RD COMMON BLOCK
      CALL TMCBD(FORMN) 
  330 ERRFL=1 
      GOTO 220
C 
C-----COMMON BLOCK ENABLE HAS FAILED, ERROR # 40
C 
  340 CALL TMCBD(FORMN) 
  350 EDITPT=40 
      GOTO 330
C 
C-----RETURN FROM THE FORM PROCESSOR IS HERE: 
C 
  400 IF( ERRFL .EQ. 0 )  GOTO 100
      EDITPT=ERRFL
      GOTO 220
C 
C 
C***********************************************************************
C***********************************************************************
C 
C 
C     THIS PART OF CODE IS THE:  FORM PROCESSOR.
C     ==========================================
C 
C     THE FORM IS OPEN
C 
 2000 ASSIGN 4250 TO IERTN
      CALL NUL(ITIM0,6) 
      ITSN=FORMN
      ITSSTP=0
      CALL LOGEV(ICOM00(2),LU,0,0,ITSN,ITIM0) 
C-----ENABLE 2ND COMMON BLOCK 
      ASSIGN 340 TO I 
      CALL TMCBE(I,NUQ) 
C-----SET THE STOP-INHIBIT FLAG TO DISALLOW STOP OF THE TMP 
      ERRFL=20
      IF( TMSIF(1) )  GOTO 4233 
C-----INIT FORM PROCESSOR CONSTANTS 
      NUQ=IRS8(STATE(6))
      NMQ=IAND(STATE(6),377B) 
      L1=STATE(7) 
      L2=STATE(8) 
      ITT=STATE(10) 
      IFEATR=IAND(STATE(10),000777B)
C-----CHECK TERMINAL FEATURES 
      ERRFL =30 
      IFC=3 
      CALL TMSUB(IOMODL)
      IF(ISTATS.NE.0)GO TO 4233 
 2004 ASSIGN 4233 TO I
      ERRFL =40 
      IF( ISBIT(ITT,0) )  CALL TMCBE(I,IUSER) 
C-----INIT FORM PROCESSOR FLAGS & VARIABLES 
      IMGFLG=0
      IDBNUM=0
      BEGNFL=.TRUE. 
      ENDCHN=32767
      ERRFL=0 
      SQUAL=0 
      BUFULL=0
      STCNT=0 
C 
C-----CHECK IF IMAGE/1000 IS ACCESS FROM THIS TS
C 
      IF( .NOT. ISBIT(ITT,1) )  GOTO 2050 
      ASSIGN 4231 TO I
      ERRFL=40
      CALL TMCBE(I,FAFRTB)
      IMGFLG=1
      ERRFL=0 
      STATE(19)=0 
      CALL TBOPN(STATE(19),0,0,IMGSTA)
DDD   CALL DMPZ(ICOM00,5,15HCB0 AFTER TBOPN,-15)
DDD   CALL DMPZ(LU,84,3HCB1,3)
DDD   CALL DMPZ(NUQ,257,3HCB2,3)
DDD   CALL DMPZ(FORMN,265,3HCB3,3)
DDD   CALL DMPZ(IUSER,21,3HCB4,3) 
DDD   CALL DMPZ(FAFRTB,382,3HCB5,3) 
      IF(IMGSTA .NE. 0)  PAUSE 0120 
      IDBNUM=STATE(19)
 2020 DO 2025 I=1,20
 2025 XRTB(3,I)=32767 
      CALL TBULK(IDBNUM)
 2050 BKSFL =.FALSE.
      BKSIP =.FALSE.
      FORWIP=.FALSE.
      WAITC =.FALSE.
      CALCFL=.FALSE.
      CALCIP=.FALSE.
      DEFKB =.FALSE.
      IF(FAF .NE. 0)  FAF=1 
C 
C-----SETUP LINE INDEX FOR THE STATE
C 
 2100 INDEX=1 
      IF(SQUAL .NE. 1)  GOTO 2200 
C 
C-----SETUP SYSTEM PROVIDED DATA  (TR. ID - LU # - DATE - TIME) 
C 
      L=1 
      IF(.NOT. ISBIT(ITT,15) )  GOTO 2170 
      CALL JASC(FORMN,OBUF(L),-1,4) 
      L=L+2 
 2170 IF(.NOT. ISBIT(ITT,14) )  GOTO 2175 
      OBUF(L)=IASC(LU)
      L=L+1 
 2175 CALL EXEC(11,TEMPB,I) 
      IF  ( JULIB(TEMPB(5),I,N,J) ) 
     .               CALL TMPER(IERTN,49,FORMN,LU,107,0)
      IF(.NOT. ISBIT(ITT,13) )  GOTO 2180 
      OBUF(L)=IASC(I-1900)
      OBUF(L+1)=IASC(J) 
      OBUF(L+2)=IASC(N) 
      L=L+3 
 2180 IF(.NOT. ISBIT(ITT,12) )  GOTO 2185 
      OBUF(L)=IASC(TEMPB(4))
      OBUF(L+1)=IASC(TEMPB(3))
C 
C-----CHECK FOR ONLINE PRINTOUT -- IF SO, PRINT HEADER
C 
 2185 IF( .NOT. ISBIT(ITT,8) )  GOTO 2200 
      CALL CNUMD(FORMN,PRTBUF(7)) 
      CALL MOVEW(PRTBUF,OUTBUF,13)
      CALL BLANC(OUTBUF(14),20) 
      OUTBUF(18)=IASC(LU) 
      OUTBUF(20)=20015B 
      OUTBUF(22)=IASC(I-1900) 
      OUTBUF(23)=IASC(J)
      OUTBUF(24)=IASC(N)
      OUTBUF(27)=IASC(TEMPB(4)) 
      OUTBUF(28)=2H:
      CALL JASC(TEMPB(3),OUTBUF(28),-2,2) 
      OUTBUF(30)=6440B
      OUTLEN=60 
      INPLEN=0
      OUTDEV=2
      IFC=5 
      CALL TMSUB(IOMODL)
C 
C-----SETUP THE RIGHT STATE, (STATE QUAL., JNDEX AND INDEX) 
C 
 2200 JNDEX=1 
 2300 IF (SQUAL.EQ.0 .AND. JNDEX.EQ.INDEX+1) GOTO 2400
      IF (SQUAL.EQ.1 .AND. JNDEX.EQ.NUQ+1) GOTO 2400
      IF (SQUAL.EQ.2 .AND. JNDEX.EQ.NMQ+1) GOTO 2400
 2320 CONTINUE
DDD   CALL DMPZ(ICOM00,5,22HCB0 BEFORE TMSUB(2320),-22) 
DDD   CALL DMPZ(LU,84,3HCB1,3)
DDD   CALL DMPZ(NUQ,257,3HCB2,3)
DDD   CALL DMPZ(FORMN,266,3HCB3,3)
DDD   CALL DMPZ(STATE,80,6H*STATE,6)
DDD   CALL DMPZ(IUSER,21,3HCB4,3) 
DDD   CALL DMPZ(FAFRTB,382,3HCB5,3) 
      CALL TMSUB(TSMG)
DDD   CALL DMPZ(ICOM00,5,22HCB0 AFTER TMSUB (2320),-22) 
DDD   CALL DMPZ(LU,84,3HCB1,3)
DDD   CALL DMPZ(NUQ,257,3HCB2,3)
DDD   CALL DMPZ(FORMN,266,3HCB3,3)
DDD   CALL DMPZ(STATE,80,6H*STATE,6)
DDD   CALL DMPZ(IUSER,21,3HCB4,3) 
DDD   CALL DMPZ(FAFRTB,382,3HCB5,3) 
C-----CHECK STATUS OF FORM MANAGER
      IF(FMGST .EQ. 0)  GOTO 3000 
C-----ERROR #  -2 IS STATE WITH INDEX NOT DEFINED 
      CALL TMPER(IERTN,49,FORMN,LU,111,FMGST) 
 2400 SQUAL=SQUAL+1 
      GOTO (2100,2100,2500),SQUAL 
C-----M-QUESTION TYPE: START AT BEGINNING OF NEXT LINE
 2500 SQUAL=SQUAL-1 
      INDEX=INDEX+1 
      GOTO 2200 
C-----RETURN FROM  STATE PROCESSOR IS HERE
C     GOTO NEXT STATE.
 2600 JNDEX=JNDEX+1 
      STCNT=STCNT+1 
      GOTO 2300 
C 
C     THIS PART OF CODE IS THE:  STATE PROCESSOR. 
C     =========================================== 
C 
 3000 ITSSTP=JNDEX
      IF(SQUAL .EQ. 2)  ITSSTP=NUQ+ITSSTP+NMQ*(INDEX-1) 
      IF(SQUAL .NE. 0)  GOTO 3050 
C 
C=====STORE SFK DEFINITION INTO OUTPUT BUFFER AT THE END
C 
      IF(INDEX .NE. 1)  GOTO 3010 
C-----LEAVE ENOUGH ROOM FOR FILE STORAGE STATE DEFINITION ! 
      K=STATE(2)
      IF(K .LE. 25)  K=25 
      OBULN=OBULNX-K
      OUTLEN=OBULN
 3010 CALL MOVEW(STATE(2),OBUF(OUTLEN),STATLN-1)
      OUTLEN=OUTLEN+STATLN-1
      IF( .NOT. ISBIT(STATE,8) )  GOTO 3015 
      INDEX=INDEX+1 
      GOTO 2600 
C 
C  RESET THE DATACAPTURE TERMINAL AND ENABLE APPROPRIATE SFK'S
C 
 3015 IFC=4 
      CALL MOVEW(OBUF(OBULN+8),ISFK1,2) 
      CALL TMSUB(IOMODL)
      IFC=5 
C#################################################################
D     WRITE(LUOXXX,9820)LU
D9820 FORMAT(/," FORM LU#"I3,5X,"SFK DEFINITION:")
D     WRITE(LUOXXX,9821)(OBUF(I),I=OBULN,OBULNX)
D9821 FORMAT(8@8) 
D     WRITE(LUOXXX,9822)ITT,NUQ,NMQ,L1,L2 
D9822 FORMAT(" ITT="@7" NUQ="I4," NMQ="I4" LUQ="I5" LMQ="I5)
C#################################################################
      GOTO 2600 
C 
C-----STATE IS NOT 0   --->  EXECUTABLE STATE 
C 
 3050 IF(WAITC) GOTO 7000 
C-----RE-INIT VARIABLES 
      IF( SQUAL .EQ. 1 )   FAF=0
      IF( INDEX .EQ. 2 )   BUFULL=0 
      IF( .NOT. ISBIT(STATE,14) )  GOTO 3120
C 
C=====EXECUTE 'FAF' STATE (FIND IN AN IMAGE/1000 CHAIN) 
C 
C#####################################################################
D     WRITE(LUOXXX,9830)INDEX,BKSIP,BKSFL,FAF 
D    .,ENDCHN,(XRTB(3,I),I=1,20),FAFRTB,(STATE(I),I=1,STATLN) 
D9830 FORMAT(" /TMP: FAF STATE, INDEX="I4",  BKSIP="@7",   BKSFL="@7, 
D    .",   FAF="I3,/
D    ." /TMP: FAF STATE, ENDCHN="I6",  XRTB :"2(/9X,10I7),/ 
D    ." /TMP: FAF STATE, FAF RTB :   "6I7,/ 
D    ." /TMP: FAF STATE VECT.:"5(8@7,/,23X))
C#####################################################################
C-----CHECK FOR BACKSPACE IN PROCESS OVER A FAF STATE 
      IF( BKSIP )  GOTO 3060
C-----CHECK FOR THE FIRST TIME TO INITIALIZE THE RUN TABLE
      IF( FAF .NE. 0 )  GOTO 3070 
C-----THIS IS THE 1ST LINE OF M-QUESTION, 
C     RE-INIT FAF VARIABLE TO ACCESS THE DATA-BASE, RE-INIT 'FAFRTB'
C     WITH THE SHORTEST CHAIN INFORMATION.
      FAF=1 
      ENDCHN=32767
      K=32767 
      DO 3055 I=1,20
      IF( XRTB(3,I) .GE. K )  GOTO 3055 
      K=XRTB(3,I) 
      J=I 
 3055 CONTINUE
      IF(K .EQ. 32767) CALL TMPER(IERTN,49,FORMN,LU,119,0)
      CALL MOVEW(XRTB(1,J),FAFRTB,6)
      GOTO 3074 
C-----BACKSPACE IS IN PROCESS OVER THE FAF, SET FAF BACKSPACE FLAG
 3060 FAF=2 
C-----BACKSPACE TO PREVIOUS QUESTION, ALWAYS SUCCEED !
 3065 IF( DOBKS(SQUAL,JNDEX,INDEX,NUQ,NMQ) )  STOP 31 
      GOTO 2320 
C-----THIS IS NOT THE 1ST LINE OF M-QUESTION, 
C     IF 'TOTAL' IN PROGRESS SKIP FORWARD,
C     IF NO 'TOTAL', CHECK IF GOING FORWARD FROM A BACKSPACE OR NOT 
 3070 IF( ISBIT(STATE(2),13) )  GOTO 2600 
      IF( FAF .NE. 2 )  GOTO 3074 
C-----THIS IS FORWAR FROM A BACKSPACE, CHECK FOR END OF CHAIN CONDITION 
      IF(INDEX .LE. ENDCHN)  GOTO 2600
      GOTO 3078 
C-----RESTORE THE RUN TABLE WITH THE FAF RUN TABLE
 3074 CALL MOVEW(FAFRTB,ISAVRT,6) 
C-----CHECK RUN TABLE FOR END OF CHAIN CONDITION
 3076 IF(ISAVRT(5) .NE. 0)  GOTO 3080 
      IF(INDEX .EQ. 1)  GOTO 3079 
      ENDCHN=INDEX-1
 3078 WAITC=.TRUE.
      GOTO 3065 
C-----ERROR IF END OF CHAIN & INDEX=1  ---> RESTART SAME FORM 
 3079 ERRFL=1 
      GOTO 4560 
C-----ACCESS THE DATA BASE NOW, PERFORM THE CHAINED DBGET 
 3080 LOCKW=0 
      IF( ISBIT(STATE(2),15) )  LOCKW=100001B 
      CALL TBGET(IDBNUM,ISAVRT,1,IMGSTA,TEMPB,0,LOCKW)
      IF(IMGSTA.NE.400 .AND. IMGSTA.NE.401)  GOTO 3111
C-----IMAGE ERROR, RECORD IS LOCKED OR DEADLOCK SITUATION 
C     SET UP "E 50" AND BACKSPACE TO PREVIOUS QUESTION
      ERRFL=50
      GOTO 3065 
 3111 IF(IMGSTA .NE. 0)  CALL TMPER(IERTN,49,FORMN,LU,118,IMGSTA) 
C-----CHECK MATCH ITEM
      J=IGETB(STATE,4)
      IF(J .EQ. 0) GOTO 3118
      DO 3115 I=1,J 
      K=2*I+1 
      IF(.NOT.  CMPW(TEMPB(IGETB(STATE(K),1)),OBUF(STATE(K+1))
     .  ,IGETB(STATE(K),2)))  GOTO 3076 
 3115 CONTINUE
C-----GOOD ENTRY HAS BEEN GET, CHECK FOR TOTAL IN PROCESS ? 
 3118 IF( .NOT. ISBIT(STATE(2),13) )  GOTO 3119 
C-----DO THE SUM AND LOOP UNTIL END OF CHAIN
      K=2*J+3 
      IE=STATE(K) 
      K=K+1 
      DO 3810 I=1,IE
      JTMLN=ITML(K) 
      JTMTP=ITMT(K) 
      JOBUP=IPT(1,K)
C#####################################################################
D     WRITE(LUOXXX,9832)ENDCHN,K,I,IE,JTMTP,JTMLN,JOBUP 
D9832 FORMAT(" /TMP: FAF STATE SUM, ENDCHN="I6" K="I2" I="I2" IE="I2
D    .," ITM CHARAC="3I4) 
C#####################################################################
C 
C-----IF FIRST TIME THROUGH, RESET ACCUMULATOR
      IF(ENDCHN .NE. 32767)  GOTO 3805
      CALL CALCV(0,JTMTP,OBUF(JOBUP),0) 
 3805 CALL CALCV(1,JTMTP,OBUF(JOBUP),TEMPB(STATE(K+2))) 
D     CALL PRT(LUOXXX,LU,JTMTP,TEMPB(STATE(K+2)),0) 
      K=K+3 
 3810 CONTINUE
C-----RESET 1ST TIME THROUGH FLAG AND LOOP UNTIL END OF CHAIN 
      ENDCHN=32766
      IF(ISAVRT(5) .NE. 0)  GOTO 3080 
      GOTO 2600 
C-----FAF WITHOUT TOTAL, SAVE RUN TABLE, SAVE IMAGE BUFFER AND PROCEED
 3119 CALL MOVEW(ISAVRT,FAFRTB,6) 
      CALL MOVEW(ISAVRT,OBUF(IMPT(INDEX)),6)
      IF( ISBIT(STATE(2),14) )  CALL MOVEW(TEMPB,IMGBUF,250)
      IF(ISAVRT(5) .EQ. 0)  ENDCHN=INDEX
      GOTO 2600 
C 
C=====STANDARD  STATE PROCESSING  (U & M  QUESTIONS)
C 
 3120 ITEMTP=ITMT(2)
      DITMTP=-1 
      ITEMLN=ITML(2)
      DITMLN=0
      OBUFPT=IPT(INDEX,2) 
      DOBUPT=OBUFPT 
      STATPT=7
      OUTDEV=0
      OUTLEN=0
      INLNGT=0
C-----IF TITLE, ADJUST  STATPT
      IF( ISBIT(STATE(2),15) )  STATPT=STATPT+STATE(STATPT) 
      EDITPT=STATPT 
C-----SET LIGTH FOR CURRENT STATE 
      LITE1=LIGHN(3)
      LITE2=0 
C-----IF DISPLAY SET UP  EDIT POINTER 
      IF( .NOT. ISBIT(STATE,15) )  GOTO 3122
      EDITPT=EDITPT+7 
      IF( .NOT. ISBIT(STATE(STATPT+1),15) )  GOTO 3122
      L=STATE(STATPT+7)-1 
      CALL MOVEW(STATE(STATPT+8),OUTBUF,L)
      OUTLEN=1+2*L
      CALL PUTCA(OUTBUF,6400B,OUTLEN) 
      EDITPT=EDITPT+L+1 
C-----SET UP THE IMAGE EDIT POINTER 
 3122 TEMPL=VALCK(.TRUE.) 
      IMAGPT=K+EDITPT-1 
C-----CHECK FOR FORWARD ADVANCE, ASSUME NO ERROR & NO BKSIP 
      IF( FORWIP )  GOTO 3127 
C-----IF THERE IS AN ERROR, FORGET BACKSPACE IN PROCESS AND DISPLAY 
      IF(ERRFL .EQ. 0)  GOTO 3125 
      BKSIP=.FALSE. 
      GOTO 3200 
C-----CHECK FOR DISPLAY 
 3125 IF( (.NOT. ISBIT(STATE,15) ) .AND. BKSIP)  GOTO 3160
 3127 IF( .NOT. ISBIT(STATE,15) )  GOTO 3175
      DOBUPT=IPT(INDEX,STATPT+1)
      DITMTP=ITMT(STATPT+1) 
      DITMLN=ITML(STATPT+1) 
C-----IF RECALL IN PROGRESS, FORGET DISPLAY AND SHOW THE PREVIOUS ANSWER
      IF (BKSIP)  GOTO 3160 
      CALL PUTCA(LITE1,LIGHN(STATPT+2),2) 
C#####################################################################
D     WRITE(LUOXXX,9838)LU,JNDEX,INDEX,DITMTP,DITMLN,DOBUPT 
D    .,(STATE(I),I=STATPT,EDITPT-1) 
D9838 FORMAT(" /TMP: DISPLAY STATE FOR LU#"I2",  J="I2", I="I3, 
D    .", ITM CHARAC"3I4,/13X"VECTOR:"7@8,/20X,I8,10A2)
C#####################################################################
      IF( ISBIT(STATE(STATPT),15) )  GOTO 3130
      J=STATE(STATPT+3) 
      IF( .NOT. ISBIT(STATE(STATPT),12) )  GOTO 3129
C-----TOTAL HAS BEEN PROCESSED, CONTINUE TO PROCESS IT
      I=0 
      IF(INDEX .EQ. 1)  GOTO 3128 
      K=IPT(INDEX-1,STATPT+1) 
      CALL MVITM(OBUF(K),OBUF,DITMTP) 
      I=IPT(INDEX-1,STATPT+2) 
C-----IF NO QUESTION ON THE DISPLAY ITEM, FORGET ABOUT TOTAL
 3128 IF(J .EQ. 0)  GOTO 3145 
C-----QUESTION ON THE TOTAL DISPLAY ITEM EXIST, CONTINUE ACCUMULATION 
      K=IPT(INDEX,STATPT+2) 
      IF(K .LT. DOBUPT) I=K 
      IF( BUFULL .EQ. 0 )  GOTO 3135
      CALL MVITM(OBUF(IPT(BUFULL,STATPT+1)),OBUF,DITMTP)
      I=IPT(BUFULL,STATPT+2)
C-----IF QUESTION IS BEFORE DISPLAY DO TOTAL, ELSE SKIP THE 1ST TIME
 3135 IF(I .EQ. 0)  GOTO 3145 
C-----CONTINUE THE TOTAL OPERATION
      CALL CALCV(1,DITMTP,OBUF(DOBUPT),OBUF(I)) 
D     CALL PRT(LUOXXX,LU,DITMTP,OBUF(I),0)
      GOTO 3145 
 3129 IF( .NOT. ISBIT(STATE(STATPT),13) )  GOTO 3145
C-----THE DISPLAY IS FROM THE IMAGE DATA-BASE, MOVE VALUE ONLY
C     IF NO BACKSPACE HAS BEEN DONE OVER THE FAF
      IF(FAF .NE. 2)  CALL MVITM(IMGBUF(J),OBUF,DITMTP) 
      GOTO 3145 
C-----THE DISPLAY IS FROM A USER SUBROUTINE, INVOKE THE SUBROUTINE
 3130 INPSTA=STATPT+3 
      CALL SUBUF(FORMN,DITMTP,BKSFL,INDEX,INPSTA,IUSER) 
      CALL TMSUB(STATE(INPSTA)) 
      IF(IST .NE. 0)  CALL TMPER(IERTN,1,FORMN,LU,STATE(INPSTA),IST)
C-----FORMAT DISPLAY INFORMATION
 3145 CALL CNVTO(DITMTP,OBUF(DOBUPT),INPBUF,INLNGT) 
      IF(INLNGT .GT. 20) INLNGT=20
      IF( ISBIT(STATE(STATPT+1),14) )  GOTO 3168
      GOTO 3175 
C-----RECALL IS IN PROCESS, DISPLAY 'VALUE' INSTEAD OF 'DISPLAY'
C     IF ITEM TYPE=3 & A DISPLAY EXIST --> USE DISPLAY DURING BKS 
 3160 IF(ITEMTP.EQ.3 .AND. DITMLN.NE.0)  GOTO 3145
      CALL CNVTO(ITEMTP,OBUF(OBUFPT),INPBUF,INLNGT) 
                                                                                                      