FTN4,L SUBROUTINE GPRIO(IUNIT,IFUNC,RDATA),09580-16316 REV.2013 800131 C C THIS DEVICE SUBROUTINE IS USED TO PROGRAM THE 12566-60024 C MICROCIRCUIT CARD. C C**************************************** C C RELOCATABLE 09580-16316 C SOURCE 09580-18316 C C REY UNTALAN C BOB RICHARDS 790502 C BOB RICHARDS 790517 C BOB RICHARDS 791023 C MILT NOGUCHI 791227 C YOSH MIYAKO 800129 C BOB RICHARDS 800131 C C C !=================================================! C ! ! C ! (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980 ! C ! ALL RIGHTS RESERVED ! C ! ! C ! NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, ! C ! REPRODUCED OR TRANSLATED INTO ANOTHER PROGRAM ! C ! LANGUAGE WITHOUT THE PRIOR WRITTEN CONSENT OF ! C ! THE HEWLETT-PACKARD COMPANY. ! C ! ! C !-------------------------------------------------! C ! ! C ! TEST SYSTEM SOURCE SOFTWARE IS THE PROPRIETARY ! C ! MATERIAL OF THE HEWLETT-PACKARD COMPANY. ! C ! ! C ! THIS SOURCE DATA SHALL BE USED SOLELY IN ! C ! CONJUNCTION WITH ELECTRONIC COMPUTER SYSTEMS ! C ! SUPPLIED TO THE USER BY HEWLETT-PACKARD. ! C ! ! C ! THIS PROPRIETARY DATA SHALL NOT BE COPIED OR ! C ! OTHERWISE REPRODUCED WITHOUT THE PRIOR WRITTEN ! C ! CONSENT OF HEWLETT-PACKARD, EXCEPT THAT ONE ! C ! COPY MAY BE MADE AND RETAINED BY THE USER FOR ! C ! ARCHIVE PURPOSES. ! C ! ! C ! THE USER SHALL NOT DISCLOSE THIS DATA TO ANY ! C ! THIRD PARTIES WITHOUT THE PRIOR WRITTEN CONSENT ! C ! OF HEWLETT-PACKARD. IN ADDITION, THE USER SHALL ! C ! USE AT LEAST THE SAME CARE AND SAFEGUARDS TO ! C ! PROTECT THIS DATA FROM UNAUTHORIZED USE OR ! C ! DISCLOSURE AS THE USER USES TO PROTECT ITS OWN ! C ! PROPRIETARY DATA. ! C ! ! C !=================================================! C C GENERAL: C -------- C C THE FOLLOWING DEVICE SUBROUTINES ARE USED C TO PROGRAM THE MICRO-CIRCUIT CARD. C --------------------- C C HARDWARE C -------- C C C C HP 12566-60024 MICROCIRCUIT CARD C JUMPERED AS FOLLOWS: C C W1-A C W2-W4-B C W5-W8-IN C W9-A C C BRANCH AND MNEMONIC TABLE ENTRIES C C GPRIO(I,I,RV), OV=XX, ENT=GPRIO, FIL=%GPRIO C GPRSB(I,I,I,IV), OV=XX, ENT=GPRSB, FIL=%GPRIO C C CONFIGURATION TABLE INFORMATION C C******************************** C* HP12566B MICROCIRCUIT REGISTER C******************************** C* C R 56,1,1 C U1 C 0 C C C*************************************** C C C C WHERE: C IUNIT= UNIT # OF I/O CARD C C IFUNC= FUNCTION C 0= INPUT OCTAL (READ DATA FROM CARD) C 1= OUTPUT OCTAL (WRITE DATA TO CARD) C 2= INPUT BCD (READ DATA FROM CARD) C 3= OUTPUT BCD (WRITE DATA TO CARD) C C RDATA= BIT PATTERN TO BE OUTPUT C (0 TO 177777 OCTAL CODED) C OR C BINARY (TO OCTAL) PATTERN RETURNED FROM CARD C OR C BIT PATTERN TO BE OUTPUT C (0 TO 9999 BINARY CODED DECIMAL) C OR C BINARY (TO BCD) PATTERN RETURNED FROM CARD C C C C FUNCTION CODES FOR 16 BIT CONTROL: 0=OCTAL INPUT C (GPRIO) 1=OCTAL OUTPUT C 2=BCD INPUT C 3=BCD OUTPUT C C C C C C C ERROR CODES: C C 1 - PARAMETER ERROR C 2 - TIME OUT ERROR C 3 - NON BCD CONVERTABLE BINARY READ ATTEMPT C 4 - NON BINARY C 9 - I/O CALL REJECTED C 10 - UNIT #, LU # ERROR C C C C C***************************************** DIMENSION IERMS(5) DATA IERMS/10,5,2HGP,2HRI,2HO / DATA IDTN/56/ C C FIND STATION # AND LU # C IERMS=10 ISTN=ISN(DUMMY) LU=LUDV(ISTN,IDTN,IUNIT) IF(LU)800,800,20 C 20 CALL XPRIO(LU,IERMS,IUNIT,IFUNC,RDATA) IF(IERMS)800,30,800 30 RETURN C 800 CALL ERROR(IERMS,IERMS(2)) RETURN END C C C C C============================================= C SUBROUTINE XPRIO(LU,IERR,IUNIT,IFUNC,RDATA),09580-16316 REV.2013 8 +00131 C C DIMENSION IERR(5),ID(6),IREG(2),ITB(4),IG(4),IBCD(4) EQUIVALENCE(REG,IREG,IA),(IREG(2),IB) DATA IDTN/56/ C C C CHECK FUNCTION PARAMETER C IF(IFUNC .LT. 0 .OR. IFUNC .GT. 3) GOTO 8000 C C C ZERO THE ERROR FLAG C C IERR=0 C C C DETERMINE THE REQUESTED FUNCTION DESIRED C C C IS IT AN OCTAL READ? C C IF(IFUNC .EQ. 0) GOTO 1000 C C C IS IT AN OCTAL WRITE? C C IF(IFUNC .EQ. 1) GOTO 2010 C C C IS IT A BCD READ? C C IF(IFUNC .EQ. 2) GOTO 3000 C C C IS IT A BCD WRITE? C C IF(IFUNC .EQ. 3) GOTO 4000 C C C OCTAL OUTPUT FUNCTION SELECTED C C CHECK OUTPUT DATA WORD C C C 2010 IF(RDATA .LT. 0 .OR. RDATA .GT. 177777.) GOTO 8000 C C RESET BUFFER TO ZEROES C DO 50 I=1,6 ID(I)=0 50 CONTINUE C RMSB=0 IF(RDATA .GE. 100000.) RMSB=1.0 ID(1)=INT(RMSB) C RD2=(RDATA-(RMSB*100000.))/10000. ID(2)=INT(RD2) C KDATA=INT((RMSB*10.)+(RD2)) PDATA=FLOAT(KDATA)*10000. JDATA=RDATA-PDATA C C ID(3)=JDATA/1000 C ID(4)=(JDATA-(ID(3)*1000))/100 C ID(5)=(JDATA-(ID(3)*1000)-(ID(4)*100))/10 C ID(6)=(JDATA-(ID(3)*1000)-(ID(4)*100)-(ID(5)*10)) C C C C C C C C C C CHECK EACH DIGIT C DO 100 I=1,6 IF(ID(I) .GT. 7.) IERR=1 100 CONTINUE C C C POSITION EACH DIGIT TO FORM AN EQUIVALENT OCTAL WORD C ID(1)=ID(1)*100000B ID(2)=ID(2)*10000B ID(3)=ID(3)*1000B ID(4)=ID(4)*100B ID(5)=ID(5)*10B C C C C C C C IWRD=ID(1) DO 200 I=2,6 200 IWRD=IOR(ID(I),IWRD) C C SAVE DATA WORD C 300 CALL TIM(IDTN,IUNIT,2,IWRD,1,JER) IF(JER.NE.0) RETURN C C C C C OUTPUT WORD TO I/O CARD C GOTO 2000 C C C================================ C C READ DATA WORD FROM I/O CARD C 1000 CALL REIO(100001B,100B+LU,IDATA,1,IDUMY,0) GOTO 7000 1100 CALL ABREG(IA,IB) IF(IAND(IREG,377B) .NE. 0) GOTO 7500 C C C ISOLATE EACH OCTAL DIGIT C C C C ID(1)=IAND(100000B,IDATA)/100000B ID(2)=IAND(70000B,IDATA)/10000B ID(3)=IAND(7000B,IDATA)/1000B ID(4)=IAND(700B,IDATA)/100B ID(5)=IAND(70B,IDATA)/10B ID(6)=IAND(7B,IDATA) C C C CONVERT INTEGER TO REAL NUMBER. C C RD1=ID(1) RD2=ID(2) RD3=ID(3) RD4=ID(4) RD5=ID(5) RD6=ID(6) C C C MOVE TO THEIR RESPECTIVE PLACE HOLDINGS. C C C C RD1=RD1*100000. RD2=RD2*10000. RD3=RD3*1000. RD4=RD4*100. RD5=RD5*10. C C C BUILD THE WORD AND ADD THE LOW ORDER ENTRY TOO. C C RWRD=RD1+RD2+RD3+RD4+RD5+RD6 C C C ASSIGN TO PASSING PARAMETER. C C RDATA=RWRD C C C RETURN TO CALLING SEGMENT. C C RETURN C C C OCTAL AND BCD OUTPUT ROUTINE ONCE WORD IS BUILT. C C 2000 CALL REIO(100002B,100B+LU,IWRD,1,IDUMY,0) C C C ERROR RETURN TRANSFER. C C GOTO 7000 C C C RETURN POINT IF NO ERROR. C C 2020 CALL ABREG(IA,IB) IF(IAND(IREG,377B) .NE. 0) GOTO 7500 C C C RETURN TO MAIN CALLING SEGMENT. C C RETURN C C C BCD CONVERSION OF BINARY WORD INPUTTED. C C 3000 CALL REIO(100001B,100B+LU,IDATA,1,IDUMY,0) C C C ERROR RETURN TRANSFER STATEMENT. C C GO TO 7000 C C C NORMAL RETURN POINT. C C C 3100 CALL ABREG(IA,IB) C C C CHECK FOR TIME OUT ERROR. C C IF(IAND(IREG,377B) .NE. 0) GO TO 7500 C C C PARSE THE DATA WORD INPUTTED. C C ITB(1)=IAND(10B,IDATA)/10B ITB(2)=IAND(200B,IDATA)/200B ITB(3)=IAND(4000B,IDATA)/4000B ITB(4)=IAND(100000B,IDATA)/100000B IG(1)=IAND(7B,IDATA)/1B IG(2)=IAND(160B,IDATA)/20B IG(3)=IAND(3100B,IDATA)/400B IG(4)=IAND(70000B,IDATA)/10000B C C C CHECK TO SEE THAT ALL FOUR BCD DIGITS DO NOT EXCEED 9 C C DO 3050, I=1,4 C C C IF IT IS GREATER THAN 9, FLAG THE ERROR. C C IF((ITB(I) .EQ. 1) .AND. (IG(I) .GT. 1)) GO TO 7100 3050 CONTINUE C C C PARSE INTO BCD GROUPS. C C IBCDG1=IAND(17B,IDATA)/1B IBCDG2=IAND(360B,IDATA)/20B IBCDG3=IAND(7400B,IDATA)/400B IBCDG4=IAND(170000B,IDATA)/10000B C C C CONVERT TO REAL. C C RBCD1=IBCDG1*1. RBCD2=IBCDG2*10. RBCD3=IBCDG3*100. IF(ITB(4) .EQ. 0) GO TO 3060 IF(IG(4) .EQ. 0) RBCD4=8000. IF(IG(4) .EQ. 1) RBCD4=9000. GO TO 3090 3060 RBCD4=IBCDG4*1000. C C C FORM THE BCD WORD. C C 3090 RDATA=RBCD1+RBCD2+RBCD3+RBCD4 C C C RETURN TO THE CALLING PROGRAM. C C RETURN C C C C BCD WRITE OPERATION. C C C C RANGE CHECK BCD NUMBER. C C 4000 IF(RDATA .LT. 0 .OR. RDATA .GT. 9999) GO TO 8000 C C C BEGIN CONVERSION TO BINARY FROM BCD. C C C ZERO OUT THE BUILD ARRAY. C C DO 4010, I=1,4 IBCD(I)=0 4010 CONTINUE C C C PARSE RDATA OUT. C C IBCD(4)=INT(RDATA/1000.0) IBCD(3)=INT((RDATA-IBCD(4)*1000.)/100.) IBCD(2)=INT((RDATA-IBCD(4)*1000.-IBCD(3)*100.)/10.) IBCD(1)=INT((RDATA-IBCD(4)*1000.-IBCD(3)*100.-IBCD(2)*10.)/1.) C C C CHECK EACH DIGIT. C C DO 4020, I=1,4 IF(IBCD(I) .GT. 9) GO TO 4015 GO TO 4020 4015 IERR=1 GO TO 8500 4020 CONTINUE C C C POSITION EACH DIGIT TO FORM AN EQUIVALENT BCD WORD. C C IBCD(1)=IBCD(1)*1B IBCD(2)=IBCD(2)*20B IBCD(3)=IBCD(3)*400B IBCD(4)=IBCD(4)*10000B C C C ADD UP TO FORM THE BINARY CONVERSION OF THE BCD WORD. C C IWRD=IBCD(1) DO 4040, I=2,4 IWRD=IOR(IBCD(I),IWRD) 4040 CONTINUE C C C OUTPUT THE BCD CONVERTED TO BINARY WORD. C C GO TO 300 C C C C C C ERROR EXIT C C C C C C PARAMETER ERROR C C 8000 IERR=1 GOTO 8500 C C C ATTEMPT TO READ A NON BCD CONVERTABLE BINARY NUMBER. C C 7100 IERR=3 GO TO 8500 C C C THE I/O CALL HAS BEEN REJECTED. C C 7000 IERR=9 GOTO 8500 C C C THERE HAS BEEN A TIME-OUT ERROR GENERATED. C C 7500 IERR=2 8500 IERR(2)=5 IERR(3)=2HGP IERR(4)=2HRI IERR(5)=2HOI RETURN END C*************************************** C SUBROUTINE GPRSB(IUNIT,IFUNC,IPOS,ISTAT),09580-16316 REV.2013 8001 +31 C C C WHERE: C IUNIT= UNIT # OF I/O CARD C C IFUNC= FUNCTION C 0= INPUT STATE OF SPECIFIED BIT C C 1= OUTPUT STATE OF SPECIFIED BIT WITH C ALL OTHER BITS UNCHANGED. C C 2= OUTPUT STATE OF SPECIFIED BIT WITH C ALL OTHER BITS SET TO ZERO. C C 3= OUTPUT STATE OF SPECIFIED BIT WITH C ALL OTHER BITS SET TO ONE. C C IPOS = SPECIFIED BIT POSITION (0 TO 15) C C ISTAT = STATUS OF SPECIFIED BIT. C C******************************************************************* C C ALL THE EXAMPLES BELOW ASSUME THE CURRENT STATUS OF THE CARD C = 1110110111101011 (166753 OCTAL). C C C EXAMPLE 1: C WITH IFUNC = 1 AND IPOS = 3, OUTPUT WILL BE: C 0000000000001000 (10 OCTAL) C C EXAMPLE 2: C WITH IFUNC = 1 AND IPOS = 2, OUTPUT WILL BE: C 0000000000000000 (0 OCTAL) C C EXAMPLE 3: C WITH IFUNC = 2 AND IPOS = 9, OUTPUT WILL BE: C 1111110111111111 (176777 OCTAL) C C EXAMPLE 4: C WITH IFUNC = 2 AND IPOS = 8, OUTPUT WILL BE: C 1111111111111111 (177777 OCTAL) C C C C C***************************************** C DIMENSION IERMS(5) DATA IERMS/10,5,2HGP,2HRS,2HB / DATA IDTN/56/ C C FIND STATION # AND LU # C IERMS=10 ISTN=ISN(DUMMY) LU=LUDV(ISTN,IDTN,IUNIT) IF(LU)800,800,20 C 20 CALL XPRSB(LU,IERMS,IUNIT,IFUNC,IPOS,ISTAT) IF(IERMS)800,30,800 30 RETURN C 800 CALL ERROR(IERMS,IERMS(2)) RETURN END C C C C C============================================= C SUBROUTINE XPRSB(LU,IERR,IUNIT,IFUNC,IPOS,ISTAT),09580-16316 REV.2 +013 800131 C C DIMENSION IERR(5),ID(6),IREG(2) EQUIVALENCE(REG,IREG,IA),(IREG(2),IB) DATA IDTN/56/ C C C CHECK FUNCTION PARAMETER C IF(IFUNC .LT. 0 .OR. IFUNC .GT. 3) GOTO 8000 C C CHECK BIT POSITION SPECIFIER PARAMETER C IF(IPOS .LT. 0 .OR. IPOS .GT. 15) GOTO 8000 C C IERR=0 IDATA=0B ICOMP=77777B C C IF(IPOS .EQ. 15) GO TO 20 IMASK=2**(IPOS) GO TO 25 20 IMASK=100000B 25 JMASK=IMASK IF(IFUNC .NE. 0 .AND. ISTAT .EQ. 0) JMASK=0B NMASK=NOT(IMASK) C C TEST FOR READ OPERATION C 30 IF(IFUNC .EQ. 0) GO TO 500 C C C C C NOT A READ, MUST BE A WRITE OPERATION. C C C C C INPUT THE CURRENT BIT STATE IF SO SELECTED. C IF(IFUNC .EQ. 1) GO TO 50 C C NO. PARSE IFUNC FURTHER. C GO TO 200 C C RETRIEVE DATA C 50 CALL TIM(IDTN,IUNIT,1,JDATA,1,JER) IF(JER.NE.0) RETURN C C INCLUSIVE 'OR' THE TWO WORDS. C 100 JWORD=IOR(JDATA,JMASK) IF(ISTAT .EQ. 0) JWORD=IAND(JDATA,NMASK) C C GO TO THE OUTPUT ROUTINE. C GO TO 350 C 200 IF(IFUNC .EQ. 2) JWORD = JMASK IF(IFUNC .EQ. 2 .AND. ISTAT .EQ. 0) JWORD=0B C C 300 IF(IFUNC .EQ. 3) JWORD = IOR(JMASK,NMASK) C IF(IFUNC .EQ. 3 .AND. IPOS .NE. 15) JWORD= IOR(JWORD,100000B) IF(IFUNC .EQ. 3 .AND. ISTAT .EQ. 1) JWORD=177777B C C SAVE DATA WORD C 350 CALL TIM(IDTN,IUNIT,2,JWORD,1,JER) IF(JER.NE.0) RETURN C C C C OUTPUT A WORD C C 400 CALL REIO(100002B,100B+LU,JWORD,1,IDUMY,0) GOTO 7000 420 CALL ABREG(IA,IB) IF(IAND(IREG,377B) .NE. 0) GOTO 7500 C C RETURN C C C READ BIT STATUS ONLY C C 500 CALL REIO(100001B,100B+LU,IDATA,1,IDUMY,0) GO TO 7000 510 CALL ABREG(IA,IB) IF(IAND(IREG,377B) .NE. 0) GOTO 7500 ISTAT=0 IF(IAND(IDATA,IMASK) .NE. 0) ISTAT=1 C RETURN C C C C ERROR EXIT C 8000 IERR=1 GOTO 8500 7000 IERR=9 GOTO 8500 7500 IERR=2 8500 IERR(2)=5 IERR(3)=2HGP IERR(4)=2HRS IERR(5)=2HBI RETURN END END$