title Schnelle Sortierroutine fuer Z-80 name ('SORT') ; Das Programm basiert auf einem Artikel des Magazins MC 9/1985 ; Copyright H.Voelz 3.1.1985 ; Kommentare und kleine Korrekturen von W.Cirsovius ; Angezeigt durch /WEC/ ; Aufruf der Routine mit 'stadr' und 'enadr' gesetzt wie folgt: ; +---+-------+---+-------+---+ +-------+---+ ; | 0 | Text1 | 0 | Text2 | 0 | ---- | Textn | 0 | ; +---+-------+---+-------+---+ +-------+---+ ; ^ ^ ; stadr enadr ; 'stadr' zeigt auf das erste Zeichen im ersten Text ; 'enadr' zeigt hinter die NULL des letzten Textes NULL equ 00h UPCASE equ 01011111b entry sort,stadr,enadr ; ;HL:=BC, BC:=HL-BC ; adr1: push bc or a sbc hl,bc ; Differenz berechnen ld c,l ; .. kopieren ld b,h pop hl ; .. Zeiger zurueck holen ret ; ;Hier ist Start ; sort: ld hl,(enadr) ; Endadresse laden ld (en1),hl ; .. speichern dec hl xor a en2su: dec hl cp (hl) ; Vorige NULL finden jr nz,en2su inc hl nwort: ld (en2),hl ; Textzeiger speichern xor a ; /WEC/ push hl ld de,(stadr) ; Textstart laden ; /WEC/ or a sbc hl,de ; Test ob bereits Textstart ; /WEC/ pop hl ret z ; .. ja, dann Ende add hl,de ; /WEC/ dec hl en3su: dec hl cp (hl) ; Vorige NULL finden jr nz,en3su inc hl ld (en3),hl ; Textzeiger speichern ; ;Vergleichen ; ex de,hl ; /WEC/ ld hl,(en2) ; Zeiger laden ; /WEC/ ld de,(en3) vergl: ld a,(hl) ; Zeichen laden and UPCASE ; .. maskieren ld b,a ld a,(de) and UPCASE cp b ; Vergleich jr z,gleich ; ^DE=^HL vergl2: jr nc,taushe ; ^DE>^HL ; ;naechstes Wort ; nwor: ld hl,(en2) ; Zeiger umsetzen ld (en1),hl ld hl,(en3) jr nwort ; ;gleiche Worte ; gleich: cp NULL ; Test ob Textende jr z,weiter ; .. ja weit: inc hl inc de jr vergl ; .. weiter ; ;Entscheidung bei 00 bzw. 20 - Durch die Maske wirkt das Leerzeichen wie NULL ; weiter: ld a,(de) cp NULL ; Test Ende jr z,nwor ; .. ja cp (hl) ; Test Leerzeichen jr z,weit ; .. ja ; ;Umordnen; 1.Auslagern ; taushe: ld hl,(en2) ; Zeiger laden ld bc,(en3) call adr1 ; Laenge holen push bc ; .. speichern ld de,(enadr) ; Endadresse laden ldir ; .. Text umspeichern ; ;EN1 suchen ; en1p: ld hl,(en3) ; Zeiger laden ld de,(en1) vergl1: ld a,(hl) and UPCASE ld b,a ld a,(de) and UPCASE cp b ; .. vergleichen ; ;Ergebnis (DE)-(HL) ; jr z,glei2 ; ^(EN1)=^(EN3) jr nc,wortge ; ^(EN1)>^(EN3) ; ;naechstes Wort suchen ; nwort2: ld hl,(enadr) ld de,(en1) ; /WEC/ or a xor a ; /WEC/ sbc hl,de ; Test ob Ende jr z,alles ; .. ja ld c,l ; .. Laenge laden ld b,h ; /WEC/ xor a ld l,e ld h,d cpir ; Textende finden ld (en1),hl ; .. fuer naechsten Zeiger jr en1p ; ;gleiche Worte ; glei2: cp NULL ; Test Ende oder Leerzeichen jr z,weit2 ; .. ja wei2: inc hl inc de jr vergl1 ; ;Entscheidung ob 00 oder 20 (Leerzeichen) ; weit2: ld a,(de) cp NULL jr z,nwort2 ; .. 00 cp (hl) jr z,wei2 ; .. Leerzeichen ; ;Stelle gefunden, verschieben ; wortge: ld hl,(en1) ; Zeiger laden ld bc,(en2) call adr1 ; Laenge holen ld de,(en3) ldir ; .. umkopieren ; ;zurueckholen ; pop bc ; Laenge holen ld hl,(enadr) ; .. und Startzeiger jr nvekt ; ;alles verschieben ; alles: ld hl,(enadr) ; Endadresse holen pop bc ; .. Laenge add hl,bc ; Zeiger auf Ende ld bc,(en2) call adr1 ; Laenge holen ld de,(en3) nvekt: ldir ; .. umkopieren ld hl,(en3) ; Zeiger laden push hl xor a nvekts: cp (hl) ; Ende finden inc hl jr nz,nvekts ld (en1),hl ; .. Zeiger speichern pop hl jp nwort ; ;Speicherplaetze ; stadr: dw 0 ;Enthaelt Adresse fuer Filebeginn ;weist auf 00H enadr: dw 0 ;Enthaelt Adresse fuer Fileende ;weist auf Speicherstelle hinter 00H en1: dw 0 en2: dw 0 en3: dw 0 end