.TITLE SNAP .IDENT /V1.2/ ; ;+ ; ; SNAP - SNAPSHOT DUMP OF AN ACTIVE TASK ; ; L. M. BAKER ; U. S. GEOLOGICAL SURVEY ; OFFICE OF EARTHQUAKE STUDIES ; 345 MIDDLEFIELD ROAD ; MENLO PARK, CA 94025 ; (415) 323-8111 X2703 ; ; AUGUST 25, 1979 ; ; MODIFICATIONS: ; ; 31-DEC-79 DO NOT DEALLOCATE PACKET IF PMD ALREADY ACTIVE ; 9-FEB-80 FIX VERTICAL FORMAT CONTROL FOR OUTPUT (V3.2) ; ; ; SNAP ISSUES THE EQUIVALENT OF A SNAP$ MACRO ON BEHALF OF THE ; SPECIFIED TASK BY DIRECTLY INSERTING THE SNAP MESSAGE BLOCK INTO ; PMDS RECEIVE LIST BEFORE REQUESTING PMD (SEE THE TASK BUILDER ; REFERENCE MANUAL, SECTION 9.2). ; ; PMD MANUALLY DEQUEUES ANY SNAP REQUESTS DIRECTLY FROM ITS RECEIVE ; QUEUE IN ITS TCB WITHOUT USING ANY RECEIVE DIRECTIVES, ASTS, ETC. ; ; NOTE: SNAP DOES NOT CHECK FOR TASK ACTIVE -- PMD THROWS AWAY ; THE SNAP REQUEST IF IT IS NOT. ALSO, SNAP SENDS EVENT FLAG -1 TO ; PMD, WHICH CAUSES NO EVENT FLAGS IN THE TASK TO BE DISTURBED. ; THE TASK IS STILL STOPPED AND RESTARTED PROPERLY FOR THE DUMP. ; ; UNDER NO CIRCUMSTANCES SHOULD PMD ITSELF BE SNAPPED. THE CODE ; EXPLICITLY CHECKS FOR THIS AND DISSALLOWS IT. THERE IS ANOTHER ; TABLE WHICH MAY BE MODIFIED TO RESTRICT THE TASK NAMES THAT NON- ; PRIVILEGED USERS MAY SNAP, DUE TO OTHER SYSTEM CONSIDERATIONS. ; FOR EXAMPLE, SYSTEM DAEMONS THAT ASSUME THE TI: AND UIC OF THE ; SENDER OF A MESSAGE, OR MCR ITSELF WHICH LOOKS LIKE IT BELONGS ; TO THE TERMINAL LAST SERVICED. ; ; ; COMMAND LINE FORMAT: ; ; >SNAP [DDNN:=]TASKNAME/SW OR >SNAP /HELP ; ; IF NO DEVICE IS SPECIFIED, TI: IS SUPPLIED AS THE DEFAULT. ; NOTE: PMD ALWAYS WRITES INTO DIRECTORY [1,4] AND SPOOLS W/DELETE. ; ; IF NO TASKNAME IS SPECIFIED, TTNN IS SUPPLIED AS THE DEFAULT. ; IF THE SEARCH FAILS AND THE TASK NAME IS 3 CHARACTERS, TNN IS ; APPENDED, AND FINALLY ...TASKNAME IS TRIED. ; ; AVAILABLE SWITCHES ARE: ; ; /HE PRINT HELP MESSAGE ; ; /HD PRINT THE DUMP HEADER ; /LU PRINT INFORMATION ON ALL ASSIGNED LUNS ; /OV PRINT INFORMATION ABOUT ALL LOADED OVERLAY SEGMENTS ; /ST PRINT THE USER STACK ; /ID:N SNAPSHOT IDENTIFICATION NUMBER ; /LI: PRINT THE CONTENTS OF MEMORY WHERE IS ; UP TO FOUR PAIRS OF MEMORY BLOCKS SPECIFIED AS ; LOW:HIGH MEMORY ADDRESSES ; /WR OR /R5 PRINT THE REQUESTED MEMORY IN OCTAL WORDS AND RAD50 ; /BY OR /AS PRINT THE REQUESTED MEMORY IN OCTAL BYTES AND ASCII ; ; IF NO FORMAT IS SPECIFIED, /WR IS THE DEFAULT ; ; THE DEFAULT SWITCH SETTINGS ARE: ; ; /HD/LU/OV/ST/ID:0/-LI ; ; ASSEMBLY INSTRUCTIONS: ; ; MAC>SNAP,SNAP/-SP=[1,1]EXEMC/ML,[200,200]RSXMC/PA:1,[G,M]SNAP ; ; BUILD INSTRUCTIONS: ; ; >TKB ; TKB>SNAP/PR/-FP/MM/-SE,SNAP/-SP=SNAP ; TKB>[1,24]MCR/LB,[1,54]RSX11M.STB/SS,[1,1]EXELIB/LB ; TKB>/ ; ENTER OPTIONS: ; TKB>STACK=32 ; TKB>PRI=100 ; TKB>UNITS=1 ; TKB>ASG=TI:1 ; TKB>TASK=...SNA ; TKB>// ; ;- ; ;TEST=0 ; TEST VERSION, NO PMD... REQUEST .PAGE .MCALL HWDDF$,TCBDF$,UCBDF$ HWDDF$ ; DEFINE SYSTEM FEATURES MASK BITS TCBDF$ ; DEFINE TASK CONTROL BLOCK OFFSETS UCBDF$ ; DEFINE UNIT CONTROL BLOCK OFFSETS .MCALL SNPDF$,SNPBK$,GMCR$,ALUN$,GLUN$,DIR$,EXIT$S ; ; MACRO TO PRINT AN ERROR MESSAGE AND EXIT ; .MACRO ERROR MESSAGE .PSECT MSGTXT,RO .NCHR MSGLEN, MSGADR=. .ASCII /MESSAGE/ .EVEN .PSECT SNAP MOVB MSGADR,R2 ; CARRIAGE CONTROL IN R2 MSGADR=MSGADR+1 MSGLEN=MSGLEN-1 MOV #MSGADR,R0 ; MESSAGE ADDRESS IN R0 MOV #MSGLEN,R1 ; LENGTH IN R1 JMP PRTERR ; AND GO PRINT IT .ENDM .PSECT ; ; LOCAL SYMBOLS: ; ERRLUN = 1 ; ERROR MESAGE LUN (TI:) TMPLUN = 2 ; TEMP LUN FOR CHASING REDIRECTS ; ; LOCAL DATA: ; DOTS: .RAD50 /.../ ; PREFIX OF TASKNAME FOR ...XXX SEARCH TNN: .WORD 0 ; TO HOLD RAD50 TNN TSKR50: .BLKW 2 ; TASK NAME IN RAD50 BADNAM: .RAD50 /...MCR/ ; TABLE OF TASKS THAT NON-PRIVILEGED .RAD50 /PRT.../ ; USERS MAY NOT SNAP, EVEN THOUGH THEY ; LOOK OWNED BY THE TERMINAL. BADNUM = <.-BADNAM> / 4 ; NUMBER OF ENTRIES IN THE BAD NAME TABLE PMDTCB: .WORD 0 ; PMD... TCB ADDRESS TSKTCB: .WORD 0 ; TASK TCB ADDRESS TIUCB: .WORD 0 ; SNAP TI: UCB ADDRESS TKUCB: .WORD 0 ; TASK TI: UCB ADDRESS LOCKFL: .WORD 0 ; SYSTEM LISTS LOCKED FLAG SNDPKT: .WORD 0 ; ADDRESS OF SEND PACKET PMDERR: .WORD 0 ; PMD... REQUEST ERROR FLAG MCRBUF: GMCR$ ; GET MCR DPB AND COMMAND LINE BUFFER ENDC: .WORD 0 ; ADDRESS OF COMMAND LINE TERMINATOR GETLUN: GLUN$ ERRLUN,GLNBUF ; GET TI: LUN DPB GLNBUF: .BLKW 6 ; RECEIVE AREA FOR TI: GET LUN DIRECTIVE LASTB =. ; AND DEFAULT TASKNAME (TTNN) CONSTRUCTION MORE = - LASTB ; NEED ROOM FOR ASCII TTNN .IIF GT MORE .BLKB MORE .EVEN ENDTTN: .WORD 0 ; ADDRESS OF TTNN TERMINATOR ASNTMP: ALUN$ TMPLUN,TI,0 ; ASSIGN LUN FOR CHASING REDIRECTS GETTMP: GLUN$ TMPLUN,TMPBUF ; GET LUN FOR SPECIFIED DEVICE TMPBUF: .BLKW 6 ; GET LUN INFO FOR SPECIFIED DEVICE ; ;+ ; ; PMD... SEND DATA PACKET FORMAT: ; ; 0 LINK WORD ; 1 SENDER TASK NAME (FIRST HALF) ; 2 SENDER TASK NAME (SECOND HALF) ; 3 SEND DATA WORD 0 (PMD... CONTROL WORD) ; 4 1 (SNAP DEVICE NAME) ; 5 2 (DEVICE UNIT NUMBER AND UNUSED BYTE) ; 6 3 (EVENT FLAG NUMBER) ; 7 4 (SNAPSHOT IDENTIFICATION WORD) ; 10 5 (DUMP ADDRESS LIMITS) ; 11 6 ; 12 7 ; 13 10 ; 14 11 ; 15 12 ; 16 13 ; 17 14 ; 20 NOT USED ; 21 ; 22 ; ;- ; SNPDF$ DEF$G ; DEFINE SNAP DUMP CONTROL BITS GLOBALLY SNPCTL==SC.HDR!SC.LUN!SC.OVL!SC.STK ; DEFAULT SNAP DUMP CONTROL WORD: ; PRINT DUMP HEADER (SC.HDR) ; PRINT ASSIGNED LUNS (SC.LUN) ; PRINT LOADED OVERLAYS (SC.OVL) ; PRINT USER STACK (SC.STK) FORMAT::.WORD SC.WRD ; DUMP IN WORD FORMAT IF /LI: ; IS SPECIFIED WITH NO FORMAT ; SNAP BLOCK TEMPLATE FOR SEND DATA, AND "PMD..." IN RAD50 SNAPBK::SNPBK$ NL,0,SNPCTL,-1,0,0,0,0,0,0,0,0,0 PMDMSG: .BLKW ; MESSAGE BLOCK FOR SEND DATA .PAGE .ENABLE LC .ENABLE LSB .PSECT SNAP,RO SNAP:: CLR LOCKFL ; SYSTEM LISTS UNLOCKED ON ENTRY MOV $TKTCB,R0 ; GET OUR TCB ADDRESS MOV T.UCB(R0),TIUCB ; SAVE OUR TI: UCB ADDRESS DIR$ #GETLUN ; GET OUR TI: DEVICE AND UNIT NUMBER MOV GLNBUF+G.LUNA,SNAPBK+SB.DEV ; STORE IN SNAP BLOCK MOVB GLNBUF+G.LUNU,SNAPBK+SB.UNT ; AS DEFAULTS MOV #SNAPBK,R1 ; ADDRESS OF TEMPLATE MOV #PMDMSG,R2 ; ADDRESS OF MESSAGE MOV #,R3 ; NUMBER OF WORDS TO COPY 5$: MOV (R1)+,(R2)+ ; INITIALIZE DEFAULT MESSAGE SOB R3,5$ ; UNTIL DONE ; ; CONSTRUCT DEFAULT TASK NAME TTNN IN GET LUN BUFFER ; MOV #GLNBUF+G.LUNA+2,R0 ; POINT JUST PAST ASCII DEVICE NAME MOVB GLNBUF+G.LUNU,R1 ; GET UNIT NUMBER TO CONVERT CLR R2 ; SUPPRESS LEADING ZEROS CALL $CBDMG ; AND CONVERT TO ASCII (MAX 2 CHARS) CLRB (R0) ; NULL TERMINATE TO STOP RAD50 CONVERSION MOV R0,ENDTTN ; SAVE ADDRESS OF TERMINATOR ; ; CONVERT "TNN" PART OF "TTNN" TO RAD50 FOR XXXTNN ; MOV #GLNBUF+G.LUNA+1,R0 ; POINT TO TNN IN GET LUN BUFFER CLR R1 ; NO PERIODS ALLOWED CALL $CAT5 ; AND CONVERT TO RAD50 MOV R1,TNN ; SAVE IN TNN FOR LATER ; ; GET COMMAND LINE ; DIR$ #MCRBUF ; GET MCR COMMAND LINE BCC 10$ ERROR < SNAP -- Get command line failure> 10$: MOV #MCRBUF+G.MCRB,R0 ; ADDRESS OF COMMAND LINE BUFFER MOV $DSW,R1 ; BYTE COUNT (EXCLUDING TERMINATOR) MOV R0,ENDC ; SAVE ADDRESS OF TERMINATOR ADD R1,ENDC 20$: CMPB (R0),#<' > ; SKIP SNA[...] BEQ 24$ CMPB (R0)+,#'/ ; SNA/... IS ILLEGAL (SEE 29$:) BEQ SYNERR SOB R1,20$ ; FOR AS MANY CHARACTERS AS ENTERED ; ; NO COMMAND ENTERED, USE DEFAULT TASK NAME TTNN IN GET LUN BUFFER ; MOV #GLNBUF+G.LUNA,R0 ; POINT TO ASCII TTNN MOV ENDTTN,ENDC ; END OF COMMAND IS NOW THE NULL BR 30$ ; CONTINUE THE PARSE 24$: INC R0 ; SKIP THE BLANK DEC R1 ; AND DECREMENT LOOP COUNTER MOV R0,R2 ; COPY START OF COMMAND 25$: CMPB (R2)+,#'= ; EQUAL SIGN FOUND? BEQ 26$ ; YES, PARSE FOR OUTDEV SOB R1,25$ ; UNTIL DONE BR 27$ ; NO OUTDEV, PARSE INPUT 26$: MOV R2,R1 ; R0 = START; R1 = @"=" + 1 CALL OUTCSI ; PARSE AND FILL IN OUTDEV BCS SYNERR ; IF CS, SYNTAX ERROR MOV R1,R0 ; R0 = START OF INPUT PARSE CMP R1,ENDC ; ANY MORE AFTER THE "="? BEQ 28$ ; NO, USE DEFAULT "TTNN" 27$: CMPB (R0),#'/ ; TASK NAME ENTERED? BNE 30$ ; YES, USE IT ; ; NO TASK NAME ENTERED, LOAD DEFAULT TASK NAME "TTNN" OVER "SNA... " ; 28$: MOV ENDTTN,R1 ; BACKWARDS WRITE TTNN BEFORE THE "/" 29$: MOVB -(R1),-(R0) ; OVER WHERE "SNA " WAS (THAT'S WHY CMP R1,#GLNBUF+G.LUNA ; "SNA/..." IS ILLEGAL) BGT 29$ ; UNTIL WE HIT THE INITIAL "T" OF "TTNN" ; ; CONVERT TASK NAME TO RAD50 ; 30$: CLR TSKR50+2 ; ASSUME LESS THAN 4 CHARACTERS ENTERED MOV #1,R1 ; ACCEPT PERIODS IN TASK NAMES CALL $CAT5 ; CONVERT FIRST 3 CHARS TO RAD50 MOV R1,TSKR50 ; AND SAVE THEM BCS 31$ ; SKIP NEXT 3 IF TERMINATOR FOUND MOV #1,R1 CALL $CAT5 MOV R1,TSKR50+2 ; SAVE NEXT 3 RAD50 CHARS BCC 32$ ; ALL SIX CONVERTED OK 31$: DEC R0 ; BACK UP BUFFER POINTER IF TERMINATOR FOUND ; ; R0 = ADDRESS OF FIRST SWITCH OR TERMINATOR ; 32$: CMP R0,ENDC ; BYPASS SWITCH PARSING IF ALREADY AT BEQ 40$ ; END OF COMMAND CMPB (R0),#'/ ; MUST BE NO FILESPEC PART FOR CSI BNE SYNERR ; IF NE, ERROR ; ; USE CSI ROUTINES TO PARSE SWITCHES AS IF NO FILESPEC REQUIRED ; MOV ENDC,R1 ; R0 = START; R1 = @END + 1 CALL INCSI ; CSI PARSE THE SWITCHES AND SET UP ; PMD MESSAGE BLOCK BCC 40$ ; NO ERRORS, CONTINUE SYNERR: ERROR < SNAP -- Syntax error> ; ; SEARCH SYSTEM TASK DIRECTORY FOR SPECIFIED TASK ; 40$: MOV #TSKR50,R3 ; ADDR OF RAD50 TASK NAME FOR TABLE SEARCH CALL $LOCKL ; LOCK THE SYSTEM LISTS INC LOCKFL ; SHOW LISTS ARE LOCKED FOR PRTERR CALL $SRSTD ; SEARCH THE SYSTEM TASK DIRECTORY BCC 50$ TST TSKR50+2 ; LESS THEN THREE CHARS IN TASKNAME? BNE 45$ ; NO, ERROR MOV TNN,TSKR50+2 ; ADD TNN TO THE END CALL $SRSTD ; FOUND XXXTNN? BCC 50$ ; YES MOV TSKR50,TSKR50+2 ; NO, MOVE NAME OVER MOV DOTS,TSKR50 ; AND PUT DOTS IN FRONT CALL $SRSTD ; AND TRY AGAIN BCC 50$ ; IF CC, GOT IT THIS TIME 45$: ERROR < SNAP -- Task not in system> 50$: MOV R0,TSKTCB ; SAVE TASK TCB ADDRESS MOV T.UCB(R0),TKUCB ; SAVE TASK TI: UCB ADDRESS ; ; FILTER OUT NON-PRIVILEGED USERS SNAPPING OTHERS TASKS ; BIT #FE.MUP,$FMASK ; IS MULTI-USER PROTECTION SUPPORTED? BEQ 58$ ; NO MOV TIUCB,R0 ; RETRIEVE TI: UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; ARE WE PRIVILEGED? BNE 58$ ; YES CMP TKUCB,R0 ; DOES USER OWN TASK (TI:'S MATCH)? BNE 55$ ; NO MOV #BADNUM,R1 ; GET COUNT OF ILLEGAL TASK NAMES BEQ 58$ ; THERE ARE NONE MOV #BADNAM,R0 ; GET ADDR OF ILLEGAL TASK NAMES MOV TSKR50,R2 ; FIRST HALF OF REQUESTED TASK NAME MOV TSKR50+2,R3 ; SECOND HALF 53$: CMP (R0)+,R2 ; MATCH FIRST HALF? BNE 54$ ; NO, BUMP R0 AND TRY FOR MORE CMP (R0),R3 ; MATCH SECOND HALF? BEQ 55$ ; YES, ERROR 54$: TST (R0)+ ; BUMP BAD NAME POINTER SOB R1,53$ ; UNTIL DONE BR 58$ ; NOT AN ILLEGAL NAME, CONTINUE 55$: ERROR < SNAP -- Task not yours> ; ; SEARCH SYSTEM TASK DIRECTORY FOR PMD... ; 58$: MOV #SNAPBK+SB.PMD,R3 ; SEARCH FOR PMDS TCB AS WELL CALL $SRSTD BCC 60$ ERROR < SNAP -- PMD... not in system> 60$: MOV R0,PMDTCB ; SAVE PMDS TCB CMP TSKTCB,PMDTCB ; *** MUST NOT SNAP PMD... *** BNE 65$ ERROR < SNAP -- That's a NO-NO> ; ; ALLOCATE A SEND DATA PACKET ; 65$: CLR SNDPKT ; ASSUME NO PACKETS AVAILABLE CALL $SWSTK,100$ ; SWITCH TO SYSTEM STATE CALL $ALPKT ; ALLOCATE A SEND PACKET BCS 70$ ; FAILURE, LEAVE ADDRESS ALONE MOV R0,SNDPKT ; SAVE SEND PACKET ADDRESS 70$: RETURN ; RETURN FROM SYSTEM STATE 100$: MOV SNDPKT,R0 ; RETRIEVE SEND PACKET ADDRESS BNE 110$ ERROR < SNAP -- Send packet allocation failure> ; ; FILL SEND PACKET USING SNAP BLOCK INFO ; 110$: MOV R0,R1 ; COPY PACKET ADDRESS FOR $EXRQF TST (R0)+ ; SKIP PAST THREAD WORD MOV TSKR50,(R0)+ ; COPY FIRST HALF OF TASK NAME MOV TSKR50+2,(R0)+ ; COPY SECOND HALF OF TASK NAME MOV #PMDMSG,R2 ; GET PMDS MESSAGE ADDRESS MOV #,R3 ; NUMBER OF WORDS TO COPY 120$: MOV (R2)+,(R0)+ ; FILL REMAINDER OF SEND PACKET SOB R3,120$ ; UNTIL DONE .IF DF TEST ; TEST VERSION, NO PMD... REQUEST ;*** CALL PRTPKT ; PRINT THE PACKET MOV #1,PMDERR ; FORCE PACKET DEALLOCATION BR 200$ ; AND DEALLOCATE IT ;*** .ENDC ;DF TEST ; ; QUEUE PACKET TO PMD... AND REQUEST EXECUTION ; CLR PMDERR ; ASSUME NO REQUEST ERRORS MOV PMDTCB,R0 ; RETRIEVE PMD... TCB ADDRESS CALL $SWSTK,200$ ; SWITCH TO SYSTEM STATE CALL $EXRQF ; REQUEST WITH FIFO QUEUE INSERTION BCC 130$ ; IF CC, NO ERRORS BEQ 130$ ; IF Z, TASK IS ALREADY ACTIVE INC PMDERR ; SHOW REQUEST ERROR 130$: RETURN ; RETURN FROM SYSTEM STATE 200$: TST PMDERR ; CHECK FOR ERRORS BEQ 300$ ; IF EQ, NO ERRORS MOV SNDPKT,R0 ; RETRIEVE SEND PACKET ADDRESS CALL $SWSTK,210$ ; SWITCH TO SYSTEM STATE CALL $DEPKT ; AND DEALLOCATE IT RETURN 210$: ERROR < SNAP -- PMD... request failure> ; ; ALL DONE, UNLOCK LISTS AND LET PMD... DO ITS THING ; 300$: CALL $UNLKL ; UNLOCK SYSTEM LISTS CLR LOCKFL ; SHOW LISTS UNLOCKED EXIT: EXIT$S .DSABLE LSB .PAGE ; ;+ ; ; PRTERR - PRINT ERROR MESSAGE AND EXIT ; ; R0 = ADDR OF MESSAGE ; R1 = NUMBER OF CHARACTERS ; R2 = CARRIAGE CONTROL BYTE ; ; UNLOCK SYSTEM LISTS IF LOCKED, ISSUE QIOW$S TO TI:, AND EXIT. ; ;- ; .MCALL QIOW$S PRTERR:: TST LOCKFL ; ARE SYSTEM LISTS LOCKED? BEQ 10$ ; IF EQ, NO CALL $UNLKL ; UNLOCK SYSTEM LISTS ; ISSUE ERROR MESSAGE 10$: QIOW$S #IO.WLB,#ERRLUN,#ERRLUN,,,, BR EXIT ; AND EXIT .IF DF TEST ; TEST VERSION, NO PMD... REQUEST ;*** .PSECT .NLIST BEX .EVEN MSGADR=. TBUF: .ASCII <12>\SEND PACKET:\<15><12><12> W0: .ASCII / /<15><12> W1: .ASCII / /<15><12> W2: .ASCII / /<15><12> W3: .ASCII / /<15><12> W4: .ASCII / /<15><12> W5: .ASCII / /<15><12> W6: .ASCII / /<15><12> W7: .ASCII / /<15><12> W10: .ASCII / /<15><12> W11: .ASCII / /<15><12> W12: .ASCII / /<15><12> W13: .ASCII / /<15><12> W14: .ASCII / /<15><12> W15: .ASCII / /<15><12> W16: .ASCII / /<15><12> W17: .ASCII / /<15><12> W20: .ASCII / /<15><12> W21: .ASCII / /<15><12> W22: .ASCII / /<15><12> MSGLEN=.-MSGADR .EVEN .LIST BEX .PSECT SNAP PRTPKT:: MOV R1,R5 ; PACKET ADDRESS MOV #W0,R0 ; OUTPUT BUFFER STARTING ADDRESS CALL CBOMG ; CONVERT LINK WORD TO OCTAL MAGNITUDE CALL C5TA ; CONVERT RAD50 TASK NAME (FIRST HALF) CALL C5TA ; CONVERT RAD50 TASK NAME (SECOND HALF) CALL CBOMG ; CONVERT PMD CONTROL WORD TO OCTAL CALL CDEV ; MOVE ASCII DEVICE NAME MOV #14.,R4 ; 14. OCTAL FIELDS LEFT TLOOP: CALL CBOMG ; CONVERT TO OCTAL MAGNITUDE SOB R4,TLOOP QIOW$S #IO.WLB,#ERRLUN,#ERRLUN,,,,<#MSGADR,#MSGLEN,0> RETURN CBOMG: MOV (R5)+,R1 ; GET LINK WORD MOV #1,R2 ; LEADING ZEROS CALL $CBOMG ; CONVERT TO OCTAL MAGNITUDE BR TRET C5TA: MOV (R5)+,R1 ; RAD50 WORD CALL $C5TA ; CONVERT TO ASCII BR TRET CDEV: MOVB (R5)+,(R0)+ ; MOVE ASCII DEVICE NAME MOVB (R5)+,(R0)+ TRET: ADD #2,R0 ; POINT TO NEXT OUTPUT FIELD RETURN ;*** .ENDC ;DF TEST .PAGE ; ;+ ; ; SNAP CSI PROCESSING ; ; INCST - PARSE INPUT COMMAND ; OUTCSI - PARSE OUTPUT DEVICE STRING ; ; ON ENTRY: ; ; R0 = ADDRESS OF COMMAND TO PARSE ; R1 = ADDRESS OF TERMINATOR CHARACTER ; ; ON EXIT: ; ; INCSI - IF /HELP, NO RETURN ; OUTCSI - IF DEVICE SPECIFICATION ERROR, NO RETURN ; ; ELSE ; ; C = 0, PARSE OK ; C = 1, SYNTAX ERROR ; ; ALL REGISTERS PRESERVED ; ;- ; .MCALL CSI$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND CSI$ ; DEFINE CSI CONTROL BLOCK OFFSETS .PSECT CSIBLK: .BLKB C.SIZE ; ALLOCATE CSI CONTROL BLOCK .EVEN ; SWITCH TABLE MASK BITS HDMSK = SC.HDR ; /HD LUMSK = SC.LUN ; /LU OVMSK = SC.OVL ; /OV STMSK = SC.STK ; /ST IDMSK = 100000 ; /ID:N LIMSK = 40000 ; /LI: WRMSK = SC.WRD ; /WR R5MSK = SC.WRD ; /R5 BYMSK = SC.BYT ; /BY ASMSK = SC.BYT ; /AS HEMSK = 20000 ; /HELP ; CSI SWITCH DESCRIPTOR TABLES INTAB: CSI$SW HD,HDMSK,,SET,NEG CSI$SW LU,LUMSK,,SET,NEG CSI$SW OV,OVMSK,,SET,NEG CSI$SW ST,STMSK,,SET,NEG CSI$SW ID,IDMSK,,,,IDVAL CSI$SW LI,LIMSK,,SET,NEG,LIVAL CSI$SW WR,WRMSK,,SET CSI$SW R5,R5MSK,,SET CSI$SW BY,BYMSK,,SET CSI$SW AS,ASMSK,,SET OUTTAB: CSI$SW HE,HEMSK CSI$ND ; CSI SWITCH-VALUE DESCRIPTOR TABLES IDVAL: CSI$SV OCTAL,,2 CSI$ND LIVAL: CSI$SV OCTAL,,2 CSI$SV OCTAL,,2 CSI$SV OCTAL,,2 CSI$SV OCTAL,,2 CSI$SV OCTAL,,2 CSI$SV OCTAL,,2 CSI$SV OCTAL,,2 CSI$SV OCTAL,,2 CSI$ND .ENABLE LSB .PSECT SNAP INCSI:: CALL $SAVAL ; SAVE ALL REGISTERS MOV R0,R2 ; CSI$1 OVERWRITES R0 FIRST THING SUB R2,R1 ; R1 = LENGTH OF COMMAND LINE MOV R1,R3 ; LOOP COUNTER 10$: CMPB (R0)+,#'= ; MANUALLY SCAN FOR EQUAL SIGN BEQ 900$ ; SYNTAX ERROR IF FOUND SOB R3,10$ ; UNTIL DONE CSI$1 #CSIBLK,R2,R1 ; INITIALIZE CSI COMMAND BLOCK BCS 900$ ; SYNTAX ERROR CSI$2 #CSIBLK,OUTPUT,#INTAB ; PARSE THE SWITCHES BCS 900$ ; SYNTAX ERROR STBITS=CS.EQU!CS.NMF!CS.DIF!CS.DVF!CS.WLD!CS.MOR ; ILLEGAL STATUS BITS BITB #STBITS,CSIBLK+C.STAT ; ALL STATUS BITS ARE ILLEGAL -- BNE 900$ ; ONLY SWITCHES ARE ALLOWED CALL ISHELP ; IS IT /HELP? (IF SO, NO RETURN) BIT #LIMSK,CSIBLK+C.MKW1 ; DUMP MEMORY? BNE 20$ ; YES, CHECK LIMITS BIT #WRMSK!R5MSK!BYMSK!ASMSK,PMDMSG+SB.CTL ; NO, FORMAT SPECIFIED? BNE 900$ ; YES, SYNTAX ERROR BR 910$ ; NO, CSI HAS ALREADY SET EVERYTHING UP 20$: BIT #WRMSK!R5MSK!BYMSK!ASMSK,PMDMSG+SB.CTL ; FORMAT SPECIFIED? BNE 30$ ; YES, USE IT BIS FORMAT,PMDMSG+SB.CTL ; NO, USE THE DEFAULT 30$: MOV #4,R0 ; LOOP COUNTER MOV #PMDMSG+SB.LM1,R1 ; POINT TO FIRST LOW MEMORY LIMIT CLR R2 ; ASSUME NO LIMITS SPECIFIED 35$: CMP 2(R1),(R1) ; LIMITS INCREASING? BLOS 50$ ; NO, STOP HERE INC R2 ; SHOW GOOD ONE FOUND ADD #4,R1 ; BUMP POINTER SOB R0,35$ ; UNTIL DONE BR 910$ ; ALL LIMITS PASSED 50$: TST R2 ; ANY LIMITS FOUND? BEQ 900$ ; NO, SYNTAX ERROR 55$: CLR (R1)+ ; YES, CLEAR FROM FIRST BAD ONE ON CLR (R1)+ SOB R0,55$ ; ALL REMAINING ENTRIES BR 910$ ; SUCCESSFUL RETURN 900$: SEC ; SET CARRY FOR ERROR BR 920$ 910$: CLC ; CLEAR CARRY FOR SUCCESS 920$: RETURN OUTCSI:: CALL $SAVAL ; SAVE ALL REGISTERS MOV R0,R2 ; COPY R2 SUB R2,R1 ; CONVERT R1 TO BYTE COUNT CSI$1 #CSIBLK,R2,R1 ; INITIALIZE CSI COMMAND BLOCK BCS 900$ ; SYNTAX ERROR CSI$2 #CSIBLK,OUTPUT,#OUTTAB ; PARSE THE OUTPUT DEVICE STRING BCS 900$ ; SYNTAX ERROR STBITS=CS.NMF!CS.DIF!CS.WLD!CS.MOR ; ILLEGAL STATUS BITS BITB #STBITS,CSIBLK+C.STAT ; VALIDATE DEVICE NAME BNE 900$ ; SYNTAX ERROR CALL ISHELP ; IS IT HELP? (IF SO, NO RETURN) BITB #CS.DVF,CSIBLK+C.STAT ; DEVICE NAME SPECIFIED? BEQ 910$ ; NO, DEFAULT IS ALREADY SET UP MOV CSIBLK+C.DEVD+2,R0 ; POINTER TO DEVICE NAME STRING MOV R0,R3 ; COPY FOR ASNLUN ADD #2,R0 ; POINT PAST DEVICE CALL $COTB ; CONVERT "NN" TO BINARY CMPB #':,R2 ; ":" MUST HAVE STOPPED CONVERSION BNE 900$ ; ELSE SYNTAX ERROR MOVB (R3)+,ASNTMP+A.LUNA ; LOAD "DD" PART MOVB (R3)+,ASNTMP+A.LUNA+1 MOV R1,ASNTMP+A.LUNU ; AND UNIT NUMBER DIR$ #ASNTMP ; ASSIGN DDNN TO TEMP LUN FOR REDIRECTS BCC 110$ ERROR < SNAP -- Device specification error> ; ; CHASE DOWN REDIRECTS AND ASNS IN EFFECT FOR THIS TI: ; 110$: DIR$ #GETTMP ; GET REDIRECTED DEVICE INFO MOV TMPBUF+G.LUNA,PMDMSG+SB.DEV ; LOAD "DD" PART INTO PMD MESSAGE MOVB TMPBUF+G.LUNU,PMDMSG+SB.UNT ; LOAD "NN" PART INTO PMD MESSAGE BR 910$ ; SUCCESSFUL RETURN .DSABLE LSB .PAGE ; ; DETERMINE IF /HELP WAS TYPED ; ISHELP:: BIT #HEMSK,CSIBLK+C.MKW1 ; /HELP? BNE HELP ; YES, PRINT HELP AND EXIT RETURN ; NO, RETURN TO CALLER ; ; /HELP MESSAGE PRINTER ; .PSECT MSGTXT,RO .NLIST BEX MSGADR=. .ASCII <12>\SNAP requests PMD to take a snapshot dump of a running task\<15> .ASCII <12><12>\Command format: >SNAP [ddnn:=]taskname/SW OR >SNAP /HELP\<15> .ASCII <12><12>\Available switches:\<15> .ASCII <12><12>\ /HE Print this message\<15> .ASCII <12>\ /[NO]HD Print the dump header\<15> .ASCII <12>\ /[NO]LU Print information on all assigned luns\<15> .ASCII <12>\ /[NO]OV Print information about all loaded overlay segments\<15> .ASCII <12>\ /[NO]ST Print the user stack\<15> .ASCII <12>\ /ID:N Snapshot identification number\<15> .ASCII <12>\ /[NO]LI: Print the contents of memory where\ .ASCII \ is\<15> .ASCII <12>\ up to four pairs of memory blocks\ .ASCII \ specified as\<15> .ASCII <12>\ low:high (e.g., /LI:20:40:2000:2200)\<15> .ASCII <12>\ /WR OR /R5 Print memory contents\ .ASCII \ in octal words and RAD50\<15> .ASCII <12>\ (default if /LI: is specified)\<15> .ASCII <12>\ /BY OR /AS Print memory contents\ .ASCII \ in octal bytes and ASCII\<15> .ASCII <12><12>\The defaults are:\ .ASCII \ TI:=TTnn/HD/LU/OV/ST/ID:0/NOLI\<15> .ASCII <12><12>\PMD always writes to disk directory [1,4]\ .ASCII \ and automatically spools the output\<15> .ASCII <12>\(See the Task Builder Reference Manual,\ .ASCII \ Chapter 9)\<15> MSGLEN=.-MSGADR .EVEN .LIST BEX .PSECT SNAP HELP:: MOV #MSGADR,R0 ; MESSAGE ADDRESS MOV #MSGLEN,R1 ; LENGTH CLR R2 ; NO CARRIAGE CONTROL JMP PRTERR ; PRINT IT AND EXIT .END SNAP