FTN4
      SUBROUTINE ZTMP, 92080-16510 REV.2026  800606 
C 
C 
C     NAME:   ZTMP
C     SOURCE: &ZTMP'    92080-18510 
C     BINARY: %ZTMP'    92080-16510    PART OF  %ZTMP  92080-16510
C 
C     PMGR:   FRANCOIS GAULLIER 
C 
C 
C     **************************************************************
C     * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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(10),TEMPB(512),CRBUF,PRTBUF(13),LFLF(5) 
     .,LOGHD(8),LOGACK(4),JTMLN,JTMTP,JOBUP,EQUIVX(3) 
     .,BUFULL,OUTBUF,OUTDEV,ERRBF(3),ZERO(2),COLCNT,TRMHR,TRMMN 
     .,TEMPTS,MAXDP(2),KMAX(2)
D    .,ITEMPX(25) 
C 
C***   DEFINE LOGICAL FLAGS 
C 
      LOGICAL BEGNFL,BKSFL,BKSIP,WAITC,CALCFL,CALCIP,DEFKB
     .       ,FORWIP,TEMPL,M14,DDSPV,HP3077,IFCRT 
     .       ,QXY 
D    .       ,QZZ 
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,MTCHT
C 
C 
C***   TRUE COMMON
C 
      COMMON ICOM00(5)
C 
C***   1ST COMMON BLOCK 
C 
      COMMON LU,ICTLB,ITYP,IST,ITL,IMAGEX(11),ISAVRT(7) 
     .      ,IOMODL(3),ERRFL,EDITPT,IFC,IOMTMP(2),ITSN,ITSSTP,ITIM0(6)
     .      ,LITE1,LITE2,LITE3,OUTDEV,INPDEV,ITSNAM(5),OUTLEN 
     .      ,OUTBUF(40),HP3077,WAITC,TRMHR,TRMMN,TEMPTS,IPAD(51)
C 
C     IMGSAV IS EQUIVALENCED TO THE LAST 3 WORDS OF IMAGEX AND ISAVRT.
C            IMGSAV(1)   - CURRENT DATA SET NO. 
C            IMGSAV(2-3) - CURRENT DATA RECORD NO. (DOUBLE WORD)
C            IMGSAV(4-10)- IMAGE RUN TABLE
      DIMENSION IMGSAV(10)
      EQUIVALENCE(IMGSAV(1),IMAGEX(9))
C 
C***   2ND COMMON BLOCK 
C 
      COMMON NUQ,NMQ,STATPT,INDEX,OBULN,L1,L2,OBUF(512) 
C 
C***   3RD COMMON BLOCK 
C 
      COMMON FORMN,SQUAL,JNDEX,FMGST,STATLN,STATE(90) 
C 
      COMMON INPLEN,INPBUF(100) 
C 
      COMMON ITEMTP,ITEMLN,OBUFPT,DITMTP,DITMLN,DOBUPT
     .      ,CRBUF(80),FLDCNT,STCNT,DEFKB,COLCNT
     .      ,IERTN,ITT0,ITT,KEYN,INLNGT,INPSTA,INPITL 
     .      ,IMAGPT,BKSFL,BKIN,BKJN,BKSIP,BKSQ,FORWIP,FORWJN
     .      ,BUFULL,ENDCHN,CALCFL,CALCIP,CALCBU(4),FAF,IMGFLG 
     .      ,IDBNUM,LSTCLC,KLUGE
C 
C***   4TH COMMON BLOCK 
C 
      COMMON IUSER(332) 
C 
C***   5TH COMMON BLOCK 
C 
      COMMON FAFRTB(10),XRTB(10,20),IMGBUF(512),I,J,K 
C 
C     FAFRTB(1-7) - HOLDS IMAGE RUN TABLE INFO THAT IS RETURNED WITH
C                   TBGET AND TBFND 
C     FAFRTB(8)   - HOLDS DATA SET NO. ASSOCIATED WITH  RUNTABLE
C 
C     XRTB(1-7,X) - HOLDS IMAGE RUNTABLE SET UP BY IMAGE EDIT OPERATIONS
C     XRTB(8-9,X) - HOLDS CHAIN LENGTH (DOUBLE WORD)
C     XRTB(10)    - HOLDS DATA SET NO. ASSOCIATED WITH RUNTABLE 
C 
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)) 
C     EQUIVALENCE (LUOXXX,ICOM00(1))
C 
      DATA LUOXXX/6/
      DATA OBULNX/512/
      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/3407B,15455B,2Hc0,42177B/,I32768/100000B/ 
C 
C THE FOLLOWING LINE INITIALIZES MAXDP TO THE MAXIMUM POS 32-BIT
C INTEGER VALUE, 2**31 - 1.  THIS METHOD IS USED BECAUSE THE 1805 
C FORTRAN COMPILER (WHAT A PIECE OF SHIT) DOES NOT SUPPORT D.P. 
C INTEGERS. 
C 
      DATA MAXDP/32767,-1/
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,2,1, AND 0 ARE THE POWER FAIL, CRT, PRINTER
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 
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*10*IMGFLG 
      ENDBK(M9)=BKSEN(BKSFL,FAF,SQUAL,INDEX,JNDEX,BKSQ,BKIN,BKJN) 
      KBINP(M10)=(IAND(STATE(4),37B).EQ.0 .OR.
     .            IAND(STATE(4),37B).EQ.31) 
      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-----SAVE INITIAL STATUS FOR LATER CHECKS, NOTE THAT ISTSAV IS 
C-----NOT IN COMMON.  THIS IS BECAUSE ITS VALUE IS NEVER CHANGED. 
      ISTSAV=IST
C 
C       FROM THIS POINT, THIS PROGRAM IS REACTIVATED
C         FOR EACH INTERACTIVE DEVICE. (COMMON BLOCK # 1
C         IS ENABLED) 
C 
C 
C     INITIALIZE TS#-SC BUFFER--STORE ASSIGNED TS# IN ANOTHER PLACE 
C           SO TMS WON'T GET UPSET
C 
      ITSNAM=I32768 
      DO 5 I=1,5
5     ITSNAM(I)=0 
      TEMPTS=ITYP 
C 
C#####################################################################
D     WRITE(LUOXXX,7339)LU,ICOM00 
D7339 FORMAT("  FOR LU="I2,", CB0:"5I7) 
C#####################################################################
C 
C-----SET UP THE RIGHT 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 --- MAKE SURE TERM HAS BEEN INITIALZED BEFORE PROCEEDING FURTHER. 
C 
90    KK=IEQCK(LU)
      IF(KK.EQ.2HAI .OR. KK.EQ.2HBI) GO TO 95 
      ASSIGN 92 TO IERTN
      CALL TMPER(IERTN,31,0,LU,LU,0)
92    CALL TMPZ(32767)
      GO TO 90
C 
C  RESET THE TERMINAL AND GET ITS STATUS
C 
95    HP3077=.FALSE.
      IFC=6 
      CALL TMSUB(IOMODL)
C 
C  AUTO-START OR SELECT?
C 
      IF(TEMPTS.EQ.10000)GO TO 100
C 
C  AUTO-START --- SET UP TS# AND DUMMY OUT SC 
C 
      ITSNAM(4)=TEMPTS
      ITSNAM(5)=I32768
      GO TO 300 
C 
C  GET TS# [-SC]
C 
100   CONTINUE
      HP3077=.FALSE.
      TEMPTS=10000
      OUTDEV=0
      IFC=1 
      OUTLEN=0
      LITE1=0 
105   LITE2=0 
      LITE3=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) 
      IF(TEMPTS.NE.10000)FORMN=TEMPTS 
      SQUAL=10
      JNDEX=LU
      CALL MOVEW(ITSNAM,STATE,5)
      CALL TMSUB(TSMG)
      IF(FMGST .EQ. 0)  GOTO 2000 
C 
C  CHECK FOR FATAL ERRORS 
C 
      IF(TEMPTS.NE.10000.AND.FMGST.NE.0)CALL TMPER(0,51,TEMPTS,LU,LU,0) 
C 
C-----ERROR ! (NON-FATAL) 
      IF(FMGST .EQ. -1)  EDITPT=0 
      IF(FMGST .EQ. -6)  EDITPT=1 
C 
C-----DISABLE 3RD COMMON BLOCK
C 
      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) 
      ITT0=STATE(9) 
      LITE3=IAND(STATE(13),17B) 
      ITT=STATE(10) 
      INPBUF=STATE(11)
C-----CHECK TERMINAL FEATURES 
      ERRFL =30 
      IFC=3 
      CALL TMSUB(IOMODL)
C################################################################## 
D     WRITE(LUOXXX,6789)ISTATS
D6789 FORMAT("/ZTMP:  AT FEATURE CHECK, ISTATS=",I5)
C################################################################## 
      IF(ISTATS.EQ.1.AND.HP3077)CALL TMPER(0,52,FORMN,LU,LU,0)
      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 
C 
C CREATE DATA BASE NAMR FROM DATA BASE NAME, SEC CODE, CR# STORED IN
C STATE(20) - (24)
C 
C     D.B. NAME MUST BE MOVED UP ONE WORD IN STATE FOR INAMR CALL.
C     STATE(19) MAY BE USED AS A SCRATCH WORD.
C 
      CALL MOVEW(STATE(20),STATE(19),3) 
C 
C     AN INAMR TYPE CODE MUST BE STORED IN STATE(22)
C 
      STATE(22)=27B 
      CALL BLANC(OUTBUF,11) 
      NCHRS=0 
C 
C     CREATE D.B. NAMR IN OUTBUF
C 
      CALL INAMR(STATE(19),OUTBUF(2),20,NCHRS)
C 
C OPEN IMAGE DATA BASE
C 
      CALL TBOPN(OUTBUF,0,0,IMGSTA) 
C 
C     SAVE TMS INTERNAL D.B.# RETURNED IN OUTBUF(1).
C     NOTE: THIS IS DIFFERENT FROM THE IMAGE INTERNAL D.B.# RETURNED
C           BY THE REGULAR DBOPN CALL.
C 
      IF(IMGSTA .NE. 0)  CALL TMPER(IERTN,49,FORMN,LU,120,IMGSTA) 
      IDBNUM=OUTBUF 
      KLUGE=0 
