Google
 

Trailing-Edge - PDP-10 Archives - BB-M836B-BM - tools/ddt11/ddtfil.mac
There are 16 other files named ddtfil.mac in the archive. Click here to see a list.
	TITLE DDTFIL DDT11 FILE ROUTINES AND OTHER SUPPORT FOR THEM

	SUBTTL	LISTING CONTROL, AND OTHER USEFUL STUFF

	SEARCH	DDTSYM,JOBDAT,MACTEN,UUOSYM,MONSYM,MACSYM

	SALL			;GET NICE LISTINGS FOR A CHANGE
	.HWFRMT			;AND SKIP THE FANCY BITS
	.DIRECTIVE LITLST,FLBLST

EXTERNAL ADDSYM,BYTCNT,CACHEL,CALER0,CMDLIM,CMDTKR,CNINWD,DATA,DELSYM,DOTFOO
EXTERNAL DOTINC,ESC.Q.,ETYPE,GETMEM,GETWRD,GOTO,INVLFN,LASTSW,LEVEL0,LEVEL2
EXTERNAL LEVL.0,LSTADR,MEMLIM,MEMORY,MEMUSE,MOVSMT,NDTFOO,NODE.N,O.MODE,ORADIX
EXTERNAL PDP8F,PORT,POSYMT,PUTFOO,RGFNDN,RSTART,S..END,SAVE2
EXTERNAL SAVE24,SAVE34,SAVE4,SBEGIN,SETFOO,SIMREG,SYMBEG,SYMBOL,SYMEND,SYMFND
EXTERNAL TPOPJ,TPOPJ1,VALFND,SWTTST


ENTRY ADRTYP,B3.TYP,BLANKT,CMDCNT,CMDFIL,COLTYP,COMTYP,CRLTYP,CSECHO,DATYPE
ENTRY DECINP,DECTYP,ESC..D,ESC..P,ESC..Y,FILPOS,IDTYPE,MRGFLG,MYPPN,OCTYPE,OHD
ENTRY OPNFL0,PCNTYP,PDECTY,PERTYP,QESTYP,RADTYP,RDDUMP,RSTATE,SETFES,SETMRG
ENTRY SETREL,SETRST,SETSYM,SIXIN,SIXTYP,TABTYP,TIMTY1,TYPCHR,TYPSTR	
ENTRY GETCHR,SIXOCT,FILDEV
;HERE FOR A /MERGE

SETMRG:	SWTCHK MERGE
	SETOM	MRGFLG#		;WANT TO MERGE OTHER FILES
	MOVEI T1,EX.MEM
	MOVEM T1,ETYPE
	RETSKP


;HERE BECAUSE USER TYPED /FESYM WITH /SYMBOL

SETFES:	SWTCHK FESYMB
	MOVE T1,[SIXBIT /MAPSYM/] ;DEFAULT EXTENSIONS
	MOVEM T1,DEFEXT
	MOVE T1,[400000,,RDSYMA] ;FLAG TO READ IN FE FORMAT
	MOVEM T1,LASTSW
	RETSKP


;HERE ON A /RELOCATION:VAL SWITCH

SETREL:	SWTCHK RELOCA
	CAIN T5,":"
	CALL SIXIN		;READ VALUE
	JRST [	TYPE <
?Illegal argument for /RELOCATE switch
>
		RET]
	PUSH P,T1		;SAVE IF WE NEED IT LATER
	CALL SIXOCT		;CONVERT IT TO AN OCTAL NUMBER
	JRST [	POP P,T1	;GET TYPIN BACK
		CALL SYMFND	;FIND IF WE HAVE A SYMBOL TO MATCH IT
		JRST [	TYPE <
?Unknown symbol as argument to /RELOCATE switch
>
			RET]
		HRRZ T1,1(SYM)	;GET THE VALUE FIELD
		MOVEM T1,RELOFF	;SAVE FOR THE READ CODE
		RETSKP]		;RETURN
	MOVEM T1,RELOFF		;SAVE THE NEW OFFSET
	JRST TPOPJ1		;CLEAN STACK, SKIP RETURN


;HERE FOR A /SYMBOL

SETSYM:	SWTCHK SYMBOL
	MOVE	T1,[400000,,RDSYMB]
	MOVEM	T1,LASTSW
	MOVE	T1,[SIXBIT \LSTCRF\] ;RESET DEFAULT EXTENSION
	MOVEM	T1,DEFEXT
	SETZM	USETIT		;ALWAYS START AT 0
	CAIE	T5,":"		;GIVEN A BLOCK TO START ON ?
	RETSKP SAFE		;NO, ITS OK
	CALL	DECINP		;GET BLOCK TO START READING AT
	JRST [	TYPE <
?Illegal value for the /SYMBOL switch
>
		RET]
	HRRZM	T1,USETIT	;REMEMBER WHERE TO START READING
	RETSKP


;HERE FOR A /STB IN THE COMMAND LINE

SETRST:	SWTCHK STB
	MOVE T1,[SIXBIT /STBSYM/] ;DEFAULT EXTENSIONS
	MOVEM T1,DEFEXT
	MOVE T1,[400000,,RDSTB]	; DEFINE THE ROUTINE TO DO THE REAL WORK
	MOVEM T1,LASTSW
	RETSKP
;HERE TO READ A SYMBOL TABLE FROM A LISTING

RDSYMB:	SKIPN	FILDEV
	JRST	[TYPE <
?Symbol file sepcification required with this switch
>
		RET]
	SKIPE	T1,USETIT	;WANT TO SKIP PART OF FILE ?
	USETI	1,(T1)		;POSITION FILE
	MOVE	T1,[FILDEV,,SYMDEV]
	BLT	T1,SYMDEV+$FBLEN-1	;COPY FILDEV, FILNAM, FILEXT, FILTIM
	SETZ	T5,		;COUNT OF SYMBOLS
GETSC1:	CALL	GETSCH
	CAIE	T1,12		;IS THIS A LINE FEED ?
	JRST	GETSC1		;LOOK FOR ONE
	SETZB	T3,SYMBOL	;BUILD SYMBOL HERE
	MOVE	T2,[POINT 6,SYMBOL]
	CALL	GETSCH		;GET FIRST CHAR FOR SYMBOL
	CAIL	T1,"0"		;CHECK TO SEE IF NUMERIC
	CAILE	T1,"9"
	CAIA			;NOT NUMERIC
	JRST	GETSC1		;NUMERIC SO FLUSH LINE
	CAIA
GETSC3:	CALL	GETSCH
	CAIG	T1,40
	JRST	GETSC4		;IF SO HAVE FINISHED SYMBOL
	CAIN	T1,"="		;DID SYMBOL END WITH "=" ?
	JRST	GETSC5
	SUBI	T1,40		;CONVERT TO SIXBIT
	CAME	T2,[POINT 6,SYMBOL,35]	;FILLED WORD YET ?
	IDPB	T1,T2		;NO SO KEEP FILLING
	JRST	GETSC3
GETSC4:	CAIE	T1,40		;SYMBOLS END WITH A SPACE
	JRST	GETSC1		;NOT SYMBOL - FLUSH LINE
GETSC5:	SKIPN	SYMBOL		;IS THERE A SYMBOL ?
	JRST	GETSC1		;NO SYMBOL FLUSH LINE
	TDZA	T4,T4		;CLEAR FLAGS
GETSC6:	CALL	GETSCH
	CAIN	T1,40
	JRST	GETSC6
	CAIN	T1,"="
	JRST	[	TRO	T4,SMF.SU	;SUPPRESSED SYMBOL
			JRST	GETSC6	]
	CAIN	T1,"%"
	JRST	[	TRO	T4,SMF.RG	;REGISTER NAME
			TRZ	T4,SMF.SU	;DON'T SUPPRESS REG NAMES
			JRST	GETSC6	]
	CAIL	T1,60
	CAILE	T1,67
	JRST	GETSC1		;FLUSH REST OF LINE
GETSC7:	IMULI	T3,^D8
	ADDI	T3,-60(T1)
	CALL	GETSCH
	CAIL	T1,60
	CAILE	T1,67
	CAIA
	JRST	GETSC7

	CAIE	T1,"8"
	CAIN	T1,"9"
	JRST	GETSC1		;FLUSH REST OD LINE
	CAIN	T1,"-"
	JRST	GETSC1		;FLUSH REST OF LINE
	MOVE	T1,SYMBOL	;COPY SYMBOL
	HRRZ	T2,T3		;VALUE
	HRLZ	T3,T4		;FLAGS
	MOVE	T4,SYMNAM	;FILE NAME
	PUSH	P,SYMEND
	CALL	ADDSYM
	POP	P,T1		;GET OLD SYMEND
	CAME	T1,SYMEND
	AOS	T5		;COUNT SYMBOL
	JRST	GETSC1		;FLUSH REST OF LINE
GETSCH:	CALL	FILCHR		;GET NEXT CHAR FROM FILE
	CAIA
	RET
	TYPE	< loaded >
	MOVE	T1,T5
	CALL	DECTYP
	TYPE	< symbols
>
	JRST TPOPJ1
	SUBTTL ROUTINES TO READ A RSX20F TYPE MAP FILE

;HERE TO READ A FE SYMBOL FILE

RDSYMA:	SKIPN	FILDEV		;WAS A FILE SPECIFIED?
	JRST	[TYPE <
?Symbol file specification required with this switch
>
		RET]
	MOVE T1,[FILDEV,,SYMDEV] ; COPY OF FILE, DEVICE, EXT, TIME
	BLT T1,SYMDEV+$FBLEN-1	;MOVE IT
	SETZ T5,		;COUNT OF SYMBOLS WE HAVE READ
RDSYM1:	CALL GETSCH		;GET NEXT BYTE
	CAIE T1,12		;LINE FEED?
	JRST RDSYM1		;NO, KEEP LOOKING FOR IT.
RDSYM2:	SETZB T3,SYMBOL		;BUILD SYMBOL HERE
	MOVE T2,[POINT 6,SYMBOL];POINTER FOR SYMBOL NAME
RDSYM3:	CALL GETSCH		;GET NEXT SYMBOL NAME BYTE
	CAIE T1,40		;SPACE?
	CAIN T1,11		;TAB?
	JRST RDSYM3		;YES, IGNORE IT AT START OF LINE
	CAIA
RDSYM4:	CALL GETSCH		;GET NEXT BYTE, PLEASE
	CAIG T1,40		;IF SO, WE HAVE FINISHED SYMBOL
	JRST RDSYM5		;YES, WE ARE DONE WITH THAT PART
	CAIE T1,11		;IS IT A TAB?
	CAIN T1,75		;IS IT AN "="?
	JRST RDSYM5		;YES, TOO, SO GET NEXT PART
	SUBI T1,40		;CONVERT TO SIXBIT
	CAME T2,[POINT 6,SYMBOL,35];AT THE END YET?
	IDPB T1,T2		;NO, POU BYTE INTO SYMBOL
	JRST RDSYM4		;LOOP FOR MORE OF SYMBOL

RDSYM5:	CAIN T1,75		;END OF SYMBOL, WAS IT A "="?
	JRST [	SKIPN SYMBOL
		JRST RDSYM1	;NO SYMBOL, FLUSH THE LINE, TRY AGAIN
		SETZ T4,	;CLEAR THE FLAGS
		JRST RDSYM6]	;AND GET THE VALUE
	CAIE T1,11		;TAB
	CAIN T1,40		;SPACE?
	CAIA
	JRST RDSYM1		;NOT A SYMBOL AGAIN, FLUSH LINE
	SKIPN SYMBOL
	JRST RDSYM1		;NOT A SYMBOL, YET
	SETZ T4,
RDSYM7:	CALL GETSCH
	CAIN T1,40
	JRST RDSYM7		;EAT UP EXTRA SPACES
RDSYM6:	CAIN T1,75		;OK?
	JRST [	TRO T4,SMF.SU	;SUPPRESSED
		JRST RDSYM7]	;BACK FOR MORE
	CAIN T1,45		;"%"
	JRST [	TRO T4,SMF.RG	;REGISTER NAME
		TRZ T4,SMF.SU	;DONT KEEP THEM DOWN
		JRST RDSYM7]	;BACK AGAIN
	CAIL T1,60		;IS IT IN THE RANGE OF 0-7
	CAILE T1,67
	JRST RDSYM1		;NO, FLUSH LINE
RDSYM8:	IMULI T3,10		;MAKE ROOM FOR NEW VALUE
	ADDI T3,-60(T1)		;CONVERT AND ADD IT IN
RDSYM9:	CALL GETSCH		;NEXT BYTE
	CAIL T1,60
	CAILE T1,67
	CAIA
	JRST RDSYM8		;ADD IN NEXT VALUE
	CAIN T1,55		;WAS IT A "-"
	JRST RDSYM9		;YES, IGNORE IT
	CAIN T1,122		;IS IT A "R"
	ADD T3,RELOFF		;YES, ADD RELOCATION , AND KEEP GOING
	MOVE T1,SYMBOL		;GET SYMBOL NAME
	HRRZ T2,T3		;GET VALUE
	HRLZ T3,T4		;GET FLAGS
	MOVE T4,SYMNAM		;GET FILE MANE
	PUSH P,SYMEND		;SAVE END OF SYMBOL TABLE
	CALL ADDSYM		;ADD NEW SYMBOL
	POP P,T1		;GET OLD END
	CAME T1,SYMEND		;DID IT GROW?
	AOS T5			;YES, COUNT AS NEW SYMBOL (CROCK)
	JRST RDSYM2		;YES, GET NEXT SYMBOL FROM LINE
	SUBTTL ROUTINE TO READ A STB FILE

; STB FORMAT IS ODD.  THE FILE IS SAVED AS
;
;	0(2),BYTE2(8),BYTE1(8),0(2),BYTE4(8),BYTE3(8)
;
; JUST LIKE DTELDR DUMPS, AND SUCH, BUT IT IS A PAIN TO READ IN
; A SYMBOL TABLE THAT WAY, SO, WE HAVE TO FAKE THE WORK, AND MUNG
; THE POINTERS TO THE FILE BY HAND.

