;
;
; Fixer: CAADI.ASM
;
; Format: CAADI <arx.sis> <arx.sort.> <canal>
; <periode de mostreig> <mostres d'integració>
; <segments> <hora.inici> <dia> <mes> <any>
; <segons.referencia>
;
; periode mostreig en nanoseg.
; periode integració en núm. de mostres
; 1 segment = 1024 mostres integrades
; <hora.inici> temps en segons, en que s'ha de començar
; la conversió. (el relotje es especificat per 'time')
;
; integra el valor absolut de la mostra
;
; es un procediment executable
;
;
;======================================================
; DADES
;======================================================
;
dseg segment public 'data'
;
psp dw ? ;segment del PSP
;
fbc1 db 37 dup(0) ;fbc arxiu de sortida
;
; bloc de variables per subrutina arxiu
;
op dw ? ;variables per arxiu
nreg dw ?
lreg dw ?
regi dd ?
error db ?
maxreg dw 16368
incseg dw 4092 ;16368*4/16
;
; 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 'STI ' ;tipus: serie temporal integrada
lin dd ?
col dd ?
uxs db 'seg.'
ux dd ? ;periode mostra funció d'entrada.
xi dd ?
uys db 'å¦x¦'
uy dd ?
yi dd ?
linsup dd ?
colsup dd ?
arxsis db 12 dup(' ')
nrmocnt dd ?
diaa dd ?
mesa dd ?
anya dd ?
horaa dd ?
horac dd ?
dd 6 dup(0) ;fins a reg=30
;
; Capçalera particular arxiu sortida
;
minta dd ? ; mostres d'integració
per dd ? ; periode del registre
ufs db 'Hz. ' ; unitat de freqüencia
frm dd ? ; freqüencia de mostreig
fri dd ? ; freqüencia d'integració
ex dd ? ; <t>
vx dd ? ; D(t) (desviació típica)
ey dd ? ; <E>
vy dd ? ; D(E) (desviació típica)
sume dd ? ; sum(E)
tespa dd ? ; temps.espera en segons
;
dd 9 dup(0) ;fins a reg = 50
;
;
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
;
can dw ?
perm dw ?
mint dw ?
mos dw ?
tesp dw ?
dia dw ?
mes dw ?
any dw ?
hora dd ?
;
mseg dw 1024
iseg dw 256 ;1024*4/16
nfs dd ?
ualamsis db 0BDh,37h,86h,35h ;1e?6 format intel.
;
txt1 db "Pulsa qualsevol tecla per iniciar.",cr,lf,'$'
txt2 db "Fi de conversio.",cr,lf,'$'
txt3 db "Convertin.",cr,lf,'$'
;
txt4 db "Canal : $"
txt5 db "Periode de mostreig : $"
txt6 db "Mostres a integrar : $"
txt7 db "Segments : $"
txtt db ":$"
cure db 27,'[9D$'
;
; Errors
;
err0 db "Error: en parametres.",cr,lf,'$'
err1 db "Error: falten parametres.",cr,lf,'$'
err2 db "Error: sobren parametres.",cr,lf,'$'
err4 db "Error en acces a arxiu.",cr,lf,'$'
err5 db "Error: arxiu de sortida ja existeix.",cr,lf,'$'
;
; Generals
;
sw87 dw ?
;
dos dw 2
bcd dt ? ;format decimal empaquetat
decimal db 19 dup('0') ;format decimal desempaquetat
txt db 100 dup(' ') ;area lliure texte
ntxt dw ? ;longitut texte
linea db lf,cr,'$'
espais db 79 dup(' ')
went dw ? ;enter 2 bytes (general)
dent dd ? ;enter 4 bytes o simple presició
;
segm dw ? ;parametres de si2m i sm2i
desp dw ?
dim dw ?
;
z01s dw ?
;
dseg ends
;
;
cr equ 0dh
lf equ 0ah
;
;======================================================
; PILA
;======================================================
;
pila segment stack
db 512 dup(0)
pila ends
;
;
;======================================================
; MACROS
;======================================================
;
outm macro port,valor ;port i valor son inmediats
push ax
push dx
mov dx,port
mov al,valor
out dx,al
pop dx
pop ax
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
;?------------------------------------------------------------
;
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
;?------------------------------------------------------------
if1
include mprinx.asm
include mconvert.asm
endif
;
;======================================================
; CODIG
;======================================================
;
.8087
;
extrn si2m:far,sm2i:far,dec2bcd:far,asc2dec:far,deualax:near
extrn bcd2dec:far,dec2asc:far,espera:far
;
cseg segment public 'code'
assume cs:cseg,ds:dseg,ss:pila
;
caadi proc far
mov ax,dseg
mov ds,ax
mov psp,es
finit
;
;== = = = PARAMETRES = = = = = = = = = = = = = = = = = = = = =
;
sub cx,cx ;hi han parametres?
mov cl,es:80h
jcxz par0
jmp par1
;
par0: print err1
jmp fierr
;
; 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 arxsis
inc si ;saltem l'unitat
lea di,arxsis
mov cx,11 ; 8+3
rep movsb
;
mov si,6ch ;montem fbc1
lea di,fbc1
mov cx,16
rep movsb
;
mov ax,es
mov ds,ax ;DS ?> DADES
;
printn arxsis,11
print linea
;
;?????????????????????????????????????????????????????????????
; 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 par8
;
par3: inc ax
cmp ax,11
ja par5
mov [wpar+bx],si
;
par4: cmp [param+si],' '
jne par6
mov [lpar+bx],dx
mov dx,0
add bx,2
jmp par2
;
par5: print err2
jmp fierr
;
par6: inc si
inc dx
cmp si,126
ja par5
jmp par4
;
;?????????????????????????????????????????? 11 parametres minim
par8: mov ax,npar
cmp ax,11
jae can1
print err1
jmp fierr
;
;????????????????????????????????????????????? det. canal
can1: mout param,wpar+4,lpar+4,txt
xent txt,lpar+4,error
cmp error,0
je can2
print err0
jmp fierr
;
can2: wasc2ent txt,lpar+4,can
cmp can,0
jae can3
print err0
jmp fierr
;
can3: cmp can,15
jbe perm1
print err0
jmp fierr
;
;????????????????????????????????????????????? det. periode de mostreig
perm1: mout param,wpar+6,lpar+6,txt
xent txt,lpar+6,error
cmp error,0
je perm2
print err0
jmp fierr
;
perm2: wasc2ent txt,lpar+6,perm
cmp perm,40
ja perm3
print err0
jmp fierr
;
perm3: cmp perm,65535
jbe mint1
print err0
jmp fierr
;
;?????????????????????????????????????????? det. mostres d'integració
mint1: mout param,wpar+8,lpar+8,txt
xent txt,lpar+8,error
cmp error,0
je mint2
print err0
jmp fierr
;
mint2: wasc2ent txt,lpar+8,mint
cmp mint,0
ja per1
print err0
jmp fierr
;
;??????????????????????????? det. periodes en seg. i freq. en Hz.
per1: finit
fld dword ptr ualamsis
;
fild word ptr perm ;perm=(perm * 1e?6) seg.
fmul
fld st
fld1 ;frm=(1/perm) Hz.
fdivr
fstp dword ptr frm
;
fild word ptr mint ;ux=(perm * mint) seg.
fst dword ptr minta
fmul
fst dword ptr ux
fld1 ;fri=(1/ux) Hz.
fdivr
fstp dword ptr fri
;
;????????????????????????????????????????????? det. segments
mos1: mout param,wpar+10,lpar+10,txt
xent txt,lpar+10,error
cmp error,0
je mos2
print err0
jmp fierr
;
mos2: wasc2ent txt,lpar+10,mos
cmp mos,1
jae mos3
print err0
jmp fierr
;
mos3: cmp mos,128
jbe cnfs
print err0
jmp fierr
;
cnfs: finit ; obtenim nfs
fild word ptr mos
fild word ptr mseg
fmul
fistp dword ptr nfs
;
;????????????????????????????????????????????? det. temps d'espera
mout param,wpar+12,lpar+12,txt
xent txt,lpar+12,error
cmp error,0
je tesp1
print err0
jmp fierr
;
tesp1: wasc2ent txt,lpar+12,tesp
;
;????????????????????????????????????????????? det. dia
mout param,wpar+14,lpar+14,txt
xent txt,lpar+14,error
cmp error,0
je dia1
print err0
jmp fierr
;
dia1: wasc2ent txt,lpar+14,dia
;
;????????????????????????????????????????????? det. mes
mout param,wpar+16,lpar+16,txt
xent txt,lpar+16,error
cmp error,0
je mes1
print err0
jmp fierr
;
mes1: wasc2ent txt,lpar+16,mes
;
;????????????????????????????????????????????? det. any
mout param,wpar+18,lpar+18,txt
xent txt,lpar+18,error
cmp error,0
je any1
print err0
jmp fierr
;
any1: wasc2ent txt,lpar+18,any
;
;????????????????????????????????????????????? det. seg.ref
mout param,wpar+20,lpar+20,txt
xent txt,lpar+20,error
cmp error,0
je hora1
print err0
jmp fierr
;
hora1: dasc2ent txt,lpar+20,hora
;
;????????????????????????????????????? imprimim can,per,fri,mos
pr1: print txt4
prinmw can
print linea
print txt5
prinmw perm
print linea
print txt6
prinmw mint
print linea
print txt7
prinmw mos
print linea
prinmw tesp
print linea
prinmw dia
printn espais,4
prinmw mes
printn espais,4
prinmw any
printn espais,4
prinmd hora
print linea
;
;??????????????????????????????????????????? error si ext. arx. sortida
obs: obrir fbc1,error
cmp error,0
jne crs
print err5
jmp fierr
;
;????????????????????????????????????????????? crear arxiu sortida
crs: crear fbc1,error
cmp error,0
je z
print err4
jmp fierr
;
;????????????????????????????????????????????? z01s
z: mov ax,z01seg
mov z01s,ax
;
;
; ********* PROCEDIM A L'ENTRADA DE DADES *******************
;
cmp tesp,0
ja esp0
print txt1
call espera
jmp conv
;
esp0: finit
mov went,1092
fild word ptr went
mov went,60
fild word ptr went
fdiv ; st = 18.2 (1092/60)
fild word ptr tesp
push es
mov ax,40h
mov es,ax
mov si,6Ch ;temps a 0040:006C
;
esp1:
call printhora
;
fild dword ptr es:[si]
fdiv st,st(2)
fcomp
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jb esp1
;
pop es
call printhora
print linea
;
conv:
print txt3
;
;?????????????????????????????????????????????????????????????????
outm 223h,74h ;periode de mostreig
outm 221h,2
outm 221h,0
;
outm 223h,0B4h
mov dx,222h
mov al,byte ptr perm
out dx,al
mov al,byte ptr perm+1
out dx,al
;?????????????????????????????????????????????????????????????????
mov dx,22Ah ;canal
mov al,byte ptr can
out dx,al
;?????????????????????????????????????????????????????????????????
mov cx,mos ;contador segments
mov es,mint ;es = mint
;
push ds
mov ds,z01s ;situem segment inicial
;?????????????????????????????????????????????????????????????????
mov dx,225h ;def. port d'entrada alt
;?????????????????????????????????????????????????????????????????
outm 22Bh,2 ;modo = 2: iniciem mostreig
;?????????????????????????????????????????????????????????????????
fic: in al,dx ;lectura ficticia
cmp ah,64
jae fic
dec dx
in al,dx
inc dx
;
;?????????????????????????????????????????????????????????????????
;
l1: push cx ;salvem cont. segments
mov cx,1024 ;num. elements per segment
sub di,di
;
;
l2: mov bp,cx ;salvem contador elements
mov cx,es ;cx = mint
;
sub si,si ;borrem acumulador baix (si)
mov bx,si ;borrem acumulador alt (bx)
;
l3: in al,dx ;entrem nova mostra a ax
cmp al,64
jae l3
mov ah,al
dec dx
in al,dx
inc dx
;
cmp ax,8192
jb neg ;16 o 4
sub ax,8192 ;4
jmp suma ;15
;
neg: sub ax,8192 ;4
neg ax ;3
;
suma: add si,ax
adc bl,bh ; bh = 0
;
loop l3
;
mov word ptr [di],si ;salvem acumulador baix
add di,2
mov word ptr [di],bx ;salvem acumulador alt
add di,2
;
mov cx,bp ;restaurem contador elements
loop l2
;
mov ax,ds
add ax,256 ;ds=ds+(1024*4/16)
mov ds,ax
;
pop cx ;cx = segments
loop l1
;
outm 22Bh,1 ;modo = 1:parem el mostreig
;
cnt1: pop ds
;
print txt2
;
;================================================================
;
; calculem MAX , EY , VY , EX , VX i convertim en S.P.
;
finit
fldz ;vx
fldz ;ex
fldz ;vy
fldz ;ey
fldz ;ti = 0
fldz ;max.
;
mov es,z01s
mov cx,mos
mov di,0
;
cn0: push cx
mov cx,1024
;
sum: fild dword ptr es:[di]
fst dword ptr es:[di] ;salvem en S.P.
fadd st(3),st
fld st
fmul st,st
faddp st(5),st
fld st
fmul st,st(3)
fadd st(6),st
fmul st,st(3)
faddp st(7),st
fld1
faddp st(3),st ;t = t+1
;
mx: fcom
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
jbe cn3
fxch
;
cn3: fstp st add di,4
loop sum
;
mov ax,es
add ax,256
mov es,ax
mov di,0
pop cx
loop cn0
;
fstp dword ptr max
fstp st ;botem t
;
fst dword ptr sume
;
fdiv st(2),st
fdiv st(3),st
;
fild dword ptr nfs
fdiv st(2),st
fdiv
fst dword ptr ey
fmul st,st
fsub
fabs
fsqrt
fstp dword ptr vy
;
fld dword ptr ux
fmul st(2),st
fmul st(2),st
fmul
fst dword ptr ex
fmul st,st
fsub
fabs
fsqrt
fstp dword ptr vx
;
;
;
; PROCEDIM A LA DETERMINACIO DELS PARAMETRES DE SORTIDA
;
gra1: finit
mov went,51 ;determinem wi de sortida
fild word ptr went
fst dword ptr wi
fild dword ptr nfs
fadd
fld1
fsub
fstp dword ptr wf
;
;
; PROCEDIM A LA GRABACIó DE LA FUNCIó DE SORTIDA
;
finit
fld dword ptr wi
fild word ptr maxreg
fild dword ptr nfs
;
mov lreg,4 ;def. longitut registres
mov op,1
mov dx,z01s ;dx = segment dta
;
par27: mov bx,0
setdta dx,bx
;
fcom ;determinem nreg
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
ja par28
fistp word ptr nreg
fldz
jmp par29
par28: mov ax,maxreg
mov nreg,ax
fsub st,st(1)
;
par29: fxch st(2)
fist dword ptr regi
;
; mov cx,nreg ;convertim a MICROSOFT
; msi2m dx,bx,cx
;
arxiu fbc1,op,lreg,nreg,regi,error
cmp error,0
je par30
print err4
jmp fierr
;
par30: fxch st(2)
ftst
fstsw word ptr sw87
fwait
mov ah,byte ptr sw87+1
sahf
je gra4
fxch st(2)
fadd st,st(1)
fxch st(2)
mov ax,incseg
add dx,ax
jmp par27
;
;
; PROCEDIM A LA GRABACIO DELS PARAMETRES DE SORTIDA
;
gra4: finit
fldz
fst dword ptr min
fst dword ptr linsup
fst dword ptr colsup
fst dword ptr xi
fst dword ptr yi
fstp dword ptr nrmocnt
;
fild dword ptr nfs
fst dword ptr col
;
fld dword ptr ux
fmul
fstp dword ptr per ;per = col * ux
;
fld1
fst dword ptr lin
fstp dword ptr uy
;
fild word ptr tesp
fst dword ptr horac
fstp dword ptr tespa
;
fild word ptr dia
fstp dword ptr diaa
;
fild word ptr mes
fstp dword ptr mesa
;
fild word ptr any
fstp dword ptr anya
;
fild dword ptr hora
fiadd word ptr tesp
fstp dword ptr horaa
;
lea bx,wi ;situem la dta a wi.....
setdta ds,bx
;
mov lreg,4 ;grabem capçalera
mov nreg,50
mov word ptr regi+2,0
mov word ptr regi,1
mov op,1
arxiu fbc1,op,lreg,nreg,regi,error
cmp error,0
je tnc1
print err4
jmp fierr
;
tnc1: mov al,0
tancar fbc1,error ;tanquem arxiu sortida
cmp error,0
je fi
print err4
jmp fierr
;
fierr: mov al,1
;
fi: mov ah,4ch
int 21h
caadi endp
;
;
printhora proc near
;
lea dx,cure
mov ah,9
int 21h
;
mov ah,2Ch ;imprimim temps
int 21h
mov ax,0
; locate 1,50
mov al,ch ; print hora
prinr ax
print txtt
mov al,cl ; print minuts
prinr ax
print txtt
mov al,dh ; print segons
prinr ax
;
printn espais,2
;
ret
printhora endp
;
;
cseg ends
;
;
z01seg segment 'extra'
dd 8192 dup(?)
z01seg ends
;
end caadi
|