Google
 

Trailing-Edge - PDP-10 Archives - bb-k345a-sb - dmpfil.mac
There are 6 other files named dmpfil.mac in the archive. Click here to see a list.
	TITLE	DMPFIL - A PROGRAM FOR DUMPING FILES - V 006A(7)
	SUBTTL	DON BLACK/PFC/DBK		5-OCT-70




;COPYRIGHT (C) 1970,1978,1979 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND 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.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.

VDMPFL==6	;MAJOR VERSION NUMBER
VEDIT==7	;EDIT NUMBER
VMINOR==1	;MINOR VERSION NUMBER
VWHO==0		;WHO LAST EDITED

; . . . EDIT HISTORY . . .
; VERSION 6:
;
; EDITS 2 THROUGH 6 ARE IN VERSION 6B(7).  VERSION 6A(7) CONTAINS
; ONLY EDIT # 7, A DATE75 BUG FIX.
;
; EDIT # 7 -	DATE75 FIX.  INSURES DEFAULT CREATION DATE IS USED
;		FOR OUTPUT FILE. AREA AFFECTED: DUMP

	LOC	137
	BYTE	(3)VWHO(9)VDMPFL(6)VMINOR(18)VEDIT
	RELOC

;ACCUMULATOR ASSIGNMENTS

F=0		;FLAGS
CH=1		;CHARACTER FOR I/O TRANSFERS
A=2		;CH+1
T=3		;TEMPORARY ACCUMULATORS
T1=4
T2=5
T3=6
T4=7
CNT=10		;COUNTER
P=11		;PUSHDOWN LIST POINTER

;FLAG BITS IN LEFT HALF OF F

CDET==1		;COLON DETECTED IN COMMAND SWITCH
PDET==2		;PERIOD DETECTED IN COMMAND SWITCH
DSW==4		;D SWITCH SPECIFIED - DEC TAPE DUMP
KSW==10		;K SWITCH SPECIFIED - CORE DUMP
HSW==20		;H SWITCH SPECIFIED - HIGH SEG CORE DUMP
SSW==40		;S SWITCH SPECIFIED - SUPER USETI DISK DUMP
DEVERR==40000	;DEVICE ERROR MESSAGE OUTPUT
SAMELN==100000	;SET IF NEW LINE IN CORE DUMP DIFFERENT FROM PREVIOUS
ASTOUT==200000	;SET IF ASTERISKS ALREADY PRINTED FOR CURRENT OUTPUT SUPPRESSED
DSKFRM==400000	;SET IF SAVE FILE IS IN OLD DISK FORM (3 SERIES MON)
;ASCII CODES

LEFARR==137	;ASCII FOR  LEFT ARROW
CR==15		;           CARRIAGE RETURN
LF==12		;           LINE FEED
SP==40		;           SPACE
SLASH==57	;           SLASH
PERIOD==56	;           PERIOD
COLON==72	;           COLON
FORM==14	;	    FORM FEED
RGTBRK==135	;	    RIGHT BRACKET
ALT==33		;	    ALT-MODE
ALT175==175	;	    ALT-MODE
ALT176==176	;	    ALT-MODE
VTAB==13	;	    VERT. TAB
EQUAL=="="	;	    EQUAL SIGN

;CONSTANTS

EOFBIT==20000	;EOF BIT IN STATUS
DTA==100	;DECTAPE BIT IN DEVICE CHARACTERISTICS
DTAL==200	;LENGTH OF A DECTAPE BLOCK
DIBLOK==^D100	;BLOCK NUMBER OF DECTAPE DIRECTORY
PAGELN==^D60	;NUMBER OF LINES PER PRINTED PAGE
ERRBIT==740000	;ERROR BITS IN STATUS WORD
DUMP:	RESET
	EXTERN	.JBREN
	MOVE	T,[JRST P5B]
	MOVEM	T,.JBREN	;SET UP FOR REENTER COMMAND
	MOVE	P,PDLPT		;SET UP PUSH-DOWN LIST POINTER
	OPEN	0,TTYQ		;OPEN TTY
	HALT	.		;SHOULD NEVER HAPPEN
	PUSHJ	P,CRLF		;OUTPUT CR,LF TO TTY
	MOVEI	CH,"*"
	PUSHJ	P,TTYOUT	;OUTPUT *
	OUTPUT	0,		;MAKE SURE IT GETS DONE
	HRLI	F,0		;CLEAR ALL FLAGS TO START
	MOVEI	T,10
	MOVEM	T,ST1		;SET INPUT MODE TO 10 TO START
	PUSHJ	P,SCAN		;GET INPUT AND OUTPUT UNITS FROM TTY
	OPEN	2,ST2		;OPEN OUTPUT UNIT
	JRST	P6		;CANT OPEN IT