RDSTB:	SKIPN	FILDEV
	JRST	[TYPE <
?Symbol file specification required with this switch
>
		RET]
	MOVE T1,[FILDEV,,SYMDEV] ; COPY THE FILE, DEVICE, EXT, AND PATH
	BLT T1,SYMDEV+$FBLEN-1	; MOVE THE DATA
	SETZ T5,		; WE HAVE SEEN NO SYMBOLS YET...
RDSTB1:	CALL RDSGYB		; GET THE NEXT BYTE IN THE FILE





; Here to read the next 8 bit byte from the STB file.  The format of the
; file is 0,byte2,byte1,,0,byte4,byte3, and we must keep tract of where
; we are, and spit the bytes out in the right order.  This routine will
; return all bytes, (even nulls), and with a skip return, and take the error
; return when the end of file has been reached.

RSTATE:	0			; THE STATE OF THE INPUT ROUTINE
	; 0 ==>	GET NEXT WORD, AND RETURN BYTE (1)
	; 1 ==> GET NEXT BYTE (2)
	; 2 ==> GET NEXT BYTE (3)
	; 3 ==> GET NEXT BYTE (4)

RDSGYB:	MOVE T1,RSTATE		; GET THE STATE POINTER
	ANDI T1,3		; SAVE ONLY THE TWO LOW ORDER BITS
	JRST @[			; AND CALL THE CORRECT ROUTINE
		RDSGY0
		RDSGY1
		RDSGY1
		RDSGY1](T1)	; DETERMINED BY THE STATE FIELD

; HERE TO GET THE NEXT WORD, AND THE NEXT BYTE

RDSGY0:	SOSGE IHD+2		; IS THERE ANOTHER WORD TO GET?
	JRST RDSGY2		; NO, GET ANOTHER BUFFER
	AOS IHD+1		; POINT TO THE NEXT WORD TO READ IN

; HERE TO REALLY GET THE NEXT BYTE

RDSGY1:
	MOVE T1,[	POINT 8,@IHD+1,17
			POINT 8,@IHD+1,9
			POINT 8,@IHD+1,35
			POINT 8,@IHD+1,27 ](T1)
	AOS RSTATE		; AND COUNT THIS TO THE NEXT STATE
	LDB T1,T1
	RETSKP FAST		; RETURN TO THE CALLING ROUTINE

; HERE TO GET THE NEXT BUFFER, AND SET UP THE POINTERS WE WILL NEED

RDSGY2:	IN 1,			; GET THE BUFFER WE NEED
	JRST RDSGY3		; IN NO ERROR, ADJUST THE COUNTS AND POINTERS
	GETSTS 1,T1		; GET THE FILE STATUS, DUE TO ERROR
	TXNE T1,IO.IMP!IO.DER,IO.DTE,IO.BKT ; ANY ERRORS WE WORRY ABOUT?
	CALL IFILER		; YES, REPORT THEM
	RELEASE 1,		; DUMP THE FILE
	SETZM FILDEV
	RET			; ERROR RETURN TO CALLER

; HERE TO ADJUST THE POINTERS AND COUNTS OF THE BUFFER WE JUST READ

RDSGY3:	MOVE T1,IHD+2		; GET BYTE COUNT
	ADDI T1,4		; BUMP IT UP...
	IDIVI T1,5		; AND MAKE IT INTO WORDS
	MOVEM T1,IHD+2
	HRRZ T1,IHD+1		; GET ONLY THE ADDRESS
	MOVEM T1,IHD+1		; AND CLEAR THE REST OF THE WORD
	MOVE T1,RSTATE		; GET THE OLD STATE
	ANDI T1,3		; GET RID OF EXTRA BITS, PLEASE
	JRST RDSGY0		; AND GET THE NEXT BYTE, PLEASE
	SUBTTL	GENERAL FILE ROUTINES

;HERE TO OPEN A FILE TO READ(F.WRIT=0) OR WRITE(F.WRIT=1)
; CALL	MOVE	T1,[SIXBIT \FILE\]	;DEFAULT FILE NAME
;	MOVE	T2,[SIXBIT \EXTEXT\]	;DEFAULT EXTENSIONS
;	MOVE	T3,[SWDSP,,SWLST]	;SWITCH POINTER
;	MOVE	T4,[400000,,ADR]	;DEFAULT LAST SWITCH
;	CALL	OPNFIL
;	LOSE RETURN
;	WIN RETURN
OPNFIL:	TROA	FLG,F.FLIP	;FLAG WE SHOULD PROMPT
OPNFL0:	TXZ	FLG,F.FLIP	;NO PROMPT PLEASE
	MOVEM	T2,DEFEXT	;SAVE DEFAULT EXTENSIONS
	SETZM	FILDEV		;INITIALIZE START OF FILE BLOCK
	MOVE	T2,[FILDEV,,FILDEV+1]  ;BLT POINTER TO
	BLT	T2,FILDEV+$FBLEN-1  ; INITIALIZE REST OF FILE BLOCK
	MOVEM	T1,FILNAM	;SAVE DEFAULT FILE NAME
	MOVEM	T3,FIL.SW	;SAVE POINTER TO SWITCHES
	MOVEM	T4,LASTSW	;LAST SWITCH WE GET
OPFIL1:	MOVEI	T1,[ASCIZ \
FILE:	\]
	TXOE	FLG,F.FLIP	;WANT PROMPT ?
	CALL	TYPSTR
	CALL	SIXIN		;GET FILE NAME
	JRST	OPFIL1
	JUMPE	T1,OPFIL4	;JUST SWITCHES
	MOVSI	T2,'DSK'	;DEFAULT DEVICE NAME
	MOVEM	T2,FILDEV
	CAIE	T5,":"		;WAS THIS A DEVICE SPECIFICATION ?
	JRST	OPFIL2
	MOVEM	T1,FILDEV	;YES SO WAS A DEVICE
	CALL	SIXIN		;GET FILE NAME
	JRST	OPFIL1
OPFIL2:	SKIPE	T1		;WAS THERE A FILE NAME ?
	MOVEM	T1,FILNAM	;SAVE FILE NAME
	CAIE	T5,"."		;GIVING AN EXTENSION ?
	JRST	OPFIL3		;NO
	CALL	SIXIN		;GET EXTENSION
	JRST	OPFIL1
	HLLZM	T1,FILEXT
OPFIL3:	CAIE	T5,"["		;GIVING A PPN ?
	JRST	OPFIL4

;HERE TO READ IN A PATH SPEC
	CALL	SIXIN
	JRST	OPFIL4
	CAIE	T5,","
	JRST	OPFIL4
	CALL	SIXOCT
	JRST	OPFIL4
	CAIN	T1,0		;USER TYPE IN EXPLICIT PROJECT?
	HLRZ	T1,MYPPN	;NO, USE HIS THEN
	HRLM	T1,FILPPN	; SET IN FILE PATH BLOCK
	CALL	SIXIN
	JRST	OPFIL1
	CALL	SIXOCT
	JRST	OPFIL1
	CAIN	T1,0		;USER TYPE IN EXPLICIT PROGRAMMER?
	HRRZ	T1,MYPPN	;NO, USE HIS THEN
	HRRM	T1,FILPPN	; SET IN FILE PATH BLOCK
	MOVEI	T4,FILSFD-1	; START OF SFD'S
OPFL30:	MOVE	T1,T5
	CAIE	T1,","		;WERE SFD'S SPECIFIED ?
	JRST	OPFL39
	CALL	SIXIN		;GET SFD NAME
	JRST	OPFL39
	CAIN	T4,FILSFD+4	; ALREADY FILLED ALL ?
	JRST	[TYPE	<
?SFD depth greater than 5>
		RET	]
	PUSH	T4,T1
	JRST	OPFL30
OPFL39:	CAIN	T1,"]"
	CALL	RDCHAR
OPFL40:	MOVEM	T1,T5
OPFIL4:	CAIN	T5,40		;WAS BREAK CHAR A SPACE ?
	JRST	[CALL	RDCHAR	;GET NEXT CHAR
		JRST	OPFL40 ]
	CAIE	T5,"/"		;TIME FOR SWITCHES ?
	JRST	OPFIL7
	CALL	SIXIN		;GET SWITCH NAME
	JRST	OPFIL7
	MOVSI	T2,770000	;MAKE A MASK
OPFL41:	MOVE	T3,T1		;COPY ARGUMENT
	AND	T3,T2		;MASK IT
	CAMN	T1,T3		;WAS THAT RIGHT MASK ?
	JRST	OPFL42
	ASH	T2,-6		;MAKE MASK BIGGER
	JRST	OPFL41
OPFL42:	HRRZ	T4,FIL.SW
OPFL43:	SKIPN	T3,(T4)		;GET NEXT ENTRY IN LIST
	JRST	OPFIL5		;NO MATCH FOR SWITCH
	CAMN T1,T3		;EXACT ENTRY?
	JRST OPFIL6		;YES, IGNORE PARTIAL MATCHES
	AND	T3,T2		;MASK OFF ENTRY
	CAME	T1,T3		;DID WE FIND MATCH ?
	AOJA	T4,OPFL43	;TRY NEXT ENTRY
	MOVE	T3,1(T4)	;GET NEXT ENTRY FROM LIST
	AND	T3,T2		;MASK IT
	CAME	T1,T3
	JRST	OPFIL6
OPFIL5:	PUSH	P,T1		;SAVE SWITCH
	TYPE	<
?Undefined or ambiguous switch />
	POP	P,T1
	CALL	SIXTYP
OPFL52:	TYPE	<
	Legal switches are:>
	HRRZ	T4,FIL.SW	;POINT TO LIST OF SWITCHES
OPFL55:	SKIPN	(T4)
	JRST	CRLTYP		;END WITH A FLURISH
	TYPE	< />
	MOVE	T1,(T4)		;GET SWITCH NAME
	CALL	SIXTYP
	AOJA	T4,OPFL55

OPFIL6:	SUB	T4,FIL.SW
	HLRZ	T1,FIL.SW
	ADDI	T1,(T4)
	SKIPGE	T1,(T1)
	JRST	[	MOVEM	T1,LASTSW
			JRST	OPFIL4 ]
	CALL	(T1)
	RET			;ERROR IN THE SWITCH, SO GIVE UP
	JRST	OPFIL4


OPFIL7:	CAIE	T5,15		;IS THE BREAK CHARACTER A CR?
	JRST	[TYPE <
?Syntax error in file name or switches
>
		RET]
	SETZ	T1,
	SKIPN	T2,FILDEV	;DID USER TYPE A FILE NAME ?
	JRST OPNFL5
	MOVEI	T3,IHD
	TXNE	FLG,F.WRIT
	SKIPA	T3,[OHD,,0]
	SKIPA	T4,[OPEN 1,T1]	;READ ON CHNL 1
	MOVE	T4,[OPEN 0,T1]
	XCT	T4
	JRST	FILER0
	PUSH	P,.JBFF##
	MOVEI	T2,OBUFER
	MOVE	T1,[INBUF 1,NUMBUF]
	TXNE	FLG,F.WRIT
	SKIPA	T1,[OUTBUF 1]
	MOVEI	T2,IBUFER
	MOVEM	T2,.JBFF##
	XCT	T1
	NOP
	POP	P,.JBFF##
	SKIPE	FILEXT		; USER TYPE ANY EXTENSION?
	SETZM	DEFEXT		; YES, CLEAR DEFAULTS THEN
OPNFL2:	MOVE	T1,[LOOKUP 1,FILBLK]
	MOVEI	T2,LKELEN	; LENGTH OF EXTENDED LOOKUP/ENTER BLOCK
	MOVEM	T2,FILBLK	; SET IN LOOKUP/ENTER BLOCK
	SKIPN	FILPPN		; USER TYPE IN EXPLICIT PATH?
	TDZA	T2,T2		; NO, USE DEFAULT PATH
	MOVEI	T2,FILPTH	; YES, USE IT AS TYPED
	MOVEM	T2,FILDIR	; SET PATH BLOCK IN LOOKUP/ENTER BLOCK
	TXZE	FLG,F.APND	;IF APPENDING DO LOOKUP FIRST
	JRST	[TLZ	T1,000740	;CLEAR CHNL SPEC
		XCT	T1		;DO LOOKUP
		JRST	OPNFL2		;LOST BUT DON'T CARE
		TXO	FLG,F.APND	;NEED TO DO USETI
		LDB	T2,[POINTR 17,T1]  ;CHANNEL NUMBER
		MOVEM	T2,FILPTH	;SET IN PATH BLOCK
		MOVE	T2,[PTHLEN,,FILPTH]  ;ARG POINTER TO
		PATH.	T2,		;READ FILE TRUE PATH
		SETZ	T2,		;FAILED??
		JRST	.+1 ]
	TXNE	FLG,F.WRIT
	HRLI	T1,(ENTER)
	XCT	T1
	CAIA			;LOOKUP OR ENTER LOST
	JRST	OPNFL5		;WE HAVE A FILE READY FOR I/O
	TXNE	FLG,F.WRIT	;WRITING ?
	JRST	FILER0		;HE LOSES
	SKIPN	T2,DEFEXT	; ANY DEFAULTS LEFT?
	JRST	FILER0		;NO, ERROR
	HLLZM	T2,FILEXT	;YES, TRY NEXT DEFAULT
	LSH	T2,^D18		;TOSS IT OUT
	MOVEM	T2,DEFEXT	;AND SAVE ANYTHING LEFT FOR NEXT TIME
	JRST	OPNFL2
OPNFL5:	LDB	T2,[POINTR 17,T1]  ;CHANNEL NUMBER
	MOVEM	T2,FILPTH	;SET IN PATH. BLOCK
	MOVE	T2,[PTHLEN,,FILPTH]  ;ARG POINTER TO
	PATH.	T2,		;READ TRUE FILE PATH
	JFCL			;???
	SKIPN	FILDEV
	JRST	OPNFL6
	TXNE	FLG,F.APND
	USETI	-1		;IN CASE SUPERCEEDING
