;Schnelle Sortierroutine fuer Z-80 ;mit Beruecksichtigung von ;Gross- und Kleinachreibung ; ;H.Voelz 3.1.85 ; ;HL:=BC, BC:=HL-BC ADR1: PUSH BC OR A SBC HL,BC PUSH HL POP BC POP HL RET ; ;Hier ist Start ; SORT: LD HL,(ENADR) LD (EN1),HL DEC HL XOR A EN2SU: DEC HL CP (HL) JR NZ,EN2SU INC HL NWORT: LD (EN2),HL XOR A PUSH HL LD DE,(STADR) OR A SBC HL,DE POP HL RET Z DEC HL EN3SU: DEC HL CP (HL) JR NZ,EN3SU INC HL LD (EN3),HL ;Vergleichen LD HL,(EN2) LD DE,(EN3) VERGL: LD A,(HL) AND 5FH LD B,A LD A,(DE) AND 5FH CP B ;Ergebnis (DE)-(HL) JR Z,GLEICH VERGL2: JR NC,TAUSHE ;(DE)>(HL) ;naechstes Wort NWOR: LD HL,(EN2) LD (EN1),HL LD HL,(EN3) JR NWORT ;gleiche Worte GLEICH: CP 0 JR Z,WEITER WEIT: INC HL INC DE JR VERGL ;Entscheidung bei 00 bzw. 20 WEITER: LD A,(DE) CP 0 JR Z,NWOR CP (HL) JR Z,WEIT ;Umordnen; 1.Auslagern TAUSHE: LD HL,(EN2) LD BC,(EN3) CALL ADR1 PUSH BC ;fuer spaeter LD DE,(ENADR) LDIR ;EN1 suchen EN1P: LD HL,(EN3) LD DE,(EN1) VERGL1: LD A,(HL) AND 5FH LD B,A LD A,(DE) AND 5FH CP B ;Ergebnis (DE)-(HL) JR Z,GLEI2 JR NC,WORTGE ;(EN1)>(EN3) ;naechstes Wort suchen NWORT2: LD HL,(ENADR) LD DE,(EN1) OR A SBC HL,DE JR Z,ALLES PUSH HL POP BC ;Laenge XOR A PUSH DE POP HL CPIR LD (EN1),HL JR EN1P ;gleiche Worte GLEI2: CP 0 JR Z,WEIT2 WEI2: INC HL INC DE JR VERGL1 ;Entscheidung ob 00 oder 20 WEIT2: LD A,(DE) CP 0 JR Z,NWORT2 CP (HL) JR Z,WEI2 ;Stelle gefunden, verschieben WORTGE: LD HL,(EN1) LD BC,(EN2) CALL ADR1 LD DE,(EN3) LDIR ;zurueckholen POP BC LD HL,(ENADR) JR NVEKT ;alles verschieben ALLES: LD HL,(ENADR) POP BC ADD HL,BC LD BC,(EN2) CALL ADR1 LD DE,(EN3) NVEKT: LDIR LD HL,(EN3) PUSH HL XOR A NVEKTS: CP (HL) INC HL JR NZ,NVEKTS LD (EN1),HL POP HL JP NWORT ; ;Speicherplaetze ; STADR: DEFW 0 ;Enthaelt Adresse fuer Filebeginn ;weist auf 00H ENADR: DEFW 0 ;Enthaelt Adresse fuer Fileende ;weist auf Speicherstelle hinter 00H EN1: DEFW 0 EN2: DEFW 0 EN3: DEFW 0 END