.TITLE CLIERR - ERROR REPORTER FOR "CLI" TASK .IDENT /011784/ .ENABL GBL .ENABL LC .NLIST BEX ; ;+ ;***** ; ; CLIERR.MAC generates error messages based on the current ; contents of the directive status word (@#$DSW) and ; a table of recognized error codes/text defined by ; the "ERRMSG" macro. ; ; Two entry points are defined, $CIERR is called to process ; any error conditions; $CIEXI is called for common exit ; processing. ; ; ;***** ; ; Update 1/17/84 -- PRS; original edit ; ;***** ;- .MCALL EXST$S,QIOW$,TCBDF$,DIR$ ; BL=40 ; ASCII SPACE HY=55 ; ASCII HYPHEN ; TCBDF$ ; DEFINE TCB OFFSETS TO GET AT TASK NAME ; .PSECT $IDATA,D,RW,LCL,CON,REL ERRQIO: QIOW$ IO.WVB,TI$LUN,TI$EFN,,,, ERRTXT: ; SPACE TO BUILD ERROR MESSAGE .BLKB 80. .EVEN .PSECT $PCODE,I,RO,LCL,CON,REL ; ;+ ;***** ; ; .CIERR - Uses error code stored in task's directive status word ; to generate an appropriate error message for the user. Control ; immediately passes to .CIEXI after error message is sent to TI: ; ;***** ;- .CIERR:: ; GLOBAL ENTRY POINT MOV @#$DSW,R5 ; PICKUP ERROR CODE BPL .CIEXI ; BRANCH IF NOT -VE MOV $TKTCB,R0 ; PICKUP OUR TCB ADDRESS ADD #T.NAM,R0 ; POINT TO TASK NAME MOV (R0)+,R1 ; PICKUP 1ST HALF OF NAME CMP R1,#^R... ; PROTOTYPE NAME ?? BNE 10$ ; BRANCH IF NO MOV (R0),R1 ; ELSE, USE 2ND HALF OF NAME 10$: MOV #ERRTXT,R0 ; FETCH PLACE TO BUILD MESSAGE CALL $C5TA ; CONVERT NAME TO ASCII MOVB #BL,(R0)+ ; FILL IN SEPARATOR MOVB #HY,(R0)+ MOVB #HY,(R0)+ MOVB #BL,(R0)+ MOV #$CIMSG,R1 ; PICKUP ERROR CODES/TEXT 20$: MOV (R1)+,R2 ; PICKUP ERROR CODE # BPL 25$ ; +VE # IS "MATCHALL" CODE CMP R5,R2 ; FOUND MATCH FOR ERROR CODE ?? BEQ 25$ ; BRANCH IF YES ADD (R1)+,R1 ; STEP TO NEXT ERROR DEFN BR 20$ ; AND LOOP TIL DONE 25$: MOV (R1)+,R2 ; PICKUP # BYTES IN TEXT BEQ 30$ ; BRANCH IF NOTHING TO COPY 26$: MOVB (R1)+,(R0)+ ; COPY STRING SOB R2,26$ TST -1(R0) ; LAST THING COPIED A NULL BNE 30$ ; BRANCH IF NO DEC R0 ; YES, BACKUP TO IT 30$: SUB #ERRTXT,R0 ; COMPUTE BYTE COUNT IN MESSAGE MOV R0,ERRQIO+Q.IOPL+2 ; SAVE IT IN QIO DPB DIR$ #ERRQIO ; AND SEND IT TO TI: MOV #EX$SEV,$CIEXS ; ALL ERRORS ARE CONSIDERED "SEVERE" ; ;+ ;***** ; ; .CIEXI - provides a common exit point for the task. All cleanup ; should be included in this routine prior to the "exit-with-status" ; directive. .CIEXI assumes $CIEXS has been set to a valid ; RSX exit code: ; 0 = warning ; 1 = success ; 2 = error ; 3 = ???? ; 4 = severe ; ;***** ;- .CIEXI:: ; GLOBAL COMMON EXIT POINT FOR "CLI" TASK EXST$S $CIEXS ; EXIT WITH STATUS ; .END ;CLIERR