FTN4 SUBROUTINE IOM75, 92903-16570 REV.1913 790302 C C C SOURCE FILE: &IOM75 P/N 92903-18570 C RELOC. FILE: %IOM75 P/N 92903-16570 C C C PMGR: STEVE WITTEN, C DATA SYSTEMS DIVISION, C CUPERTINO, CALIFORNIA C C C ************************************************************** C * * C * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. 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(24),IFC,IORTAD,ITRST,ITSNUM(2),ITIM(6),LITE1,LITE2 * ,OUTDEV,INPDEV,ITSNAM(5),OTBFLN,OTBUFR(40) C C LLU --> ARRAY OF 24 WORDS 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. C C LITE2 --> THE HI AND LO BYTES CONTAIN THE LOGICAL NUMBERS OF PROMPTING C LIGHTS TO BE LIT. 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******************** C * C COMMON BLOCK #3 * C * C******************** C C COMMON IFIL1(85 ),INBFLN,INBUFR(100) C C C IFIL1 --> ARRAY OF 85 WORDS NEEDED BY TMP. THIS ROUTINE NEEDS NONE OF C THESE WORDS. 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 TRANS.SPEC. C C INBUFR --> BUFFER OF INFORMATION GOTTEN FROM THE 307X TERMINAL. 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 LOGICAL ISBIT,ISBTW,INUM,KEY75 DIMENSION MSGBFR(50),ITEMP(10),ISASFK(3),IMN1(2) DATA ISTRQ/015536B/,IST75/015534B/,IMN1/177777B,177777B/ DATA I32768/100000B/,ISASFK/015455B,2Hk0,2H[ / DATA IRST/015505B/ C C BEGIN OF PROGRAM C C DISPATCH ON FUNCTION CODE C CALL TMDFN(LLU,LLU,IFIL1,IFIL1,ICOMEN) GO TO (111,222,333,444,555),IFC C C SET OUTPUT DEVICE AS DISPLAY C 111 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 63 CALL TMBWR(ISTRQ,-2) 64 CALL TMRD(ITEMP,-6) IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 64 IF(ITEMP.NE.IST75)GO TO 1050 IF(ITL.NE.5)GO TO 1050 IF(.NOT.ISBIT(ITEMP(2),13))GO TO 65 CALL TMPZ(50) ITRST=ITRST+1 IF(ITRST.GT.60)GO TO 65 GO TO 63 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 CALL MOVCA(ISTRQ,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 D WRITE(ICOM00,656)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) 1051 CALL TMBWR(MSGBFR,-MBLN) 1052 CALL TMRD(ITEMP,-6) IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 1052 D WRITE(ICOM00,657)LLU(1),(ITEMP(I),I=1,3) D657 FORMAT(" /IOM75 LU"I3", TERM. STATUS: "3@8) IF(ITEMP(1).NE.IST75)GO TO 1050 IF(ITL.NE.5)GO TO 1050 IBYT1=IGETB(ITEMP,4) IBYT2=IGETB(ITEMP,5) 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 BITS 3-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.GE.2)ITMP=0B C C CHECK FOR TYPE V C IF(ISBIT(ITRST,13).OR.ISBIT(ITRST,10))CALL SETBT(ITMP,5,1) C C CHECK FOR TYPE III C IF(ISBIT(ITRST,12).OR.ISBIT(ITRST,9))CALL SETBT(ITMP,4,1) C C CHECK FOR PRINTER C IF(ISBIT(ITRST,11).OR.ISBIT(ITRST,8))CALL SETBT(ITMP,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 PUT ITRST IN ABOVE FORMAT C ITRST=(IPROD*256)+ITMP C C GO TO RIGHT PLACE C 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(3000) 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 AND KEYBOARD -- DECONFIGURE ALL OTHER DEVS. C IDEV=6B CALL DEV75(ITRST,IDEV,MSGBFR,MBLN) C C LIGHT TS# [-SC] LIGHT C 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 D WRITE(ICOM00,656)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) CALL TMWR(MSGBFR,-MBLN) C C READ THE TS-SC C 1071 CALL TMRD(ITEMP,-20,4B) IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 1071 C C INIT SC C ITSNA5=0 C C GET TS# FROM LAST CHAR IN INPUT BUFFER -- USER PUSHES SFK C IF(KEY75(LIGNUM,IMN1,ITEMP,ITL)) * CALL TMPER(0,99,ITSNUM,LLU,322,LIGNUM) C C IF USER PUSH ATT -- RESET & TRY AGAIN C IF(LIGNUM.GE.128)GO TO 111 C C USER INPUTS GARBAGE -- GENERATE ERR C IF(LIGNUM.GT.0.AND.ITL.NE.0)GO TO 200 C C A GOOD TS# HAS BEEN OBTAINED C IF(LIGNUM.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,LIGNUM))GO TO 200 C C IS TS# BETWEEN 0 AND 9999? IF NOT GENERATE ERR C IF(ISBTW(LIGNUM,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=I32768 ITSNAM(4)=LIGNUM 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 CALL MOVCA(015512B,1,MSGBFR,MBLN+1,2) MBLN=MBLN+2 1127 CALL MOVCA(OTBUFR,1,MSGBFR,MBLN+1,OTBFLN) MBLN=MBLN+OTBFLN+1 CALL PUTCA(MSGBFR,6400B,MBLN) C C GENERATE LIGHT STRING C IF(ISBIT(OUTDEV,0))CALL LIT75(LITE1,LITE2,MSGBFR,MBLN) 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) C C WRITE STRING C D WRITE(ICOM00,656)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) CALL TMBWR(MSGBFR,-MBLN) C C READ THE SECURITY CODE C 2226 CALL TMRD(ITEMP,-20) IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 2226 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 SAVE REQUIRED FEATURES WORD FROM INPUT BUFFER C 333 ICHEK=INBUFR(1) ISTATS=0 DO 335 I=3,7 335 IF(ISBIT(ICHEK,I).AND.(.NOT.ISBIT(ITRST,I)))ISTATS=1 RETURN 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 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,7))CALL TMPER(0,99,ITSNUM,LLU,324,IST) 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 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################################################################# 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################################################################# IF(OTBFLN.GT.0.OR.LITE1.NE.0.OR.LITE2.NE.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 CWHAT DO I DO???@ C 5556 CALL TMPER(0,99,ITSNUM,LLU,320,OTBFLN) C C PERFORM THE OUTPUT SECTION OF IFC=5 C 590 IF(OUTDEV.EQ.0)CALL TMPER(0,99,ITSNUM,LLU,321,OUTDEV) IDEV=0B IF(ISBIT(OUTDEV,0))CALL SETBT(IDEV,1,1) IF(ISBIT(OUTDEV,1))CALL SETBT(IDEV,3,1) C C BUILD APPROPRIATE COMMAND STRING C MBLN=0 CALL DEV75(ITRST,IDEV,MSGBFR,MBLN) C C GO BUILD THE STRING FOR MESSAGE AND LIGHTS AND THEN RETURN HERE C ASSIGN 580 TO IORTAD GO TO 1121 C C RETURN FROM MSG.GENERATE IS HERE C C C CHECK TO SEE IF AN INPUT IS NEEDED C 580 IF(INBFLN.GT.0)GO TO 583 C################################################################## D WRITE(ICOM00,656)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) D656 FORMAT(" IOM75 LU"I3," TMWR: LEN=mY"I5,2(/50A2)) C################################################################## CALL TMWR(MSGBFR,-MBLN) ISTATS=0 IF(ISBIT(IST,7))CALL TMPER(0,99,ITSNUM,LLU,324,IST) IF(ISBIT(IST,4))GO TO 5882 RETURN C C READ SECTION OF THE IFC=5 C C SET UP ESC SEQUENCE TO CNFG INPUT DEVICE C 583 CALL RST75(ITRST,INPDEV,MSGBFR,MBLN,INBFLN,IER) IF(IER.GT.0) GOTO 581 D WRITE(ICOM00,656)LLU(1),MBLN,(MSGBFR(I),I=1,(MBLN+1)/2) CALL TMWR (MSGBFR,-MBLN) ISTATS=0 IF(ISBIT(IST,7))CALL TMPER(0,99,ITSNUM,LLU,324,IST) IF(ISBIT(IST,4))GO TO 5882 I=2 IF(IAND(IALF2(LITE2),377B) .EQ. 128) I=I+20 CALL LOGEV(ICOM00(2),LLU,I,MBLN,ITSNUM,ITIM) 584 CALL TMRD(INBUFR,-INBFLN) IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 584 CALL LOGEV(ICOM00(2),LLU,3,ITL,ITSNUM,ITIM) C C RETRIEVE THE KEY# OF KEY THAT COMPLETED READ (IF A KEY DID) C OR PICK UP RVI IF PRINTER OUT OF PAPER C ITRNLG=ITL IF(KEY75(ISTATS,ISFK1,INBUFR,ITRNLG)) * CALL TMPER(0,99,ITSNUM,LLU,322,ISTATS) C C IF ISTATS=128 (ATT KEY),CHECK TO SEE IF PRINTER IS BUSY C C IF(ISTATS.EQ.128)GO TO 5888 C SCAN FOR NON-TERMINATING SFK'S IN BUFFER C 607 CALL SCN75(INBUFR,ITRNLG) RETURN C C ERROR!! NON-EXISTENT DEVICE C 581 CALL TMPER(0,99,ITSNUM,LLU,323,OUTDEV) C C AN RVI (REVERSE INTERRUPT) HAS BEEN SENT BY THE TERMINAL-- C CHECK THE CONDITION OF THE PRINTER. IF THE PRINTER IS C BUSY, WAIT 5 SEC. BEFORE RESETTING AND REISSUING THEL C THE LAST WRITE -- IF THE PRINTER IS NOT BUSY JUST RESET AND WRITE C 5882 ITSNA5=0 ASSIGN 5888 TO IORTAD 5885 IF(ITSNA5.EQ.0) CALL TMPER(IORTAD,30,ITSNUM,LLU,LLU,0) 5888 CALL TMBWR(ISTRQ,-2) 587 CALL TMRD(ITEMP,-6) IF(.NOT.ISBIT(IST,5).AND.ITL.EQ.0)GO TO 587 IF(.NOT.ISBIT(ITEMP(2),8))GO TO 5886 CALL TMPZ(50) ITSNA5=ITSNA5+1 IF(ITSNA5 .GT. 60) ITSNA5=0 GO TO 5885 C C RVI WAS NOT FROM PRINTER OUT OF PAPER C 5886 IF(ISTATS.EQ.0)GO TO 5555 IF(ISTATS.EQ.128)GO TO 607 CALL TMPER(0,99,ITSNUM,LLU,325,ISTATS) END SUBROUTINE DEV75(ITRST,IDEV,IBF,IBFL) *, 92903-16570 REV.1913 790109 INTEGER ZERO,ONE,IESC(2),TEMP,IHOLD(5) LOGICAL ISBIT,ISBTW DATA IESC/015455B,061400B/,ZERO/030000B/,ONE/030400B/ DATA IHOLD/062000B,065400B,070000B,071000B,061000B/ IRSHFT(M1)=M1/256 C C MOVE "ESC - c" TO END OF BUFFER & BUMP POINTER C CALL MOVCA(IESC,1,IBF,IBFL+1,3) IBFL=IBFL+3 C C BEGIN PARSING IDEV & ITRST -- ASSUME DISPLAY AND KEYBOARD ARE C ALWAYS THERE (THIS ASSUMPTION WILL HAVE TO CHANGE FOR HP3077A). C DO 1 I=1,5 ITMP=ZERO+IRSHFT(IHOLD(I)) IF(ISBIT(IDEV,I))ITMP=ONE+IRSHFT(IHOLD(I)) IF(ISBIT(ITRST,I))GO TO 7 GO TO 1 7 CALL MOVCA(ITMP,1,IBF,IBFL+1,2) IBFL=IBFL+2 1 CONTINUE C C MAKE THE LAST CHAR. AN UPPER-CASE C CALL PUTCA(IBF,IGET1(IBF,IBFL)-20000B,IBFL) RETURN END LOGICAL FUNCTION KEY75(KEYNO,ISFK,INBF,ITLOG) *, 92903-16570 REV.1913 790123 C C THIS FUNCTION RETURNS AN INTEGER FROM 0 TO 27 CORRESPONDING TO C THE 28 SFK'S ON THE HP 3075/76/77 KEYBOARD. C C C ISFK --> ARRAY CONTAINING THE SFK TERMINATOR BITS FROM TGP C C INBF --> ARRAY CONTAINING INFORMATION READ FROM THE TERMINAL C C ITLOG --> THE DVR07 TRANSMISSION LOG C C KEYNO --> THE RETURNED INTEGER CODE FOR THE KEY PRESSED C C N.B. 0="ENTER" KEY C 1...26="SFK#1"..."SFK#26" C 128="BREAK" KEY C C SRCHTB IS A SEARCH TABLE CONTAINING THE CHARACTER CODES C FOR THE SPECIAL FUNCTION KEYS. C C DIMENSION INBF(1),ISFK(1) LOGICAL ISBIT,ISBTW INTEGER SRCHTB(26) DATA SRCHTB/ 000161B,000162B,000163B,000164B,000165B, * 000166B, * 000167B,000170B,000171B,000172B,000141B,000142B, * 000143B, * 000144B,000145B,000146B,000147B,000150B,000151B, * 000152B,000153B,000154B,000155B,000156B,000157B, * 000160B/ C C INITIALIZE FUNCTION VALUE TO ZERO (I.E. "ENTER" KEY IS DEFAULT) C KEY75=.FALSE. KEYNO=0 C C ISOLATE LAST BYTE OF INPUT BUFFER C LSTCHR=IGETB(INBF,ITLOG) C C CHECK FOR BREAK KEY C IF(LSTCHR.EQ.000030B)GO TO 997 C C CHECK TO SEE IF LAST CHAR IS CR (DENOTING "ENTER" KEY) C IF(ISBTW(LSTCHR,141B,172B))RETURN C C IT IS A VALID SFK -- FIND SUBRANGE (1-16 OR 17-26) C IF(.NOT.ISBTW(LSTCHR,147B,160B))GO TO 32 C C IT IS Q-Z C L=1 M=16 J=1 GO TO 26 C C IT IS A-P C 32 L=17 M=26 J=2 C C DO TABLE SEARCH C 26 DO 25 I=L,M IF(LSTCHR.NE.SRCHTB(I))GO TO 25 IF(ISBIT(ISFK(J),I-L))GO TO 998 RETURN 25 CONTINUE C C SHOULD NEVER GET HERE C KEY75=.TRUE. KEYNO=LSTCHR RETURN C C AN SFK C 998 KEYNO=I ITLOG=ITLOG-1 RETURN C C "BREAK" KEY C 997 KEYNO=128 ITLOG=0 RETURN END SUBROUTINE SFK75(ITRST,ISFK1,ISFK2,IWRD,IWRDL) *, 92903-16570 REV.1913 790109 DIMENSION IWRD(1) LOGICAL ISBIT IWRD(1)=015455B IWRD(2)=065460B DO 28 I=3,12 J=(I+110)*256+60B 28 IWRD(I)=J DO 29 I=13,28 J=(I+84)*256+60B 29 IWRD(I)=J DO 25 I=2,17 IF(.NOT.ISBIT(ISFK1,I-2))IWRD(I)=IWRD(I)+1B 25 CONTINUE DO 26 I=18,27 IF(.NOT.ISBIT(ISFK2,I-18))IWRD(I)=IWRD(I)+1B 26 CONTINUE IWRDL=23 IF(ISBIT(ITRST,6))IWRDL=55 CALL PUTCA(IWRD,IGET1(IWRD,IWRDL)-20000B,IWRDL) RETURN END SUBROUTINE LIT75(LITE1,LITE2,IWORD,IWRDLN) *, 92903-16570 REV.1913 790109 C C SUBROUTINE TO GENERATE ESCAPE SEQUENCES TO PERFORM THE FOLLOWING: C C A) CLEAR ALL THE DISPLAY LIGHTS AND C C B) LIGHT UP THE LIGHTS WHOSE FOUR LOGICAL NUMBERS ARE IN C THE BYTES OF LITE1 AND LITE2. C C IWORD IS A BUFFER OF IWRDLN CHARACTERS CONTAINING THE COMMAND STRING C C ICLR IS A COMMAND STRING FOR CLEARING ALL THE PROMPTING LIGHTS C C SRCHLC IS A SEARCH TABLE OF LOWER-CASE CHARACTERS C C N.B. UPPER-CASE CHARACTER(I)=SRCHLC(I)-020000B (I=2,3,...17) C C LOGICAL ISBIT DIMENSION IWORD(1),IBYT(4),ICLR(5) INTEGER SRCHLC(17),ONE C C INITIALIZE LOCAL DATA C DATA ICLR/015455B,062060B,075400B/,ONE/030400B/ DATA SRCHLC/060000B,060400B,061000B,061400B,062000B,062400B, * 063000B,063400B,064000B,064400B,065000B,065400B, * 066000B,066400B,067000B,067400B,070000B/ C C ISOLATE LIGHT NUMBERS C IBYT(1)=IGETB(LITE1,1) IBYT(2)=IGETB(LITE1,2) IBYT(3)=IGETB(LITE2,1) IBYT(4)=IGETB(LITE2,2) C C PUT "CLEAR ALL LIGHTS" COMMAND AT HEAD OF COMMAND STRING C CALL MOVCA(ICLR,1,IWORD,IWRDLN+1,5) IWRDLN=IWRDLN+5 C C DECODE LIGHTS AND BUILD REST OF COMMAND C DO 27 I=1,4 IF(IBYT(I).EQ.0)GO TO 27 IF(IBYT(I).EQ.128)GO TO 110 IF(IBYT(I).EQ.129)GO TO 111 IF(IBYT(I).GE.6.AND.IBYT(I).LE.10)GO TO 112 IF(IBYT(I).GE.11.AND.IBYT(I).LE.15)IBYT(I)=IBYT(I)+2 GO TO 113 110 IBYT(I)=6 GO TO 113 111 IBYT(I)=12 GO TO 113 112 IBYT(I)=IBYT(I)+1 113 CONTINUE C C C IBYT(I) IS THE LOCATION IN THE SEARCH TABLE FOR THE APPROPRIATE C COMMAND CHARACTER C CALL PUTCA(IWORD,ONE,IWRDLN+1) IWRDLN=IWRDLN+1 CALL PUTCA(IWORD,SRCHLC(IBYT(I)),IWRDLN+1) IWRDLN=IWRDLN+1 27 CONTINUE CALL PUTCA(IWORD,IGET1(IWORD,IWRDLN)-20000B,IWRDLN) C C ALL DONE -- RETURN NOW C RETURN END SUBROUTINE RST75(ITRST,INPDEV,MSGBFR,MBLN,INBFLN,IER) *, 92903-16570 REV.1913 790109 DIMENSION MSGBFR(1),ITMP(6) LOGICAL ISBIT IER=0 ITMP1=0 INLOW=IGETB(INPDEV,2) INLOW=INLOW+1 GO TO(2,3,5,6),INLOW 6 IER=1 RETURN 2 CALL SETBT(ITMP1,1,1) CALL SETBT(ITMP1,2,1) INBFLN=20 GO TO 7 3 CALL SETBT(ITMP1,4,1) INBFLN=82 GO TO 7 5 CALL SETBT(ITMP1,5,1) INBFLN=22 7 CALL MOVCA(015455B,1,MSGBFR,MBLN+1,2) GO TO(9,10,11),INLOW C-----GENERATE THE CONFIGURE INPUT DEVICE STRING BEFORE EXIT. 9 CALL DEV75(ITRST,ITMP1,MSGBFR,MBLN) RETURN C C-----GENERATE THE STRING TO CONFIGURE THE MODE ON THE INPUT PERIPHERAL C 10 MBLN=MBLN+2 ITMP(1)=071060B IF(.NOT.ISBIT(INPDEV,14))ITMP(1)=ITMP(1)+1B ITMP(2)=067060B IF(ISBIT(INPDEV,13).AND.ISBIT(INPDEV,12))ITMP(2)=060460B IF(.NOT.ISBIT(INPDEV,13).AND.ISBIT(INPDEV,12))ITMP(2)=67460B IF(ISBIT(INPDEV,15))ITMP(2)=ITMP(2)+1B ITMP(3)=064460B ITMP(4)=061460B ITMP(5)=046400B IBFL=9 GO TO 12 11 MBLN=MBLN+2 ITMP(1)=071060B IF(.NOT.ISBIT(INPDEV,15))ITMP(1)=ITMP(1)+1B ITMP(2)=065060B ITMP(3)=046000B IBFL=5 12 CALL MOVCA(ITMP,1,MSGBFR,MBLN+1,IBFL) MBLN=MBLN+IBFL GO TO 9 END SUBROUTINE SCN75(INPUT,INLEN), 92903-16570 REV.1913 790109 LOGICAL ISBTW INTEGER A,Q,Z,INPUT(1) DATA A/141B/,Q/161B/,IK/153B/,Z/172B/ L=IK-A M=Q+L N=Z+L IQ=A-M DO 45 I=1,INLEN K=IGETB(INPUT,I) IF(ISBTW(K,A,Z))GO TO 45 K=K+L IF(.NOT.ISBTW(K,M,N))K=K+IQ CALL PUTCA(INPUT,K*256,I) 45 CONTINUE RETURN END END$