ASMB,R,B,L
      HED ** RTE-B DEVICE SUBROUTINE (CTR27) **     
* 
* 
***************************************** 
* 
*     RELOC. TAPE    09601-16010
*     SOURCE TAPE    09601-18010
*     ERS            09601-16010-1
*     LISTING        09601-16010-2
* 
***************************************** 
* 
* 
*     A. WERNICK     AUG. 1973    REV A 
* 
* 
* 
* 
* CTRSF MAY BE CALLED BY RTE BASIC OR FORTRAN PROGRAMS        
* TO REMOTE PROGRAM THE 5327B-H48 TIMER/COUNTER/DVM FOR FREQ/TIME 
* MEASUREMENTS USING RTE DRIVERS DVR54 AND DVR40
* 
*  CALL STATEMENT (FORTRAN/BASIC):
* 
*     CALL CTRSF(F,T,A,B,G,H,C) 
* 
*          F= FUNCTION CODE (INTEGER) 
*          T= TIME BASE CODE (INTEGER)
*          A= INPUT A ATTENUATOR AND AC/DC CODE (INTEGER) 
*          B= INPUT B ATTENUATOR & AC/DC CODE (INTEGER) 
*          G= INPUT A TRIGGER LEVEL (INTEGER) 
*          H= INPUT B TRIGGER LEVEL (INTEGER) 
*          C= SEP/COM INPUT (INTEGER) 
* 
* 
      NAM CTR27,7 09601-16010 REV A 
* 
      ENT CTRSF 
      EXT .ENTR,EXEC,.FAD,.FDV,IFIX,ERROR,#CTRA 
      EXT .DST,.FMP,FLOAT,.RTOI,CONV,#CTRB
      EXT ERR0,.DLD 
      EXT #ERRU 
* 
IFUNC NOP 
ITIME NOP 
INPTA NOP 
INPTB NOP 
TRIGA NOP 
TRIGB NOP 
ICOM  NOP   
* 
CTRSF NOP           ENTRY POINT 
      JSB .ENTR     GET PARAMETER ADDRESSES 
      DEF IFUNC 
      LDA CTRSF       STORE EXIT ADDRESS
      STA EXITR 
      LDA CDEF1       STORE ENTRY POINT 
      STA ENDEF 
      CLA 
      STA DATA1     CLEAR 
      STA DATA2      DATA 
      STA DATA3       WORD
      STA DATA4        STORAGE
      STA DATA5         BUFFERS 
      LDA SET1
      STA PNTR1     PRESET
      LDA SET2       POINTERS 
      STA PNTR2 
      LDA SET3
      STA PNTR3 
      LDA IFUNC,I   BRING IN FUNCTION 
      STA FUNCT     SAVE FOR CTRMF CALL 
      ADA M10     SUBTRACT 10 
      SSA           IS IT NEGITIVE ?
      JMP *+4 
      LDB .4       NO, ITS CHECK
      STB DATA1 
      RSS 
      LDA IFUNC,I   NORMAL PATH 
      CLB 
      CPA B         COMPARE CODE
      JMP *+6 
      INB           INCREMENT CODE KEY
      ISZ PNTR1     INCREMENT POINTER 
      CPB .10 
      JMP ERR1     ILLEGAL CODE REJECT
      JMP *-6 
      LDA PNTR1,I   SET UP
      IOR DATA1     WORD 1
      STA DATA1 
* 
*TIME 
* 
      LDA ITIME,I   BRING IN      BASE CODE 
      STA TIMER     SAVE FOR CTRMF CALL 
      CLB 
      CPA B         COMPARE CODE
      JMP *+6 
      INB           INCREMENT CODE KEY
      ISZ PNTR2     INCREMENT POINTER 
      CPB .9
      JMP ERR1     ILLEGALdO- REJECT
      JMP *-6 
      LDA PNTR2,I   SET UP
      STA DATA2      WORD 2 
* 
      LDA INPTA,I   GET ATTN. A CODE
      JSB COMPR     GO GET DATA WORD
      ALF,ALF 
      STA DATA3 
* 
      LDA SET3      ADJUST
      STA PNTR3       POINTER 
      LDA INPTB,I   GET ATTN. B CODE
      JSB COMPR     GO GET DATA WORD
      IOR DATA3 
      STA DATA3     STORE IN BUFFER 