C 
C INITIALIZE CHAIN POINTER TO THE MAXIMUM 32-BIT INTEGER VALUE. 
C XRTB(2,) AND XRTB(3,) FORM A 32-BIT INTEGER WD. 
C 
 2020 DO 2025 I=1,20
         XRTB(2,I)=MAXDP(1) 
 2025    XRTB(3,I)=MAXDP(2) 
C 
C     UNLOCK ALL ENTRIES IN THE D.B. (TMS IMAGE CALL) 
C 
CREQ  CALL DMPTM(6,LU,50,14H TBULK AT 2050,14,1)
      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 
2150  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,TEMPB(5)) 
      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 
      IF(KLUGE.NE.0)GO TO 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 
      IX=2185 
C     WRITE(1,31789) IX,OUTLEN
      CALL TMSUB(IOMODL)
C 
C-----SETUP THE RIGHT STATE, (STATE QUAL., JNDEX AND INDEX) 
C 
 2200 JNDEX=1 
      KLUGE=0 
 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
D     WRITE(LUOXXX,9200)INDEX,JNDEX 
D9200 FORMAT("0***INDEX=",I5,"     JNDEX=",I5)
      CALL TMSUB(TSMG)
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 
C     WRITE(1,24009) SQUAL,OUTLEN 
C24009 FORMAT("***** ZTMP AFTER 2400 : SQUAL="I5", OUTLEN="I5)
      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
      IX=3010 
C     WRITE(1,31789) IX,OUTLEN
      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 
      IX=3015 
C     WRITE(1,31789) IX,OUTLEN
C#################################################################
D     WRITE(LUOXXX,9820)LU
D9820 FORMAT(/," FORM LU#"I3,5X,"SFK DEFINITION:")
D     WRITE(LUOXXX,9821)(OBUF(IX),IX=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( NUQ.EQ. 0 .AND. SQUAL.EQ.2)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 :   ",3I7/9X,7I7,/ 
D    ." /TMP: FAF STATE VECT.:"5(8@7,/,23X))
D     WRITE(LUOXXX,9210)JNDEX 
D9210 FORMAT(" ***JNDEX=",I7) 
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
C 
C     INITIALISE KMAX TO MAX 32-BIT INTEGER VALUE 
C 
      KMAX(1)=MAXDP(1)
      KMAX(2)=MAXDP(2)
      DO 3055 I=1,20
C 
C        NOTE: ICMPD RETURNS -1 FOR ARG1=ARG2, 0 FOR ARG1<ARG2, 
C              1 FOR ARG1>ARG2.  ARG1 & ARG2 BEING 32-BIT INTEGERS. 
C 
         IF(ICMPD(XRTB(2,I),KMAX).NE.0)GOTO 3055
            KMAX(1)=XRTB(2,I) 
            KMAX(2)=XRTB(3,I) 
            J=I 
3055  CONTINUE
      IF(ICMPD(KMAX,MAXDP).EQ.-1) CALL TMPER(IERTN,49,FORMN,LU,119,0) 
      CALL MOVEW(XRTB(1,J),FAFRTB,10) 
      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) )
     .              CALL TMPER(IERTN,49,FORMN,LU,121,SQUAL) 
      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,IMGSAV,10)
C-----CHECK RUN TABLE FOR END OF CHAIN CONDITION
C     THIS IS A 32-BIT INTEGER CHECK FOR 0 (KLUDGE).
 3076 CONTINUE
      IF(IOR(ISAVRT(5),ISAVRT(6)) .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(KEYN.EQ.12 .AND. ISBIT(STATE(2),15))LOCKW=100011B
      CALL TBGET(IDBNUM,FAFRTB(1),5,IMGSTA,2H@ ,TEMPB,0,LOCKW)
D     WRITE(LUOXXX,9220)IMGSAV
D9220 FORMAT(" 5**IMGSAV",3O8/10X,7O8)
D     WRITE(LUOXXX,9221)IMGSTA
D9221 FORMAT(1X,10I7) 
      IF(IMGSTA.NE.400 .AND. IMGSTA.NE.401)GO TO 3117 
C-----IMAGE ERROR, REC IS LOCKED OR DEADLOCK SITUATION
C     SET UP "E 50" AND BACKSPACE TO PREV QUES. 
         ERRFL=50 
         GO TO 3065 
3117  IF(IMGSTA .NE. 0)  CALL TMPER(IERTN,49,FORMN,LU,118,IMGSTA) 
C-----CHECK IF NEXT ENTRY (THIS MUST BE DONE BECAUSE SOMEONE
C-----DECIDED TO USE THIS SECTION OF CODE TO EXECUTE FAFS AND NEXT
C-----ENTRIES)
      IF(KEYN.EQ.12)GO TO 3121
C-----CHECK MATCH ITEM
      IF(.NOT.MTCHT(STATE,TEMPB,OBUF))GO TO 3076
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*IGETB(STATE,4)+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,IER) 
 3805    CALL CALCV(1,JTMTP,OBUF(JOBUP),TEMPB(STATE(K+2)),IER)
C        IF(IER.NE.0)GO TO 4731 
         IF(IER.NE.0)ERRFL=13 
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
C 
C     THE FOLLOWING IS A 32-BIT INTEGER CHECK 
C 
      IF(IOR(ISAVRT(5),ISAVRT(6)).NE. 0)  GOTO 3080 
      GOTO 2600 
C-----LOCK CURRENT RECORD IF NECESSARY (USE RE-READ)
3119  IF(.NOT.ISBIT(STATE(2),15))GO TO 3121 
         CALL TBGET(IDBNUM,FAFRTB(1),1,IMGSTA,2H@ ,TEMPB,0,100011B) 
         IF(IMGSTA.EQ.114)GO TO 3076
         IF(IMGSTA.NE.400 .AND. IMGSTA.NE.401)GO TO 3111
C--------IMAGE ERROR, RECORD IS LOCKED OR DEADLOCK SITUATION
C        SET UP "E 50" AND BACKSPACE TO PREV QUESTION 
            ERRFL=50
            GO TO 3065
3111     IF(IMGSTA.NE.0)CALL TMPER(IERTN,49,FORMN,LU,118,IMGSTA)
         IF(.NOT.MTCHT(STATE,TEMPB,OBUF))GO TO 3076 
C-----FAF WITHOUT TOTAL, SAVE RUN TABLE, SAVE IMAGE BUFFER AND PROCEED
3121  CALL MOVEW(IMGSAV,FAFRTB,10)
      CALL MOVEW(IMGSAV,OBUF(IMPT(INDEX)),10) 
      IF(ISBIT(STATE(2),14))CALL MOVEW(TEMPB,IMGBUF,IMGSTA(2))
C 
C     THE FOLLOWING IS A 32-BIT INTEGER CHECK FOR 0 
C 
      IF(IOR(ISAVRT(5),ISAVRT(6)) .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 LIGHT 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
      LO=799
C     WRITE(6,31229) LO,OUTLEN,FORWIP 
C31229 FORMAT(" LO="I3", OUTLEN="I3", FORWIP="@6) 
      CALL PUTCA(OUTBUF,6400B,OUTLEN) 
      EDITPT=EDITPT+L+1 
C-----SET UP THE IMAGE EDIT POINTER 
 3122 TEMPL=VALCK(.TRUE.) 
      IX=3122 
C     WRITE(1,31789) IX,OUTLEN
      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),IER) 
C     IF(IER.NE.0)GO TO 4731
      IF(IER.NE.0)ERRFL=13
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) 
C     WRITE(1,31310) (IUSER(IX),IX=1,10)
C31310 FORMAT("+++++ ZTMP : IUSER(1-10)="10@7)
C     WRITE(1,31309) STATE(INPSTA),STATE(INPSTA+1),STATE(INPSTA+2)
C31309 FORMAT("+++++ ZTMP : USER DISPLAY SUB="3A2)
      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
      GO TO 3168
31451 IF( ISBIT(STATE(STATPT+1),14) )  GOTO 3168
      IF( IFCRT(STATE,OUTDEV,ITT)   )  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 
C3160 WRITE(6,31609) ITEMTP,DITMLN,I,STATE(I) 
C31609 FORMAT(" LABEL 3160: ITEMTP="@6", DITMLN="@6", I="@6 
C    +       ", STATE(I)="@6) 
 3160 IF(ITEMTP.EQ.3 .AND. DITMLN.NE.0)  GOTO 3145
      CALL CNVTO(ITEMTP,OBUF(OBUFPT),INPBUF,INLNGT) 
C     WRITE(6,31610) INLNGT,(INPBUF(IXX),IXX=1,(INLNGT+1)/2)
C31610 FORMAT(" INLNGT="I3", INPBUF="15A2)
      IF(INLNGT .GT. 20)  INLNGT=20 
C 
C --- IF TS SPECIFIES PRT,CRT, OR ADS, MOVE DISPLAY ITEM TO OUTBUF
C 
      GO TO 3168
31611 IF(ISBIT(ITT,7)) GO TO 3168 
      IF(IFCRT(STATE,OUTDEV,ITT)) GO TO 3168
      IF( ONLPR(I) )  GOTO 3175 
C 
C-----ECHO ON THE PRINTER IS REQUESTED, MOVE MESSAGE INTO LPR BUFFER
C 
 3168 CALL MOVCA(INPBUF,1,OUTBUF,OUTLEN+1,INLNGT) 
C     WRITE(6,31689)
C31689 FORMAT(" LABEL : 3168")
      CALL JUSTF(OUTBUF,OUTLEN+1,INLNGT,1)
      OUTLEN=OUTLEN+1+INLNGT
      LO=892
C     WRITE(6,31229) LO,OUTLEN,FORWIP 
      CALL PUTCA(OUTBUF,6400B,OUTLEN) 
 3175 IF( FORWIP )  GOTO 6720 
      IF( .NOT. ISBIT(STATE(2),15) )  GOTO 3178 
      L=2*(STATE(7)-1)
      CALL MOVCA(STATE(8),1,OUTBUF,OUTLEN+1,L)
      OUTLEN=OUTLEN+1+L 
      LO=899
C     WRITE(6,31229) LO,OUTLEN,L
      CALL PUTCA(OUTBUF,6400B,OUTLEN) 
C-----IF PRINTER OUTPUT IS REQUIRED, OUTLEN IS NOT 0
 3178 IF(OUTLEN .EQ. 0)  GOTO 3180
      IX=3178 
