** I AM NOT GOING TO USE THIS "TREE" METHOD FOR CHECKING FOR MEMORY
** SINCE IT REQUIRES 8 ALLOCMEMS WHEN ADDING A NEW NODE, AND
** A CONSTANT TIME OF 8 DOWN THE TREE
**
** THIS METHOD WOULD BE IDEAL IN A VERY HEAVILY LOADED DMA SYSTEM HOWEVER
**
** WE CAN ASSUME THAT A HASH TABLE IS MORE EFFICIENT FOR OUR PURPOSES
** (WE ARE NOT RUNNING A HEAVY FILE SERVER!?!)
** WHAT WAS I THINKING WHEN I MADE THIS???

	include ":stone/dazsys/macros.i"
	include ":stone/dazsys/smallmemory.i"
	include ":stone/dazsys/xrefs.i"


*** STRUCTURES USED
				rsset	0
dman_next		rs.l	16
dman_prev		rs.l	1
dman_used		rs.w	1
DMANode_size	rs.b	0

				rsset	0
dmal_memory		rs.l	1
dmal_length		rs.w	1
dmal_majic		rs.w	1
DMALast_size	rs.b	0

*******************************************************************************
DMAEXPOS MACRO	;address(data){{2, node_address, return, temp
*******************************************************************************
; rotates data up 4, returns address in "return"

	rol.l	#4,\1								;next HEX digit
	move.l	\1,\4
	and.w	#$f<<2,\4							;extract it
	move.l	dman_next(\2,\4),\3
	ENDM

*******************************************************************************
		_AddDMANode:
*******************************************************************************
;Input: a0 first node in DMA tree
;		a1 memory address to add as a node
;		d0.W length
;		d1.W majic number (not implemented, set to 0)
*******************************************************************************
		movem.l	d0-d7/a1-a6,-(sp)

		move.l	a0,a5								;a5 <== first node
		move.l	a1,d5								;d5 <== number
		rol.l	#2,d5								;times by 4
		moveq	#6,d7								;loop 7 times

*** FIND THE END NODE (LEAF) FOR THIS ADDRESS
adn_loopa:
		DMAEXPOS	d5,a5,d0,d6						;num, node, ret, temp
		if		ne,adn_gotmem						;ALREADY A NODE

		sys_allocmem #DMANode_size,#MEMF_PUBLIC+MEMF_CLEAR,<dman_next(a5,d6.w)>

		if		eq,bra,adn_nomem
		addq.w	#1,dman_used(a5)					;NEW "NEXT" NODE IN THIS NODE
		move.l	d0,a0
		move.l	a5,dman_prev(a0)					;UPDATE PREV FIELD
	adn_gotmem:
		move.l	d0,a5								;now work on this
		dbf.w	d7,adn_loopa

*** NOW ALLOCATE THE LEAF
		DMAEXPOS	d5,a5,d0,d6						;num, node, ret, temp
		if		ne,adn_error						;node already exists
		sys_allocmem #DMALast_size,#MEMF_PUBLIC,<dman_next(a5,d6.w)>
		if		eq,bra,adn_nomem
		addq.w	#1,dman_used(a5)					;NEW "NEXT" NODE IN THIS NODE
		move.l	d0,a0
		ror.l	#2,d5
		move.l	d5,dmal_memory(a0)
		movem.l	(sp)+,d0-d7/a1-a6
		move.w	d0,dmal_length(a0)
		move.w	d1,dmal_majic(a0)
		moveq	#1,d0
		rts

adn_error:
		movem.l	(sp)+,d0-d7/a1-a6
		moveq	#0,d0
		rts

adn_nomem:
		movem.l	(sp)+,d0-d7/a1-a6
		moveq	#0,d0
		rts
