.MCALL .MODULE .MODULE ERROUT,VERSION=35,COMMENT= .MCALL .AUDIT .AUDIT .ERROU,.ERRTX ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ;++ ; ; Edit Who Date Description of modification ; ---- --- ---- --------------------------- ; 001 WLD 23-OCT-90 Eliminate use of FBMON$ to ; determine SB environment. ; Instead, check $JOBS in RMON ; to specify max #jobs = 1. ; 002 WLD 20-DEC-90 Display ERROUT version if ; CR entered. ; ; 29 JFW 31-Oct-1990 bracket error messages in ; ;+/;ERROR/.../;- ; ; 30 JFW 21-Nov-1990 add JSX stuff ; ; 32 WFG 11-Jun-1991 ACT#7479 - Add .AUDIT ; ; 003 WLD 05-JUN-92 Fix reporting of Status Address ; Register Packet and T/MSCP End ; Messages. ; 34 Tim 13-OCT-1996 Output years with 4 digits, ; Shoppa accept either 2 or 4 digit years. ; ; 35 Tim 3-Sep-1998 Fix internal date comparison format ; Shoppa Do unsigned compares ; If /F: or /T: dates were specified ; on the command line, show them on ; the final page of output ;-- ;********* EDIT HISTORY ********************** ; ; July 1987 - Add MSCP Error Logging knowledge ; to the DEVICE display routine. ; It is invoked by CALL DOMSCP ; Matthew Sacks ; ; March 1988 - Add TMSCP Error Logging knowledge ; to the DOMSCP subroutine fo DEVICE ; Mathew Sacks ;************************************************* .SBTTL MACRO DEFINITIONS ; OUTPUT GENERATES A CALL TO THE GENERAL OUTPUT CODE (WRITIT) TO ; OUTPUT LINE OF TEXT, FOR R3-> LINE THE CALL IS TO WRITIT ; OTHERWISE THE CALL IS TO WRITI5 WITH THE ADDRESS OF THE LINE ; GIVEN BY @R5 .MACRO OUTPUT ATEXTL .IF NB ATEXTL JSR R5,WRITI5 .WORD ATEXTL .IFF JSR R5,WRITIT .ENDC .ENDM OUTPUT ; SETUPL GENERATES CODE TO CALL A STRING COPY ROUTINE TO SET UP THE ; LINE BUFFER WITH OR WITHOUT A LEADING TAB AND THE GIVEN TEXT .MACRO SETUPL ATEXTP,TAB .IF B TAB JSR PC,LININI .IFF JSR PC,LINPAD .ENDC JSR R5,STCOP5 .WORD ATEXTP .ENDM SETUPL ; STATNM GENERATES CODE TO SET UP AND OUTPUT THE LINE BUFFER WITH ; LEADING BLANKS, TEXT, BLANK FILL AND EITHER A SINGLE OR DOUBLE ; PRECISION DECIMAL VALUE .MACRO STATNM ASCPAR,OFFPAR,DOUBLE SETUPL ASCPAR,TAB JSR R5,BLKPD5 ;PAD WITH BLANKS TO LENGTH OF .IF NE DOUBLE .WORD 40. .IFF .WORD 46. .ENDC ;NE DOUBLE MOV R1,R2 ;POINT TO STRING TO STORE ASCII RESULT MOV OFFPAR(R5),R0 ;USE OFFSET TO GET VALUE .IF NE DOUBLE ;IF DBL PRECISION GET 2ND WORD MOV OFFPAR+2(R5),R1 ;GET HI ORDER PART OF VALUE JSR PC,DOCTDC ;CONVERT TO ASCII (DOUBLE PRECISION) .IFF JSR PC,OCTDCF ;CONVERT TO ASCII (SINGLE PRECISION) .ENDC ;NE DOUBLE OUTPUT .ENDM STATNM ; ERROR GENERATES CODE TO CALL THE ERROR MESSAGE OUTPUT ROUTINE AT A ; PARTICULAR ENTRY POINT DEPENDING ON THE LEVEL OF THE ERROR .MACRO ERROR MSG,LEVEL .IF IDN , JSR R5,FPEMSG .ENDC ;IDN , .IF IDN , JSR R5,WPEMSG .ENDC ;IDN , .WORD MSG .ENDM ERROR .SBTTL SYMBOLIC DEFINITIONS ; RT-11 SYSMAC MACROS .MCALL .CLOSE, .CSIGE, .CSISP .MCALL .DATE, .DSTAT, .ENTER .MCALL .EXIT, .FETCH, .GTIM .MCALL .LOOKU, .PURGE, .PRINT .MCALL .QSET, .RCTRL, .READW .MCALL .RELEA, .SDAT, .SETTO .MCALL .WRITW ; RT-11 SYSTEM.SML MACROS .LIBRARY "SRC:SYSTEM.MLB" .MCALL .FIXDF .SYCDF .SGNDF .CF1DF .UEBDF .MCALL .ELDDF .ELMDF .ELIDF .ELSDF .JSXDF ; INVOKE SYSTEM MACROS .FIXDF ;monitor fixed offsets .SYCDF ;monitor impure area .SGNDF ;sysgen word bit definitions .CF1DF ;configuration word #1 .UEBDF ;user error byte bit definitions .ELDDF ;device error record .ELMDF ;memory error record .ELSDF ;device statistics record .ELIDF ;error record types .JSXDF ;JSX bits ; SYMBOLIC DEFINITIONS FOR ASCII CHARACTER CODES ADECPT = '. ACOLON = ': ACHARA = 'A ACHARF = 'F ACHARS = 'S ACHART = 'T ASLSH = '/ ACR = 015 ALF = 012 ;SYMBOLIC OFFSET IN HEADER, FROM START OF FIXED PART OF HEADER OHTEL = 0 ;TOTAL ERRORS RECEIVED OHMEBF = 2 ;MISSED RECORDS (BUFFER FULL) OHMEFF = 4 ;MISSED RECORDS (ERRLOG.DAT FILE FULL) OHMETN = 6 ;MISSED RECORDS (TASK NOT READY) OHNMPE = 8. ;NUMBER OF MEMORY PARITY ERRORS OHNCPE = 10. ;NUMBER OF CACHE PARITY ERRORS OPNXRC = 12. ;POINTER TO NEXT RECORD OHCNF1 = 20. ;CONFIGURATION WORD 1 OHCNF2 = 22. ;CONFIGURATION WORD 2 OHDATE = 24. ;DATE INITIALIZED ;IO SYMBOLICS MAXLIN = 60. ;MAXIMUM NUMBER OF LINES TO A PAGE INCHN = 3 ;INPUT FILE CHANNEL NUMBER MSGCHN = 1 ;MESSAGE CHANNEL FOR SYSTEM TASKING OTCHAN = 0 ;OUTPUT FILE CHANNEL NUMBER TABLGH = 8. ;INDENT 8 CHARACTERS ;OTHER SYMBOLIC DEFINITIONS SZHDVS = <2*ELS.SZ> ;DEVICE STATISTICS ENTRY SIZE (BYTES) NEGONE = -1 ;BUFFER TERMINATOR, NULL INDICATOR ;the following sizes are the number of lines in the actual display CSZFXP = 8. ;FIXED SIZE OF CACHE/MEMORY ERROR REC. SDEFXD = 21. ;FIXED SIZE OF A DEVICE RECORD SZDVST = 11. ;FIXED SIZE OF A DEVICE STATISTIC REC. SZDVSH = 16. ;SIZE OF A DEVICE STATISTIC HEADING SZMEST = 10. ;LINES IN A MEMORY PARITY REPORT .ASECT .=$JSX .WORD VBGEX$ .PSECT .SBTTL ERROUT - MAIN CONTROL ROUTINE FOR REPORTER ;+ ; ERROUT GENERATES A REPORT OF DEVICE AND MEMORY STATISTICS FROM THE OPERATOR ; SPECIFIED INPUT FILE, AND OUTPUTS THE RESULTING ASCII TEXT TO THE OPERATOR ; SPECIFIED OUTPUT DEVICE, ERROUT COMMUNICATES WITH THE EL TASK TO 'BORROW' ; A CURRENT COPY OF THE HEADER BLOCK ; ; INVOKED BY THE OPERATOR: RUN ERROUT ;- .GLOBL POINTL, HSPACE, $FNASC .ENABL LSB ERROUT::.QSET #QAREA,#1 ;ALLOCATE ONE MORE QUEUE ELEMENT PROMPT: ;??? SUB #2,HSPACE+2 .SETTO HSPACE+2 ;SET TOP TO END OF CODE CMP R0,HSPACE+2 ;MAKE SURE IT'S DONE BHI SETTOK ;ALL SET MOV #SWPADR,@#$UFLOA ;SET USR SWAP ADDRESS SETTOK: MOV SP,SPSAVE ;SAVE SP IN CASE THERE'S A CSI OPT ERR .CSISP #OTFLSP,#DFEXT,#0,#LINBUF ;DO A SPECIAL MODE CSI BCS CMDERR ;BR IF ERROR IN COMMAND LINE MOV (SP)+,OPTNUM ;GET THE NUMBER OF OPTIONS TSTB @#LINBUF ;Just CR? BNE OPTCHK ;BR if not. .PRINT #VERSION ;Otherwise, display ERROUT version. OPTCHK: DEC OPTNUM ;ALL DONE PROCESSING OPTIONS? BMI CONTIN ;YES CMPB @SP,#ACHARA ;IS THE OPTION AN 'A' BNE 3$ ;NO TSTB FASGVN ;YES, 'A' OR 'S' ALREADY GIVEN? BNE CMDERR ;YES,THAT'S AN ERROR INCB FASGVN ;INDICATE WE'VE REC'D AN 'A' OR 'S' TST (SP)+ ;ADVANCE AND ENSURE NO VALUE WAS GIVEN BMI CMDERR ;THAT'S AN ERROR BR OPTCHK ;ALL DONE, GO GET NEXT OPTION 3$: CMPB @SP,#ACHARS ;IS THE OPTION AN 'S' BNE 4$ ;NO TSTB FASGVN ;YES, 'A' OR 'S' ALREADY GIVEN? BNE CMDERR ;YES, THAT'S AN ERROR INCB FASGVN ;INDICATE WE'VE REC'D AN 'A' OR 'S' INCB FOPTN ;SET OPTION FLAG TO SUMMARY TST (SP)+ ;ADVANCE AND ENSURE NO VALUE WAS GIVEN BMI CMDERR ;THAT'S AN ERROR BR OPTCHK ;ALL DONE, GO GET NEXT OPTION 4$: CMPB @SP,#ACHARF ;IS THE OPTION AN 'F' BNE 5$ ;NO TSTB FFGIVN ;YES, WAS AN 'F' ALREADY GIVEN? BNE CMDERR ;YES, THAT'S AN ERROR INCB FFGIVN ;INDICATE THAT AN 'F' WAS REC'D JSR R5,DATMAK ;CONVERT DATE OPTIONS TO RT FORMAT .WORD RTFRDA ;RESULT IS FROM: DATE BCS CMDERR ;INVALID DATE? INCB FDAT ;INDICATE A FROM/TO WAS GIVEN SUB #2,OPTNUM ;DATE HAS 3 OPTION VALUES, DEDUCT 2 BR OPTCHK ;ALL DONE, GO GET NEXT OPTION 5$: CMPB @SP,#ACHART ;IS THE OPTION A 'T' BNE CMDERR ;NO, OUT OF OPTIONS - ERROR TSTB FTGIVN ;WAS A 'T' ALREADY GIVEN? BNE CMDERR ;YES, THAT'S AN ERROR INCB FTGIVN ;INDICATE THAT A 'T' WAS GIVEN JSR R5,DATMAK ;CONVERT DATE OPTIONS TO RT FORMAT .WORD RTTODA ;RESULT IS TO: DATE BCS CMDERR ;INVALID DATE? INCB FDAT ;INDICATE FROM/TO DATE WAS REQUESTED SUB #2,OPTNUM ;DATE HAS 3 OPTION VALUES, DEDUCT 2 BR OPTCHK ;ALL DONE GO GET NEXT OPTION CMDERR: MOV SPSAVE,SP ;RESTORE SP FROM BEFORE ERROR ;+ ;ERROR ERROR MSGILG,FATAL ;GIVE USER A FATAL ERROR ;- JMP RESET ;BACK TO CSI CONTIN: TST INFLSP ;WAS AN INPUT FILE SPECIFIED? BEQ PUTONE ;NO, ASSUME ERRLOG.DAT CMP INFLSP+2,DFINP ;IS THE INPUT FILE ERRLOG.DAT? BNE LOOK ;NO CMP INFLSP+4,DFINP+2 BNE LOOK ;NO CMP INFLSP+6,DFINP+4 BNE LOOK ;NO BR SNDMSG ;YES, SEND MESSAGE TO EL JOB PUTONE: MOV #DFINDV,R0 ;COPY IN DEFAULT OF ERRLOG.DAT MOV #INFLSP,R1 ;***GVAL MOV @#$SYPTR,R2 CMPB #1,$JOBS(R2) ;Is environment single-background? BEQ 10$ ;BR if SB. MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ BR SNDMSG 10$: MOV #<^REL>,(R1)+ ;SET DEFAULT DEVICE/FILENAME CLR (R1)+ ;FOR SJ CLR (R1)+ CLR (R1)+ ADD #10,R0 SNDMSG: TSTB FRETRY ;ALREADY SENT THE MSG? (A RETRY) BNE LOOK ;YES, DON'T SEND IT AGAIN ;***GVAL MOV @#$SYPTR,R2 ;POINT TO BASE OF RMON BIT #STASK$,$SYSGE(R2) ;ARE WE RUNNING UNDER SYSTEM TASKING BEQ FBMONR ;NO, DO A SEND .LOOKU #AREA,#MSGCHN,#ELJOB ;YES, LOOK FOR THE EL JOB BCC WRTMSG ;ANY PROBLEMS? TSTB @#$ERRBY ;WHAT IS IT? BNE LOOK ;NO EL JOB IS OK BR CHNERB ;IT'S A CHANNEL ERROR??? WRTMSG: .WRITW #AREA,#MSGCHN,#ELTMSG,#1 ;SEND THE MESSAGE ST STYLE BCC SETRET ;ALL SET ;+ ;ERROR ERROR MSGILL,FATAL ;CHANNEL IN USE .EXIT ;BYE ;- ;***GVAL FBMONR: CMPB #1,$JOBS(R2) ;Executing under an SB monitor? BEQ SETRET ;Br if yes: don't do the sdat. .SDAT #AREA,#ELTMSG,#1 ;YES, SEND MESSAGE TO POSSIBLE ; FG USER OF FILE ;ERROR HERE IS OK (NO OTHER JOB) SETRET: INCB FRETRY ;DONT SEND MESSAGE TWICE LOOK: TST OTFLSP ;CHECK FOR AN OUTPUT DEVICE? BEQ TTYDEV ;NONE GIVEN, ASSUME TTY JSR R5,GETHAN ;GO TRY TO LOAD HANDLER? .WORD OTFLSP BCS ERROUB ;BACK TO CSI IF THERE'S A PROBLEM CMPB DSTAA,#4 ;IS OUTPUT DEVICE THE TTY? BEQ TTYDEV ;YES, SKIP .ENTER .ENTER #AREA,#OTCHAN,#OTFLSP,#0 ;CREATE THE FILE BCC LOOKIN ;ALL SET WE'VE GOT A FILE NOW TSTB @#$ERRBY ;WHAT'S THE PROBLEM BEQ CHNERB ;CHANNEL ALREADY IN USE CMPB @#$ERRBY,#3 ;IS THE ERROR A PROTECTED FILE? BNE 2$ ;NO JMP PRTERR ;YES, GO TELL USER 2$: JMP DVFERR ;DEVICE FULL TTYDEV: MOV #DFOUT,R0 ;POINT TO RAD50 DEFAULT OUTPUT FILE MOV #OTFLSP,R1 ;AND TO OUTPUT FILESPEC AREA MOV (R0)+,(R1)+ ;COPY MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ INCB FTTY ;INDICATE TTY IS OUTPUT DEVICE LOOKIN: JSR R5,GETHAN ;GO TRY TO LOAD THE HANDLER .WORD INFLSP BCC BRNCH ;OK ERROUB: JMP PROMPT ;BACK TO CSI IF THERE'S A PROBLEM BRNCH: .LOOKU #AREA,#INCHN,#INFLSP ;LOOK FOR THE INPUT FILE BCC INOK ;ALL SET, GOT THE INPUT FILE TSTB @#$ERRBY ;WHAT'S THE PROBLEM BEQ CHNERR ;NOT A FILE NOT FOUND ERROR MOV R0,-(SP) ;IN HERE IF FILE NOT FOUND MOV R1,-(SP) ;PRINT NAME OF FILE WE COUNDN'T FIND MOV #INFLSP,R0 MOV #INFASC,R1 CALL $FNASC ;CONVERT RAD50 FILE NAME TO ASCII CLRB (R1)+ MOV (SP)+,R1 MOV (SP)+,R0 BR INFERR ;FILE NOT FOUND CHNERB: BR CHNERR ;CHANNEL ALREADY IN USE INOK: .READW #AREA,#INCHN,#HEADER,#256.,#0 ;READ THE HEADER BLOCK BCS READER ;ANY ERRORS? MOV #1,PAGENM ;NOPE...START AT PAGE '1' MOV HOFXED,R0 ;GET OFFSET TO FIXED PART OF HEADER ADD #HEADER,R0 ;ADD IN OFFSET TO FIXED PART MOV OPNXRC(R0),SAVPNR ;SAVE NEXT BLOCK POINTER DEC SAVPNR ;DECREMENT FOR COMPARISONS BIT #CLK50$,OHCNF1(R0) ;CHECK FOR TYPE OF CLOCK WE HAVE BNE 1$ ;IT'S A 50 CYCLE CLOCK, ALL SET INCB F50CLK ;IT'S A 60 CYCLE CLOCK, SET FLAG 1$: BIT #MMGT$,OHCNF2(R0) ;FILE CREATED UNDER XM MONITOR? BEQ ALLSET ;NO INCB FXM ;YES, SET FLAG TO INDICATE THIS ALLSET: ADD #OHDATE,R0 ;R0->DATE AND TIME OF INIT IN HEADER MOV #ADATE,R1 ;R1->AREA TO STORE CONVERTED DATE/TIME JSR PC,DATIME ;CONVERT AND STORE .GTIM #AREA,#TIMARE ;GET THE TIME AND SAVE IT (DO THIS ; FIRST TO GET MIDNIGHT ROLLOVER .DATE ;GET THE DATE MOV R0,DATARE ; AND SAVE IT ALSO MOV #DATARE,R0 ;POINT TO THE DATE AND TIME BLOCK MOV #LDATE,R1 ;R1->WHERE TO SAVE IT (PAGE HEADING) JSR PC,DATIME ;CONVERT AND STORE MOVB ABLANK,@R1 ;STORE A BLANK OVER THE TERMINATOR ; (PAGE # TOO) TST SAVPNR ;IS FILE EMPTY? BEQ DONE ;YES, DONT SEARCH FOR ERROR RECORDS GETNXT: JSR PC,INPUT ;NOPE, GO GET AN ERROR RECORD BCS DONE ;NO MORE, WE'RE DONE MOVB ELD.UN(R5),R0 ;GET ENTRY ID TST R0 ;WHAT TYPE OF ERROR RECORD? BLT PARERR ;IF MINUS, PARITY JSR PC,DEVICE ;DEVICE ERROR, PROCESS IT BR GETNXT ;GO GET ANOTHER RECORD PARERR: CMP R0,#NEGONE ;VALID ID FOR A PARITY ERROR RECORD? BEQ UNKNOW ;NO, KEEP COUNT OF THIS ;fix this magic number!!!! CMP R0,#-5 ;OK SO FAR BUT KEEP CHECKING BGT PAROK ;STILL OK SO PROCESS IT UNKNOW: INC CUERE ;COUNT NUMBER OF UNKNOWN ERROR RECORDS BR GETNXT ;GET THE NEXT RECORD PAROK: TSTB FOPTN ;ARE WE REPORTING EVERTHING? BNE GETNXT ;NOPE, SO GET THE NEXT RECORD JSR PC,PARITY ;REPORT THIS PARITY ERROR BR GETNXT ;GET THE NEXT ERROR RECORD DONE: JSR PC,SUMARY ;OUTPUT THE SUMMARY JSR R5,WRITI5 ;FORCE A WRITE OF THE OUTPUT BUFFER .WORD NEGONE BR RESET ;RESET PARAMETERS FOR ANOTHER PASS ;+ ;ERROR CHNERR: ERROR MSGCHE,FATAL ;CHANNEL ERROR BR RESET ;RESET AND TRY AGAIN DVFERR: ERROR MSGDVF,WARN ;DEVICE FULL BR RESET ;RESET AND TRY AGAIN DVNERR: ERROR MSGDVN,FATAL ;DEVICE NOT FOUND BR RESET ;RESET AND TRY AGAIN INFERR: ERROR MSGINF,FATAL ;FILE NOT FOUND BR RESET ;RESET AND TRY AGAIN READER: ERROR MSGIER,FATAL ;READ ERROR .EXIT ;DONE PRTERR: ERROR MSGPRT,FATAL ;PROTECTED FILE ALREADY EXISTS ;- ; (FALL THROUGH TO RESET CODE) RESET: .RCTRL .PURGE #INCHN ;PURGE CHANNEL FOR INPUT FILE .CLOSE #OTCHAN ;CLOSE CHANNEL FOR OUTPUT FILE .RELEA #OTFLSP ;FREE THE HANDLERS .RELEA #INFLSP CLRB FTTY ;CLEAR FLAGS CLRB FXM CLRB FOPTN CLRB FDAT CLRB FASGVN CLRB FFGIVN CLRB FTGIVN MOV #177777,RTTODA ;035 MOV #177777,TODATE ;035 CLR RTFRDA CLR FRDATE CLR LLEFT ;CLEAR COUNT OF LINES LEFT ON PAGE CLR CURBLK ;RE-INIT POINTERS FOR OUTPUT CODE MOV #OUTBUF,OBFPTR CLR BLKCUR ;RE-INIT POINTERS FOR INPUT CODE CLR SEQCUR CLR PNTCUR MOV #177400,WRPNUM MOV #177401,INPBUF MOV #NEGONE,INPBUF+2 MOV #39.,R0 ;SET UP COUNT TO CLEAR CSI BUFFER MOV #OTFLSP,R1 ;SET POINTER TO BUFFER TO BE CLEARED CLRIT: CLR (R1)+ ;CLEAR IT DEC R0 BNE CLRIT ;AGAIN JMP PROMPT ;BACK TO CSI PROMPT .DSABL LSB SPSAVE: .WORD 0 ;SAVED SP DURING CSI OPTNUM: .WORD 0 ;NUMBER OF OPTIONS RETURNED BY CSI ; *** [BEGIN CRITICAL ORDERING] (FOR DATE OPTIONS) *** RTTODA: .WORD 177777 ;RT FORMAT TO: DATE ;035 TODATE: .WORD 177777 ;MAGNITUDE FORMAT TO: DATE ;035 RTFRDA: .WORD 0 ;RT FORMAT FROM: DATE FRDATE: .WORD 0 ;MAGNITUDE FORMAT FROM: DATE ; *** [END CRITICAL ORDERING] *** SAVPNR: .WORD 0 ;SAVED BLOCK COUNT CUDVST: .WORD 0 ;COUNT OF UNKNOWN DEVICE STAT ENTRIES CUERE: .WORD 0 ;COUNT OF UNKNOWN ERROR RECORD ENTRIES FOPTN: .BYTE 0 ;FLAG DENOTING OPTION SELECTED ; 0 = DEFAULT OF 'ALL' ; 1 = SUMMARY FTTY: .BYTE 0 ;'OUTPUT TO TTY' FLAG F50CLK: .BYTE 0 ;TICKS/SECOND (0=50, 1=60) FRETRY: .BYTE 0 ;'SENT MESSAGE TO ERRLOG' FLAG FXM: .BYTE 0 ;INDICATES INPUT DATA WRITTEN UNDER XM FDAT: .BYTE 0 ;FROM:/TO: WAS GIVEN FASGVN: .BYTE 0 ;'A' OR 'S' WAS GIVEN FFGIVN: .BYTE 0 ;FROM: WAS GIVEN FTGIVN: .BYTE 0 ;TO: WAS GIVEN LINBUF: .BLKB 81. ;LINE BUFFER .EVEN ELTMSG: .WORD 101010 ;MESSAGE TO SEND TO EL TASK .NLIST BIN .ENABL LC VERSION: .NLCSI ;+ ;ERROR ERRW: .NLCSI TYPE=I,PART=PREFIX .ASCII /W-/<200> ERRF: .NLCSI TYPE=I,PART=PREFIX .ASCII /F-/<200> MSGILG: .ASCIZ /Invalid command/ MSGCHE: .ASCIZ /Channel error/ MSGDVF: .ASCIZ /Device full/ MSGDVN: .ASCIZ /Device not found/ MSGINF: .ASCII /File not found / .EVEN INFASC: .BLKW 10 ;HOLDS NAME OF INPUT FILE (ASCII) MSGINS: .ASCIZ /Insufficient memory/ MSGIER: .ASCIZ /Input error/ MSGOER: .ASCIZ /Output error/ MSGILL: .ASCIZ /Internal error/ MSGPRT: .ASCIZ /Protected file already exists/ MSGOFF: .ASCIZ /Output file full/ ;- .EVEN .LIST BIN DFEXT: .WORD 0 ;DEFAULT EXT'S FOR CSI .RAD50 /LST/ .WORD 0,0 DFINDV: .RAD50 /SY/ ;DEFAULT INPUT FILE DEVICE DFINP: .RAD50 /ERRLOGDAT/ ;DEFAULT INPUT FILE NAME DFOUT: .RAD50 /TT0ERRREPTXT/ ;DEFAULT OUTPUT AREA: .BLKW 5 ;EMT AREA OTFLSP: .BLKW <3*5> ;OUTPUT FILE SPEC FOR CSI - RAD50 INFLSP: .BLKW <6*4> ;INPUT FILE SPEC FOR CSI - RAD50 DATARE: .WORD 0 ;STORAGE AREA FOR CURRENT DATE TIMARE: .WORD 0,0 ;AND TIME DSTAA: .BLKW 4 ;DSTATUS AREA FOR GETHAN AND ERROUT ELJOB: .RAD50 /MQ/ ;DESCRIPTOR BLOCK FOR SYSTEM TASKING .ASCII /ERRLOG/ ; SEND TO LOGGING JOB QAREA: .BLKW 10. ;EXTRA QUEUE ELEMENT .SBTTL ERROR MESSAGE OUTPUT ;+ ; FPEMSG/WPEMSG - PRINTS EITHER A FATAL OR WARNING ERROR MESSAGE ; AND SETS THE CORRESPONDING ERROR LEVEL BIT IN USERRB ; ; R5 -> MSG TO BE PRINTED ; ; JSR R5,FPEMSG ;FOR FATAL ; JSR R5,WPEMSG ;FOR WARNING ; ; R0 CHANGED ON OUTPUT ; ALL OTHER REGISTERS ARE UNCHANGED ;- FPEMSG: .PRINT #ERRF ;PRINT ?ERROUT-F- BISB #,@#$USRRB ;SET THE FATAL ERROR BIT BR REST ;GO PRINT THE REMAINDER WPEMSG: .PRINT #ERRW ;PRINT ?ERROUT-W- BISB #WARN$,@#$USRRB ;SET THE WARNING ERROR BIT REST: MOV (R5)+,R0 ;GET THE ADDR OF MESSAGE .PRINT ;OUT RTS R5 .SBTTL HEADER BLOCK STORAGE AREA ; THIS FILE HEADER HAS THE SAME FORMAT AS THE HEADER DESCRIBED IN THE EL TASK HEADER: HOFXED: .WORD 0 ;OFFSET TO FIXED PART OF HEADER, ; FILLED WHEN READ HSTAT: .BLKW 255. ;ALLOCATE THE REST OF THE HEADER .SBTTL GETHAN - FETCH A HANDLER ;+ ; GETHAN FETCHES A HANDLER ; ; R5 -> RAD50 FOR DEVICE NAME ; ; JSR R5,GETHAN ; ; CARRY CLEAR WITH REQUESTED HANDLER LOADED, OR ; CARRY SET ON ANY ERROR ; R0,R1,R2,R4 CHANGED ;- GETHAN: MOV (R5)+,R2 ;GET ARGUMENT .DSTAT #DSTAA,R2 ;FIND OUT ABOUT THIS DEVICE BCS DNFERR ;DEVICE NOT FOUND ERROR TST DSTAA+4 ;IS IT IN MEMORY? BNE RTN ;YES, NO NEED TO FETCH IT MOV DSTAA+2,R0 ;NO, HOW MUCH ROOM DO WE NEED? MOV @#$USRTO,R4 ;GET THE ADDRESS ADD R4,R0 ;GET NEW ADDRESS FOR HILIMIT WE WANT ;***GVAL MOV @#$SYPTR,R1 ;POINT TO RMON MOV $USRLC(R1),R1 ;FIND OUT WHERE USR GOES NOW CMP R0,R1 ;WILL A SETTOP CAUSE THE USR TO SWAP? BLO 1$ ;NO... MOV #SWPADR,@#$UFLOA ;YES, CHANGE THE USR SWAP ADDRESS 1$: MOV R0,-(SP) ;SAVE THE NEW HI LIMIT WE WANT .SETTO ;NOW TRY TO GET THE MEMORY CMP R0,(SP)+ ;SEE IF WE GOT IT BLO INSERR ;INSUFFICIENT MEMORY ERROR .FETCH R4,R2 ;ALL SET LOAD THE HANDLER BCC RTN ;ANY PROBLEMS? ;+ ;ERROR DNFERR: ERROR MSGDVN,FATAL ;DEVICE NOT FOUND BR ERRRTN ;INDICATE THE PROBLEM TO ERROUT INSERR: ERROR MSGINS,FATAL ;INSUFFICIENT MEMORY ;- ERRRTN: SEC ;INDICATE A PROBLEM RTN: RTS R5 .SBTTL DATMAK - CREATES RT FORMAT DATE FROM CSI DATE OPTION ;+ ; DATMAK CREATES AN RT FORMAT DATE WORD AND THE EQUIVALENT MAGNITUDE TYPE DATE ; WORD FROM THE CSI OPTIONS VALUES GIVEN ON THE STACK ; ; R5 -> A 2 WORD BLOCK FOR STORING THE RESULT ; ADDRESS TO STORE RT FORMAT DATE WORD ; ADDRESS TO STORE MAGNITUDE TYPE DATE WORD ; SP -> FIRST OF 3 OPTIONS ASSOCIATED WITH DATE ; ; JSR R5,DATMAK ; ; SP -> NEXT OPTION TO BE PROCESSED ; C-BIT CLEAR FOR VALID DATE ; SET FOR INVALID DATE ;- DATMAK: MOV (SP)+,RTNSAV ;SAVE R5, WE NEED THE STACK MOV #3,R1 ;WE NEED 3 VALUES FOR DATE MOVB @SP,R2 ;SAVE THE OPTION CHARACTER FOR ; COMPARISON WITH OTHER 2 MOV #DATBUF,R3 ;POINT TO TEMPORARY DATE STORAGE AREA 1$: CMPB @SP,R2 ;MAKE SURE ALL 3 OPTIONS ARE THE SAME BNE DATMER ;IF NOT, INVALID OPTION TST (SP)+ ;MAKE SURE A VALUE WAS SPECIFIED BPL DATMER ;IF NOT, IT'S AN INVALID OPTION MOV (SP)+,(R3)+ ;GET VALUE ASSOCIATED WITH THIS OPTION DEC R1 ;KEEP COUNT BNE 1$ ;ARE WE DONE? TST -(R3) ;POINT TO DAY AND TEST FOR VALID RANGE BLE DATMER ;INVALID DAY VALUE CMP @R3,#31. ;CHECK SOME MORE BGT DATMER ;INVALID DAY VALUE SWAB @R3 ;POSITION DAY VALUE ASR @R3 ;INTO CORRECT 5-BIT FIELD ASR @R3 ;(BITS 5-9) ASR @R3 MOV -(R3),R4 ;GET RAD50 MONTH VALUE MOV #MTHR50,R1 ;POINT TO THE MONTH LIST MOV #12.,R2 ;12. POSSIBLE VALUES MTHCHK: CMP R4,(R1)+ ;CHECK MONTH VALUE GIVEN AGAINST LIST BEQ MOMTCH ;WE GOT A MATCH DEC R2 ;NEXT BNE MTHCHK ;KEEP LOOKING BR DATMER ;OUT OF POSSIBILITIES, INVALID OPTION MOMTCH: SWAB R2 ;POSITION MONTH INTO ASL R2 ;CORRECT 4-BIT FIELD ;034 ASL R2 ;(BITS 10-13) ;034 MOV R2,@R3 ;STORE IT BACK INTO TEMP. DATE AREA CMP -(R3),#1972. ;DID WE GET A 4-DIGIT DATE? ;034 BLT 2$ ;SKIP IF JUST 2-DIGIT ;034 SUB #1900.,@R3 ;BRING IN TO RANGE 72.-199. ;034 2$: SUB #72.,@R3 ;CREATE YEAR VALUE, 0.-127. ;034 BLE DATMER ;IS IT VALID? ;034 CMP @R3,#127. ;PAST 2099? ;034 BGT DATMER ;INVALID IF SO ;034 MOV @R3,R2 ;GET AGE BITS FROM YEAR ;034 ASL R2 ;BY MOVING BITS 5-6 ;034 SWAB R2 ;INTO 14-15 ;034 BIC #^c140000,R2 ;R2 NOW HAS AGE BITS ;034 BIC #^c000037,@R3 ;@R3 NOW LOW 5 BITS OF YEAR ;034 4$: MOV (R3)+,R0 ;STORE YEAR VALUE ;034 BIS (R3)+,R0 ;STORE MONTH VALUE BIS (R3)+,R0 ;STORE DAY VALUE BIS R2,R0 ;STORE AGE ;034 MOV (R5)+,R4 ;UPDATE R5 FOR RETURN AND SAVE DATE ; ADDRESS MOV R0,(R4)+ ;STORE THE RESULTANT RT FORMAT DATE JSR PC,DATSFT ;CONVERT TO A MAGNITUDE TYPE VALUE BCS DATME2 ;INVALID DATE? MOV R0,@R4 ;STORE THE CONVERTED VALUE MOV RTNSAV,-(SP) ;RESTORE R5 FOR RETURN RTS R5 DATMER: TST (R5)+ ;UPDATE FOR RETURN DATME2: MOV RTNSAV,-(SP) ;RESTORE R5 FOR RETURN SEC ;INDICATE AN INVALID OPTION RTS R5 MTHR50: .RAD50 /DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJAN/ RTNSAV: .WORD 0 DATBUF: .BLKW 3 ;STORAGE FOR 3 DATE VALUES: ; YEAR:MONTH:DAY .SBTTL ASCII TEXT STORAGE AREA .NLIST BIN ;USR SWAPS HERE IF NECESSARY FOR FETCHES SWPADR: AFRMFD: .BYTE 14 .BYTE 0 ABLANK: .BYTE 40 LNULL: .BYTE 0 LHEADR: .ASCII /ERROR LOG REPORT RT-11 / .NLCSI TYPE=I,PART=RLSVER PATLVL == .-1 .ASCII / COMPILED/ ;034 LDATE: .ASCII / / ;034 LTIME: .ASCII / / LPAGE: .ASCII / REPORT / LPGNUM: .ASCIZ / / LSTARS: .ASCII /**************************************************/ .ASCIZ /**********************/ LDEVST: .ASCIZ /DEVICE STATISTICS/ ALOGGS: .ASCII /LOGGED SINCE/ ADATE: .ASCII / / ;034 ATIME: .ASCIZ / / LUNITI: .ASCIZ /Unit Identification/ AUNITP: .ASCIZ /RT-11 Unit Number/ ATYPE: .ASCIZ /Device Type/ LDSFTU: .ASCIZ /Device Statistics For This Unit:/ ANOEL: .ASCIZ /Number of Errors Logged/ ANOER: .ASCIZ /Number of Errors Received/ ANORS: .ASCIZ /Number of Read Successes/ ANOWS: .ASCIZ /Number of Write Successes/ ANOMS: .ASCIZ /Number of Motion Successes/ ANOOS: .ASCIZ /Number of Other Successes/ ADISK: .ASCIZ /DISK/ MSCPER: .ASCIZ /MSCP/ TMSCPR: .ASCIZ /TMSCP/ ATAPE: .ASCIZ /TAPE/ ADEVER: .ASCIZ / DEVICE ERROR/ ALOGGE: .ASCIZ /LOGGED/ ALASTD: .ASCIZ / / ;034 LSOFTS: .ASCIZ /Software Status Information/ AMTRY: .ASCIZ /Maximum Retries / ARTRY: .ASCIZ /Remaining Retries / AOCCUR: .ASCIZ /Occurrences Of This Error With Identical Registers / LDEVIN: .ASCIZ /Device Information/ LREGIS: .ASCIZ /Registers:/ AACTIV: .ASCIZ /Active Function/ AREAD: .ASCIZ / READ/ AWRITE: .ASCIZ / WRITE/ NONTFR: .ASCIZ /NON-STANDARD TRANSFER/ ABLOCK: .ASCIZ /Block/ APHYBU: .ASCIZ /Physical Buffer Address/ ATRANF: .ASCIZ /Transfer Size In Bytes/ LMEMPR: .ASCIZ /Memory Parity Error/ LSYSRG: .ASCIZ /System Registers:/ APC: .ASCIZ /PC / APSW: .ASCIZ /PSW / APCCUR: .ASCIZ /Occurances Of This Error With Identical PC / AMEMRY: .ASCIZ /Memory / ACONTE: .ASCIZ /Address Contents/ AMSER: .ASCIZ /Memory System Error Register:/ ACCR: .ASCIZ /Cache Control Register:/ AHMR: .ASCIZ 'Hit/Miss Register:' AERTYP: .ASCIZ /Error Type Is / ACACHE: .ASCIZ /Cache / AAND: .ASCIZ /And / LREPOR: .ASCIZ /Report File Environment:/ AINPF: .ASCIZ /Input File/ AOUTF: .ASCIZ /Output File/ ASWITC: .ASCIZ /Options / ADTINI: .ASCIZ /Date Initialized/ ADTLST: .ASCIZ /Date of Last Entry/ ATEL: .ASCIZ /Total Errors Logged/ AMEBF: .ASCIZ /Missed Reports (Buffer Full)/ AMEFF: .ASCIZ /Missed Reports (File Full)/ AMETNR: .ASCIZ /Missed Reports (Task Not Ready)/ AUDSE: .ASCIZ /Unknown Device Statistics Entries/ AUERE: .ASCIZ /Unknown Error Record Entries/ LMEMST: .ASCIZ /MEMORY STATISTICS/ LSTATI: .ASCIZ /Total Memory Errors:/ ANMPE: .ASCIZ /Number Of Memory Parity Errors/ ANCPE: .ASCIZ /Number Of Cache Errors/ .EVEN .LIST BIN .SBTTL DEVICE - BUILDS A DEVICE ERROR RECORD ;+ ; DEVICE OUTPUTS TO THE REQUESTED DEVICE, A SINGLE DEVICE ERROR RECORD ; ALONG WITH THE HEADINGS FOR PAGE (IF REQUIRED) AND FOR THE RECORD ITSELF ; ; R5 -> RECORD TO BE PROCESSED ; ; JSR PC,DEVICE ; ; ALL REGISTERS ARE CHANGED ON OUTPUT ;- DEVICE: CLR R0 ;GET DEVICE ID FROM RECORD, BISB ELD.ID(R5),R0 ; AVOIDING SIGN-EXTEND JSR PC,LOCATE ;GO FIND THE ASCII FOR THIS DEVICE BCC 2$ ;DID WE FIND IT? INC CUERE ;NO, COUNT THIS 1$: JMP 6$ ;AND RETURN 2$: MOV #ALASTD-1,R1 ;POINT TO AREA TO STORE DATE STRING MOV R5,R0 ;GET THE ADDRESS OF THE DATE AND TIME ADD #ELD.DT,R0 ; FROM THE RECORD POINTER JSR PC,DATIME ;CONVERT TO ASCII FOR OUTPUT LATER TSTB FOPTN ;JUST SCANNING OR REALLY DOING OUTPUT? BNE 1$ ;RETURN IF JUST SUMMARY MOV ELD.DT(R5),R0 ;GET THE DATE THIS RECORD WAS WRITTEN JSR PC,DATCOM ;IN REQUESTED DATE RANGE? BCS 1$ ;NOPE, DON'T REPORT IT MOVB ELD.DR(R5),R0 ;YES, GET COUNT OF REGISTERS TSTB FXM ;RUNNING UNDER XM? BEQ 12$ ;NOPE, GOT COUNT FROM RIGHT PLACE MOVB ELD.DR+2(R5),R0 ;YES, COUNT IS ELSEWHERE IN XM 12$: BIC #177400,R0 ;DISCARD RESULTS OF SIGN-EXTEND ADD #SDEFXD,R0 ;ADD SIZE OF FIXED PART FOR COUNT OF ; LINES JSR PC,WHEADR ;GO WRITE RECORD HEADING (PAGE HEADING ; IF TOO LONG FOR CURRENT PAGE) MOVB (R4)+,R0 ;R0->LENGTH OF STRING TO BE COPIED CMPB ELD.ID(R5),#MSCPID BNE 13$ MOV #MSCPER,R0 ;point to DISK or MSCP or TMSCP BR 15$ 13$: CMPB ELD.ID(R5),#TMSCPD BNE 14$ MOV #TMSCPR,R0 BR 15$ 14$: MOV #ADISK,R0 15$: MOV #LINBUF,R1 ;POINT TO OUTPUT STRING JSR R5,STCOPY ;DO THE COPY JSR R5,STCOP5 ;COPY IT: 'DEVICE ERROR' .WORD ADEVER OUTPUT OUTPUT ALOGGE ;OUTPUT: 'LOGGED' DATE AND TIME OUTPUT LSTARS ;OUT:'*****...*****' OUTPUT LNULL ;OUT:' ' OUTPUT LUNITI ;OUT:'UNIT IDENTIFICATION' SETUPL AUNITP,TAB ;OUT:'PHYSICAL UNIT NUMBER' JSR R5,BLKPD5 ;PAD LINE WITH BLANKS TO .WORD 66. MOVB ELD.UN(R5),R0 ;SET TO CONVERT UNIT NUMBER TO ASCII JSR PC,OCTOCT ;CONVERT IT OUTPUT ;OUT WITH IT SETUPL ATYPE,TAB ;SET UP LINE WITH: 'TYPE' MOV #72.,R0 ;START WITH 72. CHARACTERS TST -(SP) ;SET UP SP MOVB (R4)+,(SP) ;SAVE THE SIZE OF THE TYPE STRING BIC #177400,(SP) ;CLEAR THE HI BYTE SUB (SP),R0 ;FIND THE LENGTH JSR R5,BLKPDR ;BLANK FILL MOV (SP),R2 ;GET SIZE AGAIN MOV R4,R0 ;POINT TO TYPE JSR PC,SSCOPY ;COPY IT OUTPUT OUTPUT LNULL ;OUT: '' OUTPUT LSOFTS ;OUT:'SOFTWARE STATUS INFO' ADD (SP)+,R4 ;UPDATE THE ASCII BLOCK POINTER SETUPL AMTRY,TAB ;OUT:'MAXIMUM RETRIES' MOV ELD.DR(R5),R0 ;GET THE MAX RETRY COUNT TSTB FXM ;RUNNING UNDER XM? BEQ 7$ ;NOPE... MOV ELD.DR+2(R5),R0 ;YES, COUNT IS ELSEWHERE IN XM 7$: CLRB R0 ;DISCARD THE LOW BYTE SWAB R0 ;TO MAKE ROOM FOR WHAT WE WANT JSR PC,OCTDEC ;CONVERT TO DECIMAL ASCII OUTPUT SETUPL ARTRY,TAB ;OUT:'REMAINING RETRIES' CLR R0 BISB ELD.RT(R5),R0 ;GET THE COUNT JSR PC,OCTDEC ;CONVERT TO DECIMAL ASCII OUTPUT ;AND PRINT IT SETUPL AOCCUR,TAB ;OUT:'OCCURRENCES OF THIS ERROR...' CLR R0 BISB ELD.OC(R5),R0 ;GET THE COUNT JSR PC,OCTDEC ;CONVERT COUNT TO DECIMAL ASCII OUTPUT ; AND PRINT IT OUTPUT LNULL ;OUT:' ' OUTPUT LDEVIN ;OUT:'DEVICE INFORMATION' CMPB ELD.ID(R5),#MSCPID ;DISPLAY MSCP PACKET ? BNE 71$ CLRB DVTYPE BR 72$ 71$: CMPB ELD.ID(R5),#TMSCPD BNE 75$ ;branch if a plain old rt11 record INCB DVTYPE 72$: TSTB ELD.RT(R5) ;if it is not a (T)MSCP datagram, then BMI 75$ ;do pre v5.5 display. negative retry JSR PC,32$ ;count means not a datagram JSR PC,DOMSCP JMP 6$ 75$: SETUPL LREGIS,TAB OUTPUT ;OUT:'REGISTERS' TST -(SP) ;SET UP SP MOVB ELD.DR(R5),(SP) ;GET THE NUMBER OF REGISTERS TSTB FXM ;OFFSET DIFFERENT FOR XM BEQ 8$ ;OK AS IS MOVB ELD.DR+2(R5),(SP) ;GET THE RIGHT WORD FOR XM 8$: BIC #177400,(SP) ;CLEAR HI BYTE JSR PC,LINPAD ;GO STORE IN SOME BLANKS MOV R4,R0 ;INPUT IS FROM DEVICE INFO BLOCK MOV #2,R2 ;COUNT OF CHARACTER TO TRANSFER JSR PC,SSCOPY ; (FIRST TO CHARACTERS OF DEVICE NAME) MOV R1,-(SP) ;SAVE POINTER TO NULL BYTE FOLLOWING ; 1ST 2 CHARACTERS ADD #3,R4 ;R4-># OF CHARACTERS IN EACH NAME (-2) TST -(SP) ;SET UP SP MOVB (R4)+,(SP) ;SAVE COUNT OF CHARACTERS TO COPY ; PER PASS BIC #177400,(SP) ;CLEAR THE HI BYTE MOV R5,-(SP) ;SAVE R5 (NEEDED TO STEP THRU REGS.) ADD #ELD.RG,R5 ;POINT TO THE REGISTER CONTENTS TSTB FXM ;RUNNING UNDER XM? BEQ 3$ ;NOPE, GOT CORRECT VALUE ADD #2,R5 ;YES, VALUE IS ELSEWHERE IN XM 3$: MOV 4(SP),R1 ;RESTORE POINTER TO FOLLOW FIRST ; 2 CHARACTERS MOV 2(SP),R2 ;RESTORE SIZE OF REMAINDER OF ; DEVICE REG NAME MOV R4,R0 ;POINT TO START OF NAME ADD R2,R4 ;UPDATE R4 FOR NEXT TIME JSR PC,SSCOPY ;COPY REGISTER NAME JSR R5,BLKPD5 ;PAD WITH BLANKS TO .WORD 25. MOV (R5)+,R0 ;GET CONTENTS OF THE NEXT DEVICE REG JSR PC,OCTOCT ;CONVERT TO OCTAL ASCII OUTPUT DEC 6(SP) ;DONE ALL REGISTERS YET? BNE 3$ ;NO, DO ANOTHER MOV (SP)+,R5 ;RESTORE ADD #6,SP ;YES, CLEAN UP THE STACK OUTPUT LNULL ;OUTPUT: ' ' 32$: SETUPL AACTIV,TAB ;SET UP LINE WITH: 'ACTIVE FUNCTION' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 31. ;GEORGE MOV ELD.WC(R5),-(SP) ;GET WORD COUNT -- READ OR WRITE? BMI 4$ ;IT'S A WRITE BNE 36$ MOV #NONTFR,R0 ;transfer size = 0 means it is not a BR 5$ ;regular read or write 36$: MOV #AREAD,R0 ;POINT TO THE 'READ' STRING BR 5$ 4$: MOV #AWRITE,R0 ;POINT TO THE 'WRITE' STRING NEG (SP) ;CONVERT TO MAGNITUDE OF TRANSFER SIZE 5$: JSR R5,STCOPY ;COPY IT IN OUTPUT SETUPL ABLOCK,TAB ;COPY IN 'BLOCK' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 46. MOV ELD.BK(R5),R0 ;GET THE BLOCK NUMBER JSR PC,OCTDCF ;CONVERT TO ASCII OCTAL VALUE OUTPUT SETUPL APHYBU,TAB ;COPY 'PHYSICAL BUFFER ADDRESS' STRING JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO .WORD 46. MOV ELD.BF(R5),R0 ;R0 = PHYSICAL BUFFER ADDRESS CLR R2 ;CLEAR PAR1 INPUT VALUE TSTB FXM ;XM MONITOR USED? BEQ 10$ ;NO MOV ELD.BF+4(R5),R2 ;YES, GET PAR1 VALUE JSR PC,CONADR ;CONVERT TO 22 BIT PHYSICAL ADDRESS 10$: MOV R1,-(SP) ;SAVE POINTER TO HI ORDER CHARACTER JSR PC,OCTOCT ;CONVERT TO ASCII OCTAL MOV (SP)+,R0 ;GET THE ADDRESS OF HI ORDER CHARACTER MOVB @R0,R1 ;GET THE ASCII ASL R2 ;DOUBLE THE HI ORDER PART ADD R2,R1 ;FIX ASCII OF THE HI ORDER CHARACTER MOVB R1,@R0 ;PUT IT BACK INTO THE OUTPUT STRING DEC R0 ;go to previous (higher digit) ASR R2 ;restore original high 6 bits BIC #^c077,R2 ;clear out junk ASR R2 ;already did these two bits ASR R2 MOV R2,-(SP) ;now have high 4 bits on stack BIC #^c07,R2 ;get next 3 bits ADD #60,R2 ;convert to Octal MOVB R2,@R0 ;put it into string DEC R0 ;go to highest digit MOV (SP)+,R2 ;restore R2 BIC #^c10,R2 ;Obtain highest digit (= bit 22) ASR R2 ASR R2 ASR R2 ADD #60,R2 ;convert to Octal MOVB R2,@R0 ;put it into string OUTPUT SETUPL ATRANF,TAB ;COPY 'TRANSFER SIZE IN BYTES' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 46. MOV (SP)+,R0 ;GET TRANSFER SIZE ASL R0 ;MAKE IT BYTES JSR PC,OCTDCF ;CONVERT TO DECIMAL ASCII OUTPUT OUTPUT LNULL 6$: RTS PC .SBTTL CONADR - CONVERTS PAR1/DISP TO 22 BIT ADDRESS ;+ ; CONADR CONVERTS KERNEL PAR1/DISPLACEMENT TO AN 22 BIT PHYSICAL ADDRESS ; TAKEN FROM THE MONITOR ROUTINE $CNPHY, WITH THE FOLLOWING CHANGES ; INPUTS: ; R0 = DISPLACEMENT ; R2 = PAR1 BIAS ; OUTPUTS: ; R0 = LO ORDER 16 BITS ; R2 = HI ORDER BITS IN BITS 0 AND 1 ;- CONADR: ASL R0 ;REMOVE PAR1 BIAS FROM DISPLACEMENT ASL R0 ASL R0 ASR R0 ;CLEAR C AND ADJUST LO ORDER 6 BITS ROR R2 ;MOVE FIRST 2 OF 10 BITS FROM R2 RORB R0 ; INTO R0 ASR R2 RORB R0 SWAB R0 ;POSITION RO TO MOVE IN LO 8 BITS BISB R2,R0 ; FROM R2 SWAB R0 ;R2 NOW HAS LO 16 BITS OF ADDRESS CLRB R2 ;CLEAR LO BITS SWAB R2 RTS PC .SBTTL PARITY - OUTPUTS PARITY ERROR RECORD ;+ ; PARITY FORMATS AND OUTPUTS CACHE OR MEMORY PARITY ERROR RECORD ; ; R5 -> ERROR RECORD IN INPUT BUFFER ; ; JSR PC,PARITY ; ; ALL REGISTERS ARE CHANGED ON OUTPUT ;- PARITY: MOV ELD.DT(R5),R0 ;GET THE DATE THIS RECORD WAS WRITTEN JSR PC,DATCOM ;CHECK TO SEE IF IT'S IN RANGE BCC 6$ ;YES, REPORT IT RTS PC ;NO, SKIP THIS ONE 6$: TST -(SP) ;SET UP SP MOVB ELD.SZ(R5),(SP) ;GET SIZE OF THIS RECORD BIC #177400,(SP) ;CLEAR THE HI BYTE MOV #9.,R0 ;# OF LINES FOR WHEADR ROUTINE ADD (SP),R0 ;IT'S THE RECORD SIZE PLUS 3 JSR PC,WHEADR ;DO A RECORD HEADER (PAGE HEADER IF ; TOO LONG FOR THIS PAGE OUTPUT LMEMPR ;OUT: 'MEMORY PARITY ERROR' MOV R5,R0 ;GET ADDRESS OF DATE AND TIME ADD #ELD.DT,R0 ;IN THIS RECORD MOV #ALASTD-1,R1 ;POINT TO BYTE IN LINE TO STORE DATE JSR PC,DATIME ;CONVERT TO ASCII OUTPUT ALOGGE ;AND OUTPUT 'LOGGED DATE/TIME' OUTPUT LSTARS ;OUT: '***...***' OUTPUT LNULL OUTPUT LSOFTS ;OUT: 'SOFTWARE STATUS INFORMATION' SETUPL LSYSRG,TAB ;OUT: 'SYSTEM REGISTERS BEFORE ERROR' OUTPUT SETUPL APC,TAB ;OUT: 'PC' MOV ELM.PC(R5),R0 ;GET PC AT TIME OF ERROR JSR PC,OCTOCT ; AND CONVERT TO OCTAL OUTPUT SETUPL APSW,TAB ;OUT: 'PSW' MOV ELM.PS(R5),R0 ;GET PSW AT TIME OF ERROR JSR PC,OCTOCT ; AND CONVERT TO OCTAL OUTPUT SETUPL APCCUR,TAB ;OUT: 'OCCURRENCES OF THIS ERROR...' MOV ELM.OC(R5),R0 ;GET THE OCCURRENCE COUNT JSR PC,OCTDEC ;CONVERT OUTPUT OUTPUT LNULL OUTPUT LDEVIN ;OUT: 'DEVICE INFORMATION' SETUPL AMEMRY,TAB ;COPY 'MEMORY' JSR R5,STCOP5 ;COPY 'REGISTERS' .WORD LREGIS OUTPUT SETUPL ACONTE,TAB ;OUT: 'ADDRESS CONTENTS' OUTPUT TST -(SP) ;SET UP SP MOVB ELM.NR(R5),(SP) ;GET NUMBER OF MEMORY REGISTERS BIC #177400,(SP) ;CLEAR HI BYTE MOV (SP),-(SP) ;STORE IT AGAIN JSR PC,LINPAD ;SET UP LINE MOV R1,-(SP) ;SAVE THE CURRENT POINTER MOV R5,R4 ;POINT TO THE START OF THIS RECORD ADD #ELM.RG,R4 ;R4->START OF PARITY REGISTER INFO 1$: MOV (SP),R1 ;GET POINTER WITHIN THE LINE BUFFER MOV 2(R4),R0 ;GET THE NEXT DEVICE REGISTER JSR PC,OCTOCT ;CONVERT TO ASCII OCTAL JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO .WORD 21. MOV (R4)+,R0 ;GET THE CORRESPONDING CONTENTS JSR PC,OCTOCT ;CONVERT TO ASCII OCTAL OUTPUT TST (R4)+ ;POINT TO NEXT REGISTER-ADDRESS PAIR DEC 2(SP) ;ANOTHER REGISTER DONE BGT 1$ ;ANY MORE LEFT CMP (SP)+,(SP)+ ;CLEAN UP STACK OUTPUT LNULL ASL (SP) ;DOUBLE IT FOR REGISTER-ADDRESS PAIRS SUB (SP),2(SP) ;DETERMINE IF CACHE REGISTER TST (SP)+ ;CLEAN STACK CMP (SP)+,#CSZFXP ;NEED TO REPORT CACHE SYSTEM? BEQ 2$ ;NOPE, RECORD IS NOT LARGE ENOUGH SETUPL AMSER,TAB ;COPY 'MEMORY SYSTEM ERROR REGISTER' JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO .WORD 41. MOV (R4)+,R0 ;GET THE VALUE TO PRINT JSR PC,OCTOCT ;CONVERT TO ASCII OCTAL OUTPUT SETUPL ACCR,TAB ;SET: 'CACHE CONTROL REGISTER' JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO .WORD 41. MOV (R4)+,R0 ;GET THE VALUE JSR PC,OCTOCT ;CONVERT TO ASCII OCTAL OUTPUT SETUPL AHMR,TAB ;COPY 'HIT/MISS REGISTER' JSR R5,BLKPD5 ;FILL UP LINE WITH BLANKS TO .WORD 41. MOV (R4)+,R0 ;GET REGISTER CONTENTS JSR PC,OCTOCT ;CONVERT TO ASCII OCTAL OUTPUT 2$: OUTPUT LNULL SETUPL AERTYP,TAB ;SET UP LINE FOR ERROR TYPE MOVB ELD.UN(R5),R0 ;GET THE TYPE OF ERROR CMP R0,#-2 ;IS IT MEMORY PARITY? BNE 3$ ;NO JSR R5,STCOP5 ;YES, COPY IN 'MEMORY' .WORD AMEMRY BR 5$ ;GO OUTPUT IT 3$: CMP R0,#-3 ;IS IT CACHE PARITY? BNE 4$ ;NO JSR R5,STCOP5 ;YES, COPY IN 'CACHE' .WORD ACACHE BR 5$ ;GO OUTPUT IT 4$: JSR R5,STCOP5 ;MUST BE BOTH .WORD AMEMRY JSR R5,STCOP5 ;'MEMORY' .WORD AAND JSR R5,STCOP5 ;'CACHE' .WORD ACACHE 5$: OUTPUT OUTPUT LNULL OUTPUT LNULL RTS PC .SBTTL SUMARY - BUILDS ASCII SUMMARY REPORT ;+ ; SUMARY FORMATS THE INFORMATION TO BE OUTPUT AS PART OF THE SUMMARY ; ; JSR PC,SUMARY ; ; ALL REGISTERS ARE CHANGED ON OUTPUT ;- SUMARY: MOV #NEGONE,-(SP) ;INDICATE WE'VE JUST ENTERED THIS CODE MOV #HSTAT,R5 ;POINT TO STATISTICS PART OF HEADER CMP @R5,@SP ;ANY DEVICE STATISTICS AT ALL? BEQ 4$ ;NO, GO DO SUMMARY MOV #SZDVSH,R0 ;R0=SIZE OF DEVICE STATISTICS ENTRY OUTPUT AFRMFD ;output a form feed OUTPUT LSTARS OUTPUT LDEVST ;OUTPUT: 'DEVICE STATISTICS' OUTPUT ALOGGS ;OUTPUT: 'LOGGED SINCE' OUTPUT LSTARS ;OUTPUT: '***...***' OUTPUT LNULL ;OUTPUT: ' ' 1$: CLR R0 ;SET TO GET DEVICE ID BISB 1(R5),R0 ; GET IT, AVOIDING SIGN-EXTEND JSR PC,LOCATE ;GO LOOK FOR THE INFORMATION BLOCK BCC 2$ ;FOUND IT, GO FORMAT THE OUTPUT INC CUDVST ;NOT THERE, KEEP A RECORD OF THIS BR 3$ ;PROCESS THE NEXT DEVICE STATISTIC 2$: INC @SP ;FIRST TIME AROUND? BNE 7$ ;NOPE... JSR PC,DVSTA1 ;YES, CALL AT 1ST TIME ENTRY POINT ; (SKIPS LINE1) BR 3$ 7$: JSR PC,DVSTAT ;NOT FIRST TIME, ; FORMAT THE DEVICE STAT NORMALLY 3$: ADD #SZHDVS,R5 ;POINT TO THE NEXT STAT IN THE HEADER CMP @R5,#NEGONE ;LOGICAL END OF DEVICE STAT? BNE 1$ ;NO, AGAIN 4$: MOV #HEADER,R5 ;POINT TO THE HEADER ADD HOFXED,R5 ;ADD IN THE OFFSET TO THE FIXED PART JSR PC,MESTAT ;DO PARITY STATISTICS REPORT SETUPL LNULL OUTPUT SETUPL LNULL OUTPUT ;CLR LLEFT ;JSR PC,WHEADR OUTPUT AFRMFD OUTPUT LSTARS OUTPUT LREPOR ;OUT: 'REPORT FILE ENVIRONMENT OUTPUT LSTARS ;OUTPUT: '***...***' OUTPUT LNULL SETUPL AINPF,TAB ;SET UP LINE: 'INPUT FILE' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 35. MOV #INFLSP,R0 ;POINT TO INPUT FILE NAME (RAD50) JSR PC,FILEAS ;CONVERT TO ASCII OUTPUT SETUPL AOUTF,TAB ;SET UP LINE: 'OUTPUT FILE' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 35. MOV #OTFLSP,R0 ;POINT TO OUTPUT FILE NAME (RAD50) JSR PC,FILEAS ;CONVERT TO ASCII OUTPUT SETUPL ASWITC,TAB ;SET UP LINE: 'OPTIONS' JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO .WORD 35. ;035 MOVB #ASLSH,(R1)+ ;STORE IN A SLASH TSTB FOPTN ;CHECK THE OPTION BEQ 5$ ;ALL WAS SPECIFIED MOVB #ACHARS,(R1)+ ;STORE IN AN 'S' BR 6$ ;GO OUTPUT IT 5$: MOVB #ACHARA,(R1)+ ;STORE IN AN 'A' 6$: CLRB @R1 ;TERMINATE IT WITH A NULL OUTPUT TST RTFRDA ;'/F:' specified? ;035 BEQ 10$ ;035 SETUPL ASWITC,TAB ;SET UP LINE: 'OPTIONS' ;035 JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO ;035 .WORD 35. ;035 MOVB #ASLSH,(R1)+ ;Store '/F:' ;035 MOVB #'F,(R1)+ ;035 MOVB #':,(R1)+ ;035 MOV RTFRDA,R0 ;Get the date to output ;035 JSR PC,DATCON ;CONVERT TO ASCII ;035 OUTPUT ;035 10$: CMP RTTODA,#177777 ;'/T:' specified? ;035 BEQ 20$ ;035 SETUPL ASWITC,TAB ;SET UP LINE: 'OPTIONS' ;035 JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO ;035 .WORD 35. ;035 MOVB #ASLSH,(R1)+ ;Store '/T:' ;035 MOVB #'T,(R1)+ ;035 MOVB #':,(R1)+ ;035 MOV RTTODA,R0 ;Get the date to output ;035 JSR PC,DATCON ;CONVERT TO ASCII ;035 OUTPUT ;035 20$: SETUPL ADTINI,TAB ;SET UP LINE WITH: 'DATE INITIALIZED' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 40. ;035 MOV OHDATE(R5),R0 ;GET THE DATE INIT FROM THE HEADER JSR PC,DATCON ;CONVERT TO ASCII OUTPUT SETUPL ADTLST,TAB ;SET UP LINE: 'DATE OF LAST ENTRY' JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO .WORD 40. ;035 MOV #11.,R2 ;NUMBER OF CHARACTERS IN DATE TO COPY MOV #ALASTD,R0 ;POINT TO THE DATE TO COPY JSR PC,SSCOPY ;COPY THE DATE WE'VE SAVED OUTPUT OUTPUT LNULL SETUPL ATEL ;COPY: 'TOTAL ERROR RECORDS LOGGED' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 43. MOV OHTEL(R5),R0 ;R0=TOTAL ERRORS LOGGED JSR PC,OCTDCF ;CONVERT TO ASCII OUTPUT SETUPL AMETNR ;COPY: 'MISSED ENTRIES - TASK...' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 43. MOV OHMETN(R5),R0 ;R0=COUNT OF MISSED ENTRIES ; (TASK NOT ACTIVE) JSR PC,OCTDCF ;CONVERT TO ASCII OUTPUT SETUPL AMEBF ;COPY: 'MISSED ENTRIES - BUFFER..' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 43. MOV OHMEBF(R5),R0 ;GET VALUE OF MISSED ENTRIES JSR PC,OCTDCF ;CONVERT TO ASCII OUTPUT SETUPL AMEFF ;COPY: 'MISSED ENTRIES - FILE...' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 43. MOV OHMEFF(R5),R0 ;GET VALUE OF MISSED ERROR ENTRIES JSR PC,OCTDCF ;CONVERT TO ASCII OUTPUT SETUPL AUDSE ;COPY: 'UNKNOWN DEVICE STATISTICS' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 43. MOV CUDVST,R0 ;R0= COUNT OF UNKNOWN DEVICE ENTRIES JSR PC,OCTDCF ;CONVERT TO ASCII OUTPUT SETUPL AUERE ;COPY: 'UNKNOWN ERROR RECORD...' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 43. MOV CUERE,R0 ;GET VALUE OF UNKNOWN ... ENTRIES JSR PC,OCTDCF ;CONVERT TO ASCII OUTPUT TST (SP)+ ;CLEAN STACK RTS PC .SBTTL DVSTAT - BUILDS DEVICE STATISTICS RECORDS ;+ ; DVSTAT - BUILD THE ASCII RECORD TO REPORT DEVICE STATISTICS AS RECORDED IN ; THE HEADER OF THE ERRLOG.DAT FILE ; ; R4 -> INFO BLOCK WITHIN REPORTER ; R5 -> FIRST WORD OF DEVICE STATISTIC IN HEADER ; ; JSR PC,DVSTAT ; ; R5 -> RESTORED ; ALL OTHER REGISTERS ARE CHANGED ;- DVSTAT: MOV #SZDVST,R0 ;R0=COUNT OF LINES IN DEVICE ; STATISTICS REPORT SETUPL LNULL MOVB AFRMFD,(R1)+ CLRB (R1) OUTPUT ;ENTRY POINT FOR FIRST CALL - SKIP LINE1 SINCE SIZE INCLUDED IN HEADER CALL DVSTA1: OUTPUT LUNITI ;OUT: 'UNIT IDENTIFICATION' SETUPL AUNITP,TAB ;COPY: 'PHYSICAL UNIT NUMBER' JSR R5,BLKPD5 ;FILL UP WITH BLANKS TO .WORD 66. MOVB ELS.UN(R5),R0 ;GET THE UNIT NUMBER JSR PC,OCTOCT ;CONVERT TO ASCII OUTPUT SETUPL ATYPE,TAB ;SET UP LINE WITH: 'TYPE' MOV #72.,R0 ;STORE SOME BLANKS TST -(SP) ;SET UP SP INC R4 ;POINT TO LENGTH OF TYPE STRING MOVB (R4)+,(SP) ;GET SIZE OF TYPE STRING BIC #177400,(SP) ;CLEAR HI BYTE SUB (SP),R0 ;DETERMINE # OF BLANKS NEEDED JSR R5,BLKPDR ;FILL IT MOV (SP)+,R2 ;# OF CHARACTERS TO COPY MOV R4,R0 ;POINT TO THE TYPE STRING JSR PC,SSCOPY ;COPY IT OUTPUT OUTPUT LNULL ;OUT: ' ' OUTPUT LDSFTU ;OUT: 'DEVICE STATISTICS FOR...' STATNM ANOEL,ELS.EL,0 ;OUT: '# NUMBER OF ERRORS LOGGED' STATNM ANOER,ELS.ER,0 ;OUT: '# OF ERRORS RECEIVED' STATNM ANORS,ELS.RS,1 ;OUT: '# OF READ SUCCESSES' STATNM ANOWS,ELS.WS,1 ;OUT: '# OF WRITE SUCCESSES' STATNM ANOMS,ELS.MS,1 ;OUT: '# OF MOTION SUCCESSES' STATNM ANOOS,ELS.OS,1 ;OUT: '# OF OTHER SUCCESSES' OUTPUT LNULL OUTPUT LNULL RTS PC .SBTTL MESTAT - BUILD MEMORY STATISTICS RECORD ;+ ; MESTAT BUILDS THE ASCII RECORD TO REPORT MEMORY STATISTICS RECORDED IN THE ; HEADER OF THE ERRLOG.DAT FILE ; ; R5 -> START OF FIXED PART OF HEADER ; ; JSR PC,MESTAT ; ; R5 RESTORED ; ALL OTHERS ARE CHANGED ;- MESTAT: ;MOV #SZMEST,R0 ;LINES IN A MEMORY STATISTICS REPORT ;JSR PC,WHEADR ;WRITE HEADINGS OUTPUT AFRMFD OUTPUT LSTARS OUTPUT LMEMST ;OUT: 'MEMORY STATISTICS' OUTPUT ALOGGS ;OUT: 'LOGGED SINCE' DATE + TIME OUTPUT LSTARS ;OUT: '***...***' OUTPUT LNULL OUTPUT LSTATI ;OUT: 'TOTALS OUTPUT LNULL SETUPL ANMPE,TAB ;SET: 'NUMBER OF MEMORY PARITY ERRORS' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 48. MOV OHNMPE(R5),R0 ;GET NUMBER OF MEMORY PARITY ERRORS JSR PC,OCTDCF ;CONVERT TO DECIMAL ASCII OUTPUT SETUPL ANCPE,TAB ;SET: 'NUMBER OF CACHE PARITY ERRORS' JSR R5,BLKPD5 ;FILL WITH BLANKS UP TO .WORD 48. MOV OHNCPE(R5),R0 ;GET NUMBER OF CACHE PARITY ERRORS JSR PC,OCTDCF ;CONVERT TO DECIMAL OUTPUT OUTPUT LNULL RTS PC .SBTTL LINPAD - INITIALIZES LINE BUFFER ;+ ; LINPAD INITIALIZES LINBUF WITH 8 BLANKS AND LEAVES A POINTER TO ; THE NULL BYTE WHICH TERMINATES THE STRING ; ; JSR PC,LINPAD ; ; R0 DESTROYED ; R1 -> NULL BYTE AT END OF STRING IN LINBUF ;- LINPAD: CLRB LINBUF ;INPUT STRING IS LINBUF JSR R5,BLKPD5 ;GO FILL IT IN WITH 8 BLANKS .WORD TABLGH RTS PC LININI: MOV #LINBUF,R1 ;POINT TO THE LINE BUFFER CLRB @R1 ;STORE A NULL BYTE RTS PC .SBTTL BLKPDR - PADS A LINE WITH BLANKS TO A GIVEN LENGTH ;+ ; BLKPDR PADS LINBUF WITH BLANKS TO CREATE A STRING OF GIVEN LENGTH ; TERMINATED BY THE NULL BYTE, PADDING STARTS WITH THE FIRST NULL BYTE ; IN LINBUF ; ; R0 = TOTAL LENGTH STRING DESIRED ; ; JSR R5,BLKPDR ; ; R1 -> NULL BYTE AT END OF STRING ;- BLKPD5: MOV (R5)+,R0 ;GET ARGUMENT BLKPDR: MOV #LINBUF,R1 ;POINT TO THE LINE BUFFER 1$: DEC R0 ;COUNT DOWN TO ZERO ON DESIRED LENGTH BEQ 3$ ;IF ZERO ALREADY NO BLANKS, WE'RE DONE TSTB (R1)+ ;LOOK FOR THE END OF THE INPUT STRING BNE 1$ ;NOT YET, KEEP LOOKING INC R0 ;ONE TOO FAR, FIX COUNT TSTB -(R1) ;BACK UP OVER THE NULL 2$: MOVB ABLANK,(R1)+ ;STORE IN A BLANK DEC R0 ;KEEP COUNT OF THE STRING LENGTH BNE 2$ ;NOT DONE YET KEEP STORING BLANKS CLRB @R1 ;END IN A NULL BYTE 3$: RTS R5 .SBTTL DATIME - DATE AND TIME CONVERSION ;+ ; DATIME - CONVERTS A THREE WORD INPUT CONTAINING RT FORMAT DATE AND TIME ; TO ITS ASCII EQUIVALENT ; ; R0 -> INPUT WORDS DATE AND TIME ; R1 -> OUTPUT STRING AREA ; ; JSR PC,DATIME ; ; R1 -> NULL BYTE AT END OF OUTPUT STRING ; R0,R2 DESTROYED ;- DATIME: ADD #6,R0 ;POINT TO WORD FOLLOWING TIME MOV -(R0),-(SP) ;SAVE THE LO ORDER TIME VALUE MOV -(R0),-(SP) ;SAVE THE HI ORDER TIME VALUE MOV -(R0),R0 ;PUT DATE WORD FOR CONVERSION JSR PC,DATCON ;CONVERT DATE TO ASCII MOV (SP)+,R0 ;SET UP LO ORDER TIME VALUE MOV (SP)+,R2 ;SET UP HI ORDER TIME VALUE JSR PC,TIMCON ;CONVERT TO ASCII RTS PC .SBTTL DATCON - CONVERTS RT DATE TO ASCII ;+ ; DATCON CONVERTS THE DATE IN RT11 FORMAT IN R0 TO AN ASCII STRING POINTED ; TO BY R1 ; ; R0 = INPUT WORD: DATE ; R1 -> OUTPUT STRING AREA ; ; JSR PC,DATCON ; ; R1 -> NULL BYTE AT END OF STRING ; R0 DESTROYED ;- DATCON: MOVB #40,(R1)+ ;START WITH A SPACE TST R0 ;WERE WE PASSED A DATE? BEQ 20$ ;NOPE... MOV R0,-(SP) BIC #^C<37>,(SP) ;YEAR ON STACK (LOW 5 BITS) ;034 ASR R0 ;034 MOV R0,-(SP) ;034 SWAB (SP) ;034 BIC #^C<140>,(SP) ;AGE*32 ON STACK ;034 ASR R0 ;034 MOV R0,-(SP) ;034 SWAB (SP) ;034 BIC #^C<17>,(SP) ;MONTH ON STACK ;034 ASR R0 ASR R0 ASR R0 BIC #^C<37>,R0 ;DAY IN R0 JSR PC,OCTDEC ;CONVERT TO DECIMAL ASCII DEC R1 ;DISCARD THE DECIMAL POINT MOV (SP)+,R0 ;R0=MONTH ASL R0 ;*2 ASL R0 ; *4 FOR STRING OFFSET ADD #MONTHS-4,R0 ;R0->MONTH STRING MOV #5,-(SP) ;SET TO MOVE 5 CHARACTERS ('-XXX-') 10$: MOVB (R0)+,(R1)+ ;MOVE A CHARACTER DEC (SP) ;MORE TO GO? BGT 10$ ;YEP... TST (SP)+ ;NOPE, DISCARD COUNT MOV (SP)+,R0 ;R0=AGE*32 ;034 ADD (SP)+,R0 ;R0=AGE*32+YEAR ;034 ADD #1972.,R0 ; ADD BIAS ;034 JSR PC,OCTDEC ;CONVERT IT CLRB -(R1) ;DISCARD DECIMAL POINT RTS PC 20$: MOV #9.,-(SP) ;IF BAD DATE FIELD, OUTPUT ALL SPACES 30$: MOVB #40,(R1)+ DEC (SP) BGT 30$ TST (SP)+ RTS PC .NLIST BIN .ASCII /-BAD/ MONTHS: .ASCII /-JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC/ .ASCII /-BAD-BAD-BAD-/ .EVEN .LIST BIN .SBTTL TIMCON - CONVERTS INTERNAL TIME TO ASCII ;+ ; TIMCON CONVERTS RT11 INTERNAL TIME POINTED TO BY R0 TO AN ASCII STRING ; POINTED TO R1 ; ; R0 = LO ORDER TIME VALUE ; R2 = HI ORDER TIME VALUE ; R1 -> OUTPUT STRING AREA ; ; JSR PC,TIMCON ; ; R1 -> NULL BYTE AT END OF OUTPUT STRING ; R0,R2 DESTROYED ;- TIMCON: MOV R3,-(SP) ;SAVE MOV R4,-(SP) ; REGISTERS MOV #NEGONE,-(SP) ;STORE THE STACK STOPPER MOVB ABLANK,(R1)+ ;STORE A BLANK TO START THE STRING JSR PC,DIVTK ;CONVERT THE TICKS JSR PC,DIV60 ;CONVERT SECONDS MOV R3,-(SP) JSR PC,DIV60 ;CONVERT MINUTES MOV R3,-(SP) MOV R2,R3 ;MOVE HOUR QUOTIENT TO REMAINDER BR 2$ 1$: MOVB #ACOLON,(R1)+ ;INSERT DELIMITER 2$: ADD #366,R3 ;APPLY MAGIC NUMBER TRANSFORMATION TSTB R3 ;TO GET REMAINDER IN ASCII BPL 2$ ADD #"00-366,R3 SWAB R3 MOVB R3,(R1)+ ;STORE IN OUTPUT STRING SWAB R3 MOVB R3,(R1)+ MOV (SP)+,R3 ;GET NEXT NUMBER BPL 1$ ;GO CONVERT IT MOV (SP)+,R4 ;RESTORE MOV (SP)+,R3 ;REGISTERS CLRB @R1 ;STORE A NULL BYTE RTS PC .ENABL LSB DIVTK: MOV #50.,R4 ;ASSUME A 50 CYCLE CLOCK TSTB F50CLK ;SEE IF IT'S 50 OR 60 BEQ 1$ ;IT'S A 50, WE'RE OK DIV60: MOV #60.,R4 ;NO, SET FOR DIVIDE BY 60. 1$: CLR R3 ;ZERO REMAINDER MOV #32.,-(SP) ;SET BIT COUNT 2$: ASL R2 ;STANDARD SHIFT AND SUBTRACT ROL R0 ROL R3 CMP R3,R4 BLO 3$ SUB R4,R3 INC R2 3$: DEC @SP BNE 2$ TST (SP)+ ;CLEAN STACK RTS PC .DSABL LSB .SBTTL DATCOM - COMPARES RT FORMAT DATE WITH OPERATOR REQUESTED RANGE ;+ ; DATCOM COMPARES AN RT FORMAT DATE WITH THE FROM: AND TO: VALUES OF DATE ; TO DETERMINE WHETHER THE DATE IS WITHIN THE GIVEN RANGE ; ; R0 = THE RT FORMAT DATE TO BE COMPARED ; ; JSR PC,DATCOM ; ; R0 CHANGED ; C-BIT SET FOR OUT OF RANGE ; CLEAR FOR IN RANGE, INVALID DATE OR NO RANGE SPECIFIED ;- DATCOM: TSTB FDAT ;WAS THE DATE OPTION USED? BEQ INRNGE ;NO, RETURN WITH IN-RANGE STATUS JSR PC,DATSFT ;YES,CONVERT DATE TO MAGNITUDE BCS INRNGE ;INVALID, RETURN IN-RANGE STATUS CMP R0,FRDATE ;COMPARE WITH 'FROM' DATE BLO OTRNGE ;IF LESS THAN, RETURN OUT-OF-RANGE;035 CMP R0,TODATE ;COMPARE WITH 'TO' DATE BHIS OTRNGE ;IF GREATER THAN OR EQUAL, ;035 ; RETURN OUT-OF-RANGE STATUS INRNGE: CLC ;INDICATE DATE IS IN RANGE RTS PC OTRNGE: SEC ;INDICATE DATE IS OUT OF RANGE RTS PC .SBTTL DATSFT - CONVERTS RT FORMAT DATE TO MAGNITUDE VALUE ;+ ; DATSFT CONVERTS AN RT FORMAT DATE TO A MAGNITUDE TYPE FORMAT SUITABLE ; FOR INTERNAL DATE COMPARISONS ; ; R0 = DATE TO BE CONVERTED ; ; JSR PC,DATSFT ; ; R0 = INPUT DATE IN MAGNITUDE TYPE FORMAT ;- DATSFT: BIT #36000,R0 ;CHECK FOR A VALID MONTH ;035 BNE 1$ ;ALL SET CONVERT IT SEC ;BAD DATE, INDICATE THIS AND RETURN BR 2$ 1$: MOV R1,-(SP) ;Save R1 and R2 ;035 MOV R2,-(SP) ; 'cause we'll use 'em ;035 MOV R0,R1 ;GET THE DATE ;035 MOV R0,R2 ;A second copy ;035 BIC #^c140000,R0 ;Pick out the epoch bits ;035 BIC #^c000037,R1 ;Pick out the year bits ;035 SWAB R1 ;Put years bits ;035 ASL R1 ; in the output place ;035 BIC #^c037740,R2 ;Pick out the month and day bits;035 ASR R2 ; shift ;035 ASR R2 ; them ;035 ASR R2 ; to the ;035 ASR R2 ; output ;035 ASR R2 ; positions ;035 ADD R2,R1 ;R1 now has year, month, and day;035 ADD R1,R0 ;R0 now has magnitude format ;035 MOV (SP)+,R2 ;Restore used registers ;035 MOV (SP)+,R1 ;035 2$: RTS PC .SBTTL INPUT - PROVIDES POINTER TO NEXT RECORD TO BE PROCESSED ;+ ; INPUT RETURNS A POINTER TO THE NEXT LOGICAL RECORD, READING WHEN NECESSARY ; FROM THE ERROUT INPUT FILE ; ; CHANNEL INCHN HAS BEEN OPENED FOR THE INPUT FILE ; ; JSR PC,INPUT ; ; R0 DESTROYED ; R5 -> RECORD TO BE PROCESSED WITH CARRY CLEAR, OR ; CLOBBERED WITH CARRY SET IF THERE ARE NO MORE RECORDS TO BE ; PROCESSED ;- INPUT: MOV PNTCUR,R5 ;GET CURRENT OFFSET INTO INPUT BUFFER MOVB INPBUF+ELD.RN(R5),SEQCUR;GET SEQUENCE NUMBER OF RECORD CLRB SEQCUR+1 ;CLEAR HI BYTE CMP SEQCUR,#1 ;IF ITS 1, TIME TO BUMP MOD COUNT BNE 1$ ;NO, OK AS IS INCB WRPNUM+1 ;YES, INCREMENT MOD 256. COUNTER 1$: ADD WRPNUM,SEQCUR ;FORM SEQUENCE NUMBER CMP SEQCUR,SAVPNR ;ANY MORE RECORDS? BLT 2$ ;YES, CONTINUE LOOKING FOR NEXT RECORD SEC ;NO, SET CARRY TO INDICATE NOT FOUND BR 7$ ;GO TO COMMON RETURN 2$: MOVB INPBUF+ELD.SZ(R5),-(SP) ;GET SIZE OF LAST RECORD PROCESSED BIC #177400,@SP ;CLEAR THE HI BYTE ASL @SP ;MAKE IT BYTE SIZE ADD (SP)+,R5 ;ADD SIZE TO CURRENT POINTER CMP INPBUF(R5),#NEGONE ;SEE IF IT'S A BUFFER TERMINATOR BNE 6$ ;NO, WE ALREADY HAVE OUR POINTER INC BLKCUR ;INC NEXT BLOCK TO READ .READW #AREA,#INCHN,#INPBUF,#256.,BLKCUR ;YES, READ NEXT BLOCK BCC 5$ ;ERROR IN READ? CMPB @#$ERRBY,#1 ;WHAT IS IT BNE 3$ ;KEEP CHECKING ;+ ;ERROR ERROR MSGIER,FATAL ;ITS A HARD ERROR ;- BR 4$ ;ALL DONE 3$: BMI 4$ ;WAS ERRBYT A 1? ;+ ;ERROR ERROR MSGCHE,FATAL ;CHANNEL ERROR ;- 4$: SEC ;SET CARRY SO WE DON'T TRY AGAIN BR 7$ ;ALL DONE 5$: CLR R5 ;POINT TO START OF BUFFER 6$: MOV R5,PNTCUR ;UPDATE CURRENT OFFSET ADD #INPBUF,R5 ;GET THE ABSOLUTE ADDRESS CLC ;CLEAR CARRY FOR NORMAL RETURN 7$: RTS PC BLKCUR: .WORD 0 ;CURRENT BLOCK IN BUFFER WRPNUM: .WORD 177400 ;-1 IN HI BYTE FOR MOD 256. COUNTER SEQCUR: .WORD 0 ;CURRENT SEQUENCE NUMBER PNTCUR: .WORD 0 ;CURRENT OFFSET INTO INPBUF INPBUF: .BYTE 1,-1 ;FAKE INITIAL RECORD, ; 1 WORD, SEQ NO. OF -1, .WORD -1 ; BUFFER TERMINATOR .BLKW 254. ;ALLOCATE REST OF BUFFER .SBTTL WHEADR - WRITE HEADING OF RECORD W/WO PAGE HEADING ;+ ; WHEADR CALLS LINE1 TO DETERMINE IF THERE'S ENOUGH RROM ON THE CURRENT ; PAGE, IF SO A LINE OF STARS IS WRITTEN, IF NOT FORM-FEED, PAGE HEADING ; AND A LINE OF STARS IS WRITTEN ; ; R0 = # OF LINES IN THIS RECORD ; ; JSR PC,WHEADR ; ; R0 UNCHANGED ; R1 CLOBBERED ;- WHEADR: JSR PC,LINE1 ;WRITE HEADING IF REQUIRED OUTPUT LSTARS ;OUT: '***...***' RTS PC .SBTTL LOCATE - FIND THE ASCII TEXT BLOCK FOR THIS DEVICE ;+ ; LOCATE SEARCHES THE ASCII TABLE CONTAINED IN ERRTXT FOR A GIVEN DEVICE, ; RETURNING EITHER THE ADDRESS OF THE BLOCK FOR THE DEVICE WITH CARRY CLEAR ; WITH THE CARRY SET IF THE DEVICE WAS NOT FOUND IN THE TABLE ; ; R0 = DEVICE CODE TO BE LOCATED (RANGE 0-377) ; ; JSR PC,LOCATE ; ; R4 -> ASCII TEXT FOR THE DEVICE IF FOUND WITH CARRY CLEAR OR, ; CLOBBERED WITH CARRY SET FOR NOT FOUND ;- LOCATE: MOV #POINTL,R4 ;GET START OF TABLE 1$: CMP R0,(R4)+ ;DO THE DEVICE CODES MATCH BNE 2$ ;NO, CHECK FOR END OF LIST CLC ;YES, CLEAR CARRY AND DO NORMAL RETURN MOV (R4),R4 ;PICK UP THE ADDRESS OF INFO BLOCK BR 3$ ;COMMON EXIT 2$: CMP (R4)+,#NEGONE ;IS THIS THE TERMINATOR? BNE 1$ ;NO, GO CHECK ANOTHER ONE SEC ;YES, SET CARRY TO INDICATE NOT FOUND 3$: RTS PC .SBTTL LINE1 - WRITES HEADING ON EACH PAGE ;+ ; LINE1 WRITES THE FIRST LINE ON EACH PAGE, CALLED WHENEVER A RECORD ; IS TO BE OUTPUT TO INSURE THERE IS ROOM ON THE PAGE FOR THE WHOLE RECORD ; ; R0 = # OF LINES IN THIS RECORD ; ; JSR PC,LINE1 ; ; R0,R1 CLOBBERED ;- LINE1: MOV R0,-(SP) ;SAVE TO UPDATE LLEFT WITH CMP R0,LLEFT ;COMPARE SIZE WITH COUNT OF LINES LEFT BLE 1$ ;THERE'S ROOM MOV #MAXLIN,LLEFT ;NO ROOM, START ANOTHER PAGE OUTPUT AFRMFD ;OUT: FF MOV PAGENM,R0 ;GET PAGE NUMBER VALUE MOV #LPGNUM,R1 ;R1->AREA TO STORE CONVERTED PAGE NUM. JSR PC,OCTDEC ;CONVERT TO DECIMAL ASCII OUTPUT LHEADR ;OUT: PAGE HEADING OUTPUT LNULL ;OUT: ' ' OUTPUT LNULL ;OUT: ' ' INC PAGENM ;INCREMENT PAGE COUNT 1$: SUB (SP)+,LLEFT ;UPDATE NUMBER OF LINES LEFT COUNT RTS PC PAGENM: .WORD 1 ;VALUE OF CURRENT PAGE COUNTER LLEFT: .WORD 0 ;NUMBER OF LINES LEFT ON THIS PAGE ; START AT 0 TO FORCE NEW PAGE ON ; FIRST CALL .SBTTL WRITIT - WRITE A LINE TO THE OUTPUT DEVICE ;+ ; WRITIT OUTPUTS A LINE WHICH IS TERMINATED BY A NULL BYTE TO THE ; CURRENTLY OPEN OUTPUT FILE, TRANSFORMING A FF INTO THE APPROPRIATE ; CHARACTERS FOR THE CURRENT OUTPUT DEVICE ; ; R3 -> STRING TO BE WRITTEN TERMINATED BY THE NULL BYTE ; ; JSR R5,WRITI5 ; .WORD ARG ;OR ; ; JSR R5,WRITIT ; ; R3 -> LINBUF ; R0,R1 CLOBBERED ; ALL OTHER REGISTERS RESTORED ;- WRITI5: MOV (R5)+,R3 ;GET ARGUMENT WRITIT: CLR FCRLFD ;CLEAR CR-LF DONE FOR THIS LINE FLAG .ENABL LSB CMP R3,#NEGONE ;JUST WRITING THE REST OF THE BUFFER? BNE NORMAL ;NO, THIS IS A NORMAL OUTPUT TSTB FTTY ;IS OUTPUT DEVICE THE TTY? BNE RETRN ;YES, Do Nothing MOV OBFPTR,R1 ;YES, GET POINTER TO NEXT TO BE FILLED CLROTH: CLRB (R1)+ ;BLANK FILL THE REST OF THE BUFFER CMP R1,#OTBFND ;IS THE BUFFER FULL YET? BNE CLROTH ;NO, GO STORE ANOTHER MOV CURBLK,R1 ;CURRENT BLOCK COUNT .WRITW #AREAO,#OTCHAN,#OUTBUF,#256.,R1 ;WRITE THE BLOCK BCC OK1 ;ERROR IN WRITE? BR ERRWRI ;YES, TELL USER AND EXIT OK1: INC BLKCUR ;INCREMENT TO NEXT BLOCK BR RETRN ;ALL DONE NORMAL: TSTB FTTY ;IS OUTPUT DEVICE THE TTY? BEQ NOTTY ;NO, GO PROCESS FOR OTHER DEVICES OUTTTY: .PRINT R3 ;OUTPUT THE LINE TO THE TTY BR RETRN ;GO TO COMMON RETURN NOTTY: MOV OBFPTR,R1 ;GET CURRENT NEXT-TO-BE FILLED POINTER ANOCHR: MOVB (R3)+,(R1)+ ;MOVE A CHARACTER TO OUTPUT BUFFER BNE NONULL ;ON NULL, DO END OF LINE PROCESSING TST FCRLFD ;HAVE WE ALREADY DONE THE CR,LF? BEQ NOCRLF ;NO, PUT ONE ON THE END OF THIS LINE TSTB -(R1) ;YES, BACK OVER THIS NULL BYTE BR RETRN ;AND RETURN NOCRLF: CMPB -(R3),-(R1) ;BACK UP OVER NULL MOV #CRLFNL,R3 ;POINT TO NULL STRING TO COPY INC FCRLFD ;INDICATE WE'VE DONE THE CR,LF ; SEQUENCE FOR THIS LINE NONULL: CMP R1,#OTBFND ;ARE WE AT THE END OF THE BUFFER? BNE ANOCHR ;NO, GO TRANSFER ANOTHER CHARACTER MOV CURBLK,R1 ;GET THE CURRENT BLOCK NUMBER INC CURBLK ;INCREMENT FOR NEXT TIME .WRITW #AREAO,#OTCHAN,#OUTBUF,#256.,R1 ;WRITE THE BUFFER BCC OK2 ;ANY ERRORS IN WRITE? BR ERRWRI ;YES, TELL USER AND EXIT OK2: MOV #OTBFBG,OBFPTR ;RE-INIT NEXT-TO-BE-FILLED POINTER BR NOTTY ;GO GET ANOTHER CHARACTER RETRN: MOV #LINBUF,R3 ;RESTORE POINTER TO THE LINE BUFFER MOV R1,OBFPTR ;SAVE THE NEXT-TO-BE-FILLED POINTER RTS R5 ERRWRI: TSTB @#$ERRBY ;WHAT'S THE ERROR BNE 1$ ;IO ERROR ;+ ;ERROR ERROR MSGOFF,FATAL ;END OF FILE .EXIT 1$: ERROR MSGOER,FATAL ;IO ERROR ;- .EXIT OBFPTR: .WORD OUTBUF ;NCI POINTER FOR THE OUTPUT BUFFER CURBLK: .WORD 0 ;CURRENT OUTPUT BLOCK NUMBER FCRLFD: .WORD 0 ; INDICATOR FOR THIS LINE OTBFBG = . ;START OF OUTPUT BUFFER OUTBUF: .BLKW 256. ;THE OUTPUT BUFFER OTBFND = .-1 ;END OF THE OUTPUT BUFFER AREAO: .BLKW 5 ;OUTPUT EMT AREA BLOCK CRLFNL: .BYTE 015 ;THE 'CR' .BYTE 012 ; 'LF' .BYTE 0 ; 'NULL' SEQUENCE .EVEN .DSABL LSB .SBTTL STCOPY - COPY A STRING ;+ ; STCOPY COPIES A STRING TERMINATED BY A ZERO BYTE ; ; R0 -> INPUT STRING ; R1 -> OUTPUT STRING ; ; JSR R5,STCOP5 ; .WORD ARG ;OR ; ; JSR R5,STCOPY ; ; R0 DESTROYED ; R1 -> NULL BYTE AT END OF OUTPUT STRING ;- STCOP5: MOV (R5)+,R0 ;GET ARGUMENT STCOPY: MOVB (R0)+,(R1)+ ;COPY STRING BNE STCOPY ;UNTIL NULL TSTB -(R1) ;BACK UP TO NULL BYTE RTS R5 ; SSCOPY ALSO COPIES A STRING WITH INPUTS AND OUTPUTS AS IN STCOPY ; HOWEVER A COUNT GIVEN IN R2 IS USED TO TERMINATE THE COPY RATHER ; THAN THE NULL BYTE, R2 IS DESTROYED ON RETURN SSCOPY: TST R2 ;LENGTH ARGUMENT? BEQ 2$ ;IT'S 0 NO COPY 1$: MOVB (R0)+,(R1)+ ;MOVE A CHARACTER DEC R2 ;DEC COUNT BGT 1$ ;AGAIN 2$: CLRB (R1) ;STORE A NULL AT END OF STRING RTS PC .SBTTL OCTOCT - OCTAL TO OCTAL ASCII OUTPUT ;+ ; OCTOCT CONVERTS AN INPUT VALUE TO ITS EQUIVALENT ASCII STRING ; REPRESENTATION IN OCTAL, A NULL IS LEFT AFTER THE NUMBER ; ; R0 = UNSIGNED NUMBER TO BE CONVERTED ; R1 -> OUTPUT STRING AREA ; ; JSR PC,OCTOCT ; ; R0 DESTROYED ; R1 -> NULL BYTE AT END OF OUTPUT STRING ;- OCTOCT: MOVB #30,@R1 ;INITIALIZE SEC 1$: ROL R0 ROLB (R1)+ MOVB #206,@R1 2$: ASL R0 BEQ 3$ ;IF 0 THEN DONE ROLB @R1 BCS 2$ BR 1$ 3$: CLRB @R1 ;CHANGE 206 TO A NULL RTS PC .SBTTL OCTDEC - OCTAL TO DECIMAL ASCII CONVERSION ;+ ; OCTDEC CONVERTS AN OCTAL INPUT VALUE TO ITS DECIMAL ASCII EQUIVALENT ; ; R0 = VALUE TO BE CONVERTED ; R1 -> STRING OUTPUT AREA ; ; JSR PC,OCTDEC ; ; R1 -> NULL BYTE AT END OF OUTPUT STRING ;- OCTDCF: MOV R1,-(SP) ;SAVE STARTING POSITION AND ; INDICATE BLANK FILL BR ENTRF ;PROCEED TO NORMAL PROCESSING OCTDEC: CLR -(SP) ;INDICATE NO BLANK FILL ON LEFT ENTRF: MOV R3,-(SP) MOV R4,-(SP) MOV #6,R3 ;SET FOR 6 CHARACTERS MOV R1,R2 ;SET POINTER TO OUTPUT STRING ; FOR CBOMG CLR R1 ;NO HI ORDER VALUE JSR PC,CBOMG ;GO DO SETUP MOVB #ADECPT,(R2)+ ;PUT IN THE DECIMAL POINT CLRB @R2 ;STORE THE STRING TERMINATOR MOV 4(SP),R3 ;LEADING BLANKS? BEQ 4$ ;NO,LEAVE AS IS INC R2 ;YES, PREPARE TO COPY CLR R4 ;INIT COUNTER 1$: MOVB -(R2),-(SP) ;START COPYING INC R4 ;KEEP COUNT OF CHARACTERS CMP R3,R2 ;END OF STRING? BNE 1$ ;NO, KEEP COPYING SUB #8.,R4 ;HOW MANY BLANKS ARE NEEDED BEQ 3$ ;NONE? 2$: MOVB ABLANK,(R2)+ ;STORE ONE INC R4 ;KEEPING COUNT BNE 2$ ;MORE 3$: MOVB (SP)+,(R2)+ ;YES, PUT IT BACK WITH THE BLANKS BNE 3$ ;DONE? 4$: MOV R2,R1 ;POINT TO THE END OF THE OUTPUT STRING MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R3 TST (SP)+ ;CLEAN STACK RTS PC .SBTTL DOCTDC - DOUBLE PRECISION OCTAL TO DECIMAL ASCII ;+ ; DOCTDC CONVERTS A 2 WORD UNSIGNED OCTAL INPUT VALUE TO A STRING ; OF UP TO 12. ASCII DECIMAL CHARACTERS (INCLUDING DECIMAL POINT AND ; TERMINATING NULL BYTE) ; ; R0 = LO ORDER WORD OF VALUE TO BE CONVERTED ; R1 = HI ORDER WORD OF VALUE TO BE CONVERTED ; R2 -> STRING TO CONTAIN OUTPUT ; ; JSR PC,DOCTDC ; ; R1 points to null byte at end of string ; R0,R2 unchanged ;- DOCTDC: MOV R3,-(SP) ;SAVE REGISTERS MOV R4,-(SP) MOV R2,-(SP) ;SAVE POINTER TO OUTPUT STRING MOV #12.,R3 ;SET UP FOR 12 DECIMAL CHARACTERS JSR PC,CBOMG MOVB #ADECPT,(R2)+ ;PUT IN DECIMAL POINT CLRB @R2 ;PUT IN STRING TERMINATOR MOV (SP)+,R3 ;GET POINTER TO START OF STRING INC R2 ;GET READY TO COPY CLR R4 ;INIT COUNTER 1$: MOVB -(R2),-(SP) ;COPY INC R4 ;KEEP COUNT CMP R2,R3 ;DONE YET? BNE 1$ ;NO, KEEP COPYING SUB #14.,R4 ;ALLOW FOR 12. CHARACTERS BEQ 3$ ;DON'T NEED ANY BLANKS 2$: MOVB ABLANK,(R2)+ ;STORE IN SOME BLANKS INC R4 ;KEEPING COUNT BNE 2$ ;MORE 3$: MOVB (SP)+,(R2)+ ;COPY BACK AGAIN BNE 3$ ;TERMINATE ON NULL 4$: MOV R2,R1 ;POINT TO END OF STRING MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R3 RTS PC ; FOLLOWING ROUTINES DONATED BY C.G. (CBOMG AND DIV) ; MODIFIED FOR EL IN REGISTER USAGE ONLY CBOMG: JSR PC,DIV ;GO TO DIVIDE ROUTINE MOV R4,-(SP) ;SAVE REMAINDER DEC R3 ;ANY DIGITS LEFT? BLE 1$ ;BRANCH IF NOT MOV R0,-(SP) ;TEMP STORE R0 ADD R1,(SP)+ ;ADD TOGETHER, ZERO QUOTIENT? BEQ 1$ ;= -> YES, ZERO JSR PC,CBOMG ;DIVIDE AGAIN 1$: ADD #'0,@SP ;MAKE IT ASCII MOVB (SP)+,(R2)+ ;SAVE DIGIT RTS PC ;RETURN DIV: MOV #40,-(SP) ;SET LOOP COUNT MOV #10.,-(SP) ;SAVE RADIX FOR SUBTRACTS CLR R4 ;CLEAR REMAINDER 1$: ASL R0 ;DOUBLE PRECISION LEFT SHIFT ROL R1 ROL R4 CMP R4,@SP ;SUBTRACT OUT DIVISOR BLO 2$ ;LO -> DO NOT SUBT SUB @SP,R4 ;DO IT INC R0 ;ADD IN LOW BIT 2$: DEC 2(SP) ;DECREMENT LOOP COUNT BGT 1$ ;IF GT -> MORE TO DO CMP (SP)+,(SP)+ ;CLEAN STACK RTS PC ;RETURN TO SET UP ROUTINE .SBTTL FILEAS - TRANSLATE A RAD50 FILE NAME TO ASCII ;+ ; FILEAS CONVERTS A RAD50 FILE NAME TO ITS ASCII EQUIVALENT STRING INCLUDING ; COLON AND PERIOD ; ; R0 -> INPUT RAD50 FILE NAME ; R1 -> OUTPUT STRING ; ; JSR PC,FILEAS ; ; R0 DESTROYED ; R1 -> NULL BYTE AT END OF OUTPUT STRING ;- FILEAS: JSR PC,R50ASC ;CONVERT DEVICE FIELD MOVB #ACOLON,(R1)+ ;STORE THE COLON JSR PC,R50ASC ;CONVERT THE JSR PC,R50ASC ;FILE NAME MOVB #ADECPT,(R1)+ ;STORE THE PERIOD JSR PC,R50ASC ;CONVERT THE EXTENSION CLRB @R1 ;STRING TERMINATOR RTS PC .SBTTL R50ASC - RAD50 TO ASCII CONVERSION CODE ;+ ; R50ASC CONVERTS A SINGLE RAD50 WORD TO ITS EQUIVALENT ASCII 3 CHARACTER ; OUTPUT STRING ; ; R0 -> INPUT RAD50 WORD ; R1 -> OUTPUT STRING ; ; JSR PC,R50ASC ; ; R0 -> WORD FOLLOWING THE RAD50 INPUT WORD ; R1 -> BYTE FOLLOWING THE LAST CHARACTER OUTPUT ;- R50ASC: MOV R2,-(SP) ;SAVE REGISTERS MOV R3,-(SP) MOV #DIVTAB,R3 ;R3 -> DIVISION TABLE MOV (R0)+,R2 ;R2 = CURRENT INPUT WORD MOV R0,-(SP) ;SAVE UPDATED R0 TO RESTORE ON RETURN 1$: TST -(R3) ;NEW WORD REQUIRED YET? BEQ 7$ ;YES MOV #-1,R0 ;INITIALIZE QUOTIENT REG CMP #174777,R2 ;RAD50 VALUE TOO LARGE? BLO 3$ ;YES - OUTPUT QUESTION MARKS 2$: INC R0 ;DIVIDE BY APPROPRIATE POWER OF 50(8) SUB @R3,R2 BCC 2$ ADD @R3,R2 ;RESTORE DIVIDEND TST R0 ;CHARACTER IS A BLANK? BEQ 4$ ;YES CMP #33,R0 ;DOLLAR SIGN, PERIOD, OR DIGIT? BLO 5$ ;PERIOD OR DIGIT BEQ 6$ ;DOLLAR SIGN 3$: ADD #40,R0 ;ELSE, (A-Z) OR '?' (SEE ABOVE) 4$: ADD #16,R0 5$: ADD #11,R0 6$: ADD #11,R0 MOVB R0,(R1)+ ;STORE CONVERTED CHARACTER IN OUTPUT BR 1$ 7$: MOV (SP)+,R0 ;RESTORE UPDATED R0 VALUE MOV (SP)+,R3 ;RESTORE OTHER REGISTERS MOV (SP)+,R2 RTS PC .WORD 0 ;END-OF-TABLE FLAG .WORD 1 .WORD 50 .WORD 3100 DIVTAB = . ;RAD50 DIVISION TABLE .PAGE ;--------------------------------------------------------------------------; .SBTTL MSCP DISPLAY DEFINITIONS ;--------------------------------------------------------------------------; MSCPID = 50 ;device code for MSCP devices TMSCPD = 60 ;device code for TMSCP devices ENVLEN = 4 ;length of MSCP envelope prefix COLUMN = 45 ;Column number of the "middle" of the display RECADR: .WORD ;address of whole record passed to error logger RTUNIT: .WORD ;RT unit number (not the MSCP unit number) ENVADR: .WORD ;address of envelope PAKADR: .WORD ;address of packet CSRADR: .WORD ;address of Control Status Register SARVAL: .WORD ;contents of status address register PAKSIZ: .WORD ;length of whole envelope FM.TYP: .BYTE ;holds MSCP packet type FM.LFP: .BYTE ;boolean: nonzero iff we ;are processing a last fail packet FM.ENM: .BYTE ;boolean: nonzero iff we ;are processing a command end message FM.SAR: .BYTE ;boolean: nonzero iff we ;are processing a status address register package DVTYPE: .BYTE 0 ;0=DU MSCP 1=MU TMSCP .EVEN DSPRTN: .WORD ;will hold the address of ;the routine that displays packet MSCPDE: .ASCIZ /MSCP Description/ MSCPUN: .ASCIZ /----------------/ MSCPDT: .ASCIZ /DU MSCP Error Log Packet Received / TMSCPT: .ASCIZ /MU TMSCP Error Log Packet Received / CSRLIN: .ASCIZ /CSR Address:/ CSRUND: .ASCIZ /------------/ SARSTR: .ASCIZ /SAR Contents: / ENDSTR: .ASCIZ /Command End Message Packet/ LFPSTR: .ASCIZ /LFP (Last Fail Packet)/ ERRSTR: .ASCIZ /Error Packet/ SARTYP: .ASCIZ >Port Failure/Reset> MSTYPE: .ASCIZ /(T)MSCP Packet Type/ ENVSTR: .ASCIZ /UQSSP Envelope/ PAKSTR: .ASCIZ /(T)MSCP Packet/ CN.MDL: .ASCIZ /Controller Model/ DR.MDL: .ASCIZ /Unit Model/ DR.SER: .ASCIZ /Unit Identifier/ UNKNWN: .ASCIZ /(Undetermined)/ .EVEN MODOFF = 6 ;offset within controller/unit identifier to Model byte CLSOFF = 7 ;offset within controller/unit identifier to Class byte DUNAME: .RAD50 /DU/ MUNAME: .RAD50 /MU/ ;These are the generic MSCP error log message offsets ;They are from appendix A, table 8, of the MSCP manual L.CRF = 0 ;command reference number offset L.UNIT = 4 ;unit number offset L.SEQ = 6 ;sequence number offset L.FMT = 10 ;format offset L.FLGS = 11 ;error log message flags L.EVNT = 12 ;event code offset L.CNTI = 14 ;controller ID offset L.CSVR = 24 ;controller software version number L.CHVR = 25 ;controller hardware version number L.MLUN = 26 ;multi-unit code offset L.UNTI = 30 ;unit ID offset L.USVR = 40 ;unit software version number L.UHVR = 41 ;unit hardware version number L.VSER = 44 ;volume serial number - disk units L.GPCT = 44 ;position (object count) - tape units L.FSVR = 50 ;formatter software version L.FHVR = 51 ;formatter hardware version ;Controller Error with dependent information offsets ;see appendix A, table 8, of the MSCP manual C.INFO = 26 ;start of controller dependent information ;Host Bus Address memory error offsets ;see appendix A, table 8, of the MSCP manual L.BADR = 30 ;host bus memory address M.INFO = 34 ;optional controller dependent information ;Controller Memory Address error offsets ;see appendix A, table 8, of the MSCP manual ;L.BADR = 30 same as above ;M.INFO = 34 same as above ;Disk Transfer error offsets ;see appendix A, table 8, of the MSCP manual L.LVL = 42 ;level L.RTRY = 43 ;retry L.VSER = 44 ;volume serial number L.HDCD = 50 ;header code TRINFO = 54 ;optional controller or disk depenedent information ;SDI Error Log message offsets ;see appendix A, table 8, of the MSCP manual ;L.HDCD = 50 same as above L.SDI = 54 ;SDI information - decoded according to SDI manual ;Small Disk Error offsets ;see appendix A, table 8, of the MSCP manual L.SCYL = 42 ;Cylinder ;L.VSER = 44 same as above ;Bad Block Replacement Attempt error offsets ;see appendix A, table 8, of the MSCP manual L.RPFL = 42 ;replacement flags ;L.VSER = 44 same as above L.LBN = 50 ;Bad Last Block Number L.ORBN = 54 ;Old Replacement Block Number L.NRBN = 60 ;New Replacement Block Number L.RPEV = 64 ;cause ;Tape Errors error log message offsets ;see appendix A, table 8, of the TMSCP manual L.LVL = 42 ;Level L.RTRY = 43 ;Retry ;these next two offsets are not TMSCP datagram offsets, they ;derived from the TK50 chapter in the DSA Error Logging Manual L.DRER = 70 ;TK50/70 Drive Error Byte L.CRST = 71 ;TK50/70 Internal Controller Status Byte ;STI Communication Error error log message offset ;see appendix A, table 8, of the TMSCP manual L.STI = 52 ;STI Unsuccessful Response ;STI Formatter Error error log message offset ;see appendix A, table 8, of the TMSCP manual ;L.STI = 52 ;STI Get Extended Formatter Status Response ;STI Drive Error error log message offset ;see appendix A, table 8, of the TMSCP manual ;L.STI = 52 ;STI Get Extended Formatter Status Response ;Error Log Message FORMAT field codes ;see appendix A, table 9, of the MSCP manual FM.CNT = 0 ;Controller Error FM.BAD = 1 ;Memory Error FM.DSK = 2 ;Disk Transfer Error FM.SDI = 3 ;SDI Error FM.SDE = 4 ;Small Disk Error FM.TPE = 5 ;Tape Errors FM.STI = 6 ;STI communications or command failure FM.DEL = 7 ;STI Drive Error Log FM.FEL = 10 ;STI Formatter Error Log FM.RPL = 11 ;Bad Block Replacement Attempt ;FORMAT strings SDISTR: .ASCIZ /SDI (Standard Disk Interface)/ CONSTR: .ASCIZ /Controller Error/ MEMSTR: .ASCIZ >Host/Controller Memory Access Error> TRANST: .ASCIZ /Disk Transfer Error/ SDESTR: .ASCIZ /Small Disk Error/ BBRSTR: .ASCIZ /Bad Block Replacement Attempt/ TPESTR: .ASCIZ /Tape Data-Transfer Errors/ STICST: .ASCIZ /STI Command Communication Error/ STIFST: .ASCIZ /STI Formatter Error/ STIDST: .ASCIZ /STI Drive Error/ STASTR: .ASCIZ /Status Address Register Error/ COMSTR: .ASCIZ /End Message: / ;Command strings. Actually, we only deal with their respective end ;messages. See table 1 of appendix A ABOCOM: .ASCIZ /ABORT/ ACCCOM: .ASCIZ /ACCESS/ AVLCOM: .ASCIZ /AVAILABLE/ CMPCOM: .ASCIZ /COMPARE HOST DATA/ DAPCOM: .ASCIZ /DETERMINE ACCESS PATHS/ ERSCOM: .ASCIZ /ERASE/ GCSCOM: .ASCIZ /GET COMMAND STATUS/ GTUCOM: .ASCIZ /GET UNIT STATUS/ ONLCOM: .ASCIZ /ONLINE/ RDCOM: .ASCIZ /READ/ RPLCOM: .ASCIZ /REPLACE/ SCCCOM: .ASCIZ /SET CONTROLLER CHARACTERISTICS/ SUCCOM: .ASCIZ /SET UNIT CHARACTERISTICS/ WRCOM: .ASCIZ /WRITE/ INVCOM: .ASCIZ /INVALID COMMAND/ ;These are the generic end message offsets ;See table A-7 of the MSCP manual P.CRF = 0 ;command reference number P.UNIT = 4 ;unit number P.SEQ = 6 ;sequence number P.OPCD = 10 ;opcode, also called endcode P.FLGS = 11 ;end message flags P.STS = 12 ;status P.BCNT = 14 ;byte count P.FBBK =34 ;first bad block ;These are the end message flags found in the end message flag field ;See table A-3 of the MSCP manual, and of the TMSCP manual EF.BBR = 200 ;Bad Block Reported EF.BBU = 100 ;Bad Block Uneported EF.LOG = 40 ;Error Log Generated EF.SEX = 20 ;Serious Exception Reported (TMSCP) EF.EOT = 10 ;End of Tape Encountered (TMSCP) EF.PLS = 4 ;Position Lost (TMSCP) EF.DLS = 2 ;Cached Data Lost (TMSCP) ;These are the end message flag strings ;See table A-3 of the MSCP manual FE.BBR: .ASCIZ /Bad Block Reported/ FE.BBU: .ASCIZ /Bad Block Unreported/ FE.LOG: .ASCIZ /Error Log Generated/ FE.SEX: .ASCIZ /Serious Exception Reported/ FE.EOT: .ASCIZ /End of Tape Encountered/ FE.PLS: .ASCIZ /Position Lost/ FE.DLS: .ASCIZ /Cached Data Lost/ ;Control Message Opcodes ;see appendix A, table 1, of the MSCP manual OP.END = 200 ;end message - note that this is a flag, not a code OP.ABO = 01 ;abort operation code OP.ACC = 20 ;access operation code OP.AVL = 10 ;available operation code OP.CMP = 21 ;compare operation code OP.DAP = 13 ;determine access paths OP.ERS = 22 ;erase operation code OP.GCS = 02 ;get command status operation code OP.GUS = 03 ;get unit status operation code OP.ONL = 11 ;online operation code OP.RD = 41 ;read operation code OP.RPL = 24 ;replace operation code OP.WR = 42 ;write operation code OP.INV = 0 ;inserted for operation ;code: Invalid Command end message ;Error Log FLAG field flags ;see appendix A, table 10, of the MSCP manual LF.SUC = 200 ;Operation Successful LF.CON = 100 ;Operation Continuing LF.BBR = 40 ;Bad Block Replacement Request LF.RCT = 20 ;Error During Replacement LF.SNR = 1 ;Sequence Number Reset ;associated FLAG field strings FLGSTR: .ASCIZ /Message Flags/ FL.SUC: .ASCIZ /Operation Successful/ FL.CON: .ASCIZ /Operation Continuing/ FL.BBR: .ASCIZ /Bad Block Replacement Request/ FL.RCT: .ASCIZ /Error During Replacement/ FL.SNR: .ASCIZ /Sequence Number Reset/ ;STATUS/EVENT field codes ;see table B-1 of the MSCP manual, and of the TMSCP manual ST.SUC = 0 ;success ST.CMD = 1 ;invalid command ST.ABO = 2 ;command aborted ST.OFL = 3 ;unit-offline ST.AVL = 4 ;unit-available ST.MFE = 5 ;media format error ST.WPR = 6 ;write protected ST.CMP = 7 ;compare error ST.DAT = 10 ;data error ST.HST = 11 ;host buffer access error ST.CNT = 12 ;controller error ST.DRV = 13 ;Drive error ST.FMT = 14 ;Formatter error ST.BOT = 15 ;Beginning of Tape encountered ST.TM = 16 ;Tape Mark encountered ST.RDT = 20 ;Record Data Truncated ST.POL = 21 ;Position Lost ST.SEX = 22 ;Serious Exception ST.LED = 23 ;LEOT Detection ST.BBR = 24 ;Bad Block Replacement Completion ST.DIA = 37 ;Message from an internal diagnostic EVNSTR: .ASCIZ (Status/Event Code( SUCSTR: .ASCIZ /Success/ CMDSTR: .ASCIZ /Invalid Command/ ABOSTR: .ASCIZ /Command Aborted/ OFLSTR: .ASCIZ /Unit-Offline/ AVLSTR: .ASCIZ /Unit-Available/ MFESTR: .ASCIZ /Media Format Error/ WPRSTR: .ASCIZ /Write Protected/ CMPSTR: .ASCIZ /Compare Error/ DATSTR: .ASCIZ /Data Error/ HSTSTR: .ASCIZ /Host Buffer Access Error/ CNTSTR: .ASCIZ /Controller Error/ DRVSTR: .ASCIZ /Drive Error/ FMTSTR: .ASCIZ /Formatter Error/ BOTSTR: .ASCIZ /BOT Encountered/ TMSTR: .ASCIZ /Tape Mark Encountered/ .ASCIZ // ;unassigned RCDSTR: .ASCIZ /Record Data Truncated/ POLSTR: .ASCIZ /Position Lost/ SEXSTR: .ASCIZ /Serious Exception/ LEDSTR: .ASCIZ /LEOT Detection/ BBRCST: .ASCIZ /BBR Completion (success)/ BBRCSF: .ASCIZ /BBR Completion (failure)/ DIASTR: .ASCIZ /Message From Internal Diagnostic/ .EVEN .PAGE .SBTTL ;------------------------------------------------------------------------------ ;------------------------- BEGIN MSCP DISPLAY --------------------------------- ;DOMSCP - This is the main routine for displaying mscp device error ;packets. First it will display the date/time stamp for reception ;of the error packet. Then it will display the Control Status ;Register (CSR) address (= UQSSP IP address), followed by the contents ;of the Status Address Register (= contents of UQSSP SA register). ;The next step is to display a description of the packet type. The ;subroutine "PAKDEC" determines what type of MSCP packet is contained ;in the device error record. PAKDEC then does two things: it puts a ;descriptive string in the output buffer, and then stuffs location ;DSPRTN with the address of a subroutine appropriate for decoding ;the particular type of MSCP packet in the device error record. ;After PAKDEC returns, the MSCP envelope is displayed, followed by ;the entire contents of the MSCP Packet. All that remains for ;DOMSCP to do is perform "JSR PC,@DSPRTN," which will call the ;routine that displays the information specific to the packet type. ;On input, R5 points to the RT-11 Error Logger device error record ;JSR PC,DOMSCP ;The caller is DEVICE, the routine for displaying device error records ;On output, the packet has been decoded and displayed. ;All registers are protected DOMSCP: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) MOV R5,RECADR MOV ELD.UN(R5),RTUNIT OUTPUT LNULL MOV RECADR,R0 ;get the address of the array of registers ADD #ELD.RG,R0 ;i.e., the start address of the envelope TSTB FXM ;we must add a word if this is XM BEQ 12$ INC R0 INC R0 12$: MOV R0,ENVADR MOV (R0),PAKSIZ ;first word of envelope is byte length ;of packet ASR PAKSIZ ;keep it around as word length ADD #ENVLEN,R0 MOV R0,PAKADR ;packet, proper, address MOV PAKSIZ,R0 ;get the envelope length ASL R0 ;make offset out of length ADD PAKADR,R0 MOV (R0),CSRADR ;CSR address is appended to packet MOV 2(R0),SARVAL ;so is the contents of the SAR SETUPL CSRLIN ;display the CSR address JSR R5,BLKPD5 .WORD COLUMN MOV CSRADR,R0 JSR PC,OCTOCT OUTPUT OUTPUT LNULL SETUPL SARSTR JSR R5,BLKPD5 .WORD COLUMN MOV SARVAL,R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ JSR PC,DECSAR ;decode and indicate contents of SAR OUTPUT LNULL SETUPL MSTYPE ;decode and display packet type JSR R5,BLKPD5 .WORD COLUMN JSR PC,PAKDEC ;display line about packet type, and ;set FM.TYP, FM.LFP, FM.ENM, and DSPRTN TSTB FM.LFP BEQ 1$ OUTPUT LFPSTR ;"Last Fail Packet (LFP)" BR 3$ 1$: TSTB FM.ENM BEQ 11$ OUTPUT ENDSTR ;"End Message Packet" BR 3$ 11$: TSTB FM.SAR BEQ 2$ OUTPUT SARTYP ;"Port Failure/Reset" OUTPUT LNULL CLR LLEFT ;force a new page in the listing BR MDONE 2$: OUTPUT ERRSTR 3$: OUTPUT LNULL ;now display the envelope SETUPL ENVSTR JSR R5,BLKPD5 .WORD COLUMN MOV @ENVADR,R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ MOV ENVADR,R0 MOV 2(R0),R0 JSR PC,OCTOCT OUTPUT OUTPUT LNULL ;display first line of packet contents ;recall that all MSCP packets always start off with ; i) a command reference number (two words) ; ii) a word either for a unit number or reserved ; iii) a sequence number (one word) ; iv) format/opcode (one byte) ; v) flags (one byte) ; vi) status/event code (one word) ;so there are always more than four words in a packet SETUPL PAKSTR ;"MSCP Packet" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R2 MOV #4,R5 4$: MOV (R2)+,R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ DEC R5 BNE 4$ CLRB -(R1) OUTPUT ;display remaining lines of packet MOV PAKSIZ,R4 SUB #4,R4 BLOS 7$ 5$: MOV #4,R5 SETUPL LNULL JSR R5,BLKPD5 .WORD COLUMN 6$: MOV (R2)+,R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ DEC R4 BLOS 7$ ;branch if no more words in packet DEC R5 BNE 6$ CLRB -(R1) OUTPUT ;display one whole line BR 5$ 7$: CLRB -(R1) OUTPUT OUTPUT LNULL ;Now we call the routine appropriate to the packet type ;It's address has been stuffed into DSPRTN by PAKDEC JSR PC,@DSPRTN OUTPUT LNULL ;We are done with the MSCP Packet MDONE: MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- .PAGE .SBTTL CTRDEC display a controller error packet ;CTRDEC - This routine displays a controller error packet. ;note that the packet may also be a Last Fail Packet ;see section 5.8.2 of the MSCP manual CTRDEC: JSR PC,DOFLAG ;decode and display the FLAGS field JSR PC,DOSTAT ;decode and display the ;EVENT/STATUS code field JSR PC,CNT.ID ;decode and display the CONTROLLER IDENTIFIER TSTB FM.LFP ;nonzero iff this is a LFP. BEQ 1$ ;do not branch if this is a last fail packet SETUPL UDALFP ; "UDA Last Failure Code" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #C.INFO,R0 ;get the Last Failure Code MOV (R0),R0 JSR PC,OCTOCT OUTPUT 1$: RTS PC UDALFP: .ASCIZ /UDA Last Failure Code/ .SBTTL MEMDEC display a Host Memory Access error packet ;MEMDEC - This routine displays a Host Memory Access error packet ;see section 5.8.3 of the MSCP manual MEMDEC: JSR PC,DOFLAG ;decode and display the FLAGS field JSR PC,DOSTAT ;decode and display the STATUS/EVENT code JSR PC,CNT.ID ;decode and display the CONTROLLER IDENTIFIER SETUPL MSTR JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #L.BADR,R0 ;display the host memory address MOV R0,R2 ;save the pointer to the address MOV (R2),R0 ;the address is two words long JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV 2(R2),R0 JSR PC,OCTOCT OUTPUT RTS PC MSTR: .ASCIZ /Host Memory Address/ .SBTTL DTDEC display a Disk Transfer Error Packet ;DTEDEC - This routine displays a Disk Transfer Error (DTE) packet ;see section 5.8.4 of the MSCP manual DTEDEC: JSR PC,DR.NUM ;display the UNIT NUMBER JSR PC,DOFLAG ;decode and display the FLAGS field JSR PC,DOSTAT ;decode and display the STATUS/EVENT code JSR PC,CNT.ID ;decode and display the CONTROLLER IDENTIFIER JSR PC,UNT.ID ;decode and display the UNIT IDENTIFIER JSR PC,VOLDEC ;display the volume serial number JSR PC,HEDDEC ;display the logical/replacement block number RTS PC .SBTTL SDEDEC display a Small Disk Error packet ;This routine displays the small disk error packet ;see section 5.8.5 of the MSCP manual SDEDEC: JSR PC,DR.NUM ;display the UNIT NUMBER JSR PC,DOFLAG ;decode and display the FLAGS field JSR PC,DOSTAT ;decode and display the STATUS/EVENT code JSR PC,CNT.ID ;display the CONTROLLER IDENTIFIER JSR PC,UNT.ID ;display the UNIT IDENTIFIER RTS PC .SBTTL BBRDEC display a Bad Block Replacement packet ;BBRDEC - This routine displays a Bad Block Replacement packet ;see section 5.8.7 of the MSCP manual BBRDEC: JSR PC,DR.NUM ;display the UNIT NUMBER JSR PC,DOFLAG ;decode and display the FLAGS JSR PC,DOSTAT JSR PC,CNT.ID ;display the CONTROLLER IDENTIFIER JSR PC,UNT.ID ;display the UNIT IDENTIFIER SETUPL BBRLIS ; "Bad Block Replacement Message Flags" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV L.RPFL(R0),R5 MOV R5,R0 JSR PC,OCTOCT ;display the word MOVB ABLANK,(R1)+ MOVB ABLANK,(R1)+ CLRB (R1) BIT #LFR.RP,R5 BEQ 1$ MOV #RP.STR,R0 ;"Replacement Attempted" JSR PC,6$ 1$: BIT #LFR.FE,R5 BEQ 2$ MOV #FE.STR,R0 ;"Force Error Written" JSR PC,6$ 2$: BIT #LFR.TE,R5 BEQ 3$ MOV #TE.STR,R0 ;"Non-Primary Revector" JSR PC,6$ 3$: BIT #LFR.RF,R5 BEQ 4$ MOV #RF.STR,R0 ;"Reformat Error" JSR PC,6$ 4$: BIT #LFR.RI,R5 BEQ 5$ MOV #RI.STR,R0 ;"RCT Inconsistent" JSR PC,6$ 5$: BIT #LFR.BR,R5 BEQ 7$ MOV #BR.STR,R0 ;"Bad RBN" JSR PC,6$ BR 7$ 6$: JSR R5,STCOPY OUTPUT SETUPL LNULL JSR R5,BLKPD5 .WORD COLUMN+10 RTS PC 7$: OUTPUT SETUPL LBNSTR ;"Bad Logical Block Number" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R2 MOV L.LBN(R2),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV L.LBN+2(R2),R0 JSR PC,OCTOCT OUTPUT SETUPL OLDRBN ;"Old Replacememnt Logical Block Number" JSR R5,BLKPD5 .WORD COLUMN MOV L.ORBN(R2),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV L.ORBN+2(R2),R0 JSR PC,OCTOCT OUTPUT SETUPL NEWRBN ;"New Replacement Logical Block Number" JSR R5,BLKPD5 .WORD COLUMN MOV L.NRBN(R2),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV L.NRBN+2(R2),R0 JSR PC,OCTOCT OUTPUT SETUPL CAUSE ;"Cause" JSR R5,BLKPD5 .WORD COLUMN MOV L.RPEV(R2),R0 JSR PC,OCTOCT OUTPUT RTS PC LBNSTR: .ASCIZ /Bad Logical Block Number/ OLDRBN: .ASCIZ /Old Replacement Block Number/ NEWRBN: .ASCIZ /New Replacement Block Number/ BBRLIS: .ASCIZ /Bad Block Replacement Message Flags/ CAUSE: .ASCIZ /Cause/ LFR.RP = ^O100000 ;See appendix A, table 11 of the MSCP manual LFR.FE = ^O40000 LFR.TE = ^O20000 LFR.RF = ^O10000 LFR.RI = ^O4000 LFR.BR = ^O2000 RP.STR: .ASCIZ /Replacement Attempted/ FE.STR: .ASCIZ /Force Error Written/ TE.STR: .ASCIZ /Non-Primary Revector/ RF.STR: .ASCIZ /Reformat Error/ RI.STR: .ASCIZ /RCT Inconsistent/ BR.STR: .ASCIZ /Bad RBN/ .EVEN ;SDIDEC - This routine displays an SDI packet ;see section 5.8.5 of the MSCP manual SDIDEC: JSR PC,DR.NUM ;display the UNIT NUMBER JSR PC,DOFLAG ;decode and display the FLAGS field JSR PC,DOSTAT ;decode and display the EVENT/STATUS code JSR PC,CNT.ID ;display the CONTROLLER IDENTIFIER JSR PC,UNT.ID ;display the UNIT IDENTIFIER JSR PC,VOLDEC ;display the volume serial number JSR PC,HEDDEC ;display the logical/replacement block number ;Display the Generic Drive Status Area SETUPL G.STAT ;"Generic Drive Status" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV L.SDI(R0),R5 MOV R5,R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ MOVB ABLANK,(R1)+ CLRB (R1) MOV #20,R2 ;number of bits in a word MOV #GS.TAB,R4 1$: ASR R5 BCC 2$ CMP R2,#10 ;We do not decode 4 of the bits BHI 11$ CMP R2,#5 BHIS 2$ 11$: MOV (R4),R0 CMP R4,#GSBCHK BLOS 12$ MOV #UNKNWN,R0 12$: JSR PC,5$ 2$: ADD #4,R4 DEC R2 BNE 1$ OUTPUT ;Now Display the Extended Status Area SETUPL EXT.AR ;"Extended Area" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV L.SDI+2(R0),R5 MOV R5,R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ MOVB ABLANK,(R1)+ CLRB (R1) MOV #5,R2 ;only examining 5 bits in this word MOV #EX.TAB+6,R4 ASR R5 ;lowest three bits not currently used ASR R5 ASR R5 3$: ASR R5 BCC 4$ MOV (R4),R0 CMP R4,#EXBCHK BLOS 31$ MOV #UNKNWN,R0 31$: JSR PC,5$ 4$: ADD #2,R4 DEC R2 BNE 3$ OUTPUT BR 6$ 5$: JSR R5,STCOPY ;display one line of status OUTPUT SETUPL LNULL JSR R5,BLKPD5 .WORD COLUMN+10 RTS PC ;Display the Extended Drive Status/Error Info ;it is four words long 6$: SETUPL EXT.ST ;"Extended Drive Status/Error Info" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #L.SDI+4,R0 MOV R0,R5 MOV #4,R4 7$: MOV (R5)+,R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ DEC R4 BNE 7$ CLRB (R1) OUTPUT ;display drive error code SETUPL DR.ERR ;"Drive Error Code" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOVB L.SDI+12(R0),R0 JSR PC,OCTHEX OUTPUT ;display front panel fault code SETUPL DR.COD ;"Front Panel Fault Code" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOVB L.SDI+13(R0),R0 JSR PC,OCTHEX OUTPUT RTS PC G.STAT: .ASCIZ /Generic Drive Status/ EXT.AR: .ASCIZ /Extended Area/ EXT.ST: .ASCIZ (Extended Drive Status/Error Info( DR.ERR: .ASCIZ /Drive Error Code/ DR.COD: .ASCIZ /Front Panel Fault Code/ .EVEN GS.TAB: .WORD 1$ .WORD 2$ .WORD 3$ .WORD 4$ .WORD 5$ .WORD 6$ .WORD 7$ .WORD 8$ .WORD 9$ .WORD 10$ .WORD 11$ .WORD 12$ .WORD 13$ .WORD 14$ .WORD 15$ .WORD 16$ .WORD 17$ .WORD 18$ .WORD 19$ .WORD 20$ .WORD 21$ .WORD 22$ .WORD 23$ .WORD 24$ .WORD 25$ .WORD 26$ .WORD 27$ .WORD 28$ .WORD 29$ .WORD 30$ .WORD 31$ .WORD 32$ GSBCHK == . ;this table is critically ordered 1$:.ASCIZ (RUN/STOP Switch In( 2$:.ASCIZ (RUN/STOP Switch Out( 3$:.ASCIZ /Port Switch In/ 4$:.ASCIZ /Port Switch Out/ 5$:.ASCIZ /Drive Connected to Port B/ 6$:.ASCIZ /Drive Connected to Port A/ 7$: .ASCIZ /Loggable Info In Extended Area/ 8$: .ASCIZ /No Loggable Information In Extended Area/ 9$: .ASCIZ /Spindle Ready/ 10$: .ASCIZ /Spindle Not Ready/ 11$: .ASCIZ /Diagnostic Requested/ 12$: .ASCIZ /No Diagnostic Requested/ 13$: .ASCIZ /Readjustment Requested/ 14$: .ASCIZ /No readjustment Requested/ 15$: .ASCIZ /Drive Unavailable/ 16$: .ASCIZ /Drive Available/ 17$:.ASCIZ /576 Byte Sector/ 18$:.ASCIZ /512 Byte Sector/ 19$:.ASCIZ /Diagnostic Cylinder Access Enabled/ 20$:.ASCIZ /Diagnostic Cylinder Access Disabled/ 21$:.ASCIZ /Formatting Operations Enabled/ 22$:.ASCIZ /Formatting Operations Disabled/ 23$:.ASCIZ /Drive Disabled By Error Routine Or Diagnostic/ 24$:.ASCIZ /Drive Enabled By Error Routine Or Diagnostic/ 25$:.ASCIZ /Write Protect Switch 1 In/ 26$:.ASCIZ /Write Protect Switch 1 Out/ 27$:.ASCIZ /Write Protect Switch 2 In/ 28$:.ASCIZ /Write Protect Switch 2 Out/ 29$:.ASCIZ /Write Protect Switch 3 In/ 30$:.ASCIZ /Write Protect Switch 3 Out/ 31$:.ASCIZ /Write Protect Switch 4 In/ 32$:.ASCIZ /Write Protect Switch 4 Out/ .EVEN EX.TAB: .BLKB 6 .WORD 6$ .WORD 7$ .WORD 8$ .WORD 9$ .WORD 10$ .WORD 11$ .WORD 12$ .WORD 13$ .WORD 14$ EXBCHK == . ;this table is critically ordered 6$: .ASCIZ /Write Lock Error/ 7$: .ASCIZ // ;not specified 8$: .ASCIZ /Initialization Diagnostic Failure/ 9$: .ASCIZ // ;not specified 10$:.ASCIZ /Level 2 Protocol Error/ 11$:.ASCIZ /Transmission Error/ 12$:.ASCIZ // ;not specified 13$:.ASCIZ /Drive Error/ 14$:.ASCIZ // ;not specified .EVEN .SBTTL ENMDEC display an MSCP command end message packet ;ENMDEC - This routine displays an end message packet ;See section 5.4 of the MSCP manual ENMDEC: SETUPL UN.STR ;"Unit Number" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV P.UNIT(R0),R0 JSR PC,OCTOCT OUTPUT SETUPL SQ.STR ;"Sequence Number" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV P.SEQ(R0),R0 JSR PC,OCTOCT OUTPUT ;now do flags SETUPL FLGSTR ;"Message Flags" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOVB P.FLGS(R0),R0 JSR PC,OCTBYT MOVB ABLANK,(R1)+ MOVB ABLANK,(R1)+ MOVB ABLANK,(R1)+ MOVB ABLANK,(R1)+ CLRB (R1) CLRB BBREP MOV R0,R2 BITB #EF.BBR,R2 BNE 1$ MOV #FE.BBR,R0 ;"Bad Block Reported" JSR PC,4$ INCB BBREP 1$: BITB #EF.BBU,R2 BNE 2$ MOV #FE.BBU,R0 ;"Bad Block Unreported" JSR PC,4$ 2$: BITB #EF.LOG,R2 BNE 3$ MOV #FE.LOG,R0 ;"Error Log Generated" JSR PC,4$ 3$: BITB #EF.SEX,R2 BNE 5$ MOV #FE.SEX,R0 ;"Serious Exception Reported" (TMSCP) JSR PC,4$ BR 5$ 4$: JSR R5,STCOPY OUTPUT SETUPL LNULL JSR R5,BLKPD5 .WORD COLUMN+7 RTS PC 5$: SETUPL EVNSTR ;"Event Status Code" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV P.STS(R0),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV PAKADR,R0 ;OCTOCT killed R0 MOV P.STS(R0),R0 JSR PC,EVNDEC ;finish of event/status code line TSTB BBREP BEQ 6$ ;Branch if no bad block was reported SETUPL FST.BB ; "First Bad Block" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #P.FBBK,R0 MOV R0,R3 MOV (R3),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ MOV 2(R3),R0 ;R0 was killed by OCTOCT JSR PC,OCTOCT OUTPUT 6$: RTS PC FST.BB: .ASCIZ /First Bad Block/ SQ.STR:.ASCIZ /Sequence Number/ BBREP: .BYTE 0 .EVEN .SBTTL decode and display a TMSCP error log packet .SBTTL TPEDEC - display a tape errors packet .SBTTL STCDEC - display an STI command or communications failure packet .SBTTL STFDEC - display an STI Formatter error packet .SBTTL STDDEC - display an STI Drive Error Packet ;decode and display a TMSCP tape errors packet ;see section 6.1 of the TMSCP manual. TPEDEC: JSR PC,DR.NUM ;display the unit number JSR PC,DOFLAG ;decode and display the flags JSR PC,DOSTAT ;decode the status event code JSR PC,CNT.ID ;identify the controller JSR PC,UNT.ID ;identify the storage unit JSR PC,OBJDEC ;display position, the object count OUTPUT LNULL SETUPL DRVDEP ; "Drive Dependent Flags" OUTPUT SETUPL DRVUND ; "---------------------" OUTPUT SETUPL DRISTS ;Drive Error Byte (Fault Code) JSR R5,BLKPD5 ;pad out to center column .WORD COLUMN MOV PAKADR,R0 MOVB L.DRER(R0),R0 ;Get the Drive error byte from the JSR PC,OCTHEX ;packet. This is a drive dependent OUTPUT ;code. (see the DSA manual, ; chapters 19-21) SETUPL CNTSTS ;"Controller Internal Status Byte" JSR R5,BLKPD5 ;pad out to center column .WORD COLUMN MOV PAKADR,R0 ;get controller internal status MOVB L.CRST(R0),R0 ;this is a controller dependent code, JSR PC,OCTHEX ;(see the DSA manual, chapters 19-21) OUTPUT RTS PC DRISTS: .ASCIZ /Drive Error Byte (Fault Code)/ CNTSTS: .ASCIZ /Controller Internal Status Byte/ DRVDEP: .ASCIZ /Drive Dependent Flags/ DRVUND: .ASCIZ /---------------------/ .EVEN ;Decode and dispaly a TMSCP STI Packet ;see section 6.1 of the TMSCP manual. At this level of this program ;these are all the same STCDEC: STFDEC: STDDEC: JSR PC,DR.NUM ;display the unit number JSR PC,DOFLAG ;decode and display the flags JSR PC,DOSTAT ;decode the status event code JSR PC,CNT.ID ;identify the controller JSR PC,UNT.ID ;identify the storage unit JSR PC,OBJDEC ;display position, the object count RTS PC .SBTTL OBJDEC - display the tape position and formatter version numbers ;OBJDEC - this routine displays the position field of a TMSCP ;error logging packet, also called the object count OBJDEC: SETUPL OBJSTR JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R5 MOV L.GPCT(R5),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV L.GPCT+2(R5),R0 JSR PC,OCTOCT OUTPUT SETUPL FSVRST JSR R5,BLKPD5 .WORD COLUMN MOVB L.FSVR(R5),R0 JSR PC,OCTBYT OUTPUT SETUPL FHVRST JSR R5,BLKPD5 .WORD COLUMN MOVB L.FHVR(R5),R0 JSR PC,OCTBYT OUTPUT RTS PC OBJSTR: .ASCIZ /Position (Object Count)/ FSVRST: .ASCIZ /Formatter Software Version/ FHVRST: .ASCIZ /Formatter Hardware Version/ .SBTTL SARDEC dispaly a status address packet ;SARDEC - this routine is here for logical structure only. ;DECSAR has already decoded and displayed the SAR previous ;to our display of the envelope contents. SARDEC: RTS PC .SBTTL OCTHEX - octal to hexidecimal conversion ;OCTHEX - This routine takes the low byte of R0 and displays it as ;two hexidecimal digits; it puts the two digits in the output buffer. ;It then sticks in the string "(HEX)" OCTHEX: MOVB R0,R2 ASR R2 ;not using EIS ASR R2 ASR R2 ASR R2 BIC #^O177760,R2 MOVB HEXTAB(R2),(R1)+ MOVB R0,R2 BIC #^O177760,R2 MOVB HEXTAB(R2),(R1)+ MOVB ABLANK,(R1)+ MOVB #'(, (R1)+ MOVB #'H, (R1)+ MOVB #'E, (R1)+ MOVB #'X, (R1)+ MOVB #'), (R1)+ CLRB (R1) RTS PC HEXTAB: .BYTE 60 .BYTE 61 .BYTE 62 .BYTE 63 .BYTE 64 .BYTE 65 .BYTE 66 .BYTE 67 .BYTE 70 .BYTE 71 .BYTE 101 .BYTE 102 .BYTE 103 .BYTE 104 .BYTE 105 .BYTE 106 .SBTTL EVNDEC finish off an event/status code line ;EVNDEC - this routine finishes off the event/status code line ;This routine is called by DOSTAT and by ENMDEC ;The event/status code word should be in R0 ;See appendix B of the MSCP manual, and of the TMSCP manual EVNDEC: BIC #^O177740,R0 BNE 1$ MOV #SUCSTR,R0 ;"Success" JMP 14$ 1$: CMP R0,#ST.CMD BNE 2$ MOV #CMDSTR,R0 ;"Invalid Command" BR 14$ 2$: CMP R0,#ST.ABO BNE 3$ MOV #ABOSTR,R0 ;"Command Aborted" BR 14$ 3$: CMP R0,#ST.OFL BNE 4$ MOV #OFLSTR,R0 ;"Unit-Offline" BR 14$ 4$: CMP R0,#ST.AVL BNE 5$ MOV #AVLSTR,R0 ;"Unit-Available" BR 14$ 5$: CMP R0,#ST.MFE BNE 6$ MOV #MFESTR,R0 ;"Media Format Error" BR 14$ 6$: CMP R0,#ST.WPR BNE 7$ MOV #WPRSTR,R0 ;"Write Protected" BR 14$ 7$: CMP R0,#ST.CMP BNE 8$ MOV #CMPSTR,R0 ;"Compare Error" BR 14$ 8$: CMP R0,#ST.DAT BNE 9$ MOV #DATSTR,R0 ;"Data Error" BR 14$ 9$: CMP R0,#ST.HST BNE 10$ MOV #HSTSTR,R0 ;"Host Buffer Access Error" BR 14$ 10$: CMP R0,#ST.CNT BNE 11$ MOV #CNTSTR,R0 ;"Controller Error" BR 14$ 11$: CMP R0,#ST.DRV BNE 12$ MOV #DRVSTR,R0 ;"Drive Error" BR 14$ 12$: CMP R0,#ST.FMT BNE 121$ MOV #FMTSTR,R0 BR 14$ 121$: CMP R0,#ST.BOT BNE 122$ MOV #BOTSTR,R0 BR 14$ 122$: CMP R0,#ST.TM BNE 123$ MOV #TMSTR,R0 BR 14$ 123$: CMP R0,#ST.RDT BNE 124$ MOV #RCDSTR,R0 BR 14$ 124$: CMP R0,#ST.POL BNE 125$ MOV #POLSTR,R0 BR 14$ 125$: CMP R0,#ST.SEX BNE 126$ MOV #SEXSTR,R0 BR 14$ 126$: CMP R0,#ST.LED BNE 127$ MOV #LEDSTR,R0 BR 14$ 127$: CMP R0,#ST.BBR BNE 13$ MOV PAKADR,R0 MOV L.EVNT(R0),R0 CMP R0,#100 BGT 128$ MOV #BBRCST,R0 ;"Bad Block Replacement Completion" BR 14$ 128$: MOV #BBRCSF,R0 ;"Bad Block Replacement Failure" BR 14$ 13$: CMP R0,#ST.DIA BNE 15$ MOV #DIASTR,R0 ;"Message From Internal Diagnostic" 14$: JSR R5,STCOPY 15$: OUTPUT RTS PC .SBTTL PAKDEC figure out what kind of MSCP packet we have ;PAKDEC - This routine figures what type of packet, according to ;the format field, we have, and displays it. ;Output: ; FM.LFP = nonzero iff we have a last fail packet ; FM.ENM = nonzero iff we have a control end message ; FM.SAR = nonzero iff we have a status address register packet ; FM.TYP = the format field of the packet ; DSPRTN = the address of the routine which will finish ; the display of the packet PAKDEC: CLRB FM.LFP CLRB FM.ENM CLRB FM.SAR TST PAKSIZ ;If LEN in UQSSP header is 0, BNE 11$ ;then it's an SAR packet. INCB FM.SAR BR 8$ 11$: MOV PAKADR,R0 ADD #L.FMT,R0 MOVB (R0),FM.TYP MOVB FM.TYP,R0 BNE 2$ MOV PAKADR,R0 ;in here if we have a controller error packet CMPB L.EVNT(R0),#ST.CNT ;but check if it's a Last Fail Packet BNE 1$ ;branch if it's not a Last Fail Packet INCB FM.LFP ;this notes that we have a LFP 1$: MOV #CONSTR,R0 MOV #CTRDEC,DSPRTN BR 9$ 2$: CMPB FM.TYP,#FM.BAD BNE 3$ MOV #MEMSTR,R0 ;Host Memory Access Error MOV #MEMDEC,DSPRTN BR 9$ 3$: CMPB FM.TYP,#FM.DSK BNE 4$ MOV #TRANST,R0 ;Disk Transfer Error MOV #DTEDEC,DSPRTN BR 9$ 4$: CMPB FM.TYP,#FM.SDI BNE 5$ MOV #SDISTR,R0 ;Standard Disk Interface Error MOV #SDIDEC,DSPRTN BR 9$ 5$: CMPB FM.TYP,#FM.SDE BNE 6$ MOV #SDESTR,R0 ;Small Disk Error MOV #SDEDEC,DSPRTN BR 9$ 6$: CMPB FM.TYP,#FM.RPL BNE 7$ MOV #BBRSTR,R0 ;Bad Block Replacement MOV #BBRDEC,DSPRTN BR 9$ 7$: CMPB FM.TYP,#FM.TPE BNE 72$ MOV #TPESTR,R0 MOV #TPEDEC,DSPRTN BR 9$ 72$: CMPB FM.TYP,#FM.STI BNE 74$ MOV #STICST,R0 MOV #STCDEC,DSPRTN BR 9$ 74$: CMPB FM.TYP,#FM.DEL BNE 76$ MOV #STIDST,R0 MOV #STDDEC,DSPRTN BR 9$ 76$: CMPB FM.TYP,#FM.FEL BNE 78$ MOV #STIFST,R0 MOV #STFDEC,DSPRTN BR 9$ 78$: BITB #OP.END,FM.TYP ;is there an end message flag BEQ 8$ ;ACTION: change this to use ENVELOPE INC FM.ENM MOV #COMSTR,R0 ;A Command End Message MOV #ENMDEC,DSPRTN JSR PC,ENMFIN ;find appropriate case of endmessage BR 9$ 8$: MOV #STASTR,R0 ;the default case is Status Address MOV #SARDEC,DSPRTN ;Packet, which means do nothing! 9$: JSR R5,STCOPY OUTPUT RTS PC .SBTTL ENMFIN finds for what command the end messagge is. ;ENMFIN - This routine is a subroutine of PAKDEC. It figures out what ;command the endmessage is for. ENMFIN: JSR R5,STCOPY CMPB FM.TYP,#OP.END+OP.ABO BNE 1$ MOV #ABOCOM,R0 ;"ABORT" BR 13$ 1$: CMPB FM.TYP,#OP.END+OP.ACC BNE 2$ MOV #ACCCOM,R0 ;"ACCESS" BR 13$ 2$: CMPB FM.TYP,#OP.END+OP.AVL BNE 3$ MOV #AVLCOM,R0 ;"AVAILABLE" BR 13$ 3$: CMPB FM.TYP,#OP.END+OP.CMP BNE 4$ MOV #CMPCOM,R0 ;"COMPARE HOST DATA" BR 13$ 4$: CMPB FM.TYP,#OP.END+OP.DAP BNE 5$ MOV #DAPCOM,R0 ;"DETERMINE ACCESS PATHS" BR 13$ 5$: CMPB FM.TYP,#OP.END+OP.ERS BNE 6$ MOV #ERSCOM,R0 ;"ERASE" BR 13$ 6$: CMPB FM.TYP,#OP.END+OP.GCS BNE 7$ MOV #GCSCOM,R0 ;"GET COMMAND STATUS" BR 13$ 7$: CMPB FM.TYP,#OP.END+OP.GUS BNE 8$ MOV #GCSCOM,R0 ;"GET UNIT STATUS" BR 13$ 8$: CMPB FM.TYP,#OP.END+OP.ONL BNE 9$ MOV #ONLCOM,R0 ;"ONLINE" BR 13$ 9$: CMPB FM.TYP,#OP.END+OP.RD BNE 10$ MOV #RDCOM,R0 ;"READ" BR 13$ 10$: CMPB FM.TYP,#OP.END+OP.RPL BNE 11$ MOV #RPLCOM,R0 ;"REPLACE" BR 13$ 11$: CMPB FM.TYP,#OP.END+OP.WR BNE 12$ MOV #WRCOM,R0 ;"SET CONTROLLER CHARACTERISTICS" BNE 13$ 12$: CMPB FM.TYP,#OP.END+OP.INV BNE 1$ MOV #INVCOM,R0 ;"INVALID COMMAND" 13$: RTS PC .SBTTL HEDDEC display the header code ;HEDDEC - This displays the header code info, which is an MSCP ;logical block number or a replacement block number. This is a ;subroutine of the routines for the Disk Transfer Errors ;Packet and the Standard Disk Interface Packet. HEDDEC: MOV PAKADR,R5 ADD #L.HDCD,R5 ;protect the pointer ;see section 5.4.1 of the MSCP manual MOV 2(R5),R0 ;get the upper half of the the header field BIC #^O007777,R0 ;zero out all but opcode CMP R0,#^O060000 BNE 1$ SETUPL R.BLK BR 2$ 1$: SETUPL L.BLK 2$: JSR R5,BLKPD5 .WORD COLUMN MOV (R5),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV 2(R5),R0 BIC #^O170000,R0 ;remove opcode JSR PC,OCTOCT OUTPUT RTS PC L.BLK: .ASCIZ /MSCP Logical Block Number/ R.BLK: .ASCIZ /MSCP Replacement Block Number/ .EVEN .SBTTL VOLDEC display the volume serial number AKA Pack/HDA serial number ;VOLDEC - this routine displays the volume serial number. This ;serial number is commonly known as the Pack/HDA (Hard Disk ;Assembly) serial number VOLDEC: SETUPL PK.HDA JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #L.VSER,R0 MOV R1,R2 ;for call to DOCTDC MOV R2,R5 ;save for later MOV 2(R0),R1 ;for call to DOCTDC MOV (R0),R0 ;for call to DOCTDC JSR PC,DOCTDC ;double precision octal to decimal ascii MOV R5,R4 ;save for later 1$: CMPB (R5)+,ABLANK BNE 2$ BR 1$ 2$: DEC R5 3$: MOVB (R5)+,(R4)+ BNE 3$ OUTPUT ;r1 comes back appropriately RTS PC PK.HDA: .ASCIZ (Pack/HDA Serial Number( .EVEN .SBTTL DECSAR decode and display the status address register ;DECSAR - This routine decodes the contents of the status address ;register, putting the appropriate string in the output buffer and ;displaying it ;see section 2.3.9 of the UNIBUS/QBUS Storage Systems Port manual FILIND = ^O100000 ;mask indicating if the status is error DECSAR: MOV SARVAL,R0 BNE 1$ ;CLR R0 ;"Controller On Line" BR 7$ 1$: BIT #FILIND,R0 BNE 6$ BIT #^O004000,R0 BEQ 2$ MOV #60,R0 ;"Controller Initialization - Step 1" BR 7$ ;the magic number 60 causes the correct offset ;into the address table 2$: BIT #^O010000,R0 BEQ 3$ MOV #62,R0 ;"Controller Initialization - Step 2" BR 7$ 3$: BIT #^O020000,R0 BEQ 4$ MOV #64,R0 ;"Controller Initialization - Step 3" BR 7$ 4$: BIT #^O040000,R0 BEQ 5$ MOV #66,R0 ;"Controller Initialization - Step 4" BR 7$ 5$: MOV #UNKNWN,R0 ;"Unknown" BR 73$ 6$: ASL R0 ;note that this wipes out bit 15 for us 7$: ADD #SARTAB,R0 CMP R0,#SRCHK2 ;which table is the string in? BHIS 71$ CMP R0,#SRCHK1 BLO 71$ BR 72$ 71$: MOV #CNTDEP,R0 BR 73$ 72$: MOV (R0),R0 73$: JSR R5,STCOPY OUTPUT RTS PC SRCHK1 == . SARTAB: .WORD 1$ .WORD 2$ .WORD 3$ .WORD 4$ .WORD 5$ .WORD 6$ .WORD 7$ .WORD 8$ .WORD 9$ .WORD 10$ .WORD 11$ .WORD 12$ .WORD 13$ .WORD 14$ .WORD 15$ .WORD 16$ .WORD 17$ .WORD 18$ .WORD 19$ .WORD 20$ .WORD 21$ .WORD 22$ .WORD 23$ .WORD 24$ .WORD 25$ .WORD 26$ .WORD 27$ .WORD 28$ SRCHK2 == . ;this table is critically ordered 1$: .ASCIZ /Controller On Line/ 2$: .ASCIZ +Envelope/Packet Read (parity or timeout)+ 3$: .ASCIZ +Envelope/Packet Write (parity or timeout)+ 4$: .ASCIZ /Controller ROM and RAM parity/ 5$: .ASCIZ /Controller RAM parity/ 6$: .ASCIZ /Controller ROM parity/ 7$: .ASCIZ +Queue Read (parity or timeout)+ 8$: .ASCIZ +Queue Write (parity or timeout)+ 9$: .ASCIZ /Interrupt Master/ 10$: .ASCIZ /Host Access Timeout (higher level protocol dependent)/ 11$: .ASCIZ /Credit Limit Exceeded/ 12$: .ASCIZ /Bus Master Error/ 13$: .ASCIZ /Diagnostic Controller Fatal/ 14$: .ASCIZ /Instruction Loop Timeout/ 15$: .ASCIZ /Invalid Connection Identifier/ 16$: .ASCIZ /Interrupt Write Error/ 17$: .ASCIZ +MAINTENANCE READ/WRITE Invalid Region+ 18$: .ASCIZ /MAINTENANCE WRITE load to non-loadable controller/ 19$: .ASCIZ /Controller RAM error (nonparity)/ 20$: .ASCIZ /INIT sequence error/ 21$: .ASCIZ /High level protocol incompatibility error/ 22$: .ASCIZ +Purge/Poll hardware failure+ 23$: .ASCIZ /Mapping register read error (parity or error)/ 24$: .ASCIZ /Data transfer mapping option/ 25$: .ASCIZ /Controller Initialization - Step 1/ 26$: .ASCIZ /Controller Initialization - Step 2/ 27$: .ASCIZ /Controller Initialization - Step 3/ 28$: .ASCIZ /Controller Initialization - Step 4/ CNTDEP: .ASCIZ +(Drive/Controller Dependent)+ .EVEN .SBTTL DOFLAG decode and display the FLAGS field ;DOFLAG - This routine obtains the flag field from the MSCP packet ;and displays it, along with the appropriate interpretation of each ;set bit DOFLAG: SETUPL FLGSTR ;"Message Flags" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #L.FLGS,R0 MOVB (R0),R5 MOV R5,R0 ;for OCTBYT JSR PC,OCTBYT MOVB ABLANK,(R1)+ CLRB (R1) BITB #LF.SUC,R5 BEQ 1$ MOV #FL.SUC,R0 ;"Operation Successful" JSR PC,9$ 1$: BITB #LF.CON,R5 BEQ 2$ MOV #FL.CON,R0 ;"Operation Continuing" JSR PC,9$ 2$: BITB #LF.BBR,R5 BEQ 3$ MOV #FL.BBR,R0 ;"Bad Block Replacement Request" JSR PC,9$ 3$: BITB #LF.RCT,R5 BEQ 4$ MOV #FL.RCT,R0 ;"Error During Replacement" JSR PC,9$ 4$: BITB #LF.SNR,R5 BEQ 5$ MOV #FL.SNR,R0 ;"Sequence Number Reset" JSR PC,9$ 5$: OUTPUT RTS PC 9$: JSR R5,STCOPY OUTPUT SETUPL LNULL JSR R5,BLKPD5 .WORD COLUMN+4 RTS PC .SBTTL decode and display the status/event code ;DOSTAT - This routine prints the status/event code line. The 16 ;bit octal number is the value of the status/event code field in the ;MSCP packet. The five bits which of field which are code (not ;subcode) decoded into english. See appendix B, of the MSCP manual DOSTAT: SETUPL EVNSTR JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV L.EVNT(R0),R0 JSR PC,OCTOCT MOVB ABLANK,(R1)+ CLRB (R1) MOV PAKADR,R0 ;OCTOCT killed R0 MOV L.EVNT(R0),R0 JSR PC,EVNDEC ;finish off the event/status code line RTS PC .SBTTL display the drive number ;DR.NUM - This routine prints the "Unit Number" line. DR.NUM: SETUPL UN.STR JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV L.UNIT(R0),R0 JSR PC,OCTOCT OUTPUT RTS PC UN.STR: .ASCIZ /Unit Number/ .EVEN .SBTTL decode and display the controller identifier ;CNT.ID - This routine displays the "Controller Model" lines. The ;16 bit octal number is the Controller's class (high byte) and ;model (low byte). It then displays the controller's hardware and ;software versions. CNT.ID: SETUPL CN.MDL ;"Controller Model" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #L.CNTI,R0 MOV R0,R5 MOVB MODOFF(R0),R0 ;display the model byte JSR PC,OCTBYT MOVB ABLANK,(R1)+ MOV R5,R0 MOVB CLSOFF(R0),R0 ;display the class byte JSR PC,OCTBYT CLRB (R1) OUTPUT SETUPL 1$ JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV R0,R5 ADD #L.CSVR,R0 MOVB (R0),R0 JSR PC,OCTBYT OUTPUT SETUPL 2$ JSR R5,BLKPD5 .WORD COLUMN MOV R5,R0 ADD #L.CHVR,R0 MOVB (R0),R0 JSR PC,OCTBYT OUTPUT RTS PC 1$: .ASCIZ /Controller Software Version/ 2$: .ASCIZ /Controller Hardware Version/ .SBTTL UNT.ID display the UNIT IDENTIFIER ;UNT.ID - This routine prints the "Drive Model" and "Drive Serial ;Number" lines, as well as the unit version numbers. DUSCHN = 10 ; Channel Number for IGTDUS I/O UNT.ID: SETUPL DR.SER ;"Drive Serial Number" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #L.UNTI,R0 MOV R1,R5 ; Protect SETUPL's R1 MOV 4(R0),R2 MOV 2(R0),R1 MOV (R0),R0 JSR PC,OCT3DC MOV R5,R1 ;OCT3DC set R5 appropriately,OUTPUT wants its OUTPUT ;value in R1 SETUPL DR.MDL ; "Drive Model" JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 ADD #L.UNTI,R0 MOV R0,R5 MOVB MODOFF(R0),R0 ;display the model byte JSR PC,OCTBYT MOVB ABLANK,(R1)+ CLRB (R1) MOV R5,R0 MOVB CLSOFF(R0),R0 ;display the class byte JSR PC,OCTBYT MOVB ABLANK,(R1)+ CLRB (R1) ;now make call to IGTDUS to get the drive media identifier in ;ASCII format MOV #DUSARG,R5 MOV #RT.STR,MS.TYP TSTB DVTYPE ;check if getting a DU or a TU media name BNE 1$ MOV #DUNAME,DUSARG+2 ; MOV #MS.STR,MS.TYP BR 2$ 1$: MOV #MUNAME,DUSARG+2 ; MOV #TM.STR,MS.TYP 2$: ;MOV PAKADR,R0 ;get unit number ;ADD #L.UNIT,R0 ;MOV @R0,MS.UNT MOV RTUNIT,MS.UNT ;use the RT unit number MOV #IGTDUS,R0 CALL CALL$F TST R0 BEQ 25$ ;function call succeeded ; MOV #UNKMED,R0 BR 3$ 25$: MOV #MS.BUF,R0 ADD #10,R0 ;make R0 point to ascii string for media id 27$: JSR R5,STCOPY ;copy the ascii string for media id into buffer 3$: OUTPUT ;display whole line ;now display the version numbers SETUPL 4$ JSR R5,BLKPD5 .WORD COLUMN MOV PAKADR,R0 MOV R0,R5 ADD #L.USVR,R0 MOVB (R0),R0 JSR PC,OCTBYT OUTPUT SETUPL 5$ JSR R5,BLKPD5 .WORD COLUMN MOV R5,R0 ADD #L.UHVR,R0 MOVB (R0),R0 JSR PC,OCTBYT OUTPUT RTS PC 4$: .ASCIZ /Unit Software Version/ 5$: .ASCIZ /Unit Hardware Version/ UNKMED: .ASCIZ // .even ;This is the argument block for the call to IGTDUS DUSARG: .WORD 6 ;the number of arguments .WORD ;for the RAD50 device name .WORD CHNADR ;channel number used for this function call .WORD MS.BUF .WORD MS.UNT ;address of the unit number MS.TYP: .WORD .WORD DUSWRK MS.UNT: .WORD MS.BUF: .BLKW 7 CHNADR: DUSCHN DUSWRK: .BLKW 160. MS.STR: .ASCIZ /MSCP/ TM.STR: .ASCIZ /TMSCP/ RT.STR: .ASCIZ /RT11/ .EVEN LKARG: .WORD .WORD LKNAME .WORD LKNAME: .RAD50 /DU/ .RAD50 // .RAD50 // .RAD50 // .EVEN .SBTTL OCT3DC triple precision octal to ascii ;OCT3DC - this routine converts a triple precision binary number ;into its corresponding ASCII string ;Input R0: lowest 16 bits of binary number ; R1: second lowest 16 bits of binary number ; R2: highest 16 bits of binary number ; R5: start address of ouput buffer ; ; JSR PC,OCT3DC ; ;Output R5 points to nullbyte at end of string OCT3DC: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) JSR PC,1$ MOVB #ADECPT,(R5)+ ;stick in decimal point CLRB (R5) MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC 1$: JSR PC,BIGDIV MOV R3,-(SP) ;save the remainder, a digit, on stack MOV R0,-(SP) ;now see if quotient is zero BIS R1,(SP) BIS R2,(SP)+ BEQ 2$ ;quotient is zero JSR PC,1$ ;quotient is not zero 2$: ADD #'0,(SP) MOVB (SP)+,(R5)+ RTS PC .SBTTL BIGDIV triple precision binary to decimal ;BIGDIV - this routine divides a triple precision binary number ;by 10 decimal. ;Input R0: lowest 16 bits of dividend ; R1: second lowest 16 bits of dividend ; R2: highest 16 bits of dividend ; ; JSR PC,BIGDIV ; ;Output R0: lowest 16 bits of quotient ; R1: second lowest 16 bits of quotient ; R2: highest 16 bits of quotient ; R3: remainder BIGDIV: MOV #60,-(SP) ;counter of number of bits of dividend MOV #10.,-(SP) CLR R3 1$: ASL R0 ;shift dividend left, R3 is work area ROL R1 ROL R2 ROL R3 CMP R3,@SP ;compare "left" bits with 10. BLO 2$ ;if less than, then leave a 0-bit in quotient SUB @SP,R3 ;greater than or equal, so leave a 1-bit INC R0 ; in the quotient by using INC 2$: DEC 2(SP) BGT 1$ CMP (SP)+,(SP)+ ;a way to pop stack RTS PC .SBTTL OCTBYT octal byte to ascii ;OCTBYT - this routine takes the low byte of R0 and creates the ;corresponding ascii string in the the buffer pointed to by R1 ; ; Input: R0's byte is an unsigned eight bit number ; R1 points to an output buffer ; ; JSR PC,OCTBYT ; ; R0 has been preserved ; R1 points to the null byte at the end the string OCTBYT: MOV R0,-(SP) ;protect R0 MOVB #14,@R1 ;14 (octal) shifted left twice = 48 (decimal) SEC ;guaruntee that we can do eight shifts of the ;low byte of R0 before the result could equal 0. ROLB R0 ;highest bit of the low byte of R0 becomes the ROLB @R1 ;currently lowest bit of the char we are building ;we do this one extra time here because the ;leftmost character of the output comes from two ;binary digits. ;now comes the regular case 1$: ROLB R0 ;highest bit of the low byte of R0 becomes the ROLB (R1)+ ;currently lowest bit of the char we are building MOVB #206,@R1 ;the lowest significant digit of 206 (octal) ;is 6, this 6 will be shifted left three times, ;multiplying it by 8. 6*8=48, recall that ;48. + n (n<10.) is the ascii code for "n". ;So our technique is to put 6 in a byte, and ;then shift into the byte the three bits which ;are the octal digit whose ascii code we want ;most significant digit of 206 (octal) is ;2, so that the first time the byte is left ;shifted, the c-bit will be set, and the ;second time the byte is left shifted the c-bit ;will not be set 2$: ASLB R0 BEQ 3$ ROLB @R1 BCS 2$ ;will be set in the first iteration, and not BR 1$ ;set for the second iteration 3$: CLRB (R1) MOV (SP)+,R0 RTS PC .END ERROUT