Google
 

Trailing-Edge - PDP-10 Archives - dec-10-omona-u-mc9 - bootdx.mac
There are 7 other files named bootdx.mac in the archive. Click here to see a list.
TITLE	BOOTDX TO BOOTSTRAP THE PDP-8 HIDDEN IN THE DX10
SUBTTL	T.HESS/TAH	5-OCT-74
;COPYRIGHT 1974 DIGITAL EQUIPMENT CORP., MAYNARD, MASS., USA

	.TEXT "/SEG:LOW REL:HELPER"

.EDTR==0	;LAST EDITOR
.MAJV==2	;MAJOR VERSION #
.MINV==0	;MINOR VERSION
.EDIT==15	;EDIT #

%%BTDX==BYTE (3).EDTR(9).MAJV(6).MINV(18).EDIT

;PROGRAM WHICH BOOTSTRAPS AND DUMPS PDP-8A'S INSIDE THE
;DX10 PROGRAMMABLE DATA CHANNEL.

;LOAD INSTRUCTIONS
;	.LOAD BOOTDX.MAC, %"SEG:LOW" REL:HELPER.REL

	LOC	137
	%%BTDX
	RELOC
SUBTTL	DEFINITIONS

;DEVICE CODES

PDC==220		;FIRST DX10
PDC2==224		;2ND DX10

;DX10 CONO AND CONI BITS

RUNIND==(1B17)		;RUN INDICATOR
MPERR==1B26		;MICRO-PROCESSOR ERROR
CLRERR==001700		;CLEARS ALL ERRORS
PIMASK==774007		;MASK FOR INFO TO SAVE

;DX10 REGISTER SELECTION CODES

RSEL==(1B17)		;SELECT REGISTER
MPCTL==4		;CONTROLL AND MEMORY DATA
MPADR==5		;ADDRESS
FR==14			;FEATURE REGISTER

;BITS IN CTL REGISTER

MPSS==1B18		;SINGLE STEP SWITCH
MPHALT==1B19		;HALT SWITCH
MPCONT==1B20		;CONTINUE SWITCH
ENEXM==1B22		;ENABLE EXAMINE
ENDEP==1B23		;ENABLE DEPOSIT

DXCLR==1B16		;DX10 MASTER CLEAR

HLTINS==7402		;PDP-8 HALT INSTR

;DEFINITIONS FROM C.MAC

SP.CR0==1		;RUN ON CPU0 ONLY
.STCPU==14		;SET CPU SPECIFICATION
;USELESS MACROS

	DEFINE	TELLCR	(STRING)<
	XLIST
	PUSHJ	P,[OUTSTR	[ASCIZ	\" STRING
\]
		   RETURN]
	LIST	>

	DEFINE	WARNCR	(STRING)<
	XLIST
	PUSHJ	P,[OUTSTR	[ASCIZ	\% STRING
\]
		   RETURN]
	LIST	>

	DEFINE	ERROR	(STRING)<
	XLIST
	JRST	[OUTSTR	[ASCIZ \? STRING
\]
		JRST	EXITX]
	LIST>

	DEFINE	USEROR	(STRING)<
	XLIST
	JRST	[OUTSTR	[ASCIZ \? STRING
\]
		JRST	STARTE]
	LIST>

	DEFINE	RETURN <
	XLIST
	POPJ	P,
	LIST>
;PARAMETERS

CHI==1			;INPUT CHANNEL
CHIMOD==10		;INPUT MODE (IMAGE)
CHXMOD==0		;INPUT MODE OF A8 FILE
CHO==2			;OUTPUT CHANNEL FOR DUMPS
CHOMOD==0		;OUTPUT MODE (ASCII)

PDSIZ==20		;PDL SIZE


;AC'S

T1=1
T2=2
T3=3
T4=4

P1=5
P2=6
P3=7
P4=10
WC==11		;WORD COUNT FOR A8 FILES

W=16		;PNTR TO IOWD BASE
P=17		;PUSH DOWN PNTR

IFNDEF V.CLR,<V.CLR==7777>	;END OF AREA TO CLEAR
IFNDEF V.DUMP,<V.DUMP==0>	;START OF DUMP
IFNDEF V.END,<V.END==7777>	;END OF AREA TO DUMP+1
IFNDEF V.STRT,<V.STRT==200>	;START ADDRS
	SUBTTL	LOAD PROGRAM

STARTE:	CLRBFI			;CLEAR TTY INPUT IF ERROR
START:	RESET
	SETZM	FWAZER		;CLEAR STORAGE
	MOVE	T1,[FWAZER,,FWAZER+1]
	BLT	T1,LWAZER
	SETOM	FWAONE		;PRESET SWITCH ANSWERS TO -1
	MOVE	T1,[FWAONE,,FWAONE+1]
	BLT	T1,LWAONE
START2:	JSP	T2,[MOVE P,[IOWD PDSIZ,PDLST]
		    MOVEI T1,TTOCH
		    MOVEM T1,OCHLOC	;SET UP TTY OUTPUT
		    JRST @T2]

	PUSHJ	P,GETCOM	;GO GET COMMAND

START6:	RESET			;RECLAIM SPACE IF RE-STARTING
	XCT	START2		;SET UP PUSH DOWN LIST
	MOVEI	W,PDCBAS	;ASSUME CHL 0
	SKIPGE	T1,A.CHL	;USER SPECIFIED?
	JRST	START7		;NO - USE DEFAULT
	CAILE	T1,1		;IN RANGE?
	  USEROR Illegal DX10 channel number
	MOVE	W,[PDCBAS
		   PDC2BS](T1)

START7:	SKIPGE	A.DUMP		;SEE IF /DUMP
	SKIPL	A.END		;OR IF /END
	JRST	DODUMP		;GO DO DUMP
	SKIPL	A.LOAD		;SEE IF /START
	SKIPGE	A.DUMP		;AND /LOAD
	JRST	.+2		;NO--OK
	USEROR	Can't do both /LOAD and /START

	SKIPL	A.CLR		;SEE IF /CLEAR
	JRST	[SKIPGE	A.LOAD	;YES--SEE IF /LOAD
		 SKIPL	A.STRT	; OR /START
		 JRST	.+1	;YES--DO BOTH
		 JRST	STRTLD]	;NO--GO START 11
	SKIPN	T2,DEV		;IS DEVICE NULL
	MOVSI	T2,'SYS'	;YES - THEN USE SYS
	MOVEI	T1,CHXMOD	;SET UP MODE
	MOVEI	T3,INHDR	;POINT TO RING HEADER
	OPEN	CHI,T1		;OPEN CHL
	  USEROR	Can't OPEN the input device

			;;;; FALIN TO NEXT PAGE
	SKIPN	T1,NAME		;GET FILE NAME
	MOVE	T1,['DXMPA ']	;USE DEFAULT
	SKIPN	T2,EXT		;EXTENSION
	MOVSI	T2,'A8 '	;DEFAULT TO A8 
	TRZ	T2,-1		;CLEAR NULL FLAG
RELOOK:	MOVEI	T3,0		;CLEAR WORD
	MOVE	T4,DIRECT	;GET DIRECTORY
	LOOKUP	CHI,T1		;LOOKUP FILE
	  JRST LUKAGN		;SEE IF MORE TRIES
	INBUF	CHI,0		;DEFAULT BUFFERS

STRTLD:	PUSHJ	P,RESET8	;GO RESET '8
	SKIPGE 	A.CLR		;SEE IF /CLEAR
	JRST	[MOVEI T1,V.CLR	;NO - DO DEFAULT
		 MOVEM T1,A.CLR
		 JRST .+1]
	PUSHJ	P,CLEAR		;TRY TO CLEAR '8
	SKIPGE	VERERR
	ERROR	<Error while clearing memory.>
	SKIPGE	A.LOAD		;WANT TO LOAD
	SKIPL	A.STRT		; OR START
	SKIPA			;YES - GO ON
	JRST	[PUSHJ P,RESTOR	;NO - JUST /CLEAR I GUESS
		 JRST START]	;RESTART
	TELLCR	DX10 loading

	MOVE	T1,[MEM8,,MEM8+1]
	MOVE	T2,[BYTE (12)HLTINS,HLTINS,HLTINS]
	MOVEM	T2,MEM8		;INIT TO ALL HALTS
	BLT	T1,MEM8+^D4096/3
	PUSHJ	P,CHKLFT	;SEE WHAT TYPE OF FILE
	SKIPE	A8FLG		;BIN OR A8
	JRST	STRTA8		;A8 - START LOADING
	JRST	STRTL1		;BIN - LOAD IT

