C PROGRAM ZOOM.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 NOV 22, 1976 C NOV 18, 1976 C C C C INTRODUCTION C ------------ C ZOOM.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 ZOOM 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 *_ZOOM,,(magnification N,D). C (opt. /A to puthe 256x256 image into 512x512). C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF DCAI 3400 C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C S OPDEF SWAB 7431 S OPDEF SWBA 7447 C S OPDEF MUY 7405 S OPDEF DVI 7407 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 OPDEF HPL 6360 S OPDEF HSL 6361 S OPDEF VPL 6362 S OPDEF VSL 6363 C [1] INITIALIZATION WRITE(1,995) 995 FORMAT('ZOOM 12/7/77 - 4:01PM') ET=TIMER(0) C C C C [2] VERIFY BM SPECS S JMS CKIN S JMS CKOUT C@@S JMS CKIN2 C C C C [3] COMPUTE SCALE FACTORS SCALE=FLOAT(INUMERATOR)/FLOAT(IDENOMINATOR) C MXSIZE=FLOAT((KX2-KX1+1))*SCALE MYSIZE=FLOAT((KY2-KY1+1))*SCALE C C IF NOT /A C THEN MX1=1 MX2=MIN(256,MXSIZE) MY1=1 MY2=MIN(256,MYSIZE) C MEAN=128 C C C IF /A C THEN DO 512X512 S TAD \ISW /"/A" S SNA CLA S JMP \199 MEAN=256 MX1=1 MY1=1 MX2=MIN(512,MXSIZE) MY2=MIN(512,MYSIZE) C C C COMPUTE OFFSET 199 IXOFF=MEAN-(MX2/2) IYOFF=MEAN-(MY2/2) C C C LOAD EAE S TAD \IDENOMINATOR S DCA M1 S TAD \INUMERATOR S DCA D1 C C C [4] PROCESS IMAGE DO 200 IY1=MY1,MY2 C S CPAGE 3 S JMS TTYCTL S JMP \998 /DONE C LY=FLOAT(KY1-1) + FLOAT(IY1-1)/SCALE C S TAD \LY S DISP2 C C C [4.1] PROCESS A LINE DO 200 IX1=MX1,MX2 IY=IY1-1 C COMPUTE: LX=(KX1-1) + (IX1-1)/SCALE C =(KX1-1)+(IX1-1)*IDENOMINATOR/INUMERATOR S CLA CMA S TAD \IX1 S MQL S CPAGE 2 S MUY S M1, 0 C S CPAGE 2 S DVI S D1, 0 S CLA S MQA S TAD (-1 S TAD \KX1 S DCA \LX C S TAD \LX S DISP1 C C C [4.1.1] GET BMI==>BMJ IX=LX IY=LY MEM=IBM1 IBYTE=IHGH1 CALL FETCH2D C IX=IX1-1+IXOFF IY=IY1-1+IYOFF MEM=JBM IBYTE=JHGH C C [4.1.2] DRAW THE POINT C IF NOT /A C THEN USE JBM S TAD \ISW /"/A" S SNA CLA S JMP \419 /USE JBM C C COMPUTE BMiL S TAD \IX S AND (400 S SZA CLA S IAC /EITHER 0 OR 2 S DCA \MEM S TAD \IY S AND (400 S SZA CLA S TAD (2 /EITHER 2 OR 3 S TAD \MEM S DCA \MEM C C S TAD \IY S AND (377 S DCA \IY C S TAD \IX S AND (377 S DCA \IX C 419 CALL PACK2D 200 CONTINUE C C C C C [999] RETURN GOTO 998 999 WRITE(1,996) 996 FORMAT('BAD BM 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