OPNFL6:	MOVE	T1,[FILDEV,,OFLDEV]	;BLT POINTER
	TXNN	FLG,F.WRIT	;ARE WE READING OR WRITING ?
	HRRI	T1,IFLDEV	;READING
	MOVEI	T2,$FBLEN-1(T1)	; LAST WORD TO TRANSFER
	BLT	T1,(T2)		;COPY FILE SPEC
	SKIPE	T1,LASTSW
	JRST	(T1)
	RETSKP	FAST
FILER0:	TXNE	FLG,F.WRIT
	SETZM	OHD
	TYPE	<
?Can't LOOKUP/ENTER file >
FILERR:	TXNE	FLG,F.WRIT
	SETZM	OHD
	MOVEI	T1,FILDEV
	CALL	FILTYP
	CALL	CRLTYP
	TXNN	FLG,F.WRIT
	SETZM	IHD
	RET
FILTYP:	HRL	T2,T1		;BUILD BLT POINTER
	HRRI	T2,FILDEV
	BLT	T2,FILDEV+$FBLEN-1	; COPY FILE SPEC
	MOVE	T1,FILDEV	;GET DEVICE NAME
	CALL	SIXTYP
	CALL	COLTYP		;TYPE A COLON
	MOVE	T1,FILNAM	;GET FILE NAME
	CALL	SIXTYP
	CALL	PERTYP		;TYPE A "."
	HLLZ	T1,FILEXT	;GET EXTENSION
	CALL	SIXTYP
	SKIPN	FILPPN		; WAS THERE A PPN ?
	JRST	FILTY6
	MOVEI	T1,"["
	CALL	TYPCHR
	HLRZ	T1,FILPPN
	CALL	OCTYPE
	CALL	COMTYP		;TYPE A COMMA
	HRRZ	T1,FILPPN	; GET RH OF PPN
	ANDI	T1,-1
	CALL	OCTYPE
	MOVEI	T3,FILSFD	; START OF SFD'S
FILTY4:	CAIE	T3,FILSFD+5	; TYPED ALL SFD LEVELS ?
	SKIPN	T1,(T3)		;GET NEXT SFD NAME
	JRST	FILTY5
	CALL	COMTYP		;TYPE A COMMA
	CALL	SIXTYP
	AOJA	T3,FILTY4
FILTY5:	MOVEI	T1,"]"
	CALL	TYPCHR
FILTY6:	CALL	BLANKT
	LDB	T1,[POINT 11,FILTIM,23]
	JUMPE	T1,FILTY3
	CALL	TIMTY3
	CALL	BLANKT
FILTY3:	LDB	T1,[POINT 3,FILEXT,20]	;HIGH ORDER CREATION DATE
	LDB	T2,[POINT 12,FILTIM,35]	;LOWER ORDER CREATION DATE
	LSH	T2,^D24		;APPEND THE TWO TIMES INTO
	LSHC	T1,^D12		;ONE 15-BIT CREATION DATE
	CALL	DATET0		;TYPE DATE
	RET

;HERE TO CLOSE OUTPUT FILE
DONE.W:	SKIPN	OHD
	RET
	OUT
	CLOSE
	RELEASE
	SETZM	OHD
	TYPE	<File >
	MOVEI	T1,OFLDEV
	CALL	FILTYP
	TYPE	< written

>
	SETZM	FILDEV
	RET
;HERE TO GET NEXT CHAR FROM A FILE
; CALL	CALL	FILCHR
;	ERROR RETURN
;	NORMAL RETURN WITH CHAR IN T1
FILCHR:	CALL	FILBYT		;GET NEXT BYTE FROM FILE
	RET			;LOST
	JUMPE	T1,FILCHR	;FLUSH NULLS
	AOS	(P)
	RET

;HERE TO GET THE NEXT BYTE FROM INPUT FILE
FILBYT:	SOSGE	T1,IHD+2	;IS THERE MORE STUFF IN BUFFER ?
	JRST	FLCHR5		;NO
	ILDB	T1,IHD+1	;GET NEXT CHAR
	AOS	(P)		;SKIP RETURN
	RET

FLCHR5:	IN	1,		;GET NEXT BUFFER
	JRST	FILBYT		;TRY AGAIN
	GETSTS	1,T1		;GET FILE STATUS
	TXNE	T1,IO.IMP!IO.DER!IO.DTE!IO.BKT	;ANY ERRORS
	CALL IFILER		;REPORT ERROR
	RELEASE 1,		;GONE WITH CHANNEL
	SETZM FILDEV
	RET			;AND RETURN

IFILER:	TYPE	<
?Error reading file >
	MOVEI	T1,IFLDEV	;ADR OF NAME OF FILE
	CALL	FILTYP
	TYPE	< status = >
	GETSTS 1,T1		;GET BACK STATUS
	CALL	OCTYPE
	JRST	CRLTYP

;HERE TO POSITION FILE FOR INPUT
; CALL	MOVE	T1,BYTE # IN FILE
;	CALL	FILPOS
;	RETURN
FILPOS:	IDIVI	T1,200*5	;FIND BLOCK TO READ
	USETI	1,1(T1)
	IN	1,		;GET NEXT BUFFER
	CAIA
	RET
FILPS4:	SOJL	T2,RSKP
	CALL	FILBYT
	RET
	JRST	FILPS4
;HERE TO INPUT AN OCTAL NUMBER
; CALL:	CALL	INPOCT
;	ERROR RETURN
;	RETURN WITH OCTAL NUMBER IN T1, BREAK CHAR IN T2
INPOCT:	CALL	SAVE34
	SETZB	T3,T4
INPRD2:	CALL	FILCHR		;GET NEXT INPUT CHAR
	JRST	INPRD9		;NO MORE IN FILE
	JUMPE	T1,INPRD2
	CAIE	T1," "		;LEADING SPACE ?
	CAIN	T1,"	"		;OR TAB ?
	JRST	INPRD2		;YES
INPRD5:	CAIL	T1,"0"
	CAILE	T1,"7"
	JRST	INPRD7
	IMULI	T3,^D8
	ADDI	T3,-60(T1)
	CALL	FILCHR
	CAIA			;EOF
	JRST	INPRD5
INPRD7:	MOVE	T2,T1
	MOVE	T1,T3
	AOS	(P)		;SKIP RETURN
INPRD9:	RET
;HERE TO GET A SIXBIT WORD FROM TTY
; CALL:	CALL	SIXIN
;	LOSE RETURN
;	WIN RETURN WITH SIXBIT WORD IN T1 & BREAK CHAR IN T5
SIXIN:	PUSH	P,T4		;SAVE REG
SIXIN0:	CALL	RDCHAR		;GET THE FIRST CHAR
	CAIE	T1," "		;IS IT A BLANK
	CAIN	T1,"	"		;OR A TAB ?
	JRST	SIXIN0		;YES SO SKIP IT
	MOVE	T4,[POINT 6,T5]
	SETZ	T5,		;CLEAR ACCUMULATED SYMBOL
	CAIN	T1,"%"
	JRST	SIXIN7
	JRST	SIXIN3
SIXIN2:	CALL	RDCHAR		;GET A CHAR FROM TTY
SIXIN3:	CAIN	T1,177
	JRST	[	TYPE	<xxx>
			POP	P,T4
			RET	]
	CAIL	T1,"0"
	CAILE	T1,"Z"+40
	JRST	SIXIN9		;RETURN
	CAILE	T1,"9"
	CAIL	T1,"A"+40
	JRST	SIXIN7
	CAIL	T1,"A"
	CAILE	T1,"Z"
	JRST	SIXIN9		;RETURN
SIXIN7:	CAIGE	T1,40+"A"	;CHECK FOR LOWER CASE
	SUBI	T1,40
	CAME	T4,[POINT 6,T5,35]	;HAVE WE ALREADY FILLED WORD ?
	IDPB	T1,T4		;NOT YET
	JRST	SIXIN2
SIXIN9:	EXCH	T1,T5
	POP	P,T4
	RETSKP FAST

;HERE TO CONVERT SIXBIT TO OCTAL
SIXOCT:	MOVE	T4,[POINT 6,T1]
	SETZ	T2,
SIXOC1:	ILDB	T3,T4
	JUMPE	T3,SIXOC9
	CAIL	T3,20
	CAILE	T3,27
	RET			;CAN'T CONVERT
	IMULI	T2,^D8
	ADDI	T2,-20(T3)
	CAME	T4,[POINT 6,T1,35]	;DONE ALL OF WORD ?
	JRST	SIXOC1
SIXOC9:	EXCH	T1,T2
	RETSKP FAST
;HERE TO GET A DECIMAL ARGUMENT FROM THE TTY
; CALL	CALL	DECINP
;	LOSE RETURN
;	WIN RETURN	WITH # IN T1, BREAK CHAR IN T5
DECINP:	MOVEI	T1,^D10		;RADIX
RADINP:	CALL	SAVE2		;SAVE SOME REGISTERS
	SETZ	T5,		;BUILD NUMBER HERE
	MOVE	T2,T1		;COPY RADIX
RADIN0:	CALL	RDCHAR		;GET NEXT CHAR FROM THE TTY
	CAIE	T1," "		;IS THIS A LEADING SPACE ?
	CAIN	T1,"	"		;OR TAB ?
	JRST	RADIN0		;YES SO FLUSH IT
	CAIL	T1,"0"		;IS FIRST CHARACTER NUMERIC ?
	CAIL	T1,"0"(T2)
	JRST	RADIN9		;ERROR RETURN
	AOS	(P)		;WIN
RADIN2:	CAIL	T1,"0"		;IS CHARACTER NUMERIC
	CAIL	T1,"0"(T2)	;IS IT IN RANGE ?
	JRST	RADIN9		;ALL DONE
	IMULI	T5,(T2)		;SHIFT CURRENT ACCUMULATION
	ADDI	T5,-60(T1)	;ADD NEXT DIGIT
	CALL	RDCHAR		;GET NEXT CHAR FROM THE TTY
	JRST	RADIN2
RADIN9:	EXCH	T1,T5
	RET
	SUBTTL	TTY ROUTINES

;HERE TO DISPLAY CONTENTS OF T1 AS AN ADDRESS
ADRTYP:	TLNN	T1,400000
	TLO	T1,777777
	TLNN	T1,200000
	JRST	DATIN9		;TYPE REGISTER NAME
	ANDI	T1,777777	;EIGHTEEN BITS ONLY PLEASE
	HRROM	T1,LSTADR	;SAVE LAST ADDRESS DISPLAYED
	CALL	VALFND		;SEE IF WE CAN FIND A SYMBOL
	JRST	RADTYP		;TYPE ADDR IN CURRENT RADIX
	SKIPN	1(SYM)		;DON'T USE IF SYMBOL=0
	JRST	RADTYP
	PUSH	P,T1		;SAVE VALUE
	MOVE	T1,(SYM)	;GET SYMBOL NAME
	CALL	SIXTYP		;TYPE SYMBOL
	POP	P,T1		;GET VALUE AGAIN
	SUB	T1,1(SYM)	;GET DISPLACEMENT
	ANDI	T1,177777	;STRIP EXTRA BITS
	JUMPE	T1,R		;IF EXACT WE ARE DONE
	PUSH	P,T1		;SAVE REMAINDER
	CALL	PLUTYP		;TYPE A "+"
	POP	P,T1
	JRST	RADTYP		;TYPE REST IN CURRENT RADIX
	SUBTTL	DISPLAY ROUTINES

;HERE TO TYPE CONTENTS OF CURRENT LOCATION
; CALL	WITH DOT SETUP TO POINT TO STARTING POINT OF DISPLAY
;	WITH BYTCNT AND O.MODE SETUP TO INDICATE TYPE OF DISPLAY
;	WITH BYTCNT AND O.MODE SETUP TO INDICATE TYPE OF DISPLAY
;	CALL	DATYPE

DATYPE:	HRRZ	T2,BYTCNT	;BYTE COUNT
	HRRZ	T3,O.MODE	;OUTPUT MODE
	MOVE	T1,DOT
	MOVEM	T1,DOTFOO
	SKIPE	PDP8F
	JRST	DATYP1
	TLNN	DOT,200000
	JRST	REGTYP		;WANT REGISTER DISPLAYED
	CAIG	T3,2		;IS THIS A WORD MODE
	ASH	T2,1		;YES SO BYTE=WORDS*2
DATYP1:	CALL	GETWRD
	JRST	[CALL	CALER0		;DESCRIBE PROBLEM
		RET	]		;THEN EXIT
	MOVEM	T1,ESC.Q.	;IN CASE OF <ESCAPE>Q LATER
	MOVEM	T1,DATA
	HRRZ	T5,BYTCNT	;REPETITION COUNT
	MOVE	T1,DATA		;GET DATA TO TYPE
	HRRZ	T2,O.MODE	;GET OUTPUT MODE
	JRST	@[
		EXP DATINS
		EXP DATADR
		EXP DATNUM
		EXP DATBYT
		EXP DATASC
		EXP DATEBC
		EXP DATINS
		](T2) 
;HERE TO TYPE THE CONTENTS OF A REGISTER

REGTYP:	ANDI	T1,177777	;STRIP EXTRA BITS
	CAILE	T1,7		;SMALL ENOUGH ?
	JRST	QESTYP
	MOVE	T1,SIMREG(T1)	;GET REGISTER TO DISPLAY
	MOVEM	T1,ESC.Q.	;IN CASE OF $Q LATER
	CALL	@[EXP ADRTYP,ADRTYP,RADTYP,RGTBYT,RGTASC,RGTEBC](T3)
	JRST	B3.TYP		;END WITH A FEW SPACES

;HERE TO TYPE CONTENTS OF REGISTER AS BYTES
RGTBYT:	MOVEI	T2,RADTYP	;ROUTINE TO DISPLAY BYTES (NUMERIC)
	JRST	RGTYPX

;HERE TO TYPE CONTENTS OF REGISTER AS ASCII
RGTASC:	MOVEI	T2,DATAS3	;ROUTINE TO DISPLAY ASCII BYTES
	JRST	RGTYPX

;HERE TO TYPE CONTENTS OF REGISTER AS EBCDIC
RGTEBC:	MOVEI	T2,DATEB3	;ROUTINE TO DISPLAY EBCDIC BYTES