* 
* 
      LDA DATA3      GET A CHN MULT 
      ALF,ALF          POSITION 
      AND .3             MASK 
      STA HOLD              SAVE
      JSB .DLD      BRING IN LEVEL A DATA 
      DEF TRIGA,I 
      JSB TRIGR     CONVERT 
      STA DATA4     STORE IN BUFFER 
* 
      LDA DATA3     GET B CHN MULT
      AND .3          MASK
      STA HOLD          SAVE
      JSB .DLD      BRING IN LEVEL B DATA 
      DEF TRIGB,I 
      JSB TRIGR     CONVERT 
      STA DATA5     STORE IN BUFFER 
* 
      LDA ICOM,I
      SZA,RSS      ZERO ? 
      JMP ERR1      YES,ERROR 
      ADA M3       TEST IF >M2
      SSA,RSS 
      JMP ERR1      YAES,ERROR
      ADA .3        RESTORE 
      AND .1        MASK
      IOR DATA4     PUT IN DATA 
      STA DATA4       WORD 4
      CLA,INA       PUT EXTERNAL PROG BIT 
      IOR DATA5       IN WORD 5 
      STA DATA5 
      LDA FUNCT 
      CPA .4            IS START (4)
      RSS 
      JMP DONE        ISNT CONTINUE 
      LDA DATA1       IS,GET DATA1
      STA TEMP1         AND SAVE
      LDA .2          GET RESET CODE
      STA DATA1         AND PUT IN BUFFER 
      JSB WRITE       OUTPUT RESET COMMAND
      LDA TEMP1       RESTORE DATA1 
      STA DATA1 
DONE  JSB WRITE 
      JMP CTRSF,I   RETURN TO USERS PROGRAM 
* 
DATA0 NOP       
DATA1 NOP          DATA 
DATA2 NOP           WORD
DATA3 NOP            STORAGE
DATA4 NOP             BUFFERS 
DATA5 NOP       
CDEF1 DEF CTRSF     POINTER TO ENTRY PT 
* 
* 
PNTR1 DEF LIST1     FUNCTION LIST 
LIST1 OCT 5000
      OCT 5000
      OCT 5400
      OCT 4400
      OCT 7410
      OCT 2400
      OCT 7000
      OCT 6000
      OCT 6400
      OCT 0001
* 
PNTR2 DEF LIST2     TIME BASE LIST
LIST2 OCT 7400
      OCT 7000
      OCT 6400
      OCT 6000
      OCT 5400
      OCT 5000
      OCT 4400
      OCT 4000
      OCT 3400
* 
PNTR3 DEF LIST3     ATTENUATORS LIST
LIST3 OCT 0 
      OCT 1 
      OCT 2 
      OCT 4 
      OCT 5 
      OCT 6 
      OCT 10
      OCT 11
      OCT 12
      OCT 14
      OCT 15
      OCT 16
* 
* 
TRIGR NOP           CONVERT TRIGGER LEVEL DATA
      STA SAVE      SAVE A-REG
      LDA HOLD      GET MULTIPLIER
      SZA,RSS       X1? 
      JMP PROC      YES,PROCEED 
      SLA,RSS       X100? 
      JMP X100      YES,SCALE 
      LDA SAVE      X10,RESTORE A-REG 
      JSB .FDV      DIVIDE BY 10.0
      DEF FP10
      STA SAVE
      JMP PROC      PROCEED 
X100  LDA SAVE      X100,RESTORE A-REG
      JSB .FDV      DIVIDE BY 100.0 
      DEF FP100 
      STA SAVE
PROC  LDA SAVE
      JSB .FAD      ADD 3.175 AND LEVEL DATA
      DEF RANG
      JSB .FDV      DIVIDE RESULT BY 50MV 
      DEF RESOV 
      JSB IFIX      CONVERT F.P. TO INTEGER 
      NOP 
      SSA           NEGATIVE ?
      JMP ERR1       YES,ERROR
      ADA M128      TEST IF > 7 BITS
      SSA,RSS 
      JMP ERR1      YES,ERROR 
      ADA .128       NO,RESTORE 
      CMA           INVERT BITS 
      STA HOLD
      AND .7        ADJUST
      RAL 
      STA B           BITS
      LDA HOLD         FOR
      AND B170         OUTPUT 
      ALF,RAL 
      IOR B 
      JMP TRIGR,I 
