;
;	Sortier-Algorithmus: STRAIGHTSELECTION
;	geschrieben von Michael Maier
;	Assembler: KICK-ASS
;
;	(c) 1990 MAXON Computer GmbH

MAXCHAR	=16 ; Anzahl Zeichen pro String
ANZAHL	=6 ; Anzahl der Strings

main:
	lea _StringFeld,a0
	moveq #ANZAHL,d0
	bsr Sort
	rts

; Hauptprogramm
Sort:
	bsr GetMaxStr
	add.l #MAXCHAR,a0
	subq.l #1,d0
	cmp.l #1,d0
	bne.s Sort
	rts

; Setzt den "kleinsten" String nach oben!
; => A0.l Startadresse im Feld
;	  D0.l Anzahl der zu untersuchenden Strings
; <=
GetMaxStr:
	movem.l a0/d0,-(sp) ; Register merken
	move.l a0,a2  ; Adresse merken
	bra.s NewChange
MaxLoop:
	add.l #MAXCHAR,a0 ; nächsten String
	bsr CompareStr ; Vergleich
	ble.s NoChange ; immernoch kleiner
NewChange:
; sonst: kleinern
	move.l a0,a1  ; String merken
NoChange:
	dbra d0,MaxLoop ; bis zum Ende
	cmp.l a2,a1  ; gleicher String?
	beq.s NoExchange ; ja => nicht vertauchen
	bsr Exchange
NoExchange:
	movem.l (sp)+,a0/d0; Register vom Stack
	rts

; Vertauscht zwei Strings
; => A1.l 1. String
;	  A2.l 2. String
Exchange:
	moveq #MAXCHAR-1,d0
Schleife:
	move.b (a2),d1
	move.b (a1),(a2)+
	move.b d1,(a1)+
	dbra d0,Schleife
	rts

; Vergleicht zwei Strings
; => A0.l Zeiger auf 1. String
;	  A1.l Zeiger auf 2. String
; >0 Statusflag
CompareStr:
	movem.l a0/a1/d0,-(sp) ; Register retten
	moveq #MAXCHAR-1,d0
CmpLoop:
	cmpm.b (a0)+,(a1)+ ; Zeichen vergleichen
	dbne d0,CmpLoop ; Beide gleich? ja, weiter-
; suchen bis Stringende
	movem.l (sp)+,a0/a1/d0;
	rts	;

_StringFeld:
	dc.b 'Christian Jasper'; Beispieldaten
	dc.b 'C. Boellerwilli '
	dc.b 'Markus Neumann  '
	dc.b 'Marc Killyman   '
	dc.b 'geschrieben von '
	dc.b 'Michael Maier   '