RGTYPX:	PUSH	P,T1		;SAVE DATA
	ANDI	T1,377		;FIRST BYTE IS RH
	PUSH	P,T2		;SAVE ADR OF DISPLAY ROUTINE
	CALL	(T2)		;DISPLAY THE FIRST BYTE
	POP	P,T2		;GET ADR OF DISPLAY ROUTINE BACK
	CAIN	T2,RADTYP	;WAS THIS BYTES ?
	CALL	COMTYP		;YES SO WANT A COMMA IN BETWEEN
	POP	P,T1		;GET DATA BACK
	LDB	T1,[POINT 8,T1,27]	;WANT LH BYTE NOW
	JRST	(T2)		;DISPLAY LAST BYTE
;HERE TO TYPE CONTENTS OF CURRENT LOCATION AS A NUMERIC
DATNUM:	HRROM	T1,LSTADR	;IN CASE TYPES A TAB LATER
	CALL	RADTYP		;TYPE AS NUMERIC
	SOJLE	T5,B3.TYP
	CALL	BLANKT
	CALL	NXTDWD		;GET NEXT DATA WORD
	JRST	DATNUM

NXTDWD:	CALL	NXTWRD		;GET NEXT WORD
	JRST	B3.TYP		;CAN'T READ NEXT WORD !
	MOVEM	T1,DATA
	RET

;HERE TO GET THE NEXT WORD FOR TYPEOUT
NXTWRD:	CALL	NDTFOO		;GET NEXT DOT FOO
	MOVE	T1,DOTFOO
	MOVEI	T2,2		;WANT 2 BYTES
	SKIPE	PDP8F
	MOVEI	T2,1
	CALL	GETWRD		;FIND WHAT NEXT WORD IS
	RET			;LOST
	MOVEM	T1,ESC.Q.	;IN CASE OF <ESCAPE>Q LATER
	RETSKP FAST
;HERE TO TYPE DATA AS AN ADDRESS
DATADR:	CALL	ADRTYP
	SOJLE	T5,B3.TYP	;HAVE WE DONE ENOUGH ?
	CALL	BLANKT		;TYPE A SPACE TO SEPERATE FIELDS
	CALL	NXTDWD		;GET NEXT DATA WORD
	JRST	DATADR		;AND TYPE NEXT WORD


;HERE TO TYPE DATA AS INSTRUCTIONS
DATINS:
	SKIPE	PDP8F
	JRST	TYP8IN		;TYPE PDP8 INSTRUCTION
	CALL	INVLFN		;SEE IF WE CAN FIND AN INSTRUCTION TO MATCH
	JRST	DATNUM
	MOVE	T1,(SYM)	;GET INSTRUCTION NAME
	CALL	SIXTYP
	MOVE	T5,2(SYM)	;GET FLAGS AGAIN
	CALL	BLANKT		;TYPE A BLANK
	TLNE	T5,SMF.EI	;EIS TYPE INSTRUCTION ?
	JRST	[LDB	T4,[POINT 6,DATA,35]	;GET SOURCE CODE
		CALL	DATIN8		;DISPLAY IT
		CALL	COMTYP
		LDB	T1,[POINT 3,DATA,29]	;GET REGISTER
		CALL	DATIN9		;TYPE REG NAME
		JRST	B3.TYP]
	TLNE	T5,SMF.PL	;SPL TYPE INSTRUCTION ?
	JRST	[LDB	T1,[POINT 3,DATA,35]	;GET ARGUMENT
		CALL	OCTYPE
		JRST	B3.TYP]
	TLNE	T5,SMF.MK	;MARK TYPE ARGUMENTS ?
	JRST	[LDB	T1,[POINT 6,DATA,35]	;GET ARGUMENT
		CALL	RADTYP		;TYPE ARGUMENT AS NUMBER
		JRST	B3.TYP]
	TLNE	T5,SMF.EM	;EMT TYPE ARGUMENTS ?
	JRST	[LDB	T1,[POINT 8,DATA,35]	;GET ARGUMENT
		HRROM	T1,LSTADR	;IN CASE OF TAB
		CALL	RADTYP		;TYPE ARGUMENT AS NUMBER
		JRST	B3.TYP]
	TLNE	T5,SMF.RT	;RTS TYPE ?
	JRST	[LDB	T1,[POINT 3,DATA,35]	;GET REG ADR
		CALL	DATIN9		;TYPE REG NAME
		JRST	B3.TYP]
	TLNE	T5,SMF.JS	;JSR TYPE ?
	JRST	[LDB	T1,[POINT 3,DATA,29]
		CALL	DATIN9		;TYPE REG NAME
		CALL	COMTYP
		JRST	.+1]
	TLNE	T5,SMF.SB	;SOB TYPE ?
	JRST	[LDB	T1,[POINT 3,DATA,29]	;GET REGISTER
		CALL	DATIN9		;TYPE REG NAME
		CALL	COMTYP
		LDB	T1,[POINT 6,DATA,35]	;GET OFFSET
		IMULI	T1,-2
		ADDI	T1,2(DOT)
		ANDI	T1,177777
		CALL	ADRTYP
		JRST	B3.TYP]
	TLNN	T5,SMF.SS	;12BIT SSDD FORMAT ?
	JRST	DATIN2		;NO
	LDB	T4,[POINT 6,DATA,29]	;GET SS CODE
	CALL	DATIN8
	CALL	COMTYP
DATIN2:	TLNN	T5,SMF.SS!SMF.DD	;IS THERE A 6 BIT DESTINATION CODE ?
	JRST	DATIN4		;NO
	LDB	T4,[POINT 6,DATA,35]	;GET DD CODE
	CALL	DATIN8
DATIN4:	TLNN	T5,SMF.BR	;IS THIS BR TYPE ADDRESSING ?
	JRST	B3.TYP		;NO
	LDB	T1,[POINT 8,DATA,35]	;GET OFFSET
	TRNE	T1,200		;CHECK FOR NEGATIVE OFFSET
	IORI	T1,177400
	AOS	T1
	LSH	T1,1		;MAKE WORD ADDRESS
	ADD	T1,DOT
	ANDI	T1,177777	;16 BITS ONLY
	CALL	ADRTYP		;TYPE ADDRESS
	JRST	B3.TYP
DATIN8:	CAIN	T4,27		;CHECK FOR IMMEDIATE MODE
	JRST	[CALL	HSHTYP		;TYPE A #
		CALL	NXTWRD		;GET NEXT WORD
		RET
		JRST	ADRTYP]
	CAIN	T4,37		;CHECK FOR ABSOLUTE MODE
	JRST	[CALL	NXTWRD		;GET NEXT WORD
		RET
		JRST	ADRTYP]
	TRNE	T4,10		;CHECK FOR DEFERRED MODE
	CALL	[MOVEI	T1,"@"
		PJRST	TYPCHR]
	CAIE	T4,77		;CHECK FOR RELATIVE DEFERRED MODE
	CAIN	T4,67		;CHECK FOR RELATIVE MODE
	JRST	[CALL	NXTWRD		;GET NEXT WORD
		RET
		ADD	T1,DOTFOO	;MAKE RELATIVE
		ADDI	T1,2
		JRST	ADRTYP]
	LDB	T1,[POINT 3,T4,32]	;GET MODE
	CAIE	T1,4
	CAIN	T1,5
	CALL	MINTYP
	CAIL	T1,6		;CHECK FOR INDEX OR INDEX DEFERRED
	JRST	[CALL	NXTWRD		;GET NEXT WORD
		RET
		CALL	ADRTYP
		JRST	DATIN1]
	TRNE	T1,6
DATIN1:	CALL	[MOVEI	T1,"("
		PJRST	TYPCHR]
	LDB	T1,[POINT 3,T4,35]	;GET REGISTER VALUE
	CALL	DATIN9		;TYPE REGISTER NAME
	TRNN	T4,60
	RET			;PLAIN REGISTER MODE
	MOVEI	T1,")"
	CALL	TYPCHR
	LDB	T1,[POINT 3,T4,32]
	CAIE	T1,2
	CAIN	T1,3
	CALL	PLUTYP
	RET
DATIN9:	ANDI	T1,7		;STRIP EXTRA BITS
	HRLI	T1,400000	;FLAG IS A REGISTER
	MOVEM	T1,LSTADR	;IN CASE DOES A TAB
	HRRZS	T1
	CALL	RGFNDN		;FIND REGISTERS NAME
	JRST	[CALL	PCNTYP		;TYPE A %
		CALL	OCTYPE
		RET]
	MOVE	T1,(SYM)	;GET REGISTERS NAME
	JRST	SIXTYP
;HERE TO TYPE A PDP8 INSTRUCTION
TYP8IN:	LDB	T1,[POINT 3,DATA,26]	;PICK UP OP CODE
	CAIN	T1,7		;IS THIS AN OPERATE INSTRUCTION ?
	JRST	OPRTYP		;YES SO SPECIAL HANDLING
	MOVE	T1,[SIXBIT \AND\
		SIXBIT	\TAD\
		SIXBIT	\ISZ\
		SIXBIT	\DCA\
		SIXBIT	\JMS\
		SIXBIT	\JMP\
		SIXBIT	\IOT\](T1)
	CALL	SIXTYP
	CALL	BLANKT
	LDB	T1,[POINT 3,DATA,26]	;GET OP CODE AGAIN
	CAIL	T1,6
	JRST	[LDB	T1,[POINT 9,DATA,35]
		CALL	RADTYP
		JRST	B3.TYP]
	MOVE	T2,DATA		;GET INSTRUCTION
	MOVEI	T1,[BYTE (7)"@",0]
	TRNE	T2,400		;IS INDIRECT BIT ON ?
	CALL	TYPSTR
	MOVE	T2,DOT
	ANDI	T2,7600
	LDB	T1,[POINT 8,DATA,35]
	TRZE	T1,200
	ADDI	T1,(T2)
	PUSH	P,T1		;SAVE ADR
	CALL	ADRTYP		;TYPE ADR
	POP	P,T1		;GET ADR BACK
	MOVE	T2,DATA		;GET DATA AGAIN
	TRNN	T2,400		;WAS THIS AN INDIRECT CASE ?
	JRST	B3.TYP		;NOT INDIRECT SO DONE
	LDB	T2,[POINT 3,T2,26]	;GET OP CODE
	CAIN	T2,6		;IOTS DON'T USE ADDRESSES
	JRST	B3.TYP
	PUSH	P,T1		;SAVE ADR AGAIN
	MOVEI	T1,"\"
	CALL	TYPCHR
	POP	P,T1		;GET ADR AGAIN
	MOVEI	T2,1		;ONLY NEED ONE WORD
	CALL	GETWRD		;GET THAT WORD
	JRST	[CALL	CALER0
		JRST	LEVEL0 ]
	CALL	ADRTYP
	JRST	B3.TYP
;HERE TO TYPE AN OPERATE INSTRUCTION
OPRTYP:	SETZ	T5,		;ACCUMULATE BITS MATCHED HERE
	SKIPN	SYM,SYMBEG	;GET STARTING ADDR FOR SYMBOL TABLE
	jrst	[TYPE <
?Fatal error - symbol table is missing
>
		EXIT]
OPRTY1:	MOVE	T1,2(SYM)	;GET FLAGS FOR SYMBOL & MASK
	TLNE	T1,SMF.P8	;IS THIS A PDP8 SYMBOL ?
	TLNN	T1,SMF.IN	;AND IS THIS AN INSTRUCTION ?
	JRST	OPRTY5		;REJECT THIS SYMBOL
	AND	T1,DATA		;GET VALUE UNDER MASK
	CAME	T1,1(SYM)	;HIT RIGHT ONE ?
	JRST	OPRTY5		;NO
	SKIPE	T5		;FOUND ANY OTHERS YET ?
	CALL	BLANKT		;YES SO TYPE A SPACE
	MOVE	T1,(SYM)	;GET SYMBOL NAME
	CALL	SIXTYP		;TYPE SYMBOL
	IOR	T5,1(SYM)	;REMBER BITS WE EXPLAINED
OPRTY5:	MOVEI	SYM,4(SYM)	;POINT TO NEXT SYMBOL BLOCK
	CAME	SYM,SYMEND	;HIT END OF TABLE ?
	JRST	OPRTY1		;LOOP BACK FOR REST
	ANDI	T5,7777		;STRIP EXTRA BITS
	CAME	T5,DATA		;DID WE MATCH ALL BITS ?
	CALL	QESTYP		;NO SO ADD QUESTION MARK
	JRST	B3.TYP		;CLEAN UP
;HERE TO TYPE DATA AS ASCII TEXT
DATASC:	SKIPE	PDP8F		;WAS THIS A PDP8 WORD ?
	JRST	DATAS2		;YES SO ONLY ONE CHAR/WORD
	ANDI	T1,377		;ONLY 8 BITS PLEASE
	CALL	DATAS3
	SOJLE	T5,B3.TYP
	LDB	T1,[POINT 8,DATA,27]
DATAS2:	CALL	DATAS3
	SOJLE	T5,B3.TYP
	CALL	NXTDWD		;GET NEXT DATA WORD
	JRST	DATASC

;HERE TO TYPE CONTENTS OF T1 AS AN ASCII CHAR IF PRINTABLE, ELSE TYPE <#>
DATAS3:	MOVEM	T1,T3		;SAVE IN CASE NOT ASCII
	ANDI	T1,177		;STRIP PARITY BIT
	CAIL	T1,40
	CAILE	T1,176
	CAIA			;SPECIAL HANDLING
	JRST	TYPCHR		;JUST TYPE CHARACTER
	PUSH	P,T3		;SAVE WEIRD CHARACTER
	MOVEI	T1,"<"
	CALL	TYPCHR
	POP	P,T1		;GET CHAR
	CALL	RADTYP
	MOVEI	T1,">"
	PJRST	TYPCHR
;HERE TO TYPE DATA AS EBCDIC TEXT

DATEBC:	SKIPE	PDP8F		;IS THIS PDP8 STUFF ?
	JRST	DATEB2		;YES SO ONLY ONE CHAR/WORD
	CALL	DATEB3
	SOJLE	T5,B3.TYP
	LDB	T1,[POINT 8,DATA,27]
