; ; General sort routine, in memory ; ; ; ; orig: org 0ab00h ; Chance this for dif loc n1 equ orig m1 equ n1+2 k1 equ m1+2 j1 equ k1+2 i1 equ j1+2 ml1 equ i1+2 dj1 equ ml1+2 di1 equ dj1+2 ; ds 16 ; ld hl,(j1) ; Get st adr push hl ; Save ld hl,(k1) ; Get length push hl ; Save div: xor a ; M1=m1/2 ld hl,(m1) ld a,h rra ld h,a ld a,l rra ld l,a ld (m1),hl ; Save new m1 ; or h ; Check if done jp nz,ndon pop bc ; Done, return pop de ret ; ; Set k1=n1-m1 ; ndon: ex de,hl ; M1 to de ld hl,(n1) ld a,l sub e ld l,a ld a,h sbc a,d ld h,a ld (k1),hl ; ld hl,1 ; Set & save i=j=1 ld (j1),hl ld (i1),hl ; ; Calc & save addr offset = m1*l1 ; dec l pop bc ; Len of str=l1 push bc lp1: add hl,de dec bc ld a,b or c jp nz,lp1 ld (ml1),hl ; ex de,hl ; Calc & save d(j), d(i), d(i+m) pop bc pop hl push hl push bc lp2: ld (dj1),hl ld (di1),hl ex de,hl add hl,de ex de,hl ; Hl has d(i), de has d(i+m> ; ; Compare strings & switch ; cp1: pop bc ; Len of string=l1 push bc lp3: ld a,(de) ; Compare ea byte sub (hl) jp nz,neq inc hl ; If = compare next byte inc de dec bc ld a,b or c jp nz,lp3 jp nsw ; If done, don' t switch ; neq: jp nc,nsw ; If d(i)k ; nsw: ld hl,(j1) inc hl ; Save new j=old j+1 ld (j1),hl ld (i1),hl ex de,hl ld hl,(k1) ld a,l sub e ld a,h sbc a,d jp c,div ; If j>k goto beginning divide m1 ; ; Calc new d(j), d(i) ; ld hl,(dj1) pop de push de add hl,de ; New d(j)=old d(j+1) ex de,hl ld hl,(ml1) ; Addr offset ex de,hl jp lp2 end