-
- FFT3R.ASM
- FFT3.ASM
- ASC2DEC.ASM
- BCD2DEC.ASM
;
; Fixer: FFT3R.ASM
;
; Procediment fft3r:near
;
; Parametres: bx = segment serie
; cx = M% on N=2^M
; ax = SIG
;
;===================================================================
;
eseg segment public 'data'
sig dw ?
m dw ?
l dd ?
dos dw 2
tpn dd ?
segi dw ?
eseg ends
;
; definim macros
;
des macro seg,index,segmi,reg
push index
sub reg,reg
shr index,1
rcl reg,1
add index,segmi
mov seg,index
shl reg,1
shl reg,1
shl reg,1
mov index,reg
endm
;
;
extrn fft3:near,sin_cos:near
public fft3r
.8087
;
cseg segment public 'code'
assume cs:cseg,es:eseg
;
fft3r proc near
;
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
mov dx,eseg
mov es,dx
;
mov es:m,cx ;salvem M%
mov es:sig,ax ;salvem SIG%
mov es:segi,bx ;salvem segment serie
;
;
cmp ax,1
je e2
jmp e3
e2: jmp ifftr
e3: cmp ax,?1
je fftr
;
error: jmp fi
;
fftr: dec cx
;
call fft3
;
; fem X(N/2)=X(0)
;
mov bx,es:segi
mov si,0
push ds
des ds,si,bx,ax
finit
fld dword ptr [si]
fld dword ptr [si+4]
pop si
mov cx,es:m
dec cx
mov si,1
shl si,cl ;si=N/2
dec si ;si=?1 per poder arribar si m=17
des ds,si,bx,ax
fstp dword ptr [si+12]
fstp dword ptr [si+8]
pop si
pop ds
;
call recons
;
; no dividim per 2 ni per N, ho fem al calcular l'espectre.
;
jmp fi
;
;
ifftr: call recons
;
mov cx,es:m
dec cx
;
call fft3
;
;
fi: pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
fft3r endp
;
;
;?------------------------------------------------------------
;
recons proc near
;
push ax
push bx
push cx
push si
push di
push bp
;
finit
fild word ptr es:dos
fldpi
fmul
fild word ptr es:m
fld1
fscale ;st=N
fxch
fstp st
fdiv ;st=TPN=2*PI/N
fstp dword ptr es:tpn
;
mov bx,es:segi
mov di,0 ;L=0
mov cx,es:m
sub cx,2
mov ax,1
shl ax,cl ;ax=N/4
mov bp,ax ;bp=N/4
shl ax,1 ;ax=N/2
;
mov word ptr es:l+2,0
push ds
;
r1: mov word ptr es:l,di
finit
fld dword ptr es:tpn
fild dword ptr es:l
fmul
call sin_cos
fild word ptr es:sig
fchs
fmulp st(2),st
;
mov si,ax
sub si,di ;si=N/2?L
sub si,1
push es
des ds,di,bx,cx
des es,si,bx,cx
;
fld dword ptr [di]
fld dword ptr [di+4]
fld dword ptr es:[si+8]
fld dword ptr es:[si+12]
;
fld st(3)
fld st
fmul st,st(6)
fsub
fld st(3)
fmul st,st(7)
fadd
fld st(2)
fadd st(1),st
fmul st,st(6)
fadd
fld st(1)
fmul st,st(7)
fadd
fstp dword ptr [di]
;
fld st(2)
fld st
fmul st,st(6)
fsub
fld st(4)
fmul st,st(7)
fsub
fld st(1)
fsub st(1),st
fmul st,st(6)
fsub
fld st(2)
fmul st,st(7)
fadd
fstp dword ptr [di+4]
;
fld st(3)
fld st
fmul st,st(6)
fadd
fld st(3)
fmul st,st(7)
fsub
fld st(2)
fadd st(1),st
fmul st,st(6)
fsub
fld st(1)
fmul st,st(7)
fsub
fstp dword ptr es:[si+8]
;
fld st(2)
fld st
fmul st,st(6)
fadd
fld st(4)
fmul st,st(7)
fadd
fld st(1)
fsub st(1),st
fmul st,st(6)
fadd
fld st(2)
fmul st,st(7)
fsub
fchs
fstp dword ptr es:[si+12]
;
pop si
pop di
pop es
;
;
cmp di,bp ;L>=N/4?
jae r2
inc di ;L=L+1
jmp r1
;
r2: pop ds
;
pop bp
pop di
pop si
pop cx
pop bx
pop ax
;
ret
recons endp
;
;
cseg ends
end
;
;
;
;
; Fixer: FFT3.ASM
;
; Procediment fft3:near
;
; Format: call fft3
;
; Funció: Calcula DFT (directa:SIG=?1 e inversa:SIG=1)
;
; Parametres: bx = segment serie entrada
; cx = M
; ax = SIG
;
;
;==================================================================
;
;
eseg segment public 'data'
mn dw ?
nd dd ?
nw dw ?
nm1 dw ?
nd2 dw ?
k dd ?
j dd ?
sig dw ?
segi dw ?
dos dw 2
nt dw 1,2,4,8,16,32,64,128,256,512,1024
dw 2048,4096,8192,16384,32768,0
eseg ends
;
;
; definim macros
;
swap macro x,y
des ds,x,dx,bp
des es,y,dx,bp
fld qword ptr [x]
fld qword ptr es:[y]
fstp qword ptr [x]
fstp qword ptr es:[y]
pop y
pop x
endm
;
des macro seg,index,segmi,reg
push index
dec index
sub reg,reg
shr index,1
rcl reg,1
add index,segmi
mov seg,index
shl reg,1
shl reg,1
shl reg,1
mov index,reg
endm
;
;
;
public fft3
.8087
extrn sin_cos:near
;
cseg segment public 'code'
assume cs:cseg,es:eseg
;
fft3 proc near
;
push ax
push bx
push cx
push dx
push di
push si
push bp
push ds
push es
mov dx,eseg
mov es,dx
;
mov es:mn,cx ;salvem M%
mov es:sig,ax ;salvem SIG%
mov es:segi,bx ;salvem segment serie
;
finit
fild word ptr es:mn ;st=M%
fld1 ;st=1.0
fscale ;st=N%=2^M%
fistp dword ptr es:nd ;salvem N%
;
mov bx,es:mn
shl bx,1
mov ax,es:[nt+bx]
mov es:nw,ax
sub ax,1
mov es:nm1,ax
sub bx,2
mov ax,es:[nt+bx]
mov es:nd2,ax
;
; Procedim a reordenar la matriu A
; mov cx,es:nm1
mov dx,es:segi
mov bx,es:nd2
;
finit
push ds
push es
;
mov si,1 ;si=1
sub di,di ;di=0
;
;
e2: inc di ;L=L+1
cmp di,si ;IF L>=J THEN 2
jae e3
swap di,si ;SWAP A(L),A(J)
;
e3: mov ax,bx
;
e4: cmp ax,si ;IF K>=J THEN 4
jae e5
sub si,ax ;J=J?K
shr ax,1 ;K=K/2
jmp e4 ;GOTO 3
;
e5: add si,ax ;J=J+K
cmp di,cx ;NEXT L
jb e2
;
e6: pop es
pop ds
;
; Hem acabat de reordenar
;
;
mov word ptr es:k+2,0
mov word ptr es:j+2,0
;
mov bx,es:segi
mov cx,1 ;R%=1
;
e8: mov ax,1
dec cx
shl ax,cl ;ax=RE%/2=2^(R%?1)
mov dx,ax ;dx=K%=RE%/2
mov word ptr es:k,dx ;salvem K%
shl ax,1 ;ax=RE%=2^R%
inc cx
mov bp,es:nw ;bp = N%
sub bp,ax ;bp = N%?RE%
;
finit
fldpi ;st=Ò
fild dword ptr es:k ;st=K%
fdiv ;st=Ò/K%
;
fld1 ;st=UR=1.0
fldz ;st=UI=0.0
;
;
push cx ;salvem contador R%
mov cx,1 ;cx=J%=1
e9: mov di,cx ;di=L%=J%
;
push ds
push es
push cx
;
e10: mov si,di
add si,dx ;si=LMK%=L%+K%
;
des ds,si,bx,cx ;desplaçament AR(LMK)
fld dword ptr [si] ;st=AR(LMK)
fld st ; " "
fld dword ptr [si+4] ;st=AI(LMK)
fld st ; " "
fmul st,st(4) ;st=AI(LMK)*UI
fxch ;st=AI(LMK)
fmul st,st(5) ;st=AI(LMK)*UR
fxch st(2) ;st=AR(LMK)
fmul st,st(4) ;st=AR(LMK)*UI
fxch st(3) ;st=AR(LMK)
fmul st,st(5) ;st=AR(LMK)*UR
fsubr ;st= TR
fxch st(2) ;st=AR(LMK)*UI
fadd ;st= TI
;
des es,di,bx,cx ;desplaçament AR(L)
fld dword ptr es:[di] ;st=AR(L)
fld st ; " "
fsub st,st(3) ;st=AR(L)?TR
fxch ;st=AR(L)
fadd st,st(3) ;st=AR(L)+TR
fstp dword ptr es:[di] ;salvem AR(L)
fstp dword ptr [si] ;salvem AR(LMK)
;
fld dword ptr es:[di+4] ;st=AI(L)
fld st ; " "
fsub st,st(2) ;st=AI(L)?TI
fxch ;st=AI(L)
fadd st,st(2) ;st=AI(L)+TI
fstp dword ptr es:[di+4] ;salvem AI(L)
fstp dword ptr [si+4] ;salvem AI(LMK)
;
fstp st ;st=TR
fstp st ;st=WI
;
pop di ;si = LMK%
pop si ;di = L%
;
cmp di,bp ;L%>N% ?
jae e11
add di,ax ;L%=L%+RE%
jmp e10
e11:
pop cx
pop es
pop ds
;
; calculem UI i UR
;
fstp st
fstp st
mov word ptr es:j,cx
fild dword ptr es:j
fmul st,st(1)
call sin_cos ;st=sin(JÒ/K%)
fild word ptr es:sig
fmul ;st=WI=sig*sin(JÒ/K%)
;
cmp cx,dx ;J%>K% ?
jae e12
inc cx
jmp e9
;
e12: pop cx ;restaurem R%
cmp cx,es:mn ;R%>M% ?
jae fi3
inc cx ;R%=R%+1
jmp e8
;
;
fi3: pop es
pop ds
pop bp
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
fft3 endp
;
cseg ends
end
;
;
; Fixer: ASC2DEC.ASM
;
; Procediment: asc2dec:far
;
; Format: lea ax,car
; push ax
; lea ax,ncar
; push ax
; lea ax,decimal
; push ax
; call asc2dec
;
;======================================================================
;
public asc2dec
;
cseg segment public 'code'
assume cs:cseg
;
asc2dec proc far
push bp
mov bp,sp
push ax
push bx
push cx
push dx
push si
push di
;
mov di,[bp+8]
mov ax,[di] ;ax = ncar
mov si,[bp+10] ;si apunta a car
mov dx,si ;dx també
; mov al,byte ptr [si]
; cmp al,'?'
; je neg add si,ax
sub si,1 ;si apunta a final car
mov di,[bp+6] ;di apunta a decimal
mov bx,di ;bx també
add di,18 ;di apunta a final decimal
;
e1: mov al,byte ptr [si]
cmp si,dx
je signe
mov byte ptr [di],al
dec si
dec di
jmp e1
;
signe: cmp al,'?'
je neg
cmp al,'+'
je pos
mov byte ptr [di],al
dec di
pos: mov byte ptr [bx],'+'
jmp e2
neg: mov byte ptr [bx],al
;
e2: cmp di,bx
je fi
mov byte ptr [di],'0'
dec di
jmp e2
;
fi: pop di
pop si
pop dx
pop cx
pop bx
pop ax
mov sp,bp
pop bp
ret 6
asc2dec endp
;
cseg ends
end
;
; Fixer: BCD2DEC.ASM
;
; Procediment: bcd2dec:far
;
; Format: lea ax,bcd
; push ax
; lea ax,decimal
; push ax
; call bcd2dec
;
;====================================================================
;
public bcd2dec
;
cseg segment public 'code'
assume cs:cseg
;
bcd2dec proc far
push bp
mov bp,sp
push ax
push si
push di
push cx
;
mov si,[bp+8] ;si apunta a bcd
mov di,[bp+6] ;di apunta a decimal
add di,18 ;di apunta a final decimal
mov cx,9
;
e1: mov al,byte ptr [si]
mov ah,al
and al,00001111b
and ah,11110000b
push cx
mov cl,4
shr ah,cl
pop cx
add al,30h
add ah,30h
mov byte ptr [di],al
dec di
mov byte ptr [di],ah
dec di
inc si
loop e1
;
mov al,byte ptr [si]
and al,10000000b
cmp al,10000000b
je neg
mov byte ptr [di],'+'
jmp fi
neg: mov byte ptr [di],'?'
;
fi: pop cx
pop di
pop si
pop ax
pop bp
ret 4
bcd2dec endp
;
cseg ends
end
|