.TITLE CDERRM .IDENT /V3.2/ ; ; AUTHORS: ; VICKY WHITE, MARK PYATETSKY ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - JUL0982 - VW - ORIGINAL VERSION ; V02 - AUG1982 - MP - RT-11 ADDED ; V03 - OCT1382 - VW - CHANGE .PRINT TO USE .TTYOUT FOR RT-11 ; V3.1 - 09NOV82 - VW - MAKE MAXLEN CONSISTANT WITH TXTBUF ; V3.2 - 26JUL84 - DB - sign-extend the status byte returned ; ; ++ ; ; FUNCTION: ; ROUTINE TO PRINT A STANDARD CDPACK ERROR NUMBER AND MESSAGE, ; GIVEN A SYSTEM SPECIFIC ERROR CODE ; CALLS ROUTINE CDERRN TO GET THE SYSTEM SPECIFIC STATUS VALUE ; TRANSLATED TO A CDPACK STANDARD ERROR NUMBER ; AND CALLS ROUTINE CDERRT TO GET THE STANDARD ERROR TEXT FOR ; THE ERROR ; ; ; ------- ; ; CALLING SEQUENCE: ; ---------------- ; ; CALL CDERRM(STAT,ERR) ; ; ; MACROS ; ------ ; .MCALL RT$RSX RT$RSX ;DEFINE VERSION: RT-11 OR RSX-11M .MCALL ERR$DF,PUSH,POP .IF NDF RT11 .MCALL QIOW$S .IFF .MCALL .TTYOUT .ENDC .MCALL $CM82 $CM82 ;TO DEFINE COMMON AREA ERR$DF ;DEFINE ERROR CODES ; ; LOCAL MACRO: ; ----------- .MACRO ERRMSG,MAX $N = 0 .REPT MAX+1 MSGADD \$N $N = $N + 1 .ENDR .ENDM ; .MACRO MSGADD,$M ; GENERATE A TABLE OF ERROR MESSAGE ADDRESSES INDEXED BY ; STANDARD CDPACK ERROR NUMBERS .WORD E'$M .ENDM ; ; ; GLOBALS: ; ------- .GLOBL CDERRM ;ROUTINE ENTRY POINT .GLOBL CDERRT ;ROUTINE CALLED TO RETURN ERROR TEXT .GLOBL CDERRN ;ROUTINE CALLED TO RETURN CDPACK ER. NO. .PAGE ; ; INPUTS TO ROUTINE ; ----------------- ; R5 IS THE ADDRESS OF A FORTRAN ARGUMENT LIST ; ; OUTPUTS ; ------- ; ERROR MESSAGE TEXT AND NUMBER IS PRINTED OUT ; THE ERROR RETURN FROM THE PRINTING IS PASSED BACK IN ERR ARGUMENT ; ; ; LOCAL VARIABLES: ; --------------- ; TXTBUF: .BLKB 76. ;BUFFER FOR ASCII ERROR MESSAGE TEXT TXTLEN: .WORD ;FOR LENGTH OF ERROR MESSAGE TEXT MAXLEN: .WORD 74. ;LEN OF TEXT BUFFER AVAILABLE ERRNO: .WORD ARGLST: .WORD ;FORTRAN ARGUMENT LIST STAADR: .WORD ;ADDRESS OF STATUS RETADR: .WORD ;FOR RETURN VARIABLE ADDRESS LNMADR: .WORD MAXLEN ;ADDRESS OF VARIABLE FOR MAX LEN LENADR: .WORD TXTLEN ;ADDRESS OF VARIABLE FOR TEXT LEN STAT: .BLKW 2 ;FOR STATUS OF PRINT ; ; LITERALS ; -------- ASCZERO='0 BSPACE=<' > WSPACE=<" > RETURN: .BYTE 15 LF : .BYTE 12 .EVEN ; CDERRM:: PUSH MOV 2(R5),STAADR ;PUT STATUS ADDRESS IN FORTRAN ;ARGUMENT LIST MOV #ERRNO,RETADR ;RETURN ARGUMENT ADDRESS MOV #ARGLST,R5 ;FORTRAN ARGUMENT LIST MOV #2,ARGLST MOV #TXTBUF,R4 ;FOR ERROR TEXT CALL CDERRN ;GET STANDARD ERROR NUMBER MOV ERRNO,R0 ;STANDARD ERROR NUMBER BGE 1$ ;IF -1 UNKNOWN ERROR MOV #WSPACE,(R4)+ ;NO ERROR NUMBER BR 20$ ; 1$: CLR R1 ;TO COUNT TENS 5$: SUB #10.,R0 ;CONVERT TO ASCII DECIMAL ;ASSUME 0 - 99 BLT 10$ ;IF -VE GOT ALL TENS INC R1 ;ELSE ONE MORE TEN TST R0 BEQ 12$ ;EXACT NO. OF TENS BR 5$ ; 10$: ADD #10.,R0 ;GET BACK REMAINDER 0-9 12$: ADD #ASCZERO,R0 ;CONVERT TO ASCII MOV #BSPACE,R2 ;DEFAULT FOR 0-9 NUMBERS TST R1 ;AND TENS? BEQ 15$ MOV R1,R2 ;CONVERT TENS TO ASCII ADD #ASCZERO,R2 15$: MOVB R2,(R4)+ MOVB R0,(R4)+ 20$: MOV #WSPACE,(R4)+ MOV R4,RETADR ;SET UP BUFFER FOR TEXT CALL MOV #ARGLST,R5 ;FORTRAN ARG LIST MOV #4,ARGLST ;4 ARGUMENTS CALL CDERRT MOV TXTLEN,R0 ADD #4,R0 ; .IF NDF RT11 ; MOV CD.ERL,R1 ;ERROR MESSAGE LOGICAL UNIT ;USE THIS NUMBER EF TOO QIOW$S #IO.WVB,R1,R1,,#STAT,,<#TXTBUF,R0,#40> ; .IFF ; MOV #TXTBUF,R4 ;ADDRESS OF TEXT MOV R0,R5 ;USE R5 AS COUNTER (TTYOUT ;DESTROYS R0) 77$: .TTYOUT (R4)+ ;OUTPUT TEXT DEC R5 BGT 77$ ;EACH CHARACTER 1 BY 1 .TTYOUT RETURN ;CARRIAGE RETURN AT END .TTYOUT LF ;LINE FEED BEFORE TEXT ; .IFTF ; POP ;RESTORE ARGUMENT POINTER ; .IFT ; BCC 22$ MOV $DSW,@4(R5) ;RETURN PRINT STATUS BR 25$ 22$: MOVB STAT,R0 ;SIGN-EXTEND HIGH BYTE MOV R0,@4(R5) ;RETURN PRINT STATUS 25$: ; .ENDC ; POP ;RESTORE OTHER REGISTERS RETURN .END