C PROGRAM DICMED.L C ----------------- C C DICOMED 31 IMAGE DISPLAY DEVICE HANDLER C ---------------------------------------- C C C C C C SUBROUTINE DICMED(JX,JY,JZ,IOPR) C C PETER LEMKIN C NATIONAL INSTITUTES OF HEALTH C BETHESDA MARYLAND, 20014 C C C DECEMBER 5, 1972 C C C C ABSTRACT C --------- C OS/8 SUBROUTINE "DICMED" IS A FORTRAN/SABR SUBROUTINE. C IT DISPLAYS THE POINT, 256X256, OR 1024X1024 RASTER IMAGE C ON THE DICOMED MODEL 31 IMAGE DISPLAY AS WELL AS DOING OTHER C DICOMED COMMANDS SUCH AS ERASE, CHANGE GAMMA, TURN ON VIEW C LIGHT, ETC. C C C **PAGE C C INTRODUCTION C ------------ C THE DICOMED MODEL 31 IS DOCUMENTED IN THE DICOMED COMPANY C MANUAL #12M005 "OPERATOR AND PROGRAMMING MANUAL", SEPT. 1971. C THE INTERFACE USES A 12-BIT PARALLEL INTERFACE REGISTER, "XAC", C OF WHICH 9-BITS ARE USED IN COMMUNICATING WITH THE DICOMED. A C TEST AND SET FLIP FLOP IS USED TO DO THE SYNCRONIZATION. IN THE C 9 BIT INTERFACE, BIT 1 CORRESPONDS TO PDP8 AC BIT 0, WHILE BITS C 2 TO 9 OF THE OUTPUT WORD CORRESPOND TO AC BITS 4 TO 11. THE C OUTPUT INTERFACE IS PART OF A 16 CHANNEL OUTPUT MULTIPLEXOR.THE C CHANNEL SELECTION IS DONE BY A SELECT REGISTER "XSR". CHANNEL 0 C IS THE DICOMED CHANNEL. A SIMPLER INTERFACE COULD EASILY BE C BUILT. THE HARDWARE REQUIRED IS A PDP8 (ANY TYPE) WITH EAE C RUNNING UNDER OS/8 WITH EAE OPTION AND A PARALLEL INTERFACE TO C THE DICOMED. THE DICOMED 31 INTERFACE REQUIRES A 9-BIT BUFFER C AND A TESTABLE SYNCHRONIZATION FLIP FLOP. C C ARGUMENT IOPR IS USED TO CONTROL THE DICOMED. SEE THE C IOPR COMMAND TABLE BELOW TO INTERPRET THE VARIOUS COMMANDS C Z IS GIVEN AS AN INTEGER (JZ) FROM 0 TO 63 TO SPECIFY C DENSITY. JX AND JY ARE THE POINT POSITIONS WHEN APPROPRIATE. C C ARGUMENTS C --------- C JX-THE X COORD. 0 TO 1023 LEFT TO RIGHT. C JY-THE Y COORD. 0 TO 1023 TOP TO BOTTOM. C JZ-THE Z VALUE 0 TO 63, (DEPENDS ON NORMAL/COMPLEMENT) C IOPR- THE COMMAND TO BE PERFORMED. C C C C IOPR COMMAND C ---- ------- C 1 DISPLAY THE 256 POINT LINE WHOSE DENSITY (Z) IS GIVEN C IN IBUF. THE STARTING LEFT END POINT IS GIVEN C BY (JX,JY). C C 2 BEGIN PICTURE - ENABLE INPUT DATA, TURN OFF C VIEW LIGHT, TURN OFF IMMAGE WAITING LIGHT. C C 3 END PICTURE-TERMINATE DATA IN, ENABLE C VIEW LIGHT. C C 4 ERASE CURRENT IMAGE AND WAIT 20 SECONDS. C C 5 SET IMAGE NORMAL-0 IS BLACK, 63 IS WHITE. C C 6 SET IMAGE COMPLIMENT-0 IS WHITE. 63 IS BLACK. C C 7 TURN IMAGE WAITING LIGHT FOR OPERATOR. C C 8 SET GAMMA CORRECTOR ON. C C 9 RESET - SET LOGIC IN OPERATE MODE, HORIZONTAL COUNT C AND VERTICAL COUNT TO ZERO, IMAGE WAITING LIGHT OFF, C VIEW LIGHT ON IF ENABLED, IMAGE NORMAL MODE. C C 10 DISPLAY THE POINTS SPECIFIED BY (JX,JY,JZ). C C 11 DISPLAY THE VECTOR SPECIFIED IN THE LINE C BUFFER BY: C X(0)=JX, Y(0)=JY, DELTAX=IBUF(1), C DELTAY=IBUF(2), Z=JZ. C C 12 (DICOMED) 1024X1024 RASTER WITH Z IN IBUF. IN THIS C MODE, THE DICOMED AUTOMATICALLY INCREMENTS THE Y C COUNTER. THE RESET SETS THE Y COUNTER TO 1. C C C C C C C C C C ADDITIONAL INSTRUCTIONS DEFINED C ------------------------------- C ***SPECIAL INTERFACE INSTRUCTIONS*** S OPDEF LXAC 6373 /LOAD INTERMEDIATE BUFFER XAC<==AC. S OPDEF LXSR 6353 /LOAD 4 BIT OUTPUT SELECT REGISTER, C /XSR, FROM BITS 8-11 OF XAC. S SKPDF DICSKP 6332 /SKIP IF DICOMED NOT BUSY, AND CLEAR C /THE ACKNOWLEDGE FLIP FLOP. S OPDEF DICO 6334 /SEND "INPUT REQUEST" TO DICOMED TO READ BITS C /0 AND 4 THROUGH 11 OF THE XAC INTO THE DICOMED. C ***EAE COMMANDS*** S OPDEF MQA 7501 /"OR" AC FROM MQ. S OPDEF MQL 7421 /LOAD AC INTO MQ AND CLEAR THE AC. S OPDEF MUY 7405 /MULTIPLY THE AC-MQ BY (C(P+1)). S OPDEF DVI 7407 /DIVIDE THE AC-MQ BY C(P+1), Q IN MQ, C REM IN AC. C ***INDIRECT MRI INSTRUCTIONS*** S OPDEF DCAI 3400 /SABR CDF ESCAPES. S OPDEF TADI 1400 /SABR CDF ESCAPE. C C C C C PAGE 2 **************************************** COMMON IHIST,HEADER,IBUF DIMENSION IHIST(257),HEADER(12),IBUF(1025) DIMENSION IDATA(257),IP(17),AP(6) EQUIVALENCE (IP(1),AP(1)) C C C C 1.CHECK IF THE IOPR IS VALID. IF(IOPR)999,999,2 2 IF(IOPR-12)3,3,999 999 WRITE(2,998)IOPR 998 FORMAT('BAD IOPR IN DICMED SUBROUTINE') RETURN C C C C C 2. DO A COMPUTED GO TO. S\3, CLA CLL S LXAC /***SELECT THE OUTPUT CHANNEL 0*** S LXSR /LOAD SELECT REGISTER. GO TO (10,20,30,40,50,60,70,80,90,100,110,120),IOPR C C C C C 3. DISPLAY THE LINE IN IBUF BUFFER AT Y COORD C SPECIFIED BY IY. S\10, CLA CLL S TAD (4011 /RESET Y TO JY S JMS XAC S TAD \JZERO /0 OR 77 S MQL /Z=0, JUST TO POSITON Y S TAD I \JY S JMS XAC2 S TAD (4010 /RESET X TO JX S JMS XAC S TAD \JZERO /0 OR 77 S MQL /Z=0 S TAD I \JX S JMS XAC2 /X AT LEFT EDGE. C C C 3.1 SEND THE IBUF X BUFFER DO 19 IX =1,256 S CLA CMA S TAD \IX S TAD PBUF S DCA IXG /POINTER S CPAGE 6 S 6211 /CDF 10 S TADI IXG S JMS 45 S NOP S SKP SIXG, 0 /POINTER S AND (0077 /ONLY LOW 6 BITS S JMS XAC /DISPLAY Z 19 CONTINUE RETURN C C C C 4.BEGIN PICTURE S\20, TAD (4001 S JMS XAC /SEND TO DICOMED RETURN C C C C C 5.END PICTURE S\30, TAD (4004 S JMS XAC RETURN C C C C C 6.ERASE PICTURE AND WAIT 20 SECONDS S\40, TAD (4200 /ERASE PICTURE S JMS XAC DO 49 ITIME=1,20 DO 49 JTIME=1,200 C TIME OUT 1/200 SEC. S TAD (-1700 /> (5000 USEC)/(3.0+3.0 USEC). S DCA 7 /COUNTER SCLOCK, ISZ 7 S JMP CLOCK /NOT YET 49 CONTINUE RETURN C C C C C C 7.SET IMAGE NORMAL S\50, TAD (4201 S JMS XAC JZERO=0 RETURN C C C C C C C 8. SET IMAGE COMPLEMENT S\60, TAD (4202 S JMS XAC JZERO=63 RETURN C C C C C C 9.TURN ON IMAGE WAITING FOR OPERATOR. S\70, TAD (4204 S JMS XAC RETURN C C C C C C 10.SET GAMMA CORRECTOR ON. S\80, TAD (4205 S JMS XAC RETURN C C C C C C 11.RESET DICOMED. S\90, TAD (4000 S JMS XAC RETURN C C C C C C C 12.DISPLAY A POINT (X,Y,Z)AS SPECIFIED BY THE FIRST C THREE WORDS IN IBUF. 100 IXI=JX IYI=JY IZZ=JZ IXD=1 I=1 GOTO 1302 C C C C C C C 13.DISPLAY A VECTOR SPECIFIED IN IBUF. 110 IXX=JX IYY=JY IXD=IBUF(1) IYD=IBUF(2) IZZ=JZ C C C C C C 13.1 COMPUTE THE SET OF Y FOR X IN [IXX,IXX+IXD]. IYI=0 IF(IXD)1301,1301,131 131 IF(IYD)1301,1301,132 132 DO 119 I=1,IXD IXI=IXX+I-1 S TAD \IXI S DCA M1 /COMPUTE THE SLOPE AND EQUATION Y=MX+B S TAD \IYD S DCA M2 S TAD \IXD S MQL S CPAGE 2 S MUY SM1, 0 /IXI S CPAGE 2 S DVI /DIVIDE BY IYD SM2, 0 /IYD S CLA S MQA /GET THE QUOTIENT S TAD \IYY S TAD (-1 /ADD ON ADDITIONAL OFFSET S DCA \IYI /SAVE THE COMPUTED RESULT GO TO 1302 C C C C 13.1.1 BAD DELTA DATA. 1301 WRITE(2,1311)DATA 1311 FORMAT('BAD DELTA DATA, IXD=',I5,' , IYD=',I5) RETURN C C C C C C 13.2 INTENSIFY THE POINT S\1302, MQL /Z=0 S TAD \IXI S JMS XAC2 /SET UP X S TAD \IZZ S MQL /SET UP Y S TAD \IYI S JMS XAC2 119 CONTINUE RETURN C C C C C C 14. TRUE 1024X1024 POINT RASTER WITH Z IN IBUF. 120 DO 121 I=1,1024 S CLA CMA S TAD \I S TAD PBUF S DCA IXH S CPAGE 6 S 6211 /CDF 10 S TADI IXH /GET THE DATA S JMS 45 /CDF SKP S CLA S SKP SIXH, 0 S AND (0077 /ONLY Z S JMS XAC 121 CONTINUE RETURN C ********************************************** C C C PAGE 3***************************************** C SUBROUTINE OUTPUTS XAC THE AC TO THE DICOMED. S CPAGE 14 SXAC, 0 /THE LOAD AND EXECUTE DICOMED COMMAND SUBROUTINE. S DCA SAVE S LXAC /LOAD 0 INTO THE OUTPUT BUFFER S LXSR /SELECT OUTPUT CHANNEL 0 S TAD SAVE /LOAD DATA S CMA /COMPLEMENT BITS FOR DICOMED. S LXAC /LOAD THE OUTPUT BUFFER. SDICWT, DICO /SEND AN INPUT REQUEST TO THE DICOMED. S DICSKP /WAIT FOR DICOMED READY. S JMP DICWT# /NOT YET S CLA S JMP I XAC SSAVE, 0 /TEMP SAV WHILE MOVE BIT 4 TO BOT 0. C C C C C SUBROUTINE XAC2 OUTPUTS THE VALUE OF X OR Y IN THE AC C AND THE VALUE OF Z IN THE MQ IN DICOMED FORMAT. S CPAGE 26 SXAC2, 0 S DCA SAVIT /SAVE COORD. S MQA S AND (0077 /MAKE SURE ONLY 6 BITS. S MQL S TAD SAVIT S RTL;RTL;RTL /OUTPUT BOTTOM 2 BITS. S AND (0300 /ONLY BITS 7,8. S MQA /OR ON THE Z BITS. S JMS XAC S TAD SAVIT S RTR S AND (0377 /ONLY 8 BITS. S JMS XAC /OUTPUT WORD 2 TOP8 BITS. S JMP I XAC2 SSAVIT, 0 SPBUF, \IBUF /POINTER TO THE BUFFER END