Google
 

Trailing-Edge - PDP-10 Archives - bb-d549g-sb - dxld.mac
There are 6 other files named dxld.mac in the archive. Click here to see a list.
	TITLE DXLD	DX10 AND DX20 MICRO-CODE BOOTSRAP LOADER
	SUBTTL T.HESS/TAH/TW	28 JUN 80

	SALL

;ASSEMBLY SWITCHES
IFNDEF DX20,<DX20==1>	;NON-0 TO LOAD THE DX20 AS WELL AS THE DX10

;ASSIGNMENTS

IOCLR==1B19		;APR, I/O CLR
PICLR==10400		;PI SYSTEM CLEAR
DTE==200		;DEVICE CODE


;VERSION NUMBER

VDXLD==2		;VERSION #
EDXLD==7		;EDIT #
PDXLD==0		;PATCH LEVEL
WDXLD==0		;LAST EDITED BY DEC

	LOC	137
	BYTE	(3)WDXLD(9)VDXLD(6)PDXLD(18)EDXLD
;MAGIC ADR AND VALUE DEFINITION

MAGICA==11			;ADDRESS THAT THE STANDALONE AND
				; USER MODE BOOTSTRAPS MUST PUT A
				; MAGIC VALUE IN AS THE MONITOR CHECKS
				; THE MAGIC VALUE DURING INITIALIZATION.
MAGICV==42562			;THE MAGIC VALUE

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

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

	DEFINE	RETURN <
	XLIST
	POPJ	P,
	LIST>
DEFINE PREWT(X)
	<SETZ T2,		;;SET T2 TO 0
	MOVEI	T3,X		;;GET REGISTER NUMBER IN T3
	>;END OF PREWT

;DX10 VALUES

PDC==220		;DEVICE CODE
RUNIND==1		;RUN FLAG
INHLD==1B25	;INHIBIT LOAD ICPC
MPERR=1B26	;MICRO-PROCESSOR ERROR
MEMPAR==1B27	;MEM PAR ERROR
NXM==1B28	;NXM
STAVL==1B29	;STATUS AVAIL
CONT==1B32	;CONTINUE DX10

DXCLR==2	;CLEAR DX10
UNITNM==7713	;ADDRESS OF UNIT IN 8-MEM
ENEXM==1B22	;ENABLE EXAMINE
ENDEP==1B23		;ENABLE DEPOSIT
RSEL==1
MPADR==5
MPCTL==4
;AC'S

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

P1=5
P2=6
WC==7
P=17		;PUSH DOWN PNTR
	SUBTTL	EXEC-MODE LOAD MICRO
	LOC	200

PLIST:	BLOCK	20

;THIS CODE WILL BE READ-IN BY THE TU70 MAGTAPE SYSTEM
;BY THE READ-IN HARDWARE STARTING AT LOCATION 0
;AND THEN WILL BE STARTED AT LOCATION 100.

	LOC	220		;CODE WILL EVENTUALLY BE TRANSFERRED TO HERE

CONIX:	CONI PDC,0		;CONI INSTRUCTION
CONOX:	CONO PDC,CONT		;CONO TO SET CONTINUE
DATAIX:	DATAI	PDC,0		;DATAI INSTRUCTION
DATAOX:	DATAO PDC,0		;DATAO INSTRUCTION

CONOP:	POINT 7,CONOX,9		;POINTER TO CONO DEVICE CODE
DATAIP:	POINT 7,DATAIX,9	;POINTER TO DATAI DEVICE CODE
DATAOP:	POINT 7,DATAOX,9	;POINTER TO DATAO DEVICE CODE

MEM8P:	POINT 12,MEM8		;POINTER TO PDP-8A CORE IMAGE
RECDS:	BLOCK	1		;RECORDS TO READ FROM TAPE
STRTAD:	BOOTM##			;BOOTM START ADDRESS
LOCATE:	MEM8			;START LOADING HERE


	PHASE 77		;CODE EXECUTED AT 100 STARTS HERE

POINTR:	XWD	<READIN-<LOCATE-CONIX+2>>,CONIX;BLT POINTER
READIN:	MOVE	POINTR		;GET POINTER
	BLT	ENDIN		;TRANSFER PROGRAM
	JRST	WHICH		;GO TO PROGRAM

	DEPHASE
;DETERMINE WHICH DX10 PERFORMED THE READ-IN

WHICH:	MOVE	1,CONIX		;GET CONI INSTRUCTION
	XCT	1		;EXECUTE CONI
	TLNE	RUNIND		;SKIP IF NOT RUNNING
	JRST	SETCOD		;FOUND DX10
	TLC	1,(1B9)		;CHANGE CODE TO 224
	JRST	WHICH+1		;CHECK THIS CODE

;STORE TABLE OF I/O INSTRUCTION WITH SELECTED DEVICE CODE

SETCOD:	MOVEM	1,CONIX		;STORE CONI
	LSH	1,-^D26		;POSITION DEVICE CODE
	DPB	1,CONOP		;PUT IT IN CONO INSTRUCTION
	DPB	1,DATAIP	;PUT IT IN DATAI INSTRUCTION
	DPB	1,DATAOP	;PUT IT IN DATAO INSTRUCTION

