C PROGRAM PROPAG.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 AUG 24, 1977 C AUG 23, 1977 C C INTRODUCTION C ------------ C PROPAG.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. THE ARGUMENTS ARE THEN CHECKED C AND THEN ALL PIXELS OF VALUE 1 ARE PROPAGATED INTO C 8-NEIGHBOR ADJACENT PIXELS OF VALUE > 1. C C _PROPAGATE, - Propagate all 1's in BMi into BMj C using BMj' as a scratch area. 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 PROPAGATE 8/24/77 - 5:09PM') CALL DAYTIME(1) CALL DAYTIME(3) ET=TIMER(0) 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) DO 250 INDEX=1,3,2 250 WRITE(INDEX,251)JBM,J,IBM1,I,KX1-1,KX2-1,KY1-1,KY2-1 251 FORMAT(' BM',I1,A1,'<==BM',I1,A1,' [',I3,':',I3,' , ' 1,I3,':',I3,']') C C C C C [2] VERIFY BM SPECS C C 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<==ZERO C COLOR IT ZERO ICNUM=0 IVAL=1 CALL BMAX1 C C C C [2.3] COPY NON-ZERO PIXELS INTO BMJ C DO 230 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 C DO 230 IX1=KX1,KX2 IX=IX1-1 S TAD \IX S DISP1 /PUT BMX ADDRESS IN LEFT LED'S C C FOLLOW CURSOR IN BMJ S TAD \IXPOSITION S TAD \IX S LDXP C S TAD \IYPOSITION S TAD \IY S LDYP C C C MEM=IBM1 IBYTE=IHGH1 S JMS FETCH2D C C IF IZ NEQ 0 C THEN DO NOT COPY S TAD \IZ S SNA CLA S JMP \230 /DO NOT COPY C C COPY PIXEL MEM=JBM IBYTE=JHGH CALL PACK2D 230 CONTINUE C [3] PROPAGATE CALL PROP1 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: F E T C H 2 D * C ********************************************************* C FETCH IZ=BM(MEM&IY&IX,IBYTE); C C FETCH AN 8-BIT BYTE FROM THE SPECIFIED BM C C ARGS IN COMMON FOR SPEED C ------------------------ C MEM - BM NUMBER 0 TO 7 C IBYTE - 0 (LOW), 1 FOR HIGH BYTE OF 16 BIT BYTE C IX - XADDR , 0 TO 255 C IY - YADDR, 0 TO 255 C IZ - RESULT. C S CPAGE 3 S RFETCH2D, JMP I FETCH2D S FETCH2D, 0 C C C [1] INITIALIZE PDP8/E REGISTERS S DMACLR S TAD PBUFF /BUFFER POINTER S DMACA /LOAD ADDRESS REGISTER S CLA CLL IAC RAL /2 WORDS S DMAWC /LOAD WORD COUNT REGISTER C C C [2] SET UP I/O DEVICE ADDRESS REGISTERS C S TAD \MEM S CLL RTL; RTL /MOVE BITS [9:11] ==> [5:7] S MQL S TAD \IY S CLL RTR; RTR /MOVE BITS [4:7] ==> [8:11] S AND (0017 S MQA S EXDMA1 /HIGH-ORDER WORD C S TAD \IY S CLL RTR; RTR; RAR /MOVE BITS [8:11] ==> [0:3] S AND (7400 S TAD \IX S EXDMA2 /LOAD LO-ORDER WORD C C C [3] EXECUTE COMMAND C S RIF /GET CURRENT DATA FIELD FOR READ S DMAGO /DO IT! S DCA 7 /ZERO COUNTER C S RBM, DMASKP /WAIT 'TIL DONE S SKP S JMP F2D4 /DONE WITH I/O S ISZ 7 S JMP RBM /NOT YET S JMP \100 /OVERFLOW C C C [4] GET 8 BIT WORD FROM 16 BIT DATA C S F2D4, TAD \IBYTE /=1 FOR HIGH PACKING, =0 FOR LOW PACKING S SZA CLA S JMP GETHIGH C C C [4.1] GET LOW BYTE S TAD BUFF S AND (0377 S DCA \IZ S JMP RFETCH2D /DONE, RETURN C C C [4.2] GET HIGH BYTE S GETHIGH, TAD BUFF S MQL S TAD BUFF# S CPAGE 2 S SHL S 3 /LEFT SHIFT 4 BITS S AND (377 S DCA \IZ /STORE IT S JMP RFETCH2D /DONE, RETURN C C C C [5.] FATAL BM DMA TIMEOUT ERROR S\100, CLA S DMACLR WRITE(1,101) 101 FORMAT('PROPAGATE DMA TIMEOUT ERROR, RE-BOOT THE SYS:!') S HLT GOTO 100 C C BUFFER S PBUFF, BUFF S CPAGE 2 S BUFF, BLOCK 2 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 PIBUF1, \IBUF1 S PIBUF2, \IBUF2 S PIBUF3, \IBUF3 S PIBUF4, \IBUF4 S PI10, \I10 S BMTEXT, TEXT /BM/ END