LUKAGN:	SKIPE	EXT		;CHECK ARG
	JRST	[TLZ T2,-1	;DONE IF NON-ZERO
		 JUMPE T2,RELOOK
		 JRST LUKERR]
	CAMN	T2,[SIXBIT /A8/]	;FIRST DEFAULT
	JRST	[MOVSI T2,'BIN'	;TRY .BIN
		 JRST RELOOK]
	TLZE	T2,-1		;DEFAULT OR NULL
	JUMPE	T2,RELOOK		;TRY NULL
LUKERR:	 USEROR	LOOKUP failed
STRTL1:	PUSHJ	P,GETBYT	;GET A BYTE
	JUMPE	P1,STRTL1	;SKIP ZEROES

	CAIE	P1,200		;VALID LEADER?
	ERROR	<Cannot find leader>

STRTL2:	PUSHJ	P,GETWRD	;FETCH WORD
	CAIN	P1,20000	;IS THIS LEADER
	JRST	STRTL2		;YES - SKIP IT
	TRZN	P1,10000	;CHECK FOR ADDRESS
	ERROR	<First word not an address>

	SETZM	CHKSUM		;CLEAR CKSUM & FLAG
	SETZM	VERERR		;...
	SETZM	BINFLG		;BIN/RIM TAPE FLAG
LDBINA:	PUSHJ	P,LOADA		;GET ADDRESS
	ADDM	P2,CHKSUM	;ADD TO CHECKSUM
	PUSHJ	P,GETWRD	;GET NEXT WORD

LOAD1:	CAIN	P1,20000	;TRAILER?
	JRST	LOADV		;YES - GO VERIFY
	TRZE	P1,10000	;ADDRESS?
	JRST	LDBINA		;YES - HANDLE IT
	PUSH	P,P2		;SAVE PARTIAL CKSUM
	PUSH	P,P1		;SAVE WORD
	PUSHJ	P,GETWRD	;PEEK AHEAD
	TRNN	P1,30000	;2ND DATA WORD?
	SETOM	BINFLG		;YES - SAY ITS A BIN TAPE
	TRNN	P1,20000	;TRAILER?
	JRST	LDBINW		;NO - LOAD IT
	SKIPGE	BINFLG		;BIN/RIM?
	JRST	LDBINC		;BIN TAPE CHECK CHECKSUM
LDBINW:	EXCH	P1,0(P)		;SAVE P1 GET WORD
	PUSHJ	P,LOADW		;LOAD IT
	MOVE	T1,-1(P)	;RESTORE CHECKSUM
	ADDM	T1,CHKSUM	;ACCUMULATE
	POP	P,P1		;RESTORE P1
	POP	P,T1		;PRUNE PDL
	JRST	LOAD1		;LOOP BACK FOR MORE

;HERE TO CHECK CKSUM FOR BINARY FORMAT TAPES

LDBINC:	POP	P,P1		;THIS MUST BE THE CKSUM
	POP	P,P2		;CLEAN PDL
	MOVE	T1,CHKSUM	;GET OUR CHECKSUM
	ANDI	T1,7777		;TRIM TO 12 BITS
	ANDI	P1,7777		;LIKEWISE FILE COPY
	CAME	P1,T1		;TA-DA
	ERROR	<Checksum does not match>

;HERE TO VERIFY CORE IMAGE

LOADV:	MOVEI	P1,0		;INITIAL ADDRESS
	MOVE	P2,[POINT 12,MEM8] ;POINT TO INTERNAL COPY
	PUSHJ	P,EXAM8		;SET FOR SUPER-EXAMINE
	  JRST	LOADV1		;T1 HAS CONTENTS
	JRST	LDDONE		;ALL DONE - DO WRAP UP

LOADV1:	ILDB	P1,P2		;GET COPY
	CAMN	P1,T1		;???
	JRST	LOADV2		;SO FAR SO GOOD
	PUSH	P,T1		;SAVE WHAT WE SAW
	SETOM	VERERR		;SAY WE LOST
	OUTSTR	[ASCIZ /? Verify error at /]
	MOVE	T1,ADDRES	;TELL HIM WHERE
	PUSHJ	P,L4OCT
	OUTSTR	[ASCIZ /  ,has /]
	POP	P,T1		;GET IT BACK
	PUSHJ	P,L4OCT		;TELL THE BAD NEWS
	OUTSTR	[ASCIZ /  ,should have /]
	MOVE	T1,P1		;REAL STUFF
	PUSHJ	P,L4OCT		;SORRY 'BOUT THAT
	OUTSTR	[BYTE (7)15,12]	;CRLF
LOADV2:	AOS	T1,ADDRES	;ADVANCE TO NEXT LOC
	CAIG	T1,7777		;FINISHED?
CPOPJ1:	AOS	0(P)		;SAY GO ON
	POPJ	P,		;CRAZY WAY OUT

;ALL DONE CHECK ERRORS AND START '8 IF NECESSARY

LDDONE:	SKIPE	VERERR		;SEE IF OK
	ERROR	<Verify error>
	PUSHJ	P,LMAJIK	;LOAD CONST
	PUSHJ	P,FETCNF	;GET CONFIG INFO
	SKIPGE	P2,A.STRT	;LOOK FOR STARTING ADDRS
	MOVE	P2,A.LOAD	;...
	SKIPG	P2		;ONE SPECIFIED?
	MOVEI	P2,V.STRT	;USE DEFAULT
	SKIPL	A.LOAD		;LOAD ONLY?
	MOVEI	P2,0		;YEP
	SKIPE	P2		;SHOULD WE START IT
	PUSHJ	P,START8	;YES - TRY TO
	SKIPN	P2		;GIVE CORRECT MESSAGE
	TELLCR	DX10 loaded.
	SKIPE	P2
	TELLCR	DX10 started.
	CLOSE	CHI,		;TERMINATE INPUT CHL
	RELEAS	CHI,
	PUSHJ	P,PNTCNF	;PRINT CONFIG INFO
	JRST	GOHOME		;WHEW
;ROUTINE TO LOAD ADDRESS IN P1 INTO ADRS REG

LOADA:	MOVEM	P1,ADDRES	;SAVE ADDRESS
	MOVE	T1,[RSEL,,MPADR]
	XCT	PDCDTO(W)	;SELECT ADRS REG
	MOVE	T1,ADDRES
	XCT	PDCDTO(W)	;LOAD ADDRESS
	PUSH	P,P2		;DON'T CLOBBER P2
	IDIVI	P1,3		;COMPUTE ADDRS INTO MEM8
	ADD	P1,MPNTR(P2)	;GET B.P.
	MOVEM	P1,APNTR	;SAVE IT
	POP	P,P2
	POPJ	P,		;RETURN

;ROUTINE TO LOAD PDP-8 WORD IN P1

LOADW:	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;SELECT CONTROL REG
	MOVE	T1,P1		;GET WORD
	IORI	T1,ENDEP	;ENABLE DEP
	XCT	PDCDTO(W)	;DEPOSIT WORD IN MEM
	MOVE	T1,P1		;GET WORD AGAIN
	IDPB	T1,APNTR	;STASH IN MEM8
	AOS	T1,ADDRES	;INCR ADDRESS
	CAIE	T1,10000	;DON'T CHECK THIS
	PUSHJ	P,CKCPMA	;CHECK HDWRE ALSO AND EXIT
	POPJ	P,		;RETURN
;ROUTINE TO LOAD A8 FILES

STRTA8:	SETZM	CHKSUM		;CLEAR THIS
	SETZM	VERERR
LDA8WC:	PUSHJ	P,WCREAD	;GET WORD COUNT IN WC
	JUMPE	P1,LOADV	;DONE IF ZERO
	MOVE	WC,P1
	PUSHJ	P,WDREAD	;GET DATA WORD
	PUSHJ	P,LOADA		;LOAD ADDRESS
LDA8D:	PUSHJ	P,WDREAD	;GET WORD
	MOVE	T1,P1		;SET UP DATA WORD
	PUSHJ	P,LOADW		;LOAD IT
	SOJG	WC,LDA8D	;LOOP THROUGH ALL WORDS
	PUSHJ	P,CHREAD	;READ AND VERIFY CHECKSUM
	JRST	LDA8WC		;GET NEXT RECORD
;ROUTINE TO READ THE CHECKSUM FROM FILE AND THE CRLF
;CHECK THAT CHECKSUM IS CORRECT

CHREAD:	PUSHJ	P,GET2W		;GET A WORD
	CAIE	P2,15		;TERMINATOR BETTER BE CR
	ERROR	<End-of-line missing>
	ADD	P1,CHKSUM	;ADD COMPUTED CHECKSUM
	ANDI	P1,7777		;CHECKIT
	JUMPN	P1,[ERROR <Checksums do not agree>]
	PUSHJ	P,GETC		;GET LF
	CAIE	P1,12		;DOUBLE CHECK CRLF
	ERROR	<End-of-line missing>
	POPJ	P,		;RETURN
