NAM DSIDR * * * * ************************************************* * * * * * HP-3460A/B DATA SOURCE INTERFACE DRIVER * * * * * * -- BY -- * * * * * * STEVEN A. STARK * * * HEWLETT-PACKARD * * * PARAMUS, N.J. * * * * * ************************************************* * * * * I. IDENTIFICATION - SAS 0007 REV. 2 12/1/69 * ----------------- * * II. LANGUAGE - ASSEMBLY LANGUAGE, RELOCATABLE * ------------ * * III. TYPE - FORTRAN CALLABLE SUBROUTINE * --------- * * IV. LENGTH - 150 (DECIMAL) WORDS * ---------- * * V. SPECIAL HARDWARE REQUIRED - * ---------------------------- * * A. HP-3460A/B DIGITAL VOLTMETER * B. HP-12604B DATA SOURCE INTERFACE KIT * * VI. DESCRIPTION - * --------------- * * WHEN CALLED,THE DRIVER WILL FIRST REMOVE THE HOLD-OFF FROM * THE DVM, ALLOWING IT TO BEGIN A MEASUREMENT. IT WILL THEN * WAIT IN A PROGRAM LOOP UNTIL THE MEASUREMENT IS COMPLETED, * AT WHICH TIME IT WILL INPUT THE BCD DATA FROM THE DVM. THE * DRIVER WILL THEN PROCESS THE DATA,CONVERTING THE VOLTMETER * READING INTO A FLOATING POINT NUMBER AND THE FUNCTION CODE * INTO AN INTEGER NUMBER. BOTH OF THESE NUMBERS WILL THEN BE * RETURNED TO THE CALLING PROGRAM. IN THE EVENT THAT THE DVM * IS OVERLOADED OR A MEASUREMENT IS NOT COMPLETED WITHIN TEN * SECONDS, THE DRIVER RETURNS TO THE CALLING PROGRAM WITH AN * APPROPRIATE ERROR INDICATION. * * VII. ENTRY POINTS - IDVM * ----------------- * * VIII. EXTERNAL SUBROUTINES - FADSB, FMP, MPY, FLOAT, * -------------------------- .PACK, .ENTR, DLDST, .FLUN HED HP-3460A/B DATA SOURCE INTERFACE DRIVER * * * IX. CALLING INFORMATION - * ----------------------- * * THE DRIVER IS CALLED FROM FORTRAN AS: * * CALL IDVM (DATA, IFUN) * * OR I = IDVM (DATA, IFUN) * * OR IF (IDVM (DATA, IFUN)) 10,20,30 * * WHERE DATA - A FLOATING POINT VARIABLE SET TO * THE VALUE OF THE DVM READING UPON * RETURN TO THE CALLING PROGRAM. * * IFUN - AN INTEGER VARIABLE INDICATING THE * DVM FUNCTION CODE, AS SHOWN BELOW, * UPON RETURN TO THE CALLING PROGRAM. * * NO. FUNCTION * --- -------- * * 0 +VDC * 1 -VDC * 5 KILOHMS * 6 VAC * 8 OR 9 OVERLOAD * * AND WHERE THE VALUE OF THE FUNCTION UPON EXIT IS: * * -1 NO RESPONSE * 0 NORMAL RESPONSE * +1 OVERLOAD * * * X. PROGRAMMING NOTES - * -------------------- * * 1. THIS PROGRAM IS ALSO INTENDED FOR USE WITH THE * HP-12541A DATA SOURCE INTERFACE KIT. * * SKP * * * XI. PROGRAM LISTING - * ------------------- * ENT IDVM EXT .ENTR,FLOAT * DVM EQU 23B ASSIGN I/O CHANNEL NUMBER * * * IDVM ENTRY POINT * * DATA1 BSS 1 IFUN1 BSS 1 IDVM NOP RETURN ADDRESS JSB .ENTR GET PARAMETER ADDRESSES DEF DATA1 * LDA INSTR PUT CLC IN TRAP CELL STA DVM * * BEGIN DVM READING & WAIT UNTIL COMPLETED * STC DVM,C REMOVE HOLD-OFF FROM DVM CLA SET A & B REGS TO 0 CLB WAIT INB INCREMENT B-REG CPB D10K HAS 10000 LOOPS BEEN COMPLETED? JMP *+4 YES, CHECK FOR 10 SECONDS SFS DVM HAS DVM FINNISHED READING? JMP WAIT NO, RETURN & INCREMENT B-REG JMP INDAT YES, GO ON & LOAD DATA IN * INA INCREMENT A-REG CPA D100 HAS 10 SECONDS ELAPSED? JMP FAIL YES, GO TO FAIL ROUTINE JMP WAIT-1 NO, RETURN & LOOP AGAIN * INDAT LIB DVM LOAD BCD DATA INTO A & B REGS LIA DVM SKP * * PROCESS RANGE AND FUNCTION DIGITS * STA SAVA STORE CONTENTS OF A FOR LATER USE ALF SHIFT RANGE BITS TO BITS 0-3 AND M17 AND ISOLATE THEM STA RANGE STORE THEN FOR LATER USE * LDA SAVA RELOAD A WITH ORIGINAL CONTENTS ALF,ALF SHIFT FUNCTION BITS TO BITS 0-3 AND M17 AND ISOLATE THEM STA IFUN1,I STORE THEM BACK IN MAIN PROGRAM * ADA DM8 SUBTRACT 8 FROM FUNCTION CODE SSA,RSS IS FUNCTION AN OVERLOAD? JMP OVER YES, GO TO OVERLOAD ROUTINE SKP * * PROCESS DATA DIGITS * LDA 1 LOAD A WITH 4 LS BCD DIGITS & JSB BCDTB CONVERT THEM TO FLOATING POINT DST TEMP1 STORE THEM TEMPORARILY LDA SAVA LOAD A WITH 2 MS BCD DIGITS & AND M377 ELIMINATE RANGE & FUNCTION BITS JSB BCDTB CONVERT 2 MS DIGITS TO FLOAT. PT. FMP .D10K MULTIPLY BY DEC 10000 AND FAD TEMP1 ADD IN LS RESULT TO GET TOTAL DST TEMP1 STORE TOTAL VALUE TEMPORARILY * LDA ADDR2 GET NEG. POWER OF 10 TABLE ADA RANGE STARTING ADDRESS AND ADD ADA RANGE RANGE X 2 TO FORM POINTER STA PNTR SAVE IT FOR INDIRECT ADDRESS DLD PNTR,I GET CORRESPONDING NEG. PWR. OF 10 FMP TEMP1 MULTIPLY IT BY TOTAL VALUE TO GET DST TEMP1 TRUE DECIMAL VALUE & SAVE IT * LDA IFUN1,I RELOAD FUNCTION BITS INTO A CPA D1 IS FUNCTION -VDC? RSS JMP END NO, SKIP THIS PART DLD TEMP1 YES, RELOAD DATA VALUE & CHANGE FMP .DM1 SIGN TO NEGATIVE JMP *+3 END DLD TEMP1 RELOAD DATA VALUE DST DATA1,I STORE DATA VALUE BACK IN PROGRAM CLA SET A-REG TO 0 (NORMAL RESPONSE) JMP IDVM,I RETURN TO MAIN PROGRAM SKP * * FAIL AND OVERLOAD ROUTINES * FAIL JSB CLEAR SET DATA LOCATIONS TO 0 CCA SET A-REG TO -1 (NO RESPONSE) JMP IDVM,I RETURN TO CALLING PROGRAM * OVER JSB CLEAR SET DATA LOCATIONS TO 0 INA SET A-REG TO +1 (OVERLOAD) JMP IDVM,I RETURN TO CALLING PROGRAM * CLEAR NOP CLA SET A & B REGS TO 0 CLB DST DATA1,I STORE A & B IN DATA LOCATIONS JMP CLEAR,I RETURN TO MAIN PROGRAM * * BCD TO BINARY CONVERSION * BCDTB NOP RETURN ADDRESS LDB DM16 INITIALIZE BIT COUNTER TO -16 STB CNTR LDB ADDR1 GET TABLE STARTING ADDRESS STB PNTR SAVE IT FOR INDIRECT ADDRESS CLB LOOP1 SLA IS LSB = 0? ADB PNTR,I YES, ADD EQUIV. OCTAL VALUE TO B ISZ PNTR NO, INCREMENT CONVERSION POINTER RAR SHIFT NEXT BIT TO LSB ISZ CNTR INCREMENT BIT COUNTER, IS IT = 0? JMP LOOP1 NO, RETURN & CONVERT NEXT BIT LDA 1 YES, LOAD OCTAL EQUIV. INTO A JSB FLOAT AND CONVERT IT TO FLOATING POINT JMP BCDTB,I RETURN TO MAIN PROGRAM * * CONSTANTS * SAVA BSS 1 RANGE BSS 1 TEMP1 BSS 2 PNTR BSS 1 CNTR BSS 1 M17 OCT 17 M377 OCT 377 D1 DEC 1 D100 DEC 100 D10K DEC 10000 DM8 DEC -8 DM16 DEC -16 .D10K DEC 10000. .DM1 DEC -1. * INSTR CLC DVM * SKP * * TABLES * * A. BCD-TO-BINARY CONVERSION TABLE * ADDR1 DEF *+1 DEC 1,2,4,8,10,20,40,80 DEC 100,200,400,800,1000,2000,4000,8000 * * B. RANGE CONVERSION TABLE * ADDR2 DEF *+1 DEC 1.,1.E-01,1.E-02,1.E-03 DEC 1.E-04,1.E-05,1.E-06,1.E-07 END FTN,B,L PROGRAM TEST1 C C THIS IS A SHORT PROGRAM TO TEST THE FOLLOWING DATA SOURCE C INTERFACE DRIVER PROGRAMS: HP-2401C, HP-2402A, HP-3440A, C HP-3450A, HP-3460A/B C C PRINT HEADINGS C WRITE (2,10) 10 FORMAT(////8X"**** DVM DATA SOURCE INTERFACE DRIVER TEST X PROGRAM ****"///) C C TAKE A READING WITH DVM C 20 IF (IDVM (DATA, IFUN)) 30,70,50 C C TRANSFER HERE IF NO RESPONSE FROM DVM C 30 WRITE (2,40) 40 FORMAT(//5X"...NO RESPONSE FROM DVM...") PAUSE 1 GO TO 20 C C TRANSFER HERE IF DVM OVERLOADED C 50 WRITE (2,60) IFUN 60 FORMAT(//5X"...DVM OVERLOADED...FUNCTION CODE ="I2) PAUSE 2 GO TO 20 C C TRANSFER HERE IF NORMAL READING C 70 WRITE (2,80) DATA, IFUN 80 FORMAT(//5X"VOLTMETER READING ="F12.6,5X"FUNCTION CODE ="I2) PAUSE 3 GO TO 20 END END$