C PROGRAM GETI1.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 14, 1977 /FROM BMIO.FT OF NOV 11, 1977 C C C PURPOSE C ------- C GETI1 (MEM,IBYTE,IX,IY) ==>I10 TO I18 C DUBPLICATING POINTS ON THE BOUNDARY CONDITIONS. C C C NOTE: ARGUMENTS (MEM,IBYTE,IX,IY, C I10,I11,I12,...,I18) ARE PASSED THROUGH COMMON C C NOTE: AUTO INDEX REGISTERS 10 THROUGH 17 ARE DESTROYED C IN GETI1 AND T3BUF I/O. C C NOTE: THE MQ IS DESTROYED IN ALL CALLS. C C C C C 1. (INTERNAL SUBR) R6BYTES - READ 3 CONSECUTIVE BYTES FROM C (MEM,IBYTE,IX,IY)==>CURRENT FIELD LOCS 10,11,12. C C 2. (INTERNAL SUBROUTINE) SETBADDR - COMPUTE AND LOAD C THE BM PIXEL ADDRESS (MEM&IY&IY)==>EXDMA[1:2]; C OPDEFS C ------ S OPDEF RIF 6224 C S OPDEF TADI 1400 S OPDEF DCAI 3400 C C 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 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 CLAMQ 7621 C S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF BSW 7002 C C C ********************************************************* C SUBROUTINE: G E T I 1 * C ********************************************************* C GET CURRENT NEIGHBORHOOD AT (MEM,IBYTE,IX,IY) AND STORE IT IN C C YM = I13,I12,I11 C Y = I14,I18,I10 C YP = I15,I16,I17. C C BOUNDARY CONDITIONS FOR REMAPPING PIXELS C ---------------------------------------- C LINE YM=-1 <==> LINE Y=0 C LINE YP=256 <==> LINE Y=255 C BOUNDARY POINTS XM=-1 <==> X=0 C BOUNDARY POINTS XP=256 <==> X=255 C S ENTRY GETI1 S CPAGE 2 S GETI1, BLOCK 2 C C [1] SAVE IY,IX S TAD \IY S DCA 17 S TAD \IX S DCA 16 C C C [1.1] SETUP COMMAND WORD (IN C(13)) FOR USE IN R6BYTES S TAD \IBYTE S SZA CLA S TAD (0200 /HIGH BYTE S TAD (0200 /LOW BYTE S RIF /OR IN THE CURRENT DATA FIELD S DCA 15 /COMMAND WORD TO BE USED IN R6BYTES C C C [2] GET THE THREE PARTIAL LINES OF THE NEIGHBORHOOD C C [2.1] GET I3,I2,I1 AT (IX-1,IY-1) S CLA CMA S TAD 16 S SPA S CLA /MAKE X =-1 ==> 0 S DCA \IX C S CLA CMA S TAD 17 S SPA /IF < 0 THEN CLIP IY TO 0; S CLA S DCA \IY C S JMS R6BYTES C C COPY (10,11,12) INTO NEIGHBORHOOD S TAD 10 S DCA \I13 S TAD 11 S DCA \I12 S TAD 12 S DCA \I11 C C C [2.2] GET I4,I8,I0 AT (IX-1,IY) S TAD 17 S DCA \IY S JMS R6BYTES C C COPY (10,11,12) INTO NEIGHBORHOOD S TAD 10 S DCA \I14 S TAD 11 S DCA \I18 S TAD 12 S DCA \I10 C C C [2.3] GET I5,I6,I7 AT (IX-1,IY+1) C IF (IY_IY+1) > 255 C THEN IY_255; S INC \IY S TAD \IY S TAD (-D256 S SPA CLA S JMP R23OK IY=255 S R23OK, JMS R6BYTES C C COPY (10,11,12) INTO NEIGHBORHOOD S TAD 10 S DCA \I15 S TAD 11 S DCA \I16 S TAD 12 S DCA \I17 C C C [2.4] RESTORE X,Y BEFORE TEST X S TAD 17 S DCA \IY S TAD 16 /SAVED X S DCA \IX C C C [3] FIX UP BOUNDARY PIXELS FOR X=0 AND X=255 C NOTE: THE CASES FOR Y=0 AND Y=255 ARE HANDLED IN R3LINES. S CLA CMA S TAD \IX S SMA CLA S JMP \1302 /IX > 0 I13=I12 I14=I18 I15=I16 GOTO 1399 C C S\1302, TAD \IX S TAD (-D256 S SMA CLA S JMP \1399 /IX < 256 1303 I11=I12 I10=I18 I17=I16 C C S \1399, RETRN GETI1 C ######################################################### C # INTERNAL SUBROUTINE: R 6 B Y T E S C ######################################################### C READ IBYTE PACKED OF (MEM&IY&IX):(MEM&IY&IX+5)==>LOC('10)[1:4], C THEN UNPACK THE THE 3 BYTES INTO 10, 11, 12. C C S CPAGE 3 S RR6BYTES, JMP I R6BYTES S R6BYTES, 0 /ENTRY C C [1] SETUP GETI1 TO READ 6 BYTES ==> BUFF[1:4] S CLA CLL IAC RTL /LOAD 0004 S DMAWC C S TAD (10 /LOC '10 OF CURRENT FIELD S DMACA C C SETUP THE BM I/O PIXEL ADDRESS (MEM&IY&IX)==>EXDAM[1:2]; 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 /'OR' S EXDMA1 /HIGH-ORDER WORD C S TAD \IY C@S CLL RTR; RTR; RAR /MOVE BITS [8:11] ==> [0:3] S BSW; RTL / ALTERNATIVE MICROCODE SEQUENCE S AND (7400 S TAD \IX S EXDMA2 /LOAD LO-ORDER WORD C C S TAD 15 /READ COMMAND WORD (SETUP BY GETI1) S DMAGO /READ (0000) 6 BYTES ==>BUFF[1:4] S DCA 7 C S R6WAIT, DMASKP S SKP S JMP \1800 /DONE S ISZ 7 S JMP R6WAIT /NOT YET S JMP \100 /OVERFLOW C C C [2] UNPACK 1ST THREE BYTES ==> 10, 11, 12 S\1800, TAD 16 /IF X=0, THEN UNPACK ONLY THE 2ND AND 3RD BYTES S /FROM 1ST AND 2ND BYTES S SZA CLA S JMP \1801 /NORMAL UNPACKING C C SPECIAL CASE OF X=0 (SO 1ST BYTE IS REALLY 2ND, 2ND IS C REALLY 3RD C NOTE BYTE IN 10 WILL BE TRASH S TAD 11 /X=1 S AND (377 S DCA 12 C S TAD 10 /X=0 S AND (377 S DCA 11 S JMP RR6BYTES C C NORMAL UNPACKING S\1801, TAD 10 /B3H&B1 S RTR; RTR S AND (0360 S MQL S TAD 11 /B3L&B2 C@S RTL; RTL; RAL S BSW; RTR /ALTERNATIVE MICROCODE S AND (0017 S MQA S DCA 12 /PASS BACK 3RD BYTE C S TAD 10 S AND (377 S DCA 10 C S TAD 11 S AND (377 S DCA 11 C C C RETURN S JMP RR6BYTES C C C ****************** E R R O R ************************ S\100, CLA S DMACLR WRITE(1,101) 101 FORMAT('GETI1 DMA ERR') S HLT GOTO 100 C END