	.TITLE	PSERV
	.DSABL	GBL
		
C2$CSR	=	176674	
C2$DAT	=	176676

;----------------------------------
ALO$BL:	.BYTE		0,	1
	.BYTE		32,	0
A$ADDR:	.WORD		0
A$WCNT:	.WORD		0
;----------------------------------
FRE$BL:	.BYTE		0,	2
	.BYTE		32,	0
F$ADDR:	.WORD		0
F$WCNT:	.WORD		0	
;----------------------------------
PUT$BL:	.BYTE		0,	20
	.BYTE		32,	0
ADR$PP:	.WORD		0
ADR$CP:	.WORD		0
P$WCNT:	.WORD		0
;----------------------------------
GO$BLK:	.BYTE		0,	30
	.BYTE		32,	0
GO$ADR:	.WORD		0
;----------------------------------
GET$BL:	.BYTE		0,	10
	.BYTE		32,	0
G$ADDR:	.WORD		0
G$BUFF:	.WORD		0
G$WCNT:	.WORD		0
;----------------------------------

TEST:
	TSTB	@#C2$CSR
	BPL	TEST
	RETURN

OUT$B:
	CALL	TEST
	MOVB	R0,@#C2$DAT
	RETURN

OUT$W:
	CALL	OUT$B
	SWAB	R0
	CALL	OUT$B
	SWAB	R0
	RETURN

OUT$ADR::
	CALL	OUT$W	
	MOV	R0,-(SP)
	MOV	#-1,R0
	CALL	OUT$W
	CALL	TEST
	MOV	(SP)+,R0
	RETURN
	
;+
; polu~tx adres zapro{ennogo u~-ka pamqti w ozu pp
; argumenty :	razmer zapra{iwaemogo u~-ka pamqti - w steke
; rezulxtat :	adres oblasti - w R0
; wyzow     :		MOV	#WCNT,-(SP)
;			CALL	.ALLOC
;+
.ALLOC::
	MOV	#ALO$BLK,R0
	MOV	2(SP),A$WCNT
	CALL	OUT$ADR
	MOV	(SP)+,(SP)
	ASRB	@R0
	MOV	A$ADDR,R0
	RETURN



;+
; oswoboditx pamqtx
; argumenty :	adres i razmer otdawaemogo u~-ka - w steke
; rezulxtat :	net
; wyzow	    :		MOV	#ADDRESS,-(SP)
;			MOV	#WCNT,-(SP)
;			CALL	.FREE
;+
.FREE::
	MOV	#FRE$BLK,R0
	MOV	2(SP),F$WCNT
	MOV	4(SP),F$ADDR
	CALL	OUT$ADR
	MOV	(SP)+,(SP)
	MOV	(SP)+,(SP)
	RETURN

;+
; perepisatx ~astx pamqti cp w pamqtx pp
; argumenty : 	adres w ozu cp, adres w ozu pp, razmer - w steke
; rezulxtat :	net
; wyzow	    :		MOV	#ADRCP,-(SP)
;			MOV	#ADRPP,-(SP)
;			MOV	#WCNT,-(SP)
;			CALL	.PUT
;+
.PUT::
	MOV	#PUT$BLK,R0
	MOV	2(SP),P$WCNT
	MOV	4(SP),ADR$PP
	MOV	6(SP),ADR$CP
	CALL	OUT$ADR
	MOV	(SP)+,(SP)
	MOV	(SP)+,(SP)
	MOV	(SP)+,(SP)
	RETURN

;+
; perepisatx ~astx ozu pp w ozu cp
; argumenty : 	adres w ozu cp, adres w ozu pp, razmer - w steke
; rezulxtat :	net
; wyzow     :		MOV	#ADRCP,-(SP)
;			MOV	#ADRPP,-(SP)
;			MOV	#WCNT,-(SP)
;			CALL	GET
.GET::
	MOV  #GET$BLK,R0
	MOV	2(SP),G$WCNT
	MOV	4(SP),G$ADDR
	MOV	6(SP),G$BUFF
	CALL	OUT$ADR
	MOV	(SP)+,(SP)
	MOV	(SP)+,(SP)
	MOV	(SP)+,(SP)
	RETURN

;+
; zapustitx podprogrammu w ozu pp
; argumenty :	adres starta - w steke
; rezulxtat :	net
; wyzow	    :		MOV	#GOADDR,-(SP)	
;			CALL	.GO
;+
.GO::
	MOV	#GO$BLK,R0
	MOV	2(SP),GO$ADR
	CALL	OUT$ADR
	MOV	(SP)+,(SP)
	RETURN

	.END
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         