;READ THE OTHER RECORED INTO CORE AND TRANSFER THEM
;TO MEMORY. THESE RECORDS ARE BOOTM.

READRC:	XCT	CONOX		;CONTINUE THE READ
	XCT	CONIX		;EXECUTE CONI
	JUMPG	.-1		;WAIT TILL DX10 LOAD I/O BUS
	XCT	DATAIX		;CLEAR I/O BUS
	XCT	DATAIX		;BOTH WORDS
	HRLZI	1,20		;SET UP BLT POINTER
	HRR	1,LOCATE	;START AT ADR IN LOCATE
	MOVEI	2,200-20	;TRANSFER FULL RECORD LESS THE AC'S
	ADDB	2,LOCATE	;UPDATE LOCATE FOR NEXT RECORD
	BLT	1,-1(2)		;TRANSFER THE DATA
	SOSLE	RECDS		;REPEAT UNTIL ALL RECORDS READ
	JRST	READRC
;GET UNIT NUMBER OF DEVICE FROM WHICH FILE WAS READ

	MOVE	[RSEL,,MPADR]	;SELECT 8A'S CPMA ON IBUS
	TLO	DXCLR		;RESET THE DX10 ALSO
	XCT	DATAOX
	MOVEI	UNITNM		;GET ADR OF UNIT #
	XCT	DATAOX		;LOAD ADDRESS
	MOVE	[RSEL,,MPCTL]	;SELECT 8A CONTROL REGISTER
	XCT	DATAOX
	MOVEI	ENEXM		;CAUSE A MEMORY READ
	XCT	DATAOX
	XCT	DATAIX		;GET THE DATA
	ANDI	17		;CLEAR OTHER BITS
	HRLI	3		;CTL TYPE OF DX10
	MOVEM	UNIT##		;SAVE UNIT #

;LOAD THE MICRO-CODE INTO THE 8A MEMORY

LOADMC:	MOVE	[RSEL,,MPADR]	;SELECT CPMA ON IBUS
	XCT	DATAOX
	MOVEI	0		;LOAD ADR 0
	XCT	DATAOX
	MOVE	[RSEL,,MPCTL]	;SELECT 8A CONTROL REGISTER
	XCT	DATAOX
	MOVE	1,MEM8P		;BYTE POINTER TO 8 MEMORY IMAGE
	MOVEI	2,10000		;COUNT OF DATA WORDS
LOAD8A:	ILDB	1		;GET A DATA WORD
	TRO	ENDEP		;SET ENABLE DEPOSIT BIT
	XCT	DATAOX		;WRITE WORD INTO MEMORY
	SOJG	2,LOAD8A	;WRITE ALL WORDS
IFN DX20,<
SET20:	JSR	LOAD20		;START THE DX20 MICRO (PATHED OUT IF NO SYS:DXMCA.ADX)
>
	JRST	@STRTAD		;START BOOTM

NXMW:	0			;NXM BIT FOR CONI INSTR

;1080 STARTING POINT

START:	CONO	APR,IOCLR	;IO RESET
	MOVE	P,[-20,,PLIST]	;SET UP PDL
	CONO	PAG,0
	CONO	DTE,20
	MOVSI	DXCLR		;RESET DX10
	XCT	DATAOX
	SETZM	UNIT##		;DONT KNOW
	JRST	LOADMC		;NOW LOAD DX AND START BOOTM


	LIT
ENDIN:	0			;END OF READIN RECORD
	LOC	440
;THIS CODE WILL BE EXECUTED ONLY IN USER MODE TO
;CREATE THE READ-IN FILE FOR TU70 READ-IN.

;READ THE MICRO-CODE FILE DXMPA.BIN AND TRANSLATE INTO
;PDP-8A CORE IMAGE

BEGIN:	SUBTTL	USER-MODE SETUP FOR DX10
	MOVE	P,[-20,,PLIST]	;SET UP PUSH LIST
	MOVEI	BOOTM##		;START ADDRS OF BOOTM
	CAIG	MEM8E		;CHECK OVERLAP
	JRST	BADLOD		;INFORM USER
	MOVE	FILL		;GET WORD OF HALT INSTRUCTIONS
	MOVEM	MEM8		;PUT IN 8 MEMORY IMAGE
	MOVSI	MEM8		;BUILD BLT POINTER
	HRRI	MEM8+1		;TO FILL ALL OF 8 MEMORY IMAGE
	BLT	MEM8E		;WITH HALT INSTRUCTIONS
	SETOM	A8FLG		;INIT FLAG
	MOVSI	'A8 '
	HLLZM	FNAME+1	;AND EXTENSION
	INIT	10		;INITIALIZE DISK FOR IMAGE MODE
	SIXBIT	/SYS/		;CALL DEVICE SYS
	EXP	BUF		;SPECIFY INPUT BUFFER
	JRST	INTERI		;INIT ERROR