;ROUTINE TO DO MEMORY EXAMINES
;P1 HAS ADDRS TO START AT
	
;RETURN WITH CPOPJ TO STOP CYCLE/ CPOPJ1 TO DO NEXT EXAMINE

EXAM8:	MOVE	T1,[RSEL,,MPADR]
	XCT	PDCDTO(W)	;SELECT ADDRS REG
	MOVE	T1,P1		;STARTING ADDRESS
	XCT	PDCDTO(W)	;SET IT
	MOVEM	P1,ADDRES	;SAVE ADDRS
EXAM8N:	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;SELECT CONTROLL
	MOVEI	T1,ENEXM	;ENABLE EXAMINE
	XCT	PDCDTO(W)	;...
	XCT	PDCDTI(W)	;READ CONTENTS
	ANDI	T1,7777		;JUST THE CONTENTS
	PUSHJ	P,@0(P)		;CALL CALLER
	  JRST	CPOPJ1		;HE IS THROUGH
	MOVE	T1,ADDRES	;GET INCREMENTED ADDRES
	PUSHJ	P,CKCPMA	;CHECK AUTO INCR
	JRST	EXAM8N		;GET NEXT ITEM

FETCNF:	MOVE	T1,[RSEL,,FR]
	XCT	PDCDTO(W)	;FEATURE REGISTER
	XCT	PDCDTI(W)	;READ IT
	MOVEM	T1,FEATUR	;FEATURES?
	MOVEI	P1,3		;READ LOCATION 3
	PUSHJ	P,EXAM8		;...
	  POPJ	P,
	MOVEM	T1,VERMP	;VERSION #
	AOS	P1,ADDRES	;NEXT LOC
	PUSHJ	P,EXAM8		;DO IT THE HARD WAY
	  POPJ	P,		;THIS IS WIERD
	MOVEM	T1,EDTMP		;SAVE EDIT #
	POPJ	P,		;RETURN

LMAJIK:	MOVE	T1,[RSEL,,MPADR]
	XCT	PDCDTO(W)	;SELECT ADDRS
	MOVEI	T1,17		;SECRET LOC
	XCT	PDCDTO(W)	;...
	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;SELECT CTL REG
	MOVEI	T1,4756!ENDEP	;THIS IS IT FOLKS!!!!
	XCT	PDCDTO(W)	;MAJIK NOW LOADER
	POPJ	P,		;RETURN
SUBTTL	DUMP PROGRAM

DODUMP:	SKIPGE	A.LOAD		;SEE IF /LOAD
	SKIPL	A.STRT		;OR IF /START
	USEROR	Can't /LOAD and /DUMP at the same time
	SKIPL	A.CLR		;SEE IF /CLEAR
	USEROR	Can't /CLEAR and /DUMP at the same time

	MOVEI	T1,CHOMOD	;SET OUTPUT MODE
	SKIPN	T2,DEV		;GET DEVICE
	MOVSI	T2,'DSK'	;DEFAULT TO DISK
	MOVSI	T3,OUTHDR	;POINT TO BUFFER HEADER
	OPEN	CHO,T1		;OPEN FILE
	  USEROR	Can't OPEN the output device

	SKIPN	T1,NAME		;GET FILE NAME
	MOVE	T1,['DXMPA ']	;USE DEFAULT
	SKIPN	T2,EXT		;GET EXTENSION
	HRLZI	T2,'LSD'	;DEFAULT
	TRZ	T2,-1		;CLEAR NULL FLAG
	MOVEI	T3,0		;CLEAR PROTECTION, ETC.
	MOVE	T4,DIRECT	;GET DIRECTORY
	ENTER	CHO,T1		;ENTER FILE
	  USEROR	ENTER failed
	OUTBUF	CHO,0		;SET DEFAULT BUFFERS
;ACCUMULATE HEADING DATA

