C PROGRAM FILTER.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 MARCH 9, 1977 C MARCH 8, 1977 C MARCH 6, 1977 C MARCH 5, 1977 C MARCH 4, 1977 C FEB 7, 1977 C C C C INTRODUCTION C ------------ C FILTER.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 _FILTER, , (Opt. numerator n, denominator d C scale factor n/d, +b) (Opt /C) - Requests a 3x3 C neighborhood via the command decoder as: C The direction list may contain up to 100 points. C A direction list entry is a 4-tuple: consisting of C [Di,Ni,XRELi,YRELi] with optional (/N,/X,/Y) C switches which change the sign of (N, XREL or YREL). C C The resultant pixel is computed as: C C g'(x,y) = SUM[over i of g(x+XRELi,y+YRELi)*(Ni/Di)]. C C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF DCAI 3400 C C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C S OPDEF SWAB 7431 S OPDEF SWBA 7447 S OPDEF SHL 7413 S OPDEF ASR 7415 S OPDEF DAD 7443 S OPDEF DST 7445 S OPDEF DPIC 7573 S OPDEF CAM 7621 S OPDEF MUY 7405 S OPDEF DVI 7407 C S OPDEF CLAMQ 7621 S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF BSW 7002 C C C NOTE: THE DIRECTION LIST IS STORED IN IBUF1 TO IBUF4 C C IBUF1= NI STACK C IBUF2= DI STACK C IBUF3=IXRELI STACK C IBUF4= IYRELI STACK C C [1] INITIALIZATION WRITE(1,995) 995 FORMAT('FILTER 3/9/77 - 5: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] GET THE FILTER DIRECTION LIST. C C FIRST SAVE THE /C SWITCH KOMP=ISW(3) C C SAVE PARAMETERS LB=ICNUM(3) LD=IDENOMINATOR LN=INUMERATOR C STAR='*' J=0 K=0 C C [3.1] REQUEST A DIRECTION 4-TUPLE 640 WRITE(1,641)STAR, 641 FORMAT(' [N,D,XREL,YREL]=',A1) CALL BCDSPEC IF(ICNUM)642,650,642 C C GET THE DATA 642 IPTOP=IPTOP+1 IF(IPTOP-256)643,643,999 C C IF /N THEN- ELSE + C SAVE Ni 643 IBUF1(IPTOP)=ICNUM(1-2*ISW(12)) C C Save Di IBUF2(IPTOP)=ICNUM(2) C C IF /X THEN - ELSE + IX=ICNUM(3)*(1-2*ISW(24)) C SAVE IXRELi IBUF3(IPTOP)=IX KX1=MIN(KX1,MAX(1,(KX1+IX))) KX2=MAX(KX2,MIN(256,(KX2+IX))) C C IF /Y THEN - ELSE + IY=ICNUM(4)*(1-2*ISW(25)) C SAVE IYRELi IBUF4(IPTOP)=IY KY1=MIN(KY1,MAX(1,(KY1+IY))) KY2=MAX(KY2,MIN(256,(KY2+IY))) GOTO 640 C C C C [3.2] PROCESS 256 LINES 650 DO 301 IY1=KY1,KY2 IY=IY1-1 S TAD \IY S DISP2 /PUT BMY ADDRESS IN RIGHT LED'S C S CPAGE 3 S JMS TTYCTL /TEST FOR TTY INPUTS S JMP \998 /ERROR RETURN: ABORT C C C [3.3] PROCESS A LINE DO 301 IX1=KX1,KX2 IX=IX1-1 S TAD \IX S DISP1 /PUT BMX ADDRESS IN LEFT LED'S C C C [3.3.1] COMPUTES: IC=(SUM [m=1:IPTOP] (Ni*g(IX+IXreli,IY+IYreli)/Di) C C SETUP THE DIRECTION LIST POINTERS C Ni S CLA CMA S TAD PBUF1 S DCA 14 C C Di S CLA CMA S TAD PBUF2 S DCA 15 C C IXRELi S CLA CMA S TAD PBUF3 S DCA 16 C C IYRELi S CLA CMA S TAD PBUF4 S DCA 17 C C ZERO THE SUM IC=0 S DCA \IC# C C C [3.3.1.1] IC[1:2]<==SUM (Ni*IZ)/Di. DO 302 I=1,IPTOP C C FETCHE THE POINTERS S CPAGE 16 S 6211 S TADI 14 S DCA \INUMERATOR S TADI 15 S DCA \IDENOMINATOR S TADI 16 S DCA \IX2 S TADI 17 S DCA \IY2 C C GET THE PIXEL ADDRESS IX=(IX1-1)+IX2 IY=(IY1-1)+IY2 C MEM=IBM1 IBYTE=IHGH1 CALL FETCH2D C C GET THE SIGN OF NI, MAKE INUMERATOR > 0, C AND SET UP DCM IF NEEDED LATER. C then compute: (NI*IZ)/DI S TAD \INUMERATOR S SPA CLA S TAD (0575 /DCM-NOP S TAD (7000 /NOP S DCA COMPL /SET UP NEGATION OF PRODUCT C C C COMPUTE: NI<==|NI| S TAD \INUMERATOR S SPA S CIA S DCA \INUMERATOR C S CPAGE 16 S TAD \IZ S SWAB S MUY S \INUMERATOR C C NOW DIVIDE BY Di S DVI S \IDENOMINATOR C C ZERO THE REMAINDER IN THE AC. QUOTIENT IN MQ S CLA C C IF Ni > 0 then a NOP else DCM S COMPL, NOP /DEPOSITED HERE. C C C C COMPUTE: IC[1:2]=IC[1:2]+(Ni*IZ)/Di S DAD S \IC C S DST S \IC S CLAMQ 302 CONTINUE C C C [3.3.2] IF IC[1:2] < 0 C THEN LC<==0 S TAD \IC# S SMA CLA S JMP \303 /> 0 IC=0 S DCA \IC# C C C [3.3.3] COMPUTE: IC=((LC/LD)*LN)+IB 303 LC=0 S TAD \IC# S DCA \LC S TAD \IC S SWAB S TAD \LC S CPAGE 5 S DVI S \LD S CLA /0==>REMAINDER S MUY S \LN S CLA S MQA /GET THE MQ RESULT C S TAD \LB S DCA \IC S SWBA C C C [3.3.4] CLIP TO 2047 S TAD \IC S SMA S JMP \307 S CLA S TAD (D2047 /CLIP C S \307, DCA \IZ C C CLIP TO 0:255 S TAD \IZ S SPA S CLA /<0, ==> 0 S TAD (-D255 S SMA S CLA />255, ==>255 S TAD (D255 S DCA \IZ C C C [3.3.5] TEST IF COMPLEMENT S TAD \KOMP S SNA CLA S JMP \305 /NO IZ=255-IZ C C C C [3.3.6] STORE THE RESULT 305 MEM=JBM IBYTE=JHGH IX=IX1-1 IY=IY1-1 CALL PACK2D C 301 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/ S PI10, \I10 /POINTER S PBUF1, \IBUF1 S PBUF2, \IBUF2 S PBUF3, \IBUF3 S PBUF4, \IBUF4 END