C PROGRAM NIEHS1.FT C ----------------------- C C C P. LEMKIN C NIH C BETHESDA, MD 20014 C C JAN 5, 1978 /CREATED FROM MOVSTG.FT C DEC 22, 1977 C C C C PURPOSE C ------- C MOVE THE STAGE IN A TOP DOWN LEFT-RIGHT-LEFT-RIGHT...RASTER C PATTERN. C 1. ENTER THE NUMBER OF ROWS IP AND COLUMNS IQ. C 2. ENTER THE NUMBER OF STEPS/ROW (IFRMY) AND STEPS/COLUMN (IFRMY) C OF AN IMAGE FRAME. C C NOTE: THE SIZE OF THE STAGE PATTERN IS A PXQ STEP C PATTERN WHICH SHOULD BE CHANGED TO THE DESIRED C PATTERN. C AS THE STAGE SCANS, STOP WHEN THE DENSITY > A C SET THRESHOLD (THIS LOGIC MAY BE INCOMPLETE). C C NOTE: CHECK TO SEE THE MSTAG PATTERN OF YOUR C STAGE!!! (IT WILL PROBABLY BE DIFFERENT SO THAT THE BIT C PATTERNS MUST BE CHANGED). C C C C NOTE: THE PM CHANNEL SHOULD GO > 0 (THRESHOLD IN THE PROGRAM C WAS SET TO 0) ON AN A/D CHANNEL WHICH GOES +/- ON SEEING C THE CELL OF INTEREST IN THE FRAME. C PDP8E OPCODE DEFINITIONS C ------------------------ C THE FOLLOWING DEVICE CODES ARE UNIQUE C TO OUR RTPP. YOU SHOULD CHANGE (MSTAGE,STEP) TO WHATEVER C IS USED ON YOUR PDP12. C C THE A/D SPECIFIED HERE IS THE AD8E WITH 16 CHANNEL C MULTIPLEXOR. THIS CODE SHOULD BE REWRITTEN FOR YOUR PDP12. C S OPDEF MSTAG 6366 /LOAD STEPPING MOTOR REGISTER C AS FOLLOWS: C BIT FUNCTION C --- -------- C 8 +Y C 9 -Y C 10 +X C 11 -X S OPDEF STEP 6305 /MOVE THE STAGE ACCORDING TO MSTAG REG. 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. S SKPDF ADSE 6535 /Skip next instruction if C timing error=1. C Do not clear flag. S OPDEF ADLE 6536 /LOad enable register from AC[2:5]. 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 S OPDEF STQMT 6300 /START THE QMT ON A SINGLE SCANE 0.1 SEC S OPDEF QMSKP 6301 /SKIP ON QMT DONE S OPDEF QDAT1 6324 /READ LEAST SIGN. BCD WORD QMT DATA ==>AC S OPDEF QDAT2 6325 /READ MIDDLE BCD QMT DATA WORD==>AC C DIMENSION IXLIST(100), IYLIST(100),IDLIST(100) C C C [0] PRINT NAME OF PROGRAM DO 110 IDEVICE=1,3,2 110 WRITE(IDEVICE,111) 111 FORMAT('1 NIEHS1 - JAN 5, 1978.') C C C [1] DEFINE THE MAXIMUM X AND Y 402 READ(1,400)IP,IQ WRITE(3,400)IP,IQ 400 FORMAT(' # ROWS?=',I5,/,' # COLUMNS?=',I5) C C IF IP OR IQ=0 C THEN ASK THE QUESTION AGAIN; IF(IP)402,402,403 403 IF(IQ)402,402,404 404 CONTINUE C C C GET THE SIZE OF THE IMAGE WINDOW IN STEPS 602 READ(1,600)IFRMY,IFRMX WRITE(3,600)IFRMY,IFRYX 600 FORMAT(' # STEPS/ROW?=',I5,/,' # STEPS/COLUMN?=',I5) C C IF IFRMY OR IFRMX=0 C THEN ASK THE QUESTION AGAIN; IF(IFRMY)602,602,603 603 IF(IFRMX)602,602,604 604 CONTINUE C C C [1.1] SET THE STAGE TO MOVE IN THE +X DIRECTION IXDIRECTION=0 MXPATTERN=2 C C C [1.2] INITIAL THE FOUND CELL LIST. MSIZE=100 MAXCOUNT=0 C C C [2] MOVE THE STAGE IN THE RASTER DO 200 IY=1,IP C WRITE(1,101)IY 101 FORMAT(' DOING LINE:',I5) C DO 201 IX=1,IQ C [2.1] MOVE THE STAGE IN THE +X DIRECTION DO 720 K=1,IFRMX S JMS CLOCK /WAIT 5 MSEC S TAD \MXPATTERN /+X BIT PATTERN S JMS MOVSTAGE /BITS==>STAGE 720 CONTINUE C C [2.2] CALL THE A/D TO SEE IF YOU STOP C LET THE PHOTOMETER BE ON A/D CHANNEL 0 C AND A - SATURATION SIGNAL WILL STOP IT! IDATA=0 ICHAN=0 C ===> NOTE: REPLACE PM SAMPLING FOR QMT SAMPLING <== S JMS GETQMTDATA C@S JMS SAMPLE IF(IDATA)220,220,221 C C C [2.2.1] FOUND A DATUM, PRINT IT AND SAVE IT IN THE LISTS. 221 MAXCOUNT=MAXCOUNT+1 C COMPUTE ABSOLUTE COORDS X=FLOAT(IX)*FLOAT(IFRMX) Y=FLOAT(IY)*FLOAT(IFRMY) C IDEVICE=1 C REMOVE THE DO LOOP IF NO LPT: DO 228 IDEVICE=1,3,2 228 WRITE(IDEVICE,1221)MAXCOUNT,IX,IY,X,Y,IDATA 1221 FORMAT(' CELL #',I3,', FRAME [',I3,',',I3, 1'], X,Y=[',F7.0,',',F7.0,'], DATA=',I5) C C IF MAXCOUNT < MSIZE+1 C THEN SAVE THE LIST C ELSE ERROR IF(MAXCOUNT-MSIZE)223,223,224 C C C [2.2.2] SAVE THE DATA IN THE LIST 223 IXLIST(MAXCOUNT)=IX IYLIST(MAXCOUNT)=IY IDLIST(MAXCOUNT)=IDATA GOTO 220 C C C [2.2.3] FOUND A POINT, BUT OVERFLOWED THE LIST SPACE 224 WRITE(1,229) 229 FORMAT(' OVERFLOWED LIST SPACE, CONTINUING!') 220 CONTINUE C 201 CONTINUE C C C [2.3] INCREMENT Y STAGE IFRMY STEPS DO 721 K=1,IFRMY S JMS CLOCK /WAIT 5 MSEC S TAD (0010 /+Y DIRECTION S JMS MOVSTAGE 721 CONTINUE C C C [2.4] FINISHED X LINE, NOW MOVE THE STAGE BACK C BY TOGGLING THE X DIRECTION IXDIRECTION=1-IXDIRECTION IF(IXDIRECTION)210,211,210 210 MXPATTERN=1 GOTO 200 211 MXPATTERN=2 200 CONTINUE C C C [3] DONE! WRITE(1,103) 103 FORMAT(' DONE!') C C C [4] MOVE THE STAGE BACK TO THE FIDUCIAL POINT IN THE C UPPER RIGHT HAND CORNER DO 500 IY=1,IP DO 500 K=1,IFRMY C WAIT 5 MS S JMS CLOCK S TAD (0004 /-Y DIRECTION S JMS MOVSTAGE 500 CONTINUE C C IF IXDIRECTION WAS REVERSED ( NEQ 0) C THEN THERE ALREADLY, DO NOTHING C ELSE REVERSE IT IF(IXDIRECTION)505,502,505 505 DO 501 IX=1,IQ DO 501 K=1,IFRMX S JMS CLOCK S TAD (0001 /-X S JMS MOVSTAGE 501 CONTINUE C 502 CONTINUE CALL EXIT C ************************************************ C *SUBROUTINE M O V S T A G E C ************************************************************ C MOVE THE STAGE ACCORDING TO THE BIT PATTERN IN THE AC C S CPAGE 3 S RMOVSTAGE, JMP I MOVSTAGE S MOVSTAGE, 0 /ENTRY C S MSTAG /LOAD THE STAGE REGISTER S STEP /SEND A PULSE TO LOAD THE REGISTER C C SETUP THE 100 USEC DELAY S CLA ICOUNT=-40 S WAIT, ISZ \ICOUNT /COUNT DOWN 100 USEC S JMP WAIT S CLA S MSTAG /ZERO THE STAGE REGISTER C S JMP RMOVSTAGE C ********************************************* C *SUBROUTINE S A M P L E * C ********************************************* C SUBROUTINE SAMPLE SAMPLES THE A/D CHANNEL C IN ICHAN AND PUT THE RESULT IN IDATA. C S CPAGE 3 S RSAMPLE, JMP I SAMPLE S SAMPLE, 0 /ENTRY C [AD.1] SET UP THE CHANNEL WHICH IS PASSED C THROUGH ICHAN. S ADCL S TAD \ICHAN /CHANNEL # S AND (0017 /ONLY 0 TO 17 S ADLM /LOAD THE MUX SELECTOR C C C [AD.2] START THE A/D S ADST S ADFIN,ADSK S JMP ADFIN /NOT FINISHED. C C C [AD.3] GET THE DATA S ADRB S TAD (1000 /ADD +512 SO -1 TO +1 VDC ==>[0:1777] S DCA \IDATA S JMP RSAMPLE C C C ********************************************* C *SUBROUTINE G E T Q M T D A T A * C ********************************************* C SUBROUTINE GETQMTDATA RUNS THE QMT (WHICH SHOULD BE SET C TO AREA WITH A HIGH THRESHOLD) AND RETURNS DATA ==> IDATA. C S CPAGE 3 S RGETQMTDATA, JMP I GETQMTDATA S GETQMTDATA, 0 /ENTRY S STQMT /START THE QMT S WQMT, QMSKP S JMP WQMT C C GET THE BCD DATA AND THEN MAKE A NUMBER S QDAT1 S DCA \ILOW S QDAT2 S DCA \IHIGH C C CVT TO A FLOATING POINT NUMBER WHICH WILL BE CLIPPED TO 0:2047 S TAD \ILOW S AND (0017 S DCA \I1 S TAD \ILOW S RTR;RTR S AND (0017 S DCA \I2 S TAD \ILOW S RTR; RTR; RTR; RTR S AND (0017 S DCA \I3 JLOW=I3*100+I2*10+I1 C S TAD \IHIGH S AND (0017 S DCA \I1 S TAD \IHIGH S RTR;RTR S AND (0017 S DCA \I2 S TAD \IHIGH S RTR; RTR; RTR; RTR S AND (0017 S DCA \I3 JHIGH=I3*100+I2*10+I1 C DATA=FLOAT(JHIGH)*2047.0 +FLOAT(JLOW) C IF(DATA-2047.0)1000,1000,1001 1001 DATA=2047.0 1000 IDATA=DATA C IHIGH=0 ILOW=0 S JMP RGETQMTDATA C C ****************************************************** C *SUBROUTINE C L O C K C ******************************************************* C WAIT 5 MSEC C S CPAGE 3 S RCLOCK, JMP I CLOCK S CLOCK, 0 /ENTRY C JUNK=0 DO 1555 MSEC=1,5 DO 1555 IUSEC=1,50 C WASTE SOME TIME S ISZ \JUNK S CLA 1555 CONTINUE S JMP RCLOCK /RETURN END