C     WRITE(6,31789) IX,OUTLEN,ERRFL,INLNGT 
C31789 FORMAT(" **** ZTMP : X="I5", OUTLEN="I6", ERRFL="I6", INLNGT="I6)
      OUTLEN=OUTLEN-1 
      LO=908
C     WRITE(1,31229) LO,OUTLEN
C 
C --- IF RECALL IN PROGRESS, SHOW PREVIOUS ANSWER TO CRT OR PRT.
C 
      IF(BKSIP) GO TO 3179
C 
C-----IF NO TITLE, ONLY ONE WRITE IS NEEDED 
C 
      IF(OUTLEN .EQ. INLNGT)  GOTO 3200 
 3179 INPLEN=0
C --- PRINT TITLE(LABEL FOR QUES) TO CRT AND/OR PRINTER IF THEY EXIST.
      IF(IFCRT(STATE,OUTDEV,ITT)) CALL TMSUB(IOMODL)
      OUTDEV=2
      IF(ISBIT(STATE(6),1)) CALL TMSUB(IOMODL)
C 
C --- NOW CHECK IF DISPLAY HAS BEEN DONE HERE (TO ADS/CRT/PRT) DON'T
C     DO THEM AGAIN LATER ON (BY SETTING OUTLEN TO 0).
C 
      IF(IFCRT(STATE,OUTDEV,ITT)) GO TO 31791 
      IF(.NOT.ISBIT(STATE(6),1) ) GO TO 3180
31791 OUTDEV=0
      OUTLEN=0
      GO TO 3200
C-----SET OUTLEN AND OUTBUF FOR AN EVENTUAL DISPLAY 
 3180 OUTLEN=INLNGT 
      IX=3180 
C     WRITE(1,31789) IX,OUTLEN,ERRFL
      CALL MOVEW(INPBUF,OUTBUF,(OUTLEN+1)/2)
C-----CHECK FOR ERROR CONDITION AND REPORT ERROR IF ANY 
 3200 LITE2=IAND(LITE2,377B)
      IF( ERRFL .EQ. 0 )  GO TO 3220
C 
C?????????????????? 
C 
C  SAVE OUTPUT BUFFER IN INPUT BUFFER 
C   IN THE EVENT OF A RE-DISPLAY AFTER ERROR
C 
      CALL MOVEW(OUTLEN,INPBUF,41)
C 
C?????????????????? 
C 
C --- IF CRT, ECHO "ERROR" ONTO IT. 
C 
      IF(ISBIT(STATE(6),0)) GO TO 3201
C 
C-----ECHO "ERROR" ON THE PRINTER IF ONLINE PRINT-OUT IS SELECTED 
C 
      IF( ONLPR(I) )  GOTO 3202 
C 
 3201 CALL MOVEW(OBUF(OBULN+1),OUTBUF,6)
      CALL JUSTF(OUTBUF,1,12,1) 
      OUTLEN=12 
      OUTDEV=2
      INPLEN=0
C 
C --- ECHO "ERROR" ONTO CRT AND/OR PRINTER. 
C 
      IF(IFCRT(STATE,OUTDEV,ITT)) CALL TMSUB(IOMODL)
      OUTDEV=2
      IF(ISBIT(STATE(6),1)) CALL TMSUB(IOMODL)
      OUTDEV=0
C 
C-----SETUP ERROR MESSAGE FOR THE DISPLAY 
C 
 3202 CALL PUTCA(LITE2,LITERR,1)
C 
      ERRBF(2)=IASC(ERRFL)
C***  CALL DMPTM(6,ERRBF,3,ERRBF,6,1) 
      CALL MOVEW(ERRBF,OUTBUF,3)
C-----SETUP THE ERROR MESSAGE LENGTH FOR THE DISPLAY
      IF ( ERRFL .EQ. 1 )  OUTLEN=0 
      IF ( ERRFL .NE. 11)  GOTO 3205
      CALL BLANC(OUTBUF(4),6) 
      OUTBUF(5)=IASC(FLDCNT)
      OUTBUF(7)=IASC(COLCNT)
      OUTLEN=18 
      GOTO 3218 
 3205 IF ( ERRFL .EQ. 50)  GOTO 4210
      IF(ERRFL.EQ.13)OUTLEN=6 
 3218 ERRFL=0 
C 
C???????????????????
C 
C  RESTORE THE OUTPUT BUFFER
C 
      CALL MOVEW(INPBUF,OUTLEN,41)
C 
C???????????????????
C 
C-----SWITCH ON/OFF THE TC LIGHT FOR THE 1ST M-QUESTION 
 3220 I=2 
      IF(FAF .EQ. 0)  I=1 
      IF(SQUAL.EQ.2 .AND. INDEX.NE.1 .AND. JNDEX.EQ.I)
     *              CALL PUTCA(LITE2,LITTCP,2)
      IF(SQUAL.EQ.2.AND.INDEX.NE.1.AND.JNDEX.EQ.1)
     *     CALL PUTCA(LITE2,LITTCP,2) 
C 
C-----SWITCH THE LIGHT AND REQUEST INPUT
C 
 3230 INPDEV=STATE(4) 
      CALL SETBT(OUTDEV,0,1)
C 
C --- IF WAITING FOR TC, FORGET CARD READER OR INPUT SUBROUTINE.
C 
      IF(WAITC) GO TO 3265
C 
C --- IS INPUT FROM USER WRITTEN INPUT MODULE?
C 
C     WRITE(1,32301) STATE(4) 
C32301 FORMAT("STATE(4)="@6)
      IF(IAND(STATE(4),37B).NE.31) GO TO 3240 
C 
C --- YES. CALCULATE WHERE THE NAME OF THE SUBROUTINE IS (IMMEDIATELY 
C     AFTER THE DEFAULT VALUE). NAMPTR WILL BE SET TO POINT TO THE
C     NAME OF THE INPUT MODULE. 
C 
C     ITML2=ITML(2) 
C     WRITE(1,32306) NAMPTR,EDITPT,STATE(EDITPT),ITML2
C32306 FORMAT("NAMPTR="I5", EDITPT="I5", STATE(EDITPT)="I5
C    +       ", ITML(2)="I5)
      NAMPTR=EDITPT+IAND(STATE(EDITPT),377B)
C 
C --- IF DEFAULT VALUE EXISTS (DVF BIT), INCREMENT NAMPTR PAST IT.
C 
      IF(ISBIT(STATE(1),13)) GO TO 3231 
        ITML2=(ITML(2)+1)/2 
        IF(ITML2.GT.10) ITML2=10
        NAMPTR=NAMPTR+ITML2 
C 
C --- SET UP THE USER COMMON BLOCK & CALL THE INPUT MODULE. 
C 
 3231 CALL SUBUF(FORMN,ITEMTP,BKSFL,INDEX,STATPT,IUSER) 
C     WRITE(1,32302) STATE(NAMPTR),STATE(NAMPTR+1),STATE(NAMPTR+2)
C32302 FORMAT("STATE(NAMPTR)="3A2)
      CALL TMSUB(STATE(NAMPTR)) 
C     WRITE(1,32303) IST
C32303 FORMAT("IST="@6) 
      IF(IST.NE.0) CALL TMPER(IERTN,1,FORMN,LU,STATE(NAMPTR),IST) 
C 
C --- CK THAT USER TLOG MATCHES THE SPECIFIED ITEM LENGTH(ERR IF NOT).
C 
      IF(IUSER(12).GT.0) IUSER(12)=IUSER(12)+IUSER(12)
      IF(IUSER(12).LT.0) IUSER(12)=-IUSER(12) 
C --- STRING INPUT? 
      IF(ITEMTP.NE.0) GO TO 3232
         IBYTES = ITML(2) 
         IF(IUSER(12).GT.IBYTES) GO TO 3238 
         GO TO 3239 
C --- INTEGER INPUT?
3232  IF(ITEMTP.NE.1) GO TO 3233
         IBYTES=6 
         IF(IUSER(12).GT.6) GO TO 3238
         GO TO 3239 
C --- DEFAULT TO REAL INPUT.
3233  IBYTES=14 
      IF(IUSER(12).LE.14) GO TO 3239
C 
C --- REPORT ERROR -- INCORRECT INPUT LENGTH. 
C 
3238  CALL TMPER(IERTN,46,FORMN,LU,IBYTES,IUSER(12))
C3238  WRITE(1,32304) IBYTES,IUSER(12)
C32304 FORMAT("IBYTES="I3", IUSER(12)="I3)
C     CALL TMPER(IERTN,2,FORMN,LU,IBYTES,IUSER(12)) 
C 
C --- SET INPUT TO ENTER KEY & MOVE DATA FROM USER BUFFER TO INPUT BUFFER.
C 
3239  ISTATS=0
      ITRNLG=IUSER(12)
      CALL MOVCA(IUSER,25,INPBUF,1,IUSER(12)) 
C     WRITE(1,32305) ITRNLG,(IUSER(IXX),IXX=13,25)
C32305 FORMAT("ITRNLG="I3", IUSER(13-25)="13@7) 
C 
C --- JMP AHEAD IF KEYBOARD INPUT.
C 
 3240 IF( KBINP(I) )  GOTO 3270 
C 
C-----CARD READER INPUT, FIRST FIELD ?
C 
      IF( ISBIT(STATE(4),11) )  GOTO 3255 
C-----N TH FIELD ON A CARD, NOT 1ST  GET FROM CARD BUF. 
      IF ( DEFKB )  GOTO 3260 
C-----IF NOT DEFAULTED TO THE KEYBOARD, GET FROM BUFFER 
      IF ( .NOT. BKSIP )  GOTO 3280 
      FLDCNT=FLDCNT-1 
      GOTO 3270 
C-----IT IS 1ST FIELD OF A CARD, MUST CONFIGURE CARD-READER AND 
C     READ THE CARD 
3255  DEFKB=.FALSE. 
      FLDCNT=0
      STCNT=0 
      GOTO 3270 
C-----CARD INPUT DEFAULTED TO KEYBOARD, DISPLAY "-------------" 
 3260 IF (BKSIP)  GOTO 3270 
      CALL MOVEW(16H----------------,OUTBUF,8)
      OUTLEN=16 
 3265 INPDEV=0
 3270 BKSIP=.FALSE. 
      INPLEN=1