RELOOK:	LOOKUP	FNAME		;LOOKUP MICRO-CODE BINARY FILE
	JRST	[HLRZ FNAME+1
		CAIE 'A8 '
		JRST NOMICR
		SETZM A8FLG
		MOVSI 'BIN'
		HLLZM FNAME+1
		JRST RELOOK]
	INBUF			;SET UP BUFFER
	SKIPE	A8FLG
	JRST	MCA8		;LOAD .A8 FILE
	PUSHJ	P,CHRIN		;READ A CHARACTER FROM PAPER TAPE
	JUMPE	.-1		;IGNORE IT IF ZERO
	CAIE	200		;FIND LEADER
	JRST	NOLEAD		;NO LEADER?
	PUSHJ	P,WRDIN		;GET ALL LEADER CHARACTERS
	CAIN	1,20000		;STILL LEADER?
	JRST	.-2		;YES, KEEP IT COMING
	TRZN	1,10000		;FIRST WORD, BETTER BE ADDRESS
	JRST	BADCHR
	SETZM	CHECK		;CLEAR CHECKSUM
MCADR:	ADDM	4,CHECK		;UPDATE CHECKSUM
	IDIVI	1,3		;GET ADDRESS OF STORAGE WORD
	ADDI	1,MEM8
	MOVEM	1,PNTR		;STORE AS POINTER ADR
	IMULI	2,^D12		;COMPUTE BYTE POSITION
	MOVEI	1,^D36		;FROM REMAINDER
	SUB	1,2		;IN FIRST
	LSH	1,^D12		;POSITION NUMBER
	ORI	1,^D12_6	;BYTE SIZE
	HRLM	1,PNTR		;COMPLETE POINTER
	PUSHJ	P,WRDIN		;GET DATA WORD
MCDATA:	TRCE	1,10000		;DATA OR ADDRESS?
	JRST	MCADR		;ADDRESS - GO LOAD IT
	MOVEM	1,NUMSAV	;SAVE THIS DATA ENTRY
	MOVEM	4,DCSAV		;SAVE ASSOCIATED CHECKSUM ENTRY
	PUSHJ	P,WRDIN		;READ NEXT WORD FROM TAPE
	TRNE	1,20000		;SKIP IF NEXT ENTRY IS NOT TRAILER
	JRST	MCSUM		;LAST ENTRY WAS CHECKSUM
MCCONT:	MOVE	2,DCSAV		;GET SAVED CHECKSUM ENTRY
	ADDM	2,CHECK		;UPDATE CHECKSUM
	MOVE	2,NUMSAV	;GET DATA ENTRY
	IDPB	2,PNTR		;STORE DATA IN TABLE
	JRST	MCDATA		;GET NEXT WORD FROM TAPE
;NUMSAV CONTAINS CHECKSUM FROM TAPE
;CHECK CONTAINS COMPUTED CHECKSUM

MCSUM:	MOVE	4,CHECK		;GET COMPUTED CHECKSUM
	ANDI	4,7777		;STRIP TO 12 BITS
	MOVE	1,NUMSAV 	;GET CHECKSUM FROM TAPE
	ANDI	1,7777		;STRIP TO 12 BITS
	CAME	4,1		;CHECK IF CHECKSUMS MATCH
	JRST	BADCHK		;CHECKSUM ERROR
SETUP2:
IFN DX20,<
	LOOKUP	DX2NAM
	  JRST	[OUTSTR [ASCIZ /%SYS:DXMCA.ADX NOT FOUND, WONT LOAD DX20
/]
		 MOVSI T1,(JFCL)
		 MOVEM T1,SET20
		 JRST WRTIT]
	MOVSI	440700
	HLLM	BUFP
	SETSTS	0
	PUSHJ	P,READ20
>
WRTIT:	RESET			;INITIALIZE I/O
	MOVEI	4756		;MAJIK BITS
	DPB	[POINT 12,MEM8+<17/3>,11]
	JRST	OTBUF		;GO TO WRITE OUTPUT FILE

;READ FROM THE FILE
;READ A CHARACTER, CHECK FOR ERROR

CHRIN:	SOSGE	BUFC		;DECREMENT THE COUNT
	JRST	GETBF		;GET ANOTHER BUFFER
	ILDB	BUFP		;GET DATA
	ADDM	4		;COMPUTE CHECKSUM FOR THIS ENTRY
	POPJ	P,		;RETURN

GETBF:	IN			;GET A BUFFER
	JRST	CHRIN		;NO ERROR, JUMP BACK
	OUTSTR	.+2
	EXIT
	ASCIZ	/
INPUT ERROR FROM DXMPA.BIN/
;READ A PAIR OR CHARACTERS THAT FORM AN ADDRESS OR DATA WORD

WRDIN:	SETZ	4,		;CLEAR CHECKSUM ENTRY STORAGE
	PUSHJ	P,CHRIN		;GET A CHARACTER
	LSH	6		;SHIFT DATA
	MOVEM	1
	TRNE	20000		;SKIP IF CHANNEL 8 IS ZERO
	JRST	CH8
	PUSHJ	P,CHRIN		;GET SECOND CHARACTER
	TRNE	300		;SKIP IF CHANNELS 7 & 8 ARE ZERO
	JRST	BADCHR		;BAD CHARACTER
	ORM	1		;MERGE THE TWO CHARACTERS
	POPJ	P,

CH8:	TRNE	7700		;SKIP IF CHANNELS 1 TO 6 ARE ZERO
	JRST	BADCHR		;BAD CHARACTER
	TRNN	10000		;SKIP IF CHANNEL 7 IS NOT ZERO
	POPJ	P,		;LEADER OR TRAILER
	JRST	WRDIN		;FIELD SET 0, IGNORE IT

