C PROGRAM TIMER.FT C ---------------- C FUNCTION TIMER(K) C AND C ###SUBROUTINE CLOCK C C GERSON GROSFELD, PETER LEMKIN C IMAGE PROCESSING UNIT, DCBD C NATIONAL CANCER INSTITUTE C NATIONAL INSTITUTES OF HEALTH C 9000 ROCKVILLE PIKE C BETHESDA, MD. 20014 C C OCT 7, 1976 C 13 JUL 1976 C C C PURPOSE C ------- C TO USE THE EXTERNAL 24-HOUR CLOCK AS A CPU TIMER ON THE PDP8/E C C C TO USE: C C K FUNCTION VALUE RETURNED C --- ---------------------- --------------- C 0 INITIALIZE TIMER 0.0 C 1 STOP, PRINT TIME ON TTY ONLY ELAPSED TIME C 2 STOP, PRINT TIME ON TTY & LPT ELAPSED TIME C 3 STOP, PRINT TIME ON LPT ONLY ELAPSED TIME C -1 STOP (NO PRINTING) ELAPSED TIME C C NOTE: VALUE RETURNED IS FLOATING POINT. ALSO, THE STOP FUNCTION C CAN BE USED REPEATEDLY TO MONITOR ET AS LONG AS THE TIMER C IS NOT RESET BETWEEN CALLS. C IE: C C T=TIMER(0) [INITIALIZE] C T1=TIMER(1) [TIME SO FAR] C T2=TIMER(1) [CONTINUOUS TIME SINCE INITIALIZATION] C ETC... C C TO COMPILE C ---------- C .COMPILE TIMER.FT C C TO LOAD C ------- C LOAD WITH ANY DESIRED FORTRAN II/SABR PROGRAMS C C C OPDEFS C ------ S OPDEF EXADR 6450 S OPDEF EXIN 6333 S OPDEF DISP1 6435 S OPDEF DISP2 6436 S OPDEF FBW7 6347 S OPDEF HPR 6320 S OPDEF VPR 6322 C C C Analogue to Digital 16 channel converter C (DEC AD8-ea/AM8-ea) with an input voltage C range of +/- 1 volt, 0-30 KHZ bandwidth, 10 C bit resolution, 200 nsec. apperature time. S OPDEF ADCL 6530 /Clear AD done and timing error flags. C Clear enable, mux and status register. S OPDEF ADLM 6531 /LOAD mux register from AC[8:11], C clear AC. S OPDEF ADST 6532 /CLear AD done and timing error flags. C Start AD converter. Channel to C be converted is to be determined by C mux register. S OPDEF ADRB 6533 /CLear AD done flag. Contents of C AD buffer ==>ac[0:11]. S SKPDF ADSK 6534 /SKIp next instruction if AD done=1. C Do not clear flag. C@S SKPDF ADSE 6535 /Skip next instruction if C timing error=1. C Do not clear flag. C@S OPDEF ADLE 6536 /LOad enable register from AC[2:5]. C@S OPDEF ADRS 6537 /REAd AD status/enable register and C mux into AC[0:11]. C C A/D Status register C Bit function C ---- -------- C 0 Conversion done C 1 error C 2 done interrupt enable C 3 error interrupt enable C 4 external start enable C 5 auto increment enable C 6-7 not used C 8-11 contents of mux register C C C C [0] START OR STOP C IF(K)200,100,200 C C C C [1.0] START: INITIALIZE C 100 INIT=0 C C [1.1] GET INITIAL CLOCK TIME DATA S EXADR /SET CHANNEL S EXIN /READ DATA S DCA \ILO C S CLA IAC /SET NEXT CHANNEL S EXADR S EXIN /GET DATA S DCA \IMID C S TAD (2 /SET UP NEXT CHANNEL S EXADR S EXIN /GET DATA S DCA \IHI C C C TIMER=0.0 RETURN C C C C [2.0] STOP: GET TIME C 200 CONTINUE C C [2.1] GET CURRENT CLOCK DATA C S EXADR /SET CHANNEL S EXIN /READ DATA S DCA \JLO C S CLA IAC /SET NEXT CHANNEL S EXADR S EXIN /GET DATA S DCA \JMID C S TAD (2 /SET UP NEXT CHANNEL S EXADR S EXIN /GET DATA S DCA \JHI C C C [3.0] UNPACK TIME DATA C IF(INIT)320,310,320 C C C [3.1] UNPACK START DATA ONLY IF FIRST STOP CALL (INIT=0) C ELSE GOTO [3.2] C C S \310, TAD \ILO S AND (0017 S DCA \KSL C S TAD \ILO S RTR;RTR S AND (0017 S DCA \KSH C S TAD \ILO S RTL;RTL;RAL S AND (0017 S DCA \KML C S TAD \IMID S AND (0017 S DCA \KMH C S TAD \IMID S RTR;RTR S AND (0017 S DCA \KHL C S TAD \IMID S RTL;RTL;RAL S AND (0017 S DCA \KHH C S TAD \IHI S AND (0017 S DCA \ILO S TAD \IHI S RTR;RTR S AND (0017 S DCA \IMID S TAD \IHI S RTL;RTL;RAL S AND (0017 S DCA \IHI C IDAYS=100*IHI+10*IMID+ILO IHOURS=10*KHH+KHL IMINS=10*KMH+KML ISECS=10*KSH+KSL C INIT=1 C C C [3.2] UNPACK STOP TIME C S \320, TAD \JLO S AND (0017 S DCA \KSL C S TAD \JLO S RTR;RTR S AND (0017 S DCA \KSH C S TAD \JLO S RTL;RTL;RAL S AND (0017 S DCA \KML C S TAD \JMID S AND (0017 S DCA \KMH C S TAD \JMID S RTR;RTR S AND (0017 S DCA \KHL C S TAD \JMID S RTL;RTL;RAL S AND (0017 S DCA \KHH C S TAD \JHI S AND (0017 S DCA \JLO S TAD \JHI S RTR;RTR S AND (0017 S DCA \JMID S TAD \JHI S RTL;RTL;RAL S AND (0017 S DCA \JHI C JDAYS=100*JHI+10*JMID+JLO JHOURS=10*KHH+KHL JMINS=10*KMH+KML JSECS=10*KSH+KSL C C C C [4.0] COMPUTE TIME DIFFERENCE C TD=FLOAT(JDAYS-IDAYS) TH=FLOAT(JHOURS-IHOURS) TM=FLOAT(JMINS-IMINS) TS=FLOAT(JSECS-ISECS) C TIMER=86400.*TD + 3600.*TH + 60.*TM + TS C C C C [5.0] WRITE OUT AND/OR RETURN WITH ELAPSED TIME C IOD=K C IF(IOD-1)599,505,501 501 IF(IOD-3)504,505,599 C 504 WRITE(1,506)TIMER IOD=3 505 WRITE(IOD,506)TIMER 506 FORMAT(/,' ELAPSED TIME: ',F9.0,' SECONDS',/) C C 599 RETURN C C C C C ********************************************* C *EXTERNAL SUBROUTINE C L O C K C ********************************************* S SKPDF CLKSKP 6303 /SKIP IF 200 HZ CLOCK IS READY S OPDEF CLKACK 6302 /CLEAR THE 200 HZ CLOCK C S ENTRY CLOCK S CLOCK, BLOCK 2 C C [C.1] WAIT 5 MSEC OR 1 CLKSKP C GET F&S OR A/D CHANNELS FROM FBW7[8:11] S HPR S DCA \ID1 S VPR S DCA \ID2 C C SEE IF A/D CHANNEL ACTIVE S ADCL S FBW7 S AND (0017 S TAD (-D8 S SMA CLA S JMP \1556 /NO A/D S FBW7 S AND (7 S DCA \ID1 S TAD \ID1 S TAD (10 /CHANNELS 10:17 S ADLM S ADST C 1556 DO 1555 MSEC=1,5 DO 1555 IUSEC=1,50 C TEST IF DATA ACTIVE S ADSK S JMP \1557 /NOT YET S ADRB S TAD (1000 S CLL RAR /DIVIDE BY 2 SO 0:511 FILTER IT S DCA \ID2 ID2=IBCD(ID2,-1) C S\1557, CLKSKP /REAL CLOCK ACTIVE? S JMP \1555 /NOT YET OR NEVER S CLKACK /YES, CLEAR IT AND RETURN GOTO 1559 1555 CONTINUE C C SAVE LIGHTS S\1559, TAD \ID1 S DISP1 S TAD \ID2 S DISP2 S RETRN CLOCK /BY-BY FROM TIMEOUT C C DEFINE ID1,ID2 ID1=0 ID2=0 C C END