RANG  DEC 3.175 
RESOV DEC .05 
HOLD  NOP 
* 
COMPR NOP           ATTENUATOR COMPARE
      CLB 
      CPA B         COMPARE CODE
      JMP *+6 
      INB           INCREMENT CODE KEY
      ISZ PNTR3     INCREMENT POINTER 
      CPB .12 
      JMP ERR1     ILLEGAL CODE- REJECT 
      JMP *-6 
      LDA PNTR3,I   GET DATA WORD 
      JMP COMPR,I 
* 
SET1  DEF LIST1 
SET2  DEF LIST2 
SET3  DEF LIST3 
CDEF2 DEF CTRMF  POINTER TO ENTRY PT. 
CDEF3 DEF CTRMV  "       "  "     " 
* 
* 
*  CTRMF MAY BE CALLED BY A FORTRAN OR ALGOL PROGRAM
* TO SIMPLIFY READING FREQUENCY/TIME DATA FROM THE
* HP 5327B-H48 TIMER/COUNTER/DUM USING THE RTE DRIVER 
* DVR40.
* 
*   CALL STATEMENT (FORTRAN OR BASIC):
* 
*      CALL CTRMF(V,D)
* 
*         V = MEASURED FREQUENCY OR TIME TO 6 SIGNIFICANT DIGITS
*         D = LAST 1 OR 2 DIGITS IF 7 OR 8 DIGITS DISPLAYED 
* 
* 
* 
* 
      ENT CTRMF 
* 
* 
* 
VALUE NOP 
DIGTS NOP 
* 
CTRMF NOP           ENTRY POINT 
      JSB .ENTR 
      DEF VALUE 
      LDA CTRMF     STORE ENTRY POINT AS EXIT ADDRS 
      STA EXITR 
      LDA CDEF2     STORE DEF TO ENTRY PT 
      STA ENDEF 
      LDA FUNCT     GET FUNCTION
      CPA .4        START ? 
      JMP ERR2              YES,ERROR-NO STOP 
      CPA .5        IS IT STOP ?
      JMP STOP      YES,DO A SPECIAL READ 
      JSB READ      READ DATA FROM DSI CARD 
P.1   CLA           A=0 
      STA TEMP1     INITIALIZE
      STA TEMP1+1      DIGITS TO 0
      LDB TIMER     GET TIMEBASE
      LDA FUNCT     GET FUNCTION PROGRAMMED 
      ADA M10         TEST IF 10-19 
      SSA 
      LDA FUNCT         <10,RESTORE 
      CPA .1        FREQUENCY ? 
      JMP FREQ        YES 
      CPA .2        PERIOD ?
      JMP PERD        YES 
      CPA .3        FREQUENCY C?
      JMP FREQ        YES 
      CPA .5        STOP ?
      JMP CONT        YES,DONT SCALE
      CPA .6        PERIOD AVG ?
      JMP PERAV       YES 
      CPA .7        TIME INTERVAL 
      JMP PERD        YES,PROCESS SAME AS PERIOD
      CPA .8        TIME INTERVAL AVG?
      JMP PERAV       YES,PROCESS AS PERIOD AVG 
      CPA .9        FREQ C / 10 ? 
      JMP FREQX       YES 
      SZA,RSS       CHECK ? 
      JMP FREQ        YES,TREAT AS FREQ 
      JMP ERR1
* 
FREQ  CMB,INB 
      ADB .7        MAKE EXPONENT 7-T 
      JMP CONT      CONTINUE
PERD  ADB M7        MAKE EXPONENT T-7 
      JMP CONT
FREQX CMB,INB 
      ADB .8        MAKE EXPONENT T-8 
      JMP CONT
PERAV CMB,INB       MAKE EXPONENT 
      ADB M7             -T-7 
CONT  STB EXPON     SAVE EXPONENT 
* 
      JSB CONVT     CONVERT BCD TO BINARY 
      JSB .DST      OUTPUT
      DEF VALUE,I         6 SIG DIGITS
      JSB .DLD      GET 
      DEF TEMP1        LSD
