/* --- Copyright University of Sussex 1989. All rights reserved. ----------
 * File:            S.axpvms/src/alisp.s
 * Purpose:
 * Author:          John Gibson, Sep 19 1994
 */

	.title	"alisp.o"	;;; must be the object file name

;;; ---------------------- LISP ROUTINES ---------------------------------

#_<

#_INCLUDE 'asm.ph'

constant	_setstklen_diff
	;

>_#


ASM_CODE_PSECT


	;;; _setstklen(____________saved_stklen, ________nresults)

	.align quad
DEF_C_LAB (_setstklen)
	ldl	rt0, _SVB_OFFS(_userhi)(rsvb)	;;; stack base
	ldl	rt1, (rusp)		;;; ________nresults (popint)
	ldl	rt2, 4(rusp)		;;; ____________saved_stklen (popint)
	lda	rusp, 8(rusp)
	addl	rt1, rt2, rt1		;;; ________nresults + ____________saved_stklen
	subl	rt1, #6, rt1		;;; -6 (popint bits) = desired stacklen
	subl	rt0, rt1, rt0		;;; _userhi - that = desired usp
	subl	rt0, rusp, rt1		;;; same as current usp?
	bne	rt1, C_LAB(_setstklen_diff) ;;; do _setstklen_diff if not
	ret	(rret)


	;;; _setstklen_diff()
	;;; required usp in rt0, (rt0 - rusp) in rt1

	.align quad
DEF_C_LAB (_setstklen_diff)
	blt	rt1, 1$			;;; br if stack not long enough
	mov	rt0, rusp		;;; else set us to desired len
	ret	(rret)

	;;; extend stack by pushing [] sufficient times
1$:     ldl	rt1, _SVB_OFFS(nil)(rsvb)
2$:	lda	rusp, -4(rusp)
	stl	rt1, (rusp)		;;; push []
	cmpeq	rt0, rusp, rt2
	blbc	rt2, 2$
	ret	(rret)


	.end
