Biopsychology.org

English

Artículos Casos   Libros Apuntes Otros  

Análisis del Comportamiento Verbal Articulatorio en Conversaciones Grupales Espontáneas. E. Barrull, 1992. (esteban@biopsychology.org)

Atrás Arriba Siguiente

 

;
; 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
;

 

© Biopsychology.org, 1998-2006

 
Última actualización:
22/03/06