; [EDIT #7] ADD TWO INSTRUCTIONS - INSURE DEFAULT DATE IS USED
	HLLZS	E2		;CLEAR HIGH-ORDER CREATION DATE
	SETZM	E2+1		;CLEAR LOW-ORDER BITS OF CREATION DATE
	ENTER	2,F2		;SET UP PROPER FILE
	JRST	P6A
	OPEN	1,ST1		;OPEN INPUT UNIT
	JRST	P5		;CANT OPEN IT
	TLNE	F,DSW+SSW	;TEST IF DEC TAPE DUMP OR SUPER USETI DUMP
	JRST	DUMP2		;DONT BOTHER WITH LOOKUP IF SO
	LOOKUP	1,F1		;LOCATE PROPER FILE
	JRST	P5A
DUMP2:	DATE	T,		;DATE TO T
	IDIVI	T,^D31		;SETS UP DATE AND TIME IN HEADER MESSAGE
	ADDI	T1,1
	IDIVI	T1,^D10
	ADDI	T1,60
	ROT	T1,7
	ADDI	T2,60
	ADD	T1,T2
	DPB	T1,[POINT 14,DATE,34]	;DAY
	IDIVI	T,^D12
	ADDI	T1,1
	IDIVI	T1,^D10
	ADDI	T1,60
	ROT	T1,7
	ADDI	T2,60
	ADD	T1,T2
	DPB	T1,[POINT 14,DATE,13]	;MONTH
	ADDI	T,^D64
	IDIVI	T,^D10
	ADDI	T,60
	ROT	T,7
	ADDI	T1,60
	ADD	T,T1
	DPB	T,[POINT 14,DATE+1,20]	;YEAR
	TIMER	T,		;TIME OF DAY TO T
	IDIVI	T,^D216000
	IDIVI	T1,^D3600
	IDIVI	T1,^D10
	ADDI	T1,60
	ROT	T1,7
	ADDI	T2,60
	ADD	T1,T2
	DPB	T1,[POINT 14,TIME,34]	;MINUTES
	IDIVI	T,^D10
	ADDI	T,60
	ROT	T,7
	ADDI	T1,60
	ADD	T,T1
	DPB	T,[POINT 14,TIME,13]	;HOURS
	MOVEI	CNT,PAGELN-3		;SET LINE COUNT
	MOVEI	T,^D76
	MOVE	T1,[POINT 7,CW8]
	ILDB	CH,T1
	PUSHJ	P,OUTPUT	;OUTPUT HEADER MESSAGE
	SOJG	T,.-2
	SETZM	MAX
	TLNE	F,DSW
	JRST	DECDMP		;JUMP IF DECTAPE DUMP
	TLNE	F,SSW
	JRST	SUPDMP		;SUPER USETI DISK DUMP
	TLNE	F,KSW+HSW
	JRST	CORDMP		;JUMP IF CORE DUMP
	MOVE	T,D1		;GET INPUT DEVICE
	DEVCHR	T,		;GET ITS CHARACTERISTICS
	MOVE	T1,BLKNUM	;GET STARTING BLOCK NUMBER
	TLNE	T,(2B2)		;SEE IF DISK
	USETI	1,(T1)		;YES--POSITION TO START (/NF)
	PUSHJ	P,PR0		;OUTPUT ONE BLOCK TO OUTPUT UNIT
	JRST	.-1		;GOES TO ENDF AT END OF FILE
PR0:	MOVE	CH,MAX		;TOTAL NUMBER OF BYTES IN THIS BLOCK
	MOVEM	CH,MAX		;SAVE MAXIMUM NUMBER OF BYTES IN BUFFER
	ADDI	CH,7		;EJECT PAGE FIRST
	LSH	CH,-3		;8 WORDS PER LINE
	ADDI	CH,2		;PLUS 2 BLANK LINES
	SUB	CH,CNT		;SEE IF WE MAKE IT
	JUMPL	CH,PR1		;JUMP IF YES
	JUMPE	CH,PR5		;JUMP IF JUST FITS (NO PAGE EJECT)
	MOVEI	CH,FORM		;FORM FEED
	PUSHJ	P,OUTPUT	;OUTPUT IT
PR5:	MOVEI	CNT,PAGELN	;EJECT PAGE AND RESET LINE COUNT
PR1:	MOVEI	T1,8		;8 WORDS PER LINE
PR2:	PUSHJ	P,SPACES	;3 SPACES
	MOVEI	T,^D12		;12 CHARACTERS PER WORD
	PUSHJ	P,INPUT		;GET NEXT INPUT WORD IN CH
	MOVE	A,CH		;MOVE IT TO A
PR3:	MOVEI	CH,0
	ROTC	CH,3		;ROTATE TOP 3 BITS OF A TO CH
	ADDI	CH,60		;CONVERT TO ASCII
	PUSHJ	P,OUTPUT	;OUTPUT THIS CHAR
	SOJG	T,PR3		;LOOP FOR THE WORD
	MOVE	T,IBUF+2
	CAIN	T,1		;SKIP UNLESS THAT WAS LAST WORD OF BUFFER
	JRST	PR4
	SOJG	T1,PR2		;LOOP FOR THE LINE
	PUSHJ	P,OCRLF		;WE MUST INSERT CR,LF
	SOJA	CNT,PR1		;ALWAYS KEEP TRACK OF THE LINE COUNT
PR4:	AOS	T,BLKNUM	;INCREMENT THE BLOCK NUMBER
	CAMLE	T,TERMBK	;COMPARE WITH END
	JRST	ENDF		;YES--EXIT
	PUSHJ	P,OCRLF		;FINISH LINE IF SO, THEN OUTPUT BLANK LINE
	PUSHJ	P,OCRLF
	SUBI	CNT,3		;ACCOUNT FOR 3 LINES


OCRLF:	MOVEI	CH,CR
	PUSHJ	P,OUTPUT	;OUTPUT CR
	MOVEI	CH,LF
	JRST	OUTPUT		;OUTPUT LF AND RETURN WITH POPJ


OOCT:	IDIVI	T,10		;PRINT OCTAL NUMBER IN T
	HRLM	T1,(P)
	SKIPE	T
	PUSHJ	P,OOCT
	HLRZ	CH,(P)
	ADDI	CH,"0"
	JRST	OUTPUT		;IT POPJ'S


P5:	MOVEI	T,ER1		;COMPLAIN ABOUT INPUT DEVICE
	JRST	ERROR
P5A:	MOVEI	T,ER1A		;COMPLAIN ABOUT INPUT FILE
	JRST	ERROR
P6:	MOVEI	T,ER2		;COMPLAIN ABOUT OUTPUT DEVICE
	JRST	ERROR
P6A:	MOVEI	T,ER2A		;COMPLAIN ABOUT OUTPUT FILE

ERROR:	PUSHJ	P,TMES		;ISSUE ERROR MESSAGE
	JRST	DUMP		;GO BACK AND START ALL OVER
ENDF:	TLNE	F,KSW
	JRST	ENDF1		;JUMP IF DOING CORE DUMP
ENDF2:	MOVEI	CH,14
	PUSHJ	P,OUTPUT	;OUTPUT FORM FEED FOR PAGE EJECT
P5B:	RELEASE	1,
	RELEASE 2,
	JRST	DUMP
ENDF1:	SUBI	T3,8		;MUST OUTPUT PARTIAL LINE IN LINBUF
	JUMPE	T3,ENDF2	;JUMP IF EMPTY LINE
	IMULI	T3,^D14		;ELSE MULTIPLY BY 14 CHARS PER WORD
	SUBI	T3,8	;TAKE INTO ACCOUNT ADDRESS (RESULT IS NEGATIVE WD CNT)
	MOVE	T,[POINT 7,LINBUF]
	ILDB	CH,T
	PUSHJ	P,OUTPUT	;OUTPUT THE CHARS
	AOJL	T3,.-2
	PUSHJ	P,OCRLF
	PUSHJ	P,OCRLF
	MOVSI	A,(JRST)
	HRR	A,T1
	CAME	A,T1
	JRST	ENDF2
	HRLZ	A,T1		;T1 CONTAINS JRST SA
	MOVEI	T,CW1
	PUSHJ	P,MES		;OUTPUT MESSAGE NOTING SA
	MOVEI	T,6
EN1:	MOVEI	CH,0		;OUTPUT LINE OF (T) CHARS FROM A
	ROTC	CH,3
	ADDI	CH,60
	PUSHJ	P,OUTPUT
	SOJG	T,EN1
	PUSHJ	P,OCRLF		;FOLLOWED BY CARRIAGE RETURN,LINE FEED
	JRST	ENDF2
SUPDMP:	SETSTS	1,17		;SET DUMP MODE FOR INPUT
	SKIPN	TERMBK
	HLLOS	TERMBK
	MOVE	T3,BLKNUM
	USETI	1,T3
	STATZ	1,ERRBIT	;SEE IF WE ARE SUCCESSFUL
	JRST	SUPERR		;NO--TELL USER
SUPD1:	PUSHJ	P,BLKOUT
	CAMGE	T3,TERMBK
	STATZ	1,EOFBIT
	JRST	ENDF
	AOJA	T3,SUPD1
SUPERR:	MOVEI	T,SUPERM	;COMPLAIN ABOUT USETI FAILURE
	JRST	ERROR

DECDMP:	USETI	1,DIBLOK	;NEXT BLOCK READ WILL BE DIRECTORY
	SUBI	CNT,3		;KEEP UP WITH LINES PRINTED ON THIS PAGE
	MOVEI	T,CW5
	PUSHJ	P,MES		;OUTPUT DIRECTORY HEADER
	MOVEI	T,^D17
	PUSHJ	P,SPACES
	SOJG	T,.-1
	MOVEI	T,CW5A
	PUSHJ	P,MES
	MOVEI	T,6
	PUSHJ	P,SPACES
	SOJG	T,.-1
	MOVEI	T,CW5B
	PUSHJ	P,MES
	MOVSI	CNT,-27
LINE1:	PUSHJ	P,SPACE
	PUSHJ	P,SPACE
	MOVEI	CH,1(CNT)
	PUSHJ	P,TWOCHR	;OUTPUT LINE OF BLOCK NUMBERS
	AOBJN	CNT,LINE1
	MOVEI	CH,RGTBRK
	PUSHJ	P,OUTPUT
	PUSHJ	P,OCRLF
	PUSHJ	P,OCRLF
	INPUT	1,COMLST	;READ THE DIRECTORY
	PUSHJ	P,CHKIN		;CHECK FOR INPUT ERRORS
	MOVE	T3,[POINT 5,DATAB]
	MOVEI	CNT,1		;CNT IS CURRENT FILE NUMBER (1-26)
LINE:	PUSHJ	P,SPACE		;OUTPUT ONE SPACE
	MOVE	CH,CNT
	PUSHJ	P,TWOCHR	;OUTPUT FILE NUMBER
	PUSHJ	P,SPACE2	;AND 2 SPACES	
	MOVE	A,DATAB+^D82(CNT)	;THIS FILE NAME
	MOVEI	T2,6
	PUSHJ	P,SIXOUT	;OUTPUT FILE NAME
	PUSHJ	P,SPACE		;OUTPUT A SPACE
	MOVE	A,DATAB+^D82+^D22(CNT)		;THIS EXT
	MOVEI	T2,3
	PUSHJ	P,SIXOUT
	PUSHJ	P,SPACE		;OUTPUT A SPACE
	MOVEI	T2,30
	PUSHJ	P,BLKBYT	;OUTPUT FILE INDEX FOR NEXT 30 BLOCKS OT THE TAPE
	CAIG	CNT,25
	AOJA	CNT,LINE	;LOOP FOR 26 LINES (26 FILES)
	MOVEI	T2,30
	AOJ	CNT,
	PUSHJ	P,LINE2	;NOW FINISH THE INDECES FOR BLOCKS NOT YET PRINTED
	MOVEI	T2,30
	AOJ	CNT,
	PUSHJ	P,LINE2		;SECOND LINE
	MOVEI	T2,2
	AOJ	CNT,
	PUSHJ	P,LINE2		;PLUS ONE LEFT OVER
	PUSHJ	P,OCRLF
	PUSHJ	P,OCRLF
	PUSHJ	P,P7A+1		;OUTPUT DIRECTORY
	SKIPE	T3,TERMBK
	CAILE	T3,^D577
	MOVEI	T3,^D577
	MOVEM	T3,TERMBK
	SKIPN	T3,BLKNUM	;MOVE FIRST BLOCK NUMBER TO T3
	SETSTS	1,110		;FOR BLOCK 0
	USETI	1,(T3)		;GET NEXT BLOCK
DECD1:	PUSHJ	P,BLKOUT	;OUTPUT THIS BLOCK
	CAMGE	T3,TERMBK	;TEST IF LAST BLOCK
	AOJA	T3,DECD1	;NO, GO BACK FOR MORE
	JRST	ENDF
BLKOUT:	CAIL	CNT,^D20	;SKIP UNLESS FITS ON THIS PAGE
	JRST	DECD2		;EVERYTHING OK
	JUMPE	CNT,DECD1A	;IF CNT IS 0, A PAGE EJECT IS COMING ANYWAY
	MOVEI	CH,FORM		;FORM FEED
	PUSHJ	P,OUTPUT	;PAGE EJECT
DECD1A:	MOVEI	CNT,PAGELN	;RESET LINE COUNT
DECD2:	MOVE	T2,BLANKS
	SUBI	CNT,3
	MOVEI	T,CW6
	PUSHJ	P,MES		;OUTPUT BLOCK HEADER
	MOVE	T,T3
	PUSHJ	P,OOCT		;OUTPUT BLOCK NUMBER
	PUSHJ	P,OCRLF
	TLNN	F,DSW		;SEE IF DECTAPE DUMP
	JRST	P7A		;N0--ALL BLOCKS THE SAME
	JUMPN	T3,P7A		;JUMP IF NOT BLOCK 0 THAT WE JUST DID
	INPUT	1,		;INPUT THE BLOCK
	PUSHJ	P,CHKIN		;CHECK FOR INPUT ERRORS
	MOVEI	T,DTAL		;THIS BLOCK IS 1 WORD SHORT
	MOVEM	T,IBUF+2	;SET CORRECT BLOCK SIZE
	PUSHJ	P,PR1		;OUTPUT IT
	SETSTS	1,116		;IF SO SET NON-STANDARD, DUMP MODE
	POPJ	P,
P7A:	INPUT	1,COMLST
	PUSHJ	P,CHKIN		;CHECK FOR INPUT ERRORS
	MOVE	T,[POINT 36,DATAB]
	MOVEM	T,IBUF+1
	MOVEI	T,DTAL+1
	MOVEM	T,IBUF+2	;SET UP BUFFER HEADER TO LOOK LIKE ORDINARY BLOCK
	JRST	PR1		;ROUTINE OUTPUTS THE BLOCK AND EXITS WITH POPJ

LINE2:	MOVEI	T,5
	PUSHJ	P,SPACES
	SOJG	T,.-1
	PUSHJ	P,SPACE		;SPACES IN FIRST PART OF LINE,
	JRST	BLKBYT		;THEN INTO BLKBYT FOR FILE INDECES

TWOCHR:	IDIVI	CH,10
	SKIPE	CH		;SKIP IF UPPER CHAR IS 0
	ADDI	CH,20		;IF SO LEAVE BLANK
	ADDI	CH,40		;CONVERT TO ASCII
	PUSHJ	P,OUTPUT
	MOVEI	CH,60(A)	;SECOND CHAR
	JRST	OUTPUT		;OUTPUT IT AND RETURN
BLKBYT:	MOVEI	T,CW2
	PUSHJ	P,MES		;OUTPUT LEFT BRACKET
	MOVEI	CH,-1(CNT)	;OUTPUT FOUR CHARACTER OCTAL VALUE
	IMULI	CH,30		;CH=TOTAL NUMBER OF BLOCKS PRINTED SO FAR
	JUMPE	CH,BLK5		;IF 0, SPECIAL CASE
	MOVEI	T,4
	IDIVI	CH,10
	PUSH	P,A		;PUSH DIGITS ONTO STACK
	SOJG	T,.-2
	MOVEI	T,4
BLK3:	POP	P,CH		;POP THEM BACK
	JUMPN	CH,BLK2
	PUSHJ	P,SPACE		;SPACES FOR LEADING ZEROS
	SOJG	T,BLK3		;SINCE NON-ZERO WILL ALWAYS EXIT
BLK4:	POP	P,CH
BLK2:	ADDI	CH,60		;MAKE ASCII NUMBER
	PUSHJ	P,OUTPUT
	SOJG	T,BLK4
	MOVEI	CH,RGTBRK	;RIGHT BRACKET
	PUSHJ	P,OUTPUT
BLK1:	PUSHJ	P,SPACE		;NOW OUTPUT FILE INDECES FOR NEXT (T2) BLOCKS
	PUSHJ	P,SPACE
	ILDB	CH,T3		;T3 CONTAINS BYTE POINTER FOR CURRENT INDEX
BLK6:	PUSHJ	P,TWOCHR	;OUTPUT IT
	SOJG	T2,BLK1
	JRST	OCRLF
BLK5:	PUSHJ	P,SPACES	;OUTPUT 3 LEADING SPACES
	MOVEI	T,CW3		;AND ONE ZERO
	PUSHJ	P,MES
	MOVEI	CH,37
	JRST	BLK6

SIXOUT:	MOVEI	CH,0		;OUTPUT (T2) SIXBIT CHARACTERS FROM TOP OF A
	ROTC	CH,6
	ADDI	CH,40
	PUSHJ	P,OUTPUT
	SOJG	T2,SIXOUT
	POPJ	P,
CORDMP:	SKIPN	TERMBK
	HLLOS	TERMBK
	SETZM	LSTOUT
	MOVE	T,[XWD LSTOUT,LSTOUT+1]
	BLT	T,LSTOUT+7	;ZERO OUT REPEATED LINE TEST BUFFER
	PUSHJ	P,INPUT
	MOVE	T1,CH		;T1=FIRST CONTROL WORD
	TLZ	F,SAMELN+ASTOUT+DSKFRM	;CLEAR SAME LINE AND ASTERISKS PRINTED 
					;AND DSK FORM SAVE FILE FLAGS
	TLNE	F,HSW		;IF FIRST CONTROL WORD IS POSITIVE,
	JRST	HGHDMP		;OR HIGH SEG DUMP, WE HAVE SPECIAL DISK FORM
	JUMPGE	CH,COR1
	HRRZ	T,CH		;START WITH T=CURRENT ADDRESS-1
	SKIPE	T2,BLKNUM
	PUSHJ	P,CSETUP
W1:	PUSHJ	P,WST		;SET UP NEXT ADDRESS IN OUTPUT BUFFER
W2:	PUSHJ	P,NXTWD		;GET NEXT WORD OF CORE
	CAMLE	T,TERMBK
	JRST	ENDF1
	CAME	CH,LSTOUT-1(T3)
	TLO	F,SAMELN  ;SET FLAG IF THIS LINE NOT SAME AS LAST LINE OUTPUT
	MOVEM	CH,LSTOUT-1(T3)	;IN ANY CASE SAVE THIS LINE
	MOVEI	CNT,^D12
	PUSHJ	P,OCTOUT	;MOVE THIS WORD TO LINE BUFFER
	SOJG	T3,W2
	TLZN	F,SAMELN
	JRST	AST		;IF SAME AS LAST LINE PRINTED, DONT REPEAT
	TLZ	F,ASTOUT	;NEW LINE, PRINT IT, CLEAR ASTERISKS PRINTED FLAG
W3:	MOVE	T3,[POINT 7,LINBUF]
	MOVEI	CNT,^D120
	ILDB	CH,T3
	PUSHJ	P,OUTPUT	;OUTPUT LINE BUFFER
	SOJG	CNT,.-2		;LOOP FOR 120 COLUMNS
	PUSHJ	P,OCRLF		;FOLLOWED BY CR,LF
	JRST	W1		;NEXT LINE
AST:	TLOE	F,ASTOUT	;IF ALREADY HAVE PRINTED ASTERISKS,
	JRST	W1		;FORGET THE WHOLE THING
	MOVE	CH,[ASCII /    */]	;ELSE MOVE ASTERISKS TO LINE BUFFER
	MOVEI	CNT,^D24
	MOVEM	CH,LINBUF-1(CNT)
	SOJG	CNT,.-1
	JRST	W3		;THEN BOUNCE OFF TO PRINT THEM
COR1:	MOVEI	T,73		;FIRST LOCATION OF DUMP IS 74
	TLZ	F,KSW		;DENY OUR HERITAGE TO SUPRESS SA= MESS AT END
COR2:	TLO	F,DSKFRM	;SET DISK FORM BIT
	SKIPE	T2,BLKNUM
	PUSHJ	P,CSETUP
	PUSHJ	P,WST		;MOVE FIRST ADDRESS TO OUTPUT BUFFER
	MOVE	CH,T1		;RESTORE FIRST WORD
	AOJA	T,W2+1		;OFFSET FOR MISSING CALL TO NEXTWD, TO MAINSTREAM
CSETUP:	CAIG	T2,1(T)
	POPJ	P,
	PUSHJ	P,NXTWD
	JRST	CSETUP

WST:	MOVE	T2,[POINT 7,LINBUF]
	HRLZI	CH,1(T)		;CH=CURRENT ADDRESS
	MOVEI	CNT,6
	PUSHJ	P,OCTOUT	;MOVE IT TO LINE BUFFER AS ASCII OCTAL DIGITS
	MOVEI	T3,8
	POPJ	P,


HGHDMP:	MOVEI	T,377777	;FIRST WORD OF HIGH SEG DUMP IS 400000
	JRST	COR2


NXTWD:	AOJ	T,		;T=ADDRESS OF WORD RETURNED
	TLNE	F,DSKFRM	;SKIP UNLESS SPECIAL DISK FORM, IN WHICH
	JRST	INPUT		;CASE WE ONLY NEED RETURN NEXT INPUT WORD
N2:	MOVEI	CH,0
	CAIG	T,(T1)
	JRST	N3		;RETURN 0 IF BETWEEN SEGMENTS
	JUMPL	T1,N1		;KEEP GOING IF STILL IN THIS SEGMENT
	PUSHJ	P,INPUT		;GET NEXT CONTROL WORD IF END OF SEGMENT
	MOVE	T1,CH		;SAVE IT IN T1 AND PLUNGE ON
	XOR	CH,[JRST 0]	;IF CONTROL WORD IS JRST, END OF FILE
	TLNE	CH,777777
	JRST	N2		;NO, KEEP GOING
	JRST	ENDF1		;IT IS JRST SA
N1:	AOBJN	T1,INPUT	;BUMP CONTROL WORD, GET NEXT WORD,
	JRST	INPUT		;AND RETURN VIA POPJ IN INPUT



OCTOUT:	PUSHJ	P,XSPACE	;MOVE 2 SPACES TO LINBUF
	MOVE	A,CH		;SAVE WORD IN A WHICH MUST BE CH+1
O1:	MOVEI	CH,0
	ROTC	CH,3
	ADDI	CH,60		;NEXT OCTAL DIGIT IN CH
	IDPB	CH,T2
	SOJG	CNT,O1		;LOOP FOR (CNT) CHARS
	POPJ	P,



XSPACE:	PUSHJ	P,.+1		;PUSHJ TO PUT IN 1 SPACE, THEN POPJ
	MOVEI	A,SP		;TO DO IT AGAIN, THEN RETURN VIA THE POPJ
	IDPB	A,T2
N3:	POPJ	P,
SCAN:	SETZM	F3
	MOVE	T2,[XWD F3,E3]
S0:	BLT	T2,TERMBK	;CLEAR ANY PREVIOUS GARBAGE
	MOVEI	T2,1		;PRESET START TO 1
	MOVEM	T2,BLKNUM	;  IN CASE NO /F
	HRLOI	T2,377777	;PRESET END TO LARGEST NUMBER
	MOVEM	T2,TERMBK	;  IN CASE NO /T
	SETZM	D3		;CLEAR DEVICE NAME
	TLZ	F,CDET+PDET
	MOVE	A,[POINT 7,AS1]
S1:	MOVEI	CNT,6
S1A:	MOVE	T2,[POINT 6,T3]
	SETZ	T3,
S2:	PUSHJ	P,INCHR		;GET NEXT CHARACTER FROM USER
	JUMPE	CH,S2		;IGNORE NULL CHARS
	CAIE	CH,EQUAL	;DO NOT STORE IF EQUAL SIGN
	CAIN	CH,LEFARR	;DO NOT STORE IF LEFT ARROW
	JRST	.+3
	CAIL	CH,40		;DO NOT STORE IF CONTROL CHARACTER
	PUSHJ	P,CHRSTR	;OTHERWISE STORE IN HEADER MESSAGE
	MOVE	T4,[XWD -DISPLN,DISPTB]
SLIST:	HLRZ	T,(T4)		;SEARCH TABLE FOR CHAR IN CH AND DISPATCH
	CAME	T,CH
	AOBJN	T4,SLIST	;ENTER T4= XWD -LENGTH OF TABLE, FWA OF TABLE
	MOVE	T4,(T4)
	JRST	(T4)		;DO IT

DISPTB:	XWD	COLON,COL
	XWD	PERIOD,PER
	XWD	SLASH,SLSH
	XWD	LEFARR,FIN2
	XWD	EQUAL,FIN2
	XWD	CR,FIN1
	XWD	ALT,FIN1
	XWD	ALT175,FIN1
	XWD	ALT176,FIN1
	XWD	FORM,FIN1
	XWD	LF,FIN1
	XWD	VTAB,FIN1
DISPLN=.-DISPTB
	JRST	CHAR		;ANYTHING ELSE


SWCHTB:	XWD	"D",DSWCH
	XWD	"F",SWCHX	;/NF SETS START OF FILE DUMP (DISK ONLY)
	XWD	"K",KSWCH
	XWD	"H",HSWCH
	XWD	"S",SSWCH
	XWD	"T",TSWCH
SWCHLN=.-SWCHTB
	JRST	SYNTAX

CHAR:	CAIL	CH,"0"		;CHECK FOR ALPHANUMERIC
	CAILE	CH,"Z"
	JRST	SYNTAX		;NO
	CAIGE	CH,"A"
	CAIG	CH,"9"
	JRST	.+2
	JRST	SYNTAX		;NO
	SOJL	CNT,SYNTAX
	SUBI	CH,40
	IDPB	CH,T2
	JRST	S2
COL:	TLNN	F,PDET
	TLOE	F,CDET
	JRST	SYNTAX
	MOVEM	T3,D3
	JRST	S1
PER:	TLOE	F,PDET
	JRST	SYNTAX
	MOVEI	CNT,3
	JUMPE	T3,S1A		;IF FILE NAME = 0, DO NOT CHANGE IT
	MOVEM	T3,F3
	JRST	S1A
SLSH:	SETZ	T1,
SLSH2:	PUSHJ	P,INCHR		;GET SWITCH
	PUSHJ	P,CHRSTR
	CAIGE	CH,"0"
	JRST	SLSH3
	CAILE	CH,"7"
	JRST	SLSH3
	ROT	T1,3
	ADDI	T1,-60(CH)
	JRST	SLSH2
SLSH3:	MOVE	T4,[XWD -SWCHLN,SWCHTB]
	JRST	SLIST
SSWCH:	TLO	F,SSW
	JRST	SWCHX
TSWCH:	MOVEM	T1,TERMBK
	JRST	S2
DSWCH:	TLO	F,DSW		;NOTE PRESENCE OF D SWITCH
	MOVEI	CH,116		;SELECT NON-STANDARD MODE FOR  LINK WORDS
	MOVEM	CH,ST1		;SELECT NON-BUFFERED MODE
	JRST	SWCHX		;NUMERIC ARG IS 1ST BLOCK OF DUMP
KSWCH:	TLOA	F,KSW		;K SWITCH REQUESTS CORE DUMP
HSWCH:	TLO	F,HSW		;H SWITCH REQUESTS HIGH SEG CORE DUMP
SWCHX:	MOVEM	T1,BLKNUM	;SAVE NUMERIC ARG
	JRST	S2
FIN2:	TLNN	F,PDET
	JRST	NULEXT
	MOVEM	T3,E3
FIN2A:	SKIPN	T3,D3		;D3 IS OUTPUT DEVICE
	MOVSI	T3,(SIXBIT /LPT/)
	MOVEM	T3,D2		;STORE IN OUTPUT OPEN ARRAY
	MOVE	T3,[XWD F3,F2]
	BLT	T3,E2		;MOVE FILE AND EXT INTO OUTPUT OPEN ARRAY
	MOVE	T3,[XWD AS1,ASNAMF]
	BLT	T3,ASNAMF+2
	SETZM	E3
	MOVE	T2,[XWD E3,AS1]		;WILL ZERO OUT EXT AND AS1
	JRST	S0
NULEXT:	MOVSI	T1,(SIXBIT /LST/)	;DEFAULT EXT IS LST
	MOVEM	T1,E3
	JUMPE	T3,FIN2A	;DON'T CLOBBER FILE NAME IF NULL
	MOVEM	T3,F3
	JRST	FIN2A
FIN1:	TLNN	F,PDET
	JRST	NULEX1
	MOVEM	T3,E3
FIN1A:	SKIPN	T3,D3		;D3 IS INPUT DEVICE
	MOVSI	T3,(SIXBIT /DSK/)
	MOVEM	T3,D1		;MOVE INPUT DEVICE TO OPEN ARRAY
	MOVE	T3,[XWD F3,F1]
	BLT	T3,E1		;MOVE FILE AND EXT INTO INPUT OPEN ARRAY
	MOVE	T3,[XWD AS1,ASNAME]
	BLT	T3,ASNAME+2
	CAIN	CH,CR		;IF CARRIAGE RETURN,
	PUSHJ	P,INCHR		;GET LF OUT OF BUFFER
	MOVSI	T3,(SIXBIT /LPT/)	;CHECK OUTPUT DEFAULTS
	SKIPN	D2
	MOVEM	T3,D2
	MOVSI	T3,(SIXBIT /LST/)
	SKIPN	E2
	MOVEM	T3,E2
	MOVE	T3,F1
	SKIPN	F2
	MOVEM	T3,F2
	POPJ	P,
NULEX1:	SETZM	E3		;CLEAR EXTENSION
	JUMPE	T3,FIN1A
	MOVEM	T3,F3
	JRST	FIN1A

SYNTAX:	POP	P,T		;POP AWAY RETURN WE DONT WANT
	MOVEI	T,ER3		;COMPLAIN ABOUT COMMAND SYNTAX ERROR
	JRST	ERROR

CHRSTR:	IBP	A
	HRRZ	T4,A
	CAIG	T4,AS1+2
	DPB	CH,A		;STORE THE SWITCH
	POPJ	P,
INPUT:	SOSLE	IBUF+2		;CH=NEXT BYTE FROM INPUT UNIT
	JRST	INPUT1
	INPUT	1,
	PUSHJ	P,CHKIN		;CHECK FOR INPUT ERRORS
	GETSTS	1,CH
	TRNE	CH,EOFBIT
	JRST	ENDF
	MOVE	CH,IBUF+2
	MOVEM	CH,MAX
INPUT1:	ILDB	CH,IBUF+1
	POPJ	P,


CHKIN:	STATO	1,ERRBIT	;CHECK FOR ERRORS ON INPUT
	POPJ	P,		;RETURN IF NO ERRORS
	MOVEI	T,ERRINM
	TLON	F,DEVERR	;OUTPUT TO TTY ONLY ONCE
	PUSHJ	P,TMES
	SUBI	CNT,2		;COUNT LINES ON PAGE
	MOVEI	T,ERRINP
	PUSHJ	P,MES		;OUTPUT TO LISTING
	GETSTS	1,T		;RE-FETCH STATUS
	MOVE	T1,T
	ANDI	T1,-1-ERRBIT	;CLEAR ERROR CODE
	SETSTS	1,(T1)		;CLEAR STATUS IN MONITOR
	PUSHJ	P,OOCT		;PRINT STATUS IN OCTAL
	JRST	OCRLF		;END WITH A CRLF AND A POPJ
SPACES:	PUSHJ	P,SPACE		;3 SPACES TO OUTPUT UNIT
SPACE2:	PUSHJ	P,SPACE
SPACE:	MOVEI	CH,SP		;1 SPACE TO OUTPUT UNIT
OUTPUT:	SOSG	OBUF+2		;ASCII CHAR IN CH TO OUTPUT UNIT
	OUTPUT	2,
	IDPB	CH,OBUF+1
	POPJ	P,


CRLF:	MOVEI	CH,CR		;CARRIAGE RETURN, LINE FEED TO TTY
	PUSHJ	P,TTYOUT
	MOVEI	CH,LF
TTYOUT:	SOSG	TOBUF+2		;ASCII CHAR IN CH TO TTY
	OUTPUT	0,
	IDPB	CH,TOBUF+1
	POPJ	P,

INCHR:	SOSG	TIBUF+2		;CH=NEXT CHAR READ FROM TTY
	INPUT	0,
	ILDB	CH,TIBUF+1
	CAIL	CH,"A"+40	;CHECK FOR LOWER CASE
	CAILE	CH,"Z"+40
	POPJ	P,		;NO
	SUBI	CH,40		;YES--CONVERT TO UPPER
	POPJ	P,


TMES:	PUSHJ	P,CRLF		;TYPE CARRIAGE RETURN, LINE FEED
	TLOA	T,440700	;TURN MESSAGE INTO BYTE POINTER
TMES1:	PUSHJ	P,TTYOUT
	ILDB	CH,T
	JUMPN	CH,TMES1
	PUSHJ	P,CRLF		;OUTPUT ANOTHER CR/LF
	OUTPUT	0,		;MAKE SURE IT ALL GETS THERE
CPOPJ:	POPJ	P,


MES:	TLOA	T,440700	;MAKE BYTE POINTER OF T
MES1:	PUSHJ	P,OUTPUT
	ILDB	CH,T
	JUMPN	CH,MES1
	POPJ	P,
TTYQ:	1		;SELECT AL MODE FOR TTY
	SIXBIT	/TTY/
	XWD	TOBUF,TIBUF
ER1:	ASCIZ	/?CANT OPEN INPUT/
ER1A:	ASCIZ	/?CANT LOOKUP INPUT/
ER2:	ASCIZ	/?CANT OPEN OUTPUT/
ER2A:	ASCIZ	/?CANT ENTER OUTPUT/
ER3:	ASCIZ	/?SYNTAX ERROR/
SUPERM:	ASCIZ	/?SUPER-USETI FAILURE/
ERRINM:	ASCIZ	/?INPUT ERROR/
ERRINP:	ASCIZ	/
	INPUT DEVICE ERROR	STATUS = /
CW1:	ASCIZ	/    SA = /
CW8:	ASCII	/DUMP OF FILE   /
ASNAME:	BLOCK	3
	ASCII	/ TO  /
ASNAMF:	BLOCK	3
BLANKS:	ASCII	/     /
DATE:	ASCII	/00-00-00  /
TIME:	ASCII	/00:00/
	ASCIZ	/


/
CW6:	ASCIZ	/    BLOCK /
CW5:	ASCIZ	.    DIRECTORY

.
CW5A:	ASCIZ	.FILE INDEX OF EACH BLOCK ON TAPE


.
CW5B:	ASCIZ	.[BLOCK NUM]

      FILE  EXT           [0.
CW2:	ASCIZ	.  [.
CW3:	ASCIZ	.0]  .
COMLST:	IOWD	DTAL,DATAB
	0
ST1:	10
D1:	0
	XWD	0,IBUF
F1:	0
E1:	0
	0
	0
ST2:	1
D2:	0
	XWD	OBUF,
F2:	0
E2:	0
	0
	0
D3:	0
F3:	0
E3:	0
AS1:	BLOCK	3	;AS1 MUST FOLLOW E3
TERMBK:	BLOCK	1		;TERMBK MUST FOLLOW AS1
PDLPT:	XWD	-31,PDLST-1
BLKNUM:	BLOCK	1
MAX:	BLOCK	1
LSTOUT:	BLOCK	8
LINBUF:	BLOCK	^D24
PDLST:	BLOCK	32
IBUF:	BLOCK	3
OBUF:	BLOCK	3
TIBUF:	BLOCK	3
TOBUF:	BLOCK	3
DATAB:	BLOCK	200
DMPEND:	END	DUMP