.TITLE DEBN01 - WORD WATCHER .SBTTL DEBN01 - 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 ; A SPECIFIED LOCATION 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 DEBN01 - DOCUMENTATION ; ;+ ; DEBN01 V01.00 ; ; DEBN01 IS A PART OF THE MONSANTO DEBUGGING PACKAGE. THIS MODULE ; CHECKS A SPECIFIED LOCATION ON EVERY SUBROUTINE CALL AND EXIT ; AND CALLS THE OUTPUT PROCESSOR LOADED WITH IT IF THE 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 LOCATION TO WATCH IS REFERENCED BY "$$DADR" AND THE ; CURRENT VALUE IS REFERENCED BY "$$DVAL". THE INITIAL ; VALUE OF THESE LOCATIONS IS SETUP USING GBLPAT COMMANDS. ; FOR EXAMPLE: ; ; GBLPAT=SEGNAME:$$DADR:1650 ; GBLPAT=SEGNAME:$$DVAL:1234 ; ; 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 DEBN01 - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; NONE. ; ; GLOBAL DECLARATIONS: ; ; MODULE ENTRY POINTS. ; .GLOBL $NAM ;NAME TRACEBACK ; ; MODULE VARIABLES ; .GLOBL $$DADR ;WORD TO WATCH .GLOBL $$DVAL ;CURRENT VALUE ; ; GLOBAL REFERENCES: ; .GLOBL $$DOUT ;OUTPUT PROCESSOR .SBTTL DEBN01 - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; NONE. ; ; LOCAL DATA: ; ; WATCHING PARAMETERS. ; $$DADR::.WORD 0 ;ADDRESS TO WATCH $$DVAL::.WORD 0 ;CURRENT VALUE .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 $$DTRP: CMP $$DVAL,@$$DADR ;HAS VALUE CHANGED? BEQ 9999$ ; IF EQ - NO, EXIT ; ; 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 @$$DADR,$$DVAL ;STORE NEW VALUE CLR R1 ;SET NO STACK CLR R2 ; ... MOV 14(SP),R3 ;GET TYPE OF CALL MOV $$DADR,R4 ;GET WATCHED ADDRESS MOV $$DVAL,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 ; ; EXIT CHECK. ; 9999$: TST (SP)+ ;CLEAN STACK RETURN ;RETURN TO CALLER .END