* 
      JSB .DST      SEND
      DEF DIGTS,I       LSD TO CALLING PROG 
* 
      JMP CTRMF,I   RETURN
* 
STOP  JSB EXEC
      DEF *+5        DO A READ WITH OUT ENCODE
      DEF .1
      DEF JUNIT 
      DEF DATA
      DEF .3
      JMP P.1        RETURN T0 PROCESS DATA 
* 
*  CTRMV MAY BE CALLED BY A FORTRAN OR ALGOL PROGRAM
* TO SIMPLIFY READING AN INPUT VOLTAGE OR TRIGGER 
* A AND B LEVELS WITH THE HP 5327B TIMER/COUNTER/DVM
* USING RTE DRIVERS DVR54 AND DVR40.
* 
*   CALL STATEMENT (FORTRAN): 
* 
*     CALL CTRMV(M,R,T,V) 
* 
*         M  = MODE OF OPERATION (INPUT/TRIGA/TRIGB) (INTEGER)
*         R = DVM VOLTAGE RANGE (INTEGER) 
*         T  = INTEGRATION TIME (REAL)
*         V = MEASURED VOLTAGE (REAL) 
* 
* 
* 
* 
      ENT CTRMV 
* 
* 
* 
MODE  NOP 
RANGE NOP 
TIME  NOP 
VOLTS NOP 
* 
CTRMV NOP           ENTRY POINT 
      JSB .ENTR 
      DEF MODE
      LDA CTRMV     STORE EXIT ADDRS
      STA EXITR 
      LDA CDEF3     STORE DEF TO ENTRY PT 
      STA ENDEF 
      LDA MODE,I
      SSA           LESS THAN 0?
      JMP ERR1      YES,ERROR 
      ADA M3
      SSA,RSS       GREATER THAN 2 ?
      JMP ERR1      YES,ERROR 
      LDA MODE,I    GET MODE
      SZA           ZERO ?
      JMP VTRIG     NO,1 OR 2,MEASURE TRIGGER VOLTS 
      JSB .DLD
      DEF RANGE,I   GET RANGE,I 
      JSB IFIX        INTEGER 
      NOP 
      CCB 
      CPA .10       10 VOLT RANGE 
      CLB 
      CPA .100      100 VOLT RANGE
      CLB,INB 
      CPA .1000     1000 VOLT RANGE 
      LDB .2
      SSB           ERROR ? 
      JMP ERR1        YES 
      STB RGECD     SAVE RANGE CODE 
      JSB .DLD
      DEF TIME,I    GET INTEG TIME
      JSB .FMP
      DEF F1000     MULT BY 1000
      JSB .FAD
      DEF HALF            ROUND OFF 
      JSB IFIX
      NOP 
      LDB M5              GET  COUNTER
      STB TEMP1       SAVE
      LDB TABLA     GET TABLE POINTER 
AGAIN CPA B,I         IS IT 1,10,100,1000,OR 10000 ?
      JMP GOTIT    YES
      INB            NO 
      ISZ TEMP1       TRY 
      JMP AGAIN        AGAIN
      JMP ERR1      NONE OF THE ABOVE,ERROR 
GOTIT LDB TEMP1 
      ADB .9        FORM INTEGRATION CODE 
      JMP SVINT 
VTRIG CLA           FORM RANGE CODE FOR MODE 1OR2 
      STA RGECD     SAVE RANGE CODE 
      LDB .5        FORM INTEG CODE FOR MODE 1OR 2
SVINT STB INTEG     SAVE INTEG CODE 
      LDA MODE,I     GET MODEE CODE 
      SZA,RSS 
      JMP DVM0      MODE=0
      CMA           FORM CODES
      AND .3          FOR READ
DVM0  ADA .6             LEVEL A
      ALF,ALF              OR  LEVEL B
      STA DATA1              STORE IN OUTPUT BUFFER 
      CLA 
      LDB MODE,I
      SZB           MODE=1 OR 2 ? 
      JMP .1OR2      YES
      LDA RGECD     GET RANGE CODE
      LDB .4          FORM
      CPA .1
      LDB .2            RANGE 
      CPA .2
      LDB .1              WORD IN B 
      LDA INTEG     GET INTEG  CODE 
      CMA             FORM
      AND .15           INTEG 
      ALF,ALF             WORD IN A 
      IOR B         COMBINE TO FORM PROG WORD 
