.TITLE DEBX03 - ARRAY WATCHER .SBTTL DEBX03 - TITLE PAGE .IDENT /V01.00/ .PSECT $$$DEB ; ; THIS ROUTINE USES THE T-BIT TRAP TO TRACE EVERY INSTRUCTION AND WATCHES ; THE SPECIFIED ARRAY. 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 DEBX03 - DOCUMENTATION ; ;+ ; DEBX03 V01.00 ; ; DEBX03 IS A PART OF THE MONSANTO DEBUGGING PACKAGE. THIS MODULE ; TRACES EVERY INSTRUCTION AND WATCHES A SPECIFIED ARRAY. 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 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. 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 DEBX03 - 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 $$DADR ;ADDRESS OF ARRAY .GLOBL $$DSIZ ;SIZE OF ARRAY (IN WORDS) .GLOBL $$DDAT ;START OF ARRAY VARIABLES .GLOBL $$DSTK ;TOP OF TASK STACK ; ; GLOBAL REFERENCES: ; .GLOBL $$DOUT ;OUTPUT PROCESSOR .SBTTL DEBX03 - 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. ; $$DADR::.WORD 0 ;ADDRESS OF ARRAY $$DSIZ::.WORD 0 ;SIZE OF ARRAY $$DSTK::.WORD 0 ;TOP OF USER STACK ; ; WATCHING PARAMETERS. ; .PSECT $$$DAT $$DDAT:: ;REF LABEL .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, CALL $$DOUT. ; ; ; REGISTERS: USES R0-R5 SAVES: ALL ; ;- ; $$DTRP: ;REF. LABEL ; ; SAVE REGISTERS FOR OUR USE. ; 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 MOV SP,R1 ;GET BOTTOM OF USER STACK ADD #26,R1 ; CORRECT FOR OUR PUSHES MOV $$DSTK,R2 ;GET TOP OF USER STACK 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 T-BIT TRAP. ; 9999$: MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 ; ... R1 MOV (SP)+,R0 ; ... R0 RTT ;RETURN FROM TRAP .END $$DINI