CRASH.MAC/AU:72./-BF=CRASH.DMC \ -2,2 .IDENT /04.03G/ -25,25 ; VERSION 4.03A -43 ; MSH039 -- DON'T RELY ON NXM TRAPS TO STOP RL11 ; MEMORY DUMPING ON Q-BUS MACHINE ; ; MSH057 -- PREVENT TK06 ROUTINE FROM CORRUPTING THE ; DISK BY A NXM TRAP ; ; MSH058 -- DO NOT ATTEMPT TO CLEAR R-ONLY REGISTERS ; ; MSH059 -- FIX TS11 BUGS ; ; MSH101 -- GET USER MODE SP ; ; MSH113 -- GET UMR#1 FOR TS11 MEMORY MAPPING % -256,,/;MSH101/ .IF DF M$$MGE MOV #PMODE!PR7,PS ;;;LOCK OUT INTERRUPTS AND SET ;;;PREVIOUS MODE=USER .IFF -257,,/;MSH101/ .ENDC -623,632,/;MSH057/ .IFTF ;M$$EXT .IF DF M$$MGE MOV #140000,R5 ;;;SET TO MAP THROUGH APR6 CLR @#KISAR6 ;;;POINT TO FIRST BYTE OF 1K SEGMENT .IFF ;M$$MGE CLR R5 ;;;R5 TRACKS THE DUMP PROCESS .ENDC ;M$$MGE .IFT ;M$$EXT 50$: CLR 4(R0) ;;;START AT BEGINNING OF UNIBUS MAP .IFF ;M$$EXT CLR 4(R0) ;;;START OF BEGINNING OF MEMORY 50$: .IFTF ;M$$EXY MOV #-2000,2(R0) ;;;WRITE 1K WORDS PER TRANSFER -636,649,/;MSH057/ BMI 80$ ;;;IF MI ERROR .IFT ;M$$EXT ADD #4000,@#UBMPR ;;;POINT TO NEXT 1K WORD BOUNDARY ADC @#UBMPR+2 ;;;DON'T FORGET THE CARRY ADD #40,@#KISAR6 ;;;ADJUST DUMP TRACKING POINTER CMP #170000,@#KISAR6 ;;;HAVE WE HIT THE I/O PAGE? .IFF ;M$$EXT .IF DF M$$MGE ADD #40,@#KISAR6 ;;;ADJUST DUMP TRACKING POINTER CMP #7600,@#KISAR6 ;;;HAVE WE HIT THE I/O PAGE? .IFF ;M$$MGE ADD #4000,R5 ;;;ADJUST DUMP TRACKING POINTER CMP #160000,R5 ;;;HAVE WE HIT THE I/O PAGE? .ENDC ;M$$MGE .ENDC ;M$$EXT BEQ $CRCMP ;;;IF EQ YES, DUMP IS DONE TST (R5) ;;;DOES FIRST WORD OF NEXT TRANSFER? BCC 50$ ;;;IF CC YES BR $CRCMP ;;;IF CS NO, DUMP IS DONE 80$: -670,,/;MSH039/ .IFF .IF DF M$$MGE MOV #124.*4,-(SP) ;;;DUMP MAXIMUM 124.K WORDS .IFF MOV #28.*4,-(SP) ;;;DUMP MAXIMUM 28.K WORDS .ENDC -681,681,/;MSH039/ BMI WERRX ;;;IF MINUS I/O ERROR -688,688,/;MSH039/ BMI WERRX ;;;IF MINUS I/O ERROR -715,715,/;MSH039/ BMI WERRX ;;;IF MINUS I/O ERROR -723,,/;MSH039/ DEC (SP) ;;;DECREMENT MAXIMUM BLOCK DUMP BLE 72$ ;;;IF EQ, DUMP IS DONE -750,750,/;MSH039/ BEQ WERRX ;;;IF EQ, I/O ERROR 72$: TST (SP)+ ;;;CLEAN STACK BR $CRCMP ;;;DUMP DONE WERRX: TST (SP)+ ;;;CLEAN STACK -879,879,/;MSH058/ TST 2(R0) ;;;RESET RBUF -969,975,/;MSH059/ 100$: MOV #<1$+12>,R5 ;;;WE NOW COMPUTE ADDRESS OF COMMAND BIC #3,R5 ;;;BUFFER. (NEEDS DOUBLE WORD BOUND) MOV #8.,-(R5) ;;;LENGTH OF COMMAND PACKET ADDRESS CLR -(R5) ;;;UPPER 2 BITS OF COMMAND PACKET MOV #2$,-(R5) ;;;LOW ORDER 16 BITS MOV #100004,-(R5) ;;;WANT TO WRITE CHARACTERISTICS MOV R5,R4 ;;;COPY POINTER TO COMMAND PACKET ;;;R4=R5 IS FLAG THAT TS11 IS ;;;BEING INITIALIZED (SEE 180$) -978,978,/;MSH059/ -980,980,/;MSH059/ MOV #142010,(R5) ;;;REWIND AND CLEAR VOLUME CHECK -982,982,/;MSH059/ -984,984,/;MSH113/ .IF DF M$$EXT MOV #20000,(R5)+ ;;;POINT BUFFER TO SECOND UMR .IFF CLR (R5)+ ;;;START AT LOCATION 0 .ENDC -986,986,/;MSH059/ MOV #512.,(R5) ;;;NUMBER OF BYTES IN A RECORD -992,993,/;MSH113/ CLR @#UBMPR+4 ;;;INITIALIZE UMR TO ADDRESS 0 CLR @#UBMPR+6 ;;; -994,994,/;MSH059/ -997,998,/;MSH059/ MOV #<1920./4>,R3 ;;;MAX NUMBER OF 4K WORD BLOCKS 40$: MOV #<1024.*4*2/512.>,R2 ;;;MAX NUMBER OF 512 BYTE RECORDS/BLK -1002,1002,/;MSH059/ MOV #<124.*4>,R2 ;;;MAX NUMBER OF 4K WORD BLOCKS -1006,1006,/;MSH059/ 50$: MOV #9.,R5 ;;;RETRY COUNT+1 CALL 200$ ;;;ISSUE WRITE AND WAIT -1015,1017,/;MSH113/ ADD #<1024.*4*2>,@#UBMPR+4 ;;;BUMP ADDRESS OF UMR BY ADC @#UBMPR+6 ;;; 4K WORDS MOV #20000,2(R4) ;;;REINITIALIZE POINTER WITHIN 4K ;;; WINDOW TO START OF UMR 1 -1019,1029,/;MSH059/ BNE 40$ ;;;IF NE BLOCK LIMIT NOT REACHED .IFTF ; ; NOTE THAT THE FOLLOWING BRANCH IS NEVER TAKEN IF 180$ IS FALLEN ; INTO (R5 IS NEVER EQUAL TO R4, BECAUSE R5 IS A RETRY COUNT AND ; R4 IS AN ADDRESS, UNLESS 180$ IS BRANCHED TO FROM BELOW). ; 180$: CMP R4,R5 ;;;IS TS11 BEING INITIALIZED BEQ 280$ ;;;IE EQ YES, ERROR EXIT MOV #100011,(R4) ;;;WANT TO FORMAT (WRITE TAPE MARK) MOV R4,(R1) ;;;ISSUE COMMAND 190$: TSTB (R0) ;;;SUBSYSTEM READY? BPL 190$ ;;;IF PL NO BR $CRCMP ;;;SUCCESSFUL TERMINATION 200$: ;;;REF LABEL .IFT MOV R3,-(SP) ;;;SAVE BLOCK COUNTER .IFTF 210$: MOV R4,(R1) ;;;ISSUE COMMAND -1032,1032,/;MSH059/ MOV (R0),R3 ;;;GET STATUS -1033,,/;MSH059/ .IFT MOV (SP)+,R3 ;;;RESTORE BLOCK COUNTER .ENDC BIC #1000,(R4) ;;;CLEAR WRITE DATA RETRY BIT -1037,1056,/;MSH059/ BNE 180$ ;;;IS NE YES BIT #4000,R3 ;;;NONEXISTANT MEMORY BNE 180$ ;;;IF NE YES BIC #^C<16>,R3 ;;;ISOLATE TERMINATION CODE CMP #12,R3 ;;;RECOVERABLE ERROR (TAPE NOT MOVE)? BEQ 270$ ;;;IF EQ YES CMP #10,R3 ;;;RECOVERABLE ERROR (TAPE MOVE ONE)? BNE 280$ ;;;IS NE NO, I/O ERROR BIS #1000,(R4) ;;;CHANGE COMMAND TO SPACE REVERSE, ;;; ERASE, WRITE DATA 270$: DEC R5 ;;;EXHAUSTED RETRY COUNT? BNE 210$ ;;;IF NE NO 280$: TST (SP)+ ;;;DISCARD RETURN ADDRESS /