.TITLE PRFCS - PRINT FCS ERROR CODE .IDENT -000100- .MCALL MOUT$S,QIOW$S,WSIG$S,ALUN$S ; ; SUBROUTINE TO GET A TEXTUAL EXPLANATION FOR AN FCS ERROR. ; IT IS ENTERED VIA JSR PC,.PRFCS ; ; ON ENTRY: ; ; R0 ADDRESS OF THE FDB WHICH HAD THE ERROR. ; R1 ADDRESS OF A USER TASKNAME BUFFER. ; R2 SIZE OF THE USER BUFFER. ; ; ON RETURN, ALL REGESTERS ARE UNCHANGED. ; .PRFCS::MOV R3,-(SP) MOVB F.ERR(R0),R3 ;GET F.ERR NEG R3 ;GET I/O ERROR CODE BITB #200,F.ERR+1(R0) ;IS IT A DIR CODE? BEQ 10$ ;NO ADD #128.,R3 ;FIXUP CODE. 10$: MOUT$S #QIOSYM,#QIOPRM,R3,CONT,USBUF,#BUFFER,#BUFLEN,,,PRBAD MOV R2,QIOPRM ;SET THE LENGTH OF TSK STRING MOV R1,QIOPRM+2 ;SET THE ADDRESS OF TSK STR. MOV BUFFER+2,QIOPRM+4 ;LENGTH OF ERROR STRING. MOUT$S #PRNTIT,#QIOPRM,,CONT,#SY$STM,,,,,PRBAD MOV (SP)+,R3 RETURN PRBAD: TST (SP)+ ;POP OFF GARBAGE RETURN ADDRESS. MOV R4,-(SP) ;SAVE R4 ... MOV R5,-(SP) ;... AND R5 MOVB F.ERR(R0),R5 ;GET ERROR CODE CLR R4 NEG R5 ;MAKE CODE POSITIVE. BLE 10$ ;NO ERROR -- LEAVE. DIV #10.,R4 ;DIVIDE THE CODE BY 10. SWAB R5 ;PUT RESULT IN HIGH BYTE. BIS R5,R4 ;SET THE LOW ORDER. BIS #"00,R4 ;MAKE IT NUMERIC. MOV #BUFFER,R3 ;POINT TO BUFFER. MOV R1,-(SP) MOV R2,-(SP) BLE 4$ ;NO 3$: MOVB (R1)+,(R3)+ ; SOB R2,3$ ;MOVE THINGS INTO BUFFER. 4$: MOV (SP)+,R2 MOV (SP)+,R1 MOV #STDSW,R5 ;GET DSW STRING TSTB F.ERR+1(R0) ;IS IT A DSW CODE? BMI 5$ ;YES MOV #STFCS,R5 ;NO 5$: MOVB (R5)+,(R3)+ ;MOVE IN THE STRING. BNE 5$ ;LOOP UNTIL "DONE" MOVB R4,-1(R3) ;MOVE IN LOW ORDER ERROR CODE SWAB R4 ; MOVB R4,(R3)+ ; AND HIGH ORDER ERROR CODE ALUN$S .MOLUN,#"TI,#0 SUB #BUFFER,R3 ;COMPUTE LENGTH OF QIO 10$: QIOW$S #IO.WVB,.MOLUN,#30.,,,,<#BUFFER,R3,#40> CMP @#$DSW,#-1 ;NO NODES? BNE 20$ ;NO -- OK WSIG$S ;WAIT A BIT BR 10$ ;AND TRY AGAIN. 20$: ALUN$S .MOLUN,#"MO,#0 ;FIXUP .MOLUN AGAIN. MOV (SP)+,R5 ;RECOVER R5 MOV (SP)+,R4 ;RECOVER R4 MOV (SP)+,R3 ;RECOVER R3 RETURN ;AND RETURN. ; ; STRING DESCRIPTOR FOR GETTING ERROR NAME ; QIOSYM: .WORD QIOLEN .WORD QIOFIL ; ; FILE NAME WHERE ERROR NAMES ARE KEPT ; QIOFIL: .ASCIZ /SY:[1,2]QIOSYM.MSG/ QIOLEN = .-QIOFIL .EVEN ; ; PARAMETER LIST ; QIOPRM: .WORD 0 ;LENGTH OF TASK STRING. .WORD 0 ;ADDRESS OF TASK STRING. .WORD 0 ;LENGTH OF ERROR STRING. .WORD BUFFER+4 ;ADDRESS OF ERROR STRING. ; ; STRING DESCRIPTOR ; PRNTIT: .WORD FMTLEN ;LENGTH OF STRING .WORD FMTSTR ;ADDRESS OF STRING ; ; FORMAT STRING ; FMTSTR: .ASCII /%VA -- %VA/ FMTLEN = .-FMTSTR .EVEN ; ; LUN FOR MO.... ; .MOLUN::.WORD 0 ; ; BUFFER FOR FCS CODE ; BUFFER: .BLKB 80. BUFLEN = .-BUFFER ; ; STRINGS FOR USE IF MO.... FAILS. ; STFCS: .ASCIZ / -- FCS -/ STDSW: .ASCIZ / -- DSW -/ .EVEN .END