.TITLE DEBP02 - OUTPUT NEW VALUE, PC, STACK .SBTTL DEBP02 - TITLE PAGE .IDENT /V01.00/ .PSECT $$$DEB ; ; THIS ROUTINE OUTPUTS THE NEW VALUE AND PC OF THE INSTRUCTION MODIFYING ; THE WATCHED LOCATION. IT ALSO OUTPUTS THE TASK STACK. ; ; VERSION: V01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 07-APR-81 ; ; MODIFICATION HISTORY: ; ; V01.00 RWS 07-APR-81 INITIAL VERSION .SBTTL DEBP02 - DOCUMENTATION ; ;+ ; DEBP02 V01.00 ; ; DEBP02 IS A PART OF THE MONSANTO DEBUGGING PACKAGE. THIS MODULE ; IS CALLED WHENEVER THE WATCHED VALUE CHANGES. IT OUTPUTS THE ; THE ADDRESS OF THE VALUE, THE NEW VALUE, AND THE PC. IT ALSO ; OUTPUTS THE TASK STACK. ; ; THE FOLLOWING NOTES APPLY TO THIS ROUTINE: ; ; 1. THE ROUTINE USES THE WORD REFERENCED BY ".MOLUN" FOR THE ; LUN TO USE FOR MESSAGES. THIS WORD IS SET BY TKB TO A LUN ; ASSIGNED TO TI:. IF LINKING TO A FORTRAN PROGRAM, THE OTS ; WILL DEFINE .MOLUN. OTHERWISE, LINK THE MODULE DEBLUN ; WITH THIS MODULE. ; ; 2. THE ROUTINE USES EVENT FLAG 32 FOR ITS I/O. THE GLOBAL ; NAME $$DFLG IS USED FOR THIS NAME AND CAN BE CHANGED WITH ; THE TKB GBLSYM SWITCH IF THERE IS A CONFLICT. ; ;- .SBTTL DEBP02 - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; DIRECTIVE MACROS. ; .MCALL DIR$ ;ISSUE DIRECTIVE .MCALL QIOW$ ;ISSUE QIO AND WAIT ; ; GLOBAL DECLARATIONS: ; ; MODULE ENTRY POINTS. ; .GLOBL $$DOUT ;OUTPUT MESSAGE ; ; GLOBAL REFERENCES: ; .GLOBL .MOLUN ;TI: LUN NUMBER .GLOBL IO.WVB ;WRITE VIRTUAL BLOCK I/O .SBTTL DEBP02 - LOCAL DATA ; ; LOCAL SYMBOLS: ; $$DFLG == 32. ;I/O EVENT FLAG ; ; LOCAL DATA: ; ; DIRECTIVES. ; ERRDPB: QIOW$ IO.WVB,,$$DFLG,,,, STKDPB: QIOW$ IO.WVB,,$$DFLG,,,, ; ; MESSAGES. ; .NLIST BEX ERRMSG: .ASCII <15><12>/*** VALUE AT ADDRESS / ADFLD: .ASCII /000000 CHANGED, NEW VALUE: / VAFLD: .ASCII /000000 PC: / PCFLD: .ASCII /000000 ***/<15><12> ERRSIZ = .-ERRMSG STKMSG: .ASCII / / SPFLD: .ASCII /000000: / COFLG: .ASCII /000000/<15><12> STKSIZ = .-STKMSG .LIST BEX .EVEN .SBTTL $$DOUT * OUTPUT NEW VALUE, PC, STACK ; ;+ ; THIS ROUTINE IS CALLED WHENEVER A WATCHED VALUE CHANGES. IT ; OUTPUTS THE ADDRESS OF THE VALUE, THE NEW VALUE AND THE PC ; OF THE TRACED INSTRUCTION. IT ALSO OUTPUTS THE TASK STACK. ; ; INPUT: ; ; CALLED FROM $$DTRP WITH: ; ; R1 = BOTTOM OF USER STACK ; R2 = TOP OF USER STACK ; R3 = PC OF TRACED INSTRUCTION ; R4 = ADDRESS OF WATCHED LOCATION ; R5 = NEW VALUE STORED IN LOCATION ; ; OUTPUT: ; ; MESSAGE WRITTEN TO .MOLUN. ; ; ; REGISTERS: USES R0-R5 SAVES: NONE. ; ;- ; $$DOUT: ;REF. LABEL ; ; SAVE STACK PARAMETERS. ; MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ; ... R2 ; ; FORMAT MESSAGE WITH ADDRESS, NEW VALUE, AND PC. ; MOV #ADFLD+6,R0 ;GET ADDRESS TO STORE VALUE MOV R4,R1 ;GET ADDRESS OF CHANGED LOCATION CALL DBINOC ;CONVERT TO OCTAL AND STORE MOV #VAFLD+6,R0 ;GET ADDRESS TO STORE VALUE MOV R5,R1 ;GET NEW VALUE CALL DBINOC ;CONVERT TO OCTAL AND STORE MOV #PCFLD+6,R0 ;GET ADDRESS TO STORE PC MOV R3,R1 ;GET PC OF INSTRUCTION CALL DBINOC ;CONVERT TO OCTAL AND STORE ; ; OUTPUT MESSAGE TO USER TERMINAL. GET LUN NUMBER FROM .MOLUN WHICH ; IS INITIALIZED BY TASK-BUILDER. ; MOV .MOLUN,ERRDPB+Q.IOLU ;STORE LUN NUMBER DIR$ #ERRDPB ;OUTPUT MESSAGE ; ; LOOP AND DUMP USER STACK TO TERMINAL. ; MOV .MOLUN,STKDPB+Q.IOLU ;STORE LUN NUMBER MOV (SP)+,R4 ;RESTORE TOP OF STACK MOV (SP)+,R3 ;RESTORE END OF STACK 1000$: CMP R3,R4 ;ARE WE AT STACK TOP? BHIS 9999$ ; IF HIS - YES, DONE MOV #SPFLD+6,R0 ;GET FIELD ADDRESS MOV R3,R1 ;COPY STACK ADDRESS CALL DBINOC ;CONVERT TO OCTAL MOV #COFLG+6,R0 ;GET FIELD ADDRESS MOV (R3)+,R1 ;GET STACK VALUE CALL DBINOC ;CONVERT TO OCTAL DIR$ #STKDPB ;OUTPUT MESSAGE BR 1000$ ; AND LOOP ; ; RETURN TO CALLER. ; 9999$: RETURN ;ALL DONE .SBTTL DBINOC * CONVERT BINARY TO OCTAL ; ;+ ; THIS SUBROUTINE CONVERTS BINARY TO ASCII OCTAL. IT ALWAYS ZERO ; FILLS THE RESULT. ; ; INPUT: ; ; CALL WITH: R0 = ADDRESS OF END OF SIX-CHARACTER FIELD ; R1 = NUMBER TO CONVERT ; ; OUTPUT: ; ; NUMBER STORED IN FIELD, WITH ZERO FILLING IF NEEDED. ; ; ; REGISTERS: USES R0-R2 SAVES: R3-R5 ; ;- ; DBINOC: MOV #5,R2 ;SET LOOP COUNTER 1000$: MOV R1,-(SP) ;SAVE CURRENT VALUE BIC #177770,(SP) ;CLEAR ALL BUT LOW BITS ADD #'0,(SP) ;CONVERT TO ASCII DIGIT MOVB (SP)+,-(R0) ;STORE CHARACTER IN FIELD ASR R1 ;SHIFT OUT LOW DIGIT ASR R1 ; ... ASR R1 ; ... DEC R2 ;COUNT DIGIT BNE 1000$ ; IF NE - LOOP MOVB #'0,-(R0) ;PRESET POSITIVE NUMBER TST R1 ;WAS NUMBER NEGATICE BPL 9999$ ; IF PL - NO, SKIP MOVB #'1,(R0) ;STORE NEGATIVE DIGIT 9999$: RETURN ;RETURN TO CALLER .END