C PROGRAM PIXMTA.FT C ---------------- C C 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 JAN 25, 1978 /ADDED DAYTIME CODE C SEPT 28, 1977 /REMOVE TIMER C JUNE 22, 1977 C JUNE 16, 1977 C JUNE 2, 1977 C JUNE 1, 1977 C MAY 31, 1977 C MAY 18, 1977 C MAY 17, 1977 C MAY 16, 1977 C MAY 4, 1977 C MAY 2, 1977 C MAY 1, 1977 C APRIL 29, 1977 C C C C INTRODUCTION C ------------ C PIXMTA.FT IS A CHAINED PROGRAM USED WITH BMON2 C IT RECEIVES ITS ARGUMENTS FROM THE CD AREA AND THE IBM1,IHGH1 C IBM2,IHGH2, JBM, JHGH VARIABLES IN COMMON. COMMON IS RESTORED C FIRST BEFORE THE FUNCTION (TO BE INSERTED INTO THE BODY) IS C EVALUATED. AFTER THE FUNCTION IS PERFORMED, COMMON C IS SAVED AND BMON2 IS CHAINED BACK TO. C ANY COMPUTATIONS ARE DONE, THE ARGUMENTS ARE THEN CHECKED C C PIXMTA COPIES A MAGNIFIED OR DEMAGNIFIED IMAGE C TO BY REPEATING OR SAMPLING PIXELS. THE MAGNIFICATION C IS DETERMINED BY SCALE=N/D IN THE CDSPEC ARGS. C C C C SET GENSYM BEFORE START C MTAj:(Opt. File if /X)_PIXMTA,BMi (OPT /C /X /H /M /F /T), C (OPT. STEP SIZE K OR DELTA TIME, NUMBER OF SECTIONS M) - C dump a set of images to be C acquired from BMi to MTAj:GENSYM.PX. The algorithm is as C follows: C C [1] "Initialization" C IF /R C THEN REWIND MTAj; C If not /X and not /A C Then UNPOST/A, C IF /A SIZE_512 ELSE 256, C SETFSXY(384,384,SIZE,SIZE); C oldtime_current!time; C [2] "Data acquisition loop" C If (X,Y,FOCUS,ZOOM,TH1,TH2,ND,WV) C Then MANUAL control; C If keypad data C Then If KPD data > 0 C If /F C Then C If (M_M-1) < 0 C Then Return to BMON2 C Else C Begin "Get next serial section" C MOVSTATE,SF,ABS,K; C GET, ; C Goto [3.3]; C End "Get next serial section"; C Then Goto [3]; C If /T C Then C If (M_M-1) < 0 C Then Return to BMON2 C Else C Begin "Get next time lapse image" C Wait Until oldtime+K geq current!time; C GET, ; C Goto [3.3]; C End "Get next time lapse image"; C Then Goto [3]; C If /X C Then Goto [3]; C If ^O C THEN RETURN TO BMON2; C Goto [2]; C C [3] "Get data and write it on MTA" C If not /X C Then C Begin "get data" C POSFS, BMi; C GET, BMi; C POST, BMi; C End "get data"; C IF /C THEN GET PICTURE FILE HEADER COMMENT. C IF /X AND KOUTFILE[1:3] NEQ NULL C THEN FILE_KOUTFILE[1:3]; C MTAj:FILE.PX_write MAG10 format, BMi; C IF /H THEN PRINT PICTURE FILE HEADER. C If /X C THEN IF NOT /M C Then Return to BMON2; C Else If Command Decoder=NIL C Then Return to BMON2 C Else Goto [2]; C UNPOST, BMi; C Goto [2]; C C C If /M is specified, then it makes continued requests for C transfer commands (*MTAj:_PIXMTA/X/M,BMi,) C until a null command is specified at which point it transfers C control back to BMON2. If the Gensym name is specified, C it will use the current GENSYM number with that C name, otherwise it will increment and use the current C GENSYM. C C If the file name has an extension, then it will be used C otherwise the .PX extension is used. C OPDEFS C ------ C S OPDEF FBW4 6344 S OPDEF FBW3 6343 S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C C C S OPDEF DISP2 6436 S OPDEF DISP1 6435 C S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF KRS 6034 S OPDEF BSW 7002 C C S SKPDF SKPKPD 6313 /SKIP ON KEYPAD ACTIVE S OPDEF RKYPDL 6353 /READ KEY PAD LOW C C S OPDEF STQMT 6300 S SKPDF QMSKP 6301 /SKIP ON QMT READY C S OPDEF HPL 6360 S OPDEF VPL 6362 S OPDEF HSL 6361 S OPDEF VSL 6363 C S OPDEF HPR 6320 S OPDEF VPR 6322 S OPDEF GETA 6522 S OPDEF GETB 6523 S OPDEF POSTA 6520 S OPDEF POSTB 6521 C S OPDEF BMX0 6500 S OPDEF BMY0 6504 C S OPDEF MSTAG 6366 /AC==>MSTAG REG S OPDEF STEP 6305 /MOVE STAGE ACCORDING TO MSTAG REG C [1] INITIALIZATION NSPSAVE=IOUTSPOOL WRITE(1,995) WRITE(3,995) 995 FORMAT(' PIXMTA 1/25/78 - 4:01PM') C C GET /T ITSW=ISW(20) C NOTE: THE ICNUM ASSOCIATED WITH /T IS THE DELTA T. C C IF NOT /X THEN PRINT PRESS CLASS KEY MSG IFSW=ISW(6) IXSW=ISW(24) S TAD \IXSW S TAD \IFSW S SZA CLA S JMP \200 WRITE(1,107) WRITE(3,107) 107 FORMAT(' ENTER KEYPAD # TO WRITE BM==>MTA:, ^O TO EXIT' 1,/,' CLASS KEY 0 TO TOGGLE POSTING ON/OFF') C C C [2] VERIFY BM SPECS C IF KINFILE[1:3]=NIL C THEN RETURN S\200, TAD \KINFILE S SNA CLA S JMP \998 /RETURN C C IF NOT /A C THEN CKIN S TAD \ISW S SNA CLA S JMS CKIN C C C [2.1] VERIFY MTAj: SPEC DEVICE=GETDEVICE(KDEVOUT) S TAD \DEVICE S TAD (-1524 /"MT" S SZA CLA S JMP \999 /SPEC ERROR C C C [2.2] GET FOCUS STEP PARAMETERS S TAD \ICNUM S SNA S TAD (4 /.4 MICRONS S DCA \ICNUM C S TAD \ICNUM# /ICNUM(2) S DCA \MFRAMES S TAD \MFRAMES S SNA S TAD (D256 S DCA \MFRAMES C C GET CURRENT STAGE POSITION I13=MDPDATA(7,4) C ZERO FRAME CTR I16=0 C C C [3.] PROCESS DATA C IF /A C THEN IMA_IMA LOR '17, IMB_0; S TAD \IMA S MQL S TAD \ISW S SZA CLA S TAD (0017 /BM0:3 S MQA /OR BITS S DCA \IMA S TAD \ISW S SZA CLA S DCA \IMB C S TAD \DEVICE# S AND (0001 S DCA \IDEV C C REMEMBER THE FILE NAME C IF KOUTFILE="*" C THEN KOUTFILE_NIL; S TAD \KOUTFILE S TAD (-5200 S SNA CLA S DCA \KOUTFILE C IFLSW=KOUTFILE C C C IF /R THEN REWIND MTAJ; IZ=ISW(18) S TAD \IZ S SNA CLA S JMP \300 CALL MAGTAP(0,0,1,MTRS,0,IDEV) C C C [3.1] "Initialization" C IF NOT /A C THEN MHSIZE_256 ELSE MHSIZE_512; S \300, TAD \ISW S SZA CLA S TAD (D256 S TAD (D256 S DCA \MHSIZE MHSIZE=IBCD(MHSIZE,-1) C C IF NOT /F AND NOT /A C THEN SETFSXY, 200,200, MHSIZE,MHSIZE; S TAD \IFSW S SZA CLA S JMP \320 /DO NOT SET F&S OR UNPOST C S TAD \ISW / "/A" S SNA CLA S JMP \320 /NO C S TAD (1000 /200 BCD S HPL S TAD \MHSIZE /BCD 256 OR 512 S HSL S TAD (1000 /200 BCD S VPL S TAD \MHSIZE /BCD 256 OR 512 S VSL C C C C [3.1.1] IF NOT /X C THEN UNPOST/A, S TAD \IXSW S SZA CLA S JMP \320 /NO C S POSTA S POSTB C C C [3.1.2] GET CURRENT VALUE OF CLOCK IN SECONDS FB=DAYTIME(5) C C C [3.2] "Data acquisition loop" C [3.2.1] If (X,Y,FOCUS,ZOOM,TH1,TH2,ND,WV) C Then MANUAL control; 320 CALL MANUAL C C C [3.2.2] POSITION BM(S) AT F&S AND C FORCE F&S TO 256X256 OR 512X512 C IF NOT /A THEN MOVE SINGLE BM ELSE MOVE 4 BMS S TAD \ISW S SNA CLA S JMS MOVPOSFS /SINGLE BM (NOT /A) C S TAD \ISW S SNA CLA S JMP \1321 DO 1320 I10=1,4 IBM1=I10-1 S JMS MOVPOSFS 1320 CONTINUE C C S \1321, TAD \MHSIZE S HSL S TAD \MHSIZE S VSL C C C [3.2.3] IF FBW3[0] OR FBW4[0] C THEN POSTA_IMA,POSTB_IMB C STQMT,QMSKP; C POSTA_POSTB_0000; S FBW3 S MQL S FBW4 S MQA S SMA CLA S JMP \323 /NO S TAD \IMA S POSTA S TAD \IMB S POSTB C S STQMT S QDW, QMSKP S JMP QDW /WAIT 329 CONTINUE C C TURN OFF DISPLAY S POSTA S POSTB C WAIT 1 CYCLE S STQMT S WTOFF, QMSKP S JMP WTOFF C C C [3.2.4] If keypad data S\323, SKPKPD S JMP \321 /NO KEYPAD C Then If KPD data > 0 S RKYPDL /GET LOW DATA S DCA \I14 C Then Goto [3.3]; I14=IBCD(I14,1) C IF(I14)320,320,330 C C C [3.2.5] If /X C Then Goto [3.3]; S \321, TAD \IXSW S SZA CLA S JMP \330 /NEQ 0 C C C [3.2.6] If ^O S CPAGE 3 S JMS TTYCTL S JMP \998 /GOODBYE C Then Return to BMON2; C C [3.2.7] IF /F C THEN C BEGIN "GET SERIAL SECTIONS" C MOVSTATE SF,REL,ICNUM S TAD \IFSW S SNA CLA S JMP \1328 /NO C C YES, C UNPOST/A; S POSTA S POSTB C MFRAME=MFRAME-1 S TAD \MFRAME S SPA CLA S JMP \998 /DONE C C MOVE THE FOCUS 10 STEPS "UP" DO 1325 IZ=1,10 S TAD (0040 /+FOCUS BIT PATTERN S MSTAG S STEP S CLA CALL CLOCK 1325 CONTINUE C C MOVE THE FOCUS 10+ ICNUM "DOWN" I18=ICNUM+10 DO 325 IZ=1,I18 S TAD (0020 /-FOCUS BIT PATTERN S MSTAG S STEP S CLA CALL CLOCK 325 CONTINUE C C WAIT 1 SEC DO 324 IZ=1,200 CALL CLOCK 324 CONTINUE C C GO GET DATA AND SAVE IT C WRITE OUT SECTION NAME I13=I13+ICNUM C UPDATE CURREN AND DESIRE DO 328 IZ=5,7,2 328 MDPDATA(IZ,4)=I13 C INCR FRAME COUNTER I16=I16+1 C DO 327 LSNEW=1,3,2 327 WRITE(LSNEW,326)I13,I16 326 FORMAT(' FOCUS STEPS:',I5,' FOR SECTION:',I5) GOTO 330 C END "GET SERIAL SECTIONS"; C C C [3.2.8] IF /T THEN WAIT AND GET IMAGE S\1328, TAD \ITSW S SNA CLA S JMP \320 /NO C C YES, GET CURRENT TIME AND WAIT UNTIL (FB+K GEQ CURRENTTIME) 1327 FA=DAYTIME(5) S CPAGE 3 S JMS TTYCTL S JMP \998 /EXIT C IF((FA-FB)-FLOAT(ICNUM))1327,1329,1329 1329 FB=FA CALL DAYTIME(3) GOTO 330 C [3.3] "Get data and write it on MTA" 330 CONTINUE C [3.3.1] SET UP TO DO EITHER 1 OR /A (0 TO 3) MEMORIES I11=IBM1+1 I12=I11 C IF /A THEN I11_1, I12_4; S TAD \ISW S SNA CLA S JMP \398 /NOT /A I11=1 I12=4 C 398 DO 331 I10=I11,I12 IBM1=I10-1 C C IF /X C THEN GOTO [3.3.3] S TAD \IXSW S SZA CLA S JMP \332 C C C [3.3.2] ELSE BEGIN "GET DATA"; C POSFS, BMi; S JMS MOVPOSFS /GO MOVE ACCORDING TO F&S C C IF NOT /A C THEN GET, BMi C ELSE GET, BM0,BM1,BM2,BM3; S TAD \IMA S GETA S GETB C S TAD \ISW S SNA CLA S JMP GOQ S TAD (0017 /BM0:BM3 S GETA S GETB C S GOQ, STQMT S GQ, QMSKP S JMP GQ C END "GET DATA"; C C C [3.3.3] COMPUTE FILE NAME 332 CONTINUE C IF ORIGINAL KOUTFILE[1:3] NEQ NULL C THEN FILE_KOUTFILE[1:3]; C MTAj:FILE.EXT_write MAG10 format, BMi; S CALL 1,FAD S ARG \KOUTFILE S CALL 1,STO S ARG \FILE C C IF FILE NEQ NULL C THEN USE IT RATHER THAN GENSYM'D FILENAME. S TAD \IFLSW S SZA CLA S JMP \336 C C IF KINFILE(9) NEQ NULL C THEN DON'T INCREMENT GENSYM COUNTER IY=KINFILE(9) S TAD \IY /USER SUPPLIED GENSYM S SNA CLA S ISZ \IGENSYM# S CLA C C GET THE GENSYM NUMBER S TAD \IGENSYM# S DCA \IVAL C C IF 3RD INPUT FILE NEQ NIL C THEN IX_3RD INPUT FILE (2 CHARS) C ELSE IX_IGENSYM; IX=IGENSYM S TAD \IY /IF NULL THEN USE GENSYM S SNA CLA S JMP \339 / NULL, DO USE GENSYM IX=IY C 339 FILE=GENSYM(IX,IVAL) C C C REPLACE OUTPUT FILENAME WITH POSSIBLY GENERATED FILE NAME; C IF /A C THEN FILE_FILE[1]&CVS(M)&FILE[3 TO 6]; S TAD \ISW S SNA CLA S JMP \347 /NOT /A C S TAD \FILE S AND (7700 S TAD (-1 /1:4==>0:3. S TAD \I10 S TAD (0060 /MAKE IT ASCII S DCA \FILE C S \347, CALL 1,FAD S ARG \FILE /GENSYM SYMBOL S CALL 1,STO S ARG \KOUTFILE C 336 IF(KOUTFILE(4))346,345,346 345 EXT='PX' S TAD \EXT S DCA \IX KOUTFILE(4)=IX C C C [3.3.4] SETUP DOAUX BUFFER CALL TO GENERATE FILE HEADER S \346, CALL 1,FAD S ARG \KOUTFILE S CALL 1,STO S ARG \FILE C NKWTHEADER=10 LSUCLASS=0 MODECOMMENT=ISW(3) IOUTSPOOL=1 KSUBTYPE=1 CALL BDOAUX(NKWTHEADER) C C C [3.3.5] WRITE OUT THE FILE CALL BMTOMTA(IBM1,IHGH1,KOUTFILE,DEVICE,IBUF4,I14) C C C [3.3.6] IF /H THEN PRINT HEADER. IA=ISW(8) S TAD \IA S SNA CLA S JMP \331 /NO CALL PHEADER(IBUF4,IOUTSPOOL) 331 CONTINUE C C C [3.3.7] IF /F C THEN GOTO [3.2]; S TAD \IFSW S SZA CLA S JMP \320 C C C [3.3.8] IF /X C THEN IF NOT /M C THEN RETURN TO BMON2 C ELSE IF COMMAND DECODER=NIL C THEN RETURN TO BMON2 C ELSE GOTO [2]; S TAD \IXSW S SNA CLA S JMP \334 /=0 C IZ=ISW(13) S TAD \IZ S SNA CLA S JMP \998 C C GET THE NEXT COMMAND LINE CALL BCDSPEC C FIX UP COMMON IBM1 SPEC S TAD PKINFILE S TAD (4 S DCA GA1# S CALL 1,FAD S GA1, ARG \KINFILE /(5) S CALL 1,STO S ARG \SFILE C C GET THE BM # S TAD \SFILE# S BSW S AND (7 S DCA \IBM1 C S TAD \SFILE# S BSW S AND (7700 S TAD (-1000 /"H@" S SNA CLA S IAC /YES HIGH S DCA \IHGH1 GOTO 200 C C UNPOST, BMi; S \334, POSTA S POSTB C C Goto [3.2]; GOTO 320 C C C [999] RETURN GOTO 998 999 WRITE(1,996) 996 FORMAT('BAD BM OR MTA SPECIFICATION!') C 998 CONTINUE C@ ET=TIMER(1) C UPDATE THE BM'S S TAD \IPSTA S POSTA S TAD \IPSTB S POSTB C C REPOSITION MEMORIES DO 997 IX1=1,4 IBM1=IX1-1 IX=LSAVE(13,IBM1+1) IY=LSAVE(14,IBM1+1) S JMS POSXY 997 CONTINUE C C RESTORE SPOOLER IOUTSPOOL=NSPSAVE CALL BSCOMMON(1) CALL CHAIN('BMON2') C*************************************************** C *PROCEDURE C K I N C****************************************************** C C C CHECK WHETHER THE INPUT BM SPEC IS LEGAL ELSE GOTO 999. S CPAGE 3 SRCKIN, JMP I CKIN S CKIN, 0 /ENTRY C C [1] TEST IF BMI1="BM" S TAD \SFILE S CIA S TAD BMTEXT S SZA CLA S JMP \999 /FAILED C C [2] TEST IF (BMI1(2) LAND '7700)=DIGIT S TAD \SFILE# S BSW S AND (0077 S TAD (-60 /"0" S SPA S JMP \999 /NO, FAILED S TAD (-D8 /"7" TEST S SMA CLA S JMP \999 /FAILED S JMP RCKIN /OK. C C C ************************************************************ C SUBROUTINE: T T Y C T L (INTERNAL) C ************************************************************ C S CPAGE 3 S RTTYC, JMP I TTYCTL S TTYCTL, 0000 /ENTRY C S KSF /ANYTHING TYPED S JMP NORMAL /NO, RETURN NORMALLY S KRB /GET TYPED CHARACTER S AND (0177 /TAKE CARE OF PARITY PROBLEMS S TAD (-17 /TEST FOR CTRL/O S SNA /SKIP IF NOT CTRL/O S JMP RTTYC /ABORT CALLING ROUTINE (ERROR RETURN) S TAD (-4 /TEST FOR CTRL/S [-17-4=-23(OCTAL)] S SZA CLA /SKIP IF CTRL/S S JMP NORMAL /NOT CTRL/O OR CTRL/S SO RETURN NORMALLY C S SLEEP,KSF /WAIT FOR CTRL/Q S JMP SLEEP /KEEP WAITING S KRB /READ CHARACTER S AND (0177 S TAD (-17 /IS IT A CTRL/O? S SNA /SKIP IF NOT S JMP RTTYC /YES, ABORT S TAD (-2 /TEST FOR CTRL/Q (-17-2=-21 OCTAL) S SZA CLA /SKIP IF SO S JMP SLEEP /NOPE, KEEP SLEEPING C S NORMAL,INC TTYCTL /INCREMENT RETURN ADDRESS FOR NORMAL RETURN S CLA /SAFETY VALVE S JMP RTTYC /RETURN C *********************************************************** C *SUBROUTINE P O S X Y C ********************************************************** S CPAGE 3 S RPOSXY, JMP I POSXY S POSXY, 0 C C S TAD \IBM1 /COMPUTE OFFSET S TAD (-4 S SMA CLA S TAD (10 /OFFSET FOR GROUP B S MQL S TAD \IBM1 S AND (0003 S MQA S MQL /OR IN POSSIBLE GROUP B, 0:3, OR 10:13. C S MQA S TAD PBMX0 S DCA LODX S TAD \IX S LODX, BMX0 C S MQA S TAD PBMY0 S DCA LODY S TAD \IY S LODY, BMY0 S JMP RPOSXY C *********************************************************** C *SUBROUTINE M O V P O S F S C ********************************************************** S CPAGE 3 S RMOVPOSFS, JMP I MOVPOSFS S MOVPOSFS, 0 C C C POSITION BM(S) ACCORDING TO F&S S HPR S DCA \IX S VPR S DCA \IY C IX=IBCD(IX,1) IY=IBCD(IY,1) C C IF /A C THEN SETUP THE POSITIONING S TAD \ISW S SNA CLA S JMP \1400 /NOT /A C GOTO(1400,1401,1402,1403,1400,1400,1400,1400),I10 C C MAP BM1 (X+256) 1401 IX=IX+256 GOTO 1400 C C MAP BM2 (Y+256) 1402 IY=IY+256 GOTO 1400 C C MAP BM3 (X+256,Y+256) 1403 IX=IX+256 IY=IY+256 C C MAP BM0, BM4,5,6,7 OR NOT /A S \1400, JMS POSXY /LOAD BMI FROM IX,IY S JMP RMOVPOSFS C************** P A R A M E T E R S ************* S PKINFILE, \KINFILE S BMTEXT, TEXT /BM/ S PBMX0, BMX0 S PBMY0, BMY0 END