	.TITLE	ALLOCATE		
; JEFFREY KODOSKY	ARL	AUG76
;
; UTILITY:	OBTAIN A BLOCK OF MEMORY
; ENTRY:	NO ARGS
;		R3=SIZE OF BLOCK REQUESTED (IN WORDS)
; EXIT:		NO ARGS
;		R3 POINTS TO FIRST WORD OF AVAILABLE SPACE
; ERRORS:	T4, BUFFER SPACE EXHAUSTED
; CALLS:	NONE
	.GLOBL	ALLOCATE,AVAIL,QIO3ERR
ALLOCATE:INC	R3	;ONE WORD OVERHEAD
	ASL	R3
	MOV	#AVAIL,R1	;FIND FIRST FIT
	MOV	@R1,R2
	BEQ	5$	;JUMP IF AVAIL LIST IS EMPTY
	TST	-(R1)
1$:	CMP	(R2)+,R3
	BHIS	10$	;JUMP IF A LARGE ENOUGH BLOCK IS FOUND
	MOV	2(R1),R1;ELSE CONTINUE SEARCH
	MOV	@R2,R2
	BNE	1$
5$:	QIO3ERR
10$:	MOV	-(R2),R0
	SUB	R3,R0
	CMP	R0,#16.	;DON'T LEAVE ANY SMALL BLOCKS
	BGE	20$
	MOV	(R2)+,R3
	MOV	@R2,2(R1)
30$:	TST	-(R2)
	MOV	R3,(R2)+
	MOV	R2,R3
	JMP	@-(R4)
20$:	MOV	R2,R0
	ADD	R3,R0
	MOV	(R2)+,@R0
	SUB	R3,(R0)+
	MOV	@R2,@R0
	TST	-(R0)
	MOV	R0,2(R1)
	BR	30$
	.PAGE
; UTILITY:	RELEASE A BLOCK OF MEMORY
; ENTRY:	NO ARGS
;		R3 POINTS TO FIRST WORD OF BLOCK
; EXIT:		NO ARGS
; ERRORS:	NONE
; CALLS:	NONE
	.GLOBL	RELEASE,TMPLNK
RELEASE:.IF	NDF,RT11	; CORRECT THE LINKAGE INFORMATION FOR THE
				; FIRST OF FILES READ FROM CSI
				; ( DRW 6-DEC-80 )
	TST	TMPLNK		; INSURE THE ROUTINE IS USED WITH
	BMI	3$		; 	THE FIRST CSI INPUT ONLY
	MOV	TMPLNK,	@R3
	MOV	TMPLNK + 2, 2(R3)
	ADD	#2, R3
	MOV	#-1, TMPLNK	; SET FLAG -- FIRST CSI INPUT PROCESSED
	.ENDC			; LINKAGE INFO IN WORDS 1 & 2 OF BLOCK SHOULD
				; NOW BE CORRECT
3$:	MOV	R3,R2
	MOV	#AVAIL,R1
	MOV	@R1,R0
	BEQ	20$	;JUMP IF AVAIL LIST IS EMPTY
	TST	-(R1)
	MOV	-(R2),R3
1$:	ADD	R2,R3
	CMP	R3,R0
	BHI	6$
	BNE	2$
	MOV	R2,2(R1);BLOCK TO RELEASE ABUTS BLOCK @R0
	SUB	R2,R3	;SO MERGE THE TWO
	ADD	(R0)+,R3
	MOV	R3,(R2)+
	MOV	@R0,@R2
	JMP	@-(R4)
2$:	MOV	R2,2(R1);IF BLOCK COMES BEFORE BLOCK @R0
	SUB	R2,R3	;THEN INSERT IT IN LIST
	MOV	R3,(R2)+
	MOV	R0,@R2
	JMP	@-(R4)
6$:	SUB	R2,R3
	ADD	@R0,R0
	CMP	R2,R0
	BNE	13$
	MOV	2(R1),R0;IF BLOCK ABUTS END OF BLOCK @R0
	ADD	R3,@R0	;THEN MERGE THE TWO
	MOV	2(R0),R2;AND CHECK IF THE FOLLOWING BLOCK CAN
	BEQ	8$	;BE MERGED ALSO
	ADD	@R0,R0
	CMP	R0,R2
	BNE	8$
	MOV	2(R1),R0
	ADD	(R2)+,(R0)+
	MOV	@R2,@R0
8$:	JMP	@-(R4)
13$:	MOV	2(R1),R1;CONTINUE DOWN THE LIST
	MOV	2(R1),R0
	BNE	1$
	MOV	R2,2(R1)
	MOV	R3,(R2)+
	CLR	@R2
	JMP	@-(R4)
20$:	CLR	@R2
	TST	-(R2)
	MOV	R2,AVAIL
	JMP	@-(R4)
	.END