C***  CALL DMPTM(6,INPLEN,1,OUTBUF,20,0)
C#####################################################################
D     KN=IAND(INPDEV,37B) 
D     KL=2H.. 
D     IF(KN.EQ.0) KL=2HKB 
D     IF(KN.EQ.1) KL=2HB3 
D     IF(KN.EQ.2) KL=2HB5 
D     WRITE(LUOXXX,9840)LU,SQUAL,JNDEX,INDEX,WAITC,OUTLEN,INPLEN
D    .,LITE1,LITE2,KL 
D9840 FORMAT("'Z' LU#"I3"  I/O FOR STATE: SQ="I2", J="I2", I="I3, 
D    .,",   WAITC ="@7,/,6X"LEN(OUT="I2", INP="I4")"
D    .,2X"LITE1=",@6,", LITE2=",@6,3X"INP DEV="A2)
D     IF(OUTLEN.NE.0) WRITE(LUOXXX,9841)(OUTBUF(IX),IX=1,(OUTLEN+1)/2)
D9841 FORMAT(8@8) 
C#####################################################################
C 
C --- IF WAITING FOR TC & THIS TS IS A SELF-COMPLETING TS, DON'T GO TO
C     THE TERM. FOR TC BUT AUTOMATICALLY GENERATE IT. 
C 
      IF(WAITC .AND. ISBIT(ITT0,15)) GO TO 3272 
C 
C --- IF WAITING FOR TC, GO TO TERM FOR TC. 
C 
      IF(WAITC) GO TO 3271
C 
C --- IF INPUT WAS FROM USER INPUT SUBROUTINE, SKIP INPUT FROM TERMINAL.
C 
      IF(IAND(STATE(4),37B).EQ.31) GO TO 3275 
C 
C --- GET INPUT FROM TERMINAL.
C 
3271  CALL TMSUB(IOMODL)
      GO TO 3275
C 
C --- SINCE THIS IS A SELF-COMPLETING TS, GET THE TC OR CS KEY NUMBER 
C     FROM THE SFK STATE. 
C 
3272  DO 3273 N=1,10
         KEYBPT=OBULN+IGETB(OBUF(OBULN+10),N)-2 
         IF(.NOT.ISBIT(OBUF(KEYBPT),15)) GO TO 3273 
         IFCN=IAND(OBUF(KEYBPT),37400B)/256 
         IF(IFCN.EQ.1 .OR. IFCN.EQ.14) GO TO 3274 
3273  CONTINUE
C 
C --- FATAL ERROR IF TC OR CS NOT FOUND IN KEYS 1-10. 
C 
      STOP 3273 
C 
3274  ISTATS=N
      ITRNLG=0
      GO TO 3275
C 
3275  INPSTA=ISTATS 
      INPITL=ITRNLG 
C     WRITE(1,98419) INPSTA,INPITL
C98419 FORMAT("'Z' 3275 :INPSTA="@6," INPITL="@6) 
C#####################################################################
D     KN=IAND(INPDEV,37B) 
D     KL=2H.. 
D     IF(KN.EQ.0) KL=2HKB 
D     IF(KN.EQ.1) KL=2HB3 
D     IF(KN.EQ.2) KL=2HB5 
D     K2=(INPITL+1)/2 
D     IF(INPITL.GE.94) K2=48
D     WRITE(LUOXXX,9845)LU,KL,INPSTA,INPITL 
D9845 FORMAT(" FROM LU#"I3"  COMPLETION OF INP DEV="A2", STATUS ="@7, 
D    .", ITL ="I4)
D     IF(INPITL.NE.0) WRITE(LUOXXX,9846)(INPBUF(IX),IX=1,K2)
D9846 FORMAT(8@8) 
C#####################################################################
C 
C-----CHECK IF SRQ/ATTN KEY IS USED DURING INPUT
C 
3277  IF(INPSTA .EQ. 128)  GOTO 4100
C-----IF WAITING FOR 'COMPLETE TRANSACTION', FORGET CARD READER 
      IF( WAITC )  GOTO 3300
C-----CARD READER INPUT ? 
      IF( KBINP(I) )  GOTO 3300 
C-----PHYSICAL READ FROM CARD READER ?
      IF( DEFKB )  GOTO 3290
      CALL BLAN(INPBUF,INPITL+1,81-INPITL)
C#####################################################################
D     WRITE(LUOXXX,9848) INPITL,(INPBUF(KX),KX=1,43)
D9848 FORMAT("   CR BUFFER: INPITL=",I3,6(/8@8))
C#####################################################################
      CALL MOVEW(INPBUF,CRBUF,80) 
C-----MOVE THE FIELD FROM THE CARD READER BUFFER INTO THE INPUT BUFFER
 3280 INPSTA=0
      INPITL=IRS8(STATE(5)) 
      CALL MOVCA(CRBUF,IAND(STATE(5),377B),INPBUF,1,INPITL) 
C-----UPDATE CARD-BUFFER FIELD COUNTER
 3290 FLDCNT=FLDCNT+1 
C#####################################################################
D     KM=(INPITL+1)/2 
D     KL=IAND(STATE(5),377B)
D     WRITE(LUOXXX,9852)FLDCNT,KL,INPITL,INPSTA,ITEMTP,ITEMLN 
D    .,(INPBUF(K),K=1,KM) 
D9852 FORMAT(" FLD"I3" ON CARD, START COL="I3", ITL="I3", IST="@7,
D    .", ITEM: [TYPE="I1" LEN="I3"]",8(/8X,8@8))
C#####################################################################
C 
C-----ANALYSE ANSWER; PARSE INPUT BUFFER
C 
 3300 KEYN=INPSTA 
      IF(KEYN .EQ. 0)  GO TO 3600 
C-----CHECK KEY LEGALITY
      I=OBULN+7 
      IF(KEYN .GT. IAND(OBUF(I),77B))  GOTO 3515
C-----PREFIX KEY USED ? 
      IF(INPITL .EQ. 0)  GOTO 3510
      IF( IGETB(INPBUF,INPITL)-140B  .NE. 
     .        IAND(IALF2(OBUF(I)),370B)/10B)   GOTO 3510
      IF(KEYN .GT. 10)  GOTO 3517 
      INPITL=INPITL-1 
      KEYN=KEYN+IAND(OBUF(I),77B) 
 3510 KEYBPT=OBULN+IGETB(OBUF(OBULN+10),KEYN)-2 
      IF(KEYBPT .NE. OBULN-2)  GOTO 3520
 3515 INPITL=INPITL+1 
 3517 CALL PUTCA(INPBUF,1H ,INPITL) 
      GOTO 3550 
 3520 KEYN=OBUF(KEYBPT) 
C#####################################################################
D     KK=2HVL 
D     KN=2H 
D     IF(.NOT. ISBIT(KEYN,15)) GOTO 9566
D     KK=2HFC 
D     KN=IASC(IAND(IRS8(KEYN),77B)) 
D     KL=IAND(OBUF(KEYBPT),377B)
D     KL=(KL+1)/2 
D     CALL MOVEW(OBUF(KEYBPT+1),ITEMPX,KL)
D     GOTO 9564 
D9566 KL=IRS8(OBUF(KEYBPT)) 
D     CALL MOVCA(OBUF(KEYBPT),2,ITEMPX,1,KL)
D     KL=(KL+1)/2 
D9564 WRITE(LUOXXX,9567)KEYBPT,KEYN,KK,KN,(ITEMPX(IX),IX=1,KL)
D9567 FORMAT("  KEY ADDR:",I4",   KEY ASSIGNEMENT IS:"@8,"  IT IS A ",A2, 
D    .,X,A2,/,"  KEY LABEL OR VALUE: ",30A2)
C#####################################################################
C------FUNCTION OR VALUE ?
      IF( ISBIT(KEYN,15) )  GOTO 3600 
C-----IT IS A VALUE, STORE THE VALUE IN THE BUFFER
      IF( USFKV(OBUF(KEYBPT),INPBUF,INPITL) ) 
     .            CALL TMPER(IERTN,49,FORMN,LU,124,1) 
 3550 KEYN=0
C-----PARSE INPUT BUFFER FOR SFK AND/OR PROVIDE DEFAULT VALUE 
 3600 INLNGT=INPITL 
      K=INPITL
      IF(ISBTW(IAND(IRS8(KEYN),77B),5,9))GO TO 3601 
      CALL MOVEW(ZERO,OUTBUF,2) 
      IF(CALCFL)GO TO 3602
      DDSPV=DITMTP.EQ.ITEMTP
      IF(ITEMTP.EQ.1.OR.ITEMTP.EQ.2)GO TO 3605
      CALL BLANC(OUTBUF,10) 
      DDSPV=.FALSE. 
      GO TO 3605
3601  IF(.NOT.(CALCFL.AND.KEYN.EQ.0))GO TO 3610 
3602  DDSPV=.FALSE. 
      CALL MOVEW(CALCBU,OUTBUF,2) 
3605  CALL FMTXX(ITEMTP,.TRUE.,DDSPV ,OBUF(DOBUPT), 
     *          OUTBUF,INPBUF,INLNGT,TEMPB,OBUF(OBULN), 
     *          FORMN,LU,IERTN) 
      K=INLNGT
      GO TO 3611
3610  CALL FMTXX(ITEMTP,KBINP(I),ISBIT(STATE,13),OBUF(DOBUPT),
     .       STATE(EDITPT+IAND(STATE(EDITPT),377B)),INPBUF,INLNGT,
     .       TEMPB,OBUF(OBULN),FORMN,LU,IERTN)
3611  CONTINUE
C###################################################################### 
D     WRITE(LUOXXX,9568)ITEMTP,INLNGT,(TEMPB(IX),IX=1,(INLNGT+1)/2) 
D9568 FORMAT(" /TMP, AFTER FMTXX, ITEMTP = "I6," INPLEN=",I6, 
D    *       10(/,1X,35A2)) 
C#####################################################################
C-----ECHO THE INPUT ON THE PRINTER IF REQUESTED
C     WRITE(1,95689) STATE(2) 
C95689 FORMAT("ZTMP : 1085 STATE(2)="@6)
      IF( ONLPR(I) ) GOTO 3700
      I=1 
      CALL BLANC(OUTBUF,22) 