;ROUTINE TO LOAD A8 FILES

MCA8:	SETZM	CHECK		;CLEAR THIS
	SETSTS	0		;CHANGE TO MODE 0
	MOVSI	(POINT 7,,)
	HLLM	BUFP
LDA8WC:	PUSHJ	P,WCREAD	;GET WORD COUNT IN WC
	JUMPE	P1,SETUP2	;DONE IF ZERO
	MOVE	WC,P1
	PUSHJ	P,WDREAD	;GET DATA WORD
	PUSH	P,P2
	IDIVI	P1,3
	ADDI	P1,MEM8
	MOVEM	P1,PNTR
	IMULI	P2,^D12
	MOVEI	P1,^D36
	SUB	P1,P2
	LSH	P1,^D12
	IORI	P1,^D12_6
	HRLM	P1,PNTR		;FORM BYTE PNTR
	POP	P,P2		;RESTORE
LDA8D:	PUSHJ	P,WDREAD	;GET WORD
	IDPB	P1,PNTR		;STASH WORD
	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,CHECK	;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
;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
	AOS	0(P)
	POPJ	P,

;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	CHECK		;INIT CHECKSUM
				;NOW GET DATA WORD
WDREAD:	PUSHJ	P,GET2W		;GET 12 BIT NUMBER
	ADDM	P1,CHECK	;ADD TO CHECKSUM
	CAIE	P2,","		;GRNTEE COMMA TERMINATOR
	ERROR	<File not in correct A8 format>
	POPJ	P,		;RETURN (ANSWER IN P1)
;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
;ROUTINE TO GET NEXT CHAR FROM FILE

GETC:	SOSG	BUFC
	PUSHJ	P,GETBYI
	ILDB	P1,BUFP
	POPJ	P,

GETBYI:	IN
	 POPJ P,
	STATZ	740000
	 ERROR	<INPUT FILE READ ERROR>
	STATZ	20000
	 ERROR <UNEXPECTED EOF>
	POPJ P,
NOLEAD:	OUTSTR	.+2
	EXIT
	ASCIZ /
?FIRST NON-ZERO CHARACTER READ FROM PAPER TAPE WAS NOT THE
EXPECTED LEADER CODE.
/

BADCHR:	OUTSTR	.+2
	EXIT
	ASCIZ /
?UNEXPECTED CHARACTER READ FROM PAPER TAPE.
/

BADCHK:	OUTSTR	.+2
	EXIT
	ASCIZ /
?CHECKSUMS DO NOT AGREE.
/


BADLOD:	OUTSTR	.+2
	EXIT
	ASCIZ	/
?BOOTM OVERLAPS MEM8 - SEE BOOTM LISTING.
/
;WRITE THE OUTPUT FILE BOOTM.RDI

OTBUF:	INIT	10		;INIT DISK FOR IMAGE MODE
	SIXBIT	/OUT/		;CALL DEVICE OUT
	XWD	BUF,0		;SPECIFY OUTPUT BUFFER
	  JRST	[OUTSTR INTERO
		 EXIT 1,
		 JRST OTBUF]
	ENTER	ONAME		;ENTER READ-IN FILE
	  JRST	ENTRER		;ENTER ERROR
	OUTPUT			;SET UP OUTPUT BUFFER
IFN DX20,<
	MOVSI	10,(JFCL)
	EXCH	10,SET20	;CAUSE READIN STUFF DOESNT TALK TO RH20
>
	MOVNI	1,READIN-<LOCATE-CONIX+2>;ZERO WORDS
	MOVEI	2,CONIX		;ADR OF FIRST WORD
	MOVEI	3,EBTM##	;END OF BOOTM
	SUBI	3,MEM8		;LENGTH OF STUFF
	IDIVI	3,<200-20>
	AOS	3		;PLUS ONE
	MOVEM	3,RECDS		;SAVE IN CORE IMAGE
	ADDI	3,1		;PLUS INITIAL RECORD
OUTREC:	ADDM	1,BUFC		;DECREMENT COUNTER BY C(AC1)
	CAMN	3,RECDS		;CHECK IF FIRST RECORD
	MOVEI	2,MEM8		;AFTER INITIAL, SET IN START ADDRESS
	SETZ			;CLEAR AC0
	IDPB	BUFP		;STORE ZERO WORD
	AOJL	1,.-1		;COUNT THE WORDS
OUTW1:	MOVE	(2)		;GET WORD
	IDPB	BUFP		;STORE WORD IN BUFFER
	ADDI	2,1		;INCREMENT ADDRESS
	SOSLE	BUFC		;DECREMENT COUNTER
	JRST	OUTW1		;WRITE ALL WORDS
	OUT			;WRITE THE BUFFER
	  JRST	OUTW2		;NO ERRORS
	OUTSTR	OUTERR
	EXIT

OUTW2:	MOVNI	1,20		;20 ZERO WORDS IN EACH BUFFER
	SOJG	3,OUTREC	;COUNT RECORDS
	CLOSE
IFN DX20,<
	MOVEM	10,SET20
	HLLZS	DX2NAM+1
	SETZM	DX2NAM+2	;RESET LOOKUP FIELDS
