	mov	r1,i.dskp(r2) / put block number of new block in i-node
	jsr	r0,setimod / set i-node modified byte
	jsr	r0,clear / clear new block
2:
	jsr	r0,dskrd / read in indirect block
	mov	(sp)+,r2 / get offset
	mov	r1,-(sp) / save block number of indirect block on stack
	add	r5,r2 / r5 points to first word in indirect block, r2
	              / points to location of inter
	mov	(r2),r1 / put physical block no of block in file
	                / sought in r1
	bne	2f / if no block exists
	jsr	r0,alloc / allocate a new block
	mov	r1,(r2) / put new block number into proper location in
	                / indirect block
	mov	(sp)+,r1 / get block number of indirect block
	mov	(r2),-(sp) / save block number of new block
	jsr	r0,wslot
	jsr	r0,dskwr / write newly modified indirect block back out
	                 / on disk
	mov	(sp),r1 / restore block number of new block
	jsr	r0,clear / clear new block
2:
	tst	(sp)+ / bump stack pointer
	rts	r0

alloc:
	mov	r2,-(sp) / save r2, r3 on stack
	mov	r3,-(sp)
	mov	$systm,r2 / start of inode and free storage map for drum
	tst	cdev
	beq	1f / drum is device
	mov	$mount,r2 / disk or tape is device, start of inode and free
	                  / storage map
1:
	mov	(r2)+,r1 / first word contains number of bytes in free
			 / storage map
	asl	r1 / multiply r1 by eight gives, number of blocks in device
	asl	r1
	asl	r1
	mov	r1,-(sp) / save # of blocks in device on stack
	clr	r1 / r1 contains bit count of free storage map
1:
	mov	(r2)+,r3 / word of free storage map in r3
	bne	1f / branch if any free blocks in this word
	add	$16.,r1
	cmp	r1 ,(sp) / have we examined all free storage bytes
	blo	1b
	jmp	panic / found no free storage
1:
	asr	r3 / find a free block
	bcs	1f / branch when free block found; bit for block k is in
		   / byte k/8 / in bit k (mod 8)
	inc	r1 / increment bit count in bit k (mod8)
	br	1b
1:
