	sys	1 / exit

syswait: / wait for a process to die
	movb	u.uno,r1 / put parents process number in r1
	asl	r1 / x2 to get index into p.pid table
	mov	p.pid-2(r1),r1 / get the name of this process
	clr	r2
	clr	r3 / initialize reg 3
1:
	add	$2,r2 / use r2 for index into p.ppid table / search table
		      / of parent processes for this process name
	cmp	p.ppid-2(r2),r1 / r2 will contain the childs process number
	bne	3f / branch if no match of parent process name
	inc	r3 / yes, a match, r3 indicates number of children
	asr	r2 / r2/2 to get index to p.stat table
	cmpb	p.stat-1(r2),$3 / is the child process a zombie?
	bne	2f / no, skip it
	clrb	p.stat-1(r2) / yes, free it
	asl	r2 / r2x2 to get index into p.pid table
	mov	p.pid-2(r2),*u.r0 / put childs process name in (u.r0)
	br	sysret1 / return cause child is dead
2:
	asl	r2 / r2x2 to get index into p.ppid table
3:
	cmp	r2,$nproc+nproc / have all processes been checked?
	blt	1b / no, continue search
	tst	r3 / one gets here if there are no children or children
		   / that are still active
	beq	error1 / there are no children, error
	movb	u.uno,r1 / there are children so put parent process number
		         / in r1
	incb	p.stat-1(r1) / it is waiting for other children to die
	jsr	r0,swap / swap it out, because it's waiting
	br	syswait / wait on next process

error1:
	jmp	error / see 'error' routine
sysret1:
	jmp	sysret / see 'sysret' routine

sysfork: / create a new process
	clr	r1
1: / search p.stat table for unused process number
	inc	r1
	tstb	p.stat-1(r1) / is process active, unused, dead
	beq	1f / it's unused so branch
	cmp	r1,$nproc / all processes checked
	blt	1b / no, branch back
	add	$2,18.(sp) / add 2 to pc when trap occured, points
		           / to old process return
	br	error1 / no room for a new process
1:
	movb	u.uno,-(sp) / save parent process number
	movb	r1,u.uno / set child process number to r1
	incb	p.stat-1(r1) / set p.stat entry for child process to
		             / active status