>
	HLLZS	FNAME+1
	SETZM	FNAME+2
	HLLZS	ONAME+1
	SETZM	ONAME+2		;RESET FIELDS SO BOOTM CHECKSUM NOT AFFECTED
	SETZM	ONAME+3
	MOVEI	START		;SET UP NEW START ADDRS
	HRRM	.JBSA##
	RESET			;RESET .JBFF
	OUTSTR	[ASCIZ \TYPE ".SAVE BOOTM" FOR 1080/TU70 BOOTSTRAP.
\]
	EXIT
FILL:	BYTE (12) 7402, 7402, 7402	;HALT INSTRUCTIONS
BUF:	0
BUFP:	0				;BUFFER BYTE POINTER
BUFC:	0				;BUFFER COUNTER
FNAME:	SIXBIT	/DXMPA/			;MICRO-CODE FILE NAME
	SIXBIT	/A8/			;A8ARY FILE
	0
	0
PNTR:	0				;POINTER TO 8A CORE IMAGE
NUMSAV:	0
A8FLG:	0
DCSAV:	0
CHECK:	0				;CHECK SUM
ONAME:	SIXBIT	/BOOTM/			;OUTPUT FILE NAME
	SIXBIT	/RDI/			;RDI EXTENSION
	0
	0

INTERI:	OUTSTR	.+2
	EXIT
	ASCIZ	/
?INIT ERROR FOR INPUT FROM DXMPA/

NOMICR:	OUTSTR	.+2
	EXIT
	ASCIZ	/
?LOOKUP ERROR FOR INPUT FILE DXMPA/

INTERO:	ASCIZ	/
%ASSIGN LOGICAL DEVICE "OUT" AND TYPE CONTINUE.
/
ENTRER:	OUTSTR	.+2
	EXIT
	ASCIZ	/
?ENTER ERROR FOR BOOTM.RDI/

OUTERR:	ASCIZ	/
?OUTPUT ERROR FOR BOOTM.RDI/
	SUBTTL	DX20 PARAMETERS

;RH20 CONI/CONO BITS

;CONI (RH)

CI.BPE==1B18			;DATA BUS PARITY ERROR
CI.EXC==1B19			;EXCEPTION
CI.LWE==1B20			;LONG WORD COUNT ERROR
CI.SWE==1B21			;SHORT WORD  COUNT ERROR
CI.MBE==1B22			;MBOX ERROR
CI.DRE==1B23			;DRIVE RESPONSE ERROR
CI.RAE==1B24			;REGISTER ACCESS ERROR
CI.MBH==1B25			;MBOX HALTED
CI.OVR==1B26			;DATA OVERRUN
CI.MEN==1B27			;MASSBUS ENABLE
CI.ATN==1B28			;DRIVE ATTENTION
CI.2RF==1B29			;SECONDARY COMMAND REGISTER FULL
CI.ATE==1B30			;ATTENTION EBABLE
CI.1RF==1B31			;PRIMARY COMMAND REGISTER FULL
CI.DON==1B32			;CHANNEL DONE
CI.PIA==7			;PRIORITY ASSIGNMENT
CI.ERR==555000			;BITS THAT CAUSE ERRORS

;CONO

CO.RAE==1B24			;CLEAR REGISTER ACCESS ERROR
CO.RST==1B25			;CONTROLLER RESET
CO.XFR==1B26			;CLEAR TRANSFER ERROR
CO.MEN==1B27			;MASSBUS ENABLE
CO.RCL==1B28			;RESET MBOX COMMAND LIST POINTER
CO.DEL==1B29			;DELETE SECONDARY COMMAN
CO.ATE==1B30			;ENABLE ATTENTION INTERRUPTS
CO.STP==1B31			;STOP CURRENT COMMAND
CO.DON==1B32			;CLEAR DONE
CO.CLR==005010			;CLEAR BITS THAT CAUSE INTERRUPTS
;DX20 REGISTERS
DXCTR==0			;CONTROL REGISTER
DXSTR==1			;STATUS REGISTER
DXERR==2			;ERROR REGISTER
DXMTR==3			;MAINTENNANCE REGISTER
DXASR==4			;ATTENTION SUMMARY REGISTER
DXDTR==6			;DRIVE TYPE AND HARDWARE VERSION REG.
DXDR0==30			;DIAGNOSTIC REGISTER
				; IR FOR MICROPROCESSOR
DXDR1==31			;DIAGNOSTIC REGISTER
DXDR5==35			;DIAGNOSTIC REGISTER 5
DXDR7==37			;DIAGNOSTIC REGISTER 7

;DXMTR BITS & FIELDS
MP.SC==1B31			;SINGLE CYCLE
WR.EP==1B32			;WRITE SINGLE PARITY
MP.STA==1B33			;MP START
DX.RST==1B34			;BIT FOR RESET DX20

;DXDR1 BITS & FIELDS
IR.EN==1B20			;ENABLE IR LOAD FROM MICRO-STORE
MS.EN==1B21			;ENABLE MICRO-STORE LOAD FROM IR
PC.EN==1B22			;ALLOW LOAD/WRITE OF PC
PC.AI==1B23			;ENABLE PC AUTO-INCREMENTING

DX.PC=7777B35			;MASK FOR THE PC

;DXDR7 BITS & FIELDS
IR.PER==1B22			;IR PARITY ERROR