DATEB2:	CALL	DATEB3
	SOJLE	T5,B3.TYP
	CALL	NXTDWD		;GET NEXT DATA WORD
	JRST	DATEBC
DATEB3:	ANDI	T1,377
	SETZ	T2,
	LSHC	T1,-2
	ROT	T2,2
	LDB T1,[POINT	8,EB.TRN(T1),7
		POINT	8,EB.TRN(T1),15
		POINT	8,EB.TRN(T1),23
		POINT	8,EB.TRN(T1),31 ](T2)
	PJRST	DATAS3
;HERE TO TYPE DATA AS BYTES

DATBYT:	ANDI	T1,377
	SKIPE	PDP8F
	ANDI	T1,77		;SIX BIT BYTES FOR PDP8
	CALL	RADTYP
	SOJLE	T5,B3.TYP
	CALL	COMTYP		;TYPE A COMMA
	LDB	T1,[POINT 8,DATA,27]
	SKIPE	PDP8F
	LDB	T1,[POINT 6,DATA,29]
	CALL	RADTYP		;TYPE IN CURRENT RADIX
	SOJLE	T5,B3.TYP
	CALL	COMTYP		;TYPE A COMMA
	CALL	NXTDWD		;GET NEXT DATA WORD
	JRST	DATBYT
	PJRST	B3.TYP		;TYPE 3 SPACES
; TO TYPE A NUMBER IN THE CURRENT RADIX
; CALL	MOVE	T1,<NUM TO TYPE>
;	CALL	RADTYP	;CLOBBERS T1
;	RETURN		;OTHER REGS PRESERVED
RADTYP:	CALL	SAVE24
	HRRZ	T3,ORADIX
	CALL	RADTY2
	CAIN	T3,^D10
	CALL	PERTYP		;TYPE A "."
	RET

;HERE TO TYPE DECIMAL NUMBER
; CALL	MOVE	T1,<NUM TO TYPE>
;	CALL	DECTYP	;CLOBBERS T1
;	RETURN		;OTHER REGS PRESERVED
DECTYP:	CALL	SAVE24
	MOVEI	T3,^D10
	JRST	RADTY2

;HERE TO TYPE AN OCTAL NUMBER AS SIX DIGITS
; CALL	MOVE	T1,<NUM TO TYPE>
;	CALL	OCTYPE	;CLOBBERS T1
;	RETURN		;OTHER REGS PRESERVED
OCTYP6:	CALL	SAVE24
	MOVEI	T3,^D8
	MOVEI	T4,6
	JRST	RADTY3

;HERE TO TYPE AN OCTAL NUMBER
; CALL	MOVE	T1,<NUM TO TYPE>
;	CALL	OCTYPE	;CLOBBERS T1
;	RETURN		;OTHER REGS PRESERVED
OCTYPE:	CALL	SAVE24
	MOVEI	T3,^D8
	;JRST	RADTY2

RADTY2:	SETZ	T4,
RADTY3:	JUMPGE	T1,RADTY5
	MOVMS	T1
	CALL	MINTYP

RADTY5:	IDIVI	T1,(T3)
	HRLM	T2,(P)
	SOSG	T4
	SKIPE	T1
	CALL	RADTY5
RADTY7:	HLRE	T1,(P)
	ADDI	T1,"0"
	CAILE	T1,"9"
	ADDI	T1,7		;DOING HEX
	PJRST	TYPCHR
;HERE TO TYPE A DECIMAL NUMBER WITH COMMAS
PDECTY:	CALL	SAVE24
	MOVEI	T3,^D10
	JUMPGE	T1,PRADT5
	MOVMS	T1
	CALL	MINTYP
PRADT5:	IDIVI	T1,(T3)
	HRLM	T2,(P)
	JUMPE	T1,RADTY7
	PUSH	P,[EXP RADTY7]
	IDIVI	T1,(T3)
	HRLM	T2,(P)
	JUMPE	T1,RADTY7
	PUSH	P,[EXP RADTY7]
	IDIVI	T1,(T3)
	HRLM	T2,(P)
	JUMPE	T1,RADTY7
	PUSH	P,[54-60,,RADTY7]
	PUSH	P,[EXP RADTY7]
	JRST	PRADT5

SIXTYP:	MOVEM	T1,T2
SXTYP1:	SETZ	T1,
	LSHC	T1,6
	ADDI	T1,40
	CALL	TYPCHR
	JUMPN	T2,SXTYP1
	RET
COLTYP:	PUSH	P,T1
	MOVEI	T1,":"
	PJRST	TYPEIT

QESTYP:	PUSH	P,T1
	MOVEI	T1,"?"
	PJRST	TYPEIT

TABTYP:	PUSH	P,T1
	MOVEI	T1,"	"
TYPEIT:	CALL	TYPCHR
	JRST TPOPJ

CRLTYP:	PUSH	P,T1
	MOVEI	T1,15		;CARRIAGE RETURN
	CALL	TYPCHR
	MOVEI	T1,12		;LINEFEED
	PJRST	TYPEIT

B3.TYP:	CALL	BLANKT
	CALL	BLANKT
	;JRST	BLANKT
BLANKT:	PUSH	P,T1
	MOVEI	T1," "
	PJRST	TYPEIT

COMTYP:	PUSH	P,T1
	MOVEI	T1,","
	PJRST	TYPEIT

PERTYP:	PUSH	P,T1
	MOVEI	T1,"."
	PJRST	TYPEIT

PCNTYP:	PUSH	P,T1
	MOVEI	T1,"%"
	PJRST	TYPEIT

HSHTYP:	PUSH	P,T1
	MOVEI	T1,"#"
	PJRST	TYPEIT

MINTYP:	PUSH	P,T1
	MOVEI	T1,"-"
	PJRST	TYPEIT

PLUTYP:	PUSH	P,T1
	MOVEI	T1,"+"
	PJRST	TYPEIT
;HERE TO TYPE OR PRINT A STRING OF CHARACTERS
; CALL	MOVEI	T1,<ADR OF ASCIZ STRING>
;	CALL	TYPSTR
TYPSTR:	PUSH	P,T2
	MOVE	T2,[POINT 7,0]
	ADDI	T2,(T1)		;COPY STRING POINTER
TYPST3:	ILDB	T1,T2		;GET NEXT CHAR
	JUMPE	T1,TYPST5
	CALL	TYPCHR		;TYPE THE CHARACTER
	JRST	TYPST3
TYPST5:	POP	P,T2		;RESTORE REGISTER
	RET

;HERE TO TYPE OR PRINT A SINGLE CHARACTER
TYPCHR:	TXNE	FLG,F.NOUT	;SUPRESSING OUTPUT?
	RET			;YES
	SKIPE	OHD		;DOING A DUMP ?
	JRST	TYPCH3		;YES
	OUTCHR	T1
	RET

TYPCH3:	SOSGE	OHD+2		;ROOM IN BUFFER
	JRST	TYPCH4		;NO
	IDPB	T1,OHD+1
	RET
TYPCH4:	OUT
	JRST	TYPCH3
	HALT
;HERE TO TYPE PROGRAM NAME
IDTYPE:	TYPE	<DDT11 >
	LDB	T1,[POINT 9,.JBVER,11]
	CALL	OCTYPE
	LDB	T1,[POINT 6,.JBVER,17]
	MOVEI	T1,100(T1)
	CAIE	T1,100
	CALL	TYPCHR
	MOVEI	T1,"("
	CALL	TYPCHR
	HRRZ	T1,.JBVER
	CALL	OCTYPE
	MOVEI	T1,")"
	CALL	TYPCHR
	LDB	T1,[POINT 3,.JBVER,2]
	MOVNS	T1
	SKIPE	T1
	CALL	OCTYPE
	HRROI	T1,3		;CODE FOR PROGRAM NAME
	GETTAB	T1,
	JRST	IDTYP2
	CAMN	T1,[SIXBIT \DDT11\]
	JRST	IDTYP2
	PUSH	P,T1
	TYPE	< = >
	POP	P,T1
	CALL	SIXTYP
IDTYP2:	SKIPN	SYMDEV
	JRST	IDTYP3
	TYPE	< /SYMBOLS=>
	MOVEI	T1,SYMDEV
	CALL	FILTYP
IDTYP3:	CALL	BLANKT		;TYPE A BLANK
	RET
;HERE TO TYPE THE DATE
DATETY:	DATE	T1,
DATET0:	IDIVI	T1,^D31*^D12	;LEAVE YEAR-64 IN T1
	ADDI	T1,^D64
	PUSH	P,T1		;SAVE YEAR
	IDIVI	T2,^D31
	ADDI	T2,MONTAB	;GET NAME OF MONTH
	PUSH	P,T2		;SAVE ADR OF MONTH NAME
	AOS	T1,T3		;GET DAY
	CALL	DECTYP
	CALL	MINTYP		;TYPE A "-"
	POP	P,T1		;GET MONTH
	CALL	TYPSTR		;TYPE MONTH NAME
	CALL	MINTYP		;TYPE A "-"
	POP	P,T1		;GET YEAR
	CALL	DECTYP
	RET

MONTAB:	ASCIZ	\Jan\
	ASCIZ	\Feb\
	ASCIZ	\Mar\
	ASCIZ	\Aprl\
	ASCIZ	\May\
	ASCIZ	\June\
	ASCIZ	\July\
	ASCIZ	\Aug\
	ASCIZ	\Sept\
	ASCIZ	\Oct\
	ASCIZ	\Nov\
	ASCIZ	\Dec\
;HERE TO TYPE THE TIME OF DAY

TIMTYP:	CALL	SAVE4
	MSTIME	T1,		;GET TIME OF DAY IN MS
TIMTY1:	PUSH	P,T1		;SAVE TIME
	IDIVI	T1,^D1000	;GET RID OF MS
	IDIVI	T1,^D60		;LEAVES SECONDS IN T2
	PUSH	P,T2
	CALL	TIMTY3		;TYPE HH:MM
	CALL	COLTYP		;TYPE A COLON
	POP	P,T1
	CALL	DC2TYP		;TYPE 2 DIGIT DECIMAL NUMBER
	POP	P,T1		;TIME ORIGINAL TIME AGAIN
	CAIL	T1,^D60*^D1000	;LESS THAN A MINUTE ?
	RET			;NO SO DONE
	CALL	PERTYP		;TYPE A "."
	IDIVI	T1,^D1000	;GET MS FROM ORIGINAL TIME
	EXCH	T1,T2
	CAIL	T2,^D10
	JRST	[IDIVI	T1,^D100	;LEAVE TENTHS
		JRST	DECTYP ]	;TYPE TENTH'S
	IDIVI	T1,^D10
	JRST	DC2TYP		;TYPE HUNDRETHS
TIMTY3:	IDIVI	T1,^D60		;LEAVES MIN IN T2
	PUSH	P,T2
	CALL	DECTYP
	CALL	COLTYP		;TYPE A COLON
	POP	P,T1
	JRST	DC2TYP		;TYPE 2 DIGIT DECIMAL NUMBER

DC2TYP:	CAIL	T1,^D10
	JRST	DECTYP
	PUSH	P,T1
	MOVEI	T1,"0"
	CALL	TYPCHR
	POP	P,T1
	JRST	DECTYP
	SUBTTL	DUMP TO FILE

ESC..D:	TXO	FLG,F.FLIP	;ASSUME DOING COMMAND LOGGING
	TXZ	FLG,F..FOO	;ASSUME NOT DOING A DISASSEMBLY
	CALL	ESC.D0		;SET UP TO CALL OPNFIL
	SKIPE	CMDFIL		;PROCESSING A COMMAND FILE ?
	JRST	DUMP0		;DON'T OPEN A NEW DUMP
	CALL	OPNFIL
	JRST	DUMP9
	SKIPN	FILDEV
	JRST [TYPE <
?$D requires a dump file specification
>
		JRST LEVEL0]
	TXZ	FLG,F.FLIP	;NOT DOING COMMAND LOGGING
	CALL	ESC.D3		;PUT TITLE LINE ON DUMP
DUMP0:	SETZM	CACHEL		;SWEEP CACHE
	TXO	FLG,F.CACH	;PUT USE IT AFTER IT IS SET UP
	HRRO	DOT,SBEGIN	;WHERE TO BEGIN DUMP
	TXNN	FLG,F..FOO	;DOING A DIASSSEMBLY ?
	JRST	DUMP2		;GO DO USUAL DUMP
	PUSH	P,O.MODE	;SAVE OUTPUT MODE
	PUSH	P,BYTCNT	;AND REPETITION COUNT
DISA10:	CALL	CRLTYP		;TYPE A <CR><LF>
	CALL	TABTYP		;TYPE A <HT>
	CALL	DUMP6		;FIND IF LOCATION IS REAL
	JRST	DUMP8		;NOT REAL SO DONE
	HRRZ	T1,DOT		;GET CURRENT LOCATION
	CALL	OCTYP6		;TYPE SIX DIGIT OCTAL NUMBER
	CALL	TABTYP
	HRRZ	T1,DOT		;CURRENT LOCATION
	SETZM	O.MODE		;ASSUME DUMPING AS AN INSTRUCTION
	CALL	CNINWD		;FIND HOW MANY WORDS IN INSTRUCTION
	JRST	[	MOVEI	T1,1		;CODE FOR ADR TYPEOUT
			MOVEM	T1,O.MODE
			JRST	.+1 ]
	MOVEI	T5,(T1)		;NUMBER OF WORDS
	MOVEI	T1,(DOT)	;CURRENT ADR
	CALL	DISA40
	MOVEI	T1,2(DOT)
	CALL	DISA40
	MOVEI	T1,4(DOT)
	CALL	DISA40
	HRRZ	T1,DOT		;GET ADR TO TYPE TAG
	CALL	VALFND		;TRY TO FIND TAG FOR THIS LOCATION
	JRST	DISA20		;NO TAG HERE
	HRRZ	T1,DOT
	CAME	T1,1(SYM)	;EXACT MATCH ?
	JRST	DISA20		;NO IS SAME AS NOT CLOSE
	MOVE	T1,(SYM)	;GET SYMBOL NAME
	CALL	SIXTYP
	CALL	COLTYP		;PUT COLON AFTER SYMBOL
