.TITLE DEBN03 - ARRAY WATCHER .SBTTL DEBN03 - TITLE PAGE .IDENT /V01.00/ .PSECT $$$DEB ; ; THIS ROUTINE REPLACES THE FORTRAN $NAM ROUTINE. THE TRACEBACK FUNCTION ; IS MAINTAINED AND IN ADDITION, THE ROUTINE CHECKS WATCHES THE VALUE OF ; SPECIFIED ARRAY AND REPORTS ANY CHANGES. ; ; VERSION: V01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 07-APR-81 ; ; MODIFICATION HISTORY: ; ; V01.00 RWS 07-APR-81 INITIAL VERSION .SBTTL DEBN03 - DOCUMENTATION ; ;+ ; DEBN03 V01.00 ; ; DEBN03 IS A PART OF THE MONSANTO DEBUGGING PACKAGE. THIS MODULE ; CHECKS SPECIFIED ARRAY ON EVERY SUBROUTINE CALL AND EXIT ; AND CALLS THE OUTPUT PROCESSOR LOADED WITH IT IF ANY LOCATION ; VALUE CHANGES. ; ; THE FOLLOWING NOTES APPLY TO THIS ROUTINE: ; ; 1. THE ROUTINE REPLACES THE F4P $NAM ROUTINE. IT CHECKS THE ; WATCHED VALUE ON EVERY SUBROUTINE CALL AND EXIT IF THE ; FORTRAN ROUTINE WAS COMPILED WITH NAME SUPPORT. ; ; 2. THE ADDRESS OF THE ARRAY TO WATCH IS STORED IN $$DADR. ; THE SIZE OF THE ARRAY (IN WORDS) IS STORED IN $$DSIZ. THE ; PSECT $$$DAT MUST BE EXTENDED TO THE SIZE OF THE ARRAY. ; FOR EXAMPLE, TO WATCH A 5 WORD ARRAY: ; ; EXTSCT=$$$DAT:12 ;WATCH 5 LOCATIONS ; GBLPAT=SEGNAME:$$DADR:1650 ;ADR 1650 ; GBLPAT=SEGNAME:$$DSIZ:5 ;SIZE 5 ; ; 3. WHEN THE WATCHED VALUE CHANGES, THE OUTPUT PROCESSOR WILL ; BE CALLED. BY CONVENTION, THE ROUTINE "$$DOUT" IS CALLED ; AS FOLLOWS: ; ; R1 = 0 ; R2 = 0 ; R3 = CHECK FLAG (0 = ON CALL, -1 = ON EXIT) ; R4 = ADDRESS OF WATCHED LOCATION ; R5 = NEW VALUE IN WATCHED LOCATION ; ;- .SBTTL DEBN03 - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; NONE. ; ; GLOBAL DECLARATIONS: ; ; MODULE ENTRY POINTS. ; .GLOBL $NAM ;NAME TRACEBACK ; ; MODULE VARIABLES ; .GLOBL $$DADR ;ADDRESS OF ARRAY .GLOBL $$DSIZ ;SIZE OF ARRAY (IN WORDS) .GLOBL $$DDAT ;START OF ARRAY VARIABLES ; ; GLOBAL REFERENCES: ; .GLOBL $$DOUT ;OUTPUT PROCESSOR .SBTTL DEBN03 - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; NONE. ; ; LOCAL DATA: ; ; WATCHING VARIABLES. ; $$DADR::.WORD 0 ;ADDRESS OF ARRAY $$DSIZ::.WORD 0 ;SIZE OF ARRAY ; ; WATCHING PARAMETERS. ; .PSECT $$$DAT $$DDAT:: ;REF LABEL .PSECT $$$DEB .SBTTL $NAM - TRACEBACK NAME ROUTINE ;+ ; THIS ROUTINE IS A VERSION OF DIGITAL'S $NAM ROUTINE. IT PERFORMS ; THE SAME FUNCTION BUT ALSO PERFORMS WATCH CHECKS. ; ; THE CHAIN IS CREATED ON THE RUN-TIME STACK AND LINKED TO THE PREVIOUS ; NAME. THE ROUTINES DOES A CO-ROUTINE CALL AND ON RETURN, UNLINKS THE ; CHAIN AND RETURNS TO THE CALLER. ; ; INPUT: ; ; (SP)+00 = FIRST PART OF NAME (RAD50) ; (SP)+02 = SECOND PART OF NAME (RAD50) ; ; R4 = RETURN ADDRESS. ; ; OUTPUT: ; ; NAME TRACE BLOCK SETUP. ON FINAL RETURN, PREVIOUS ; CHAIN SETUP. ;- NAM$:: ;REF. LABEL CALL $$CHK0 ;PERFORM WATCH CHECK MOV @#$OTSV,R3 ;GET OTS POINTER MOV (R3)+,-(SP) ;OLD SEQUENCE NUMBER MOV @R3,-(SP) ;OLD NAME POINTER MOV SP,@R3 ;NEW NAME POINTER CLR -(R3) ;INIT SEQUENCE NUMBER CALL @R4 ;CALL CALLER BACK ; ; R0-R3 ARE UNTOUCHED FOR RETURN SINCE THEY MAY CONTAIN FUNCTION VALUE. ; CALL $$CHK1 ;PERFORM WATCH CHECK MOV @#$OTSV,R4 ;GET OTS POINTER MOV (SP)+,2(R4) ;W.NAMC MOV (SP)+,@R4 ;W.SEQC CMP (SP)+,(SP)+ ;CLEAN STACK RETURN ;TAKE FINAL RETURN .SBTTL $$CHK? * WATCH CHECK ; ;+ ; THIS SUBROUTINE CHECKS IF THE VALUES HAS CHANGED AND IF IT HAS, ; CALLS THE OUTPUT PROCESSOR, $$DOUT. ; ; INPUT: ; ; CALL FROM $NAM, $$CHK0 IS ON CALL, $$CHK1 IS ON EXIT. ; ; OUTPUT: ; ; IF VALUE CHANGES, $$DOUT CALLED. ; ; ; REGISTERS: USES R0-R5 SAVES: ALL ; ;- ; $$CHK0: CLR -(SP) ;MARK TYPE OF CALL BR $$DTRP ; AND CONTINUE $$CHK1: MOV #-1,-(SP) ;MARK TYPE OF CALL ; ; SAVE REGISTERS FOR OUR USE. ; $$DTRP: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ; ... R1 MOV R2,-(SP) ; ... R2 ; ; SETUP AND CHECK ALL VALUES. ; MOV $$DADR,R0 ;SET POINTER TO ARRAY MOV $$DSIZ,R1 ;SET LOOP COUNTER MOV #$$DDAT,R2 ;SET POINTER TO DATA 1000$: DEC R1 ;COUNT VARIABLE BLT 9999$ ; IF LT - ALL DONE CMP (R0)+,(R2)+ ;HAS VALUE CHANGED BEQ 1000$ ; IF EQ - NO, LOOP ; ; SAVE REGISTERS FOR PROCESSING ERROR. ; MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ; ... R1 MOV R2,-(SP) ; ... R2 MOV R3,-(SP) ; ... R3 MOV R4,-(SP) ; ... R4 MOV R5,-(SP) ; ... R5 ; ; STORE NEW VALUE AND CALL OUTPUT PROCESSOR. ; MOV -(R0),-(R2) ;STORE NEW VALUE CLR R1 ;SET NO USER STACK CLR R2 ; ... MOV 22(SP),R3 ;GET PC OF TRACED INSTRUCTION MOV R0,R4 ;GET WATCHED LOCATION MOV (R0),R5 ;GET NEW VALUE CALL $$DOUT ;CALL OUTPUT ROUTINE ; ; RESTORE REGISTERS. ; MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,R4 ; ... R4 MOV (SP)+,R3 ; ... R3 MOV (SP)+,R2 ; ... R2 MOV (SP)+,R1 ; ... R1 MOV (SP)+,R0 ; ... R0 BR 1000$ ;CHECK NEXT VALUE ; ; EXIT CHECK ROUTINE ; 9999$: MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 ; ... R1 MOV (SP)+,R0 ; ... R0 TST (SP)+ ;CLEAN STACK RETURN ;RETURN TO CALLER .END