;COMMON DATAO BITS & FIELDS
DO.RS:	POINT	6,T2,5		;REGISTER SELECT FIELD
DO.LR==1B6			;LOAD REGISTER ENABLE
DO.DRE==1B9			;DISABLE RAE STOP

;COMMON DATAI BITS
DI.CPE==1B8			;CONTROL BUS PARITY ERROR
DI.TRA==1B10			;TRA (MASSBUS SIGNAL)

;MASS BUS DEVICE TYPES
TY.RP4==020			;RP04 DRIVE TYPE
TY.RS4==001			;RS04 DRIVE TYPE
TY.TML==010			;LOWEST TM02 TYPE
TY.TMH==017			;HIGHEST TM02 TYPE
TY.DX2==60			;DX20 DRIVE TYPE***(=050060)
				; VERSION # IS 100****(100017)

;FIELD DEFINITION FOR DX20 REGISTERS
DT.TYP:	POINT	9,T1,35		;TYPE FIELD IN DRIVE-TYPE REGISTER

	SUBTTL	DX20 USER-MODE SETUP
;HERE TO SET UP THE DX20 MICROCODE
READ20:	PUSHJ	P,GETLIN
	JUMPE	T1,RD2END
	MOVNS	T1
	HRLZS	T1
	SKIPN	CFLAG
	JRST	DRAM
	ROT	T2,-1
	TLZN	T2,400000
	TLOA	T2,442200
	TLO	T2,222200
	ADDI	T2,CRDAT
	JRST	STOR20
DRAM:	IDIVI	T2,4
	HLL	T2,[441000,,
		    341000,,
		    241000,,
		    141000,,](T3)
	ADDI	T2,DRDAT

STOR20:	MOVE	T3,LINDAT(T1)
	IDPB	T3,T2
	AOBJN	T1,STOR20
	JRST	READ20
RD2END:	SKIPE	T2
	MOVEM	T2,A.STRT
	POPJ	P,
;GETLIN - READS IN A LINE OF DATA WORDS TO BE LOADED INTO CRAM OR
; WORKING MEMORY
;
;	CALL GETLIN
;
; RETURN+1: ALWAYS
; LINDAT IS THE TALBE WHICH HAS THE CONVERTED DATA WORDS
; T1/ WORD COUNT OF DATA WORDS IN THE TABLE
; T2/ LOAD ADDR
; CFLAG PROPERLY SET, 1S=DATA WORDS FOR CRAM, 0= FOR WORKING MEMORY
; USES P1 AS PTR, P2 AS LOOP INDEX

GETLN0:	PUSHJ	P,GETC
	CAIE	P1,12
	JRST	GETLN0
GETLIN:	MOVE	T4,[LINWC,,LINWC+1]	;INITIALIZE WORK AREA
	SETZM	LINWC		;
	BLT	T4,CHKSUM
	MOVEI	T3,^D32*5	;MAXIMUN NUMBER OF CHAR.S
	SETZM	CFLAG#		;CFLAG=1S MEANS FOR CRAM
	PUSHJ	P,GETC
	CAIN	P1,";"		;IS IT COMMENT LINE?
	JRST	GETLN0		;YES, IGNORE IT
	CAIE	P1,"C"		;CRAM LOAD LINE?
	JRST	GTLNA		;NO, SEE IF WM LOAD LINE
	SETOM	CFLAG		;YES, SET FLAG
	JRST	GTLNB		;JUMP AROUND
GTLNA:	CAIE	P1,"W"		;WM LOAD LINE?
	ERROR	<1st character wrong in dataline>
GTLNB:	PUSHJ	P,GETC		;GET NEXT CHAR.
	CAIE	P1," "		;MUST BE BLANK
	ERROR	<2nd character wrong in dataline>
	PUSHJ	P,GTWRD		;GET NEXT WORD
	ERROR	<format error in dataline>
	MOVEM	T1,LINWC	;SAVE WORD COUNT FOR THE LINE
	MOVEM	T1,CHKSUM	;INITIALIZE CHECKSUM FOR THE LINE
	PUSHJ	P,GTWRD		;GET NEXT WORD
	ERROR	<format error in dataline>
	ADDM	T1,CHKSUM	;UPDATE CHKSUM
	DPB	T1,[POINT 16,LINWC,19]	;SAVE LOAD ADDR.
	MOVSI	P2,-^D32	;SETUP LOOP INDEX FOR SUBSEQUENT WORDS
				; LINDAT HOLDS AT MOST 32 WORDS
GETLI1:	PUSHJ	P,GTWRD		;GET NEXT WORD
	  JRST GETLI2		;LAST WORD, CHKSUM, READ IN T1
	ADDM	T1,CHKSUM	;UPDATE CHKSUM
	MOVEM	T1,LINDAT(P2)	;SAVE DATA WORD
	AOBJN	P2,GETLI1	;LOOP BACK
	ERROR	<too many words in dataline>
GETLI2:	MOVEM	T1,LINDAT(P2)	;SAVE EVEN CHKSUM
	ADD	T1,CHKSUM	;ADD CHKSUM INTO T1
	TRNE	T1,177777	;CHECKSUM SHOULD BE 0
	ERROR	<checksum error in dataline>
	LDB	T1,[POINT 16,LINWC,35]	;WC IN T1
	LDB	T2,[POINT 16,LINWC,19]	;LOAD ADDR. IN T2
	POPJ	P,		;NONSKIP RETURN