C-----IF A STRING HAS BEEN ENTERED BEFORE THE SFK, ECHO IT ALSO 
      IF(K.EQ.0 .AND. KEYN.NE.0)  GOTO 3650 
      J=INLNGT
      IF(J.GT.20)J=20 
      CALL MOVCA(TEMPB,1,OUTBUF,1,J)
      CALL JUSTF(OUTBUF,1,20,0) 
      IF(KEYN .EQ. 0)  GOTO 3640
      OUTBUF(11)=6400B
      I=22
 3650 CALL MOVCA(OBUF(KEYBPT+1),1,OUTBUF,I,IAND(OBUF(KEYBPT),377B)) 
      CALL JUSTF(OUTBUF,I,20,0) 
 3640 OUTLEN=20+I 
      INPLEN=0
      CALL MOVEW(TEMPB,INPBUF,100)
C --- ECHO TO PRINTER.
C     WRITE(1,36409)
C36409 FORMAT("ZTMP : 'ECHO TO PRINTER'") 
      OUTDEV=2
      CALL TMSUB(IOMODL)
      CALL MOVEW(INPBUF,TEMPB,100)
C 
C --- ENTER KEY?
C 
3700  IF(KEYN .EQ. 0)  GOTO 4000
C 
C-----IT IS A FUNCTION, EXECUTE THE FUNCTION EDIT 
      KEYN=IAND(IRS8(KEYN),177B)
C 
C#################################################################
D     WRITE(LUOXXX,9678)KEYN,EDITPT,STATE(EDITPT),STATE(EDITPT) 
D9678 FORMAT(" /TMP: AT FUNCTION EDIT:",/,
D    ."     KEYN( FOR FEDIT )=",I5," EDITPT=",I5," STATE(EDITPT)=", 
D    .@8," = ",I6,/)
C################################################################## 
      IF( FEDIT(KEYN,STATE(EDITPT)) )  GOTO 9000
      KEYN=IAND(KEYN,77B) 