.1OR2 IOR .8        ADD HOLD BIT
      STA DATA2     PUT IN OUTPUT BUFFER
      LDA DATA5 
      IOR .1        SET EXTERNAL BIT
      STA DATA5 
      JSB WRITE     OUTPUT PROGRAM WORD 
      JSB READ      READ RETURN DATA
      LDA INTEG     GET INTEG CONST 
      CMA,INA       FORM
      ADA .3          EXPONENT
      ADA RGECD         FOR CONVERSION
      STA EXPON           AND SAVE
      JSB CONVT     CONVERT TO FLOATING POINT 
      JSB .DST      RETURN
      DEF VOLTS,I    VALUE TO CALLING PROG
* 
      JMP CTRMV,I   RETURN TO CALLING PROGRAM 
* 
*  THIS SUBROUTINE CONVERTS 6 OR 7 DIGITS OF BCD
* DATA TO FLOATING PONT THE DATA TO BE CONVERTED
* IS STORED IN DATA AND DATA+1.THE APPROPRIATE
* EXPONENT MUST BE STORED IN EXPON, IF THE DATA IN
* DATA+1 INDICATES OVERFLOW, THE VALUE .9.....E9
* WILL BE RETURNED . THE RETURNED DATA WILL BE IN 
* THE A AND B REGISTERS IN NORMAL FLOATING POINT FORM 
* IF 7 DIGITS EXIST,THE LSD WILL BE STORED IN TEMP1 AND TEMP2 
* 
CONVT NOP 
      LDA DATA+1    GET DATA WORD #2
      ALF           POSITION ANNUNCIATOR
      AND .15        AND MASK 
      SZA,RSS         OVERFLOW ?
      JMP OVERF        YES
      LDB B400       + POLARITY,VOLT/FREQ/TIME
      CPA .7         TIME/FRQ/COUNT ? 
      JMP *+3        YES,SKIP POLARITY
      SLA 
      LDB B1000      - POLARITY,VOLTS 
      STB SAVE       SAVE FOR LATER 
* 
      LDA DATA+1    GET DATA WORD #2
      ALF,ALF       POSITION DIGIT #7 
      AND .15        AND MASK 
      CPA .15       BLANK ? 
      JMP SIX        YES,SIX DIGITS 
      SZA,RSS       ZERO ?
      JMP SIX        YES
* 
      LDA DATA      GET LEAST SIG WORD
      AND .15        AND KEEP DIGIT #1
      JSB FLOAT       FLOAT 
      JSB .DST         AND
      DEF TEMP1         SAVE
* 
      LDA DATA+1    GET DATA WORD #2
      AND .15        AND SAVE DIGIT #5
      STA B           SAVE
* 
      LDA DATA+1    GET DATA WORD #2
      ALF,ALF        AND
      ALF              POSITION 
      AND B377      KEEP DIGITS 6&7 
      STA DATA+1     SAVE 
* 
      LDA DATA      GET DATA WORD #1
      AND MASK       MASK OFF DIGIT #1
      ADA B         ADD DIGIT #5 (4-3-2-5)
      ALF,ALF        POSITION SO ORDER
      ALF             IS (5-4-3-2)
      STA DATA
* 
      ISZ EXPON     INCREMENT EXPONENT FOR 7 DIGITS 
      NOP           SHOULDN'T SKIP
* 
SIX   LDA DATA+1    GET DATA WORD #2
      AND B377        KEEP LAST 2 DIGITS
      IOR SAVE      ADD POLARITY
      STA DATA+1    STORE DATA WD 
      JSB CONV
      DEF *+2 
      DEF DATA
      JSB .DST      SAVE IN 
      DEF TEMP2        TEMP2 FOR LATER
      JSB .RTOI        MAKE MULTIPLIER
      DEF FP10
      DEF EXPON 
      JSB ERR0          HERE ONLY IF ERROR
      JSB .FMP        SCALE DATA
      DEF TEMP2 