;GTWRD - GET A DATA WORD FROM DATLIN WHICH IS A CHAR. STRING
; CONVERT THE ASCIIZED DATA WORD INTO BINARY
;
;	CALL GTWRD
;
; RETURN+1: DATA WORD DELIMITED BY CR
; RETURN+2: DATA WORD DELIMITED BY ,
; T1/ CONVERTED DATA WORD
; USES P1 AS PTR

GTWRD:	SETZ	T1,		;T1 WILL HAVE RESULT DATA
GTWRD1:	PUSHJ	P,GETC
	CAIN	P1,","		;SKIP IF NOT COMMA
	JRST	CPOPJ1		;GOT THE DATA WORD
				;SKIP RETURN
	CAIN	P1,15		;SKIP IF NOT CR
	JRST	GTWRD1		;CR, THROW IT AWAY AND LOOK FOR LF
	CAIN	P1,12
	POPJ	P,		;RETURN, GOT LAST DATA WORD IN LINE
	LSH	T1,6		;MAKE ROOM
	CAIE	P1," "		;SKIP IF BLANK
	DPB	P1,[POINT 6,T1,35]	;PUT IN T1, UNASCIIZED THE BYTE
	JRST	GTWRD1		;GET NEXT CHAR.
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
;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		;...
	SUBTTL	DX20 EXEC-MODE STUFF
LOAD20:	0
	MOVEI	T4,540/4
LOAD2A:	DPB	T4,[POINT 7,RH2CNO,9]
	DPB	T4,[POINT 7,RH2DTO,9]
	DPB	T4,[POINT 7,RH2DTI,9]
	MOVEM	T4,DX2RH2##		;SAVE KONTROLLER FOR BOOTM
	MOVEI	T1,CO.MEN
	XCT	RH2CNO
	MOVEI	T3,DXDTR
	PUSHJ	P,RDREG
	ANDI	T1,777
	CAIN	T1,TY.DX2
	JRST	HAV20
	ADDI	T4,1
	CAIG	T4,574/4
	JRST	LOAD2A
	JRST	@LOAD20
HAV20:	MOVE	P1,[POINT 18,CRDAT]
	SETZ	P2,
LOADCR:	MOVE	T2,P2
	PUSHJ	P,PRECR		;SET UP PC FOR CRAM
	ILDB	T2,P1
	CAIN	P2,MAGICA
	MOVEI	T2,MAGICV
	MOVEI	T3,DXDR0	;SELECT IR
	PUSHJ	P,WTREG		;LOAD CRAM FROM IR
	CAIGE	P2,3777
	AOJA	P2,LOADCR
	PREWT	(DXDR1)		;SELCT PC
	TRO	T2,IR.EN+PC.EN	;PC=0, SET FLAGS
	PUSHJ	P,WTREG		;SET PC
	MOVEI	T3,DXDR0	;SELCT IR
	PUSHJ	P,RDREG		;READ IR FROM CRAM, PC=0
	MOVEM	T1,PC0SAV#	;SAVE LOC. 0
	MOVE	P1,[POINT 8,DRDAT]
	SETZ	P2,
LOADDR:	MOVE	T2,P2
	PUSHJ	P,PREWM		;SET UP MA TO LOAD DRAM
	ILDB	T1,P1
	TRO	T1,11400	;MAKE MICROINSTR. (MOVEI MEM MA+1)
	PUSHJ	P,XI		;EXECUTE MICROINSTR
	CAIGE	P2,1777
	AOJA	P2,LOADDR
	PUSHJ	P,POSWM
	JRST	@LOAD20
;PREWM - SETS UP THE LOAD ADDR. FOR WORKING MEMORY
; ALSO, SAVES LOC. 0 OF CRAM FOR MICROINSTR. EXECUTION
; T2/ LOAD ADDR.
;
;	CALL PREWM
;
; RETURN+1: ALWAYS

PREWM:	MOVEM	T2,WMADR#	;SAVE LOAD ADDR.
	MOVE	T1,WMADR	;GET LOAD ADDR.
	ANDI	T1,377		;MAX. ADDR. 256
	TRO	T1,1000		;MAKE MICROINTR. (MOVEI LOAD MA)
	PUSHJ	P,XI		;SET MA REGISTER
	MOVE	T1,WMADR	;GET LOAD ADDR. AGAIN
	LSH	T1,-^D8		;KEEP 2 MAEX BITS
	TRO	T1,400		;MAKE MICROINTR. (MOVEI LOAD MAEX)
	JRST	XI		;SET MAEX BITS AND RETURN


;POSWM - RESTORES LOC. 0 OF CRAM AFTER WORKING WITH WORKING MEMORY
;
;	CALL POSWM
;
; RETURN+1: ALWAYS

POSWM:	PREWT	(DXDR1)		;SELCT PC
	TRO	T2,PC.EN+MS.EN	;PC=0
	PUSHJ	P,WTREG		;SET PC
	MOVE	T2,PC0SAV	;GET C(LOC 0 OF CRAM)
	MOVEI	T3,DXDR0	;SELCT IR
	JRST	WTREG		;WRITE CRAM FROM IR
				; AND RETURN