DISA20:	CALL	TABTYP
	CALL	DATYPE
	MOVE	T1,DOTFOO
	SETZM	DOTFOO
	CALL	DOTINC
	MOVEM	T1,DOT
	HRRZS	T1
	CAMG	T1,S..END
	JRST	DISA10
DISA90:	POP	P,BYTCNT	;RESTORE REPETITION COUNT
	POP	P,O.MODE	;AND OUTPUT MODE
	JRST	DUMP8

DISA40:	SOJL	T5,TABTYP
	MOVEI	T2,2
	CALL	GETWRD
	JRST	DISA90		;CAN'T GET = DONE
	CALL	OCTYP6
	JRST	TABTYP
DUMP1:	HRRZ	T1,DUMPA	;LAST ADDRESS WE TYPED
	ADDI	T1,20
	CAILE	T1,(DOT)	;TIME TO TYPE ADR AGAIN ?
	JRST	DUMP4
DUMP2:	CALL	CRLTYP
	CALL	CRLTYP
	HRRZ	T1,DOT
	CALL	ADRTYP
	JUMPE	SYM,DUMP3	;IF THERE WAS NO SYMBOL DON'T REPEAT
	CALL	BLANKT
	MOVEI	T1,"="
	CALL	TYPCHR
	CALL	BLANKT
	HRRZ	T1,DOT
	CALL	OCTYPE
DUMP3:	CALL	COLTYP		;TYPE A COLON
	HRRZ	T1,DOT
	ANDI	T1,177760	;IN CASE WAS HIGH
	MOVEM	T1,DUMPA	;REMEMBER LAST ADR WE TYPED
	CAIA			;SO WE DO AN EXTRA TAB
DUMP4:	TRNN	DOT,7
	CALL	TABTYP

	CALL	DUMP6		;GET NEXT WORD TO DUMP
	JRST	DUMP8		;ALL DONE
	CALL	DATYPE		;DUMP LOCATION
	MOVE	T1,DOTFOO
	SETZM	DOTFOO
	CALL	DOTINC
	MOVEM	T1,DOT
	HRRZS	T1
	CAMG	T1,S..END
	JRST	DUMP1

DUMP8:	CALL	CRLTYP
	CALL	CRLTYP
DUMP85:	TXNN	FLG,F.FLIP	;DON'T FLUSH IF LOGGING COMMANDS
	CALL	DONE.W
	CALL	CRLTYP
	CALL	CRLTYP
	JRST	LEVEL0

DUMP9:	SETZM	OHD
	TYPE	<error writing >
	CALL	FILERR
	JRST	LEVELB

;HERE TO USE DOT TO GET THE NEXT WORD FROM PDP11 (AND LOAD CACHE)
; CALL	CALL	DUMP6
;	LOSE RETURN
;	WIN RETURN DATA IN T1

DUMP6:	HRRZ	T1,DOT		;GET ADDRESS TO EXAMINE
	MOVE	T2,S..END
	SUB	T2,T1
	CAIL	T2,EXMAX
	SKIPA	T2,[EXP EXMAX]
	ADDI	T2,^D2
	CALL	GETWRD
	RET
	MOVEM	T1,DATA
	RETSKP FAST
;HERE BECAUSE USER TYPED $Y - INVOKES A COMMAND FILE

ESC..Y:	TYPE	<
	Log responses where: >
	CALL	ESC.D0		;SET UP TO CALL OPNFIL
	SETZ	T1,		;NO DEFAULT FILE NAME
	CALL	OPNFL0
	JRST	LEVELB
	SKIPN	FILDEV
	JRST	[TYPE <
?$Y requires log file specification
>
		JRST LEVEL0]
	TXZ	FLG,F.WRIT!F.APND	;REMEMBER WE ARE READING
	MOVE	T1,[SIXBIT \DDT11\]
	MOVE	T2,[SIXBIT \DDTCMD\]	;DEFAULT EXTENSIONS
	MOVE	T3,[CMDDSP,,CMDSWL]
	MOVEI	T4,RSKP
	PUSH	P,OHD		;IN CASE LOGGING
	SETZM	OHD
	CALL	OPNFIL
	JRST	[POP P,OHD
		CALL DONE.W
		JRST LEVELB]
	POP	P,OHD
	SKIPN	FILDEV
	JRST	[CALL DONE.W
		TYPE <
?$Y requires a command file specification
>
		JRST LEVEL0]
	CALL	ESC.D3		;PUT TITLE LINE ON DUMP
	TXZ	FLG,F.CERR	;NO COMMAND ERRORS YET
	SETZM	CSECHO		;NOT SUPPRESSING ECHO YET
	SETOM	CMDFIL
	SETZM	CMDCNT		;AT FIRST CHAR
	SETZM	CMDFAK
	JRST	LEVEL0


;HERE TO EAT UP THE REST OF A BAD FILE NAME
LEVELB:	CAIN	T5,15		;LINE ENDED WITH CR?
	JRST	LEVEL0		;YES
	CALL	GETCHR		;GET A CHARACTER
	MOVE	T5,T1		;
	JRST	LEVELB

;HERE TO GET A CHAR FROM A COMMAND FILE

CMDCH1:	SETZM	CMDFAK
CMDCHR:	SKIPE	T1,CMDFAK	;PREVIOUS "^ATEXT^A" TO HANDLE ?
	JRST	[CAMN	T1,[POINT 6,CMDFAK+1,35]
		JRST	CMDCH1
		ILDB	T1,CMDFAK	;GET NEXT CHAR
		JUMPE	T1,CMDCH1	;IF BLANK HIT END
		MOVEI	T1,40(T1)	;CONVERT TO ASCII
		JRST	CMDCH8 ]
	CALL	FILCHR
	JRST	CMDONE		;DONE WITH COMMAND FILE
	AOS	CMDCNT		;COUNT CHARACTERS INTO FILE
	CAIN	T1,177		;IS THIS A RUBOUT ?
	JRST	CMDCHR		;IGNORE IT
	CAIN	T1,1		;IS THIS A "^A"
	JRST	CMDSUB		;SPECIAL SUBSTITUTION
	SKIPGE	CSECHO		;SEARCHING FOR A TAG ?
	JRST	CMDCH8		;YES SO XON, XOF STUFF
	CAIN	T1,37&"S"	;IS THIS AN XOF ?
	JRST	[HLLOS	CSECHO		;YES SHUT OFF ECHOING
		JRST	CMDCHR ]	;ON TO NEXT CHAR
	CAIN	T1,37&"Q"	;IS THIS AN XON ?
	JRST	[HLLZS	CSECHO		;YES SO TURN ECHOING BACK ON
		JRST	CMDCHR ]	;ON TO NEXT CHARACTER
CMDCH8:	SKIPE	CSECHO		;DOING AN ECHO ?
	JRST	RSKP
	PUSH	P,T1		;SAVE CHARACTER
	CAIN	T1,33		;IS THIS AN ALTMODE ?
	MOVEI	T1,"$"		;YES SO ECHO RIGHT
	CALL	TYPCHR
	JRST TPOPJ1		;GET CHAR BACK, AND SKIP RETURN

CMDSUB:	CALL	SAVE24
	MOVE	T4,[POINT 6,CMDFAK+1]
	SETZM	CMDFAK+1
CMDCH2:	CALL	FILCHR		;GET NEXT CHAR
	JRST	CMDCH7
	AOS	CMDCNT		;COUNT THIS CHAR
	CAIN	T1,1		;IS THIS THE TRAILING "^A" ?
	JRST	CMDCH4		;GO EVALUATE WHAT WE HAVE
	CAIL	T1,"A"+40	;CHECK FOR LC
	CAILE	T1,"Z"+40
	TRC	T1,40		;CONVERT TO SIXBIT
	CAME	T4,[POINT 6,CMDFAK+1,35]
	IDPB	T1,T4
	JRST	CMDCH2
CMDCH4:	MOVE	T1,CMDFAK+1	;GET SYMBOL WE BUILT
	CALL	SYMFND		;SEE IF THERE IS A SYMBOL FOR THIS
CMDCH7:	JRST	[MOVEI	T1,1		;THIS IS HIS "^A"
		JRST	CMDCH8 ]
	PUSH	P,[EXP CMDCHR]
	MOVE	T1,1(SYM)	;GET VALUE
	MOVE	T3,[POINT 6,CMDFAK+1]
	MOVEM	T3,CMDFAK
	SETZM	CMDFAK+1
	MOVE	T4,ORADIX
CMDCH6:	IDIVI	T1,(T4)
	HRLM	T2,(P)
	SKIPE	T1
	CALL CMDCH6
	HLRZ	T1,(P)
	IORI	T1,20		;CONVERT TO SIXBIT
	IDPB	T1,T3
	RET


;HERE WHEN DONE WITH A COMMAND FILE

CMDONE:	SKIPE	SYM,SYMBEG	;POINTER TO BEGINING OF SYMBOL TABLE
CMDDN1:	CAMN	SYM,SYMEND	;HIT END YET ?
	JRST	CMDDN7		;DONE
	LDB	T1,[POINT 6,(SYM),5]
	CAIN	T1,'  %'
	JRST	[MOVE	T1,(SYM)	;GET SYMBOL
		CALL	DELSYM		;FLUSH SYMBOL
		JRST	CMDONE ]	;GO GET REST
	MOVEI	SYM,4(SYM)	;POINT TO NEXT SYMBOL
	JRST	CMDDN1		;CHECK IT
CMDDN7:	SETZM	CMDFIL		;DONE WITH FILE NOW
	CALL	DONE.W		;IN CASE LOGGING COMMANDS
	TYPE	<
	Finished command file

>
	RET
;HERE TO SETUP FOR CALL TO OPNFIL
ESC.D0:	TXO	FLG,F.WRIT!F.APND	;REMEMBER WE ARE WRITING
	HRROI	T1,3
	GETTAB	T1,		;GET NAME OF JOB
	MOVE	T1,[SIXBIT \DDT11\]
	MOVSI	T2,'LSD'
	MOVE	T3,[DMPDSP,,DMPSWL]
	MOVEI	T4,RSKP
	RET

;HERE TO PUT A TITLE LINE ON A DUMP
ESC.D3:	MOVEI	T1,[BYTE (7)15,12,14,0]
	CALL	TYPSTR
	TYPE	<dump made >
	CALL	TIMTYP		;TYPE TIME
	CALL	BLANKT
	CALL	DATETY		;TYPE DATE
	TYPE	< of />
	MOVE	T1,[SIXBIT \PORT:\]
	SKIPE	MEMORY
	MOVE	T1,[SIXBIT \FILE:\]
	SKIPE	NODE.N
	MOVE	T1,[SIXBIT \NODE:\]
	CALL	SIXTYP
	SKIPE	MEMORY
	JRST	[	MOVEI	T1,DMPDEV
			CALL	FILTYP		;TYPE FILE ID
			JRST	ESC.D4 ]
	SKIPN	T1,NODE.N
	HRRZ	T1,PORT
	MOVEI	T2,OCTYPE
	TLNE	T1,-1
	MOVEI	T2,SIXTYP
	CALL	(T2)
ESC.D4:	TYPE	<
	by >
	CALL	IDTYPE
	CALL	CRLTYP
	CALL	CRLTYP
	RET
	SUBTTL	DUMP TO A BINARY FILE

ESC..P:	TXO	FLG,F.WRIT!F.PACK	;REMEMBER WE ARE WRITING
	TXZ	FLG,F.APND
	MOVE	T1,[SIXBIT /KRUFT/]	;DEFAULT FILE NAME
	MOVSI	T2,'BIN'	;DEFAULT EXTENSION
	MOVE	T3,[PUNDSP,,PUNSWL]

	SETZ	T4,
	SETZM	PROM.F#
	CALL	OPNFIL		;OPEN FILE
	JRST	LEVELB
	SKIPN	FILDEV
	JRST	[TYPE <
?$P requires a dump file specification
>
		JRST LEVEL0]
	SKIPE	T1,PROM.F#
	JRST	PROM
	MOVEI	T1,^D18		;ASSUME HALFWORD WRITES
	TXNN	FLG,F.PACK	;UNLESS DOING PAPER TAPE
	MOVEI	T1,^D36		;IN WHICH CASE DO FULL WORDS
	DPB	T1,[POINT 6,OHD+1,11]
	MOVE	DOT,SBEGIN
	SETZM	CACHEL		;SWEEP THE CACHE
	TXO	FLG,F.CACH	;CAN USE THE CACHE FROM NOW ON
ESCP00:	SETZ	T4,		;NUMBER OF BYTES FOR CURRENT SEGMENT
	HRRZ	T3,DOT		;NEXT ADR TO GET
ESCP02:	MOVE	T1,T3		;NEXT ADR TO EXAMINE
	IDIVI	T1,^D36
	PUSH	P,T1		;SAVE RELATIVE PDP10 WORD ADR
	MOVN	T1,T2
	MOVSI	T2,400000	;MAKE BIT FOR WORD
	LSH	T2,(T1)		; MAKE IT RIGHT BIT
	POP	P,T1		;GET RELATIVE WORD ADR AGAIN
	TDNN	T2,@MEMUSE
	JRST	ESCP10		;WORD NOT IN USE
	MOVE	T1,T3		;NEXT ADR TO EXAMINE
	MOVEI	T2,1		;ONLY WANT ONE BYTE
	CALL	GETWRD		;TRY TO GET THE WORD
	JRST	ESCP10
	AOS	T4		;ANOTHER WORD TO DUMP
	CAML	T3,S..END
	JRST	ESCP10		;DONE
	CAIGE	T4,^D256
	AOJA	T3,ESCP02
ESCP10:	JUMPN	T4,ESCP11	;ANY BYTES
	AOJA	DOT,ESCP20	;NO SO ADVANCE WHERE TO DUMP FROM
ESCP11:	SETZ	T5,		;INITIALIZE THE CHECKSUM
	MOVEI	T1,1
	CALL	WRTWRD		;WRITE BINARY WORD
	MOVE	T1,T4		;COUNT FOR SEGMENT
	ADDI	T1,6
	CALL	WRTWRD
	HRRZ	T1,DOT
	CALL	WRTWRD
