.TITLE CMCSA - GENERAL PURPOSE CAMAC SUBROUTINE .IDENT /19APR7/ ;12:50:00 LV ; .ENTRY CMCSA - GENERAL PURPOSE CAMAC SUBROUTINE ;+ ; C A M A C S U B R O U T I N E S ; SUBROUTINES CMCSA, CMCSAM, CMCPK AND CMCLUN ; ; PURPOSE: THESE SUBROUTINES ALLOW THE USER TO EXECUTE A SINGLE ; CAMAC FUNCTION IN ANY CAMAC MODULE. THEY USE THE ; MBD THROUGH THE RSX CAMAC HANDLER, CC, AND REQUIRE ; AN MBD PROGRAM MBDSTD OR EQUIVALENT. THEY WILL ; RUN ON ANY PDP-11/40 OR ABOVE. THERE ARE 4 ENTRY ; POINTS: CMCSA, CMCSAM, CMCPK AND CMCLUN. ; ; INTERFACE: (FORTRAN-CALLABLE SUBROUTINES) ; 1) CMCSA ; THIS SUBROUTINE PERFORMS A SINGLE CAMAC ACTION ; USING 24-BIT DATA. ; ; CALLING SEQUENCE: ; CALL CMCSA(F,ADDR,DATA,STATUS) ; ; INPUT: F=CAMAC F (FUNCTION) CODE (SINGLE WORD INTEGER) ; ADDR=C,N,&A IN BITS 11-0 (SINGLE WORD INTEGER) ; C=CAMAC CRATE #, BITS 9-11 ; N=MODULE SLOT #, BITS 4-8 ; A=CAMAC SUBADDRESS, BITS 0-3 ; DATA=DATA WORD(24 BITS, MOST SIGNIFICANT ; 8 BITS FIRST FOLLOWED BY THE LEAST ; SIGNIFICANT 16 BITS) ; (ARRAY OF TWO SINGLE WORD INTEGERS) ; NOTE: THIS IS NOT THE FORTRAN CONVENTION ; FOR DOUBLE WORD INTEGERS. ; ; OUTPUT: STATUS=Q AND X RESPONSE (SINGLE WORD INTEGER) ; BIT 0=NOT Q ; BIT 1=NOT X ; ALL OTHER BITS IN STATUS ARE ZERO UNLESS ; AN I/O ERROR OCCURRED, IN WHICH CASE ; STATUS IS SET TO -1 (ALL ONES). ; ; 2) CMCSAM ; THIS SUBROUTINE PERFORMS A SINGLE CAMAC ACTION ; USING 16-BIT DATA. ; ; CALLING SEQUENCE: ; CALL CMCSAM(F,ADDR,DATA,STATUS) ; (SAME ARGUMENTS AS CMCSA EXCEPT THE DATA ; WORD IS 16 BITS INSTEAD OF 24 - A SINGLE WORD ; INTEGER) ; ; 3) CMCPK ; THIS SUBROUTINE PACKS THE CRATE #, MODULE SLOT #, AND ; SUBADDRESS INTO A WORD IN APPROPRIATE FORM FOR FUTURE ; USE WITH CMCSA OR CMCSAM. ; ; CALLING SEQUENCE ; CALL CMCPK(C,N,A,ADDR) ; ; INPUT: C=CAMAC CRATE # (SINGLE WORD INTEGER) ; N=MODULE SLOT # (SINGLE WORD INTEGER) ; A=CAMAC SUBADDRESS (SINGLE WORD INTEGER) ; ADDR=PACKED FORM OF C,N,&A IN BITS 11-0 ; FOR USE IN CMCSA/CMCSAM (SINGLE WORD INTEGER) ; C=BITS 9-11 ; N=BITS 4-8 ; A=BITS 0-3 ; ; 4) CMCLUN ; THIS SUBROUTINE SPECIFIES THE LOGICAL UNIT # TO BE ; USED FOR COMMUNICATION WITH THE RSX CAMAC HANDLER CC. ; ; CALLING SEQUENCE: ; CALL CMCLUN(LUN) ; ; INPUT: LUN=LOGICAL UNIT # FOR USE WITH THE CAMAC ; HANDLER (SINGLE WORD INTEGER). FOR MOST ; APPLICATIONS, THIS LUN SHOULD BE ; ASSIGNED TO CC3: AT TASK BUILD TIME. ; NOTE: THIS ROUTINE MUST BE CALLED BEFORE ANY CALLS ARE ; MADE TO CMCSA OR CMCSAM. ; ; THESE SUBROUTINES USE EVENT FLAG 24. TO DETECT I/O COMPLETION. ; ; ; ; THE FOLLOWING IS AN EXAMPLE OF A DUMMY FORTRAN PROGRAM ; WHICH USES THESE ROUTINES: ; ; C ; C PROGRAM CAMAC - PERFORM CAMAC FUNCTIONS VIA CMCSA ; C .IDENT /19APR7/ ; C ; C THIS PROGRAM DEMONSTRATES THE USE OF ROUTINES CMCSA, ; C CMCSAM, CMCPK AND CMCLUN. ; C ; C LOCAL DECLARATIONS ; C ; IMPLICIT INTEGER (A-Z) ; INTEGER DATA(2) ; C ; DATA LUN/4/,NMAX/50/ ; DATA F1,C1,N1,A1 /16,1,3,0/ ; DATA F2,C2,N2,A2 /0,2,2,1/ ; DATA F3,C3,N3,A3 /8,1,10,0/ ; C ; C SPECIFY THE LOGICAL UNIT # FOR USE WITH THE ; C RSX-11 CAMAC HANDLER. ; C THIS CALL MUST BE MADE PRIOR TO ANY CALLS TO ; C CMCSA AND CMCSAM. ; C ; CALL CMCLUN(LUN) ; C ; C CREATE THE PACKED FORM OF CNA FOR USE WITH ; C CMCSA AND CMCSAM ; C ; CALL CMCPK (C1,N1,A1,ADDR1) ; CALL CMCPK (C2,N2,A2,ADDR2) ; CALL CMCPK (C3,N3,A3,ADDR3) ; C ; C SET UP DATA FOR CALL TO CMCSA ; C NOTE: WE CAN'T USE DOUBLE WORD INTEGERS (INTEGER*4) ; C BECAUSE THE FORMAT REQUIRED BY THE MBD IS ; C INCONSISTENT WITH THAT USED BY FORTRAN. ; C ; C SET HIGH ORDER 8 BITS TO ALL 1'S ; C ; DATA(1) = "377 ; C ; C SET LOW ORDER BITS ALL 1 ; DATA(2) = -1 ; C ; C PERFORM A CAMAC 24-BIT WRITE (FUNCTION CODE=16) ; C ; CALL CMCSA(F1,ADDR1,DATA,STATUS) ; C ; C CHECK FOR AN ERROR ; C ; IF(STATUS.LT.0) GO TO 100 ; C ; C GET Q AND X RESPONSE ; C THIS CODE CONVERTS 'STATUS' INTO 'Q' AND 'X' SUCH THAT ; C Q=0 FOR NO Q RESPONSE ; C Q=1 FOR Q RESPONSE ; C X=0 FOR NO X RESPONSE ; C X=1 FOR X RESPONSE ; C ; Q=1-IAND(STATUS,1) ; X=1-IAND(STATUS,2)/2 ; C ; C ; C PERFORM A CAMAC 16-BIT WRITE (FUNCTION CODE=16) ; C ; CALL CMCSAM(F1,ADDR2,100,STATUS) ; IF(STATUS.LT.0) GO TO 100 ; C ; C PERFORM A CAMAC 24-BIT READ (FUNCTION CODE=0) ; C THE DATA WILL BE RETURNED IN DATA(1), DATA(2) ; C (8 HIGH BITS, THEN 16 LOW BITS) ; C ; CALL CMCSA(F2,ADDR1,DATA,STATUS) ; IF(STATUS.LT.0) GO TO 100 ; C ; C PERFORM A CAMAC 16-BIT READ (FUNCTION CODE=0) ; C THE 16 BITS OF DATA WILL BE RETURNED IN WORD ; C (A SINGLE WORD INTEGER) ; C ; CALL CMCSAM(F2,ADDR2,WORD,STATUS) ; IF(STATUS.LT.0) GO TO 100 ; C ; C PERFORM OTHER OPERATIONS ; C ; . ; . ; . ; C ; C TEST FOR A LAM (FUNCTION CODE=8) ; C LOOP UNTIL Q=1 TO INDICATE A LAM IS SET OR A ; C MAXIMUM OF NMAX TIMES ; C ; DO 50 I = 1,NMAX ; C ; C NOTE: NO DATA IS TRANSFERRED ON THIS OPERATION ; C ; CALL CMCSAM(F3,ADDR3,WORD,STATUS) ; C CHECK FOR Q (BIT 0 OF STATUS IS NO Q) ; IF(STATUS.LT.0) GO TO 100 ; IF(IAND(STATUS,1).EQ.0) GO TO 75 ; 50 CONTINUE ; C ; C WE'RE FINISHED ; C ; 75 CALL EXIT ; C ; C ERROR - GIVE AN ERROR MESSAGE ; C ; 100 WRITE(5,110) STATUS ; 110 FORMAT(' PROGRAM TEST I/O ERROR IN CAMAC ; 1 OPERATION, ERROR CODE=',I6) ; CALL EXIT ; END ; ; ; THE BUILD FILE FOR THIS PROGRAM WOULD LOOK AS FOLLOWS: ; ; ;[123,24]TEST.BLD BUILD FILE FOR CAMAC TEST PROGRAM 19-APR-77 ; [123,24]TEST,TEST=[123,24]TEST ; ;SUBROUTINES CMCSA, CMCSAM, CMCPK, CMCLUN ARE IN LIBRARY MDLIB ; [1,1]MDLIB/LB ; / ; ASG=CC3:4 ;LOGICAL UNIT # ASSIGNMENT FOR CAMAC OPERATIONS ; ASG=TI:5 ;OPERATOR'S TERMINAL ; LIBR=OTSCOR:RO ;FORTRAN RESIDENT LIBRARY ; // ; ; LANGUAGE: MACRO-11 ; ; REFERENCES: "MBD OPERATIONS WITH MBDSTD AND THE RSX-11 ; HANDLER CC" ; ;- ; REVISIONS: ; 02-SEP-76 SS MAKE RSX-11M COMPATIBLE ; 19-APR-77 LV UPDATED TO CONFORM TO STANDARDS ; .GLOBL CMCSA,CMCSAM,CMCPK,CMCLUN .MCALL DIR$,QIO$,WTSE$S LUN=Q.IOLU+DPB EFN=24. ; CMCSA: CLR R0 ; SET INDEX FOR 24 BIT MODE A5: MOV 6(R5),R2 ; DATA FWA MOV (R2),DATA MOV R0,MODE BNE 10$ MOV 2(R2),DATA+2 10$: MOV @2(R5),R1 ;GET F CODE BIC #177747,R1 ;MASK TO F8, F16 ASR R1 ;ALIGN AS INDEX ASR R1 ADD R0,R1 ;PUT 24/16-BIT MODE IN INDEX MOVB CTBL(R1),CODE ;PUT PROPER OP CODE IN CMD BLOCK MOV @2(R5),R1 ;GET F CODE AGAIN ASH #12.,R1 ; POSITION F CODE BIC #100000,R1 ; MASK OUT F8 BCC 15$ BIS #100000,R1 ; INSERT F16 15$: BIS @4(R5),R1 ; FINAL FCNA CODE CLR MBOX MOV R1,CMD ; FCNA DIR$ #DPB BCS ERR ; DIRECTIVE FAILED WTSE$S #EFN ; WAIT FOR I/O COMPLETE TSTB IOSB BMI ERR ; I/O ERROR MOV MBOX,R0 ASH #-4,R0 ;GET Q AND NOT X ADD #2,R0 ;CHANGE TO Q AND X COM R0 ;MAKE NOT Q AND NOT X BIC #177774,R0 MOV R0,@10(R5) ; SET Q,X STATUS CMP @2(R5),#8. ; CHECK F CODE FOR READ BGE EXIT ; NOT A READ MOV DATA,(R2) ; MOVE FIRST WORD TST MODE BNE EXIT ; 16-BIT MODE MOV DATA+2,2(R2) ; MOVE SECOND WORD EXIT: RTS PC ;EXIT ERR: MOV #-1,@10(R5) ; SET ERROR STATUS BR EXIT ; 16 BIT MODE ENTRY POINT CMCSAM: MOV #1,R0 ; 16 BIT MODE BR A5 ; PACK C,N,&A FOR CMCSA/CMCSAM ENTRY CMCPK: MOV @2(R5),R0 ; PICK UP C ASH #5,R0 ;POSITION C BIS @4(R5),R0 ; INSERT N ASH #4,R0 BIS @6(R5),R0 ; INSERT A MOV R0,@10(R5) ; RETURN ADDR BR EXIT ; SET LUN ENTRY CMCLUN: MOV @2(R5),LUN ; STORE LUNX BR EXIT ; DPB FOR QIO DPB: QIO$ IO.RLB,,EFN,,IOSB,, CODE: .BYTE 0,0 DBUFX: .WORD 0 WCNT: .WORD 2 FBUFX: .WORD 0 RCNT: .WORD 0 CHNX: .WORD 0 MBOX: .WORD 0 DBUF: .WORD DATA FBUF: .WORD CMD CHAIN: .WORD 0 .WORD 0,0,0 DATA: .BLKW 2 CMD: .WORD 0,0 CTBL: .BYTE 2,1,5,5,4,3,5,5 IOSB: .WORD 0,0 MODE: .WORD 0 .END LL