.TITLE DEBC01 - WORD WATCHER .SBTTL DEBC01 - TITLE PAGE .IDENT /V01.00/ .PSECT $$$DEB ; ; THIS ROUTINE USES THE T-BIT TRAP TO TRACE EVERY INSTRUCTION AND WATCHES ; A SPECIFIED ADDRESS. WHENEVER THE VALUE CHANGES, THE ROUTINE WILL CALL ; THE OUTPUT PROCESSOR. ; ; VERSION: V01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 07-APR-81 ; ; MODIFICATION HISTORY: ; ; V01.00 RWS 07-APR-81 INITIAL VERSION .SBTTL DEBC01 - DOCUMENTATION ; ;+ ; DEBC01 V01.00 ; ; DEBC01 IS A PART OF THE MONSANTO DEBUGGING PACKAGE. THIS MODULE ; TRACES EVERY INSTRUCTION AND WATCHES A SPECIFIED LOCATION. WHEN ; THE LOCATION CHANGES VALUE, THE ROUTINE WILL CALL THE OUTPUT ; PROCESSOR LOADED WITH IT. ; ; THE FOLLOWING NOTES APPLY TO THIS ROUTINE: ; ; 1. TRACING IS ENABLED BY A CALL DEBINI (VAR) WHERE VAR IS ; THE LOCATION TO BE WATCHED. AFTER THE CALL, T-BIT TRAPS ; ARE USED TO TRACE EVERY INSTRUCTION AND WATCH FOR CHANGES ; IN THE LOCATION. ; ; 2. TRACING IS DISABLED BY A CALL DEBSTP. THIS DISABLES T-BIT ; AND REMOVES THE DEBUG SST. ; ; 3. THE MODULE MAY BE LOADED IN A OVERLAY. HOWEVER, TRACING ; MUST BE DISABLED BEFORE EXITING THE OVERLAY. ; ; 4. WHEN THE WATCHED VALUE CHANGES, THE OUTPUT PROCESSOR WILL ; BE CALLED. BY CONVENTION, THE ROUTINE "$$DOUT" IS CALLED ; AS FOLLOWS: ; ; R1 = CURRENT BOTTOM OF USER STACK ; R2 = TOP OF USER STACK ; R3 = PC OF TRACED INSTRUCTION ; R4 = ADDRESS OF WATCHED LOCATION ; R5 = NEW VALUE IN WATCHED LOCATION ; ;- .SBTTL DEBC01 - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; DIRECTIVE MACROS. ; .MCALL SVDB$S ;SPECIFY DEBUG SST ; ; GLOBAL DECLARATIONS: ; ; MODULE ENTRY POINTS. ; .GLOBL DEBINI ;INITIALIZE TRACING .GLOBL DEBSTP ;STOP INSTRUCTION TRACING .GLOBL $$DTRP ;SERVICE T-BIT TRAP ; ; MODULE VARIABLES ; .GLOBL $$DADR ;TRACED ADDRESS .GLOBL $$DVAL ;CURRENT TRACED VALUE .GLOBL $$DSTK ;TOP OF TASK STACK ; ; GLOBAL REFERENCES: ; .GLOBL $$DOUT ;OUTPUT PROCESSOR .SBTTL DEBC01 - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; NONE. ; ; LOCAL DATA: ; ; DEBUGGING SST VECTOR. ; SSTADR: .WORD 0 ;ODD ADDRESS .WORD 0 ;MEMORY PROTECT .WORD $$DTRP ;T-BIT TRAP SSTSIZ = <.-SSTADR>/2 ; ; WATCHING PARAMETERS. ; $$DADR::.WORD 0 ;ADDRESS TO WATCH $$DVAL::.WORD 0 ;CURRENT VALUE $$DSTK::.WORD 0 ;TOP OF TASK STACK .SBTTL DEBINI * INITIALIZE T-BIT TRAP ; ;+ ; THIS ROUTINE IS CALLED TO INITIALIZE TRACING. ; ; INPUTS: CALL DEBINI (VAR) ; ; R5 = ADDRESS OF CALLING BLOCK ; ; .WORD 1,0 ; .WORD ADDRESS OF VARIABLE ; ; OUTPUTS: TRACING ENABLED. IF INVALID CALL, EXITS WITH ; FORTRAN ERROR 81. ; ;- DEBINI:: ;REF. LABEL ; ; CHECK CALLING ARGUMENTS AND STORE AWAY. ; CMP (R5)+,#1 ;WAS ONLY ONE ARGUMENT SPECIFIED BEQ 1000$ ; IF EQ - YES, CONTINUE TRAP <128.+81.> ;DECLARE ERROR 81 BR 9999$ ;EXIT WITH NO SETUP 1000$: MOV (R5),$$DADR ;STORE ADDRESS TO WATCH MOV @(R5),$$DVAL ;STORE INITIAL VALUE ; ; STORE TOP OF USE STACK. ; MOV SP,$$DSTK ;STORE TOP OF STACK ADD #2,$$DSTK ;CORRECT FOR CALL ; ; SETUP DEBUG SST VECTOR FOR TRACE TRAPS. ; SVDB$S #SSTADR,#SSTSIZ ;SET-UP DEBUG SST'S ; ; SET-UP FAKE TRAP TO GET T-BIT SET. ; MOV #020,-(SP) ;STORE PS MOV #9999$,-(SP) ;STORE PC RTT ;EXECUTE RTT (SETS T-BIT) ; ; RETURN TO CALLER. ; 9999$: RETURN ;PASS CONTROL TO TASK .SBTTL DEBSTP * STOP T-BIT TRAP ; ;+ ; THIS ROUTINE IS CALLED TO STOPTRACING. ; ; INPUTS: CALL DEBSTP ; ; R5 = ADDRESS OF CALLING BLOCK ; ; .BYTE 0,0 ; ; OUTPUTS: TRACING DISABLED. ; ;- DEBSTP:: ;REF. LABEL ; ; SET-UP FAKE TRAP TO GET T-BIT CLEAR. ; CLR -(SP) ;SET NEW PS MOV #1000$,-(SP) ;STORE PC RTT ;EXECUTE RTT (CLEARS T-BIT) ; ; DISABLE DEBUG SST TRAPS (COME HERE AFTER RTT). ; 1000$: SVDB$S #0,#0 ;DISABLE SST'S ; ; RETURN TO CALLER. ; RETURN ;PASS CONTROL TO TASK .SBTTL $$DTRP * T-BIT SST TRAP ; ;+ ; THIS SUBROUTINE CHECKS IF THE VALUES HAS CHANGED AND IF IT HAS, ; CALLS THE OUTPUT PROCESSOR, $$DOUT. ; ; INPUT: ; ; CALLED BY T-BIT SST. CALLED WITH STACK AS FOLLOWS: ; ; (SP)+02 = PS OF TRAP ; (SP)+00 = PC OF TRAP ; ; OUTPUT: ; ; IF VALUE CHANGES, $$DOUT CALLED. ; ; ; REGISTERS: USES R0-R5 SAVES: ALL ; ;- ; $$DTRP: ;REF. LABEL 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 MOV SP,R1 ;GET CURRENT STACK ADD #20,R1 ; AND CORRECT FOR OUR PUSHES MOV $$DSTK,R2 ;GET TOP OF STACK MOV 14(SP),R3 ;GET PC OF TRACED INSTRUCTION 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 T-BIT TRAP. ; 9999$: RTT ;RETURN FROM TRAP .END