Xinu7/src/serve11/sys/csv.s

Compare this file to the similar file:
Show the results in this format:

/* csv.s - csv, cret */

/* C register save:  upon entry here, procedure A has called B, and B	*/
/* has called csv to save registers.  r5 contains return address in B.	*/
/* The stack has old r5, return address in A, and arguments on it.	*/
/* C return: cret (below) is used to restore regs when the called proc.	*/
/* finally exits.  Comments are my best guess; code originally had none.*/

	.globl	csv, cret
/*------------------------------------------------------------------------
/*  csv  --  C register save routine (something to ponder on cold nights)
/*------------------------------------------------------------------------
csv:
	mov	r5,r0			/ r0 not saved at call (C convention)
	mov	sp,r5			/ r5 points to called routine's	frame
	mov	r4,-(sp)		/ push r4 -r2 on stack
	mov	r3,-(sp)
	mov	r2,-(sp)
	jsr	pc,(r0)			/ jsr pushes PC	onto stack goes	to
					/ address in r0	(originally in r5)

/*------------------------------------------------------------------------
/*  cret  --  C register restore routine
/*------------------------------------------------------------------------
cret:
	mov	r5,r2			/ put copy of called frame ptr in r2
	mov	-(r2),r4		/ reload r4 - r2 from start of frame
	mov	-(r2),r3
	mov	-(r2),r2
	mov	r5,sp			/ restore SP
	mov	(sp)+,r5		/ restore r5 saved on stack by call
					/ to csv at procedure entry
	rts	pc			/ return to caller