Google
 

Trailing-Edge - PDP-10 Archives - BB-BT99T-BB_1990 - 10,7/mon/monbts.mac
There are 10 other files named monbts.mac in the archive. Click here to see a list.
TITLE	MONBTS - MONITOR/BOOTSTRAP INTERFACE		V103
SUBTTL	D. MASTROVITO /DPM				17-APR-90

	SEARCH	F,S,BTSPRM

	SALL			;FOR CLEAN LISTINGS
	.DIRECTIVE FLBLST	;FOR CLEANER LISTINGS

	$RELOC
	$HIGH

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
;  OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1979,1980,1982,1984,1986,1988,1990.
;ALL RIGHTS RESERVED.

.CPYRT<1979,1990>

XP VMNBTS,103	;VERSION NUMBER FOR LOADER STORAGE MAP


MONBTS::!ENTRY	MONBTS		;LOAD IF SPECIFIED BY COMMON
; MICROCODE OFFSETS IN THE BOOTSTRAP VECTOR
DEFINE	X	(L,PFX,NAM,EXT,TXT,MOD,SIZ),<
	IFNB <PFX>,<.BT'PFX==:ZZ>
	ZZ==ZZ+2
>

	ZZ==0
	UCODES
	PURGE	ZZ

SUBTTL	BOOT FILESPEC ROUTINES


SETBFL::MOVSI	T1,-BOOTLN	;-LENGTH OF TRANSLATION TABLE
SETBF1:	HRRZ	T2,BOOTBL(T1)	;GET MONITOR ADDRESS
	MOVE	T2,(T2)		;FETCH WORD OF FILESPEC
	HLRZ	T3,BOOTBL(T1)	;GET AN OFFSET
	ADD	T3,BOOTVA	;INDEX INTO BOOT VECTOR
	MOVEM	T2,(T3)		;SAVE WORD
	AOBJN	T1,SETBF1	;LOOP
	POPJ	P,		;RETURN


BOOTBL:	.BTDEV,,STRMON##	;DEVICE
	.BTFIL,,FILMON##	;FILE NAME
	.BTEXT,,EXTMON##	;EXTENSION
	.BTPTH+0,,PPNMON##	;PPN
	.BTPTH+1,,SFDMON##+0	;SFD #1
	.BTPTH+2,,SFDMON##+1	;SFD #2
	.BTPTH+3,,SFDMON##+2	;SFD #3
	.BTPTH+4,,SFDMON##+3	;SFD #4
	.BTPTH+5,,SFDMON##+4	;SFD #5
BOOTLN==.-BOOTBL		;LENGTH OF TABLE
SUBTTL	SYSTEM SEARCH LIST ROUTINES


SSLBLD::SE1ENT			;ENTER SECTION ONE
	MOVEI	T1,.BTSSL	;OFFSET
	PUSHJ	P,BTDATA	;GET BOOTSTRAP VECTOR ADDRESS
	  POPJ	P,		;SSL NOT AVAILABLE
	PUSHJ	P,ZERBLK	;CLEAR THE SSL
	MOVE	T4,SYSSRC##	;GET BYTE POINTER TO SSL
SSLBL1:	ILDB	T3,T4		;GET FS NUMBER AND BITS
	ANDI	T3,FS.NMK	;KEEP ONLY THE FS NUMBER
	CAIN	T3,.FSFNC	;FENCE?
	JRST	SSLBL1		;YES
	CAIN	T3,.FSEND	;END?
	JRST	CPOPJ1##	;YES
	MOVE	T3,TABSTR##(T3)	;GET TABSTR ENTRY
	MOVE	T3,STRNAM##(T3)	;GET STRUCTURE NAME
	MOVEM	T3,(T2)		;SAVE IN PRESERVED SSL
	AOS	T2		;ADVANCE POINTER
	AOBJN	T1,SSLBL1	;LOOP
	JRST	CPOPJ1##	;AND RETURN
SUBTTL	ACTIVE SWAPPING LIST ROUTINES