ESCP12:	HRRZ	T1,DOT
	AOS	DOT
	MOVEI	T2,1
	CALL	GETWRD
	EXIT
	SOJLE	T4,ESCP16
	PUSH	P,T1		;SAVE DATA
	HRRZ	T1,DOT
	AOS	DOT
	MOVEI	T2,1
	CALL	GETWRD
	EXIT
	DPB	T1,[POINT 8,(P),27]
	POP	P,T1
	CALL	WRTWRD
	SOJG	T4,ESCP12
	MOVE	T1,T5		;GET CHECKSUM
	ANDI	T1,377		;STRIP EXTRA BITS
	CALL	WRTWRD
	JRST	ESCP19
ESCP16:	SUB	T5,T1		;INCLUDE LAST CHAR IN CHECKSUM
	DPB	T5,[POINT 8,T1,27]
	CALL	WRTWRD

ESCP19:	SETZ	T1,		;ADD PAD BETWEEN SEQMENTS
	CALL	WRTWRD
	CALL	WRTWRD
	CALL	WRTWRD
ESCP20:	HRRZ	T1,DOT
	CAMGE	T1,S..END
	JRST	ESCP00
	SETZ	T5,		;INITIALIZE THE CHECKSUM
	MOVEI	T1,1
	CALL	WRTWRD
	MOVEI	T1,6
	CALL	WRTWRD
	SKIPN	T1,GOTO		;STARTING ADDRESS
	MOVEI	T1,1
	CALL	WRTWRD
	MOVE	T1,T5
	ANDI	T1,377
	CALL	WRTWRD
	CALL	DONE.W		;CLOSE OUTPUT FILE
	JRST	LEVEL2

WRTWRD:	SUB	T5,T1
	ROT	T1,-^D8
	SUB	T5,T1
	ROT	T1,^D8
	TXNN	FLG,F.PACK	;PUNCHING TAPE ?
	JRST	WRTBN4
	SOSGE	OHD+2		;IS THERE ROOM IN BUFFER ?
	CALL	WRTBN9		;NO ROOM
	ANDI	T1,177777	;STRIP EXTRA BITS
	IDPB	T1,OHD+1	;PUT WORD INTO BUFFER
	RET
WRTBN4:	SOSGE	OHD+2		;ROOM FOR LOW ORDER BITS ?
	CALL	WRTBN9
	PUSH	P,T1
	ANDI	T1,377		;ONLY 8 BITS
	IDPB	T1,OHD+1
	POP	P,T1
	LDB	T1,[POINT 8,T1,27]
	SOSGE	OHD+2
	CALL	WRTBN9
	IDPB	T1,OHD+1
	RET
WRTBN9:	SOS	(P)
	SOS	(P)
	OUT
	RET
	JRST	FILERR		;COMPLAIN

PUNIMG:	TXZA	FLG,F.PACK
PUNPAK:	TXO	FLG,F.PACK
	RET

PUNBM8:	SETO	T1,
	CAIA
PUNM93:	MOVEI	T1,1
	MOVEM	T1,PROM.F#
	RET
PROM:	CALL	PROM.2
	NOP
	CALL	PROM.2
	LSH	T1,-^D4
	SKIPG	PROM.F		;SKIP IF M9301
	JRST	DUMP85
	CALL	PROM.2
	LSH	T1,-^D8
	CALL	PROM.2
	LSH	T1,-^D12
	JRST	DUMP85
PROM.2:	MOVEI	T1,377
	CALL	TYPCHR
	MOVE	DOT,SBEGIN
	MOVEI	T4,^D128	;FOR BM873
	SKIPL	PROM.F
	MOVEI	T4,^D256	;FOR M9301
PROM.4:	HRRZ	T1,DOT
	MOVEI	T2,2		;REQUEST 2 BYTES
	CALL	GETWRD
	SETZ	T1,
	TRC	T1,777001
	XCT	@(P)
	SKIPGE	PROM.F#
	PUSH	P,T1
	ANDI	T1,17
	CALL	TYPCHR
	SKIPL	PROM.F
	JRST	PROM.6
	POP	P,T1
	LSH	T1,-^D8
	ANDI	T1,17
	CALL	TYPCHR
PROM.6:	ADDI	DOT,2
	SOJG	T4,PROM.4
	SKIPGE	PROM.F
	JRST	PROM.9		;DON'T NEED FOR BM873

	HRRO	DOT,S..END
	MOVEI	T4,^D256
PROM.8:	HRRZ	T1,DOT
	MOVEI	T2,2
	CALL	GETWRD
	SETZ	T1,
	TRC	T1,777001
	XCT	@(P)
	ANDI	T1,17
	CALL	TYPCHR
	ADDI	DOT,2
	SOJG	T4,PROM.8

PROM.9:	MOVEI	T4,^D256
	SETZ	T1,
	CALL	TYPCHR
	SOJGE	T4,.-1
	AOS	(P)
	RET
;HERE TO GET A CHARACTER IN LINE MODE
RDCHAR:	SKIPE	CMDFIL		;ARE WE DOING COMMAND FILE STUFF ?
	CALL	CMDCHR		;GET A COMMAND FILE CHAR
	INCHWL	T1		;GET THE NEXT CHAR
	CAIN	T1,32		;IS THIS A CONTROL Z ?
	EXIT
	CALL	GETCH8
	JRST	RDCHAR
	RET

;HERE TO GET A CHARACTER FROM THE TTY
GETCHR:	TXZ	FLG,F.NOUT	;STOP SUPRESSING OUTPUT
	SKIPE	T1,CMDTKR	;ARE WE RETYPING COMMAND LINE ?
	JRST	GETCH3		;YES SO DO IT THAT WAY
	SKIPE	CMDFIL		;ARE WE DOING COMMAND FILE STUFF ?
	CALL	CMDCHR		;GET A COMMAND FILE CHAR
	INCHRW	T1		;GET THE NEXT CHAR
GETCH1:	CALL	GETCH8
	JRST	GETCHR
	RET

GETCH3:	CAME	T1,CMDLIM	;RETYPED ENOUGH YET ?
	JRST	GETCH4		;NOT YET
	SETZM	CMDTKR		;DONE WITH TAKER
	JRST	GETCHR
GETCH4:	ILDB	T1,CMDTKR
	JRST	GETCH1

GETCH8:	JUMPE	T1,R		;FLUSH NULLS
	TXNN	FLG,F.TEXT	;DOING TEXT MODE STUFF ?
	CAIE	T1,15		;IS THIS A CARRIAGE RETURN ?
	JRST	GETCH9
	CALL	GETCHR		;GET LF
	CAIN	T1,15		;WAS THIS A 2ND CR ?
	JRST	GETCH8		;YES SO FLUSH IT ALSO
	MOVEI	T1,15		;CONVERT LF TO CR
GETCH9:	RETSKP FAST
	SUBTTL	/FILE: HANDLING

;HERE BECAUSE FOUND /FILE IN RESPONSE INITIAL DIAGLOGUE
; READ EITHER A BOOT11 OR NETLDR DUMP OR A BINARY FILE

RDDUMP:	SKIPN	FILDEV		;FILE SPECIFIED?
	JRST [TYPE	<
?Dump file specification is required with this switch
>
	RET]
	SETZB	T1,T2		;IN CASE CORE NOT SETUP YET
	SKIPG	MEMLIM		;ANYTHING PUT IN MEMORY YET ?
	CALL	PUTFOO		;NO SO MAKE SOME CORE
	SETZ	AC1,		;HIGHEST LOCATION SO FAR
	MOVE	T1,[FILDEV,,DMPDEV]
	BLT	T1,DMPDEV+$FBLEN-1	;COPY FILDEV, FILNAM, FILEXT, FILPPN, FILTIM
	MOVE T1,[SIXBIT /DTED00/];IF FILE STARTS WITH DTED, ASSUME BIN
	XOR T1,FILNAM
	TDNN T1,[XWD -1,770000]	;MASK DOR "DTED"
	JRST [	TXNN FLG,F.FLOP	;IF NOT "/BINARY"
		TXO FLG,F..FOO	;SAY /DTE FOR HIM
		JRST .+1]
	TXNE FLG,F..FOO		;IS IT /DTE?
	JRST RDTDMP		;YES, READ THE DUMP
	HLRZ	T1,FILEXT	;GET FILE EXTENSION
	CAIE	T1,'BIC'	;OTHER WAY TO SPELL BIN
	CAIN	T1,'BIN'	;DID WE READ A BINARY FILE ?
	TXO	FLG,F.FLOP	;YES SO READING BINARY FILE
	SETZB	T5,T4		;ACCUMULATE CHECKSUM HERE
	TXNE	FLG,F..FOO	;DID WE GET A /DTELDR
	JRST	RDTDMP		;YES SO GO READ IT
	TXZN	FLG,F.FLOP	;READING A BINARY FILE ?
	JRST	RDUMP0		;NO READING A DUMP

	MOVEI	T1,^D36		;WANT 36BIT HEADERS
	CALL	SETIHD		;SO SET EM

;HERE TO LOOK FOR INITIAL 1
RDBN10:	CALL	RDBN70		;GET NEXT CHAR
	JRST	RDUMP9		;ALL DONE
	JUMPE	T1,RDBN10	;LOOP ON HEADER
	CAIE	T1,1		;IS THIS LEADING 1 ?
	JRST	RDBNER		;ERROR IN FORMAT
	CALL	RDBN70		;GET NEXT WORD = 0
	JRST	RDBNER		;ERROR IN FORMAT
	JUMPN	T1,RDBNER
	CALL	RDBN60		;GET 16BIT WORD = COUNT
	MOVEI	T3,-6(T1)	;MAKE BYTE COUNT
	CALL	RDBN60		;GET 16BIT WORD = ADR
	MOVE	T2,T1		;COPY ADDRESS
	TXZ	FLG,F.FLIP	;NO DATA MAYBE
	JUMPE	T3,RDBN30
RDBN20:	TXO	FLG,F.FLIP	;THIS SEGMENT HAD DATA
	CALL	RDBN70		;GET NEXT BYTE TO STUFF
	JRST	RDBNER
	CAMLE	T2,AC1
	HRRZ	AC1,T2		;NEW HIGHEST LOCATION LOADED
	CALL	PUTFOO		;PUT BYTE INTO MEMORY
	AOS	T2		;ADVANCE LOCATION COUNTER
	SOJG	T3,RDBN20
RDBN30:	CALL	RDBN60		;INCLUDE CHECKSUM IN CALC
	TRNE	T5,377		;TEST CHECKSUM
	JRST	[	TYPE	<CHECKSUM ERROR>
			EXIT	]
	TXNE	FLG,F.FLIP
	JRST	RDBN10		;PROBABLY MORE DATA
	ANDI	T2,177776	;ONLY 16 BITS & EVEN
	MOVEM	T2,GOTO		;SAVE STARTING ADDRESS
	MOVEM T2,SIMREG+PC	;SET INITIAL PC
	RELEASE 1,
	SETZM FILDEV
	JRST	RDUMP9
;HERE TO READ A DTELDR OR MDM DUMP
;THE LENGTH OF THE FILE IS CONTAINED IN THE "FILLEN" WORD.
;DTELDR AND MCBDUMP DUMPS ARE (BY BLIND LUCK) IN THE SAME FORMAT AS DDT11'S
; INTERNAL MEMORY REPRESENTATION.

RDTDMP:	MOVE T1,FILLEN
	SUBI T1,^D256
	TXNE FLG,F.MSYS
	MOVEM T1,FILLEN
	CALL	POSYMT		;MAKE SURE THE SYMTAB IS WHER EIT OUGHT
	PUSH	P,SYMBEG	;SAVE WHAT WILL BE THE START OF MEMUSE
	SKIPN	FILLEN
	JRST	[TYPE <
?Attempted to read zero length file
>
		jrst rfile]
	MOVEI	T2,1		;CALCULATE THE			
RDTDM1:	CAML	T2,FILLEN	;  POWER OF TWO			
	JRST	RDTDM2		;  GREATER THAN			
	ASH	T2,1		;  OR EQUAL TO			
	JRST	RDTDM1		;  THE FILE LENGTH		
RDTDM2:	MOVE	T1,T2		;SAVE AS THE MEMORY SIZE	
	ASH	T2,2		;CALCULATE NUMBER OF BYTES	
	MOVEM	T2,MEMLIM	;  AND SAVE THE NUMBER		
	ADDI	T2,43		;CONVERT TO BITS  		
	IDIVI	T2,44		;  (ROUNDED UP)			
	ADD	T1,T2		;ADD MEMUSE, MEMORY SIZES TOGETHER
	PUSH	P,T2		;				
	CALL	MOVSMT		;GET THE ROOM.
	POP	P,T2		;GET BACK MEMUSE LENGTH		
	POP	P,T1		;FIRST FREE LOC BACK
	HRLI	T1,T1		;GET THE INCESTUOUS POINTER
	MOVEM	T1,MEMUSE	; AND SAVE POINTER TO MEMUSE TABLE
	ADD	T1,T2		;RELOCATE BY THE SIZE OF MEMUSE	
	HRRZM	T1,MEMORY	; AND SAVE POINTER TO START OF MEMORY
	HRRZ	T1,MEMUSE	;GET BACK ADDRESS OF USE TABLE
	HRL	T2,T1		;MAKE A BLT POINTER TO
	HRRI	T2,1(T1)	; TO THE USE TABLE
	SETOM	(T1)		;BLT ALL	  		
	MOVE	T3,FILLEN	;  BUT THE LAST			
	IDIVI	T3,44		;  WORD USED IN	 		
	ADD	T3,T1		;  THE MEMUSE TABLE		
	BLT	T2,0(T3)	;  TO "IN USE"			
	MOVE	T5,T3		;				
	MOVE	T1,FILLEN	;				
	ASH	T1,2		;				
	MOVE	T3,T1		;				
	IDIVI	T3,44		;CALCULATE THE			
	IMULI	T3,44		;  THE NUMBER       		
	ADDI	T3,44		;  OF BITS IN MEMUSE OVER	
	SUB	T3,T1		;  A MULTIPLE			
	SETO	T2,		;  OF 36			
	ASH	T2,0(T3)	;				
	MOVEM	T2,1(T5)	;  AND STORE MASK FOR LAST WORD	
	MOVN	T2,FILLEN	;CALCULATE IN "IOWD" FORM	
	HRLZ	T1,T2		;  THE NUMBER OF WORDS TO GET	
	HRR	T1,MEMORY	; MEMORY
	SOS	T1		; FOR A QUICK "IN"
	SETZ	T2,		;TERMINATE THE COMMAND LIST
	SETSTS	1,.IODMP	;SET DUMP MODE IO
	TXNE FLG,F.MSYS
	USETI 1,3
	TXNN FLG,F.MSYS
	USETI	1,1		;GO TO THE FIRST BLOCK
	IN	1,T1		;READ THE FILE
	 CAIA			; OK
	  CALL IFILER		;REPORT THE ERROR
