;+ ; #.#.# ; ; ; Write debug message to lun 4 (BUGMSG) ; ; ; FUNCTION: ; This subroutine is a debug utility that allows ; date, time, text and variables to be output to a terminal ; without FORTRAN i/o. ; ; ; CALLING SEQUENCE: ; ; CALL BUGMSG( 'MESSAGE STRING' [,ERR NUMBER] ) ; ; WHERE: ; ARGUMENT = DESCRIPTION ACCESS ; ; MESSAGE STRING - Error message to be printed on the terminal ; ; ERR NUMBER - Error number to follow error message (if any) ; -9999 <= NUMBER <= 32767 ; ; Note that a variable number of 'err number' ; arguments can be passed to this subroutine ; for printing in integer format. ; ; ; SUBROUTINES REFERENCED: ; QIOW$ GTIM$ $DAT $TIM $CBDSG $GLUN ; GTSK$ ALUN$S ; ; ; DESCRIPTION: ; BUGMSG checks lun 4 for assignment to the NL: device. ; If it is, BUGMSG just returns. Otherwise, BUGMSG will ; output the message and the converted error numbers to ; the device assigned to lun 4. ; ; SPECIAL CONSIDERATIONS: ; 1. This subroutine requires lun 4. ; ; 2. Local event flag 23. is used for I/O. ;- .TITLE BUGMSG .IDENT /V1.0/ .MCALL QIOW$S,GTIM$S,GTSK$S,GLUN$S,ALUN$S .PSECT ELF$D,RW,D,LCL,REL,CON ; ORDERING OF DATA IS SIGNIFICANT -- DON'T CHANGE IT R50NAM: .BLKW 2. TIMBUF: .BLKW 8. BUF: .BLKB 34. LF=10. SPACE=32. DASH=45. CR=13. EFLG=23. CRBUF: .BYTE CR,0 .PSECT ELF$I,RO,I,LCL,REL,CON BUGMSG:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) ; ; Get LUN information; ; if null device, skip output. ; GLUN$S #4,#BUF ;Get LUN information block CMP #IS.SUC,$DSW ;success ? BNE NULDEV ;no, return CMP #"NL,BUF ;no, is it a TT: device? BNE OK NULDEV: JMP FINI ; ; NOTE: GTSK RETURNS 16 WORDS BUT WE ONLY WANT THE FIRST TWO SO WE CLOBBER ; THE TIME BUFFER AND OUTPUT BUFFER WITH THE REMAINDER IN ORDER TO ; SAVE SPACE -- THIS IS WHY WE CALL GTSK BEFORE ANYTHING ELSE ; OK: GTSK$S #R50NAM ;GET TASK PARAMETERS GTIM$S #TIMBUF ;GET TIME PARAMETERS MOV #BUF,R0 ;SET PARMS FOR $DAT AND $TIM MOVB #CR,(R0)+ ;PUT CR IN BUFFER MOVB #LF,(R0)+ ;PUT LF IN BUFFER MOV #TIMBUF,R1 CALL $DAT ;PUT DATE IN BUFFER MOVB #SPACE,(R0)+ ;PUT SPACE IN BUFFER MOV #5,R2 ; SELECT HH:MM:SS:T FORMAT CALL $TIM ;PUT TIME IN BUFFER MOVB #SPACE,(R0)+ ;PUT SPACE IN BUFFER MOV R50NAM,R1 ;CONVERT TASK NAME TO ASCII CALL $C5TA ;AND ACCUMULATE IN OUTPUT BUFFER MOV R50NAM+2,R1 CALL $C5TA MOVB #SPACE,(R0)+ ;PUT SPACE IN BUFFER MOVB #DASH,(R0)+ ;PUT DASH IN BUFFER MOVB #SPACE,(R0)+ ;PUT SPACE IN BUFFER SUB #BUF,R0 ;COMPUTE CHAR COUNT QIOW$S #IO.ATT,#4,#EFLG QIOW$S #IO.WLB,#4,#EFLG,,,,<#BUF,R0,,,,> ;OUTPUT LF DATE SPC TIME SPC ; MOV (SP),R5 MOV 2(R5),R0 ;GET ADDRESS OF TEXT BUFFER CLR R1 LOOP: ; LOOP FOR EACH CHAR TO COUNT STRING LENGTH MOVB (R0)+,R3 ;GET NEXT BYTE BEQ OUTSTR ;IF VALUE IS ZERO, EOS INC R1 BR LOOP ;LOOP BACK AND CONTINUE OUTSTR: QIOW$S #IO.WLB,#4,#EFLG,,,,<2(R5),R1,,,,> ; WRITE TEXT ; ; MOV (R5),R3 ;CHECK NUMBER OF ARGUMENTS ADD #4,R5 ;POINT R5 TO NUMERIC PARMS LOOP2: DEC R3 ;IF ONLY TEXT, RETURN BEQ RETURN MOV #BUF,R0 ;GET BUFFER ADDRESS MOV @(R5)+,R1 ;GET INTEGER VALUE CLR R2 ;SET SUPRESS BLANKS CALL $CBDSG ;CONVERT INTEGER TO ASCII MOVB #32.,(R0)+ ;APPEND A BLANK SUB #BUF,R0 ;GET STRING LENGTH QIOW$S #IO.WLB,#4,#EFLG,,,,<#BUF,R0,,,,> BR LOOP2 ; RETURN: QIOW$S #IO.WLB,#4,#EFLG,,,,<#CRBUF,#1,,,,> QIOW$S #IO.DET,#4,#EFLG FINI: MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC .END