MiniUnix/usr/source/s5/nlist.s

Find at most related files.
including files from this version of Unix.

/ nlist -- extract values from name list
/

/	nlist(file, list);
/
.globl	_nlist

_nlist:
	mov	r5,-(sp)
	mov	sp,r5
	mov	4(r5),0f
	mov	6(r5),r1
	mov	r2,-(sp)

	mov	r1,r0
1:
	tst	(r0)
	beq	1f
	add	$8.,r0
	clr	(r0)+
	clr	(r0)+			/ initialize to undefined
	br	1b
1:
	sys	0; 9f
.data
9:
	sys	open; 0:..; 0
.text
	bes	done
	mov	r0,r2
	sys	read; buf; 20
	cmp	r0,$20
	bne	cdone
	mov	buf+4,count			/ assume older a.out
	mov	buf+2,0f
	cmp	buf,$405
	beq	1f
	mov	buf+8.,count			/ now assume newer
	mov	buf+2,r0			/ txt
	add	buf+4,r0			/ data
	cmp	buf+16,$1			/ relocation?
	beq	4f
	asl	r0				/ txt+data reloc
4:
	add	$20,r0				/ header
	mov	r0,0f
	cmp	buf,$411
	beq	1f
	cmp	buf,$410
	beq	1f
	cmp	buf,$407
	bne	cdone
1:
	mov	r2,r0
	sys	0; 9f
.data
9:
	sys	seek; 0:..; 0
.text

1:
	sub	$12.,count
	blt	cdone
	mov	r2,r0
	sys	read; buf; 12.
	cmp	r0,$12.
	bne	cdone
	mov	r1,r0

2:
	tst	(r0)
	beq	1b
	cmp	(r0),buf
	bne	1f
	cmp	2(r0),buf+2
	bne	1f
	cmp	4(r0),buf+4
	bne	1f
	cmp	6(r0),buf+6
	bne	1f
	mov	buf+8.,8.(r0)
	mov	buf+10.,10.(r0)
1:
	add	$12.,r0
	br	2b

cdone:
	mov	r2,r0
	sys	close

done:
	mov	(sp)+,r2
	mov	(sp)+,r5
	rts	pc

.bss
buf:	.=.+20
count:	.=.+2