* 
      JMP CONVT,I   RETURN
* 
OVERF JSB .DLD      GET  9.99999E9
      DEF MAX       TO INDICATE OVERFLOW
* 
      JMP CONVT,I   RETURN
* 
* 
* 
* 
*  THIS SUBROUTINE READS DATA FROM THE 32 BIT 
* DSI CARD VIA DVR40.IT RETURNS 2 16 BIT DATA 
* WORDS TO STORAGE WORDS DATA AND DATA+1 .
* 
* 
READ  NOP 
      JSB EXEC      INPUT 
      DEF *+5        VIA
      DEF .1          AN
      DEF JUNIT        EXEC 
      DEF DATA          CALL
      DEF .2             TIO DVR40
* 
      JMP READ,I    RETURN
* 
* 
* 
*  THIS SUBROUTINE PROGRAMS THE 40 BIT GPO
* CARD VIA DVR54.IT EXPECTS ALL 5 (ASCII
* FORMAT) PROGRAM WORDS TO BE STORED IN 
* DATA1 THRU DATA5. 
* 
* 
* 
WRITE NOP 
      JSB EXEC      OUTPUT
      DEF *+5        VIA
      DEF .2          AN
      DEF IUNIT        EXEC 
      DEF DATA0         CALL
      DEF .6             TO DVR54 
* 
      JMP WRITE,I   RETURN
* 
* 
* 
*  THIS SUBROUTINE EMITS AN ERROR MESSAGE VIA ERR0
* THERE ARE   ENTRY POINTS OUTLINED BELOW 
* 
*     ERR1- MESSAGE CTR 1 IS A PARAMETER ERROR
*     ERR2- MESSAGE CTR 2 IS A 'START' PROGRAMMED 
*           WITHOUT 'STOP'
* 
*  THE RESULT OF EXITING THIS PROGRAM IS ABORTION OF THE
* CALLING PROGRAM.
* 
ERR1  LDA .1
      STA ERRNO 
      JMP OUT 
ERR2  LDA .2
      STA ERRNO 
OUT   JSB ERROR 
      DEF *+5 
      DEF ERRNO 
      DEF ERRMN 
      DEF LUERR     DSPLY UNIT FOR ERR MSG
      DEF ENDEF     ENTRY POINT 
      JMP EXITR,I   ******EXIT******
ERRNO NOP 
ERRMN DEC 3 
      ASC 2,CTR 
* 
*     CONSTANTS AND STORAGE 
* 
.1    DEC 1 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.5    DEC 5 
.6    DEC 6 
.7    DEC 7 
.8    DEC 8 
.9    DEC 9 
.10   DEC 10
.12   DEC 12
.15   DEC 15
.100  DEC 100 
.128  DEC 128 
.1000 DEC 1000
M3    DEC -3
M7    DEC -7
M10   DEC -10 
M128  DEC -128
M5    DEC -5
B377  OCT 377 
B400  OCT 400 
B1000 OCT 1000
B170  OCT 170 
MASK  OCT 177760
FP10  DEC 10.0
FP100 DEC 100.0 
F1000 DEC 1000. 
MAX  DEC 9.99999E9
B     EQU 1 
HALF  DEC 0.5 
TABLA DEF TABL
TABL  DEC 1,10,100,1000,10000 
* 
* 
* 
LUERR EQU #ERRU     DSPLY UNIT FOR ERR MSG
EXITR NOP           EXIT ADDRESS
ENDEF NOP           DEF TO ENTRY POINT
DATA  NOP           DATA WORD STORAGE 
      NOP 
      DEC -1          IFUN =-1 FOR DVR 40 
TIMER NOP              TIME  PROGRAMMED 
FUNCT NOP              FUNCTION PROGRAMMED
TEMP1 BSS 2           TEMPORARY STORAGE 
TEMP2 BSS 2           TEMPORARY STORAGE 
SAVE  NOP     STORAGE 
RGECD NOP           RANGE CODE STORAGE
INTEG NOP           INTEGRATION CODE  STORAGE 
EXPON NOP           EXPONENT STORAGE
IUNIT EQU #CTRA 
JUNIT EQU #CTRB 
      END 
                                                                                                                                                                                                                      