C-----DISPATCH ON FUNCTION NUMBER 
C###############################################################
D     WRITE(LUOXXX,9234)KEYN
D9234 FORMAT(//,"AT FUNCTION DISPATCH, KEYN=",I5) 
C###############################################################
      GOTO (4500,4300,4400,4200,4700,4700,4700,4700,4700,9000,
     .5000,5100,5200,4500,9000),KEYN
C 
C-----FUNCTION'S PROCESSOR
C 
C-----ENTER KEY                                *****  FNB #  0  ********
 4000 IF(WAITC)  GOTO 9000
      IF(CALCFL)GO TO 4060
      IF(INPITL .NE. 0)  GOTO 6000
C-----ENTER KEY ONLY: DEFAULT VALUE OR SAME VALUE IF RECALL 
      IF(ENDBK(I))  GOTO 4450 
      GOTO 6100 
C-----ENTER KEY IN CALCULATOR MODE
 4060 IF(CALCIP)  GOTO 9000 
      CALCFL=.FALSE.
      GOTO 6000 
C-----SRQ  RESET THE TERMINAL                  *****  FNB # 128 ********
C     AND RESTART AT THE SAME POINT.
 4100 OUTDEV=100001B
C-----IF CARD READER INPUT, SWITCH TO KEYBOARD INPUT
      IF(KBINP(I))GO TO 3270
      LITE2=IAND(LITE2,377B)
      OUTLEN=0
      IF(INPDEV .EQ. 0) GOTO 3230 
      DEFKB=.TRUE.
      GOTO 3260 
C-----FNUM#4 "ABORT TRANSACTION"               *****  FNB #  4  ********
 4200 IF(INPITL .NE. 0)  GOTO 9000
C-----IF ON LINE OR OFF LINE PRINT OUT IS REQUESTED PRINT "----------"
 4210 IF(IAND(ITT,1400B).EQ.0)  GOTO 4250 
      CALL MOVEW(20H--------------------,OUTBUF,10) 
      CALL MOVEW(LFLF,OUTBUF(11),5) 
      OUTLEN=30 
      INPLEN=0
      OUTDEV=2
      LITE1=0 
      LITE2=0 
      CALL TMSUB(IOMODL)
      GOTO 4250 
 4231 IF( ISBIT(ITT,0) )  CALL TMCBD(IUSER) 
 4233 ITT=0 
C-----EXIT THIS TRANSACTION AND RETURN TO ASK  "TS#-SC ?" 
 4250 CONTINUE
CREQ  CALL DMPTM(6,LU,50,14H TBULK AT 4250,14,1)
      CALL TBULK(IDBNUM)
C-----RESET THE STOP-INHIBIT FLAG SO ONE CAN STOP TMP 
      CALL TMSIF
      SQUAL=11
      JNDEX=LU
C-----CLOSE THE TRANSACTION SPECIFICATION 
      CALL TMSUB(TSMG)
      ASSIGN 4275 TO K
      IF(FMGST .NE. 0)  CALL TMPER(K,49,FORMN,LU,131,FMGST) 
 4275 IF( ISBIT(ITT,0) )  CALL TMCBD(IUSER) 
      IF( ISBIT(ITT,1) )  CALL TMCBD(FAFRTB)
      CALL TMCBD(FORMN,NUQ) 
      GOTO 400
C-----FNUM#2 "RECALL"                          *****  FNB #  2  ********
 4300 IF(INPITL .NE. 0)  GOTO 9000
C     WRITE(6,43009) INPITL,CALCFL,STATE(4),BKSFL,WAITC 
C43009 FORMAT(" INPITL="@6", CALCFL="@6", STATE(4)="@6
C    +       ", BKSFL="@6", WAITC="@6)
      IF(CALCFL) GOTO 9000
      K=-1
C-----IF IN PLACE OF CARD READER INPUT, UPDATE CR POINTER 
      IF( KBINP(I) )  GOTO 4305 
      FLDCNT=FLDCNT-1 
 4305 IF(BKSFL)  GOTO 4310
      BKSQ=SQUAL
      BKIN=INDEX
      BKJN=JNDEX
 4310 FORWIP=.FALSE.
      BKSIP =.TRUE. 
      BKSFL =.TRUE. 
      IF(WAITC)  GOTO 4350
 4315 IF(SQUAL.EQ.0) CALL TMPER(IERTN,49,FORMN,LU,133,SQUAL)
      IF(DOBKS(SQUAL,JNDEX,INDEX,NUQ,NMQ) )  GOTO 4370
      STCNT=STCNT-1 
      K=K+1 
      IF(K .LT. 0)  GOTO 4315 
      GOTO 2320 
C     SPECIAL RECALL IF END HAS BEEN REACHED
 4350 WAITC=.FALSE. 
      BUFULL=0
      BKSQ=4
      GOTO 3120 
C-----ERROR DURING BACKSPACE, THE VERY FIRST STATE IS REACHED 
C     SET ERROR FLAG AND GO RE-GET THE STATE VECTOR 
 4370 ERRFL=1 
      GOTO 2320 
C-----FNUM#3 "SAME VALUE"                      *****  FNB #  3  ********
 4400 IF   ( WAITC )     GOTO 9000
      IF (INPITL .NE. 0) GOTO 9000
      IF   ( CALCFL )    GOTO 9000
      IF ( ENDBK(J) )  GOTO 4430
      I = IPT(INDEX-1,2)
      IF (INDEX .GT. 1)  GOTO 4435
      IF   ( BEGNFL )    GOTO 9000
 4430 I = OBUFPT
 4435 CALL MOVEW(OBUF(I),INPBUF,(ITEMLN+1)/2) 
C-----ECHO THE SAME VALUE ON PRINTER IF REQUIRED
 4450 IF( ONLPR(I) )  GOTO 6300 
      CALL BLANC(OUTBUF,10) 
      CALL CNVTO(ITEMTP,INPBUF,TEMPB,I) 
      CALL MOVEW(TEMPB,OUTBUF,(I+1)/2)
      CALL JUSTF(OUTBUF,1,20,0) 
      OUTLEN=20 
      OUTDEV=2
      INPLEN=0
      CALL TMSUB(IOMODL)
      GOTO 6300 
C-----FNUM#1 "TRANSACTION COMPLETE"            *****  FNB #  1  ********
4500  CONTINUE
      IF(INPITL .NE. 0)  GOTO 9000
      INPSTA=0
      IF(CALCFL)  GOTO 9000 
C-----CHECK THAT WE ARE AT THE END OF M-QUESTION
      I=INDEX 
      IF(WAITC)  GOTO 4510
      K=SQUAL 
      J=JNDEX 
      IF(DOBKS(K,J,I,NUQ,NMQ))  GOTO 9000 
      IF(FAF .EQ. 0)  GOTO 4505 
      IF(DOBKS(K,J,I,NUQ,NMQ))  GOTO 9000 
 4505 IF(ENDMQ(K,J,NUQ,NMQ))  GOTO 9000 
C 
C-----DATA ARE VALIDATED !
C     REDUCE THE SIZE OF THE COMMON BLOCK # 2 BEFORE THE
C     SUB-PROCESS LAUNCH, TO SAVE ROOM. 
C     EXECUTE LOGGING IF REQUIRED.
C     STORE DATA ON MEDIA USING THE TMSUB "STORA" & "STORB" 
C     BY A SUB-PROCESS LAUNCH.
C 
 4510 STATPT=FORMN
      INDEX=I 
      EDITPT=OBULN
C     I=INDEX+1 
C-----CALCULATE END OF DATA AND START OF IMAGE SAVE RUN TABLE ADDRESS 
C     J=IPT(I,2)
      J=(L2*INDEX)+1+L1 
      K=IMPT(INDEX) 
      ILL=K-J 
C     CALL DMPTM(6,I,3,8H I,J,K   ,8,0) 
C     CALL DMPTM(6,L1,2,8H L1,L2  ,8,0) 
      IF(ILL .LE. 0)  CALL TMPER(IERTN,49,FORMN,LU,125,ILL) 
      L=OBULN-K 
C-----MOVE DOWNWARD THE SAVE RUN TABLE DATA 
      CALL MOVEW(OBUF(K),OBUF(J),L) 
      OBULN=J+L 
C#####################################################################
D     WRITE(LUOXXX,8181)LU,OBULN
D8181 FORMAT(" LU ",I2," BEFORE FIRST TMCBL, OBULN = ",I5)
C#####################################################################
      CALL TMCBL(NUQ,OBULN+31)
C#####################################################################
D     WRITE(LUOXXX,8282)LU,OBULN
D8282 FORMAT(" LU ",I2," AFTER FIRST TMCBL,  OBULN = ",I5)
C#####################################################################
      OBUF(OBULN)=LU
      OBUF(OBULN+1)=ITT 
      OBUF(OBULN+2)=IDBNUM
C-----LOCK THE TRANS. SPEC. FOR THE STORAGE 
      SQUAL=12
      CALL TMSUB(TSMG)
      IF(FMGST .NE. 0) CALL TMPER(IERTN,49,FORMN,LU,122,FMGST)
C-----LOGGING OF THE DATA BUFFER IF NEEDED  === 
      IF( .NOT. ISBIT(ITT,2) )  GOTO 4520 
      CALL CNUMD(FORMN,LOGHD(3))
      CALL TMLOG(LOGHD,OBUF,L1+INDEX*L2)
C-----SAVE IST IN K FOR LATER USE 
      K=IST 
C-----CALL THE STORAGE MODULE 
 4520 CALL NUL(OBUF(OBULN+3),6) 
C 
C  BEFORE THE STORAGE -- UPDATE THE SYSTEM TIME WITH THE TERMINAL 
C      TIME IF THE READ WAS FROM A 3077 
C 
      IF(.NOT.HP3077)GO TO 4521 
      LLL=1 
      IF(ISBIT(ITT,15))LLL=LLL+2
      IF(ISBIT(ITT,14))LLL=LLL+1
      IF(ISBIT(ITT,13))LLL=LLL+3
      OBUF(LLL)=TRMHR 
      OBUF(LLL+1)=TRMMN 
4521  CALL LOGEV(ICOM00(2),LU,1000,0,ITSN,OBUF(OBULN+3))
C 
C --- LOGGING WITH IMAGE? 
C 
      IF(.NOT.ISBIT(ISTSAV,7)) GO TO 4522 
      IF(.NOT.ISBIT(ITT,1)) GO TO 4524
C 
C --- YES.  CALL STORAGE ROUTINE & WAIT FOR IT TO COMPLETE. 
C 
C     CALL DMPTM(6,LU,100,6H1CB 1 ,6,1) 
C     CALL DMPTM(6,NUQ,007,6H0CB 2 ,6,1)
C     CALL DMPTM(6,FORMN,200,6H0CB 3 ,6,1)
C     CALL DMPTM(6,IUSER,332,6H0CB 4 ,6,1)
C 
C          FIRST SAVE CB 2 IN CB 5 SO STORA CANNOT MODIFY IT
C 
      CALL MOVEW(NUQ,FAFRTB,OBULN+31) 
  
C 
C          CALL STORA 
C 
      CALL TMSUB(STORAG)
C 
C          RESTORE CB 2 TO WHAT IT WAS BEFORE THE TMSUB CALL
C 
      CALL MOVEW(FAFRTB,NUQ,OBULN+31) 
C 
C          "BEEP" IF LOGGING WAS SUCCESSFUL (STATUS SAVED IN K) 
C 
4524  IF(K.LT.0)GO TO 4525
      INPLEN = 0
      OUTDEV = 1
      IF(IOMODL(3) .NE. 2H5 )GO TO 45255
      CALL MOVEW(LOGACK,OUTBUF,4) 
      OUTLEN=8
      GO TO 45256 
45255 OUTBUF=LOGACK 
      OUTLEN=2
45256 CALL TMSUB(IOMODL)
C     CALL DMPTM(6,LU,100,6H1CB 1 ,6,1) 
C     CALL DMPTM(6,NUQ,007,6H0CB 2 ,6,1)
C     CALL DMPTM(6,FORMN,200,6H0CB 3 ,6,1)
C     CALL DMPTM(6,IUSER,332,6H0CB 4 ,6,1)
4525  IF(ISBIT(ITT,1)) GO TO 4523 
C 
C --- NO, NOT LOGGING.  CALL STORAGE ROUTINE BUT DON'T WAIT FOR 
C     IT TO COMPLETE, IE, JUST LAUNCH IT. 
C 
4522  CALL TMPRO(2,STORAG,NUQ)
C 
C-----EXECUTE THE OFF-LINE PRINT-OUT IF REQUIRED. 
C 
4523  IF( ISBIT(ITT,9) )  CALL TMSUB(OFLPO) 
C-----RESTORE VARIABLE, CB LENGTH AND CONTINUE
      OBULN=EDITPT
      CALL TMCBL(NUQ,OBULNX+7)
      BEGNFL=.FALSE.
      IF(INDEX .EQ. ENDCHN)  GOTO 4540
      IF(INDEX .GT. ENDCHN)  CALL TMPER(IERTN,49,FORMN,LU,141,INDEX)
C-----IF BUFFER FULL, RESTART AT BEGINNING OF M-QUESTION
      SQUAL=2 
      IF( BUFULL .NE. 0 )  GOTO 2050
C-----FNUM#14  "TC+ABORT"                      *****  FNB # 14  ********
4540  IF ( KEYN .EQ. 14 )  GOTO 4210
C-----THIS IS TRANSACTION COMPLETE ONLY, RESTART THE SAME TS
 4560 SQUAL=1 
      IX=4560 
C     WRITE(1,31789) IX,OUTLEN
      KLUGE=1 
      IF( ISBIT(ITT,1) )  GOTO 2020 
      GOTO 2050 
C-----COMPUTATION FUNCTIONS (CALCULATOR MODE)  *****  FNB # 5-9  *******
 4700 IF(WAITC)  GOTO 9000
      IF(ICNVT(I))GO TO 9000
      CALL MOVEW(INPBUF,CALCBU,2) 
4730  IF(CALCU(ITEMTP,KEYN,INPITL,CALCFL,CALCIP,CALCBU,LSTCLC)) 
     *                     GO TO 4731 
      GO TO 4732
C 
C  OVERFLOW ERR IN CALCULATOR MODE -- ISSUE --13-- ERROR
C 
4731  ERRFL=13
C***  CALL DMPTM(6,IMGSTA,10,10H 4731 ERR ,0,0) 
      GO TO 9100
C######################################################################## 
D9854 CALL MOVEW(CALCBU,R,2)
D     CALL MOVEW(CALCBU(3),S,2) 
D     WRITE(LUOXXX,9855)ITEMTP,KEYN,INPITL,INLNGT 
D    *,CALCFL,CALCIP,R,CALCBU(1),S,CALCBU(3)
D9855 FORMAT(/,3X,"/ZTMP:  ITEMTP=",I5,/,11X, 
D    *"KEYN=",I5,/,11X,"INPITL=",I5,/,11X,"INLNGT=",I5,/,11X, 
D    *"CALCFL=",L5,/
D    *11X,"CALCIP=",L5,/,18X,"CALCBU(1)=",F10.4,I10,/,18X,
D    *"CALCBU(3)=",F10.4,I10,/) 
C#######################################################################
C 
C  CALCULATION OK 
C 
4732  OUTLEN=0
      IF(KEYN.EQ.1)GO TO 3200 
C-----IT IS OK TO STORE INTO 'OUTBUF' BECAUSE IT IS ONLY INTEGER OR REAL
      CALL CNVTO(ITEMTP,CALCBU,OUTBUF,OUTLEN) 
      CALL JUSTF(OUTBUF,1,OUTLEN,1) 
      GO TO 3200
C-----FNUM # 11 "CONTINUE TO NEXT QUESTION"    *****  FNB #  11  *******
 5000 IF(WAITC)  GOTO 9000
      IF(INPITL .NE. 0)  GOTO 9000
      IF( .NOT. ISBIT(STATE,8) )  GOTO 6350 
C     THIS TS DELETE, IF NOT THE LAST QUESTION FORGET IMAGE EDIT
      IF( ISBIT(STATE(EDITPT),11) )  STATPT=STATPT+3
      IF( .NOT. ISBIT(STATE,9) )  GOTO 6600 
C     THIS IS THE LAST QUEST. OF A TS-DELETE-IMAGE, REMOVE THAT ENTRY 
C     FORM THE OUTPUT BUFFER
      IF(SQUAL .EQ. 1)  GOTO 3079 
C-----FNUM # 12 "NEXT ENTRY IN AN CHAIN"       *****  FNB #  12  *******
 5100 IF(WAITC)  GOTO 9000
      IF(INPITL .NE. 0)  GOTO 9000
      IF(SQUAL .EQ. 1)  GOTO 9000 
      INDEX=INDEX-1 
      JNDEX=NMQ 
      IF( .NOT. (ENDBK(I)) )  GOTO 2600 
      BKIN=BKIN-1 
      ENDCHN=ENDCHN-1 
      K=BKIN-INDEX
      IF(K .LE. 0)  GOTO 2600 
      ITO=L1+(INDEX*L2) 
      CALL MOVEW(OBUF(ITO+L2),OBUF(ITO),K*L2) 
      ITO=IMPT(BKIN)
      CALL MOVEW(OBUF(ITO-6),OBUF(ITO),-K*6)
      GOTO 2600 
C-----FNUM # 13 "DELETE ENTRY IN DATA BASE"    *****  FNB # 13  ********
 5200 IF(WAITC)  GOTO 9000
      IF(INPITL .NE. 0)  GOTO 9000
      FORWJN=NMQ
      IF(SQUAL .EQ. 1)  FORWJN=NUQ
      FORWIP=.TRUE. 
      GOTO 6350 
C 
C     EDIT SECTION. 
C     ============= 
C 
C 
C-----CLEAR RECALL FLAG "BKSFL" IF THIS STATE IS THE ONE
C     WERE THE RECALL HAS STARTED.
C    -CONVERT DATA. 
C    -EXECUTE THE STANDARD EDIT PROGRAM.
C    -EXECUTE THE IMAGE EDIT (IF NEEDED). 
C    -CALL THE USER EDIT PROGRAM (IF NEEDED). 
C    -STORE DATA IN OUTPUT BUFFER.
C    -CHECK IF THE OUTPUT BUFFER IS FULL. 
C 
 6000 IF ( ENDBK(I) )  GOTO 6100
C 
C-----CONVERT THE DATA INTO BINARY AND MOVE THEM INTO 'INPBUF'
C 
 6100 IF ( ICNVT(I) )  GOTO 9000
D     WRITE(LUOXXX,9859)
D9859 FORMAT(2X," /TMP: AFTER THE CNVTI:")
D     CALL PRT(LUOXXX,LU,ITEMTP,INPBUF,KEYN)
C 
C-----PERFORM VALUE EDIT
C 
 6300 IF ( VALCK(.FALSE.) )  GO TO 9000 
C 
C-----MOVE DATA INTO THE TERMINAL BUFFER 'OBUF' 
C 
 6350 CALL MVITM(INPBUF,OBUF,ITEMTP)
      STATPT=IMAGPT 
C 
      IF( .NOT. ISBIT(STATE(EDITPT),11) )  GOTO 6600
C 
C-----PERFORM IMAGE EDIT
C 
C     GET IMAGE EDIT CODE:
C         1 - KEYED DBGET ON EXISTING RECORD
C         2 - KEYED DBGET AND LOCK ON NON-EXISTING RECORD (FOR ADD) 
C         3 - KEYED DBGET AND LOCK FOR DELETE 
C         4 - DBFND 
C 
      IMECD=IAND(STATE(IMAGPT),17B) 
      LOCKW=0 
      IF(ISBIT(STATE(IMAGPT),13))  LOCKW=100011B
C-----IF FOR A DETAIL, SET THE NON-EXCLUSIVE LOCK BIT 
      IF ( IMECD.EQ.1 .AND. 
     .   .NOT. ISBIT(STATE(IMAGPT),14)) CALL SETBT(LOCKW,2,1) 
      K=STATE(IMAGPT+1) 
      I=IPT(INDEX,IMAGPT+1) 
C#####################################################################
D     WRITE(LUOXXX,9861)STATE(IMAGPT),IMECD,K,LOCKW,IMAGEX(7) 
D9861 FORMAT("  IMAGE EDIT:"@7,"  EDIT CD="I1" ITM#-DS#"@7, 
D    .",   LOCKW="@6" LOCKID="@7) 
C#####################################################################
C 
C     SET IRET TO RETURN NO DATA
C 
      IRET=0
      GOTO (6390,6400,6400,6550),IMECD
C 
C     IMAGE EDIT CODE 1, RETURN DATA ENTRY
C 
 6390 IRET=40040B 
C=====IMAGE EDIT # 1
 6400 CONTINUE
      CALL TBGET(IDBNUM,IGETB(K,2),7,IMGSTA,IRET,TEMPB,OBUF(I),LOCKW) 
D     WRITE(LUOXXX,9230)IMGSAV
D9230 FORMAT(" 7**ISAVRT",3O7/10X,7O8)
C#####################################################################
D     WRITE(LUOXXX,9862)IMECD,IMGSTA,IMAGEX(7),ISAVRT 
D9862 FORMAT("  AFTER DBCALL (EDIT DC="I1"), IMG STAT:"4I6,3X,
D    ."LOCKID="@7,/"               RUN TABLE:"7I6)
C#####################################################################
      IF(IMGSTA.NE.400 .AND. IMGSTA.NE.401)  GOTO 6408
 6405 ERRFL=50
      GOTO 9020 
 6408 ASSIGN 6409 TO IK 
      IF(IMGSTA.NE.0 .AND. IMGSTA.NE.107) 
     .     CALL TMPER(IK,49,FORMN,LU,180+IMECD,IMGSTA)
 6409 GOTO (6410,6450,6500),IMECD 
 6410 IF(IMGSTA .NE. 0)  GOTO 9000
      CALL MOVEW(TEMPB,IMGBUF,IMGSTA(2))
C-----IF UPDATE/DELETE IN THE MASTER, SAVE RTB FOR STORAGE STATE
      IF( ISBIT(STATE(IMAGPT),14) .AND. ISBIT(STATE(IMAGPT),13) .AND. 
     .    SQUAL.EQ.1) CALL MOVEW(IMGSAV,OBUF(IMPT(INDEX)),10) 
      GOTO 6590 
C=====IMAGE EDIT # 2
C     MAKE SURE THAT ITEM HAS NOT BEEN FOUND
 6450 IF(IMGSTA .EQ. 107)  GOTO 6590
C        IF ITEM HAS BEEN FOUND, THEN ERROR HAS OCCURRED
         IF(IMGSTA.NE.0)GO TO 9000
C           UNLOCK ITEM THAT HAS BEEN FOUND 
            CALL TBGET(IDBNUM,IGETB(K,2),7,IMGSTA,0,TEMPB,OBUF(I),
     .      100002B)
            GO TO 9000
C 
C=====IMAGE EDIT # 3
C     CHECK FOR EMPTY CHAIN SO THAT DELETE MAY BE EXECUTED
 6500 ASSIGN 6501 TO IK 
      IF(IMGSTA.NE.0) CALL TMPER(IK,49,FORMN,LU,183,IMGSTA) 
C 
C     GET NO. OF DETAIL DS. CHAINED TO MASTER 
C 
 6501 KKK=IMAGPT+3
      IF(STATE(KKK).LE.0)GO TO 6590 
         DO 6505 KK=1,STATE(KKK)
C 
C           IF TBFND FAILS WITH ERROR 156, THEN CHAIN FROM MASTER 
C           TO DETAIL IS EMPTY.  ALL DETAIL DATA SETS MUST BE CHECKED.
C 
            CALL TBFND(IDBNUM,IGETB(STATE(KK+KKK),2),1,IMGSTA,
     *                 IGETB(STATE(KK+KKK),1),OBUF(I))
            IF(IMGSTA.NE.156)GO TO 9000 
6505     CONTINUE 
      GOTO 6590 
C 
C=====IMAGE EDIT # 4
C 
6550  CONTINUE
      CALL TBFND(IDBNUM,IGETB(K,2),1,IMGSTA,IGETB(K,1),OBUF(I),LOCKW) 
C#####################################################################
D     WRITE(LUOXXX,9863)IMGSTA,IMAGEX(7),ISAVRT 
D9863 FORMAT("  AFTER DBFND  (EDIT CD=4), IMG STAT:"4I6,3X"LOCKID=",
D    .   @7,/"               RUN TABLE:"6I6)
C#####################################################################
      IF(IMGSTA.EQ.400 .OR. IMGSTA.EQ.401)  GOTO 6405 
      IF(IMGSTA .NE. 0)  GOTO 9000
C-----CHECK CHAIN LENGTH (32-BIT INTEGER CHECK FOR 0) 
      IF(IMGSTA(5)+IMGSTA(6) .EQ. 0)  GOTO 9000 
C-----SAVE THE RUN TABLE TO CHOOSE THE SHORTEST CHAIN LATER 
      CALL MOVEW(IMGSAV,XRTB(1,JNDEX),10) 
C 
C     SAVE CHAIN LENGTH (32-BIT INTEGER SAVE) 
C 
      XRTB(2,JNDEX)=IMGSTA(5) 
      XRTB(3,JNDEX)=IMGSTA(6) 
C 
C-----END OF IMAGE EDIT, PRESET STATE POINTER 'STATPT' FOR THE USER EDITR 
 6590 STATPT=STATPT+13
 6600 IF( .NOT. ISBIT(STATE(EDITPT),10) ) GOTO 6700 
C 
C-----CALL THE USER EDIT MODULE 
C 
C 
C  FIRST, RECALCULATE THE STATE POINTER 
C 
C     TO TAKE CARE OF A CHANGE IN THE TS WHEN BOTH IMAGE EDIT 
C 
C       AND USER EDITS ARE PRESENT IN THE SAME STATE
C 
      IF(ISBIT(STATE(EDITPT),10).AND.ISBIT(STATE(EDITPT),11)) 
     .           STATPT=STATPT+7
C 
C  SET UP THE USER COMMON BLOCK 
C 
      CALL SUBUF(FORMN,ITEMTP,BKSFL,INDEX,STATPT,IUSER) 
      CALL TMSUB(STATE(STATPT)) 
      IF(IST .NE. 0)  CALL TMPER(IERTN,2,FORMN,LU,STATE(STATPT),IST)
      IF(IUSER(10) .EQ. 0)  GOTO 6700 
C-----IF USER EDIT ON CARD INPUT, DO NOT USE USER BCKSP FLAG
      IF( .NOT. KBINP(I) )  GOTO 9000 
      ERRFL=1 
      K=IUSER(11) 
      IF(K .LT. 0)  GOTO 4305 
      GOTO 9000 
C 
C-----FORWARD SPACING IN THE TRANSACTION
C 
 6700 IF( .NOT. FORWIP )  GOTO 6800 
 6720 IF(ITEMTP.NE.3)  CALL TMPER(IERTN,49,FORMN,LU,171,ITEMTP) 
      IF(JNDEX .GE. FORWJN)  FORWIP=.FALSE. 
 6800 CONTINUE
C#########################################################
D     I=IPT(INDEX,2)
D     K=IMPT(INDEX) 
D     QZZ = ENDMQ(SQUAL,JNDEX,NUQ,NMQ)
D     WRITE(LUOXXX,9873)JNDEX,INDEX,I,OBUFPT,K,SQUAL,NUQ,NMQ,QZZ
D9873 FORMAT(" /TMP: END OF STATE J="I2", I="I3",  OBUFPT="2I7, 
D    .", OBIMPT="I7,/," SQUAL=",I7," NUQ/NMQ=",I5,"/",I5," ENDMQ=",L3)
D     CALL PRT(LUOXXX,LU,ITEMTP,OBUF(OBUFPT),KEYN)
C######################################################## 
      IF( NMQ .EQ. 0   .AND.
     . ( .NOT.  ENDMQ(SQUAL,JNDEX,NUQ,NMQ)) )  GOTO 7000
      IF(ENDMQ(SQUAL,JNDEX,NUQ,NMQ))  GOTO 2600 
C     CALL DMPTM(6,ITEMLN,2,10H ITEMLN,OB,10,0) 
C     CALL DMPTM(6,INDEX,4,10H INDEX,L2 ,10,0)
C 
C --- IF THIS IS 3077 OR AUTO-COMPLETE TS, THEN SET WAITC.
C 
      IF(HP3077 .OR. ISBIT(ITT0,15)) GO TO 7000 
C 
C --- THIS IS LAST M-QUES, SO IF INPUT WAS FROM USER WRITTEN DATA 
C     MODULE, THEN GO SET WAITC.
C 
      IF(IAND(STATE(4),37B).EQ.31) GO TO 7000 
C 
C 
      ITEMPL=OBUFPT+((ITEMLN+1)/2)
C************************************************** 
D     IKK = IMPT(INDEX+1) 
D     IJJ = ITEMPL +L2
D     WRITE(LUOXXX,6548)IJJ,IKK 
D6548 FORMAT (" /ZTMP: AT BUFFER FULL TEST: ",2I5)
C************************************************** 
      IF((ITEMPL+L2) .LT. IMPT(INDEX+1))  GOTO 2600 
      BUFULL=INDEX
      IF(SQUAL .NE. 2)  CALL TMPER(IERTN,49,FORMN,LU,190,SQUAL) 
      IF(ITEMPL .GT. IMPT(INDEX))  CALL TMPER(IERTN,49,FORMN, 
     +                                        LU,195,INDEX) 
C-----SET WAIT TRANSACTION COMPLETE FLAG !! 
 7000 WAITC=.TRUE.
      FORWIP=.FALSE.
C-----SWITCH ON LIGHT "TERMINATE TRANSACTION !" 
      CALL PUTCA(LITE2,LITTCP,2)
C-----SWITCH OFF THE QUESTION AND THE DISPLAY LIGHT AND CLEAR DSP 
      OUTDEV=0
      IF(JNDEX.NE.NMQ+1 .OR.  NMQ.EQ.0)LITE1=0
      OUTLEN=0
C******************************************** 
D     IJJ = ITEMPL + L2 
D     IKK = IMPT(INDEX+1) 
D     WRITE(LUOXXX,6548)IJJ,IKK 
D     WRITE(LUOXXX,6547)LITE1,LITE2 
D6547 FORMAT(" /ZTMP:GOING TO 3200 FOR MORE INPUT. LITE1/LITE2= ",2@7)
C******************************************** 
      GOTO 3200 
C 
C     E R R O R   S E C T I O N  !
C     ============================
C 
 9000 ERRFL=1 
 9020 FORWIP=.FALSE.
C-----IF FROM KEYBOARD INPUT, OUTPUT ERROR
C################################################################## 
D     QXY=KBINP(I)
D     WRITE(LUOXXX,9086)QXY 
D9086 FORMAT(//"IN ERROR SECTION -- CK. KBINP(I) -- EQUALS",L5) 
C################################################################## 
      IF( KBINP(I) )  GOTO 9100 
C-----IF DEFAULTED TO KEYBOARD, OUTPUT ERROR
C#################################################################
D     WRITE(LUOXXX,9087)DEFKB 
D9087 FORMAT(//"IN ERROR SECTION -- CK. DEFKB -- EQUALS",L5)
C#################################################################
      IF( DEFKB )  GOTO 9100
C-----ERROR IS FROM A FIELD ON A CARD, REPORT SEPCIAL ERROR MESSAGE 
C     AND BACKSPACE AT THE BEGINNING OF THE CARD
      ERRFL=11
      COLCNT=IAND(STATE(5),377B)
      IF(.NOT.ISBIT(STATE(4),15))COLCNT=(COLCNT+1)*2
      K=-STCNT
      IF(K .LT. 0)  GOTO 4305 
C-----SWITCH OF THE DISPLAY LIGHT 
 9100 LITE1=IAND(LITE1,177400B) 
      GOTO 3200 
C 
      END 
C#####################################################################
C 
C#####################################################################
D     SUBROUTINE PRT(LUOUT,LU,ITEMTP,IBUF,KEYN),PRINT FOR DEBUG  781013 
D     DIMENSION IBUF(1),ITEMTP(1) 
D     I=1 
D     ITEMLN=ITEMTP(2)
D     IF(ITEMTP .EQ. 0)  GOTO 9880
D     IF(ITEMTP .EQ. 1)  GOTO 9875
D     IF(ITEMTP .EQ. 3)  GOTO 9876
D     IF(ITEMTP .NE. 2)  GOTO 9885
D     CALL MOVEW(IBUF(I),X,2) 
D     WRITE(LUOUT,9877)LU,X 
D     GOTO 9885 
D9876 WRITE(LUOUT,9878)LU,KEYN
D     GOTO 9885 
D9875 WRITE(LUOUT,9872)LU,IBUF(I) 
D9877 FORMAT(" FROM LU#"I2" REAL:"F11.2)
D9878 FORMAT(" FROM LU#"I2" FUNCTION #"I3)
D9872 FORMAT(" FROM LU#"I2" INTEGER: "I7) 
D     GOTO 9885 
D9880 K=(ITEMLN+1)/2
D     WRITE(LUOUT,9882)LU,ITEMLN,(IBUF(JX),JX=I,I+K-1)
D9882 FORMAT(" FROM LU#"I2" STRING: LEN ="I4" BYTES,  VAL:" 
D    .,2(/,12X,32A2)) 
D9885 CONTINUE
D     RETURN
C#####################################################################
D     END 
      SUBROUTINE CALCV(ICOD,ITMTP,IACC,MEM,IER) 
     *, 92080-16510 REV.2026  800513
C 
      I=ICOD+1
      GOTO (100,200),I
C-----FUNCTION IS RESET 
  100 Y=0.
      GOTO 500
C-----FUNCTION IS ARITM. OPERATOR 
  200 CALL MOVEW(MEM,X,ITMTP) 
      CALL MOVEW(IACC,Y,ITMTP)
      IF(ITMTP .EQ. 2)  GOTO 210
      X=MEM 
      Y=IACC
C 
  210 CONTINUE
      Y=Y+X 
C 
C-----RETURN THE VALUE
  500 CALL MOVEW(Y,IACC,ITMTP)
      IER=0 
      IF(ITMTP .NE. 1)  RETURN
         IF(Y.LT.-32768. .OR. Y.GT.32767.)IER=1 
         IACC=Y 
         IF(Y.LT.-32768.)IACC=-32768
      RETURN
      END 
      SUBROUTINE MVITM(IBS,IBD,ITMT), 92080-16510 REV.2026  800513
C 
      DIMENSION IBD(1),ITMT(1)
C 
      CALL MOVEW(IBS,IBD(ITMT(3)),(ITMT(2)+1)/2)
      RETURN
      END 
      FUNCTION MTCHT(ISTATE,ITEMP,IOBUF), 92080-16510 REV.2026  800513
C 
C     THIS FUNCTION COMPARES DATA RETRIEVED BY A TBGET CALL WITH DATA 
C     INPUT BY THE DATACAP USER.  THE ITEMS TO BE COMPARED ARE SPECIFIED
C     IN ISTATE, WHICH CONTAINS THE FAF SPECIFICATIONS. 
C 
C          ISTATE - FAF STATE (OUTPUT BY TGP) 
C          ITEMP  - DATA FROM TBGET CALL
C          IOBUF  - DATA INPUT BY USER
C 
C     MTCHT - TRUE IF IMAGE DATA MATCHES USER DATA
C            - FALSE, OTHERWISE 
C 
      DIMENSION ISTATE(1),ITEMP(1),IOBUF(1) 
      LOGICAL MTCHT,CMPW
      MTCHT=.TRUE.
      J=IGETB(ISTATE,4) 
      IF(J.EQ.0)RETURN
      MTCHT=.FALSE. 
      DO 10 I=1,J 
         K=2*I+1
         IF(.NOT.CMPW(ITEMP(IGETB(ISTATE(K),1)),IOBUF(ISTATE(K+1))
     .     ,IGETB(ISTATE(K),2)))RETURN
10    CONTINUE
      MTCHT=.TRUE.
      RETURN
      END 
C 
C 
      FUNCTION IFCRT(ISTATE,IOUTDV,ITT), 92080-16510 REV.2026  800513 
C 
C     ISTATE  =  CURRENT ISTATE BEING EXECUTED. 
C 
C     IOUTDV =  OUTPUT DEVICE WORD. 
C 
C     THIS FUNCTION WILL DETERMINE IF THE CURRENT STATE BEING EXECUTED WILL 
C     BE GOING TO THE CRT OR ALPHA DISPLAY.  IF SO, IOUTDV (& ULTIMATELY, 
C     OUTDEV IN ZTMP) BIT 1 WILL BE SET AS WELL AS SOME 
C     OF BITS 13-14 AS FOLLOWS: 
C 
C     IOUTDV BIT 2  IF OUTPUT TO CRT
C                0 & 3 IF OUTPUT TO ALPHA DISPLAY 
C                13 IF SCROLLING
C                14 IF LARGE CHARACTER SET. 
C 
C     CALL:  IF(IFCRT(STATE,OUTDEV,ITT)) GO TO CRT ROUTINE
C 
C     RETURN: 
C 
C     IFCRT = .TRUE. IF TS CALLS FOR CRT OR ALPHA DISPLAY.
C                    IOUTDV WILL HAVE APPROPRIATE BITS SET. 
C           = .FALSE.  IF TS DOES NOT SPECIFY ADS NOR CRT.
C                      IOUTDV SET TO 0. 
C 
      DIMENSION ISTATE(1) 
      LOGICAL IFCRT,ISBIT 
      IFCRT=.FALSE. 
      IOUTDV=0
C 
C --- ALPHA DISPLAY?
C 
      IF(ISBIT(ITT,7)) GO TO 60 
C 
C --- EXIT 99 IF NO CRT REQUESTED BY THIS STATE.
C 
      IF(.NOT.ISBIT(ISTATE(6),0)) GO TO 99
      IOUTDV=4
      DO 50 I=14,15 
         IF(.NOT.ISBIT(ISTATE(6),I)) GO TO 50 
         J=I-1
         CALL SETBT(IOUTDV,J,1) 
 50   CONTINUE
      GO TO 77
C 
C --- ALPHA DISPLAY, SO SET BITS 0&3 (FOR DSP) & RETURN A TRUE CONDITION. 
C 
 60   IOUTDV=11B
C 
 77   IFCRT=.TRUE.
C99   WRITE(1,9999) ISTATE(6),IOUTDV,IFCRT
C9999 FORMAT(" IFCRT OF ZTMP, ISTATE(6)="@7", IOUTDV="@7", IFCRT="@7) 
99    RETURN
      END 
      END$
                                                                                                                                                                                                              