.TITLE ERRMES -- PRINTS DIRECTIVE, I/O, AND FCS ERROR MESSAGES. .SBTTL INTRODUCTION ; ; THIS PACKAGE OF SUBROUTINES PRINTS MESSAGES FOR DIRECTIVE, ; I/O, AND FILE PROCESSING (FCS) ERRORS. THE APPROPRIATE MESSAGE IN ; [1,2]QIOSYM.MSG IS PRINTED ALONG WITH THE PROGRAM COUNTER ; (PC) AT THE POINT FROM WHICH THE SUBROUTINE WAS CALLED. ; THE MO (MESSAGE OUTPUT) HANDLER IS USED FOR ALL ; OPERATIONS. ; ; THE FOLLOWING ENTRY POINTS ARE PROVIDED: ; ; DIRERR - PRINTS THE MESSAGE FOR THE ERROR INDICATED ; IN THE DIRECTIVE STATUS WORD (DSW) AT VIRTUAL ; LOCATION 0, ALONG WITH THE VALUE OF THE PC ; OBTAINED FROM THE STACK. "DIRERR" MAY BE ; USED AS THE ERROR HANDLING SUBROUTINE ADDRESS IN ; DIRECTIVE CALLS. AFTER THE MESSAGE IS PRINTED, ; THE TASK IS SUSPENDED. ; ; IOERR - PRINTS THE MESSAGE FOR THE ERROR INDICATED IN THE ; I/O STATUS BLOCK (PROVIDED AS AN ARGUMENT), ; ALONG WITH THE PC OBTAINED FROM THE STACK, AND THE ; THE I/O STATUS BLOCK. THE TASK EXECUTION CONTINUES ; IN THE CASE OF AN END-OF-FILE; OTHERWISE THE TASK ; IS SUSPENDED. ; ; FCSERR - PRINTS THE MESSAGE FOR THE ERROR INDICATED BY THE ; FILE DESCRIPTOR BLOCK (FDB) POINTED TO BY R0, ; ALONG WITH THE PC OBTAINED FROM THE STACK AND THE ; ERROR CODE, FILENAME, AND LUN. IF THE ADDRESS OF AN ; I/O STATUS BLOCK IS PROVIDED IN THE FDB, IT TOO IS ; PRINTED. AFTER THE MESSAGE IS PRINTED, THE TASK IS ; SUSPENDED. "FCSERR" MAY BE USED AS THE ERROR HANDLING ; SUBROUTINE ADDRESS IN FCS CALLS. ; ; NOTE: IF THESE SUBROUTINES ARE INCLUDED IN A TASK THAT ; CONTAINS ONLY MACRO-11 GENERATED CODE, THE GLOBAL ; SYMBOL ".MOLUN" MUST BE DEFINED ELSEWHERE (FOR EXAMPLE, ; BY INCLUDING "MODEF.OBJ" AS INPUT TO THE TASK BUILD. ; ; WHENEVER THE TASK IS SUSPENDED, IT MAY BE RESUMED BY ; ENTERING: ; CON "TASKNAME" ; TO MCR. ; ; JOHN T. DALTON, CODE 933 29 OCT 1975 ; .SBTTL DATA AREA .MCALL MODF$,MOUT$,WTSE$,FDOF$L,DIR$ MODF$ ; DEFINE MO FLAGS. FDOF$L ; DEFINE FDB OFFSETS. WTSE: WTSE$ 30. ; DPB TO WAIT FOR MO HANDLER COMPLETION MOUT: MOUT$ IOESTR,PARAM,0,CONT,SYLOG,BUF,134.,MIOST,0 MIOST: .WORD 0,0 ; FILE NAME STRING FOR ERROR MESSAGE SOURCE. MFILE: .WORD 20$-10$ ; LENGTH OF FILE NAME STRING. .WORD 10$ ; @(FILE NAME STRING) 10$: .ASCIZ /SY:[1,2]QIOSYM.MSG/ 20$: ; FORMAT STRING FOR DIRECTIVE ERRORS. .EVEN DIRSTR: .WORD 20$-10$ ; LENGTH OF FORMAT STRING. .WORD 10$ ; @(FORMAT STRING) 10$: .ASCIZ /DIRECTIVE ERROR -- PC = %1P%1N%VA/ 20$: ; FORMAT STRING FOR I/O ERRORS. .EVEN IOESTR: .WORD 20$-10$ .WORD 10$ ; @(FORMAT STRING) 10$: .ASCII &%VA%1NPC = %1P%1NI/O STATUS BLOCK:& .ASCIZ / %1P,%1D %1D (%1P)8/ 20$: ; FORMAT STRING FOR FCS ERRORS. .EVEN FCSSTR: .WORD 20$-10$ ; LENGTH OF FORMAT STRING. .WORD 10$ ; @(FORMAT STRING) FCSL1=20$-10$ ; LENGTH OF FMT STR W/O I/O STATUS BLK FCSL2=30$-10$ ; LENGTH OF FMT STR W/ I/O STATUS BLK 10$: .ASCII /FCS ERROR: PC = %1P/ .ASCII /%1N%VA%1N%2P %2A%1D:%1X, LUN=%1D/ 20$: .ASCIZ /%1N%2P/ 30$: .EVEN PARAM: .BLKW 20. ; PARAMETER AREA. SAVE: .BLKW 2 ; TEMPORARY STORAGE FOR REGS. BUF: .BLKB 134. ; BUFFER FOR MESSAGE. .SBTTL DIRERR -- PRINTS DIRECTIVE ERROR MESSAGES. ; ; ENTRY: CALL DIRERR ; DIRERR:: MOV @#0,MOUT+M.ONUM ; MOVE ERROR CODE TO DPB. BGE 10$ ; RETURN IF NO ERROR. NEG MOUT+M.ONUM ;CONVERT TO RECORD NUMBER. ADD #128.,MOUT+M.ONUM ; DIRECTIVE ERRORS OFFSET BY 128. MOV #MFILE,MOUT+M.OSTR ; FILE NAME STRING ADDRESS MOV .MOLUN,MOUT+M.OLUN ; LUN CLR MOUT+M.OPRM ; NO PARAMETERS MOVB #BU$FFR,MOUT+M.ODST ; GET MESSAGE IN BUFFER. MOV #BUF,MOUT+M.OBUF MOV #134.,MOUT+M.OSIZ MOVB #C$ONT,MOUT+M.OACT ; CONTINUE AFTER OPERATION DIR$ #MOUT ; GET ERROR MESSAGE IN BUFFER DIR$ #WTSE ; AND WAIT FOR COMPLETION. MOV (SP),PARAM ; MOVE PC TO PARAMETER LIST. ; MOVE MESSAGE STRING PARAMETERS TO PARAMETER LIST ; (ASSUME A ONE-RECORD MESSAGE). MOV BUF+2,PARAM+2 ; MESSAGE LENGTH IN BYTES MOV #BUF+4,PARAM+4 ; @(MESSAGE STRING). CLR MOUT+M.ONUM ; FORMAT STRING IS IN CORE. MOV #DIRSTR,MOUT+M.OSTR ; FORMAT STRING ADDRESS MOV #PARAM,MOUT+M.OPRM ; PARAMETER STRING ADDRESS MOVB #SY$STM!HE$ADR,MOUT+M.ODST ; PRINT MESS W/ HDR MOVB #S$USP,MOUT+M.OACT ; SUSPEND AFTER OPERATION DIR$ #MOUT DIR$ #WTSE 10$: RTS PC .SBTTL IOERR -- PRINTS I/O ERROR MESSAGES. ; ; ENTRY: CALL IOERR(IOST) ; ; WHERE IOST IS THE TWO-WORD I/O STATUS BLOCK. ; IOERR:: MOV R0,SAVE ; SAVE REGISTERS USED. MOV R1,SAVE+2 MOV 2(R5),R0 ; @(IOST) MOVB (R0),R1 ; GET ERROR CODE BGE 20$ ; RETURN IF NO ERROR. NEG R1 ; RECORD # FOR QIOSYM.MSG ; SET UP MO DPB (MOUT) TO GET MESSAGE FROM QIOSYM.MSG MOV R1,MOUT+M.ONUM ; RECORD NUMBER MOV .MOLUN,MOUT+M.OLUN ;LUN CLR MOUT+M.OPRM ;NO PARAMETERS MOV #MFILE,MOUT+M.OSTR ; FILE NAME STRING ADDRESS MOVB #BU$FFR,MOUT+M.ODST ; GET MESSAGE IN BUFFER MOV #BUF,MOUT+M.OBUF ; @(BUFFER) MOV #134.,MOUT+M.OSIZ ; SIZE OF BUFFER MOVB #C$ONT,MOUT+M.OACT ;CONTINUE DIR$ #MOUT DIR$ #WTSE ; WAIT FOR MESSAGE COMPLETION MOV BUF+2,PARAM ; LENGTH OF MESSAGE (BYTES) MOV #BUF+4,PARAM+2 ; @(MESSAGE TEXT) MOV (SP),PARAM+4 ; PC FROM STACK CLR PARAM+8. ; ERROR CODE TO PARAMETER LIST MOVB (R0),R1 MOV R1,PARAM+8. CLR PARAM+6 ; MOVE BYTE 1 OF WORD 1 TO MOVB 1(R0),PARAM+6 ; PARAMETER LIST. MOV 2(R0),PARAM+10. ;MOVE WORD 2 OF IOST FOR PRINTING MOV 2(R0),PARAM+12. ; IN DECIMAL AND OCTAL. CLR MOUT+M.ONUM ; INDICATE FORMAT STRING IN CORE. ; SET UP MO DPB FOR MESSAGE PRINTING. MOV #IOESTR,MOUT+M.OSTR ; FORMAT STRING ADDRESS MOV #PARAM,MOUT+M.OPRM ; PARAMETER STRING ADDRESS. MOVB #SY$STM!HE$ADR,MOUT+M.ODST ; PRT ON SYLOG W/ HDR ; IF EOF, CONTINUE AFTER PRINTING. OTHERWISE SUSPEND. CMPB #-10.,(R0) ; EOF? BEQ 10$ MOVB #S$USP,MOUT+M.OACT ; NO - SUSPEND. 10$: DIR$ #MOUT DIR$ #WTSE ;WAIT FOR MESSAGE COMPLETION MOV SAVE,R0 ; RESTORE REGISTERS MOV SAVE+2,R1 20$: RTS PC ;RETURN .SBTTL FCSERR -- PRINTS ERROR MESSAGES FOR FCS ERRORS. ; ; ENTRY: CALL FCSERR ; ; THE ADDRESS OF THE FILE DESCRIPTOR BLOCK (FDB) IN USE IS ; OBTAINED FROM R0. ; ; THE FOLLOWING MESSAGE IS PRINTED ON TI: ; ; FCS ERROR: PC =
; ; , LUN= ; <2-WORD I/O STATUS BLOCK (ONLY IF ADDRESS IN FDB)> ; ; THE TASK IS THEN SUSPENDED. ; FCSERR:: MOV R1,SAVE ; SAVE R1 MOVB F.ERR(R0),R1 ;GET ERROR CODE BGE 20$ ; RETURN IF NO ERROR NEG R1 ; GET RECORD NUMBER OF MESSAGE TSTB F.ERR+1(R0) ;CHECK FOR DIRECTIVE ERROR BGE 10$ ADD #128.,R1 ;DIRECTIVE ERROR - ADD 128 TO REC # 10$: MOV R1,MOUT+M.ONUM MOV #MFILE,MOUT+M.OSTR ;FILENAME MOV .MOLUN,MOUT+M.OLUN ;LUN CLR MOUT+M.OPRM ;NO PARAMETERS MOVB #BU$FFR,MOUT+M.ODST ; GET MESSAGE IN BUFFER MOVB #C$ONT,MOUT+M.OACT ; AND CONTINUE MOV #BUF,MOUT+M.OBUF ; @(BUFFER) MOV #134.,MOUT+M.OSIZ ; SIZE OF BUFFER DIR$ #MOUT ; GET MESSAGE DIR$ #WTSE ; WAIT FOR COMPLETION MOV (SP),PARAM ; MOVE PC TO PARAMETER LIST CLR PARAM+6 ; MOVE F.ERR MOVB F.ERR(R0),PARAM+6 CLR PARAM+8. ; AND F.ERR+1 TO PARAMETER LIST. MOVB F.ERR+1(R0),PARAM+8. MOV R0,PARAM+10. ; COMPUTE @(DEVICE NAME) ADD #F.FNB,PARAM+10. ADD #N.DVNM,PARAM+10. MOV F.FNB+N.UNIT(R0),PARAM+12. ; UNIT # ; MOVE FILENAME FROM FILENAME BLOCK TO PARAMETER LIST. MOV F.FNB+N.FNAM(R0),PARAM+14. ;FILENAME MOV F.FNB+N.FNAM+2(R0),PARAM+16. MOV F.FNB+N.FNAM+4(R0),PARAM+18. MOV F.FNB+N.FTYP(R0),PARAM+20. ; FILE TYPE MOV F.FNB+N.FVER(R0),PARAM+22. ; VERSION NUMBER CLR PARAM+24. MOVB F.LUN(R0),PARAM+24. ; LUN MOV #FCSL1,FCSSTR ; SET LENGTH OF SHORT FMT STR ; IF I/O STATUS BLOCK ADDRESS IS PROVIDED IN FDB, PRINT IT TOO. TST F.BKST(R0) ; I/O STATUS BLK PROVIDED? BEQ 15$ MOV #FCSL2,FCSSTR ; LENGTH OF LONG FMT STR MOV F.BKST(R0),R1 ; @(I/O STAT BLK) MOV (R1)+,PARAM+26. MOV (R1),PARAM+28. ; SET UP MO DPB (MOUT) FOR MESSAGE PRINTING. 15$: CLR MOUT+M.ONUM ;FORMAT STRING IN CORE MOV BUF+2,PARAM+2 ; LENGTH OF MESSAGE TEXT. MOV #BUF+4,PARAM+4 ; @(MESSAGE TEXT) MOV #FCSSTR,MOUT+M.OSTR ;FORMAT STRING ADDRESS MOV #PARAM,MOUT+M.OPRM MOVB #SY$STM!HE$ADR,MOUT+M.ODST MOVB #S$USP,MOUT+M.OACT ;SUSPEND DIR$ #MOUT ; PRINT MESSAGE DIR$ #WTSE ;WAIT FOR COMPLETION MOV SAVE,R1 ; RESTORE R0 20$: RTS PC .END