STRTDM:	MOVE	T1,[POINT 7,HEADER]
	MOVEM	T1,HEDPNT		;INIT POINTER FOR HEADER MSG
	PUSHJ	P,HEDTXT
	 ASCIZ /DX-10 #/
	MOVE	T1,A.CHL	;CHL NUMBER
	PUSHJ	P,HEDDIG		; AND PRINT
	PUSHJ	P,HEDTXT
	 ASCIZ / dump by BOOTDX /
	LDB	T1,[POINT 9,.JBVER##,11]
	PUSHJ	P,HEDOCT		;PRINT VERSION  NUMBER
	LDB	T1,[POINT 6,.JBVER##,17]	;GET MINOR VERSION #
	JUMPE	T1,DMHDV1		;JUMP IF NONE
	SUBI	T1,1			;FAKE OUT DIVIDE
	IDIVI	T1,^D26			;GET LAST LETTER
	JUMPE	T1,DMHDV0		;JUMP IF ONLY 1 LETTER
	ADDI	T1,"A"-1		;CONVERT 1ST LETTER
	PUSHJ	P,HEDCHR
DMHDV0:	MOVEI	T1,"A"(T2)
	PUSHJ	P,HEDCHR		;OUTPUT LAST LETTER

DMHDV1:	HRRZ	T1,.JBVER##		;GET EDIT NUMBER
	JUMPE	T1,DMHDV2		;JUMP IF ZERO
	MOVEI	T1,"("
	PUSHJ	P,HEDCHR
	HRRZ	T1,.JBVER##
	PUSHJ	P,HEDOCT
	MOVEI	T1,")"
	PUSHJ	P,HEDCHR		;FINISH "(EDIT NUMBER)"

DMHDV2:	LDB	T1,[POINT 3,.JBVER##,2]	;GET "WHO MADE EDIT"
	JUMPE	T1,DMHDV3		;JUMP IF DIGITAL DID
	MOVEI	T1,"-"
	PUSHJ	P,HEDCHR
	XCT	DMHDV2			;GET "WHO" BACK
	PUSHJ	P,HEDDIG		; AND PRINT

DMHDV3:	MOVEI	T1,11			;HORIZONTAL TAB
	PUSHJ	P,HEDCHR
	MSTIME	T1,		;GET TIME OF DAY (MILLESECONDS)
	IDIVI	T1,^D60000	;GET MINUTES
	IDIVI	T1,^D60		;GET HOURS
	PUSH	P,T2		;SAVE REMAINDER AS MINUTES
	PUSHJ	P,HEDDEC	;PRINT QUOTIENT AS HOURS
	MOVEI	T1,":"
	PUSHJ	P,HEDCHR	;PRINT COLON
	POP	P,T1		;GET MINUTES BACK
	PUSHJ	P,HEDDEC	; AND PRINT
	MOVEI	T1,11
	PUSHJ	P,HEDCHR	;PRINT TAB

	DATE	T1,
	IDIVI	T1,^D31*^D12	;YEAR GOES TO T1
	ADDI	T1,^D64		;ADD IN BASE YEAR
	IDIVI	T2,^D31		;T2 GETS MONTH, T3 GETS DAY
	PUSH	P,T1		;SAVE YEAR
	PUSH	P,[ASCII /-JAN-/
		   ASCII /-FEB-/
		   ASCII /-MAR-/
		   ASCII /-APR-/
		   ASCII /-MAY-/
		   ASCII /-JUN-/
		   ASCII /-JUL-/
		   ASCII /-AUG-/
		   ASCII /-SEP-/
		   ASCII /-OCT-/
		   ASCII /-NOV-/
		   ASCII /-DEC-/](T2)
	MOVEI	T1,1(T3)	;GET DAY
	PUSHJ	P,HEDDEC	; AND PRINT
	POP	P,T1		;GET MONTH
	PUSHJ	P,HED7		; AND PRINT
	POP	P,T1
	PUSHJ	P,HEDDEC	;PRINT YEAR
	MOVE	T1,[20,,11]	;GET SYSTEM
	GETTAB	T1,		; SERIAL NUMBER
	  MOVEI	T1,0		;UNKNOWN
	SKIPLE	T1		;SEE IF OK
	CAILE	T1,^D9999
	JRST	DMHDV5		;SYSTEM NUMBER BAD
	PUSH	P,T1		;SAVE NUMBER
	PUSHJ	P,HEDTXT
	 ASCIZ /	System /
	POP	P,T1
	PUSHJ	P,HEDDEC	;PRINT SYSTEM NUMBER

DMHDV5:	MOVSI	T1,(ASCII /  /)
	PUSHJ	P,HED7		;PRINT SPACES

	MOVSI	T4,-5		;SET HEADER COUNT
DMHDV6:	MOVEI	T1,11	;POINT TO TABLE
	HRL	T1,T4		;POINT TO ENTRY
	GETTAB	T1,		;GET SYSTEM HEADER LINE
	 MOVEI	T1,0		;UNKNOWN
	PUSHJ	P,HED7		;PRINT TEXT
	AOBJN	T4,DMHDV6	;LOOP UNTIL DONE

	MOVEI	T1,0
	PUSHJ	P,HEDCHR	;STUFF NULL IN AT END OF HEADER
	PUSHJ	P,LHEAD		;GO LIST HEADER
	PUSHJ	P,RESET8	;GRONK THE '8
	TELLCR	DX10 dumping

	PUSHJ	P,FETCNF	;GET CONFIG INFO
	PUSHJ	P,PNTCNF	;PRINT MICRO-CODE VER # ON TTY
	MOVEI	T1,LCHAR	;SET UP PRINTER FOR LIST OUTPUT
	MOVEM	T1,OCHLOC	;...
	MOVEI	T1,[ASCIZ "Micro-code version: "]
	PUSHJ	P,LSTTX		;DUMP TO LISTING
	MOVE	T1,VERMP
	PUSHJ	P,LOCT
	MOVEI	T1,"("
	PUSHJ	P,LCHAR		;PRINT CHAR
	MOVE	T1,EDTMP
	PUSHJ	P,LOCT
	MOVEI	T1,[ASCIZ ")   ECO: "]
	PUSHJ	P,LSTTX
	LDB	T1,[POINT 7,FEATUR,26]
	PUSHJ	P,LOCT
	MOVEI	T1,[ASCIZ "   SER: "]
	PUSHJ	P,LSTTX
	LDB	T1,[POINT 9,FEATUR,35]
	PUSHJ	P,LOCT
	PUSHJ	P,LCRLF2
	MOVEI	T1,[ASCIZ "IBUS Registers"]
	PUSHJ	P,LSTTX
	PUSHJ	P,LCRLF2

	MOVEI	P1,17		;ALL SIXTEEN
	MOVSI	P2,RSEL		;SET UP DATAO WORD
RSELUP:	HRRZ	T1,P2		;REGISTER
	PUSHJ	P,LOCT
	PUSHJ	P,LSLSH		;PRINT SLASH TAB
	MOVE	T1,P2
	XCT	PDCDTO(W)	;SELECT REG
	XCT	PDCDTI(W)	;READ IT
	PUSHJ	P,L6OCT		;PRINT SIX OCTAL DIGITS
	TRNN	P1,3		;MOD 4 CRLFS
	JRST	[PUSHJ	P,LCRLF2
		 JRST RSLUP1]
	PUSHJ	P,LTAB
	PUSHJ	P,LTAB
RSLUP1:	ADDI	P2,1		;ADVANCE TO NEXT
	SOJGE	P1,RSELUP	;LOOP TILL DONE
;NOW FETCH MEMORY FROM '8

	SKIPGE	P1,A.DUMP	;GET STARTING ADDRESS
	MOVEI	P1,V.DUMP	;DEFAULT
	MOVEM	P1,A.DUMP
	SKIPGE	P4,A.END	;ENDING LOC
	MOVEI	P4,V.END	;DEFAULT
	MOVE	P3,[POINT 12,MEM8]
	PUSHJ	P,EXAM8		;START DUMPING
	  JRST	[IDPB T1,P3	;STORE WORD
		 AOS T1,ADDRES	;ADVANCE TO NEXT LOC
		 CAMG T1,P4	;DONE?
		 AOS (P)
		 POPJ P,]	;RETURN - TO SELF
	
;NOW DUMP TO LISTING

	MOVE	P3,[POINT 12,MEM8]
	MOVE	T1,A.DUMP	;GET START ADDRS
	MOVEM	T1,ADDRES	;SAVE IT
DLUP:	PUSHJ	P,L4OCT		;PRINT ADDRS
	PUSHJ	P,LSLSH		;SLASH AND TAB
	ILDB	P1,P3		;GET CONTENTS
	MOVE	T1,P1		;PRINT OCTAL
	PUSHJ	P,L4OCT
	PUSHJ	P,LTAB		;TAB
	PUSHJ	P,PNTINS	;PRINT INSTR IN SYMBOLIC
	AOS	T1,ADDRES	;ADVANCE TO NEXT
	CAMG	T1,P4	;DONE?
	JRST	DLUP		;NO - LOOP
	CLOSE	CHO,		;YES - CLOSE FILE
	RELEAS	CHO,
	JRST	GOHOME		;DONE
;ROUTINE TO PRINT A SYMBOLIC INSTRUCTION
;C(P1) := INSTR
;PRESERVE P3,P4

PNTINS:	PUSH	P,[0]		;MARK STACK
	JUMPE	P1,[PUSH P,['...']
		    JRST PNTDMP]
	LDB	T1,[POINT 3,P1,26]
	CAIG	T1,5		;LOOK AT OP CODE
	JRST	PNTNRM		;DO NORMAL ROUTINE
	CAIN	T1,6		;IOT?
	JRST	PNTIOT		;YES - SPECIAL
				;OP = 7 DO SPECIAL HACK
	CAIN	P1,7000
	JRST	[PUSH P,['NOP']
		 JRST PNTDMP]
	TRNN	P1,400		;GROUP 1?
	JRST	PNTG1		;YES
	TRNN	P1,1		;GROUP 2?
	JRST	PNTG2		;YES
	TRNE	P1,200		;GROUP 3
	PUSH	P,['CLA']	;SEE IF CLA BIT ON
	CAIN	P1,7621		;CHECK SPECIAL HACKS
	JRST	[MOVEI T2,'CAM'
		 MOVEM T2,0(P)
		 JRST PNTDMP]
	CAIN	P1,7521
	JRST	[PUSH P,['SWP']
		 JRST PNTDMP]	;GO DUMP
	TRNE	P1,20
	PUSH	P,['MQL']
	TRNE	P1,100
	PUSH	P,['MQA']
PNTXXX:	SKIPN	0(P)		;ANYTHING?
	PUSH	P,['***']
	JRST	PNTDMP		;DUMP LIST
;PRINT GROUP 1 OPR INSTRS

PNTG1:	TRNE	P1,200		;CHECK CLA BIT
	PUSH	P,['CLA']
	TRNE	P1,100
	PUSH	P,['CLL']
	TRNE	P1,1
	PUSH	P,['IAC']
	TRNE	P1,40
	PUSH	P,['CMA']
	TRNE	P1,20
	PUSH	P,['CML']
	LSH	P1,-1		;NOW GET ROTATE INFO
	ANDI	P1,7		;ONLY
	JUMPE	P1,PNTXXX	;GO DUMP IF NONE
	PUSH	P,RTAB(P1)	;ELSE GET FROM TABLE
	JRST	PNTXXX		;AND THEN DUMP

;HERE TO DO GROUP 2 OPR

PNTG2:	TRNE	P1,10		;SLIGHTLY STRANGE
	JRST	PNTG2A
	TRNE	P1,100
	PUSH	P,['SMA']
	TRNE	P1,40
	PUSH	P,['SZA']
	TRNE	P1,20
	PUSH	P,['SNL']
	JRST	PNTG2B

PNTG2A:	TRNE	P1,100
	PUSH	P,['SPA']
	TRNE	P1,40
	PUSH	P,['SNA']
	TRNE	P1,20
	PUSH	P,['SZL']
PNTG2B:	TRNE	P1,200
	PUSH	P,['CLA']
	CAIN	P1,7410		;SPECIAL GROUP 2 OPRS
	PUSH	P,['SKP']
	CAIN	P1,7404
	PUSH	P,['OSR']
	CAIN	P1,7402
	PUSH	P,['HLT']
	JRST	PNTXXX
;HERE TO PRINT NORMAL OP-CODES (0-5)

PNTNRM:	PUSH	P,ITAB(T1)
	TRNE	P1,400		;LOOK FOR INDIRECT
	PUSH	P,['I']
	TRNN	P1,200
	PUSH	P,['0']		;NOT PAGE 0 BIT
	MOVE	T1,P1		;MAKE COPY OF INSTR
	ANDI	T1,177		;GET ADDRS PART
	MOVE	T2,ADDRES	;SEE WHAT PAGE WE ARE ON
	ANDI	T2,7600		;PAGE # ONLY
	TRNE	P1,200		;WAS IT PAGE 0?
	ADD	T1,T2		;NO - ADD IN PAGE FIELD
	MOVEI	P1,4		;CONVERT TO 4 DIGIT SIXBIT
	LSHC	T1,-3
	LSH	T2,-3
	SOJG	P1,.-2		;MAKE INTO ZONE DIGITS
	LSH	T2,-^D12	;RIGHT JUSTIFY
	IOR	T2,['0000']	;MAJIK
	PUSH	P,T2		;STACKIT
	JRST	PNTDMP		;GO DUMP THIS MES

;HERE TO PRINT IOT (6) INSTRUCTIONS

PNTIOT:	CAILE	P1,6007		;CHECK FOR BUILTIN
	JRST	PNTIOX		;NO - MUST BE DX10 SPECIFIC
	ANDI	P1,7		;MASK OUT TRASH
	PUSH	P,DTAB(P1)	;STASH OP
	JRST	PNTDMP		;AND DUMP

;HERE FOR DX10 IOTS

PNTIOX:	CAIL	P1,6500		;CHECK RANGE
	CAILE	P1,6577		;FOR VALID IOT
	JRST	PNTXXX		;LOSE
	PUSH	P,XTAB-6500(P1)
	JRST	PNTDMP		;GO DUMP
;HERE TO DUMP STACKED ATOMS

PNTDMP:	MOVE	P1,P		;COPY OF PDP
	SUB	P1,[1,,1]	;LOOK FOR MARKER
	SKIPE	0(P1)		;???
	JRST	.-2		;NO - KEEP LOOKING
	SUB	P1,[1,,1]	;BACK ONE MORE
	PUSH	P,P1		;SAVE THIS
	AOBJN	P1,PNTNXA	;ADVANCE AND START DUMPING

PNTNXT:	MOVE	T2,0(P1)	;FETCH ATOM
	MOVEI	T3,6		;MAX 6 CHARS
PNTNX1:	MOVEI	T1,0		;CLEAR T1
	LSHC	T1,6		;GET CHAR
	JUMPE	T1,PNTNX2	;SKIP NULLS
	ADDI	T1,40		;CONVERT TO ASCII
	PUSHJ	P,LCHAR		;DUMP CHAR
PNTNX2:	SOJG	T3,PNTNX1	;LOOP TILL DONE
	MOVEI	T1," "		;PRINT SPACE
	PUSHJ	P,LCHAR
PNTNXA:	AOBJN	P1,.+1		;ADVANCE TO NEXT
	CAME	P1,P		;DONE
	JRST	PNTNXT
	MOVE	P,0(P)		;MORE OBSCURITY
	JRST	LCRLF		;CRLF AND RETURN
;MAJIK TABLES

RTAB:	'***'
	'BSW'
	'RAL'
	'RTL'
	'RAR'
	'RTR'
	'***'
	'***'

ITAB:	'AND'
	'TAD'
	'ISZ'
	'DCA'
	'JMS'
	'JMP'

DTAB:	'SKON'
	'ION'
	'IOF'
	'SRQ'
	'GTF'
	'RTF'
	'SGT'
	'CAF'

;MOBY TABLE FOR DX10 IOT'S

XTAB:	'CCC'		;6500
	'SLB'
	'STM'
	'G8A'
	'G8B'
	'G8C'
	'GBI'
	'GTI'
	'LCB'
	'L8S'
	'LSF'
	'L8A'
	'L8B'
	'L8C'
	'LIS'
	'LBO'
	'TCP'
	'TBD'
	'TSF'
	'TSR'
	'TCL'
	'TCT'
	'TSA'
	'TRI'
	'***'		;6530
	'CAD'
	'CCM'
	'CSV'
	'COP'
	'CHL'
	'CSE'
	'CSU'
	'T8R'
	'TBP'
	'TDN'
	'TBC'
	'TOR'
	'***'		;6545
	'***'		;6546
	'***'		;6547
	'MRD'
	'MWR'
	'D8S'
	'LIL'
	'LIR'
	'GIL'
	'GIR'
	'I8S'
	'***'		;6560
	'***'		;6561
	'***'		;6562
	'***'		;6563
	'***'		;6564
	'***'		;6565
	'***'		;6566
	'SSA'
	'SVB'
	'SAD'
	'SCM'
	'SVA'
	'SOP'
	'SHL'
	'SSE'
	'SSU'		;6577
SUBTTL	HEADER CONSTRUCTION SUBROUTINES

HEDTXT:	POP	P,T2		;PRINT STRING, CALLED WITH PUSHJ
	HRLI	T2,(POINT 7,,)	;CHANGE PC TO BYTE POINTER
HEDTX2:	ILDB	T1,T2		;GET NEXT BYTE
	JUMPE	T1,1(T2)	;RETURN ON 0 CHARACTER
	PUSHJ	P,HEDCHR	;PRINT CHARACTER
	JRST	HEDTX2		;LOOP FOR MORE

HEDOCT:	TDZA	T3,T3		;PRINT OCTAL NUMBER, CALLED BY PUSHJ
HEDDEC:	MOVEI	T3,2		;PRINT DECIMAL NUM, CALLED BY PUSHJ
	MOVE	T4,T3		;FOR DECIMAL NUMS, FORCE 2 DIGITS
HEDNUM:	IDIVI	T1,10(T3)
	HRLM	T1+1,(P)
	SOSG	T4		;FORCE DIGITS
	SKIPE	T1
	PUSHJ	P,HEDNUM
	HLRZ	T1,(P)
HEDDIG:	ADDI	T1,"0"		;PRINT DIGIT
HEDCHR:	IDPB	T1,HEDPNT	;PRINT CHARACTER
	POPJ	P,

HED7:	MOVEI	T2,5		;PRINT 5 ASCII CHARS, CALLED BY PUSHJ
HED7A:	ROT	T1,7		;GET NEXT CHARACTER
	TRNE	T1,177		;SKIP IF NULL
	PUSHJ	P,HEDCHR
	SOJG	T2,HED7A	;LOOP UNTIL 5 PRINTED
	POPJ	P,
;LIST HEADING

LHEAD:	MOVEI	T1,HEADER	;GET HEADER
	PUSHJ	P,LSTTX		;LIST IT
				;FALL INTO LCRLF2

;LIST END OF LINE AND A BLANK LINE

LCRLF2:	PUSHJ	P,LCRLF
LCRLF:	MOVEI	T1,[BYTE (7)15,12]
				;FALL INTO LSTTX

;LIST ASCIZ STRING

LSTTX:	MOVE	T2,T1		;GET POINTER
	HRLI	T2,(POINT 7,,)	;SET ASCII POINTER
LSTTXL:	ILDB	T1,T2		;GET CHARACTER
	JUMPE	T1,RETRET	;RETURN IF DONE
	PUSHJ	P,LCHAR		;ELSE LIST IT
	JRST	LSTTXL		;LOOP UNTIL DONE

;LIST SLASH - FALL INTO LTAB

LSLSH:	MOVEI	T1,"/"
	PUSHJ	P,LCHAR

;LIST TAB

LTAB:	MOVEI	T1,11		;GET TAB
				;FALL INTO LCHAR

;LIST CHARACTER

LCHAR:	SOSG	OUTHDR+2	;COUNT CHARACTER IN BUFFER
	JRST	LCHARB		;NO ROOM--GO MAKE SOME
LCHARL:	IDPB	T1,OUTHDR+1	;OK--STORE CHARACTER
RETRET:	RETURN

LCHARB:	OUT	CHO,		;OUTPUT DATA BUFFER
	  JRST	LCHARL		;AND NOW GO DO CHARACTER
	ERROR	Output device error
	SUBTTL	COMMAND SCANNER

GETCOM:	OUTSTR	[ASCIZ /File: /]	;TELL USER WE ARE WAITING
COMLP:	PUSHJ	P,GETNAM	;GET A SIXBIT NAME
	JRST	.+2
COMFND:	MOVEI	T2,0		;CLEAR NAME
	MOVSI	T4,-BRKLEN	;LOOK FOR BREAK
	HLRZ	T3,BRKTAB(T4)	;TRY NEXT BREAK
	CAME	T1,T3		;SEE IF MATCH
	AOBJN	T4,.-2		;LOOP UNTIL MATCH
	HRRZ	T3,BRKTAB(T4)	;GET DISPATCH ADDRESS
	JRST	(T3)		;JUMP TO HANDLE BREAK

BRKTAB:	" ",,COMNOP		;SPACE IS A NO-OP
	".",,COMEXT		;DOT IS EXTENSION
	":",,COMDEV		;COLON IS DEVICE
	"[",,COMDIR		;BRAKET IS DIRECTORY
	"/",,COMSWT		;SLASH IS SWITCH
	12,,SAVNAM		;RETURN AT END OF LINE, AFTER SAVING FILE NAME
	32,,GOHOME		;IF ^Z
	3,,GOHOME		;IF ^C
BRKLEN==.-BRKTAB
	0,,COMERR		;ELSE, MUST BE ERROR

COMERR:	USEROR	Command error--type /H for help
COMNOP:	PUSHJ	P,SAVNAM	;STORE FILE NAME
	JRST	COMLP		;AND GO AROUND AGAIN

COMEXT:	PUSHJ	P,SAVNAM	;SAVE FILE NAME
	PUSHJ	P,GETNAM	;GET SIXBIT NAME
	HLLOM	T2,EXT		;SAVE EXT WITH FLAG FOR DOT
	JRST	COMFND		;AND GO AROUND AGAIN

COMDEV:	MOVEM	T2,DEV		;SAVE DEVICE
	JRST	COMLP		;GO AROUND AGAIN

COMDIR:	PUSHJ	P,SAVNAM	;SAVE FILE NAME
	PUSHJ	P,GETOCT	;GET OCTAL NOW
	CAIN	T1,"-"		;SEE IF DEFAULT
	JUMPE	T2,[PUSHJ P,GETCHR
		    JRST  COMDIX]
	HRLZ	T2,T2		;POSITION IT
	SKIPN	T2		;SKIP IF SOMETHING THERE
	GETPPN	T2,		;NO--GET FROM SYSTEM
	  JFCL
	HLLZM	T2,DIRECT	;SAVE FOR LATER
	CAIE	T1,","		;VERIFY COMMA
	JRST	COMERR		;NO--GIVE UP IN DISGUST
	PUSHJ	P,GETOCT	;GET PROGRAMMER
	SKIPN	T2		;SKIP IF SOMETHING THERE
	GETPPN	T2,		;ELSE ASK MONITOR
	  JFCL
	HRRM	T2,DIRECT	;STORE FOR LOOKUP
	CAIE	T1,","		;SEE IF SFD COMING
	JRST	COMDIX		;NO--GO FINISH UP
	MOVEI	T2,DIRPTH	;YES--SHIFT TO SFD
	EXCH	T2,DIRECT	; FORMAT
	MOVEM	T2,DIRPTH+2	; ..
	MOVSI	T4,-5		;MAX SFD COUNT
COMDIL:	PUSHJ	P,GETNAM	;GET SFD NAME
	JUMPE	T2,COMERR	;ERROR IF BLANK
	MOVEM	T2,DIRPTH+3(T4)	;STORE
	CAIN	T1,","		;SEE IF MORE
	AOBJN	T4,COMDIL	;YES--GO GET UNLESS TOO MANY
COMDIX:	CAIN	T1,"]"
	JRST	COMLP
	CAIN	T1,12
	JRST	COMFND
	JRST	COMERR

SAVNAM:	SKIPE	T2		;IF NAME,
	MOVEM	T2,NAME		; SAVE FOR LOOKUP
	POPJ	P,		;RETURN
;HERE WHEN SWITCH TO BE PROCESSED

COMSWT:	PUSHJ	P,SAVNAM	;SAVE FILE NAME
	PUSHJ	P,GETNAM	;GET SIXBIT WORD
	MOVEI	T3,0		;PRESET MASK
	MOVSI	T4,770000	;PRESET CHARACTER
	TDNE	T2,T4		;IF CHARACTER,
	IOR	T3,T4		; INCLUDE IN MASK
	LSH	T4,-6		;MOVE OVER ONE
	JUMPN	T4,.-3		;LOOP FOR WORD
	SETO	T4,		;PRESET SUCCESS COUNTER
	MOVSI	P1,-SWTLEN	;PRESET LOOP
SWTLOP:	CAMN	T2,SWTTAB(P1)	;SEE IF EXACT MATCH
	JRST	SWTWIN		;YES--WIN
	MOVE	P2,SWTTAB(P1)	;NO--GET WORD
	XOR	P2,T2		;COMPARE WITH INPUT
	TDNE	P2,T3		;LOOK THROUGH MASK
	JRST	.+3		;NO--KEEP TRYING
	AOS	T4		;COUNT MATCH
	MOVE	P3,P1		;SAVE POINTER
	AOBJN	P1,SWTLOP	;SEE IF DONE YET
	MOVE	P1,P3		;RESTORE WINNER
	JUMPE	T4,SWTWIN	;SEE IF JUST ONE MATCH
	SKIPGE	T4
	USEROR	Unknown switch--type /H for help
	USEROR	Ambiguous switch--type /H for help
SWTWIN:	HLRZ	T2,SWTVAL(P1)	;GET DEFAULT VALUE
	CAIN	T1,":"		;SEE IF VALUE TYPED IN
	PUSHJ	P,GETOCT	;YES--GET OCTAL NUMBER
	HRRZ	T3,SWTVAL(P1)	;GET ADDRESS OF SWITCH
	JUMPE	T3,HELP		;NONE--MUST BE /H
	MOVEM	T2,(T3)		;STORE ANSWER
	JRST	COMFND		;GO HANDLE BREAK
SWTTAB:	SIXBIT	/CLEAR/
	SIXBIT	/DUMP/
	SIXBIT	/END/
	SIXBIT	/HELP/
	SIXBIT	/LOAD/
	SIXBIT	/START/
	SIXBIT	/UNIT/
SWTLEN==.-SWTTAB
SWTVAL:	V.CLR,,A.CLR		;DEFAULT,,LOCATION
	V.DUMP,,A.DUMP
	V.END,,A.END
	0
	0,,A.LOAD
	V.STRT,,A.STRT
	0,,A.CHL


;HERE IF /HELP
HELP:	CAIN	T1,12		;SEE IF AT END OF LINE YET
	JRST	HELP1		;YES--GO DO THE HELP
	PUSHJ	P,GETCHR	;NO--GET ANOTHER CHAR
	JRST	HELP		;AND LOOP
HELP1:	MOVE	1,['BOOTDX']
	PUSHJ	P,.HELPR##
	JRST	START
GETNAM:	MOVE	T3,[POINT 6,T2]
	MOVEI	T2,0		;CLEAR NAME
GETNM1:	PUSHJ	P,GETCHR	;GET NEXT CHAR
	CAIL	T1,"A"+40	;SEE IF LC
	CAILE	T1,"Z"+40
	JRST	.+2
	SUBI	T1,40		;YES--MAKE UC
	CAIL	T1,"0"		;SEE IF BREAK
	CAILE	T1,"Z"		; ..
	RETURN
	CAILE	T1,"9"		;OR OK
	CAIL	T1,"A"
	JRST	.+2
	RETURN
	SUBI	T1,40		;CONVERT TO SIXBIT
	TLNE	T3,770000	;SEE IF OVERFLOW
	IDPB	T1,T3		;STORE RESULT
	JRST	GETNM1		;LOOP FOR MORE

GETOCT:	MOVEI	T2,0		;CLEAR RESULT
GETOC1:	PUSHJ	P,GETCHR	;GET NEXT ODGIT
	CAIL	T1,"0"		;SEE IF
	CAILE	T1,"7"		; BREAK
	RETURN
	LSH	T2,3		;MULT BY 8
	ADDI	T2,-"0"(T1)	;INCLUDE ODGIT
	JRST	GETOC1		;LOOP

GETCHR:	INCHWL	T1		;GET NEXT CHARACTER
	JUMPE	T1,GETCHR	;LOOP IF NULL
	CAIE	T1,177		;IF RUB
	CAIN	T1,15		;OR CR
	JRST	GETCHR		;LOOP
	CAIL	T1,175		;IF ALTERNATE ALT MODE
	MOVEI	T1,33		; STANDARDIZE
	CAIN	T1,33		;IF ESCAPE
	MOVEI	T1,12		; MAKE INTO EOL
	CAIE	T1,13		;IF VTAB
	CAIN	T1,14		; OR FORM
	MOVEI	T1,12		; MAKE INTO LF
	CAIN	T1,11		;SEE IF TAB
	MOVEI	T1," "		;YES, CHANGE TO SPACE
	RETURN
SUBTTL	UTILITY SUBROUTINES

;ROUTINE TO GET NEXT BYTE FROM FILE
;RETURNS BYTE IN P1 / PARTIAL CKSUM IN P2

GETBYT:	PUSHJ	P,GETC		;GET FILE CHAR
	ADD	P2,P1		;ADD INTO CKSYM
	POPJ	P,		;RETURN

GETC:	SOSG	INHDR+2
	PUSHJ	P,GETBYI	;RE-FILL BUFFER
	ILDB	P1,INHDR+1	;GET BYTE
	POPJ	P,		;RETURN

;ROUTINE TO GET NEXT WORD FROM FILE
;RETURNS 20000 IF LEADER/TRAILER , 1XXXX IF ADDRESS
;YYYY IF JUST DATA WORD

GETWRD:	MOVEI	P2,0		;PARTIAL CKSUM TO ZERO
	PUSHJ	P,GETBYT	;GET A BYTE
	LSH	P1,6		;PUT IN CORRECT PLACE
	TRNE	P1,20000	;CHECK FOR LEADER/TRAILER
	JRST	GETCH8		;CHECK CHL 8
	PUSH	P,P1		;SAVE FIRST CHAR
	PUSHJ	P,GETBYT	;GET 2ND BYTE
	TRNE	P1,300		;BETTER HAVE 7/8 ZERO
	ERROR	Illegal 2nd character
	IOR	P1,0(P)		;COMBINE
TPOPJ:	POP	P,T1		;PRUNE PDL
CPOPJ:	POPJ	P,		;EXIT

;HERE TO CHECK RANDOMNESS

GETCH8:	TRNE	P1,7700		;GOT ANYTHING
	ERROR	<Trash in file>
	TRNN	P1,10000	;IGNORE FIELD SET ZERO
	POPJ	P,
	JRST	GETWRD		;...

;FILL BUFFER AND CHECK ERRORS

GETBYI:	IN	CHI,0		;DO INPUT
	  POPJ	P,		;OK RETURN
	STATZ	CHI,740000	;HARD ERROR?
	 ERROR	<Input file read error>
	STATZ	CHI,20000	;EOF?
	 ERROR	<Unexpected EOF>
	POPJ	P,		;SYSTEM CONFUSED
;ROUTINE TO CHECK WHAT TYPE OF FILE WE ARE READING

CHKLFT:	PUSHJ	P,GETC		;GET FIRST CHAR OF FILE
	JUMPE	P1,CHKB		;SEE IF BINARY IF NULL
	CAIE	P1,"8"		;SEE IF AN ASCII '8'
	JRST	[PUSHJ P,SKPCOM	;SKIP COMMENT
		 JRST CHKLFT]	;TRY AGAIN
	SETOM	A8FLG		;SAY A8 FILE
	AOS	INHDR+2		;BACKUP INPUT FILE
	MOVSI	T1,70000	;BACK UP BYTE PNTR
	ADDM	T1,INHDR+1	;...
	POPJ	P,		;RETURN

CHKB:	SETSTS	CHI,CHIMOD	;CHANGE TO BINARY MODE
	MOVSI	T1,(POINT 36,0)
	HLLM	T1,INHDR+1
	AOS	T1,INHDR+2	;ADJUST COUNT CORRECTLY
	IDIVI	T1,5
	SKIPE	T2
	ADDI	T1,1		;ROUND UP
	MOVEM	T1,INHDR+2
	SETZM	A8FLG		;SAY BIN FILE
	POPJ	P,

;ROUTINE TO SKIP COMMENTS

SKPCOM:	CAIE	P1,";"		;VALID COMMENT CHAR?
	ERROR	<File not in A8 format>
SKPCM1:	PUSHJ	P,GETC		;GET CHAR TILL  EOL
	CAIE	P1,12		;LINE FEED?
	JRST	SKPCM1		;NO - LOOP
	POPJ	P,		;YES - RETURN
;PDP-8 A8 UTILITIES

GET2W:	PUSH	P,[0]		;INIT ANSWER
	PUSHJ	P,GETA8		;GET FIRST CHAR
	 JRST	GET2X		;EXIT IF NOT DIGIT
	MOVEM	P1,0(P)		;STASH ON PDL
	PUSHJ	P,GETA8		;GET NEXT
	 JRST	GET2X		;MUST BE SINGLE DIGIT
	EXCH	P1,0(P)		;NEW LOW ORDER BYTE
	LSH	P1,6		;MAKE HIGH ORDER BYTE
	IORM	P1,0(P)		;COMBINE
	PUSHJ	P,GETC		;GET NEXT FILE CHAR
GET2X:	MOVE	P2,P1		;RETURN BREAK CHAR IN P2
	POP	P,P1		;RESTORE WORD TO P1
	POPJ	P,		;EXIT

;GET NEXT FILE CHAR AND RETURN LOW 6 BITS

GETA8:	PUSHJ	P,GETC		;GET CHAR FROM FILE
	CAIE	P1,","		;CHECK TERMINATOR
	CAIN	P1,15
	POPJ	P,		;NON SKIP RETURN
	ANDI	P1,77		;TRIM TO LOW ORDER 6-BIT
	JRST	CPOPJ1		;SKIP IF CHAR OK

;GET WORD COUNT FFROM FILE

WCREAD:	PUSHJ	P,GETC		;GET CHARACTER
	CAIE	P1,"8"		;CHECK VALIDITY
	JRST	[PUSHJ P,SKPCOM	;SKIP COMMENT
		 JRST WCREAD]
	PUSHJ	P,GETC		;GET NEXT CHARACERR
	CAIE	P1," "		;BETTER BE A SPACE
	ERROR	<File not in correct A8 format>
	SETZM	CHKSUM		;INIT CHECKSUM
				;NOW GET DATA WORD
WDREAD:	PUSHJ	P,GET2W		;GET 12 BIT NUMBER
	ADDM	P1,CHKSUM	;ADD TO CHECKSUM
	CAIE	P2,","		;GRNTEE COMMA TERMINATOR
	ERROR	<File not in correct A8 format>
	POPJ	P,		;RETURN (ANSWER IN P1)
;PRINT OCTAL 4 DIGIT NUMBERS

L6OCT:	SKIPA	T3,[6]		;GRNTEE 6 DIGITS
L4OCT:	MOVEI	T3,4		;GRNTEE 4 DIGITS
PNTO1:	IDIVI	T1,10
	HRLM	T2,0(P)
	SOSLE	T3
	PUSHJ	P,PNTO1		;RECURSE
PNTO2:	HLRZ	T1,0(P)		;GET DIGIT
	ADDI	T1,"0"
	JRST	@OCHLOC

TTOCH:	OUTCHR	T1		;PRINT IT
	POPJ	P,		;RETURN

;CLEANUP ROUTINE

EXITX:	JSP	T1,.+1		;GET PC
	TLNN	T1,(1B6)	;CHECK USER IOT
	JRST	EXITXA		;JUST LEAVE
	PUSHJ	P,HALT8		;STOP '8 IF IN USER IOT

;HERE TO EXIT

GOHOME:	PUSHJ	P,RESTOR	;RESTORE STATUS/CLR ERRORS
EXITXA:	RESET			;TURN OFF USER IOT
	HLLZM	.JBINT##	;DISABLE ^C INTERCEPT
	EXIT	1,		;.
	JRST	.-1

;ROUTINE TO RESTORE STATUS REG

RESTOR:	MOVEI	T1,1		;ANOTHER SNOOZE
	SLEEP	T1,
	  JFCL
	MOVEI	T1,CLRERR	;CLEAR ERRORS
	XCT	PDCCNO(W)	;...
	MOVE	T1,PISAVE	;PUT REG BACK
	XCT	T1,PDCCNO(W)
	POPJ	P,		;RETURN

;PRINT CONFIG INFO

PNTCNF:	OUTSTR	[ASCIZ /" Micro-code version: /]
	MOVE	T1,VERMP
	PUSHJ	P,LOCT		;PRINT OCTAL
	OUTCHR	["("]
	MOVE	T1,EDTMP
	PUSHJ	P,LOCT
	OUTSTR	[BYTE (7)")",15,12]
	POPJ	P,
;ROUTINE TO TYPE OUT OCTAL NUMBERS AS THEY ARE

LOCT:	IDIVI	T1,10		;GET FIRST DIGIT EVEN IF ZERO
	HRLM	T2,0(P)		;STORE ON PDL
	SKIPE	T1		;QUITE WHEN ZERO
	PUSHJ	P,LOCT
	JRST	PNTO2		;TYPE IT
SUBTTL SPECIAL PDP-8 ROUTINES

;ROUTINE TO RESET DX10 AND STOP THE '8

RESET8:	MOVE	T1,[.STCPU,,SP.CR0]
	SETUUO	T1,		;RUN ONLY ON CPU0
	  JFCL			;IGNORE ERROR?
	MOVEI	T1,CCINT	;SET UP ^C INTERCEPT
	HRRM	T1,.JBINT##	;SAVE IN CORRECT PLACE
	SETZB	T1,CCINTP	;ZAP
	TRPSET	T1,		;GET GOOD PRIVS
	 ERROR <TRPSET failed>

	XCT	PDCCNI(W)	;GET STATUS REG
	ANDI	T1,PIMASK	;MASK WHAT WE WANT TO SAVE
	MOVEM	T1,PISAVE	;SAVE IT
	SKIPGE	A.DUMP		;SKIP RESET IF DUMPING
	SKIPL	A.END
	JRST	NORST
	MOVE	T1,[DXCLR]	;CLEAR OUT DX10
	XCT	PDCDTO(W)	;...

NORST:	XCT	PDCCNI(W)	;GET RUN INDICATOR
	TLNE	T1,RUNIND	;IS '8 RUNNING
	PUSHJ	P,HALT8		;YES - STOP IT
	MOVEI	T1,1		;SLEEP A SEC HERE TOO
	SLEEP	T1,
	  JFCL
	MOVEI	T1,CLRERR
	XCT	PDCCNO(W)	;ZAP REG ONCE MORE
	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;SELECT SW REG
	XCT	PDCDTI(W)	;READ IT
	ANDI	T1,MPSS!MPHALT!MPCONT
	TRZE	T1,MPCONT	;CLEAR CONT & SKIP IF OFF
	XCT	PDCDTO(W)	;TURN IT OFF IF ON
	MOVEM	T1,SW8		;SAVE REG
	POPJ	P,		;RETURN

;ROUTINE TO TRY TO STOP PDP-8

HALT8:	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;SELECT CORRECT REG
	XCT	PDCDTI(W)	;READ IT
	TRO	T1,MPHALT	;SET HALT FLAG
	XCT	PDCDTO(W)	;HALT '8
	MOVEI	T2,2		;TRY TWICE
HALT8A:	MOVEI	T1,1		;SLEEP FOR A SEC
	SLEEP	T1,		;ZZZZZ
	  JFCL
	XCT	PDCCNI(W)	;READ STATUS
	TLNE	T1,RUNIND	;RUNNING?
	SOJG	T2,HALT8A	;YES - TRY ONCE MORE
	JUMPG	T2,CPOPJ	;OK IF OFF
	ERROR	<Cannot halt DX10>
;ROUTINE TO CLEAR OUT PDP-8 MEMORY

CLEAR:	TELLCR	Clearing DX10
	MOVEI	P1,0		;START OF AREA TO CLEAR
	MOVE	T1,A.CLR	;CHECK VALIDITY OF ADDRESS
	CAIL	T1,V.CLR	;CHECK UPPER BOUND
	MOVEI	T1,V.CLR	;DEFAULT
	MOVEM	T1,A.CLR	;SAVE VALUE
	MOVE	T1,[RSEL,,MPADR]
	XCT	PDCDTO(W)	;SELECT ADDR
	MOVE	T1,P1		;SET ADDESS
	XCT	PDCDTO(W)	;...

CLEARL:	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;SELECT CTL REG
	MOVEI	T1,ENDEP!HLTINS	;ZAP MEMORY WITH HALTS
	IOR	T1,SW8		;OLD SW REG
	XCT	PDCDTO(W)	;WRITE IT
	AOS	T1,P1		;ADVANCE TO NEXT
	CAMLE	T1,A.CLR	;DONE?
	POPJ	P,		;YES - RETURN
	PUSHJ	P,CKCPMA	;CHECK MEM ADV
	JRST	CLEARL		;LOOP TILL DONE

;ROUTINE TO CHECK IF AUTO MA ADVANCE HAPPENED
;C(T1) HAS CORRECT VALUE

CKCPMA:	PUSH	P,T1		;SAVE T1
	MOVE	T1,[RSEL,,MPADR]
	XCT	PDCDTO(W)	;SELECT ADR
	XCT	PDCDTI(W)	;READ WHAT IT THINKS
	ANDI	T1,7777		;MASK
	CAMN	T1,0(P)		;AGREE?
	JRST	CKCPMX		;YES - EXIT
	SETOM	VERERR		;FLAG ERROR
	OUTSTR	[ASCIZ /? CPMA incr error. CPMA = /]
	PUSHJ	P,L4OCT		;PRINT ERROR INFO
	OUTSTR	[ASCIZ /  should be = /]
	MOVE	T1,0(P)		;GET CORRECT VALUE
	PUSHJ	P,L4OCT		;PRINT IT
	OUTSTR	[BYTE (7)15,12]	;CRLF
	MOVE	T1,0(P)		;NOW SET CORRECT VALUE
	XCT	PDCDTO(W)	;...
CKCPMX:	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;RESELECT CTL REG
	JRST	TPOPJ		;PRUNE & EXIT
;ROUTINE TO START '8 AT C(P2)

START8:	CAILE	P2,7777		;CHECK VALIDITY
	ERROR <Invalid starting address>
	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)	;SELECT CTRL REG
	MOVEI	T1,MPHALT	;GRNTEE HALT UP
	XCT	PDCDTO(W)	;...
	MOVE	T1,[RSEL,,MPADR]
	XCT	PDCDTO(W)	;SELECT ADDRS
	MOVE	T1,P2		;GET START LOC
	XCT	PDCDTO(W)	;STUFF IT
	MOVE	T1,[RSEL,,MPCTL]
	XCT	PDCDTO(W)
	MOVEI	T1,MPCONT	;SET CONTINUE
	XCT	PDCDTO(W)	;START WORLD
	MOVEI	T1,MPERR	;CLEAR 8A ERROR
	XCT	PDCCNO(W)
	MOVEI	T2,2		;TRY TWICE
STARTL:	MOVEI	T1,1		;SLEEP FOR 1 SEC
	SLEEP	T1,		;ZZZZ
	  JFCL
	XCT	PDCCNI(W)	;READ REGS
	TRNN	T1,MPERR	;CHECK EVERYTHING OK
	TLNN	T1,RUNIND	;RUNNING?
	SOJG	T2,STARTL	;NO - TRY AGAIN
	JUMPG	T2,CPOPJ	;EXIT IF OK
	ERROR	<Cannot start DX10>
SUBTTL STORAGE
	XLIST	;LITERALS
	LIT
	LIST

HEDPNT:	BLOCK	1		;POINTER FOR CONSTRUCTING HEADER
HEADER:	BLOCK	^D20		;BLOCK FOR HEADER
HEDEND:

CCINT:	EXITX		;^C INTERCEPT BLOCK
	1B34
CCINTP:	Z
	Z

;DX10 IOT'S

PDCBAS:	PHASE 0
PDCCNO:! CONO PDC,(T1)
PDCCNI:! CONI PDC,T1
PDCDTO:! DATAO PDC,T1
PDCDTI:! DATAI PDC,T1
	DEPHASE

PDC2BS:	CONO PDC2,(T1)
	CONI PDC2,T1
	DATAO PDC2,T1
	DATAI PDC2,T1

;BYTE POINTERS INTO MEM8

MPNTR:	POINT	12,MEM8
	POINT	12,MEM8,11
	POINT	12,MEM8,23

OCHLOC:	TTOCH		;PRINT SWITCH

FWAZER:!		;START OF AREA TO CLEAR

PDLST:	BLOCK	PDSIZ+1
DEV:	BLOCK	1		;DEVICE
NAME:	BLOCK	1		;FILE NAME
EXT:	BLOCK	1		;FILE EXTENSION,,-1 IF . SEEN
DIRECT:	BLOCK	1		;DIRECTORY
DIRPTH:	BLOCK	9		;SFD PATH

INHDR:	BLOCK	3		;INPUT HEADER
OUTHDR:	BLOCK	3		;OUTPUT HEADER
ADDRES:	BLOCK	1
VERERR:	BLOCK	1		;FLAG FOR ADDRESS CHECKING
SW8:	BLOCK	1		;PLACE TO REMEMBER PDP-8 CONSOL SWITCHES
BINFLG:	BLOCK	1		;BIN/RIM FLAG
PISAVE:	BLOCK	1		;PLACE TO SAVE DX10 STATUS
CHKSUM:	BLOCK	1		;RUNNING CHECKSUM
APNTR:	BLOCK	1		;POINTER TO MEM8
FEATUR:	BLOCK	1		;FEATURE REGISTER
VERMP:	BLOCK	1		;VERSION # OF MICRO-CODE
EDTMP:	BLOCK	1		;EDIT LEVEL OF MICRO-CODE
FIRZER:	BLOCK	1		;FIRST LOCATION OF ZEROS
LASZER:	BLOCK	1		;LAST ..
A8FLG:	BLOCK	1		;0 := .BIN FILE, -1 := .A8 FILE
MEM8:	BLOCK	^D4096/3+1	;PDP-8 MEMORY

LWAZER==.-1		;END OF AREA TO CLEAR

FWAONE:!		;START OF AREA TO PRESET TO -1
A.CLR:	BLOCK	1		;/CLEAR:N
A.DUMP:	BLOCK	1		;/DUMP:N
A.END:	BLOCK	1		;/END:N
A.LOAD:	BLOCK	1		;/LOAD:N
A.STRT:	BLOCK	1		;/START:N
A.CHL:	BLOCK	1		;/UNIT:N
LWAONE==.-1		;END OF AREA TO PRESET TO -1

	END	START