C PROGRAM NGHSE.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 23, 1978 C C INTRODUCTION C ------------ C NGHSE.FT IS A CHAINED PROGRAM USED WITH BMON2 C IT RECEIVES ITS ARGUMENTS FROM THE CD AREA AND THE IBM1,IHGH1 C VARIABLES IN COMMON. C C _NGHSE,,(Opt. # iterations n) - Perform neighborhood C MAX (/X) or MIN (default). C Note: MAX corresponds to a grayscale "shrink" operation and MIN C corresponds to a grayscalen "expand" operation. C OPDEFS C ------ C S OPDEF RIF 6224 S OPDEF DMAGO 6070 S SKPDF DMASKP 6071 S OPDEF DMAWC 6072 S OPDEF DMACA 6073 S OPDEF DMACLR 6074 S OPDEF EXDMA1 6524 S OPDEF EXDMA2 6525 C C S OPDEF LQDT1 6375 S OPDEF LQDT2 6376 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 SHL 7413 S OPDEF MUY 7405 S OPDEF DVI 7407 C S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF KRS 6034 S OPDEF BSW 7002 C C S OPDEF LDXP 6443 S OPDEF LDYP 6444 C C [1] INITIALIZATION WRITE(1,995) WRITE(3,995) 995 FORMAT('0 NGHSE 1/23/78 - 5:09PM') CALL DAYTIME(1) CALL DAYTIME(3) ET=TIMER(0) C C DEFINE WHETHER A MAX OR A MIN C COPY /X SWITCH VALUE ISWX=ISW(24) IF(ISWX)161,160,161 C NO /X, IT IS A MIN 160 CURSYM='MIN' GOTO 162 C YES, /X ==> MAX 161 CURSYM='MAX' 162 CONTINUE C C C C GET THE BM NAME S TAD (4040 /" " S DCA \I S TAD \IHGH1 S RAR /BIT 11==>LINK S CLA S TAD (1000 /"H@" S SZL /ADD "H" IF HIGH PART S DCA \I S CLA C C GET THE BM NAME S TAD (4040 /" " S DCA \J S TAD \JHGH S RAR /BIT 11==>LINK S CLA S TAD (1000 /"H@" S SZL /ADD "H" IF HIGH PART S DCA \J S CLA C C C SET THE MAX WINDOW TO [1:254] KX1=MAX(2,KX1) KY1=MAX(2,KY1) KX2=MIN(255,KX2) KY2=MIN(255,KY2) C C GET THE TOTAL # ITERATIONS. DEFAULT TO 1 S TAD \ICNUM S SNA S TAD (D1 /DEFAULT IF ZERO S DCA \ITERATIONS C C DO 250 INDEX=1,3,2 250 WRITE(INDEX,251)JBM,J,CURSYM,IBM1,I,KX1-1,KX2-1,KY1-1 1,KY2-1,ITERATIONS 251 FORMAT(' BM',I1,A1,'<==NGH',A3,' BM',I1,A1,' [',I3,':' 1,I3,' , ',I3,':',I3,']',', # PASSES=',I5) C C C C C [2] VERIFY BM SPECS S JMS CKIN S JMS CKOUT C@@S JMS CKIN2 C C C [2.1] GET THE OUTPUT WINDOW OFFSETS IXPOSITION=LSAVE(13,JBM+1) IYPOSITION=LSAVE(14,JBM+1) C C C [2.2] COPY BMJ<==BMI, 1:254X1:254 DO 220 IY1=KY1,KY2 IY=IY1-1 S TAD \IY S DISP2 C S TAD \IY S TAD \IYPOSITION S LDYP C MEM=IBM1 IBYTE=IHGH1 CALL T3BUF(IBUF1,2) C C ZERO THE 2 X END PTS IBUF1=0 IBUF1(256)=0 MEM=JBM IBYTE=JHGH 220 CALL T3BUF(IBUF1,3) C C C [3] PROCESS MIN (ISWX=0) OR MAX(ISWX=1) # ITERATIONS JCOUNT=0 C C IF NOT /X C THEN INSERT "CIA" IN PROCESSINGKERNAL TO COMPUTE "MIN"; S TAD \ISWX S SNA CLA S TAD (0041 /CIA-NOP S TAD (7000 /"NOP" S DCA INST /FOR MAX C 399 MEM=JBM IBYTE=JHGH C C COUNT DOWN THE TOTAL PROP COUNTER C IF (ITERATIONS_ITERATIONS-1)< 0 C THEN TERMINATE; ITERATIONS=ITERATIONS-1 S TAD \ITERATIONS S SPA CLA S JMP \998 C C LOAD THE CURRENT PROP INTO THE QMT DISPLAY JCOUNT=JCOUNT+1 IZ=IBCD(JCOUNT,-1) S TAD \IZ S LQDT1 S LQDT2 C C C DO 300 IY1=KY1,KY2 C S CPAGE 3 S JMS TTYCTL /TEST FOR TTY INPUTS S JMP \998 /ERROR RETURN: ABORT C IY=IY1-1 S TAD \IY S DISP2 /PUT BMY ADDRESS IN RIGHT LED'S C S TAD \IYPOSITION S TAD \IY S LDYP C C C GET TRIPLE LINE BUFFER S JMS GET3LINES C C COPY IBUF4<==IBUF2 S TAD (-D256 S DCA 10 S CLA CMA S TAD \KPTR2 S TAD PBUF1 S DCA 11 S CLA CMA S TAD PBUF4 S DCA 12 S CPAGE 7 S DCA \IZ S COPY14, TADI 11 S DCAI 12 S ISZ 10 S JMP COPY14 /NOT DONE C DO 310 IX1=KX1,KX2 S CLA CMA S TAD \IX1 S DCA \IX C S TAD \IX S TAD \IXPOSITION S LDXP C C C GET THE NEIGHBORHOOD S JMS GETNGH C C PROCESSING KERNAL C FIND MAX(MIN) OR I10:I17 C SET 8 COUNT S TAD (-D8 S DCA 25 /COUNTER C SETUP I10 PTR AS AUTOINDEX S CLA CMA S TAD PI10 S DCA 11 C DEFINE IZ AS INITIAL VALUE, I18, ALS SET COMMON DF S TAD \I18 S CPAGE 17 S DCA \IZ C LOOP AND FIND LOCAL MAX (MIN). S LOOP, TADI 11 /I1(I) S MQL /SAVE IT S MQA S CIA S TAD \IZ C **** IF MIN THEN ADD CIA ELSE NOP; S INST, CIA /CIA FOR MIN, NOP FOR MAX C IF AC < 0 C THEN DEFINE NEW EXTREMA S SMA CLA S JMP TSTDONE S MQA S DCA \IZ C TEST IF DONE S TSTDONE, ISZ 25 /CTR S JMP LOOP /NOT YET C DONE! RESULTS IN AC C C C COMPUTE: IBUF4(IX1)=IZ S TAD PBUF4 S TAD \IX S DCA 7 S CPAGE 4 S TAD \IZ S DCAI 7 C 310 CONTINUE C C WRITE OUT LINE CALL T3BUF(IBUF4,3) C 300 CONTINUE C C CONTINUE THE PROCESSING GOTO 399 C C C [999] RETURN GOTO 998 999 WRITE(1,996) 996 FORMAT('BAD BM SPECIFICATION!') 998 ET=TIMER(2) C C 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 ************************************************** C *SUBROUTINE G E T 3 L I N E S C *************************************************** C READ THREE LINES INTO THE TRIPLE LINE BUFFER C IBUF1,2,3. C C ==> LATER IMPLEMENT FETCH 1 LINE/CALL: C IF IY1=KY1 C THEN RESET IBUF1,2,3 PTRS, READ 3 LINES (Y-1,Y,Y+1) C ELSE INCR IBUF1,2,3 PTRS, READ IN Y+1; C S CPAGE 3 S RGET3LINES, JMP I GET3LINES S GET3LINES, 0 /ENTRY C C C TEST IF FIRST LINE IF(IY1-KY1)801,800,801 C READ 3 LINES INTO C LINE Y-1: IBUF1 C LINE Y : IBUF2 C LINE Y+1: IBUF3 C C C IF IY-1< 0 THEN READ IY==>IBUF1 S \800, TAD (-2 S TAD \IY1 S SPA S CLA /READ LINE 0 S DCA \IY CALL T3BUF(IBUF1,2) C C READ LINE IY IY=IY1-1 CALL T3BUF(IBUF2,2) C C IF IY+1 > 255 C THEN READ LINE 255 S TAD \IY1 /Y+1 S TAD (-D256 S SNA S CLA CMA /ADD -1 S TAD (D256 /ADD BACK 256 S DCA \IY CALL T3BUF(IBUF3,2) C IY=IY1-1 C C RESET PTRS KPTR1=0 KPTR2=256 KPTR3=512 S JMP RGET3LINES C C C ELSE GET NEXT LINE 801 IZ=KPTR3 KPTR3=KPTR2 KPTR2=KPTR1 KPTR1=IZ C C GET NEXT LINE CALL T3BUF(IBUF1(KPTR3+1),2) S JMP RGET3LINES C ******************************************************** C *SUBROUTINE G E T N G H C ******************************************************** C HAVING PREVIOUSLY CALLED GET3LINES, NOW GET THE NEIGHBORHOOD C FROM THE TRIPLE LINE BUFFER. NOTE: NEIGHBORHOODS FOR C IX,IY = EITHER 0 OR 255 ARE GARBAGE!. YOUR RESPONSIBILITY! S CPAGE 3 S RGETNGH, JMP I GETNGH S GETNGH, 0 /ENTRY C C [1] IF OR Y AT BOUNDARY USE GETI1 ELSE GET FROM BUFFER C IF (IX=0) OR (IX=255) OR (IY=0) OR (IY=255) C THEN GETI1, RETURN C ELSE GET FROM BUFFER C S TAD \IX S SNA S JMP GETTHEN S TAD (-D255 S SNA CLA S JMP GETTHEN C S TAD \IY S SNA S JMP GETTHEN S TAD (-D255 S SZA CLA S JMP GETELSE C C C [1.1] GET I1 S GETTHEN, CALL 0,GETI1 S JMP RGETNGH /RETURN C C C [1.2] SETUP THE PTRS S GETELSE, CLA CLL CMA RAL /-1 FOR AUTOINDEX REG, -1 FOR LEFT NEIGH POINT S TAD \IX S TAD PBUF1 /LINE Y-1 S MQL S MQA S TAD \KPTR1 S DCA 10 C C NOTE: LINE Y PTR = LINE Y-1 PTR + 256 S MQA S TAD \KPTR2 S DCA 11 C C NOTE: LINE Y+1 PTR = LINE Y PTR +256. S MQA S TAD \KPTR3 S DCA 12 /LINE Y+1 C C C [2] GET NEIGHBORHOODS C GET LINE Y-1 S CPAGE 4 S DCA \I13 /FORCE COMMON DATA FIELD S TADI 10 S CPAGE 4 S DCA \I13 S TADI 10 S CPAGE 4 S DCA \I12 S TADI 10 S CPAGE 4 S DCA \I11 C C GET LINE Y S TADI 11 S CPAGE 4 S DCA \I14 S TADI 11 S CPAGE 4 S DCA \I18 S TADI 11 S CPAGE 4 S DCA \I10 C C GET LINE Y+1 S TADI 12 S CPAGE 4 S DCA \I15 S TADI 12 S CPAGE 4 S DCA \I16 S TADI 12 S DCA \I17 S JMP RGETNGH /RETURN C************** P A R A M E T E R S ************* S PBUF1, \IBUF1 S PBUF2, \IBUF2 S PBUF3, \IBUF3 S PBUF4, \IBUF4 S PI10, \I10 S BMTEXT, TEXT /BM/ END