d 	.TITLE	LOADMREG - LOAD MBA AND UBA MAP REGISTERS
 	.IDENT	/01/
, 
;
; COPYRIGHT (C) 1977
X; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
 ; THIS SOFTWARE IS FURNISHED UNDER  A LICENSE FOR USE ONLY  ON  A
; SINGLE COMPUTER SYSTEM AND MAY BE  COPIED ONLY WITH  THE INCLU-
; SION OF  THE  ABOVE  COPYRIGHT NOTICE.  THIS SOFTWARE,  OR  ANY
L; OTHER COPIES THEREOF, MAY NOT BE  PROVIDED  OR  OTHERWISE  MADE
; AVAILABLE TO ANY OTHER PERSON EXCEPT  FOR  USE  ON  SUCH SYSTEM
; AND TO  ONE WHO AGREES  TO  THESE LICENSE  TERMS.  TITLE TO AND
x; OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
;
@; THE INFORMATION IN THIS SOFTWARE  IS  SUBJECT TO CHANGE WITHOUT
; NOTICE AND SHOULD NOT BE CONSTRUED  AS  A COMMITMENT BY DIGITAL
; EQUIPMENT CORPORATION.
l;
; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
4; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
;
; D. N. CUTLER 1-NOV-77
`	;
	; LOAD MBA AND UBA MAP REGISTERS
(
;

; MACRO LIBRARY CALLS

;
T 
	$CRBDEF				;DEFINE CRB OFFSETS
	$MBADEF				;DEFINE MBA REGISTER OFFSET DEFINITIONS
	$PTEDEF				;DEFINE PAGE TABLE ENTRY FIELDS
	$UBADEF				;DEFINE UCB OFFSETS
H	$UCBDEF				;DEFINE UCB OFFSETS
	$VECDEF				;DEFINE CRB TRANSFER VECTOR OFFSETS
	.PAGE
t	.SBTTL	LOAD MASSBUS ADAPTER MAP REGISTERS
;+
<; IOC$LOADMBAMAP - LOAD MASSBUS ADAPTER MAP REGISTERS
;
; THIS ROUTINE IS CALLED TO LOAD THE MASSBUS ADAPTER MAP REGISTERS, THE
h; BYTE COUNT REGISTER, AND THE VIRTUAL ADDRESS REGISTER.
;
0; INPUTS:
;
;	R4 = ADDRESS OF MBA CONFIGURATION STATUS REGISTER.
\;	R5 = UCB ADDRESS OF UNIT TRANSFER IS TO OCCUR ON.
;
$; OUTPUTS:
;
;	THE TRANSFER BYTE COUNT, STARTING PAGE OFFSET, AND ADDRESS OF THE
P;	PAGE TABLE ENTIRES THAT DESCRIBE THE TRANSFER ARE RETRIEVED FROM
;	THE SPECIFED UCB AND USED TO LOAD THE MBA BYTE COUNT, VIRTUAL ADDRESS,
;	AND MAP REGISTERS. ONE ADDITIONAL MAP REGISTER IS LOADED AS INVALID
|;	TO STOP THE TRANSFER IF A HARDWARE FAILURE SHOULD OCCUR.
;
D;	R3 IS PRESERVED ACROSS CALL.
;-
 
p	.PSECT	WIONONPAGED
IOC$LOADMBAMAP::			;LOAD MASSBUS ADAPTER MAP REGISTERS
8	PUSHL	R3			;SAVE REGISTERS
	MOVZWL	UCB$W_BCNT(R5),R2	;GET TRANSFER BYTE COUNT
 	MNEGL	R2,MBA$L_BCR(R4)	;LOAD BYTE COUNT REGISTER
d	MOVZWL	UCB$W_BOFF(R5),R1	;GET BYTE OFFSET IN PAGE
	MOVL	R1,MBA$L_VAR(R4)	;LOAD STARTING VIRTUAL ADDRESS
,	MOVL	R1,MBA$L_VAR(R4)	;*****TEMP UNTIL MBA ECO ******
	MOVAB	^X1FF(R2)[R1],R2	;CALCULATE HIGHEST RELATIVE BYTE AND ROUND
	ASHL	#-9,R2,R2		;CALCULATE NUMBER OF MAP REGISTERS TO LOAD
X	MOVAL	MBA$L_MAP(R4),R1	;GET ADDRESS OF MBA MAP REGISTERS
	MOVL	UCB$L_SVAPTE(R5),R0	;GET ADDRESS OF PAGE TABLE
 10$:	MOVL	(R0)+,(R1)+		;LOAD MAP REGISTER
	BGEQ	30$			;IF GEQ PTE INVALID
20$:	SOBGTR	R2,10$			;ANY MORE TO LOAD?
L	CLRL	(R1)			;LOAD INVALID MAP ENTRY
	MOVL	(SP)+,R3		;RESTORE REGISTER
	RSB				;
x30$:	MOVL	-4(R0),R3		;GET THE PTE (NOT FROM MAP REGISTER!)
	BSBW	IOC$PTETOPFN		;GET PFN FROM INVALID PTE
@	BISL3	#^X80000000,R3,-4(R1)	;AND LOAD THE MAP REGISTER
	BRB	20$			;
 	.PAGE
l 	.SBTTL	LOAD UNIBUS ADAPTER MAP REGISTERS
 ;+
4!; IOC$LOADUBAMAP - LOAD UNIBUS ADAPTER MAP REGISTERS
!;
!; THIS ROUTINE IS CALLED TO LOAD THE UNIBUS ADAPTER MAP REGISTERS.
`";
"; INPUTS:
(#;
#;	R5 = UCB ADDRESS OF UNIT TRANSFER IS TO OCCUR ON.
#;
T$;	IT IS ASSUMED THAT THE DATAPATH AND MAP REGISTERS HAVE BEEN PREVIOUSLY
$;	ASSIGNED.
%;
%; OUTPUTS:
%;
H&;	EACH MAP REGISTER IS LOADED WITH THE APPROPRIATE PAGE FRAME NUMBER
&;	MERGED WITH THE DATAPATH DESIGNATOR AND BYTE OFFSET BIT. ONE ADDITIONAL
';	MAP REGISTER IS LOADED AS INVALID TO STOP THE TRANSFER IF A HARDWARE
t';	FAILURE SHOULD OCCUR.
';
<(;	R3 IS PRESERVED ACROSS CALL.
(;-
) 
h)IOC$LOADUBAMAP::			;LOAD UNIBUS ADAPTER MAP REGISTERS
)	MOVQ	R3,-(SP)		;SAVE REGISTERS
0*	MOVZWL	UCB$W_BOFF(R5),R1	;GET BYTE OFFSET IN PAGE
*	MOVZWL	UCB$W_BCNT(R5),R2	;GET TRANSFER BYTE COUNT
*	MOVL	UCB$L_CRB(R5),R3	;GET ADDRESS OF CRB
\+	MOVZBL	CRB$L_INTD+VEC$B_DATAPATH(R3),R4 ;GET DATAPATH DESIGNATOR
+	BLBC	R1,10$			;IF LBC WORD ALIGNED TRANSFER
$,	BISB	#^X10,R4		;SET BYTE OFFSET BIT
,10$:	BISW	#^X400,R4		;MERGE VALID WITH BYTE OFFSET AND DATAPATH
,	MOVAB	^X1FF(R2)[R1],R2	;CALCULATE HIGHEST RELATIVE BYTE AND ROUND
P-	ASHL	#-9,R2,R2		;CALCULATE NUMBER OF MAP REGISTERS TO LOAD
-	CMPB	R2,CRB$L_INTD+VEC$B_NUMREG(R3) ;ENOUGH MAP REGISTERS ASSIGNED?
.	BGEQU	40$			;IF GEQU NO
|.	MOVL	@CRB$L_INTD+VEC$L_ADP(R3),R1 ;GET ADDRESS OF CONFIGURATION REGISTER
.	EXTZV	#0,#VEC$V_MAPLOCK,CRB$L_INTD+VEC$W_MAPREG(R3),R0 ;GET STARTING REGISTER
D/	MOVAL	UBA$L_MAP(R1)[R0],R1	;GET ADDRESS OF FIRST MAP REGISTER TO LOAD
/	MOVL	UCB$L_SVAPTE(R5),R0	;GET ADDRESS OF PAGE TABLE
020$:	MOVL	(R0)+,R3		;GET NEXT PAGE TABLE ENTRY
p0	BLSS	30$			;IF LSS VALID PAGE TABLE ENTRY
0	BSBB	IOC$PTETOPFN		;GET PFN FROM INVALID PTE
8130$:	INSV	R4,#21,#11,R3		;INSERT VALID, BYTE OFFSET, AND DATAPATH
1	MOVL	R3,(R1)+		;LOAD UBA MAP REGISTER
 2	SOBGTR	R2,20$			;ANY MORE TO LOAD?
