ùúùú  ˆŽ  ¯¬  ;’  4ã  ·  †ø  F§  ;’  –d  **************************************************************************
*
* GU_SortList - Sorts all items an a list and optionally in a slave list.
*
* Inputs:
*	A0 - Pointer to main list.
*	A1 - Pointer to slave list (or NULL).
*
* Outputs:
*	none
*

GU_SortList:
	movem.l	d0-d1/d5-d7/a0-a6,-(sp)

	cmp.l	#0,a0			; Check if list pointer is ok.
	beq	.NoList

	move.l	UtilityBase(pc),a6

	move.l	LH_HEAD(a0),d6		; Master list ponter

;	cmp.l	#0,a1			; Check if slavelist exists
;	beq	.NoSlaveList

	move.l	LH_HEAD(a1),d7		; Slave list pointer

;   En vanlig sekvens är t.ex. 9,5,3,2,1 som jag även använder i exemplet
;   nedan. Undvik helst att använda serier som är multipler av 2 som
;   t.ex. 8,4,2,1 eftersom de av komplex matemetisk anledning inte lämpar
;   sig i det här fallet, och därför reducerar effektiviteten på algoritmen.

	lea	.Data(pc),a5
	moveq	#0,d5
.BigLoop:			* Rescan list loop
	move.l	d6,a2			; Reset Master list pointer
	move.l	d7,a4			; Reset Slave list pointer

	tst.b	d5			; Check if anything has changed last
	beq	.NoChange

					; Something changed, let's loop again..
	subq.l	#1,a5			; Subtract to get same num as last loop

.NoChange:
	moveq	#0,d0
	move.b	(a5)+,d0		; Next checknumber.
	beq	.NoMoreLoops

	moveq	#0,d5			; Clear the change flag in d5.

	move.l	d0,d1

	bsr	.GetNode
	beq	.BigLoop		; Not enough nodes for this loop

	bsr	.GetSlaveNode
	beq	.BigLoop		; If this jumps, there has to be
					; something wrong...
	move.l	a0,d4

.Loop:				* Scan list loop

	move.l	LN_NAME(a2),a0		; String1
	move.l	LN_NAME(a3),a1		; String2

	CallLib	Stricmp			; Case-insensitive string comparison.
	tst.l	d0
	ble	.StringsOk		; string1 <= string2

	st	d5			; Mark that the list is changed

	move.l	LN_NAME(a2),d0		; Swap both strings
	move.l	LN_NAME(a3),LN_NAME(a2)	; In Master list
	move.l	d0,LN_NAME(a3)

	move.l	d4,a0			; Get other node in slave list
	move.l	LN_NAME(a4),d0		; Swap both strings in slave list.
	move.l	LN_NAME(a0),LN_NAME(a4)
	move.l	d0,LN_NAME(a0)

.StringsOk:

	move.l	(a4),a4			; Get to next node in slave list
	tst.l	(a4)
	beq	.BigLoop

	move.l	(a2),a2			; Get to next node in master list
	tst.l	(a2)
	beq	.BigLoop

	move.l	(a3),a3			; Get LN_SUCC for main 2 pointer
	tst.l	(a3)
	beq	.BigLoop		; End of list. Jump to bigloop.

	move.l	d4,a0
	move.l	(a0),a0			; Get to next node for slave 2 pointer
	tst.l	(a0)
	beq	.BigLoop
	move.l	a0,d4

	bra	.Loop

.NoMoreLoops:

.NoList:
	movem.l	(sp)+,d0-d1/d5-d7/a0-a6
	rts

.Data:	dc.b	255,127,63,31,15,9,5,3,2,1,0
	even


**************************************************************************
*
* Get Slave Node address
*
* Inputs:
*	d1 - Node number (relative from current node)
*	a4 - Current node.
*
* Outputs:
*	d0 - Null on error
*	Z  - Set on error.
*	a0 - Node address
*

.GetSlaveNode:
	subq.w	#1,d1
	move.l	a4,a0
.Loop0:
	move.l	(a0),a0			; Get LN_SUCC
	tst.l	(a0)
	dbeq	d1,.Loop0		; NULL on error
	rts

**************************************************************************
*
* Get Node address
*
* Inputs:
*	d0 - Node number (relative from current node)
*	a2 - Current node.
*
* Outputs:
*	d0 - Null on error
*	Z  - Set on error
*	a3 - Node address
*

.GetNode:
	subq.w	#1,d0
	move.l	a2,a3
.Loop1:
	move.l	(a3),a3			; Get LN_SUCC
	tst.l	(a3)
	dbeq	d0,.Loop1		; NULL on error
	rts
