.TITLE DOTPLT - DOT-PLOT INTERFACE FOR Q .IDENT /01JUN7/ ;09:15:00, LV ; .ENTRY DOTPLT - DOT-PLOT INTERFACE FOR Q ;+ ; D O T P L T ; ; PURPOSE: THIS MODULE IS THE DOT-PLOT INTERFACE FOR A Q ANALYZER ; TASK. IT RECEIVES COMMANDS AND INFORMATION FROM THE ; HDO COMMAND PROCESSOR TO CONTROL THE DOT PLOT, AND ; DOES THE ACTUAL PLOTTING. ; ; INTERFACE: CALLING SEQUENCE: (FORTRAN-CALLABLE SUBROUTINES) ; CALL DOTMGE ; CALL DOTINI(INDEX,SWITCH) ; CALL DOTOUT(EVN,EVBUF) ; ; METHOD: THE MODULE HAS THREE ENTRY POINTS: ; ; DOTMGE: MANAGE DOT PLOTTING FOR ANALYZER ; ; DOTINI: INITIALIZE OR CONTROL DOT PLOTTING. ; THIS ENTRY IS NORMALLY USED INTERNALLY BY ; DOTMGE, BUT IS AVAILABLE TO THE USER FOR ; SPECIALIZED APPLICATIONS. ; ; DOTOUT: OUTPUT ONE DOT FOR ANALYZER'S EVENT ; PROCESSOR. ; ; IN NORMAL USE, THE ANALYZER'S BACKGROUND PERFORMS ANY ; DESIRED INITIALIZATION, THEN CALLS DOTMGE. DOTMGE ; SPECIFIES A RECEIVE AST TO ALLOW CONTROL MESSAGES ; FROM HDO. DOTMGE RETURNS TO THE ANALYZER'S BACKGROUND ; WHERE THE ANALYZER CAN PROCESS OR SUSPEND. ANY ; EVENT PROCESSOR THAT IS TO BE CAPABLE OF DOT PLOTTING ; CALLS DOTOUT, SPECIFYING THE EVENT NUMBER AND EVENT ; BUFFER AS ARGUMENTS. ; ; DOTPLT USES LOGICAL UNIT 3 FOR PLOTTING. ; ; LANGUAGE: MACRO-11 ; ; RESTRICTIONS: IT IS NOT NECESSARY TO ASSIGN LUN 3 AT TASK BUILD TIME, ; BUT LUN 3 CANNOT BE USED FOR ANY OTHER PURPOSE ; BY THE ANALYZER. ; ; IN ORDER TO GET INFORMATION FROM THE HDO PROCESSOR, ; THE ANALYZER MUST BE LINKED TO THE HCOM1 SGA. ;- ; REVISIONS: ; 11-MAR-76 RJ/MK WRITTEN ; 07-FEB-77 NS CHANGE TO USE NEW DATA BASE IN HCOM1. REMOVE ; CONTROL-X CAPABILITY (NOT 11-M COMPATIBLE). ; CALL TO B4010 REPLACED BY ASSIGN LUN. ; REPLACE VARIABLE RECEIVE OR SUSPEND ; (NOT 11-M COMPATIBLE) WITH A RECEIVE AST. ; 11-FEB-77 NS MAKE EXPANSION SPACE IN CDS BLOCK 14 DECIMAL. ; 16-MAR-77 NS ALIGN DATA WITH MASK, REPLACE CALL TO CDSCHE BY ; INTERNAL CODE. ; 20-MAR-77 NS CHECK THAT NO MESSAGES HAVE COME IN DURING ; RECEIVE AST SETUP. ; 11-MAY-77 NS ADD CONDITIONAL ASSEMBLY FOR FPU TO HANDLE ; FLOATING POINT SCALE FACTOR. ; 01-JUN-77 LV UPDATED TO CONFORM TO STANDARDS ; .MCALL CALL,PUSH,POP,RETURN .MCALL DIR$,RCVD$,QIO$,CMKT$,MRKT$,ASTX$S,SRDA$S .MCALL ALUN$S ; ;- ; DOTCOM: NAME: .BLKB 6 ;HISTOGRAM NAME UIC: .WORD 0 ;PACKED UIC TYPE: .BYTE 1 ;ENTRY TYPE (200 = DOT PLOT) TTN: .BYTE 0 ;TERMINAL UNIT # FOR PLOT AREA: .BYTE 0 ;AREA CODE EV: .BYTE -1 ;EVENT # I1: .WORD 0 ;INDEX TO HORIZONTAL PARAMETER I2: .WORD 0 ;INDEX TO VERTICAL PARAMETER L1: .WORD 0 ;LOWER BIN LIMIT (HORIZ. AXIS) L2: .WORD 0 ;LOWER BIN LIMIT (VERT. AXIS) U1: .WORD 0 ;UPPER BIN LIMIT (HORIZ. AXIS) U2: .WORD 0 ;UPPER BIN LIMIT (VERT. AXIS) M1: .WORD 0 ;MASK FOR HORIZ. AXIS M2: .WORD 0 ;MASK FOR VERT. AXIS NE: .WORD 0 ;# OF POINTS TO PLOT BEFORE QUITTING TI: .WORD 0 ;# OF SECONDS TO PLOT MX: .BLKB 4 ;HORIZ. AXIS SCALE FACTOR (FLOATING PT) MY: .BLKB 4 ;VERT. AXIS SCALE FACTOR (FLOATING PT) IG1: .WORD 0 ;HORIZ. AXIS OFFSET IG3: .WORD 0 ;VERTICAL AXIS OFFSET TASK: .BLKB 4 ;TASK NAME RAD50 EXPN: .BLKB 14. ;EXPANSION SPACE SEQ: .BLKB 2 ;SEQUENCE NUMBER ; ; OTHER LOCAL DATA ; RUNFLG: .WORD 0 ; 0 - CONTROL OP IN PROG OR NO PLOT STARTED YET ;+1 - PLOT RUNNING ;-1 - PLOT ABORTED EVSAVE: .WORD 0 ;SAVE EVENT NUMBER FOR RESTART COUNT: .WORD 0 ;COUNT OF EVENTS PLOTTED ; LUN=3 ; ; **** DEFINE FPU HERE FOR FPU VERSION ; **** LEAVE FPU UNDEFINED FOR NON-FPU VERSION ; FPU=0 .IF DF,FPU ; FLOATING POINT REGISTER ; F0=%0 .ENDC ;+ ; ; ; D O T M G E ; ; DOTMGE: DOT PLOT MANAGEMENT ; ; DOTMGE IS CALLED BY THE ANALYZER'S BACKGROUND TO MANAGE ; DOT PLOTTING. IT SPECIFIES A RECEIVE AST IN ORDER TO ; TO RECEIVE MESSAGES FROM HDO. IT HAS NO ARGUMENTS. ; IT RETURNS TO THE ANALYZER'S BACKGROUND TO ALLOW ; HIM TO CONTINUE PROCESSING IF HE WISHES. ; ; CALL DOTMGE ; ;- RCV: RCVD$ ,RBUF RBUF: .WORD 0,0 INDEX: .WORD 0 SWITCH: .WORD 0 BUF: .BLKW 11. ;ALLOW FOR A 13 WORD BLOCK OF DATA ; DOTMGE:: SRDA$S #RECAST ;SPECIFY A RECEIVE AST ; DO A RECEIVE TO HANDLE ANYTHING PENDING .ENABL LSB 5$: DIR$ #RCV ;TRY TO RECEIVE A MESSAGE BCS 10$ ;BRANCH IF NO MESSAGE CALL DOTINI BR 5$ ;SEE IF ANY MORE MESSAGES 10$: RETURN ;RETURN TO ANALYZER BACKGROUND .DSABL LSB ; ; ; ; RECEIVE AST ; RECAST: PUSH ;SAVE REGISTERS .ENABL LSB 10$: DIR$ #RCV ;TRY TO RECEIVE A MESSAGE BCS 20$ ;BRANCH IF NO MESSAGE CALL DOTINI BR 10$ ;SEE IF ANY MORE MESSAGES 20$: POP ;RESTORE REGISTERS ASTX$S ;EXIT THE AST .DSABL LSB ;+ ; ; ; D O T I N I ; ; DOTINI: INITIALIZE AND CONTROL DOT PLOT ; ; DOTINI INITIALIZES A NEW DOT PLOT, OR ABORTS OR RESTARTS ; A PREVIOUSLY INITIALIZED PLOT. ; ; CALL DOTINI (INDEX,SWITCH) ; ; INDEX(INTEGER) = INDEX OF THE CDS BLOCK TO BE USED ; TO SET UP A NEW PLOT. IT IS IGNORED UNLESS ; SWITCH IS ZERO. ; SWITCH(INTEGER) = ZERO TO SET UP A NEW PLOT. IT HAS THE ; ASCII VALUE 'AB' TO ABORT A PLOT, AND THE ASCII ; VALUE 'RE' TO RESTART A PLOT. IF IT HAS ANY OTHER ; VALUE, DOTINI DOES NOTHING. ;- ; CMKT: CMKT$ ,TIMOUT MRKT: MRKT$ ,0,2,TIMOUT ; DOTINI:: TST @4(R5) ;NEW PLOT? BEQ START ;YES CMP @4(R5),#"AB ;ABORT? BEQ ABORT ;YES CMP @4(R5),#"RE ;RESTART? BEQ RESTRT ;YES RETURN ; ; START PLOT ; START: MOV @2(R5),R1 ;GET CDS INDEX BLE STRR ;BAD INDEX CMP R1,#HSTNTS ;IS INDEX IN RANGE BGT STRR ;BAD INDEX CLR RUNFLG ;TURN OFF RUNNING STATE DIR$ #CMKT ;CANCEL TIMEOUT IN CASE PREV PLOT NOT ABORTED ; COPY FROM A CDS BLOCK IN HCOM1 TO LOCAL STORAGE MOV #DOTCOM,R0 ;ADDRESS OF LOCAL BLOCK MOV #HSTDLN-2,R2 ;ENTRY LENGTH MUL #HSTDLN,R1 ;INDEX*ENTRY LENGTH ADD #HSTDAT-HSTDLN,R1 ; + BASE ADDRESS 10$: MOVB (R1)+,(R0)+ ;MOVE DATA SOB R2,10$ ;LOOP FOR ALL DATA ; MOVB EV,EVSAVE ;SAVE EVENT FOR POSSIBLE RESTART BR STRS ; ; RESTART PLOT ; RESTRT: TST RUNFLG ;ALL QUIET? BGE STRR ;NO CLR RUNFLG ;TURN OFF RUNNING STATE MOVB EVSAVE,EV ;RESTORE SAVED EVENT ; ; START OR RESTART PLOT ; STRS: CLR COUNT ;RESET EVENT COUNT MOVB TTN,R1 ;GET TERMINAL # 20$: ALUN$S #LUN,#"TT,R1 ;ASSIGN LUN3 TO TTN MOV TI,MRKT+M.KTMG ;IS TIMEOUT WANTED? BEQ 10$ ;NO DIR$ #MRKT ;SET UP TIMEOUT 10$: INC RUNFLG ;SET RUNNING STATE STRR: RETURN ; ; TIMEOUT ABORT ; TIMOUT: MOV R0,(SP) PUSH CALL ABORT POP ASTX$S ; ; ABORT PLOT ; ABORT: TST RUNFLG ;RUNNING? BLE 20$ ;NO CLR RUNFLG ;TURN OFF RUNNING STATE MOVB #-1,EV ;STORE DUMMY EVENT NO CALL F4010 ;END THE PLOT 10$: TST TI ;WAS TIMEOUT SPECIFIED? BEQ 15$ ;NO DIR$ #CMKT ;YES - CANCEL TIMEOUT 15$: DEC RUNFLG ;SET NON-RUNNING STATE 20$: RETURN ;+ ; ; ; D O T O U T ; ; DOTOUT: OUTPUT DOT FOR ANALYZER ; ; DOTOUT IS CALLED BY THE ANALYZER'S EVENT PROCESSOR. IF ; DOT PLOTTING IS ENABLED FOR THE EVENT, IT OUTPUTS A ; DOT IN THE APPROPRIATE PLACE. ; ; CALL DOTOUT (EVN,EVBUF) ; ; EVN(INTEGER) = THE EVENT NUMBER. ; ; EVBUF(INTEGER) = THE EVENT BUFFER. ;- X: .WORD 0 Y: .WORD 0 ; DOTOUT:: CMPB @2(R5),EV ;ARE WE PLOTTING THIS EVENT? BEQ 11$ ;YES 10$: RETURN ;NO 11$: TST RUNFLG ;ARE WE IN RUN STATE? BLE 10$ ;NO PUSH MOV I1,R1 ;R1=>OFFSET FOR X ASL R1 MOV I2,R3 ;R3=>OFFSET FOR Y ASL R3 ADD 4(R5),R1 ;R1=>X ADD 4(R5),R3 ;R3=>Y ; NEED TO MASK BITS FOR X AND Y MOV (R1),R0 MOV M1,R4 ;CLEAR BITS IN R0 WHICH ARE NOT ;SET IN M1 COM R4 ;MAKE BIT CLEAR MASK BIC R4,R0 ;R0=X ; ALIGN XDATA WITH MASK COM R4 ;RETURN MASK TO ORIGINAL STATE 20$: ASR R4 ;SHIFT MASK RIGHT BCS 22$ ;FOUND RIGHT HAND END ASR R0 ;SHIFT X TO ALIGN WITH MASK BR 20$ ;KEEP SHIFTING 22$: MOV (R3),R2 MOV M2,R4 ;CLEAR BITS IN R2 WHICH ARE NOT ;SET IN M2 COM R4 ;MAKE BIT CLEAR MASK BIC R4,R2 ;R2=Y ; ALIGN YDATA WITH MASK COM R4 ;RETURN MASK TO ORIGINAL STATE 25$: ASR R4 ;SHIFT MASK RIGHT BCS 27$ ;FOUND RIGHT HAND END ASR R2 ;SHIFT Y TO ALIGN WITH MASK BR 25$ ;KEEP SHIFTING ; SEE IF X AND Y ARE WITHIN RANGE OF PLOT 27$: CMP R0,U1 BGT OUT CMP R0,L1 BLT OUT CMP R2,U2 BGT OUT CMP R2,L2 BLT OUT ; ; DO ARITHMETIC ; IX=IG1+(X-L1)*MX ; IY=IG3+(Y-L1)*MY ; .IF DF,FPU ; SAVE FLOATING POINT REGISTER TO BE USED AND SET MODES STFPS -(SP) ;SAVE FP STATUS SETD ;SET DOUBLE MODE STD F0,-(SP) ;SAVE F ACC 0 SETF ;SET FLOATING SINGLE PRECISION SETI ;SET INTEGER MODE .ENDC SUB L1,R0 ;X-L1 SUB L2,R2 ;Y-L2 .IF DF,FPU LDCIF R0,F0 ;CONVERT (X-L1) TO FLOATING MULF MX,F0 ;MULTIPLY BY X SCALE FACTOR STCFI F0,R0 ;CONVERT (X-L1)*MX TO INTEGER .IFF MOV R0,R4 ;(X-L1) JSR R4,CFI$ ;CONVERT TO FLOATING MUF$MS MX ;MULTIPLY BY X SCALE FACTOR CIF$ 30$ 30$: MOV (SP)+,RO .ENDC 40$: ADD IG1,R0 ;IX=IG1+(X-L1)*MX MOV R0,X .IF DF,FPU LDCIF R2,F0 ;CONVERT (Y-L2) TO FLOATING MULF MY,F0 ;MULTIPLY BY Y SCALE FACTOR STCFI F0,R2 ;CONVERT (Y-L2)*MY TO INTEGER .IFF MOV R2,R4 ;(Y-L1) JSR R4,CFI$ ;CONVERT TO FLOATING MUF$MS MY ;MULTIPLY BY Y SCALE FACTOR CIF$ 50$ 50$: MOV (SP)+,R2 .ENDC 60$: ADD IG3,R2 ;IY=IG3+(Y-L2)*MY MOV R2,Y .IF DF,FPU ; RESTORE FLOATING POINT REGISTER USED SETD LDD (SP)+,F0 ;GET F ACC 0 LDFPS (SP)+ ;RESTORE FPS STATUS .ENDC CALL TPLOT <=-1,X,Y> ;PLOT THE DOT TST NE ;IS THERE A COUNT LIMIT? BMI OUT ;NO INC COUNT CMP COUNT,NE ;OVER LIMIT YET? BLE OUT ;NO CALL ABORT ;ABORT THE PLOT OUT: POP RETURN .END