; Larsen-Algorithmus fuer die FWT
; Zilog Z80
; Olaf Hochmuth, 1986
Larsen: sub  a       ; A:=0
        call INIT    ; BC:=2^n
                     ; IX=IY:=Vektoranfang
        call LOG2    ; A:=n=ld(N)
        ld   d,01    ; D:=1
        ld   e,c
        srl  e
        srl  e       ; E:=2^n/4
L1:     push af
        ld   h,00    ; H:=K=0
L2:     ld   l,h     ; L:=I=K
L3:     ld   a,l
        add  a
        ld   lx,a    ; (IX):=S(I)
        ld   a,l
        add  d       ; J:=I+D
        add  a
        ld   ly,a    ; (IY):=S(J)
        bit  7,b
        jr   z,NORM
        ld   a,b
        and  e
INV:    call nz,NEGY ; (IY):=-(IY)
NORM:   call BFLY    ; (IX):=[(IX)+(IY)]/2
                     ; (IY):= (IX)-(IY)
        inc  b       ; B:=B+1
        ld   a,l
        add  d
        add  d
        ld   l,a     ; I:=I+D+D
        cp   c       ; I>=2^n ?
        jr   c,L3
        inc  h       ; K:=K+1
        ld   a,h
        cp   d       ; K>=D ?
        jr   c,L2
        sla  d       ; D:=D+D
        ld   b,80
        pop  af
        dec  a       ; N:=N+1, N=0 ?
        jr   nz,L1
        ret
        end