
ACT_DISKINS
		IFNE	DEBUG
		lea	ddiskins(pc),a0
		bsr	dtype
		bsr	dcr
		ENDC

		* Do we already know the inserted disk?
		move.l	(a3)+,d7
		move.l	d7,d1
		bsr	FindCorrVolume
		tst.l	d0
		beq.s	.newvol

		* Yes! Activate that volume!
		move.l	a1,curphvn
		move.l	phvn_volnode(a1),a2
		move.l	a2,curvolume

		move.l	_DOSBase(pc),a6
		moveq	#LDF_VOLUMES|LDF_WRITE,d1
		LIBCALL	LockDosList
		clr.l	dol_LockList(a2)
		move.l	ourport(pc),dol_Task(a2)
		moveq	#LDF_VOLUMES|LDF_WRITE,d1
		LIBCALL	UnLockDosList

		pea	1.w
		jsr	_SendInputEvent
		addq.l	#4,sp
		rts

.newvol		* No! Create new node!
		moveq	#phvn_SIZEOF,d0
		bsr	AllocVec
		tst.l	d0
		beq	.nomem1
		move.l	d0,a2
		move.l	d7,phvn_srvvolnode(a2)

		moveq	#DosList_SIZEOF,d0
		bsr	AllocVec
		tst.l	d0
		beq.s	.nomem2
		move.l	d0,a4
		move.l	d0,phvn_volnode(a2)

		move.l	#DLT_VOLUME,dol_Type(a4)
		move.l	ourport(pc),dol_Task(a4)
		move.l	#ID_DOS_DISK,dol_DiskType(a4)
		lea	dol_VolumeDate(a4),a0
		move.l	(a3)+,(a0)+
		move.l	(a3)+,(a0)+
		move.l	(a3)+,(a0)

		lea	phvn_name(a2),a0
		move.l	a0,d0
		lsr.l	#2,d0
		move.l	d0,dol_Name(a4)
		move.l	a3,a1
		bsr	make_volname

		move.l	_DOSBase(pc),a6
		move.l	a4,d1
		LIBCALL	AddDosEntry
		tst.l	d0
		beq.s	.noadd

		move.l	a2,curphvn
		move.l	a4,curvolume
		move.l	a2,a1
		lea	PHVNList(pc),a0
		move.l	4.w,a6
		LIBCALL	AddTail

		pea	1.w
		jsr	_SendInputEvent
		addq.l	#4,sp
		rts

.noadd		move.l	a4,a1
		move.l	4.w,a6
		LIBCALL	FreeVec
.nomem2		move.l	a2,a1
		move.l	4.w,a6
		LIBCALL	FreeVec
.nomem1		rts

make_volname	moveq	#0,d0
		move.b	(a1)+,d0
		cmp.b	#37,d0
		bcs.s	.0
		moveq	#37,d0
.0		move.b	d0,(a0)+
		move.b	unique(pc),d1
		beq.s	.1
		addq.b	#1,-1(a0)
		move.b	d1,(a0)+
.1		subq.w	#1,d0
.2		move.b	(a1)+,(a0)+
		dbra	d0,.2
		clr.b	(a0)
		rts

ACT_DISKREM
		* Blinder Alarm?
		move.l	curvolume(pc),d2
		beq.s	.ende

		* If no locks are outstanding for the removed Volume,
		* delete it completely. Otherwise only remove it.
		move.l	curphvn(pc),a2
		clr.l	curvolume
		clr.l	curphvn
		move.l	phvn_locklist(a2),d3
		beq.s	.clearall

		move.l	_DOSBase(pc),a6
		moveq	#LDF_VOLUMES|LDF_WRITE,d1
		LIBCALL	LockDosList
		move.l	d2,a3
		clr.l	dol_Task(a3)
		move.l	d3,dol_LockList(a3)
		moveq	#LDF_VOLUMES|LDF_WRITE,d1
		LIBCALL	UnLockDosList
		bra.s	.return

.clearall	bsr	RemoveVolNode

.return		pea	0.w
		jsr	_SendInputEvent
		addq.l	#4,sp
.ende		rts

* Return the Volume on this computer which corresponds to the given
* VolumeNode on the server, or NULL.
FindCorrVolume	; d1 BPTR ServerVolNode or NULL
		; RETURNS d0 BPTR VolNode or NULL
		;         a1 *PHVN
		moveq	#0,d0
		move.l	PHVNList+LH_HEAD(pc),a0
.nextphvn	tst.l	LN_SUCC(a0)
		beq.s	.end
		move.l	a0,a1
		move.l	LN_SUCC(a0),a0
		cmp.l	phvn_srvvolnode(a1),d1
		bne.s	.nextphvn
		move.l	phvn_volnode(a1),d0
		lsr.l	#2,d0
.end		rts

* Completely remove a Volume.
RemoveVolNode	; a2 *corresponding PHVN
		movem.l	a2/a6/d2,-(sp)
		move.l	_DOSBase(pc),a6
		moveq	#LDF_VOLUMES|LDF_WRITE,d1
		LIBCALL	LockDosList
		move.l	phvn_volnode(a2),d2
		move.l	d2,d1
		LIBCALL	RemDosEntry
		moveq	#LDF_VOLUMES|LDF_WRITE,d1
		LIBCALL	UnLockDosList
		move.l	4.w,a6
		move.l	d2,a1
		LIBCALL	FreeVec
		move.l	a2,a1
		LIBCALL	Remove
		move.l	a2,a1
		LIBCALL	FreeVec
		movem.l	(sp)+,a2/a6/d2
		rts
