;
; Fixer: SERESPEC.ASM
;
; Format: serespec <arx.e> <arx.s> <segm> <desp> <amp> <sav.i> <sav> <norm> <cent> [inici [fi]]
;
;
; es un procediment executable
;
;
;=====================================================================
; DADES
;=====================================================================
;
dseg segment public 'data'
;
psp dw ? ;segment del PSP
;
fbc1 db 37 dup(' ') ;fbc arxiu d'entrada
fbc2 db 37 dup(' ') ;fbc arxiu de sortida
;
op dw ?
nreg dw ?
lreg dw ?
regi dd ?
error db ?
maxreg dw 16368
incseg dw 4092
;
z01s dw ?
segfin dw ?
seges dw ?
segdts dw ?
;
pregin dd ? ;punters a registres
pregsv dd ?
cntsegm dw ?
;
; Capçalera general arxiu entrada
;
wie dd ?
wfe dd ?
dd 3 dup(?)
line dd ?
cole dd ?
uxes db 4 dup(?)
uxe dd ?
dd 6 dup(?)
arxsise db 12 dup(' ')
dd 1 dup(?)
diae dd ?
mese dd ?
aae dd ?
horae dd ?
horace dd ?
dd 6 dup(?)
;
; Capçalera general arxiu sortida
;
wi dd ? ;punter inicial funció
wf dd ? ;punter final funció
max dd ? ;valor maxim funció
min dd ? ;valor minim funció
tip db 'SESP' ;tipus funció
lin dd ?
col dd ?
uxs db 'Hz. '
ux dd ?
xi dd ?
uys db '¦S?¦'
uy dd ?
yi dd ?
linsup dd ?
colsup dd ?
arxsis db 12 dup(' ') ;nom arxiu .sis
nrmocnt dd ?
dia dd ?
mes dd ?
aa dd ?
hora dd ?
horac dd ?
dd 6 dup(0)
;
; Capçalera particular arxiu sortida
;
nomarx db 12 dup(' ')
segms dd ?
desp dd ?
amp dd ?
savin dd ?
inici dd ?
final dd ?
uhs db 'bits'
hmf dd ?
uxess db 4 dup(' ')
uxss dd ?
dd 17 dup(0)
;
nfe dd ? ;tamany funció entrada
nfa dd ? ; " " " actiu
segm dw ?
des dw ?
am dw ?
nor dw ?
cen dw ?
m dw ?
mz dw ?
sav dw ?
savi dw ?
ncolsup dw 8 ;colsup actives
sumf dt ? ;õf exacte.
;
; buffer per colsup
;
bcolsup dd 16 dup(?) ;maxim colsup
;
;
lonpar db ? ;longitut cadena parametres
param db 127 dup(' ') ;cadena parametres
;
npar dw ?
wpar dw 11 dup(0) ;punters a parametres
lpar dw 11 dup(0) ;longitut parametres
;
; Errors
;
err0 db "Error en parametres.",cr,lf,'$'
err1 db "Error: falten parametres.",cr,lf,'$'
err2 db "Error: mases parametres.",cr,lf,'$'
err3 db "Error: arxiu entrada no existeix.",cr,lf,'$'
err4 db "Error en l'accés a arxiu.",cr,lf,'$'
err5 db "Error: arxiu sortida ja existeix.",cr,lf,'$'
;
; Generals
sw87 dw ?
;
dos dw 2
cuatre dw 4
went dw ? ;enter 2 bytes (general)
dent dd ? ;enter 4 bytes o simple presició
bcd dt ? ;format decimal empaquetat
decimal db 19 dup('0') ;format decimal desempaquetat
txt db 128 dup(' ') ;area lliure texte
ntxt dw ? ;longitut texte
espais db 80 dup(' ')
linea db cr,lf,'$'
;
dseg ends
;
; EQUS
;
cr equ 0dh
lf equ 0ah
;
;===================================================================
; PILA
;===================================================================
;
pila segment stack
db 512 dup(0)
pila ends
;
;
;===================================================================
; MACROS
;===================================================================
;
;
if1
include mprinx.asm
include mconvert.asm
endif
;
;?------------------------------------------------------------
;
obrir macro fbc,error
push dx
push ax
lea dx,fbc
mov ax,0f00h
int 21h
mov byte ptr error,al
pop ax
pop dx
endm
;?------------------------------------------------------------
;
tancar macro fbc,error
push dx
push ax
lea dx,fbc
mov ax,1000h
int 21h
mov byte ptr error,al
pop ax
pop dx
endm
;?------------------------------------------------------------
;
crear macro fbc,error
push dx
push ax
lea dx,fbc
mov ax,1600h
int 21h
mov byte ptr error,al
pop ax
pop dx
endm
;?------------------------------------------------------------
;
setdta macro seg,des
push ds
push dx
push ax
mov ax,seg
mov ds,ax
mov dx,des
mov ah,1ah
int 21h
pop ax
pop dx
pop ds
endm
;?------------------------------------------------------------
;
arxiu macro fbc,op,lreg,nreg,regi,error
local grabar,llegir,err,fi
push cx
push ax
push dx
;
mov cx,nreg ;cx = numero de registres
;
mov ax,lreg
mov word ptr [fbc+14],ax ;definim tamany reg. al FBC
;
fild dword ptr regi ;cargem RI
fld1 ;reg.dos = reg.basic?1
fsub
fistp dword ptr [fbc+33] ;instalem RI al FBC
;
lea dx,fbc
mov ax,op ;ax = OP%
cmp ax,1
je grabar
cmp ax,2
je llegir
jmp err
;
grabar: mov ah,28h
int 21h
jmp fi
;
llegir: mov ah,27h
int 21h
jmp fi
;
err: mov al,4
;
fi: mov error,al
mov ah,0
pop dx
pop ax
pop cx
endm
;?------------------------------------------------------------
;
xent macro txt,ntxt,error
local x0,x1,err,fi
push ax
push cx
push si
;
mov cx,ntxt
mov si,0
;
mov al,byte ptr [txt]
cmp al,'+'
je x0
cmp al,'?'
je x0
jmp x1
;
x0: inc si
dec cx
;
x1: mov al,byte ptr [txt+si]
cmp al,30h
jb err
cmp al,39h
ja err
inc si
loop x1
mov byte ptr error,0
jmp fi
;
err: mov byte ptr error,1
;
fi: pop si
pop cx
pop ax
endm
;?------------------------------------------------------------
;
mout macro txt1,wtxt,ntxt,txt2
local m1,fi
push ax
push cx
push si
push di
mov cx,ntxt
jcxz fi
mov si,wtxt
mov di,0
;
m1: mov al,byte ptr [txt1+si]
mov byte ptr [txt2+di],al
inc si
inc di
loop m1
;
fi: pop di
pop si
pop cx
pop ax
endm
;?------------------------------------------------------------
;
desc 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
;?------------------------------------------------------------
;
desr macro seg,index,segmi,reg
push index
mov reg,index
shr index,1
shr index,1
add index,segmi
mov seg,index
and reg,00000011b
shl reg,1
shl reg,1
mov index,reg
endm
;
;
;
;=============================================================
; CODIG
;=============================================================
;
.8087
;
extrn dec2bcd:far,asc2dec:far,cos:near
extrn fft3r:near,borra:near,ealax:near,dec2asc:far,bcd2dec:far
;
cseg segment public 'code'
assume cs:cseg,ds:dseg,ss:pila
;
espec proc far
mov ax,dseg
mov ds,ax
mov psp,es
;
;= = = = PARAMETRES = = = = = = = = = = = = = = = = = = = = = =
;
sub cx,cx ;hi han parametres?
mov cl,es:80h
jcxz par0
jmp par1
;
par0: print err1
jmp fierror
;
; DETERMINEM PARAMETRES D'ENTRADA
;
par1: mov lonpar,cl
mov es,ax ;ES ?> DADES
mov ds,es:psp ;DS ?> PSP
cld
;
mov si,81h ;portem parametres a param
lea di,param
rep movsb
;
mov si,5ch ;montem fbc1
lea di,fbc1
mov cx,16
rep movsb
;
mov si,6ch ;montem fbc2
lea di,fbc2
mov cx,16
rep movsb
;
mov ax,es
mov ds,ax ;DS ?> DADES
;
; CALCULEM PUNTERS I LONGITUT DELS PARAMETRES
;
mov ax,0 ;numero de parametres trobats
mov si,0 ;punter a cadena param
mov dx,0 ;longitut del parametre
mov bx,0 ;punter a wpar i lpar
sub cx,cx
mov cl,lonpar
;
par2: cmp [param+si],' '
jne par3
inc si
cmp si,cx
jbe par2
mov npar,ax ;sortir: no hi han mes parametres
jmp par7
;
par3: inc ax
cmp ax,11
ja par6
mov [wpar+bx],si
;
par4: cmp [param+si],' '
jne par5
mov [lpar+bx],dx
mov dx,0
add bx,2
jmp par2
;
par5: inc si
inc dx
cmp si,126
ja par6
jmp par4
;
par6: print err2
jmp fierror
;
;
par7: mov ax,npar ;si npar<9 then error
; prinr ax
; printn espais 4
cmp ax,9
jae par11
print err1
jmp fierror
;
;
; OBRIM ARXIU D'ENTRADA I CARGEM PARAMETRES ARXIU
;
par11: obrir fbc1,error ;obrim arxiu entrada
cmp error,0
je par12
print err3
jmp fierror
;
par12: lea bx,wie ;situem la dta a wie...
setdta ds,bx
;
mov lreg,4 ;llegim wie,wfe,line,cole,uxe,arxsise
mov nreg,30
mov word ptr regi+2,0
mov word ptr regi,1
mov op,2
arxiu fbc1,op,lreg,nreg,regi,error
cmp error,0
je as0
print err4
jmp fierror
;
;???????????????????????????????????? montem arxsis
as0: lea di,arxsis
lea si,arxsise
mov bx,0
mov cx,6
;
as: mov ax,[si+bx]
mov [di+bx],ax
add bx,2
loop as
;
;???????????????????????????????????? pasem uxes i uxe
finit
fld dword ptr uxes
fstp dword ptr uxess
fld dword ptr uxe
fstp dword ptr uxss
;
;???????????????????????????????????? calculem nfe
finit
; fld dword ptr line ;comprobem line = 1
; fld1
; fcom
; fstsw word ptr sw87
; fwait
; mov ah,byte ptr sw87+1
; sahf
; je par14
; print err0
; jmp fierror
;
par14: fld dword ptr cole
fstp dword ptr nfe
finit
;
;???????????????????????????????????? determinem inici
pin1: cmp lpar+18,0
je pin2
mout param,wpar+18,lpar+18,txt
xent txt,lpar+18,error
cmp error,0
je pin3
print err0
jmp fierror
;
pin2: fld1
jmp pin5
;
pin3: dasc2ent txt,lpar+18,inici
fild dword ptr inici
ftst
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
ja pin4
print err0
jmp fierror
;
pin4: fcom dword ptr nfe
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe pin5
print err0
jmp fierror
;
pin5: fstp dword ptr inici
;
;???????????????????????????????????? determinem final
pfi1: cmp lpar+20,0
je pfi2
mout param,wpar+20,lpar+20,txt
xent txt,lpar+20,error
cmp error,0
je pfi3
print err0
jmp fierror
;
pfi2: fld dword ptr nfe
jmp pfi5
;
pfi3: dasc2ent txt,lpar+20,final
fild dword ptr final
fcom dword ptr nfe
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe pfi4
print err0
jmp fierror
;
pfi4: fcom dword ptr inici
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jae pfi5
print err0
jmp fierror
;
pfi5: fstp dword ptr final
;
;???????????????????????????????????? calculem nfa
nfa1: fld dword ptr final
fld dword ptr inici
fsub
fld1
fadd
fstp dword ptr nfa
;
;???????????????????????????????????? determinem segm
seg1: mout param,wpar+4,lpar+4,txt
xent txt,lpar+4,error
cmp error,0
je seg2
print err0
jmp fierror
;
seg2: wasc2ent txt,lpar+4,segm
prinmw segm
printn espais,4
cmp segm,0
ja seg4
fld dword ptr nfe
fistp word ptr segm
jmp m0
;
seg4: cmp segm,8
jge seg3
print err0
jmp fierror
;
seg3: finit
fld dword ptr nfa
fild word ptr segm
fcom
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe m0
print err0
jmp fierror
;
;???????????????????????????????????? calculem m
m0: finit
fild word ptr segm
fldz ;m=0
;
m1: fld1
fadd st(1),st ;st(1)=m=m+1
fscale ;st=1*2^m
fcom st(2)
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jae m2
fstp st
jmp m1
;
m2: fstp st
fistp word ptr m
fwait
prinmw m
printn espais,4
cmp m,14
jbe des1
print err0
jmp fierror
;
;???????????????????????????????????????? determinem desp
des1: mout param,wpar+6,lpar+6,txt
xent txt,lpar+6,error
cmp error,0
je des2
print err0
jmp fierror
;
des2: wasc2ent txt,lpar+6,des
prinmw des
printn espais,4
cmp des,0
jge des3
print err0
jmp fierror
;
des3: finit
fld dword ptr nfa
fild word ptr segm
fsub
fild word ptr des
fcom
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe am1
print err0
jmp fierror
;
;???????????????????????????????????????? determinem amp
am1: mout param,wpar+8,lpar+8,txt
xent txt,lpar+8,error
cmp error,0
je am2
print err0
jmp fierror
;
am2: wasc2ent txt,lpar+8,am
prinmw am
printn espais,4
cmp am,0
jge ma1
print err0
jmp fierror
;
;???????????????????????????????????????? calculem m ampliat
ma1: mov ax,m
add ax,am
mov m,ax
prinmw m
printn espais,4
cmp m,15
jbe svi1
print err0
jmp fierror
;
;????????????????????????????????????????? determinem savi
svi1: mout param,wpar+10,lpar+10,txt
xent txt,lpar+10,error
cmp error,0
je svi2
print err0
jmp fierror
;
svi2: wasc2ent txt,lpar+10,savi
prinmw savi
printn espais,4
cmp savi,1
jge svi3
print err0
jmp fierror
;
svi3: mov ax,1
mov cx,m
dec cx
shl ax,cl
cmp savi,ax
jb sav1
print err0
jmp fierror
;
;????????????????????????????????????????? determinem sav
sav1: mout param,wpar+12,lpar+12,txt
xent txt,lpar+12,error
cmp error,0
je sav2
print err0
jmp fierror
;
sav2: wasc2ent txt,lpar+12,sav
prinmw sav
printn espais,4
; cmp sav,1
; jg sav3
; print err0
; jmp fierror
;
sav3: mov bx,1
mov cx,m
dec cx
shl bx,cl ;bx = 2^(m?1)
sub bx,savi
inc bx
cmp sav,0
ja sav4
mov sav,bx ;sav = 2^(m?1) ? savi + 1
jmp nrm1
;
sav4: cmp sav,bx
jbe nrm1 ;sav <= 2^(m?1) ? savi + 1
print err0
jmp fierror
;
;????????????????????????????????????????? determinem norm
nrm1: mout param,wpar+14,lpar+14,txt
xent txt,lpar+14,error
cmp error,0
je nrm2
print err0
jmp fierror
;
nrm2: wasc2ent txt,lpar+14,nor
prinmw nor
printn espais,4
cmp nor,1
jbe cen1
print err0
jmp fierror
;
;????????????????????????????????????????? determinem cenx
cen1: mout param,wpar+16,lpar+16,txt
xent txt,lpar+16,error
cmp error,0
je cen2
print err0
jmp fierror
;
cen2: wasc2ent txt,lpar+16,cen
prinmw cen
printn espais,4
cmp cen,1
jbe st1
print err0
jmp fierror
;
;
;
;========== MONTEM SEGMENTS DE TREBALL =============
;
st1: mov ax,z01seg
mov z01s,ax
;
finit
fild word ptr m
fld1
fscale
fild word ptr cuatre
fdiv
frndint
fild word ptr dos
fadd
fild word ptr z01s
fadd
fistp word ptr segfin
;
fild word ptr segm
fild word ptr cuatre
fdiv
frndint
fild word ptr dos
fadd
fild word ptr segfin
fadd
fistp word ptr seges
;
fild word ptr sav
fild word ptr ncolsup
fadd
fild word ptr cuatre
fdiv
frndint
fild word ptr cuatre
fadd
fild word ptr seges
fadd
fistp word ptr segdts
;
; print linea
; prinmw z01s
; printn espais,4
; prinmw segfin
; printn espais,4
; prinmw seges
; printn espais,4
; prinmw segdts
; print linea
;
; =========== MONTEM FINESTRA HANNING ====================
;
mov cx,segm ;contador
mov es,segfin
mov di,0
;
finit
fild word ptr dos
fldpi
fild word ptr dos
fmul ;st = 2*pi
fild word ptr segm
fld1
fsub ;st = N?1
fdiv ;st = 2*pi/(N?1)
fldz ;st = k = 0
fld1
;
fh1: fld st(2)
fmul st,st(2)
call cos
fchs
fadd st,st(1) ;st = 1 ? cos
fdiv st,st(4)
fstp dword ptr es:[di]
fadd st(1),st ;k=k+1
add di,4
loop fh1
;
; ========== INICIALITZEM SEG <S> I (S) ==============
;
mov cx,sav
add cx,ncolsup ;afegir colsup
mov es,seges
mov di,0
;
mov ax,0
zes: mov es:[di],ax
add di,2
mov es:[di],ax
add di,2
loop zes
;
mov cx,sav
add cx,ncolsup ;afegir colsup
mov es,segdts
mov di,0
;
mov ax,0
zdts: mov es:[di],ax
add di,2
mov es:[di],ax
add di,2
loop zdts
;
; inicialitzem max
;
finit
fldz
fstp dword ptr max
;
;
; ========== CALCULEM WI, UX, XI,
;
finit
mov went,61 ;calculem wi
fild word ptr went
fstp dword ptr wi
;
fild word ptr m
fld1
fscale
fld dword ptr uxe
fmul
fld1
fdivr
fst dword ptr ux ;ux = 1/(2^m * uxe)
;
fild word ptr savi
fld1
fsub
fmul
fstp dword ptr xi ;xi = (savi?1) * ux
;
;
; ========== CREEM ARXIU DE SORTIDA ==========
;
obrir fbc2,error ;si existeix espectre error
cmp error,0
jne cr2
print err5
jmp fierror
;
cr2: crear fbc2,error ;crear arxiu espectre
cmp error,0
je ser0
print err4
jmp fierror
;
;
; ******************************
; COMENCEM EL PROCES DE SERIACIO
; ******************************
;
;
;
ser0: finit
fld dword ptr inici
fld1
fsub
fstp dword ptr pregin ;inicialitzem punters a registres
fldz
fstp dword ptr pregsv ;per llegir i grabar
;
mov cntsegm,0 ;inicialitzem contador segments
;
;
; =============== INICI DEL BUCLE ==================
;
ser1: finit ;comprobem si queden segments
fld dword ptr inici
fld1
fsub
fadd dword ptr nfa
fisub word ptr segm ;st = inici + nfa ? segm ? 1
fld dword ptr pregin
fcom
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe carg1
jmp ces1 ;hem acabat els segments
;
; ============= CARGEM SEGMENT ====================
;
carg1: add cntsegm,1 ;cntsegm = cntsegm + 1
;
mov dx,z01s ;situem la dta a z01s
mov bx,0
setdta dx,bx
;
mov lreg,4
mov ax,segm
mov nreg,ax
;
finit
fld dword ptr wie
fld dword ptr pregin
fadd
fistp dword ptr regi
;
mov op,2
arxiu fbc1,op,lreg,nreg,regi,error
cmp error,0
je carg2
print err4
jmp fierror
;
carg2: finit ;actualitzem pregin
fld dword ptr pregin
fild word ptr des
fadd
fstp dword ptr pregin
;
;
; =========== CALCULEM LA MITJA <Y> PER CENTRAR SEGMENT
;
mov cx,segm
mov es,z01s
mov di,0
;
finit
fldz
;
mt1: fld dword ptr es:[di]
fadd
add di,4
loop mt1
;
fst dword ptr [bcolsup+28] ;salvem sume per colsup
fild word ptr segm
fdiv ;st = <y>
;
; ============ CENTREM I MULTIPLIQUEM PER FINESTRA
;
mov cx,segm
mov di,0
push ds
mov ds,segfin
;
cif1: fld dword ptr es:[di]
fsub st,st(1)
fld dword ptr [di]
fmul ;multipliquem per finestra
fstp dword ptr es:[di]
add di,4
loop cif1
;
pop ds
;
; ============ AMPLIEM AMB ZEROS =================
;
;
cmp m,15
je amz1
mov ax,m
mov mz,ax
jmp amz4
;
amz1: mov ax,z01s ;borrem les 64k altes
add ax,4096
mov es,ax
;
mov di,0
mov ax,0
mov cx,32768
;
amz2: mov es:[di],ax
add di,2
loop amz2
mov mz,14
;
amz4: mov es,z01s ;borrem resto 64k baixes
mov ax,1
mov cx,mz
shl ax,cl
mov cx,ax ;cx=2^mz
mov di,segm
sub cx,di ;cx=num. falten borrar
jcxz esp1 ;no cal borrar
mov ax,0
shl di,1
shl di,1
;
amz5: mov es:[di],ax
add di,2
mov es:[di],ax
add di,2
loop amz5
;
;
; ========== CALCULEM ESPECTRE =============
;
esp1: mov bx,z01s
mov cx,m
mov ax,?1
;
call fft3r
;
; CALCULEM L'ESPECTRE I DIV. PER (2N)?
;
; Nota: ja no calculem l'element X(N/2)
; X(0) no el posem al segment i va a S0
;
mov ax,1
mov cx,m
dec cx ;cx = m?1
shl ax,cl
mov cx,ax
dec cx ;ja que no incluim X(0)
;
finit
fild word ptr m
fld1
fscale
fxch
fstp st
fild word ptr dos
fmul ;st=2*N
fmul st,st ;st=(2N)?
;
mov bx,z01s ;bx apunta al segment de dades
mov si,0 ;si apunta al primer element complexe
mov di,0 ;di apunta al primer element real
;
push ds
desc es,si,bx,ax ;fem X(0)=0 i guardem el valor a S0
desr ds,di,bx,ax
fldz
fstp dword ptr [di]
;
fld dword ptr es:[si]
fmul st,st
fld dword ptr es:[si+4]
fmul st,st
fadd
fdiv st,st(1)
pop di
pop si
;
pop ds
fstp dword ptr [bcolsup+8] ;S0 = X(0)
;
inc di
inc si
;
push ds
;
esp2: desc es,si,bx,ax
desr ds,di,bx,ax
fld dword ptr es:[si]
fmul st,st
fld dword ptr es:[si+4]
fmul st,st
fadd
fdiv st,st(1)
fstp dword ptr [di]
pop di
pop si
;
inc di
inc si
loop esp2
;
pop ds
;
; CALCULEM MAX, MIN, <f>, Õ(f), õf
;
; Õ(f) es la VARIANÇA de la frecuencia
;
espi: finit
fild word ptr savi ;i inicial
fld1
fsub ;i inicial = savi?1
fld dword ptr ux
fmul ;f inicial = (savi?1)*ux
fldz ;õf(i)
fldz ;õi?*f(i)
fldz ;õi*f(i)
fldz ;max
;
mov es,z01s ;bx apunta al segment de dades
mov di,savi ;di desplaçament al primer element real
dec di ;savi?1
mov cx,2
shl di,cl ;di = (savi?1)*4 = desp. de savi
;
mov cx,sav ;contador elements a salvar
;
esp3: fld dword ptr es:[di]
;
fld st ;calculem max.
fcom st(2)
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe esp4
fxch st(2)
;
esp4: fstp st ;calculem <f>,....
fadd st(4),st
fmul st,st(5) ;st = i * f(i)
fadd st(2),st
fmul st,st(5) ;st = i? * f(i)
fadd st(3),st
fstp st
fld dword ptr ux
faddp st(5),st ;x = x + ux
;
add di,4
loop esp3
;
; GUARDEM RESULTATS AL BUFFER BCOLSUP
;
fstp dword ptr bcolsup ;max.
fxch st(2)
fst dword ptr [bcolsup+12] ;õfi = sum
fld st
fstp tbyte ptr sumf ;õfi exacte
fdiv st(2),st
fdiv
fxch
fst dword ptr [bcolsup+16] ;<f>
fmul st,st ;st= <f>?
fsub ;st= <f?> ? <f>?
fstp dword ptr [bcolsup+20] ;Õ(f)
;
fldz
fstp dword ptr [bcolsup+4] ;min.
;
;
; ====== CALCULEM L'ENTROPIA I NORMALITZEM (si nor=1). =========
; CALCULEM <s> Õ(s) [segments]
;
; la linea <s> (primera linea suplementaria) es la mitja aritmetica de les
; columnes de totes les linees calculades (espectres)
;
; la linea Õ(s) (segona linea suplementaria) es la variança de les
; columnes de totes les linees calculades
;
; les columnes suplementaries d'aquestes dues linees, son la mitja i la
; variança de les columnes suplementaries de les linees calculades
;
;
mov es,z01s ;bx apunta al segment de dades
mov di,savi ;di apunta al primer element real
dec di ;savi?1
mov cx,2
shl di,cl ;di = (savi?1)*4 = desp. de savi
;
mov cx,sav ;contador elements a salvar
mov si,0 ;despl. segms <S> i (S)
;
finit
fldz ;H(f)
fld tbyte ptr sumf ;õf exacte
fld1
fld st(1)
fyl2x ;st=log2(õf)
;
ent3: fld dword ptr es:[di]
ftst
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
je ent4
;
fld1
fld st(1)
fyl2x
fsubr st,st(2) ;st=log2(õf)?log2(f)
;
fxch
cmp nor,0 ;normalitzem?
je ent3i
fdiv st,st(3) ;st = fi / õf
fst dword ptr es:[di] ;normalitzat
;
; calculem segments <s> i Õ(s)
;
ent3i: mov dx,es ;salvem es
mov es,seges ;montem segment <s>
fld dword ptr es:[si]
fadd st,st(1)
fstp dword ptr es:[si]
;
mov es,segdts ;montem segment Õ(s)
fld st
fmul st,st
fld dword ptr es:[si]
fadd
fstp dword ptr es:[si]
;
mov es,dx ;restaurem es
fxch
;
fmul ;calculem entropia
fadd st(3),st
;
ent4: fstp st
add si,4
add di,4
loop ent3
;
fstp st ;botem log2(õf)
cmp nor,1
je ent5
fdiv st(1),st
;
; guardem entropia al bufer bcolsup i normalizem max
;
ent5: cmp nor,0
je ent5i
fld dword ptr bcolsup ;normalizem max
fdiv st,st(1)
fstp dword ptr bcolsup
;
ent5i: fstp st ;botem õf
fstp dword ptr [bcolsup+24] ;entropia
;
; calculem maxg de tots els espectres
;
finit
fld dword ptr max
fld dword ptr bcolsup ;maxl
fcom
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe mg1
fxch
mg1: fstp st
fstp dword ptr max
;
;
; === CALCULEM ESTADISTICA DEL LES COLUMNES SUPLEMENTARIES a <s> i Õ(x) ====
;
; l'estadistica de les columnes suplementaries de cada espectre es guarda
; a les columnes suplementaries de les linees suplementaries
; la primera linea (<x>) té la mitja de les colsup i la segona (Õ(x)) te
; la variança de les colsup
;
mov cx,ncolsup
mov bx,sav
shl bx,1
shl bx,1 ;bx=desp. a colsup en segms es i dts
mov si,0 ;desp a bcolsup en DS
;
finit
;
est1: fld dword ptr [bcolsup+si]
;
mov dx,seges ;calculem la mitja
mov es,dx
fld dword ptr es:[bx]
fadd st,st(1)
fstp dword ptr es:[bx]
;
fld st ;calculem la desviavió tipica
fmul
mov dx,segdts
mov es,dx
fld dword ptr es:[bx]
fadd
fstp dword ptr es:[bx]
;
add bx,4
add si,4
loop est1
;
;
; ======= SALVEM L'ESPECTRE CALCULAT ================
;
gra1: mov dx,z01s ;situem la dta a z01s:savi
mov bx,savi
dec bx
shl bx,1
shl bx,1
setdta dx,bx
;
mov lreg,4
mov ax,sav
mov nreg,ax
;
gra2: finit
fld dword ptr wi
fld dword ptr pregsv
fadd
fistp dword ptr regi
;
mov op,1
arxiu fbc2,op,lreg,nreg,regi,error
cmp error,0
je gra3
print err4
jmp fierror
;
gra3: finit ;actualitzem pregsv + sav +ncolsup
fld dword ptr pregsv
fild word ptr sav
fadd
fstp dword ptr pregsv
;
; GRABEM COLSUP
;
lea bx,bcolsup ;situem la dta a ds:bcolsup
setdta ds,bx
;
mov lreg,4
mov ax,ncolsup
mov nreg,ax
;
finit
fld dword ptr wi
fld dword ptr pregsv
fadd
fistp dword ptr regi
;
mov op,1
arxiu fbc2,op,lreg,nreg,regi,error
cmp error,0
je gra4
print err4
jmp fierror
;
gra4: finit ;actualitzem pregsv + ncolsup
fld dword ptr pregsv
fild word ptr ncolsup
fadd
fstp dword ptr pregsv
;
; ******* TORNEM AL PRINCIPI DEL BUCLE **********
;
cmp des,0 ;si des=0, nomes fer un segment
je ces1
jmp ser1
;
; *******************************************************
;
;
; ======= CALCULEM <S> I Õ(S) =======
;
; acabem el calcul de les dues linees estadistiques globals
;
;
ces1: mov si,seges
mov di,segdts
mov bx,0
;
prinmw cntsegm
print linea
; printn fbc2,12
; print linea
;
finit
fild word ptr cntsegm
;
mov cx,sav
add cx,ncolsup
;
ces2: mov es,si ;<x> = õx/num.espectres
fld dword ptr es:[bx]
fdiv st,st(1)
fst dword ptr es:[bx]
;
mov es,di ;Õ(x) = (õx?/num.espectres ? <x>?)
fld dword ptr es:[bx]
fdiv st,st(2)
fxch
fmul st,st ;<x>?
fsub
fstp dword ptr es:[bx]
;
add bx,4
loop ces2
;
; calculem max de <s> i (s)
;
mov si,seges
mov di,segdts
mov bx,0
;
mov cx,sav
;
finit
fldz ;max (s)
fldz ;max <s>
;
ms1: mov es,si
fld dword ptr es:[bx]
fcom
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe ms2
fxch
ms2: fstp st
;
mov es,di
fld dword ptr es:[bx]
fcom st(2)
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe ms3
fxch st(2)
ms3: fstp st
;
add bx,4
loop ms1
;
mov es,si
fstp dword ptr es:[bx] ;a primer element de colsup de <e>
mov es,di
fstp dword ptr es:[bx] ;a primer element de colsup de (e)
;
;
; ========= CENTREM ELS ESPECTRES EN FREQUENCIA ==========
;
;
cmp cen,1
je cf1
;
finit ;no centrem
fld dword ptr pregsv ;pregin = pregsv
fstp dword ptr pregin
jmp graes1
;
cf1: mov cx,cntsegm ;contador segments
;
finit ;inicialitzem pregin
fldz
fstp dword ptr pregin
;
;
; ============= CARGEM ESPECTRE ====================
;
carge1: push cx
;
mov dx,z01s ;situem la dta a z01s
mov bx,0
setdta dx,bx
;
mov lreg,4
mov ax,sav
mov nreg,ax
;
finit
fld dword ptr wi
fld dword ptr pregin
fadd
fistp dword ptr regi
;
mov op,2
arxiu fbc2,op,lreg,nreg,regi,error
cmp error,0
je cent0
print err4
jmp fierror
;
; CENTREM
;
cent0: mov si,seges
mov di,z01s
mov bx,0
;
mov cx,sav
;
finit
;
cent1: mov es,si
fld dword ptr es:[bx]
mov es,di
fld dword ptr es:[bx]
fsubr
fstp dword ptr es:[bx]
;
add bx,4
loop cent1
;
; ======= SALVEM L'ESPECTRE CENTRAT ================
;
; la dta ja esta calculada
; i nreg,regi,lreg també
;
mov op,1
arxiu fbc2,op,lreg,nreg,regi,error
cmp error,0
je grae2
print err4
jmp fierror
;
grae2: finit ;actualitzem pregin
fld dword ptr pregin
fild word ptr sav
fadd
fild word ptr ncolsup
fadd
fstp dword ptr pregin
;
pop cx
dec cx
jcxz graes1
jmp carge1
;
;
; =========== SALVEM SEGMENTS <S> I Õ(S) =================
;
graes1:
; prinr ax
mov dx,seges ;situem la dta a seges
mov bx,0
setdta dx,bx
;
mov lreg,4
mov ax,sav
add ax,ncolsup
mov nreg,ax
;
finit
fld dword ptr wi
fld dword ptr pregin
fadd
fistp dword ptr regi
;
mov op,1
arxiu fbc2,op,lreg,nreg,regi,error
cmp error,0
je graes2
print err4
jmp fierror
;
graes2: finit ;actualitzem pregin
fld dword ptr pregin
fild word ptr sav
fadd
fild word ptr ncolsup
fadd
fstp dword ptr pregin
;
; GRABEM SEGMENT DTS
;
mov dx,segdts ;situem la dta a segdts
mov bx,0
setdta dx,bx
;
finit
fld dword ptr wi
fld dword ptr pregin
fadd
fistp dword ptr regi
;
mov op,1
arxiu fbc2,op,lreg,nreg,regi,error
cmp error,0
je grap1
print err4
jmp fierror
;
; ========= CALCULEM I GRABEM PARAMETRES DE CAPçALERA ========
;
grap1: finit ;calculem wf
fld dword ptr wi
fld dword ptr pregin
fadd
fild word ptr sav
fadd
fild word ptr ncolsup
fadd
fld1
fsub
fstp dword ptr wf
;
fldz ;calculem max,min i yi
fst dword ptr min
fstp dword ptr yi
;
fild word ptr cntsegm ;calculem lin
fstp dword ptr lin
;
fild word ptr sav ;calculem col
fstp dword ptr col
;
fild word ptr dos ;calculem linsup
fstp dword ptr linsup
;
fild word ptr ncolsup ;calculem colsup
fstp dword ptr colsup
;
fld1 ;calculem uy
fstp dword ptr uy
;
mov went,0 ;calculem nrmocnt
cmp nor,0
je cn
mov went,1
cn: cmp cen,0
je nr
add went,4
nr: fild word ptr went
fstp dword ptr nrmocnt
;
fld dword ptr diae
fstp dword ptr dia
;
fld dword ptr mese
fstp dword ptr mes
;
fld dword ptr aae
fstp dword ptr aa
;
fld dword ptr horae
fstp dword ptr hora
;
fld dword ptr horace
fstp dword ptr horac
;
narx0: mov cx,11 ;montem nomarx
lea si,fbc1
inc si
lea di,nomarx
mov bx,0
;
narx: mov al,byte ptr [si+bx]
mov byte ptr [di+bx],al
inc bx
loop narx
;
fild word ptr segm ;segm
fstp dword ptr segms
;
fild word ptr savi ;savi
fstp dword ptr savin
;
fild word ptr des ;desp
fstp dword ptr desp
;
fild word ptr am ;amp
fstp dword ptr amp
;
finit ;calculem hmf
fld1
fild word ptr sav
fyl2x
fstp dword ptr hmf
;
;
; ======== GRABEM LA CAPçALERA ===========
;
lea bx,wi ;situem la dta a ds:wi
setdta ds,bx
;
mov lreg,4
mov nreg,60
;
finit
fld1
fistp dword ptr regi
;
mov op,1
arxiu fbc2,op,lreg,nreg,regi,error
cmp error,0
je tanca1
print err4
jmp fierror
;
tanca1:
; printn fbc1,12
tancar fbc1,error ;tanquem arxiu entrada
cmp error,0
je tanca2
print err4
jmp fierror
;
tanca2: tancar fbc2,error ;tanquem arxiu sortida
cmp error,0
je fi
print err4
jmp fierror
;
;
;
fierror: mov al,1
mov ah,4ch
int 21h
;
fi: mov al,0
mov ah,4ch
int 21h
;
espec endp
;
;
;
;
;?------------------------------------------------------------
;
cseg ends
;
;
;
;===================================================================
; SEGMENTS PER AREA DE DADES I TREBALL 512Kb + 8 bytes
;===================================================================
;
z01seg segment 'extra'
dd 128 dup(?)
z01seg ends
;
;===================================================================
;
end espec
;
|