FTN4 SUBROUTINE IOM75, 92080-16570 REV.2026 800602 C C C SOURCE FILE: &IOM75 P/N 92080-18570 C RELOC. FILE: %IOM75 P/N 92080-16570 C C C PMGR: STEVE WITTEN, C DATA SYSTEMS DIVISION, C CUPERTINO, CALIFORNIA C C C ************************************************************** C * * C * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * C * RESERVED. NO PART OF THIS PROGRAM MY BE PHOTOCOPIED, RE- * C * PRODUCED, OR TRANSLATED INTO ANOTHER PROGRAM LANGUAGE WITH-* C * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY * C * * C ************************************************************** C C THIS PROGRAM IS 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, %IOM75 IS A T.U.S. OF THE TMP (TERMINAL MONITOR PROGRAM). C IT IS THE INTERFACE BETWEEN TMP AND THE MULTIPOINT DRIVER (DVR07). C C C*********************************************STEVE WITTEN (DSD)******** C C TRUE COMMON C COMMON ICOM00(5) C C THIS COMMON BLOCK IS FOR TMS USE ONLY. N.B. FOR DEBUGGING, ICOM00(1) C CONTAINS THE LU# OF THE TERMINAL THAT SCHEDULED TMP. C C C********************* C * C COMMON BLOCK # 1 * C * C********************* C COMMON LLU(26),ERRFL,IFILL0,IFC,IORTAD,ITRST,ITSNUM(2),ITIM(6) * ,LITE1,LITE2,LITE3 * ,OUTDEV,INPDEV,ITSNAM(5),OTBFLN,OTBUFR(40) * ,HP3077,WAITC,TRMHR,TRMMN,KPLHLD,MBLN,MSGBFR(50) C C LLU --> ARRAY NEEDED BY TMP. THIS ROUTINE ONLY NEEDS C WORDS 1, 4, AND 5 WHICH ARE "EQUIVALENCED" LATER. C C IFC --> THE FUNCTION CODE FOR DISPATCHING TO THE APPROPRIATE SECTION C OF THIS CODE. C C IORTAD --> TEMPORARY STORAGE FOR RETURN ADDRESSES WITHIN I/O MODULE C SO THAT CODE SECTIONS CAN BE REUSED. C C ITRST --> THE "USEFUL" SUBSET OF THE 6-BYTE TERMINAL HARDWARE STATUS C C ITSNUM --> WORD#1 IS THE TRANS.SPEC. NUMBER-- C WORD#2 IS THE TRANSACTION STEP. C C ITIM --> A SIX-WORD BUFFER HOLDING THE SYSTEM TIME IN A FORMAT DE- C SCRIBED IN THE RTE-IV PROGRAMMER'S REFERENCE MANUAL. C C LITE1 --> THE HI AND LO BYTES CONTAIN THE LOGICAL NUMBERS OF PROMPTING C LIGHTS TO BE LIT. (UPPER BYTE -- QUESTION LIGHT) C (LOWER BYTE -- DISPLAY LIGHT ) C C LITE2 --> THE HI AND LO BYTES CONTAIN THE LOGICAL NUMBERS OF PROMPTING C LIGHTS TO BE LIT. (UPPER BYTE -- ERROR LIGHT ) C (LOWER BYTE -- TR.COMP.LIGHT ) C C LITE3 --> THE LIGHT # OF THE LITE TO STAY ON ALL THE TIME C (LOWER BYTE ONLY, UPPER BYTE RESERVED C FOR FUTURE USE.) C C OUTDEV --> OUTPUT DEVICE WORD. DESCRIBES THE DEVICE TO WHICH OUTPUT C FROM TMP WILL BE ROUTED. BITS 15, 1, AND 0 ARE THE POWER C FAIL, PRINTER, AND DISPLAY BITS, RESPECTIVELY. C C INPDEV --> INPUT DEVICE WORD. DESCRIBES THE DEVICE FROM WHICH THIS C ROUTINE WILL GET INPUT TO PASS TO TMP. LO BYTE CONTAINS C DEVICE DESCRIPTION. HI BYTE CONTAINS INPUT DESCRIPTION. C C ITSNAM --> ARRAY OF 5 WORDS TO HOLD THE TRANS.SPEC.# AND SEC.CODE WHEN C THE USER FIRST ADDRESSES A 307X TERMINAL UNDER DATACAP/1000 C CONTROL. ITSNAM(4) WILL HOLD TS# AND ITSNAM(5) HOLDS SC. C ITSNAM(1,2,3,4) HAVE DIFFERENT MEANINGS IN OTHER PARTS OF THE C CODE AND WILL BE "EQUIVALENCED" LATER. C C OTBFLN --> LENGTH IN BYTES OF THE BUFFER OF INFORMATION TO BE WRITTEN C FROM TMP TO THE 307X TERMINAL. C C OTBUFR --> BUFFER OF INFORMATION TO BE WRITTEN FROM TMP TO 307X TERMINAL. C C C TRMHR --> THE HOUR OF THE DAY (24-HR CLOCK) RETRIEVED FROM AN HP3077 C TERMINAL. PASSED BACK TO TMP FOR LOGGING IN OUTPUT FILE. C C TRMMN --> THE MINUTE (SAME AS FOR 'TRMHR') C C KPLHLD --> A DUMMY VARIABLE FOR PLACE HOLDING ONLY. 'KPLHD' MUST NOT C BE USED IN THIS ROUTINE -- LEST YOU DESTROY VALUABLE INFO C FOR 'ZTMP'. C C MBLN --> BYTE POINTER TO THE LAST BYTE OF AN HP 307X TERMINAL MESSAGE. C C MSGBFR --> BUFFER HOLDING THE CURRENT TERMINAL MESSAGE. C C WAITC --> A FLAG FROM TMP INDICATING IF TRANS.COMPL. IS THE ONLY ALLOWED C ANSWER TO A QUESTION C C HP3077 --> LOGICAL FLAG FOR DETERMINING IF TERM IS AN HP3077 (TRUE = C TERM IS AN HP3077) C C C C******************** C * C COMMON BLOCK #3 * C * C******************** C C COMMON IFILL1(95),INBFLN,INBUFR(100) * ,IDMBF(91),ITT0,ITT,KEYN C C C C C C IFILL1--> FILLER C C INBFLN --> MAX.LENGTH IN BYTES OF INFORMATION TO BE READ FROM TERMINAL C AND PASSED TO TMP. TMP GETS THIS NUMBER FROM THE C TYPE OF INPUT DEVICE SPECIFIED IN THE TS. C C INBUFR --> BUFFER OF INFORMATION RECEIVED FROM THE 307X TERMINAL. C C IDMBF --> A DUMMY BUFFER FOR PLACE-HOLDING ONLY. (MUST NOT BE USED C IN IOM75) C C ITT0 --> SIMILAR TO ITT, BUT IT IS WORD 9 OF TS HEADER. C C ITT --> CHARACTERISTICS OF THE TRANSACTION -- IT IS WORD 10 OF THE C TS HEADER -- SEE TGP IMS FOR ITS FORMAT. USED IN TERMINAL C FEATURE CHECK AND CLOCK SETTING ON HP3077 C C******************** C * C LAST COMMON WORD * C * C******************** C C COMMON ICOMEN C C C THIS WORD NOT NEEDED IN THIS ROUTINE BUT IS NEEDED TO PRESERVE C THE TMS ENVIRONMENT. C C EQUIVALENCE (LLU(1),LU),(LLU(4),IST),(LLU(5),ITL) C C TERMINAL LOGICAL UNIT #, C I/O COMPLETION STATUS, AND C I/O TRANSMISSION LOG, RESPECTIVELY. C C EQUIVALENCE (ISTATS,ITSNAM(1)),(ITRNLG,ITSNAM(2)), * (ISFK2,ITSNAM(4)),(ISFK1,ITSNAM(3)), * (ITSNA5,ITSNAM(5)), * (LUOXX,ICOM00(1)) C C C I/O MODULE STATUS (MAINTAINED BY THIS ROUTINE), C I/O TRANSMISSION LOG (MAINTAINED BY THIS ROUTINE), C SFK-AS-INPUT-TERMINATOR WORDS (USED BY PARTS OF THIS ROUTINE C TO ENABLE/DISABLE SFK'S AS INPUT TERMINATORS -- BIT POSITION C AND CONDITION <> INDICATE ENABLE/DISABLE KEY C AS INPUT TERMINATOR.), AND C LU# OF THE TERMINAL THAT SCHEDULED TMP (USED FOR DEBUGGING). C C C LOCAL STORAGE C C C DECLARE INTGER AND LOGICAL VARIABLES C INTEGER OUTDEV,OTBFLN,OTBUFR,TRMHR,TRMMN,ERRFL * ,STATPT C LOGICAL ISBIT,ISBTW,INUM,KEY75 C C LOGICAL FUNCTIONS ABOVE C LOGICAL HP3077,WAITC C C LOGICAL VARIABLES ABOVE C DIMENSION ITEMP(20),ISASFK(3),IGRNLT(6),KBDLK(3),IMN1(2) DIMENSION KBDON(4),KARD3X(4),KARD5X(4),KBARX(4) C C 'ITEMP' IS A TEMPORARY BUFFER USED THROUGHOUT IOM75 C 'ISASFK' IS AN ESCAPE SEQUENCE THAT WILL ENABLE ALL SFK'S AS C INPUT TERMINATORS. C 'IGRNLT' IS AN ESCAPE SEQUENCE THAT WILL TURN OFF THE RED LIGHT C AND TURN ON THE GREEN LIGHT ON AN HP3077. C 'KBDLK' IS AN ESCAPE SEQUENCE THAT WILL LOCK THE KEYBOARD C BETWEEN THE TIME A SUCCESSFUL SELECTION OF A TS OCCURS C AND THE TIME THE TERMINAL IS READY TO ACCEPT AN ANSWER C TO THE FIRST QUESTION OF THE TRANSACTION. C 'IMN1' IS USED AS DUMMY INPUT TO 'KEY75' DURING TRANSACTION SELECTION C TO TELL 'KEY75' THAT ALL SFK'S ARE ENABLED IN THE TRANS. C SELECTION PROCESS (SO USER CAN SELECT A TS WITH AN SFK). C DATA ISTRQ/015536B/,IST75/015534B/,IMN1/-1,-1/ C C 'ISTRQ' ARE THE HP307X STATUS REQUEST CHARACTERS (ESC ^) C C 'IST75' ARE THE FIRST TWO CHARACTERS OF THE STATUS BYTES RE- C TURNED BY THE HP307X TERMINAL (ESC \) C C 'IMN1' USED TO TELL 'KEY75' THAT ALL SFK'S ARE ENABLED AS C INPUT TERMINATORS. C DATA ISASFK/015455B,2Hk0,2H[ / C C 'ISASFK' -- ESC.SEQ. FOR ENABLING ALL SFK'S AS INPUT TERM. C (ESC-k0[) C DATA KBDLK/015455B,2Hc0,2HK / C C 'KBDLK' -- DISABLE KEYBOARD (ESC-c0K) C DATA IRST/015505B/,IESCJ/015512B/ C C 'IRST' -- HARD RESET OF TERMINAL (ESC E) C C 'IESCJ -- CLEAR DISPLAY TERMINAL DISPLAY (ESC J) C DATA IGRNLT/015455B,2Hc1,042033B,2H-d,2H1g,2H0R/ C C 'IGRNLT' -- LIGHT GREEN LIGHT AND TURN OFF RED LIGHT ON HP3077 C (ESC-c1D ESC-d1g0R) C DATA KBDON /15455B,61461B,62061B,65400B/ DATA KARD3X/15455B,71060B,64460B,47000B/ DATA KARD5X/15455B,71060B,65060B,46000B/ DATA KBARX /15455B,73462B,61061B,41440B/ C C C BEGIN OF PROGRAM C C DEFINE THE COMMON BLOCK STRUCTURE TO TMS C CALL TMDFN(LLU,LLU,IFILL1,IFILL1,ICOMEN) C C DISPATCH ON FUNCTION CODE C C WRITE(6,11199) IFC C11199 FORMAT(" IOM75 : IFC="I3) GO TO (111,222,333,444,555,666),IFC C C SET OUTPUT DEVICE AS DISPLAY C 111 OUTDEV=IAND(OUTDEV,74004B) OUTDEV=IOR(OUTDEV,1) C C CLEAR DESTINATION BUFFER C DO 199 LL=1,5 199 ITSNAM(LL)=0 C C RESET THE TERMINAL AND THE DRIVER C CALL TMBCT(23B,170000B) ITRST=0 C C GET THE TERMINAL STATUS C 63 CALL TMBWR(ISTRQ,-2) ASSIGN 63 TO ITSNA5 64 CALL TMRD(ITEMP,-9) LABEL=64 C WRITE(1,10719) LABEL,IST,ITL,(ITEMP(IX),IX=1,(ITL+1)/2) C C --- IF LAST CHARACTER OF INPUT STRING IS CR, DECREMENT ITL. C IF(IGETB(ITEMP,ITL).EQ.15B) ITL=ITL-1 IF(ITL.LT.0) ITL=0 C C WAS THE READ COMPLETED BY AN EQT TIME-OUT?? IF SO, RE-ISSUE THE READ C IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 64 C C CHECK THE VALIDITY OF THE STATUS BYTES RECEIVED C C WRITE(1,64997) ITL,(ITEMP(IX),IX=1,(ITL+1)/2) C64997 FORMAT("++++IOM75 : ITL="@6", ITEMP="20A2) IF(ITEMP.NE.IST75 .AND. ITEMP.NE.15501B .AND. + ITEMP.NE.15502B .AND. ITEMP.NE.15504B) GO TO 1050 C C STRIP OUT THE TIME OF DAY THAT THE HP3077 PUTS IN THE STATUS C CALL STS77(ITEMP,ITL) IF(ITL.NE.5 .AND. ITL.NE.6) GO TO 1050 C C CHECK TO SEE IF THE PRINTER IS BUSY C IF(.NOT.ISBIT(ITEMP(2),13))GO TO 65 C C YES-- WAIT FOR A BIT C CALL TMPZ(60) ITRST=ITRST+1 IF(ITRST.GT.60)GO TO 65 GO TO 63 C C DO THE WAIT LOOP 60 TIMES BEFORE DOING A HARD RESET C 65 CALL TMBWR(IRST,-2) C C ENABLE ALL SPECIAL FUNCTION KEY C 75 CALL MOVEW(ISASFK,MSGBFR,3) MBLN=5 C C SET RETURN ADDR FROM GET STATUS FOR IFC=1 C ASSIGN 1060 TO IORTAD ASSIGN 1051 TO ITSNA5 C C ENTRY TO GET TERMINAL STATUS, CHECK IT AND SAVE IT C 100 CONTINUE C C MOVE STATUS REQUEST BYTES TO END OF COMMAND STRING C CALL MOVCA(ISTRQ,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 C C????????????????????????????????????????????????????????????????????? D WRITE(ICOM00,6561)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) D6561 FORMAT(" 1-IOM75 LU"I3," TMWR: LEN="I5,", MSGBFR="50A2) C????????????????????????????????????????????????????????????????????? C C C WRITE THE COMMAND STRING C 1051 CALL TMBWR(MSGBFR,-MBLN) ASSIGN 1051 TO ITSNA5 C C READ THE STATUS BYTES C 1052 CALL TMRD(ITEMP,-9) LABEL=1052 C WRITE(1,10719) LABEL,IST,ITL,(ITEMP(IX),IX=1,(ITL+1)/2) C C --- IF LAST CHARACTER OF INPUT STRING IS CR, DECREMENT ITL. C IF(IGETB(ITEMP,ITL).EQ.15B) ITL=ITL-1 IF(ITL.LT.0) ITL=0 C C WAS THE READ COMPLETED BY EQT TIME-OUT?? IF SO, RE-ISSUE READ. C IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 1052 C C????????????????????????????????????????????????????????????????????? D WRITE(ICOM00,6571)LLU(1),ITL,(ITEMP(I),I=1,(ITL+1)/2) D657 FORMAT(" /IOM75 LU"I3", ITL="@6", TERM. STATUS: "3@8) D6571 FORMAT(" 2-/IOM75 LU"I3", TERM. STATUS: "3@8) C????????????????????????????????????????????????????????????????????? C C C CHECK THE VALIDITY OF THE STATUS BYTES C C WRITE(1,64997) ITL,(ITEMP(I),I=1,(ITL+1)/2) IF(ITEMP.NE.IST75 .AND. ITEMP.NE.15501B .AND. + ITEMP.NE.15502B .AND. ITEMP.NE.15504B) GO TO 1050 C C STRIP OUT THE TIME OF DAY THE HP3077 PUTS THERE C CALL STS77(ITEMP,ITL) C WRITE(1,64997) ITL,ISTRQ IF(ITL.NE.5 .AND. ITL.NE.6) GO TO 1050 C C ISOLATE THE BYTES 4 AND 5 OF THE STATUS FOR REFORMATTING C IBYT1=IGETB(ITEMP,4) IBYT2=IGETB(ITEMP,5) C C --- ISOLATE LEFT & RIGHT-HAND MODULES OF STATUS BYTE 4. C MODLH=IAND(IBYT1,70B)/8 MODRH=IAND(IBYT1,7B) C C BEGIN REFORMATTING STATUS BYTES C ITRST=(IBYT1*256)+IBYT2 C C REFORMAT ITRST (VALUABLE INFO IN HARDWARE STATUS BYTES) TO C FOLLOWING FORMAT: C C UPPER BYTE CONTAINS FOLLOWING: C C BITS 0-2 --> PRODUCT # (0=3075,1=3076,2=3077) C BIT 3 --> 1 IF CRT PRESENT C 0 NO CRT PRESENT C BIT 4 --> 1 IF BARCODE READER PRESENT C 0 NO BARCODE READER PRESENT C BIT 5 --> 1 IF MAGSTRIPE READER PRESENT C 0 NO MAGSTRIPE READER PRESENT C BITS 6-7 --> UNUSED C C LOWER BYTE CONTAINS FOLLOWING: C C BIT 0 --> ALWAYS A ZERO C C BIT 1 --> 1 IF DISPLAY IS PRESENT (QUALIFIED BY BIT 7) C 0 IF NO DISPLAY IS PRESENT C C BIT 2 --> 1 IF KEYBOARD IS PRESENT (QUALIFIED BY BIT 6) C 0 IF NO KEYBOARD IS PRESENT C C BIT 3 --> 1 IF PRINTER PRESENT C 0 IF NO PRINTER PRESENT C C BIT 4 --> 1 IF TYPE III READER PRESENT C 0 IF NO TYPE III PRESENT C C BIT 5 --> 1 IF TYPE V READER PRESENT C 0 IF NO TYPE V PRESENT C C BIT 6 --> 1 KEYBOARD IS ALPHANUMERIC C 0 KEYBOARD IS NUMERIC ONLY C C BIT 7 --> 1 DISPLAY IS ALPHANUMERIC C 0 DISPLAY IS NUMERIC ONLY C C C ISOLATE PRODUCT # C IPROD=IAND(IGETB(ITRST,2),7B) C C DEFAULT IS 3075/3076 C ITMP=6B C C CHECK IF IT IS A 3077 C IF(IPROD.LT.2)GO TO 101 ITMP=0B HP3077=.TRUE. C C --- CHECK FOR PRINTER. C 101 IF(MODRH.EQ.1) CALL SETBT(ITMP,3,1) C C --- CHECK FOR MULTIFUNCTION READER/TYPE 3 BADGE C IF(MODLH.EQ.2) CALL SETBT(ITMP,4,1) C C --- CHECK FOR TYPE 5 BADGE READER. C IF(MODLH.EQ.4 .OR. MODRH.EQ.4) CALL SETBT(ITMP,5,1) C C --- CHECK FOR CRT. C IF(ISBIT(ITRST,3)) CALL SETBT(IPROD,3,1) C C CHECK FOR ALPHA DISPLAY C IF(ISBIT(ITRST,4))CALL SETBT(ITMP,7,1) C C SET BIT 1 IF PRODUCT IS A 3077 C IF(IPROD.GE.2)CALL SETBT(ITMP,1,1) C C CHECK FOR ALPHA KEYBOARD C IF(ISBIT(ITRST,5))CALL SETBT(ITMP,6,1) C C --- CHECK FOR MAGSTRIPE READER. C IF(MODLH.EQ.5 .OR. MODRH.EQ.5) CALL SETBT(IPROD,5,1) C C --- CHECK FOR BAR CODE READER. C IF(MODLH.EQ.6 .OR. MODRH.EQ.6) CALL SETBT(IPROD,4,1) C C PUT ITRST IN ABOVE FORMAT C ITRST=(IPROD*256)+ITMP C C GO TO RIGHT PLACE C C WRITE(1,10509) ITRST C10509 FORMAT("IOM75 : LABEL=10509, ITRST="@7) GOTO IORTAD C C THE TERMINAL IS NOT A 3075/76/77 ??? THE TERMINAL IS DOWN??? C 1050 ASSIGN 615 TO I CALL TMPER(I,31,ITSNUM,LLU,LLU,0) 615 CALL TMPZ(1000) GO TO ITSNA5 C C RETURN FOR IFC=1, AFTER THE GET TERMINAL STATUS C DECONFIGURE ALL DEVICES BUT KEYBOARD & DISPLAY C 1060 ASSIGN 1070 TO IORTAD 1065 MBLN=0 C C --- CONFIGURE DISPLAY & KEYBOARD C CALL MOVCA(KBDON,1,MSGBFR,1,7) MBLN=7 C C --- CONFIGURE CARD READER. C IF(.NOT.ISBIT(ITRST,4)) GO TO 1066 KARD3=30562B CALL MOVCA(KARD3,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 KARD3=1 C C --- CONFIGURE BADGE V. C 1066 IF(.NOT.ISBIT(ITRST,5)) GO TO 1067 KARD5=30542B CALL MOVCA(KARD5,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 KARD5=1 C C --- CONFIGURE BAR CODE READER. C 1067 IF(.NOT.ISBIT(ITRST,12)) GO TO 1068 KBAR=30567B CALL MOVCA(KBAR,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 KBAR=1 C C --- CONFIGURE MAGSTRIPE. C 1068 IF(.NOT.ISBIT(ITRST,13)) GO TO 10690 KMAG=30555B CALL MOVCA(KMAG,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 C C --- IF TERMINAL HAS PRINTER, DISABLE IT. C 10690 IF(.NOT.ISBIT(ITRST,3)) GO TO 1069 KPRT=30160B CALL MOVCA(KPRT,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 C C --- MAKE LAST CHARACTER, UPPERCASE. C 1069 CALL PUTCA(MSGBFR,IGET1(MSGBFR,MBLN)-20000B,MBLN) C C --- IF CARD READER WAS CONFIGURED, SET IT TO A.H.NC C IF(KARD3.NE.1) GO TO 10691 CALL MOVCA(KARD3X,1,MSGBFR,MBLN+1,7) MBLN=MBLN+7 C C --- IF BADGE 5 WAS CONFIGURED, SET IT TO NUMERIC. C 10691 IF(KARD5.NE.1) GO TO 10692 CALL MOVCA(KARD5X,1,MSGBFR,MBLN+1,7) MBLN=MBLN+7 C C --- IF BAR CODE WAS CONFIGURED, SET IT TO CODE 39, CK DIGIT ON. C 10692 IF(KBAR.NE.1) GO TO 10693 CALL MOVCA(KBARX,1,MSGBFR,MBLN+1,7) MBLN=MBLN+7 C WRITE(ICOM00,64999) IDEV,ITRST,MBLN,MSGBFR C64999 FORMAT(" 2.1-IOM75, IDEV="@7", ITRST="@7", MBLN="@7", MSGBFR=" C . 50A2) C64998 FORMAT(" 2.2-IOM75, IDEV="@7", ITRST="@7", MBLN="@7", MSGBFR=" C . 50A2) C WRITE(ICOM00,64998) IDEV,ITRST,MBLN,MSGBFR C C LIGHT TS# [-SC] LIGHT C 10693 LITE2=15 GOTO 1121 C C GO TO PRINT THE MESSAGE IF ANY, LIGHT THE LIGHT AND RETURN C AT THE FOLLOWING LINE C C THE MESSAGE FOR THE DISPLAY, FROM ZTMP IS TO OUTPUT ONLY ONCE. C 1070 OTBFLN=0 LITE1=0 C C DO THE WRITE C C C????????????????????????????????????????????????????????????????????? D WRITE(ICOM00,6562)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) D6562 FORMAT(" 3-IOM75 LU"I3," TMWR: LEN="I5", MSGBFR="50A2) C????????????????????????????????????????????????????????????????????? C CALL TMWR(MSGBFR,-MBLN) C C READ THE TS-SC C 1071 CALL TMRD(ITEMP,-20,4B) C C --- LEFT JUSTIFY INPUT STRING. C CALL JUSTF(ITEMP,1,20,1) LABEL=1071 C WRITE(1,10719) LABEL,IST,ITL,(ITEMP(IX),IX=1,(ITL+1)/2) C C --- IF LAST CHARACTER OF INPUT STRING IS CR, DECREMENT ITL. C IF(IGETB(ITEMP,ITL).EQ.15B) ITL=ITL-1 IF(ITL.LT.0) ITL=0 C10719 FORMAT("TMRD: LABEL="I5", IST="@6", ITL="@6", ITEMP="10@7) C C --- IF LAST CHAR IS CR, DECREMENT ITL. C IF(IGETB(ITEMP,ITL).EQ.15B) ITL=ITL-1 C C WAS THE READ COMPLETED BY EQT TIME-OUT?? IF SO, RE-ISSUE READ. C IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 1071 C C --- DISABLE ALL DEVICES TO PREVENT FURTHER INPUT. C MBLN=0 IDEV=0 CALL DEV75(ITRST,IDEV,MSGBFR,MBLN,OUTDEV,ERRFL,KEYN) CALL TMBWR(MSGBFR,-MBLN) C C C C INIT SC C ITSNA5=0 C C GET TS# FROM LAST CHAR IN INPUT BUFFER -- USER PUSHES SFK C IF(KEY75(ITSSPC,IMN1,ITEMP,ITL)) * CALL TMPER(0,99,ITSNUM,LLU,322,ITSSPC) C C IF USER PUSH ATT -- RESET & TRY AGAIN C IF(ITSSPC.GE.128)GO TO 111 C C USER INPUTS GARBAGE -- GENERATE ERR C IF(ITSSPC.GT.0.AND.ITL.NE.0)GO TO 200 C C A GOOD TS# HAS BEEN OBTAINED C IF(ITSSPC.GT.0)GO TO 300 C C USER PUSHES ONLY ENTER KEY C IF(ITL.EQ.0)GO TO 200 C C SCAN FOR A "-", IF PRESENT, THEN USER INPUTS TS#-SC C DO 170 ITT=1,ITL IF(IGET1(ITEMP,ITT).EQ.1H-)GO TO 175 170 CONTINUE 175 CONTINUE C C CONVERT TS# TO NUMERIC C IF(INUM(ITEMP,1,ITT-1,ITSSPC))GO TO 200 C C IS TS# BETWEEN 0 AND 9999? IF NOT GENERATE ERR C IF(ISBTW(ITSSPC,0,9999))GO TO 200 C C CHECK TO SEE IF HAVE TO CONVERT SC TO NUMERIC ALSO C IF(ITT-1.GE.ITL)GO TO 300 C C CONVERT SC TO NUMERIC C 190 IF(INUM(ITEMP,ITT+1,ITL-ITT,I))GO TO 200 IF(FLOAT(I).LT.-32767. .OR. FLOAT(I).GT.32767.) GOTO 200 ITSNA5=I C C A GOOD SET OF NUMBERS -- PUT IN A FROM COMPATIBLE WITH TMP C 300 ITSNAM=100000B ITSNAM(4)=ITSSPC RETURN C C OBVIOUS ERROR DETECTED BY THE I/O MODULE. C 200 LITE1=128 GOTO 1060 C C ENTRY POINT FOR GENERATING STRING FOR THE DISPLAY/LIGHT/... C C C CHECK FOR DISPLAY -- IF REQUIRED MOVE "ESC J" TO FRONT OF BUFFER C 1121 IF(.NOT.ISBIT(OUTDEV,0))GO TO 1127 C CALL MOVCA(IESCJ,1,MSGBFR,MBLN+1,2) C MBLN=MBLN+2 C C MOVE OUTPUT STRING (IF EXISTS) PROVIDED BY ZTMP INTO TERMINAL MESSAGE BFR. C C1127 WRITE(1,11279) OTBFLN,OTBFLN C11279 FORMAT("IOM75 AFTER 1127 : OTBFLN="I6", OTBFLN="@6) 1127 IF(OTBFLN.EQ.0) GO TO 1128 CALL MOVCA(OTBUFR,1,MSGBFR,MBLN+1,OTBFLN) MBLN=MBLN+OTBFLN+1 CALL PUTCA(MSGBFR,6400B,MBLN) C C GENERATE LIGHT STRING ONLY IF OUTPUT TO NUMERIC DISPLAY IS SPECIFIED. C 1128 IF(IAND(OUTDEV,11B).EQ.1) CALL LIT75(ITRST,LITE1,LITE2,LITE3 . ,MSGBFR,MBLN,OUTDEV) GOTO IORTAD C C********************************************************************* C C C FUNCTION CODE #2 -- READ SECURITY CODE WITHOUT ECHO C C C GO UPDATE DISPLAY C 222 ASSIGN 2225 TO IORTAD GOTO 1065 C C RETURN FROM THE LIGHT/MESSAGE GENERATOR C C DISABLE THE DISPLAY C 2225 CALL DEV75(ITRST,4B,MSGBFR,MBLN,OUTDEV,ERRFL,KEYN) C C WRITE STRING C C C????????????????????????????????????????????????????????????????????? D WRITE(ICOM00,656)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) C????????????????????????????????????????????????????????????????????? C CALL TMBWR(MSGBFR,-MBLN) C C READ THE SECURITY CODE C 2226 CALL TMRD(ITEMP,-20) LABEL=2226 C WRITE(1,10719) LABEL,IST,ITL,(ITEMP(IX),IX=1,(ITL+1)/2) C C --- IF LAST CHARACTER OF INPUT STRING IS CR, DECREMENT ITL. C IF(IGETB(ITEMP,ITL).EQ.15B) ITL=ITL-1 IF(ITL.LT.0) ITL=0 C C WAS READ COMPLETED BY EQT TIME-OUT?? IF SO, RE-ISSUE READ. C IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 2226 C C DISABLE THE KEYBOARD TO PREVENT FURTHER INPUT C CALL TMBWR(KBDLK,-5) C C CHECK FOR ATT -- IF ATT, THEN DO ENTIRE FUNCTION AGAIN C IKTMP=ITL IF(KEY75(KEYNO,ISFK1,ITEMP,IKTMP)) * CALL TMPER(0,99,ITSNUM,LLU,322,KEYNO) IF(KEYNO.EQ.0 .AND. ITL.NE.0)GO TO 2241 C C THE USER USE A SFK OR ATT, RESTART IFC=1 C OTBFLN=0 LITE1=0 GO TO 111 C C CONVERT SECURITY CODE TO DECIMAL -- IF CONVERSION ERR, DO AGAIN C 2241 IF(INUM(ITEMP,1,ITL,I))GO TO 1065 IF(FLOAT(I).LT.-32767. .OR. FLOAT(I).GT.32767.)GO TO 1065 ITSNA5=I RETURN C C********************************************************************* C C C FUNCTION CODE # 3 -- TERMINAL FEATURE CHECK C C C CHECK FEATURES REQUIRED WITH FEATURES OF TERMINAL C 333 ISTATS=0 C C ISOLATE PRODUCT NUMBER FROM TERM. STATUS C IPROD=IAND(IGETB(ITRST,1),7B) C WRITE(6,33399) IPROD,ISTATS C33399 FORMAT(" IOM75 : IPROD="@7", ISTATS="@7) C C IF TIME REPORTING REQUESTED BUT TERM NOT A 3077 --> ERROR C IF(IPROD.LT.2.AND.ISBIT(ITT,10))ISTATS=1 C WRITE(6,33398) ISTATS C33398 FORMAT(" IOM75 : ISTATS="@7) C C IF TERM IS 3077 BUT TIME REPORTING NOT REQUESTED --> ERROR C IF(IPROD.EQ.2.AND.(.NOT.ISBIT(ITT,10)))ISTATS=1 C WRITE(6,33398) ISTATS C C CHECK REST OF FEATURES (SEE TGP IMS FOR WORD FORMAT) C (PRT,BG3,BG5,AKB,ADS) DO 335 I=3,7 335 IF(ISBIT(ITT,I).AND.(.NOT.ISBIT(ITRST,I)))ISTATS=1 C WRITE(6,33398) ISTATS C C --- (CRT,MSR,WND) C DO 336 I=1,3 IF(ISBIT(ITT0,I-1).AND.(.NOT.ISBIT(ITRST,I+10))) ISTATS=1 336 CONTINUE C WRITE(6,33398) ISTATS C C CHECK FOR MORE PROMPTING LIGHTS USED THAN THE TERMINAL HAS!!!!!!!! C IF(IGETB(INBUFR,2).GT.14)ISTATS=1 C WRITE(6,33699) IPROD,ITT,ITT0,ITRST,INBUFR,ISTATS C33699 FORMAT(" IOM75 : "6@7) RETURN C C C********************************************************************** C C C FUNCTION CODE #4 -- RESET THE TERMINAL AND THEN C ENABLE/DISABLE SFK'S AS REQUIRED BY TGP WORDS C C 444 IF(HP3077)RETURN CALL TMBWR(IRST,1) C C SET RETURN ADDRESS IN CASE TERM. IS DOWN C ASSIGN 444 TO ITSNA5 C C GENERATE SFK STRING C ASSIGN 4446 TO IORTAD CALL SFK75(ITRST,ISFK1,ISFK2,MSGBFR,MBLN) C C WRITE STRING TO TERMINAL AND GET THE TERMINAL STATUS C GOTO 100 C C RETURN FROM THE RESET/GET TERMINAL STATUS SECTION C 4446 CONTINUE IF(ISBIT(IST,4))GO TO 444 RETURN C C********************************************************************* C C FUNCTION CODE #5 -- WRITE, READ, AND WRITE/READ C C CHECK POWERFAIL BIT C 555 CONTINUE IF(.NOT.ISBIT(OUTDEV,15))GO TO 5555 C C SET RETURN ADDRESS IN CASE TERMINAL IS DOWN C ASSIGN 555 TO ITSNA5 C C RESET THE TERMINAL IF NECESSARY C CALL SETBT(OUTDEV,15,0) 5552 CALL TMBWR(IRST,1) 5553 ASSIGN 5555 TO IORTAD CALL SFK75(ITRST,ISFK1,ISFK2,MSGBFR,MBLN) GO TO 100 C C CHECK TO SEE THAT AT LEAST ONE BUFFER LENGTH IS POSITIVE C IF NOT, THEN ERROR!!! C 5555 CONTINUE C C????????????????????????????????????????????????????????????????????? D WRITE(ICOM00,6566)IFC,INPDEV,INBFLN,OUTDEV,OTBFLN D6566 FORMAT(1X,"/IOM75: IFC=",I2," INPDEV=",@8," INBFLN=",I3, D *" OUTDEV=",@8," OTBFLN=",I3) C WRITE(1,65669) OUTDEV,INPDEV,ITSNAM,OTBFLN,OTBUFR C65669 FORMAT("***** IOM75 AFTER 5555="4@7,30A2) C????????????????????????????????????????????????????????????????????? C IF(OTBFLN.GT.0.OR.LITE1.NE.0.OR.LITE2.NE.0.OR.LITE3.NE.0)GO TO 590 IF((LITE1+LITE2+LITE3) .EQ. 0) GO TO 590 IF(INBFLN.GT.0)GO TO 580 C C GASP!!! BOTH BUFFER LENGTHS ARE ZERO AND POWERFAIL BIT IS CLEAR!! C C 5556 CALL TMPER(0,99,ITSNUM,LLU,320,OTBFLN) C C PERFORM THE OUTPUT SECTION OF IFC=5 C 590 MBLN=0 C C CHECK FOR HP 3077 AND WAITING FOR TC, IF TRUE THEN GEN. TC C IF(HP3077.AND.WAITC) GO TO 580 C C ENABLE APPROPRIATE OUTPUT DEVICE C IF(OUTDEV.EQ.0)CALL TMPER(0,99,ITSNUM,LLU,321,OUTDEV) C C CONSTRUCT APPROPRIATE COMMAND WORD FOR 'DEV75'