.TITLE ICA - INTERACTIVE CRASH DUMP ANALYZER .SBTTL DISCUSSION .MCALL EXIT$S,QIOW$,DIR$,SPND$S .MCALL FSRSZ$,FDBDF$,FDRC$A,FDBK$A,FDOP$A .MCALL OPEN$R,READ$,CLOSE$,WAIT$,WTSE$C ; ICA - INTERACTIVE CRASH DUMP DISPLAY PROGRAM ; ; WRITTEN BY: JOHN WOOD ; LAWRENCE BERKELEY LABORATORY ; BERKELEY, CALIFORNIA 94720 ; (415) 486-5972 ; ; THIS PROGRAM READS THE OUTPUT FILE FROM 'CDA' AND WRITES SELECTED ; 256 BYTE BLOCKS OF DATA TO A TERMINAL. IT IS A COMPANION TO THE ; 'SEE' PROGRAM, PROVIDING THE SAME COMMANDS AND DISPLAY FORMAT. ; ; THERE ARE THREE WAYS OF ENTERING AN ADDRESS TO DISPLAY: ; ; 1 - ENTER THE ADDRESS (RETURN) ; PRINTS 256 BYTES ; ; 2 - (RETURN) ALONE ; PRINTS TNE NEXT 256 BYTES ; ; 3 - UP-ARROW (RETURN) ; PRINTS THE PREVIOUS 256 BYTES ; ; THE TASK CAN BE TERMINATED BY TYPING: Q (RETURN) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ONE EXAMPLE OF HOW 'ICA' IS USED: ; ; A CRASH DUMP IS TAKEN ON DK0: ; ; AFTER REBOOTING, ENTER: ; CDA ,[7,20]DMP.CDA=DK0: ; ; THIS WRITES A CRASH FILE ON UIC [7,20] CALLED DMP.CDA ; ; INVOKING 'ICA' WILL ALLOW INSPECTION ON ANY MEMORY LOCATIONS. ; USE 18 BIT OCTAL ADDRESSES. THE I/O PAGE IS NOT ACCESSABLE. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; TO ASSEMBLE AND TASK BUILD ; ; MAC ICA,ICA=ICA ; ; TKB> ICA,ICA=ICA ; TKB> / ; ENTER OPTIONS: ; TKB> TASK=...ICA ; TKB>// ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .PAGE .SBTTL BUFFERS AND VARIABLES LINE: .BLKW 3 ;ADDRESS TO PRINT .ASCII /0 / ;3 SPACES FWD: .BLKW 3 ;WORD 1 .ASCII / / ;2 SPACES .BLKW 3 ;WORD 2 .ASCII / / ; .BLKW 3 ;WORD 3 .ASCII / / ; .BLKW 3 ;WORD 4 .ASCII / / ; .BLKW 3 ;WORD 5 .ASCII / / ; .BLKW 3 ;WORD 6 .ASCII / / ; .BLKW 3 ;WORD 7 .ASCII / / ; .BLKW 3 ;WORD 8 CRLF: .ASCII <15><12> ; LLEN= .-LINE ;LENGTH OF OUTPUT BUFFER .EVEN HEARLD: .ASCII <15><12>/ENTER ADDRESS - / HLEN= .-HEARLD .EVEN TITLE: .ASCII <15><12>/ ADDR 00 02 04 06/ .ASCII / 10 12 14 16/<15><12> LTIT= .-TITLE .EVEN .PAGE .SBTTL FCS STRUCTURES FSRSZ$ 0 ;BLOCK I/O ONLY FDB: FDBDF$ ;DEFINE FDB FDRC$A FD.RWM ;SPECIFY BLOCK I/O FDBK$A BUF,BLEN,,3 ;BLOCK I/O BUFFER AND EVENT FLAG NO. FDOP$A 2,DSET ;LUN AND DATASET DESCRIPTOR BLOCK DSET: 0,0,DNLEN,DNAM,FNLEN,FNAM ; VBN: .WORD 0,0 ;BLOCK NUMBER FNAM: .ASCII /DMP.CDA/ ;FILE NAME FNLEN= .-FNAM ;LENGTH OF FILE NAME .EVEN DNAM: .ASCII /[7,20]/ ;UID FOR DMP FILE DNLEN= .-DNAM ;LENGTH OF UID OFFSET= 2 ;OFFSET TWO BLOCKS ADR: .WORD 0 ;ADDRESS TO DISPLAY BLK: .WORD 0 ;BLOCK NUMBER TO READ CNT: .WORD 0 ;NUMBER OF LINES PTR: .WORD 0 ;POINTER INTO BUFFER BUF: .BLKW 1024. ;BUFFER TO HOLD DATA BLEN= .-BUF ;LENGTH OF BUFFER IBUF: .BLKB 132. ;INPUT BUFFER DDPB: QIOW$ IO.RVB,2,2,,DSB ;DISK DPB TDPB: QIOW$ IO.WVB,5,5,,TSB ;TERMINAL DPB NDPB: QIOW$ IO.RVB,5,5,,TSB,, DSB: .BLKW 2 ;DISK IOSB TSB: .BLKW 2 ;TERMINAL IOSB .PAGE .SBTTL MAIN PROGRAM START: MOV #TDPB,R0 ;SEND MESSAGE TO USER MOV #HEARLD,Q.IOPL(R0) ;INSERT ADDRESS MOV #HLEN,Q.IOPL+2(R0) ;INSERT LENGTH DIR$ #TDPB ;SEND IT ; CLEAR THE INPUT BUFFER CLR IBUF CLR IBUF+2 CLR IBUF+4 CLR IBUF+6 DIR$ #NDPB ;INPUT THE ADDRESS ; TEST FOR Q = QUIT ; NULL = PRINT NEXT SCREEN FULL ; ^ = PRINT PREVIOUS SCREEN FULL CMPB #'Q,IBUF ;TEST FOR Q BNE 10$ ;BRANCH IF NOT Q JMP QUIT ; 10$: TSTB IBUF ;TEST FOR 'NULL' BNE 20$ ;BRANCH IF NOT 'NULL' MOV ADR,R1 ;GET LAST ADDRESS BR 100$ ;BRANCH TO PRINT IT 20$: CMPB #'^,IBUF ;TEST FOR '^' BNE 40$ ;BRANCH IF NOT '^' MOV ADR,R1 ;GET LAST ADDRESS CMP R1,#100 ;TEST IF SUBTRACTING 100 WILL GO NEGATIVE BLOS 30$ ;BRANCH IF YES SUB #100,R1 ; BR 100$ ;PRINT IT 30$: CLR R1 ;START AT TOP BR 100$ ;PRINT IT 40$: MOV #IBUF,R0 ;POINT AT INPUT BUFFER CLRB 6(R0) ;FORCE ONLY SIX CHARACTERS MOV TSB+2,R1 ;DELETE TRAILING BYTE DEC R1 ; CLRB IBUF(R1) ; CALL $COTB ;CONVERT TO BINARY MOV #TDPB,R0 ;CRLF MOV #CRLF,Q.IOPL(R0) ; MOV #2,Q.IOPL+2(R0) ; DIR$ #TDPB ;SEND CRLF 100$: BIC #1,R1 ;ALLIGN ON 16 BYTE BOUNDARY MOV R1,ADR ;SAVE ADDRESS CLR R0 ;DIVIDE BY 1000 DIV #100,R0 ; MOV R0,BLK ;SAVE BLOCK NUMBER ASL R1 ;MULTIPLY BY 10 ASL R1 ; ASL R1 ; MOV R1,PTR ;SAVE POINTER INTO BLOCK ; GET DATA FROM DISK MOV BLK,R0 ;GET BLOCK NUMBER ADD #OFFSET,R0 ; MOV R0,VBN+2 ; OPEN$R #FDB ;OPEN FOR READ READ$ ,,,#VBN ;READ THE BLOCK WAIT$ ,#3 ;WAIT FOR EVENT FLAG #3 CLOSE$ ;CLOSE THE FILE WTSE$C 3 ;WAIT FOR EVENT FLAG #3 ; PRINT THE DATA ON THE TERMINAL MOV #TDPB,R0 ;PRINT TITLE MOV #TITLE,Q.IOPL(R0) ; INSERT ADDRESS MOV #LTIT,Q.IOPL+2(R0) ; INSERT LENGTH DIR$ #TDPB ;PRINT IT MOV #16.,CNT ;NUMBER OF LINES 110$: CALL MKADR ;CALCULATE THE ADDRESS ADD #2,ADR ;BUMP ADDRESS CALL MKDAT ;SET UP DATA CALL OUT ;SEND THE DATA DEC CNT ;DECREMENT COUNT BNE 110$ ;BRANCH TILL DONE JMP START ;GO AROUND AGAIN QUIT: EXIT$S ;QUIT .PAGE .SBTTL SUBROTUINES ; MKDAT - CONVERT BINARY DATA TO ASCII ; ; THIS ROUTINE CONVERTS 8 WORDS OF BINARY DATA INTO ASCII CHARACTERS ; FOR DISPLAY ON THE TERMINAL. ; ; ENTRY PTR = NEXT WORD TO CONVERT ; ; USES R0 R1 R2 R3 R4 R5 MKDAT: MOV #8.,R3 ;COUNT OF WORDS MOV PTR,R4 ;POINTER INTO BUFFER MOV #FWD,R5 ;POINT INTO OUTPUT BUFFER 10$: MOV R5,R0 ;SET UP OUTPUT WORD ADD #8.,R5 ;BUMP ADDRESS MOV #1,R2 ;NO ZERO SUPPRESSION MOV BUF(R4),R1 ;GET DATA TO FIX TST (R4)+ ;BUMP POINTER CALL $CBOMG ;FIX IT SOB R3,10$ ;MORE? MOV R4,PTR ;SAVE POINTER RETURN ;NO .PAGE ; MKADR - CONVERT ADDRESS WORD TO ASCII CHARACTERS ; ; ENTRY ADR = WORD TO CONVERT ; ; USES R0 R1 R2 MKADR: MOV #LINE,R0 ;SET UP OUTPUT WORD MOV #1,R2 ;NO ZERO SUPPRESSION MOV ADR,R1 ;GET DATA TO FIX CALL $CBOMG ;FIX IT RETURN ; .PAGE ; OUT - PRINTS ONE LINE OF DATA TO THE TERMINAL. ; ; IT PRINTS ONE LINE CONSISTING OF THE TWO CONTIGUOUS ARRAYS 'LINE' ; AND 'FWD'. ; ; USES R0 OUT: MOV #TDPB,R0 ;POINT AT DPB MOVB #40,LINE ;MAKE FIRST CHARACTER A BLANK MOV #LINE,Q.IOPL(R0);INSERT STARTING ADDRESS MOV #LLEN,Q.IOPL+2(R0) ;INSERT LENGTH DIR$ #TDPB ;SEND IT RETURN ; .END START