d2	CLRL	(R1)			;LOAD INVALID MAP ENTRY
2	MOVQ	(SP)+,R3		;RESTORE REGISTERS
,3	RSB				;
340$:	BUG_CHECK UBMAPEXCED,FATAL	;UNIBUS MAP REGISTER ALLOCATION EXCEEDED
3	.PAGE
X4	.SBTTL	GET PFN FROM INVALID PTE
4;+
 5; IOC$PTETOPFN - GET PFN FROM INVALID PTE
5;
5; THIS ROUTINE IS CALLED TO RETURN THE PAGE FRAME NUMBER FROM A
L6; PAGE TABLE ENTRY WHICH HAS ALREADY BEEN DETERMINED TO BE NOT VALID.
6;
7; INPUTS:
x7;
7;	R3 = PAGE TABLE ENTRY
@8;
8; OUTPUTS:
9;
l9;	R3 = PAGE FRAME NUMBER AND MAY INCLUDE THE FOLLOWING FIELDS
9;		VALID BIT, MODIFY BIT, PROTECTION FIELD, OWNER FIELD
4:;
:;	ALL OTHER REGISTERS PRESERVED
:;-
`;
;	.ENABL	LSB
(<GLOBAL:
<	MOVL	@MMG$GL_GPTBASE[R3],R3	;GLOBAL PAGE TABLE ENTRY
<	BLSS	10$			;BRANCH IF VALID
T=IOC$PTETOPFN::
=	BICL	#^C<PTE$M_TYP1 ! PTE$M_TYP0 !- ;PTE TYPE BITS
>		PTE$M_GPTX>,R3		;AND GPTX/PFN
>	BBS	#PTE$V_TYP1,R3,20$	;BRANCH IF BAD PTE FOR I/O
>	BBSC	#PTE$V_TYP0,R3,GLOBAL	;BRANCH IF GLOBAL PAGE
H?10$:	RSB
?20$:	BUG_CHECK INVPTEFMT,FATAL	;INVALID PAGE TABLE ENTRY FORMAT
@	.DSABL	LSB
t@ 
@	.END