rfile:	RELEAS	1,		;DONE WITH THE FILE
	SETZM FILDEV
	MOVE	AC1,MEMLIM	;PICK UP UP TOP OF MEMORY	
	MOVEM	AC1,DOT		;REMEMBER WHERE WE ARE AS WELL	
	MOVE	AC1,FILLEN	;SET HIGHEST			
	ASH	AC1,2		;  ADDRESS			
	SUBI	AC1,1		;  LOADED			
	JRST	RDUMP9		;DONE
;HERE TO SET BYTE SIZE FOR INPUT HEADER
; CALL	MOVEI	T1,<BYTE SIZE>
;	CALL	SETIHD
SETIHD:	LDB	T3,[POINT 6,IHD+1,11]	;GET S FIELD FROM INPUT POINTER
	DPB	T1,[POINT 6,IHD+1,11]	;SET NEW S FIELD
	MOVEI	T2,^D36
	IDIVI	T2,(T3)		;FIND NUMBER OF BITS/BYTE CURRENT
	MOVEM	T1,T3		;SAVE NEW SIZE
	MOVE	T1,IHD+2	;NUMBER OF BYTES IN CURRENT BUFFER
	IDIVI	T1,(T2)		;MAKE NUMBER OF WORDS IN CURRENT BUFFER
	MOVEI	T2,^D36
	IDIVI	T2,(T3)		;GET NUMBER OF BYTES/WORD IN NEW SIZE
	IMULI	T1,(T2)		;NUMBER OF BYTES OF NEW SIZE
	MOVEM	T1,IHD+2	;SAVE IT
	RET
;HERE TO GET SIXTEEN BITS
RDBN60:	CALL	RDBN70		;GET LOW ORDER BITS
	JRST	RDBNER
	PUSH	P,T2
	LSHC	T1,-^D8		;SHOVE EM INTO T2
	CALL	RDBN70		;GET HIGH ORDER BITS
	JRST	RDBNER
	ROTC	T1,^D8		;ADD LOW ORDER BITS
	POP	P,T2
	RET			;RETURN TO CALLER

;HERE TO GET NEXT BYTE FROM BINARY FILE
RDBN70:	JUMPE	T4,RDBN74	;HALF OF PREVIOUS WORD LEFT ?
	LDB	T1,[POINT 8,T4,27]	;LOW ORDER BITS FROM PREV HLF WRD
	SETZ	T4,		;DONE WITH HALF WORD
	JRST	RDBN79
RDBN74:	SOSGE	IHD+2		;MORE DATA IN BUFFER ?
	JRST	RDBN80		;NO SO READ MORE
	ILDB	T1,IHD+1
	TXNN	FLG,F.FLOP	;IS THIS PACKED FILE ?
	JRST	RDBN79		;NO
	HRRO	T4,T1		;COPY HALF WORD
	LDB	T1,[POINT 8,T4,35]	;GET HIGH ORDER BITS
RDBN79:	ANDI	T1,377		;STRIP EXTRA BITS
	ADDI	T5,(T1)		;INCLUDE IN CHECKSUM
	RETSKP FAST

RDBN80:	IN	1,		;GET NEXT BUFFER
	JRST	RDBN85		;GOT NEXT BUFFER
	GETSTS	1,T1
	TXNE	T1,IO.IMP!IO.DER!IO.DTE!IO.BKT
	CALL	IFILER
	RELEASE 1,
	SETZM	FILDEV
	RET
RDBN85:	HRRZ	T1,IHD		;GET ADDRES OF CURRENT BUFFER
	HLRE	T1,2(T1)	;GET FIRST WORD IN BUFFER
	JUMPE	T1,RDBN70	;PROCEED
	TXO	FLG,F.FLOP	;IS PACKED FILE
	LDB	T1,[POINT 6,IHD+1,11]	;GET S FIELD FROM INPUT POINTER
	CAIN	T1,^D18		;HALF WORD POINTER
	JRST	RDBN70		;YES
	MOVEI	T1,^D18
	DPB	T1,[POINT 6,IHD+1,11]	;CHANGE POINTER
	MOVE	T1,IHD+2	;GET WORD COUNT
	LSH	T1,1		;MULTIPLY BY 2
	MOVEM	T1,IHD+2
	JRST	RDBN70

RDBNER:	TYPE	<
?Improper format in input tape
>
	EXIT
;ROUTINES TO READ BOOT11 OR NETLDR DUMPS

;HERE TO FLUSH REST OF INPUT LINE
RDUMP0:	CALL	FILCHR		;GET NEXT CHAR FROM DUMP
	JRST	RDUMP9		;END OF DUMP
	MOVE	T2,T1		;COPY CHAR
RDUMP1:	CAIE	T2,12		;WE ARE LOOKING FOR A LINE FEED
	CAIN	T2,15		;OR A CARRIAGE RETURN
	JRST	RDUMP2
	CAIE	T2,14		;BUT A FORM FEED WILL DO
	JRST	RDUMP0		;AND DIDN'T FIND ONE
RDUMP2:	CALL	INPOCT		;GET ADR
	JRST	RDUMP9
	CAIE	T2,":"		;FINISHED READING ADDRESS ?
	JRST	RDUMP1		;FLUSH LINE
	HRROM	T1,DOT		;SAVE ADDRESS
RDUMP5:	CALL	INPOCT		;GET DATA FOR LINE
	JRST	RDUMP9		;END OF DUMP
	CAIN	T2,40		;CHECK FOR SPACE
	JRST	RDUMP6		;THAT WAS DATA
	CAIE	T2,15		;CHECK FOR CR
	CAIN	T2,11		;CHECK FOR HT
	JRST	RDUMP6		;THAT WAS DATA
	JRST	RDUMP1		;FLUSH LINE
RDUMP6:	HRRZ	T2,DOT		;GET ADDRESS
	CAMLE	T2,AC1
	HRRZ	AC1,T2		;NEW HIGHEST LOCATION LOADED
	CALL	PUTFOO
	SKIPE	PDP8F
	AOJA	DOT,RDUMP5	;YES SO BACK FOR MORE DATA
	LSH	T1,-^D8
	AOS	T2,DOT
	CAMLE	T2,AC1
	HRRZ	AC1,T2		;NEW HIGHEST LOCATION LOADED
	CALL	PUTFOO
	AOJA	DOT,RDUMP5	;BACK FOR MORE DATA

RDUMP9:	MOVE	T1,MEMLIM	;HIGHEST ADDRESS READ
	MOVEM	T1,S..END	;END OF SEARCH
	TYPE	< highest location is >
	MOVE	T1,AC1		;HIGHEST LOCATION LOADED
	CALL	ADRTYP		;DISPLAY ADDRESS
	CALL	CRLTYP		;TYPE A CR/LF
	MOVEI	T1,RSTART
	MOVEM	T1,.JBREN##
	TXO	FLG,F.WENB	;SET WRITE ENABLE CAUSE SHOULDN'T HURT
	SKIPN	MRGFLG		;WANTED TO MERGE ?
	JRST	LEVL.0		;NO SO START
	RETSKP FAST
SYMDEV:	BLOCK	1		;DEVICE NAME FOR SYMBOL FILE
SYMBLK:	BLOCK	1		; START OF LOOKUP/ENTER BLOCK
SYMDIR:	BLOCK	1		; ADDRESS OF PATH BLOCK
SYMNAM:	BLOCK	1		; FILE NAME
SYMEXT:	BLOCK	1		; FILE EXTENSION
SYMTIM:	BLOCK	1		; TIME/DATE AND PROTECTION
SYMPTH:	BLOCK	2		; FILE PATH
SYMPPN:	BLOCK	1		; FILE PPN
SYMSFD:	BLOCK	6		;  AND SUBSEQUENT SFD'S
	BLOCK	1		; SWITCHES

DEFEXT:	BLOCK	1		; DEFAULT EXTENSIONS

FILDEV:	SIXBIT	\DSK\
FILBLK:	BLOCK	1		; START OF LOOKUP/ENTER BLOCK
FILDIR:	BLOCK	1		; POINTER TO FILE DIRECTORY
FILNAM:	BLOCK	1
FILEXT:	BLOCK	1
FILTIM:	BLOCK	1		; FILE PROTECTION AND DATES
FILLEN:	BLOCK	1		;LENGTH OF FILE IN -10 WORDS
	LKELEN==.-FILBLK-1	; SIZE OF LOOKUP/ENTER BLOCK
FILPTH:	BLOCK	2		; PATH BLOCK HEADER
FILPPN:	BLOCK	1		; FILE PPN
FILSFD:	BLOCK	5		;  AND SUBSEQUENT SFD'S
	BLOCK	1		; TERMINATING 0 WORD
	PTHLEN==.-FILPTH	; LENGTH OF PATH BLOCK
FIL.SW:	BLOCK	1
	$FBLEN==.-FILDEV	; LENGTH OF "FILE BLOCK"

IHD:	BLOCK	3		;HEADER FOR INPUT FILE
IBUFER:	BLOCK	<203*NUMBUF>
IFLDEV:	BLOCK	$FBLEN		; INPUT FILE SPEC

OHD:	BLOCK	3		;HEADER FOR OUTPUT FILE
OBUFER:	BLOCK	203
OFLDEV:	BLOCK	$FBLEN		; OUTPUT FILE SPEC


DMPDEV:	EXP	0		;DEVICE FOR DUMP FILE
	EXP	0		; LENGTH OF LOOKUP/ENTER BLOCK
DMPDIR:	EXP	0		; ADDRESS OF PATH BLOCK
	EXP	0		; FILE NAME
	EXP	0		; FILE EXTENSION
DMPTIM:	BLOCK	1		; TIME/DATE AND PROTECTION
DMPPTH:	BLOCK	2+5+1		; FILE DIRECTORY
	BLOCK	1		; SWITCHES WORD
	BLOCK	$FBLEN-<.-DMPDEV>

DUMPA:	BLOCK	1		;LAST ADDRESS TYPED OUT

USETIT:	Z		;BLOCK NUMBER TO START READING FOR SYMBOLS

RELOFF:	Z		;RELOCATION OFFSET IF READING AN FE- DUMP

MYPPN:	BLOCK	1		; PPN OF USER

CSECHO:	Z			;IF NONZERO SUPPRESS ECHOING COMMAND CHARACTERS
			; LH SET -1 IF SEARCHING FOR A TAG
			; RH SET -1 IF ENCOUNTER XOF, CLEARED WITH XON
CMDFIL:	Z
CMDCNT:	Z			;COUNT OF CURRENT COMMAND CHARACTER
CMDDSP:
CMDSWL:	Z
	Z
CMDFAK:	Z			;POINTER TO FOLLOWING WORD
	Z
	DEFINE	NAMES <

	X	BM873,PUNBM8
	X	IMAGE,PUNIMG
	X	M9301,PUNM93
	X	PACKED,PUNPAK

>
	DEFINE	X (Q,QQ) < EXP QQ >

PUNDSP:	NAMES

	DEFINE	X (Q,QQ) < SIXBIT \Q\ >

PUNSWL:	NAMES
	EXP	0
	DEFINE	NAMES <

	X	DISASS,SETFOO	;/DISASSEMBLY

>

	DEFINE	X (A,B) <	0,,B	>

DMPDSP:	NAMES

	DEFINE	X (A,B) <	SIXBIT	\A\ >

DMPSWL:	NAMES
	EXP	0
	SUBTTL	EBCDIC TO ASCII TRANSLATION TABLE

;TRANSLATION TABLE FROM EBCDIC TO ASCII

EB.TRN:

BYTE (8)  0,  1,  2,  3,  0, 11,  0,177,  0,  0,  0, 13, 14, 15,  0,  0 ;017
BYTE (8)  0, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 ;037
BYTE (8)  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 ;057
BYTE (8)  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 ;077
BYTE (8) 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56, 74, 50, 53,136 ;117
BYTE (8) 46,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 44, 52, 51, 73,155 ;137
BYTE (8) 55, 57,  0,  0,  0,  0,  0,  0,  0,  0,174, 54, 45,137, 76, 77 ;157
BYTE (8)  0,  0,  0,  0,  0,  0,  0,  0,  0,140, 72, 43,100, 47, 75, 42 ;177
BYTE (8) 75,141,142,143,144,145,146,147,150,151,  0,  0,  0,  0,  0,  0 ;217
BYTE (8)  0,152,153,154,155,156,157,160,161,162,  0,  0,  0,  0,  0,  0 ;237
BYTE (8)100,176,163,164,165,166,167,170,171,172,134,116,153,133,113,141 ;257
BYTE (8) 60, 61, 62, 63, 64, 65, 66, 67, 70, 71,172,136,114,135,156,157 ;277
BYTE (8)173,101,102,103,104,105,106,107,110,111,  0,  0,  0,  0,  0,  0 ;317
BYTE (8)175,112,113,114,115,116,117,120,121,122,  0,  0,  0,  0,  0,  0 ;337
BYTE (8)134,  0,123,124,125,126,127,130,131,132,  0,  0,  0,  0,  0,  0 ;357
BYTE (8) 60, 61, 62, 63, 64, 65, 66, 67, 70, 71,174,  0,  0,  0,  0,  0 ;377

	END