;PRECR - SETS UP PC FOR LOADING OR VERIFYING CRAM
; T2/ LOAD ADDR.
;
;	CALL PRECR
;

PRECR:	ANDI	T2,7777		;MAKE SURE 12 BITS PC
	TRO	T2,MS.EN+PC.EN+PC.AI	;SET BITS
	MOVEI	T3,DXDR1	;SELCT PC
	JRST	WTREG		;WRITE PC AND RETURN

;XI - EXECUTE INSTR. IN T1
;
;	CALL XI
;
; RETURN+1: ALWAYS
; CHANGES T2,T3,&T4
; PRESERVES T1

XI:	PREWT	(DXMTR)		;SELCT DXMTR
	TRO	T2,MP.SC	;CLEAR START BIT & SET SINGLE CYCLE BIT
	PUSHJ	P,WTREG		;STOP MICROPROCESSOR
	PREWT	(DXDR1)		;CLR PC
	TRO	T2,PC.EN+MS.EN	; AND SET BITS
	PUSHJ	P,WTREG		;DO IT
	PREWT	(DXDR0)		;LOAD IR WITH INSTR.
	MOVE	T2,T1		; AND LOAD IT IN LOC. 0, ALSO
	PUSHJ	P,WTREG		;
	PREWT	(DXDR1)		;SELCT PC REG.
	TRO	T2,IR.EN+PC.AI	;SET IR.EN & PC.AI BIT
	PUSHJ	P,WTREG		;PC HAS 0
	PREWT	(DXMTR)		;READY TO EXECUTE
	TRO	T2,MP.SC+MP.STA	;SET SINGLE STEP & START BITS
	PUSHJ	P,WTREG		;GO START MICROCONTROLLER
	PREWT	(DXMTR)		;CLEAR START BIT
	TRO	T2,MP.SC	;LEAVE SINGLE CYCLE BIT ON
	JRST	WTREG		;DO IT AND RETURN
SUBTTL MODULE FOR RH20 HANDLING ROUTINES

;DEVXCT - EXECUTES IOT(INPUT/OUTPUT TRANSFER INSTR.) FOUND AT CALL+1
; T3/ DEVICE CODE
;
;	CALL DEVXCT
; RETURN+1: ALWAYS

DEVXCT:	MOVE	T4,@(P)		;FETCH IOT
	IOR	T4,T3		;GET DEVICE CODE
	XCT	T4		;EXECUTE IT
CPOPJ1:	AOS	(P)		;SKIP OVER IOT INSTR.
	POPJ	P,

;WTREG - WRITES INTERNAL OR EXTERNAL REGISTER
; T3/ REGISTER SELECT NUMBER
; T2/ BIT 18-35 ARE SPECIFIED
;  
;	CALL WTREG
; RETURN+1:ALWAYS	
; DESTROYS T2

WTREG:	DPB	T3,DO.RS	;SET RS FIELD BIT 0-5 IN T2
	TLO	T2,(DO.LR)	;SET LR LOAD	
	JUMPL	T2,WTREG1	;JUMP IF INTERNAL REG.
	TLO	T2,<(DO.DRE)>	;SET DRAES BIT & DRIVE NUMBER
				;DO.EP BIT 0 ALREADY
WTREG1:	XCT	RH2DTO		;WRITE IT
	POPJ	P,		;JUST RETURN

;RDREG - READS INTERNAL OR EXTERNAL REGISTER
; T3/ REGISTER NUMBER
; 
;	CALL RDREG
;
; RETURN+1: ALWAYS
; T1 GETS VALUE

RDREG:	SETZB	T2,T1		;CLEAR THEM
	DPB	T3,DO.RS	;SET REGISTER SELECT
				; DO.LR IS 0 ALREADY
	JUMPL	T2,RDREG1	;JUMP ,IF INTERNAL
	TLO	T2,<(DO.DRE)>	;SET DRAES BIT & DRIVE NUMBER
				;DO.EP BIT 0 ALREADY
RDREG1:	XCT	RH2DTO		;SET PREPARATION REGISTER
	XCT	RH2DTI		;READ IN T1
	ANDI	T1,177777	;CLEAR OUT GARBAGE
	POPJ	P,		;RETURN
DX2NAM:	SIXBIT	/DXMCA/
	SIXBIT	/ADX/
	0
	0
	LIT
	VAR

RH2CNO:	CONO	(T1)
RH2DTO:	DATAO	T2
RH2DTI:	DATAI	T1
LINWC:	BLOCK	1		;LOAD ADDR,,WORD COUNT OF DATA LINE
LINDAT:	BLOCK	^D32		;SO MANY DATA WORDS
CHKSUM:	BLOCK	1		;CHECKSUM FOR DATALINE FROM FILE
A.STRT:	BLOCK	1
INHDR:	BLOCK	3
CRDAT:	BLOCK	2000		;ROOM FOR 2K*16 BITS - CRAM
DRDAT:	BLOCK	400		;ROOM FOR 1K*8 BITS - DRAM

MEM8:	BLOCK	10000/3			;PDP-8A MEMORY CORE IMAGE
MEM8E:	0

	END	BEGIN