.TITLE DEBC02 - WORD(S) WATCHER .SBTTL DEBC02 - TITLE PAGE .IDENT /V01.00/ .PSECT $$$DEB ; ; THIS ROUTINE USES THE T-BIT TRAP TO TRACE EVERY INSTRUCTION AND WATCHES ; SPECIFIED ADDRESSES. WHENEVER ANY 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 DEBC02 - DOCUMENTATION ; ;+ ; DEBC02 V01.00 ; ; DEBC02 IS A PART OF THE MONSANTO DEBUGGING PACKAGE. THIS MODULE ; TRACES EVERY INSTRUCTION AND WATCHES SPECIFIED LOCATIONS. WHEN ; ANY 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 (VAR1,VAR2,...) WHERE ; VAR? ARE THE LOCATIONS TO BE WATCHED. AFTER THE CALL, ; T-BIT TRAPS ARE USED TO TRACE EVERY INSTRUCTION AND WATCH ; FOR CHANGES IN THE LOCATIONS. ; ; 2. BY DEFAULT, UP TO 10 VARIABLE CAN BE TRACED. THIS CAN BE ; EXTENDED BY USING THE EXTSCT COMMAND TO MAKE THE PSECT ; $$$DAT LARGER. THE SIZE SHOULD BE MADE 2+(4*N) WHERE "N" ; IS THE NUMBER OF VARIABLES TO WATCH. ; ; 3. TRACING IS DISABLED BY A CALL DEBSTP. THIS DISABLES T-BIT ; AND REMOVES THE DEBUG SST. ; ; 4. THE MODULE MAY BE LOADED IN A OVERLAY. HOWEVER, TRACING ; MUST BE DISABLED BEFORE EXITING THE OVERLAY. ; ; 5. 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 DEBC02 - 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 $$DDAT ;NUMBER OF TRACED VARIABLES .GLOBL $$DSTK ;TOP OF TASK STACK ; ; GLOBAL REFERENCES: ; .GLOBL $$DOUT ;OUTPUT PROCESSOR .SBTTL DEBC02 - 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 VARIABLES. ; $$DSTK::.WORD 0 ;TOP OF USER STACK ; ; WATCHING PARAMETERS. ; .PSECT $$$DAT $$DDAT:: ;REF LABEL .WORD 0 ;NUMBER OF WATCH PAIRS .BLKW 20. ;ALLOW SPACE FOR 10 PAIRS .PSECT $$$DAU $$DDAU: ;REF LABEL .PSECT $$$DEB .SBTTL DEBINI * INITIALIZE T-BIT TRAP ; ;+ ; THIS ROUTINE IS CALLED TO INITIALIZE TRACING. ; ; INPUTS: CALL DEBINI (VAR1,VAR2,...) ; ; R5 = ADDRESS OF CALLING BLOCK ; ; .BYTE X,0 ; .WORD ADDRESS OF VARIABLE #1 ; .WORD ADDRESS OF VARIABLE #2 ; .WORD ... ; ; OUTPUTS: TRACING ENABLED. IF INVALID CALL, EXITS WITH ; FORTRAN ERROR 81. ; ;- DEBINI:: ;REF. LABEL ; ; CHECK CALLING ARGUMENTS AND STORE AWAY. ; MOV (R5)+,R4 ;WAS AT LEAST ONE ARGUMENT SPECIFIED? BEQ 1000$ ; IF EQ - NO, ERROR MOV #$$DDAU,R3 ;GET END OF OUR STORAGE SUB #$$DDAT+2,R3 ;GET SIZE OF OUR STORAGE ASR R3 ;GET NUMBER OF WATCH CELLS ASR R3 ; IN OUR STORAGE CMP R4,R3 ;IS THERE ENOUGH SPACE? BLE 2000$ ; IF LE - YES, CONTINUE ; ; PARAMETER ERROR, DECLARE FORTRAN ERROR 81 AND RETURN. ; 1000$: TRAP <128.+81.> ;DECLARE ERROR 81 BR 9999$ ; AND EXIT WITHOUT SETUP ; ; STORE VARIABLE ADDRESS AND CURRENT VALUES. ; 2000$: MOV #$$DDAT,R3 ;GET OUR STORAGE SPACE MOV R4,(R3)+ ;STORE VARIABLE COUNT 2100$: MOV (R5),(R3)+ ;STORE VARIABLE ADDRESS MOV @(R5)+,(R3)+ ;STORE INITIAL CONTENTS DEC R4 ;COUNT VARIABLE STORED BNE 2100$ ; IF NE - LOOP ; ; 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, OUTPUTS NEW VALUE AND PC. ; ; ; REGISTERS: USES R0-R5 SAVES: ALL ; ;- ; $$DTRP: ;REF. LABEL ; ; SAVE REGISTERS FOR OUR USE. ; MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ; ... R1 ; ; SETUP AND CHECK ALL VALUES. ; MOV #$$DDAT,R0 ;SET POINTER MOV (R0)+,R1 ;SET LOOP COUNTER 1000$: DEC R1 ;COUNT VARIABLE BLT 9999$ ; IF LT - ALL DONE CMP @(R0),2(R0) ;HAS VALUE CHANGED BNE 2000$ ; IF NE - YES, OUTPUT 1100$: ADD #4,R0 ;ADVANCE TO NEXT CELL BR 1000$ ; AND LOOP ; ; SAVE REGISTERS FOR PROCESSING ERROR. ; 2000$: 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),2(R0) ;STORE NEW VALUE MOV SP,R1 ;GET BOTTOM OF USER STACK ADD #24,R1 ; AND CORRECT FOR OUR PUSHES MOV $$DSTK,R2 ;GET TOP OF USER STACK MOV 20(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 1100$ ;CHECK NEXT VALUE ; ; EXIT T-BIT TRAP. ; 9999$: MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R0 ;RESTORE R0 RTT ;RETURN FROM TRAP .END