	.TITLE	ODMP15
/COPYRIGHT 1969, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.

/OCTAL DUMP IS A PROGRAM WHICH ALLOWS THE USER TO
/OBTAIN A TYPED OUTPUT OF THE CONTENTS OF ONE OR SEVERAL
/REGISTERS IN OCTAL FORM.
/
/INPUT:	THE USER MUST GIVE THE STARTING AND ENDING ADDRESSES
/	TO BE PRINTED. ALL REGISTERS IN THE RANGE WILL
/	BE PRINTED. THE 1ST ADDRESS MUST NOT BE GREATER
/	THAN THE 2ND.
/FORMAT:A) TO DUMP 10 TO 25, TYPE 10-25-
/	B) TO DUMP REG 4000 TYPE, 4000-4000-
/	C) TO DUMP ALL REGISTERS FROM THE STARTING ADDRESS A
/	UP TO THE END OF MEMORY (7777), TYPE 100/WHERE
/	ADDRESS A IS 100.
/
/
/ERRORS: IF AN INCORRECT CHARACTER IS TYPED, THE PROGRAM ANSWERS
/	WITH A ? CRLF (QUESTION MARK, CARRIAGE RETURN, LINE
/	FEED) AND CYCLES BACK TO ACCEPT A WHOLE NEW SET OF
/	ADDRESSES.
	.ABS	NLD
KRS=700332
KRB=700312
PSA=700204
PSF=700201
TLS=700406
KSF=700301
TSF=700401
	.IFUND	LOW
	.LOC	17300
	.ENDC
	.IFDEF	LOW
	.LOC	LOW
	.ENDC