ASLBLD::SE1ENT			;ENTER SECTION ONE
	MOVEI	T1,.BTASL	;OFFSET
	PUSHJ	P,BTDATA	;GET BOOTSTRAP VECTOR ADDRESS
	  POPJ	P,		;ASL NOT AVAILABLE
	PUSHJ	P,ZERBLK	;CLEAR THE ASL
	MOVSI	T4,MSWPMX##	;AOBJN POINTER TO SWPTAB
ASLBL1:	HRRZ	T3,SWPTAB##(T4)	;GET ADDR OF FIRST UNIT DATA BLOCK IN ASL
	JUMPE	T3,ASLBL2	;MISSING ENTRY?
	MOVE	T3,UNIHID##(T3)	;GET UNIT-ID
	MOVEM	T3,(T2)		;SAVE IN PRESERVED ASL
	AOS	T2		;ADVANCE POINTER
	AOBJP	T1,CPOPJ1##	;DONE IF END OF TABLE
ASLBL2:	AOBJN	T4,ASLBL1	;LOOP THROUGH TABLE
	JRST	CPOPJ1##	;RETURN
SUBTTL	SYSTEM DUMP LIST ROUTINES


SDLBLD::SE1ENT			;ENTER SECTION ONE
	MOVEI	T1,.BTSDL	;OFFSET
	PUSHJ	P,BTDATA	;GET BOOTSTRAP VECTOR ADDRESS
	  POPJ	P,		;SDL NOT AVAILABLE
	PUSHJ	P,SAVE1##	;PRESERVE AN AC
	HLRE	P1,T1		;GET -VE LENGTH
	MOVMS	P1		;FORM POSITIVE LENGTH
	PUSHJ	P,ZERBLK	;CLEAR THE SDL
	MOVEI	T4,DIFSTR##	;POINT TO PREDECESSOR OF FIRST STR IN SYSTEM
SDLBL1:	HLRZ	T4,STRSYS##(T4)	;STEP TO NEXT STR DATA BLOCK
	JUMPE	T4,CPOPJ1##	;DONE AT END
	SKIPL	T3,STRSDL##(T4)	;GET POSITION IN SDL
	CAIL	T3,(P1)		;AND RANGE CHECK IT
	JRST	SDLBL1		;SKIP IT IF NOT IN SDL OR OUT OF RANGE
	ADD	T3,T2		;POINT TO STORAGE WORD
	SKIPE	T1,STRNAM##(T4)	;GET STR'S NAME
	MOVEM	T1,(T3)		;SAVE IN OUR LIST
	JRST	SDLBL1		;LOOP OVER ALL STRS IN SYSTEM
ZERBLK:	PUSH	P,T1		;SAVE AOBJN POINTER
	PUSH	P,T2		;SAVE ADDRESS
	HLRES	T1		;GET -LENGTH
	SETCA	T1,		;MAKE POSITIVE
	SETZM	(T2)		;CLEAR FIRST WORD
IFE FTXMON,<
	ADDI	T1,0(T2)	;COMPUTE END OF BLOCK
	HRLI	T2,1(T2)	;MAKE A BACKWARDS BLT POINTER
	MOVSS	T2		;FIX IT
	BLT	T2,-1(T1)	;CLEAR BLOCK
> ;END IFE FTXMON

IFN FTXMON,<
	MOVEI	T3,1(T2)	;GET SECTION RELATIVE ADDRESS + 1
	HLL	T3,T2		;INCLUDE THE SECTION NUMBER
	EXTEND	T1,[XBLT]	;CLEAR BLOCK
> ;END IFN FTXMON

	POP	P,T2		;RESTORE ADDRESS
	POP	P,T1		;RESTORE AOBJN POINTER
	POPJ	P,		;RETURN
	SUBTTL	RELOAD MONITOR

