.define Ret
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text

! This subroutine stores the returnvalue in the return area.
! This area is in zeropage.
! The size of the object to be returned is in zeropage location
! RETSIZE.
! It also restores the localbases and the stackpointer of the
! invoking procedure.


Ret:
	sty RETSIZE	! save returnsize
	beq 1f		! the return size is zero
	lda #0		! address of returnvalue area (highbyte)
	ldx #RETURN	! address of returnvalue area (lowbyte)
	cpy #2
	bne 2f
	jsr Sti		! store word
	jmp 1f
    2:	cpy #4
	jsr Sdi		! store fourbyte word
    1:	ldx LB		! get old stackpointer (lowbyte)
	stx SP+2
	lda LB+1	! get old stackpointer (highbyte)
	sta SP+1
	inc LB
	inc LB
	bne 1f
	inc LB+1
    1:	jsr Pop		! get old localbase
	stx LB		! localbase (lowbyte)
	sta LB+1	! localbase (highbyte)
	pha
	sec
	txa
	sbc #BASE
	sta LBl		! second localbase (lowbyte)
	pla
	sbc #0
	sta LBl+1	! second localbase (highbyte)
	rts