.TITLE DEBX02 - WORD(S) WATCHER .SBTTL DEBX02 - TITLE PAGE .IDENT /V01.00/ .PSECT $$$DEB ; ; THIS ROUTINE USES THE T-BIT TRAP TO TRACE EVERY INSTRUCTION AND WATCHES ; SPECIFIED ADDRESSES. WHENEVER A 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 DEBX02 - DOCUMENTATION ; ;+ ; DEBX02 V01.00 ; ; DEBX02 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. THE ROUTINE IS LINKED INTO THE TASK WITH THE /DA SWITCH. ; IT WILL INITIALLY GAIN CONTROL AND ENABLE THE T-BIT. ; ; 2. THE LOCATIONS TO WATCH ARE SPECIFIED IN THE PSECT $$$DAT. ; THE FIRST WORD IN THIS PSECT IS NAMED $$DDAT AND CONTAINS ; THE NUMBER OF WORDS TO WATCH. THIS IS FOLLOWED BY 2-WORD ; PAIRS OF ADDRESS AND WATCHED VALUE. THE SIZE IF $$$DAT IS ; SETUP WITH AN EXTSCT TASKBUILDER COMMAND. PSECT $$$DAT ; SHOULD BE EXTENDED BY 2+(4*N) WHERE "N" IS THE NUMBER OF ; LOCATIONS TO BE WATCHED. THE PSECT IS INTIALIZED WITH ; GBLPAT=SEG:$$DDAT COMMANDS. FOR EXAMPLE: ; ; EXTSCT=$$$DAT:12 ; GBLPAT=SEGNAME:$$DDAT:2 ; GBLPAT=SEGNAME:$$DDAT+2:1650:0 ; GBLPAT=SEGNAME:$$DDAT+6:1660:2 ; ; 3. THE ROUTINE MUST BE IN THE ROOT. IT ALSO USES THE DEBUG ; SST VECTOR FOR THE T-BIT TRAPS. THIS MEANS THE ROUTINE ; CANNOT COEXIST WITH OTHER DEBUGGING AIDS, LIKE ODT. ; ; 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 DEBX02 - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; DIRECTIVE MACROS. ; .MCALL SVDB$S ;SPECIFY DEBUG SST ; ; GLOBAL DECLARATIONS: ; ; MODULE ENTRY POINTS. ; .GLOBL $$DINI ;INITIALIZE T-BIT TRAP .GLOBL $$DTRP ;SERVICE T-BIT TRAP ; ; MODULE VARIABLES ; .GLOBL $$DDAT ;START OF WATCH LIST .GLOBL $$DSTK ;TOP OF TASK STACK ; ; GLOBAL REFERENCES: ; .GLOBL $$DOUT ;OUTPUT PROCESSOR .SBTTL DEBX02 - 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 .PSECT $$$DEB .SBTTL $$DINI * INITIALIZE T-BIT TRAP ; ;+ ; THIS ROUTINE IS CALLED AT TASK STARTUP. IT INITIALIZES WATCHING BY ; SETTING UP THE DEBUGGING SST AND USING A FAKE RTT TO SET THE T-BIT. ; ; INPUTS: ; ; CALLED ON TASK STARTUP. MODULE SHOULD BE LINKED ; USING /DA SWITCH. CALLED BY CONVENTION WITH R0 ; SET TO TASK ENTRY ADDRESS. ;- $$DINI:: ;REF. LABEL ; ; STORE TOP OF USE STACK. ; MOV SP,$$DSTK ;STORE TOP OF STACK ; ; 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) ; ; BEGIN MAIN PROGRAM (COME HERE AFTER RTT). ; 9999$: JMP (R0) ;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 $$DINI