C PROGRAM FINDFS.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 JUNE 24, 1977 C C C C INTRODUCTION C ------------ C FINDFS.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 *(OPT. or QRj)_FINDFS,(OPT. or QRi) (/F /R /P) - C if /F then find the minimum window around BMi such that pixels C outside of the window but inside of the current window are zero. C Put the F&S at the minimum window around BMi unless BMj is specified C or QRj is specified. If QRj is specified, then save C (HP,VP,HS,VS) in QRj:QRj+3. C C If /P is specified then save the current computing window C at into QRj:QRj+3. C C If /R is specified, then restore the current window contained C in QRi:QRi+3 into . C C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF DCAI 3400 C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C S OPDEF LDXP 6443 S OPDEF LDYP 6444 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 OPDEF HPL 6360 S OPDEF HSL 6361 S OPDEF VPL 6362 S OPDEF VSL 6363 C C OPDEF HPR 6320 S OPDEF HSR 6321 S OPDEF VPR 6322 S OPDEF VSR 6323 C [1] INITIALIZATION WRITE(1,995) WRITE(3,995) 995 FORMAT(' FINDFS 6/24/77 - 4:01PM') ET=TIMER(0) C C C C [2] TEST SWITCHES AND DISPATCH IFSW=ISW(6) IRSW=ISW(18) IPSW=ISW(16) IF(IFSW+IRSW+IPSW-1)999,200,999 C 200 IVAL=IFSW+2*IPSW+3*IRSW C SETUP CASE STATEMENT GOTO(300,400,500),IVAL C C C [3] PROCESS IMAGE C VERIFY THAT BMI EXISTS 300 CONTINUE S JMS CKIN C C [3.1] FIND NEW WINDOW MEM=IBM1 IBYTE=IHGH1 IXOFFSET=LSAVE(13,IBM1+1) IYOFFSET=LSAVE(14,IBM1+1) C C [3.1.1] FIND TOP (KY1) DO 310 IY1=KY1,KY2 S CPAGE 3 S JMS TTYCTL S JMP \998 /DONE IY=IY1-1 S TAD \IY S DISP2 DO 310 IX1=KX1,KX2 IX=IX1-1 CALL FETCH2D C IF IZ = 0 C THEN DONE; S TAD \IZ S SZA CLA S JMP \311 /Z NEQ 0 C C LOAD CURSOR S TAD \IX S TAD \IXOFFSET S LDXP S TAD \IY S TAD \IYOFFSET S LDYP C 310 CONTINUE 311 IYPOSITION=IY KY1=IY+1 C C C [3.1.2] FIND BOT (KY2) DO 320 IY1=KY1,KY2 S CPAGE 3 S JMS TTYCTL S JMP \998 /DONE IY=(KY2-IY1)+(KY1-1) S TAD \IY S DISP2 DO 320 IX1=KX1,KX2 IX=IX1-1 CALL FETCH2D C IF IZ = 0 C THEN DONE; S TAD \IZ S SZA CLA S JMP \321 /Z NEQ 0 C C LOAD CURSOR S TAD \IX S TAD \IXOFFSET S LDXP S TAD \IY S TAD \IYOFFSET S LDYP C 320 CONTINUE 321 IVSIZE=IY-IYPOSITION+1 KY2=IY+1 C C C [3.1.3] FIND LEFT (KX1) DO 330 IX1=KX1,KX2 S CPAGE 3 S JMS TTYCTL S JMP \998 /DONE IX=IX1-1 S TAD \IX S DISP1 DO 330 IY1=KY1,KY2 IY=IY1-1 CALL FETCH2D C IF IZ = 0 C THEN DONE; S TAD \IZ S SZA CLA S JMP \331 /Z NEQ 0 C C LOAD CURSOR S TAD \IX S TAD \IXOFFSET S LDXP S TAD \IY S TAD \IYOFFSET S LDYP C 330 CONTINUE 331 IXPOSITION=IX KX1=IX+1 C C C [3.1.4] FIND RIGHT (KX2) DO 340 IX1=KX1,KX2 S CPAGE 3 S JMS TTYCTL S JMP \998 /DONE IX=(KX2-IX1)+(KX1-1) S TAD \IX S DISP1 DO 340 IY1=KY1,KY2 IY=IY1-1 CALL FETCH2D C IF IZ = 0 C THEN DONE; S TAD \IZ S SZA CLA S JMP \341 /Z NEQ 0 C C LOAD CURSOR S TAD \IX S TAD \IXOFFSET S LDXP S TAD \IY S TAD \IYOFFSET S LDYP C 340 CONTINUE 341 IHSIZE=IX-IXPOSITION+1 KX2=IX+1 C C C [3.2] IF BMJ EXISTS C THEN OFFSET(BMJ) C ELSE OFFSET(BMI). S TAD \KOUTFILE S TAD (-0215 /"BM" S SZA CLA S JMP \301 /NO OUTPUT BM MEM=JBM C 301 IXOFFSET=LSAVE(13,MEM+1) IYOFFSET=LSAVE(14,MEM+1) C C C [3.3] PRINT WINDOW AND LOAD THE F&S OVER MEM DO 1301 IZ=1,3,2 1301 WRITE(IZ,1302)KX1,KX2,KY1,KY2 1302 FORMAT(' MIN WINDOW=[',I3,':',I3,',',I3,':',I3,']') C IXPOSITION=IBCD(KX1+IXOFFSET,-1) IYPOSITION=IBCD(KY1+IYOFFSET,-1) IHSIZE=IBCD(IHSIZE,-1) IVSIZE=IBCD(IVSIZE,-1) C S TAD \IXPOSITION S HPL S TAD \IYPOSITION S VPL S TAD \IHSIZE S HSL S TAD \IVSIZE S VSL C C C [3.4] IF QRJ THEN GOTO [4.1] ELSE RETURN S TAD \KOUTFILE S TAD (-2122 /"QR" S SNA CLA S JMP \403 /[4.1] GOTO 998 C C C [4] /P PUT THE FRAME IN /U INTO QRJ C CHECK IF BMI VALID S\400, JMS CKIN C C GET THE COMPUTING WINDOW C FORCE /U SWITCH ON ISW(21)=1 IVAL=2 CALL BMAX3 C C C [4.1] TEST IF QRJ VALID THEN SAVE! 403 CONTINUE S TAD \KOUTFILE S TAD (-2122 /"QR" S SZA CLA S JMP \999 /NOT QREGISTER C S TAD \KOUTFILE# S BSW S AND (37 S DCA \IZ /SAVE QR INDEX J IF(IZ)999,401,401 401 IF(IZ-26)402,402,999 C C NOTE: KX1=HP, KX2=HP+HS, KY1=VP, KY2=VP+VS 402 ITMPSTK(IZ)=KX1 ITMPSTK(IZ+1)=KY1 ITMPSTK(IZ+2)=KX2-KX1+1 ITMPSTK(IZ+3)=KY2-KY1+1 C C C [4.2] SAVE THE STATE SINCE MODIFIED QREG CALL BSCOMMON(1) GOTO 998 C C C [5] /R TO RESTORE F&S FRAME IN QRI:I+3 ==>F&S OVER BMJ S\500, JMS CKOUT /MAKE SURE EXISTS C C CHECK IF QRI EXISTS IA=KINFILE(5) IB=KINFILE(6) S TAD \IA /IN 1ST ARG S TAD (-2122 /-"QR" S SZA CLA S JMP \999 /NO C C GET I S TAD \IB S BSW S AND (37 S SNA S JMP \999 /=0 S TAD (-D27 S SMA S JMP \999 /FAILED S TAD (D27 S DCA \IZ C C GET THE RELATIVE WINDOW IXPOSITION=ITMPSTK(IZ) IYPOSITION=ITMPSTK(IZ+1) IHSIZE=ITMPSTK(IZ+2) IVSIZE=ITMPSTK(IZ+3) C C GET THE BMJ OFFSET IX=LSAVE(13,JBM+1) IY=LSAVE(14,JBM+1) C C COMPUTE THE BCD VALUES IXPOSITION=IBCD(IXPOSITION+IX,-1) IYPOSITION=IBCD(IYPOSITION+IY,-1) IHSIZE=IBCD(IHSIZE,-1) IVSIZE=IBCD(IVSIZE,-1) C S TAD \IXPOSITION S HPL S TAD \IYPOSITION S VPL S TAD \IHSIZE S HSL S TAD \IVSIZE S VSL GOTO 998 C C C [999] RETURN GOTO 998 999 WRITE(1,996) 996 FORMAT('BAD BM OR QREG SPECIFICATION!') 998 ET=TIMER(1) CALL CHAIN('BMON2') C*************************************************** C *PROCEDURE C K O U T C****************************************************** C C C CHECK WHETHER THE OUTPUT BM SPEC IS LEGAL ELSE GOTO 999. S CPAGE 3 SRCKOUT, JMP I CKOUT S CKOUT, 0 /ENTRY C C [1] TEST IF KOUTFILE="BM" S TAD \KOUTFILE S CIA S TAD BMTEXT S SZA CLA S JMP \999 /FAILED C C [2] TEST IF (KOUTFILE(2) LAND '7700)=DIGIT S TAD \KOUTFILE# 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 RCKOUT /OK. C C 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 *PROCEDURE C K I N 2 C****************************************************** C C C CHECK WHETHER THE INPUT BM SPEC IS LEGAL ELSE GOTO 999. S CPAGE 3 SRCKIN2, JMP I CKIN2 S CKIN2, 0 /ENTRY C C [1] CHECK FIRST IBM1 SPEC S JMS CKIN C C C [2] TEST IF BMI2="BM" S TAD \SEXT S CIA S TAD BMTEXT S SZA CLA S JMP \999 /FAILED C C [3] TEST IF (BMI2((6) LAND '7700)=DIGIT S TAD \SEXT# 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 RCKIN2 /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************** P A R A M E T E R S ************* S BMTEXT, TEXT /BM/ END