BEGIN	TLS+10		/INITIALIZE TELETYPE
	LAC	OUTLUP+3
	DAC	%TODOP+1
	JMS	%TODSK
	JMS	%TODSK
	LAW	-17
	DAC	%TODA
	LAC	(TABLE
	JMS	OUTLUP
/
/READ INPUT CHARACTER
/
	JMS	%TODIN
	SAD	(310	/H?
	JMS	%HIGH
LOOPS	JMS	%TODSK
	JMS	%CRLF
	LAW	-2	/GET TWO ADDRESSES
	DAC	%TODA	/AND START DUMPING
	JMS	%TODSK	/CR, UPSPACE PRINTER
	LAW	-6	/HIGHEST ADDRESS=5 CHARACTERS
	DAC	%TODB	/MAX (7777)
	DZM	%TODC	/CLEAR BUILDER WORD
/END OF INITIALIZING
%TODRD	JMS	%TODIN	/READ CHARACTER
	DAC	%TODD	/SAVE WHOLE CHARACTER FOR CHECKING
	SAD	(257)	/WAS CHARACTER A SLASH (/).
	JMP	%TODSL
	SAD	(255)	/WAS CHARACTER A MINUS SIGH(-).
	JMP	%TODMS
	ISZ	%TODB	/IF CHARACTER WAS FIFTH CHARACTER OF
	SKP		/STRING AND WAS NOT A 	SLASH OR MINUS
	JMP	%TODER	/SIGN AN ERROR EXISTS
/
/THE CHARACTER MUST BE IN THE RANGE EOF ASCII 260-267; OTHERWISE, IT
/IS UNRECOGNIZABLE
/
	TAD	(-270)	/ERROR IF CHARACTER NOT LESS
	SMA		/THAN ASCII 270.
	JMP	%TODER
/
	LAW	-260	/ERROR IF CHARACTER NOT EQUAL TO
	TAD	%TODD	/OR GREATER THAN ASCII 260.
	SPA
	JMP	%TODER
/
/INPUT CHARACTER IS VALID OCTAL NUMBER. SHIFT THE BUILDER
/WORD LEFT 3-BITS AND CONTINUE BUILDING.
/
	DAC	%TODD	/ONLY RIGHT MOST 3 BITS ARE LEFT
	LAC	%TODC	/BUILDER WORD.
	RCL
	RTL
	TAD	%TODD
	DAC	%TODC
	JMP	%TODRD	/GET NEXT CHARACTER
/
/AT %TODSL THE LOW ORDER ADDRESS WILL BE WHATEVER WAS BEING
/BUILT BY THE BUILDER WORD. THE HIGH ORDER ADDRESS WILL BE 7777.
/
%TODSL	LAC	%TODC	/BUILDER WORD
	DAC	%TODL	/LOWER
	LAC	7777	/SAVE TEMPORARILY
	DAC	%HIGH	
	DZM	7777
	DZM	17777
	ISZ	17777
	LAC	7777
	SNA!CLA
	
	TAD	(10000
	TAD	(7777
	DAC	OUTLUP	/RESTORE 7777
	LAC	%HIGH
	DAC	7777
	LAC	OUTLUP
	JMP	%TODAD
/
/AT %TODMS A MINUS SIGN WAS READ. THE NEXT AVAILABLE ADDRESS
/WILL BE WHATEVER WAS BEING BUILT. IF THIS WAS THE 2ND ADDRESS
%TODMS	LAC	%TODC	/WAS THIS THE 2ND ADDRESS
	ISZ	%TODA
	SKP
	JMP	%TODAD	/STORE LOW-ADDRESS
	DAC	%TODL
	JMP	%TODRD-3	/GET 2ND ADDRESS
/AT %TODAD THE ACCUMULATOR HAS THE HIGH ORDER ADDRESS AND THE
/LOW-ORDER ADDRESS IS STORED IN %TODL.
/
%TODAD	CMA!CLL		/COMP OF HIGH ADDRESS
	TAD	%TODL	/ADD LOW ADDRESS TO GET REGISTER COUNT-1.
	SMA
	JMP	%TODER
	DAC	%TODA	/#OF REGISTERS TO BE PRINTED
	JMS	%TODSK
	JMS	%TODSK
	JMS	GETSV
%TODBL	JMS	%CRLF
	JMS	SAME
	LAW	-5
	DAC	%TODC
	LAW	-10
	DAC	%TODB
	LAC	%TODL	/PRINT ADDRESS
	RCL
	RTL
	JMS	%TODLL
%TODL1	JMS	SET
	LAC*	%TODL
	ISZ	%TODL
	JMS	%TODLL
	ISZ	%TODA
	SKP
	JMP	LOOPS
	ISZ	%TODB
	JMP	%TODL1
	JMS	GETSV
	JMP	%TODBL
%TODLL	0		/ENTR-EXIT
	RCL
	RAL		/LITTLE LOOP
	RTL		/CLEAR LINK AND SHIFT LEFT
	DAC	%TODD	/ONCE BEFORE DOING THE
	AND	(7	/FIRST PRINTABLE CHAR.
	TAD	(260
	JMS	%TODOP
	LAC	%TODD
	ISZ	%TODC
	JMP	%TODLL+2
	JMP*	%TODLL	/EXIT/
%TODIN	0
	KRS
	KSF
	JMP	.-1
	KRB
	JMS	LO		/ECHO OR NOT
	JMP*	%TODIN
/
%TODOP	0
	XX
	JMP*	%TODOP
LO	0
	TSF
	JMP	.-1
	TLS
	JMP*	LO
HI	0
	PSF
	JMP	.-1
	PSA
	JMP*	HI
%HIGH	0
	PSA+10		/INITIALIZE
	LAC	(JMS HI
	DAC	%TODOP+1
	JMP*	%HIGH
/
%TODER	LAW	277	/TYPE A QUESTION MARK
	JMS	LO
	JMP	LOOPS
/TYPE A CARRIAGE RETURN/LINE FEED
%TODSK	0
	LAW	212
	JMS	LO
	LAW	215
	JMS	LO
	JMP*	%TODSK
OUTLUP	0
	DAC	%TODB
	LAC*	%TODB
	JMS	LO
	ISZ	%TODB
	ISZ	%TODA
	JMP	.-4
	JMP*	OUTLUP
/
%CRLF	0
	LAW	215
	JMS	%TODOP
	LAW	212
	JMS	%TODOP
	JMP*	%CRLF
%TODA	0		/REGISTER COUNTER
%TODB	0		/NUMBER OF WORDS PER LINE/ NO. OF INPUT CHARACTERS
%TODC	0		/NUMBER OF CHARACTERS TO BE PRINTED PER WORD
%TODD	0		/WORK WORD FOR ROTATING 3-BIT SETS
%TODL	0		/ADDRESS (LEFT ADJUSTED) OF REGISTERS TO BE PRINTED
TABLE	317		/O
	325		/U
	324		/T
	320		/P
	325		/U
	324		/T
	240		/
	304		/D
	305		/E
	326		/V
	311		/I
	303		/C
	305		/E
	240		/
	275		/=
SAME	0
	DZM	%SAMSW
	LAC	%TODL
	DAC	%SADDR
	LAW	-1
	TAD	%TODA
	DAC	%TODB		/SAVE TOTAL COUNT
SAMEA	LAW	-10
	DAC	%TODC
SAMEB	LAC*	%SADDR		/GET A WORD AND
	ISZ	%SADDR
	SAD	SVALUE		/COMPARE THEM.
	SKP
	JMP	NOSAME
	ISZ	%TODB
	SKP
	JMP	NOSAME		/LAST REGISTER ENCOUNTERED
	ISZ	%TODC
	JMP	SAMEB
	LAC	%SADDR
	DAC	%TODL
	LAC	%TODB
	TAD	(1
	DAC	%TODA
	ISZ	%SAMSW
	JMP	SAMEA
/AT NOSAME, REGISTERS IN THE SAME LINE ARE UNEQUAL
/OR THE REGISTER COUNT IS FULL. IF THE REGISTER COUNT IS
/FULL AND THE SAME SWITCH IS OFF EXIT TO THE MAIN LINE.
/IF THE COUNT IS FULL AND THE SWITCH IS ON, EXIT TO THE
/BEGINNING OF OCTAL DUMP.
/
NOSAME	LAC	%SAMSW
	SZA
	JMS	OMIT
	JMP*	SAME
/
OMIT	0
	JMS	SET
	JMS	SET
	LAC	SVALUE
	JMS	%TODLL
	LAW	-10
	DAC	SET
	LAC	(OMES
	DAC	%TODC
OMITA	LAC*	%TODC
	ISZ	%TODC
	JMS	%TODOP
	ISZ	SET
	JMP	OMITA
	JMS	%CRLF
	LAC	%TODB
	SNA
	JMP	LOOPS
	JMP*	OMIT
/
OMES	240			/ (SPACE)
	317			/O
	315			/M
	311			/I
	324			/T
	324			/T
	305			/E
	304			/D
/
SET	0
	LAW	240
	JMS	%TODOP
	LAW	240
	JMS	%TODOP
	LAW	-6
	DAC	%TODC
	JMP*	SET
%SAMSW=%TODSK
%SADDR	0
SVALUE=%TODIN
GETSV	0
	LAC*	%TODL
	DAC	SVALUE
	JMP*	GETSV
	.END	BEGIN

 