RLDMON::
IFN FTKL10,<PUSHJ P,ENTSPC##>	;ENTER SECONDARY PROTOCOL
IFN FTKS10,<PUSHJ P,DISKAL##>	;DISABLE KEEP ALIVE FUNCTION
IFN FTXMON,<XJRST [MCSEC1+.+1]>	;ENTER SECTION ONE
	MOVEI	T1,.BTDAT	;OFFSET TO DATA STORAGE POINTER
	PUSHJ	P,BTDATA	;GET ADDRESS OF DATA STORAGE IN BOOTSTRAP
	  JRST	NOBOOT		;NOT AVAILABLE
	HLRE	T3,T1		;GET -LENGTH IN WORDS
	SKIPN	MBTCOM##	;FORGET IT SUSPENDED
	CAMLE	T3,[-BTXLEN##]	;ENOUGH WORDS FOR BOOTXT?
	JRST	BTBOOT		;NO--JUST RESTART BOOTSTRAP
	MOVE	T1,DEBUGF##	;GET DEBUGGING FLAGS
	TLNE	T1,(DF.RIP)	;IS THIS A FORCED RELOAD?
	JRST	RLDMN1		;YES. DON'T CHECK KSYS OR UPTIME
	TLNN	T1,(DF.NAR)	;ALLOW AUTO-RELOAD?
	SKIPGE	SYSKTM##	;KSYS?
	JRST	BTBOOT		;YES, DON'T TAKE A DUMP NOR AUTO RELOAD
	SKIPLE	ARFLAG##	;SKIP IF .LE. 5 MIN UPTIME
	JRST	RLDMN1		;NO, CONTINUE ONWARD
	SKIPE	[ATODMP##]	;IS DUMPING DESIRED IF UPTIME .LT. 5 MINS?
	PUSHJ	P,BTDUMP	;DO THE DUMP
	  JFCL			;I TRIED
	JRST	BTBOOT		;DON'T DO A LOAD
RLDMN1:
IFE FTXMON,<
	MOVEI	T1,BTXLEN##(T2)	;COMPUTE END OF BLT
	HRLI	T2,BOOTXT##	;MAKE A BLT POINTER
	BLT	T2,-1(T1)	;COPY BOOTXT INTO BOOTSTRAP DATA AREA
> ;END IFE FTXMON
IFN FTXMON,<
	MOVEI	T1,BTXLEN##	;NUMBER OF WORDS
	MOVE	T3,T2		;DESTINATION
	XMOVEI	T2,BOOTXT##	;SOURCE
	EXTEND	T1,[XBLT]	;COPY BOOTXT INTO BOOTSTRAP DATA AREA
> ;END IFE FTXMON
	JRST	BTLOAD
NOBOOT:	MOVEI	T1,CTYWAT##	;CTY TYPEOUT ROUTINE
	MOVEM	T1,.CPTOA##	;SET FOR SCNSER
	MOVEI	T1,RLDTXT	;POINT TO RELOAD TEXT
	PUSHJ	P,CONMES##	;TYPE ON THE CTY
	PJRST	DOLOAD##	;GO FORCE A RELOAD (MAYBE)


RLDTXT:	ASCIZ	/

?Bootstrap not available
/
SUBTTL	SYSTEM SLEEP AND PAGE REPLACEMENT

SLPDMP::SE1ENT			;YES, GET INTO RIGHT SECTION
	PUSHJ	P,BTAVAL	;MAKE SURE WE HAVE A BOOTSTRAP
	  POPJ	P,		;PROPAGATE LOSSAGE
	MOVE	T1,BOOTPA	;GET START OF BOOTSTRAP
	LSH	T1,W2PLSH	;MAKE A PAGE NUMBER
	HLL	T1,.BTSIZ(T2)	;FORM XWD -SIZE,START (IN PAGES)
	MOVEM	T1,MBTCOM##	;SAVE FOR /REBOOT
	PJRST	BTSSLP		;GO DO IT

PAGRPL::SE1ENT			;BOOTSTRAP IS IN NZS SPACE
	PUSHJ	P,SAVE2##	;PRESERVE SOME ACS
	DMOVE	P1,T1		;SAVE VIRTUAL PAGE & NEW PHYSICAL ADDRESS
	MOVEI	T1,.BTDAT	;OFFSET TO POINT TO SUBROUTINE DATA
	PUSHJ	P,BTDATA	;GET 2-WORD POINTER TO ARGUMENT STORAGE
	  POPJ	P,		;BOOTSTRAP NOT AVAILABLE
	CAMLE	T1,[XWD -2,0]	;BETTER BE AT LEAST TWO WORDS OF SPACE
	POPJ	P,		;NO SUCH LUCK
	DMOVEM	P1,(T2)		;YES, SAVE OUR ARGUMENTS
	PJRST	BTREPL		;AND GO REPLACE THE PAGE
	SUBTTL	DISPATCH TO BOOTSTRAP

BTDISP::!			;DISPATCH TABLE
BTBOOT::PUSHJ	P,BTCALL	;RESTART BOOT (DO NOT LOAD)
BTDUMP::PUSHJ	P,BTCALL	;DUMP CRASH
BTLOAD::PUSHJ	P,BTCALL	;LOAD (READ BOOTXT)
BTSSLP::PUSHJ	P,BTCALL	;SYSTEM SLEEP DUMP
BTREPL::PUSHJ	P,BTCALL	;PAGE REPLACE

BTCALL:	SKIPN	BOOTVA		;IS BOOT MAPPED?
	JRST	TPOPJ##		;NO
	DMOVEM	T1,BOOTXX	;SAVE T1 AND T2
	SKIPE	DINITF##	;SYSTEM INITIALIZATION?
	JRST	BTCAL1		;YES--MEMSIZ MAY NOT BE SET YET
	PUSH	P,T3		;AND T3
	MOVE	T2,BOOTVA	;GET VIRTUAL ADDRESS OF BOOT
	MOVE	T1,MEMSIZ##	;GET MAXIMUM MEMORY ADDRESS
	LSH	T1,W2PLSH	;MAKE NUMBER OF PAGES
	MOVE	T3,.BTMSZ(T2)	;GET OFFSET TO BOOT'S MEMSIZE IN P
	ADD	T3,T2		;MAKE ADDRESS
	MOVEM	T1,(T3)		;STORE FOR BOOT
	MOVEI	T1,.BTNXM	;POINTER OFFSET FOR BOOT'S NXMTAB
	PUSHJ	P,BTDATA	;FETCH DATA POINTER
	  JFCL			;CAN'T FAIL
	HLRES	T1		;GET -VE LENGTH
	MOVNS	T1		;MAKE +VE
	CAILE	T1,NXMTBL##	;BIGGER THAN THE ONE IN COMMON?
	MOVEI	T1,NXMTBL##	;YES, USE OUR LENGTH
IFN FTXMON,<
	MOVE	T3,T2		;COPY DESTINATION ADDRESS
	XMOVEI	T2,NXMTAB##	;SOURCE ADDRESS
	EXTEND	T1,[XBLT]	;COPY THE DATA
>
IFE FTXMON,<
	ADD	T1,T2		;GET END ADDRESS+1
	HRLI	T2,NXMTAB##	;MAKE XFER POINTER
	BLT	T2,-1(T1)	;COPY DATA
>
	POP	P,T3		;RESTORE AC
BTCAL1:	POP	P,T1		;GET CALLER'S PC
	SUBI	T1,BTDISP	;COMPUTE FUNCTION CODE
	MOVE	T2,BOOTVA	;GET VIRTUAL ADDRESS OF BOOT
	HRRZM	T1,.BTFNC(T2)	;SAVE FUNCTION CODE
	MOVE	T1,.CPCPN##	;GET CPU NUMBER BOOT WAS CALLED ON
	MOVEM	T1,.BTCPN(T2)	;SAVE FOR KL CACHE STRATEGY STUFF
	DMOVEM	16,.BTACS(T2)	;SAVE ACS (BOOT NEEDS ACS TO RELOCATE SELF)
	MOVE	T1,.BTDSP(T2)	;GET OFFSET TO SUBR DISPATCH FROM VECTOR BASE
	ADD	T1,T2		;INDEX INTO BOOT
	MOVEM	T1,.BTXPC+3(T2)	;SAVE
	XMOVEI	T1,.BTXPC(T2)	;ADDRESS OF XPCW ENTRY POINT
	EXCH	T1,BOOTXX	;SAVE ADDRESS, RESTORE T1
	MOVE	T2,BOOTXX+1	;RESTORE T2
	XPCW	@BOOTXX		;CALL BOOT AS A SUBROUTINE
	  SKIPA			;FAILURE RETURN
	AOS	(P)		;SUCESSFUL RETURN
	PUSH	P,T1		;SAVE T1
	PUSH	P,T2		;SAVE T2
	MOVE	T2,BOOTVA	;GET VIRTUAL ADDRESS OF BOOT
	DMOVN	T1,.BTRTM(T2)	;AND -VE TIME INTERVAL DOUBLE-WORD
	DADD	T1,.CPRTM##	;ADJUST RDTIME FROM LAST INTERRUPT
	DMOVEM	T1,.CPRTM##	;UPDATE VALUE
	MOVE	T2,BOOTVA	;GET VIRTUAL ADDRESS OF BOOT
	DMOVE	16,.BTACS(T2)	;RESTORE ACS 16 AND 17
	JRST	TTPOPJ##	;RETURN
	SUBTTL	SUBROUTINES

; ROUTINE TO VALIDATE IN-CORE BOOTSTRAP AND RETURN ITS VECTOR ADDRESS
; CALL:	PUSHJ	P,BTAVAL
;	  <NON-SKIP>		;NOT AVAILABLE
;	<SKIP>			;AVAILABLE, T2 = VECTOR ADDRESS

	$CSENT	(BTAVAL::)
	SKIPN	T2,BOOTVA	;GET MONITOR VIRTUAL ADDRESS OF BOOT ORIGIN
	POPJ	P,		;NOT THERE
	PUSH	P,T1		;SAVE T1
	MAP	T1,(T2)		;TRANSLATE TO PHYSICAL
	AND	T1,PHYMAX	;KEEP ONLY THE ADDRESS
	SKIPE	MOFLPG##	;MONITOR MEMORY BEING SET OFFLINE?
	MOVEM	T1,BOOTPA	;YES, BOOT MAY HAVE MOVED, TRUST BOOTVA HERE
	CAME	T1,BOOTPA	;PHYSICAL ADDRESSES MUST MATCH
	JRST	TPOPJ##		;NO GOOD
	MOVE	T1,.BTNAM(T2)	;GET NAME
	CAMN	T1,['BOOT  ']	;MUST BE BOOT
	SKIPL	.BTSIZ(T2)	;AND MUST HAVE A -PAGE COUNT IN LH OF SIZE WORD
	JRST	TPOPJ##		;NO GOOD
	JRST	TPOPJ1##	;LOOKS LIKE A GOOD BOOTSTRAP

PHYMAX:
IFN FTKL10,<LG.EPT*PAGSIZ+PG.BDY> ;HIGHEST PHYSICAL ADDRESS
IFN FTKS10,<SG.EPT*PAGSIZ+PG.BDY> ;HIGHEST PHYSICAL ADDRESS
; ROUTINE TO RETURN A MONITOR VIRTUAL ADDRESS WITHIN BOOT
; CALL:	MOVE	T1, .BTXXX OFFSET
;	PUSHJ	P,BTADDR
;	  <NON-SKIP>		;BOOT NOT LOADED
;	<SKIP>			;T1 = UNCHANGED, T2 = 30-BIT ADDRESS

BTADDR::PUSHJ	P,BTAVAL	;GET BOOTSTRAP VECTOR ADDRESS
	  POPJ	P,		;NOT LOADED
	ADDI	T2,(T1)		;OFFSET TO DESIRED LOCATION
	JRST	CPOPJ1##	;RETURN


; ROUTINE TO RETURN A POINTER TO DATA STORAGE WITHIN BOOT
; CALL:	MOVE	T1, .BTXXX OFFSET
;	PUSHJ	P,BTDATA
;	  <NON-SKIP>		;BOOT LOAD LOADED
;	<SKIP>			; T1 = -LENGTH,,0 AND T2 = 30-BIT ADDRESS

BTDATA::PUSHJ	P,BTAVAL	;GET BOOTSTRAP VECTOR ADDRESS
	  POPJ	P,		;NOT AVAILABLE
	ADDI	T2,(T1)		;OFFSET TO DESIRED LOCATION
	MOVE	T1,(T2)		;GET -LENGTH,,OFFSET
	HRRZ	T2,T1		;ISOLATE OFFSET
	HLLZS	T1		;T1 HAS -LENGTH
	ADD	T2,BOOTVA	;T2 GETS THE ADDRESS
	JRST	CPOPJ1##	;RETURN


; ROUTINE TO ENABLE/DISABLE MICROCODE LOADING
; CALL:	MOVE	T1, ADDRESS OF UCODE LOADER BLOCK
;	MOVE	T2, ARGUMENT	;DISABLE = 0, ENABLE = 1
;	PUSHJ	P,BTUEDL
;	  <NON-SKIP>		;NO MICROCODE AVAILABLE
;	<SKIP>			;ENABLE/DISABLE BIT SET ACCORDINGLY

	$CSENT	(BTUEDL::)
	DMOVE	T3,T1		;COPY UCODE LOADER BLOCK ADDRESS AND ARG
	PUSHJ	P,BTAVAL	;GET BOOTSTRAP VECTOR ADDRESS
	  POPJ	P,		;NO BOOTSTRAP AVAILABLE
	HRRZ	T1,.ULIDX(T3)	;GET MICROCODE INDEX
	ADDI	T2,.BTUCD(T1)	;OFFSET TO UCODE WORD PAIR
	SKIPN	(T2)		;CHECK LENGTH WORD, IS UCODE LOADED?
	POPJ	P,		;NO UCODE AVAILABLE
	TRC	T4,1		;TOGGLE BIT
	DPB	T4,[POINT 1,.ULIDX(T3),0] ;SET ENABLE/DISABLE STATUS
	JRST	CPOPJ1##	;AND RETURN
; ROUTINE TO RETURN A POINTER TO MICROCODE WITHIN BOOT
; CALL:	MOVE	T1, ADDRESS OF UCODE LOADER BLOCK
;	PUSHJ	P,BTUCOD
;	  <NON-SKIP>		;BOOT OR UCODE NOT LOADED
;	<SKIP>			;UCODE LOADER BLOCK UPDATED

	$CSENT	(BTUCOD::)
	PUSHJ	P,SAVE1##	;SAVE P1
	MOVE	P1,T1		;COPY UCODE LOADER BLOCK ADDRESS
	MOVSI	T1,(UE.DAE)	;CLEAR RANDOM BITS AND PIECES OF DATA FOR
	ANDCAB	T1,.ULIDX(P1)	; DAEMON ERROR REPORTING AND GET INDEX
	PUSHJ	P,INTLVL##	;AT INTERRUPT LEVEL?
	  HRRZS	T1		;NO--INVOKED BY UUO (IGNORE DISABLED BIT)
	JUMPL	T1,UCOD1	;UCODE LOADING DISABLED?
	PUSHJ	P,BTAVAL	;GET BOOTSTRAP VECTOR ADDRESS
	  JRST	UCOD2		;NO BOOT, NO UCODE
	HRRZ	T1,.ULIDX(P1)	;GET MICROCODE INDEX
	ADDI	T2,.BTUCD(T1)	;OFFSET TO UCODE WORD PAIR
	SKIPN	T1,(T2)		;CHECK LENGTH WORD, IS UCODE LOADED?
	JRST	UCOD2		;NO UCODE AVAILABLE
	MOVEM	T1,.ULWDS(P1)	;SAVE LENGTH
	MOVE	T2,1(T2)	;GET OFFSET TO MICROCODE STORAGE
	ADD	T2,BOOTVA	;NOW GET  THE ACTUAL ADDRESS
	MOVE	T1,(T2)		;GET VERSION NUMBER
	MOVEM	T1,.ULVER(P1)	;SAVE IT
	CAMGE	T1,.ULMVR(P1)	;VERSION GT OR EQ TO MINIMUM?
	JRST	UCOD3		;NO
	AOS	T2		;POINT PAST THE VERSION NUMBER
	MOVEM	T2,.ULADR(P1)	;SAVE ADDRESS
	MOVEI	T1,0		;ZAP OLD ERROR CODE THAT MAY BE
	DPB	T1,ULBEBP	; LEFT FROM A PREVIOUS LOAD FAILURE
	JRST	CPOPJ1##	;RETURN

UCOD1:	MOVEI	T1,.UEDIS	;LOADING DISABLED
	JRST	UCODX
UCOD2:	MOVEI	T1,.UENOM	;NO MICROCODE
	JRST	UCODX
UCOD3:	MOVEI	T1,.UEWVR	;WRONG VERSION
UCODX:	DPB	T1,ULBEBP	;STORE
	POPJ	P,		;AND RETURN

	$CSUB
ULBEBP::POINT	6,.ULIDX(P1),17	;BYTE POINTER TO ERROR CODE
	$HIGH
; REPORT A MICROCODE LOAD SUCESS OR FAILURE
	$CSENT	(BTURPT::)
	PUSHJ	P,SAVE1##	;SAVE P1
	MOVE	P1,T1		;COPY UCODE LOADER BLOCK
	PUSHJ	P,CTYERM##	;SET FOR OUTPUT TO CTY
	MOVE	T1,DATE##	;GET UDT
	MOVEM	T1,.ULDTM(P1)	;SAVE FOR ERROR.SYS
	MOVE	T1,.CPCPN##	;GET THE CPU NUMBER
	DPB	T1,[POINT 3,.ULDEV(P1),8] ;SAVE FOR DAEMON
	SKIPE	DINITF##	;SYSTEM INITIALIZATION?
	JRST	URPT1		;YES--FORGET THE DAEMON STUFF
	MOVSI	T1,(UE.USR)	;BIT TO SET
	PUSHJ	P,INTLVL##	;AT INTERRUPT LEVEL?
	  IORM	T1,.ULIDX(P1)	;LOAD INVOKED BY A USER (DIAG. UUO)
	MOVEI	T1,.ULDAE	;LENGTH OF ERROR BLOCK
	PUSHJ	P,ALCSEB##	;ALLOCATE A SYSTEM ERROR BLOCK
	  JRST	URPT1		;GIVE UP IF NONE AVAILABLE
	MOVEI	T2,.ERULD	;GET THE BLOCK TYPE
	DPB	T2,[POINT 9,.EBTYP(T1),8] ;SAVE
	MOVEI	T2,.ULDAE	;NUMBER OF WORDS
	XMOVEI	T3,(P1)		;POINT TO MICROCODE LOADER BLOCK IN KDB
	MOVEI	T4,.EBHDR(T1)	;POINT TO THE ERROR BLOCK
	EXTEND	T2,[XBLT]	;COPY THE PACKET
	PUSHJ	P,QUESEB##	;QUEUE UP THE ERROR BLOCK FOR DAEMON
URPT1:	MOVEI	T2,ULDSUC	;ASSUME SUCESSFUL LOAD
	LDB	T1,ULBEBP	;GET ERROR CODE
	SKIPE	T1		;CHECK
	MOVEI	T2,ULDERR	;FAILURE
	PUSHJ	P,(T2)		;REPORT MICROCODE LOAD/FAILURE
	PJRST	PCRLF##		;ADD A CRLF AND RETURN
ULDERR:	PUSH	P,T1		;SAVE ERROR CODE
	MOVEI	T1,[ASCIZ /%% /]
	PUSHJ	P,CONMES##	;PRINT INTRODUCTION
	MOVE	T2,.ULINM(P1)	;GET INTERFACE NAME
	PUSHJ	P,PRNAME##	;PRINT IT
	MOVEI	T1,[ASCIZ / microcode load failed on /]
	PUSHJ	P,CONMES##	;PRINT TEXT
	PUSHJ	P,ULDDEV	;PRINT DEVICE INFO
	PUSHJ	P,PCRLF##	;PRINT A NEW LINE
	MOVEI	T1,[ASCIZ /   /];SPACE
	PUSHJ	P,CONMES##	; OVER
	POP	P,T1		;GET ERROR CODE BACK
	MOVE	T1,ULDETB-1(T1)	;AND ASSOCIATED TEXT
	PJRST	CONMES##	;PRINT IT AND RETURN

ULDSUC:	PUSHJ	P,PRLBK##	;PRINT A LEFT BRACKET
	MOVE	T2,.ULINM(P1)	;GET INTERFACE NAME
	PUSHJ	P,PRNAME##	;PRINT IT
	MOVEI	T1,[ASCIZ / microcode %/]
	PUSHJ	P,CONMES##	;PRINT TEXT
	MOVE	T1,.ULVER(P1)	;GET VERSION NUMBER
	PUSHJ	P,PRVERS##	;PRINT IT
	MOVEI	T1,[ASCIZ / loaded on /]
	PUSHJ	P,CONMES##	;PRINT TEXT
	PUSHJ	P,ULDDEV	;PRINT DEVICE INFO
	PJRST	PRRBK##		;END LINE WITH A BRACKET AND RETURN
; PRINT CPUN DEVICE XXX
ULDDEV:	MOVEI	T1,M.CPU##	;GET NUMBER OF CPUS IN THIS MONITOR
	SOJE	T1,ULDDE1	;DON'T PRINT CPUN IF THERE'S ONLY ONE
	MOVE	T2,.CPLOG##	;GET THE CPU NAME
	PUSHJ	P,PRNAME##	;PRINT IT
	MOVEI	T1,[ASCIZ /, /]	;SEPARATOR
	PUSHJ	P,CONMES##	;PRINT IT
ULDDE1:	MOVE	T2,['RH20  ']	;ASSUME RH20
	LDB	T1,[POINT 9,.ULDEV(P1),17] ;GET DEVICE CODE
	CAIL	T1,540		;IS IT REALLY AND
	CAILE	T1,574		; RH20 OF SOME SORT?
	MOVEI	T2,[ASCIZ /device/] ;GENERIC
	HRRZ	T1,.ULDEV(P1)	;GET POSSIBLE UNIT NUMBER
	CAIN	T1,-1		;MULTI-UNIT?
	MOVE	T2,.ULDNM(P1)	;NO--GET REAL DEVICE NAME
	TLNE	T2,-1		;SIXBIT CHANNEL NAME?
	JRST	ULDDE2		;YES
	MOVE	T1,T2		;COPY ADDRESS OF ASCIZ NAME
	PUSHJ	P,CONMES##	;PRINT IT
	JRST	ULDDE3		;ONWARD
ULDDE2:	PUSHJ	P,PRNAME##	;PRINT IT
ULDDE3:	PUSHJ	P,PRSPC##	;PRINT A SPACE
	LDB	T1,[POINT 9,.ULDEV(P1),17] ;GET DEVICE CODE
	PUSHJ	P,PRTDI8##	;PRINT THE DEVICE CODE
	HRRZ	T1,.ULDEV(P1)	;GET UNIT NUMBER
	CAIN	T1,-1		;MULTI-UNIT?
	JRST	ULDDE4		;NO
	MOVEI	T1,[ASCIZ /, /]	;SEPARATOR
	PUSHJ	P,CONMES##	;PRINT IT
	MOVE	T2,.ULDNM(P1)	;GET DEVICE NAME
	PUSHJ	P,PRNAME##	;PRINT IT
	PUSHJ	P,PRSPC##	;PRINT A SPACE
	HRRZ	T1,.ULDEV(P1)	;GET UNIT NUMBER
	PUSHJ	P,PRTDI8##	;PRINT IT
ULDDE4:	SKIPE	DINITF##	;STARTUP?
	POPJ	P,		;DATE/TIME NOT AVAILABLE
	MOVEI	T1,[ASCIZ / on /]
	PUSHJ	P,CONMES##	;PRINT TEXT
	PJRST	DATIME##	;PRINT DATE/TIME AND RETURN


ULDETB:	[ASCIZ /Loading disabled/]
	[ASCIZ /No microcode/]
	[ASCIZ /Wrong version/]
	[ASCIZ /Load error/]
	[ASCIZ /Verify error/]
	[ASCIZ /Microprocessor check/]
	[ASCIZ /CRAM load error/]
	[ASCIZ /CRAM verify error/]
	[ASCIZ /DRAM load error/]
	[ASCIZ /DRAM verify error/]
SUBTTL	LITERALS


LITERAL:$LIT
SUBTTL	IMPURE DATA


	$LOW

BOOTVA::BLOCK	1		;VIRTUAL ADDRESS OF BOOTSTRAP
BOOTXX:	BLOCK	2		;TEMP STORAGE FOR CALLING BOOTSTRAP
				; AS A SUBROUTINE

	$HIGH

MBTEND::!END