- BORRA.ASM
- COS.ASM
- DEC2ASC.ASM
- DEC2BCD.ASM
- DEUALAX.ASM
- EALAX.ASM
- ESPERA.ASM
- SI2M.ASM
SIN_COS.ASM
- SM2I.ASM
;
; Fixer: BORRA.ASM
;
; Borra una Matriu de N elements de simple presissió
;
; dins d'un mateix segment, es a dir: 0 ? N ? 16384
;
; Format: mov ax,segm
; push ax
; mov ax,desp
; push ax
; mov ax,N
; push ax
; call borra
;
;===================================================================
;
;
.8087
public borra
cseg segment public 'code'
assume cs:cseg
borra proc near
push bp
mov bp,sp
;
push ax
push cx
push si
push ds
;
mov ax,[bp+8]
mov ds,ax ;ds=segm Matriu
mov si,[bp+6] ;di=desp Matriu respectre segm
;
mov cx,[bp+4] ;cx=N%
;
fldz ;cargem 0.0
;
ll: fst dword ptr [si]
add si,4
loop ll
;
fstp st ;botem 0.0
;
fi: pop ds
pop si
pop cx
pop ax
pop bp
ret 6
borra endp
;
cseg ends
end
;
; Fixer: COS.ASM
;
; Procediment: cos
;
; Funció: Calcula st = cos(st)
;
; Format: call cos
;
; Es una subrutina (NEAR) per esser incluida en una llibreria
;
; necessita 3 posicions de la pila87 lliures a mes de st=argument
;
; al entrar st=argument
; al sortir st=cos(argument)
;
;===================================================================
; st = argument =========? st = cos(argument)
;===================================================================
;
eseg segment public 'data'
menos2 dw ?2
sw87 dw ?
eseg ends
;
.8087
public cos
;
cseg segment public 'code'
assume cs:cseg,es:eseg
cos proc near
co equ 2
;
push ax
push es
mov ax,eseg
mov es,ax
;
fabs
fild word ptr es:menos2 ;st = ?2
fldpi ;st = pi
fscale ;st = pi*2^?2 = pi/4
;
fxch
fstp st ;eliminem ?2
fxch ;st = argument
;
co2: fprem ;0 ? argument <st(1) = pi/4
fstsw word ptr es:sw87
fwait
mov ah,byte ptr es:sw87+1
sahf
jpe co2
fxch
fstp st ;eliminem pi/4
;
fptan ;st = X , st(1) = Y
;
jnc co3 ;salta si cuadrants 0,1,2,3
fchs ;cambiem els signes d'X i Y
fxch
fchs
fxch
;
co3: jnz co4 ;salta si cuadrants 0,1,4,5
fxch
fchs
;
co4: test ah,co ;salta si cuadrants 0,2,4,6
jz co5
fld st
fld st(2)
fadd
fxch st(2)
fsub
;
co5:
fld st
fmul st,st
fxch st(2)
fmul st,st
fadd st,st(2)
fsqrt
;
fdiv
;
fxch
fstp st ;eliminem X^2
;
pop es
pop ax
ret
cos endp
;
;
;====================================================================
;
cseg ends
end
;
;
;
; Fixer: DEC2ASC.ASM
;
; Procediment: dec2asc:far
;
; Format: lea ax,decimal
; push ax
; lea ax,car
; push ax
; lea ax,ncar
; push ax
; call dec2asc
;
;===================================================================
;
public dec2asc
;
cseg segment public 'code'
assume cs:cseg
;
dec2asc proc far
push bp
mov bp,sp
push ax
push bx
push dx
push si
push di
;
mov si,[bp+10] ;si apunta a decimal
mov dx,si
add dx,19 ;dx apunta a final decimal+1
mov di,[bp+8] ;di apunta a car
mov bx,[bp+6] ;bx apunta a ncar
mov al,byte ptr [si]
add si,1
cmp al,'+'
je e1
mov byte ptr [di],al
inc di
;
e1: mov al,byte ptr [si]
cmp al,'0'
jne e2
inc si
cmp si,dx
je cero
jmp e1
;
e2: mov byte ptr [di],al
inc di
inc si
cmp si,dx
je fi
mov al,byte ptr [si]
jmp e2
;
cero: mov byte ptr [di],'0'
inc di
;
fi: mov ax,[bp+8] ;ax apunta a inici car
sub di,ax ;di = num caracters
mov word ptr [bx],di ;ncar = di
pop di
pop si
pop dx
pop bx
pop ax
mov sp,bp
pop bp
ret 6
dec2asc endp
;
cseg ends
end
;
; Fixer: DEC2BCD.ASM
;
; Procediment: dec2bcd:far
;
; Format: lea ax,decimal
; push ax
; lea ax,bcd
; push ax
; call dec2bcd
;
;=======================================================================
;
public dec2bcd
;
cseg segment public 'code'
assume cs:cseg
;
dec2bcd proc far
push bp
mov bp,sp
push ax
push si
push di
push cx
;
mov si,[bp+6] ;si apunta a bcd
mov di,[bp+8] ;di apunta a decimal
add di,18 ;di apunta a final decimal
mov cx,9
;
e1: mov al,byte ptr [di]
sub al,30h
mov ah,al
dec di
mov al,byte ptr [di]
sub al,30h
push cx
mov cl,4
shl al,cl
pop cx
add ah,al
mov byte ptr [si],ah
dec di
inc si
loop e1
;
mov al,byte ptr [di]
cmp al,'?'
je neg
mov byte ptr [si],0
jmp fi
neg: mov byte ptr [si],10000000b
;
fi: pop cx
pop di
pop si
pop ax
pop bp
ret 4
dec2bcd endp
;
cseg ends
end
;
; FIXER: DEUALAX.ASM
;
; Esta preparat per esser montat desde una llibreria
;
; Calcula 10^X en simple precisió
;
; X esta es st i es necessiten 2 posicions lliures en la pila87
;
;===================================================================
; st = X ====? st = 10^X
;===================================================================
;
.8087
extrn dosalax:near
public deualax
cseg segment public 'code'
assume cs:cseg
;
deualax proc near
fldl2t
fmul
call dosalax
ret
deualax endp
;
cseg ends
end
;
;
; FIXER: EALAX.ASM
;
; Esta preparat per esser montat desde una llibreria
;
; Calcula e^X en simple precisió
;
; X esta es st i es necessiten 2 posicions lliures en la pila87
;
;===================================================================
; st = X ====? st = e^X
;===================================================================
;
.8087
extrn dosalax:near
public ealax
cseg segment public 'code'
assume cs:cseg
;
ealax proc near
fldl2e
fmul
call dosalax
ret
ealax endp
;
cseg ends
end
;
;
; Fixer: ESPERA.ASM
;
; Procediment: espera
;
; Espera a que es pulsi qualsevol tecla per continuar.
; Es equivalent a 30 IF INKEY$="" THEN 30 de BASIC
;
; Es una subrutina FAR per esser incluida en una llibreria
; Nomes pot esser usada per un procediment .EXE o .COM
;
; Format d'us:
; extrn espera:far
;
; call espera ;dins del segment de codig del programa
;
;
public espera
cseg segment public 'code'
assume cs:cseg
espera proc far
push ax
mov ah,0
int 16h ;funció BIOS
pop ax
ret
espera endp
;
cseg ends
end
;
;
; Fixer: SI2M.ASM
;
; * SI2M Converteix una matriu A de numeros de simple presissió en format INTEL, en
; la matriu A en format MICROSOFT.
;
; * Format: push segm d'A
; push desp d'A
; push dimensió d'A
; call si2m
;
;
;?------------------------------------------------------------
;
public si2m
;
cseg segment public 'code'
assume cs:cseg
;
si2m proc far
push bp
mov bp,sp
;
push ax
push cx
push dx
push si
push di
push ds
;
; recollim arguments de la pila
;
mov cx,[bp+6] ;cx = dimensió
mov si,[bp+8] ;si = desp.
mov ax,[bp+10] ;ds = segm.
mov ds,ax
;
;
lin2: mov dx,[si+2]
mov ah,dh
and ah,80h
shl dh,1
test dl,80h
jz e21
or dh,1
e21: cmp dh,0
je zero2
add dh,(129?127)
and dl,7fh
or dl,ah
mov [si+2],dx ;guardem paraula alta convertida
jmp e22
zero2: mov word ptr [si],0
mov word ptr [si+2],0
e22: add si,4 ;si apunta a nou element_linees
loop lin2 ;tanquem bucle
;
; retornem al modul principal
;
fi: pop ds
pop di
pop si
pop dx
pop cx
pop ax
;
mov sp,bp
pop bp
ret 6
si2m endp
;
cseg ends
end
;
; FIXER: SIN_COS.ASM
;
; PROCEDIMENT: sin_cos
;
; Es una subrutina NEAR per esser montada desde una llibreria
;
; al entrar st=argument
; al sortir st=sin(argument) i st(1)=cos(argument)
;
; necessita 3 posicions lliures de pila87 a més del argument en st
;
; necessita les seguents posicions en memoria:
;
;==================================================================
; st = argument =====? st = sin(arg) , st(1) = cos(arg)
;==================================================================
;
eseg segment public 'data'
menos2 dw ?2
sw87 dw ?
eseg ends
;
.8087
public sin_cos
;
cseg segment public 'code'
assume cs:cseg,es:eseg
;
sin_cos proc near
s_c equ 2
push bx
push ax
push es
mov ax,eseg
mov es,ax
;
mov bx,0 ;0 significa positiu
ftst
fstsw word ptr es:sw87
fwait
mov ah,byte ptr es:sw87+1
sahf
jnc s_c1
mov bx,?1
fabs
;
s_c1: fild word ptr es:menos2
fldpi
fscale
fxch
fstp st ;eliminem ?2
fxch
;
s_c2: fprem
fstsw word ptr es:sw87
fwait
mov ah,byte ptr es:sw87+1
sahf
jpe s_c2
fxch
fstp st ;eliminem pi/4
;
fptan
;
jnc s_c3 ;salta si cuadrants 0,1,2,3
fchs
fxch
fchs
fxch
;
s_c3: jnz s_c4 ;salta si cuadrants 0,1,4,5
fxch
fchs
;
s_c4: test ah,s_c ;salta si cuadrants 0,2,4,6
jz s_c5
fld st
fld st(2)
fadd
fxch st(2)
fsub
;
s_c5:
; fxch ;st= Y ? st(1)= X
fld st
fmul st,st
fld st(2)
fmul st,st
fadd
fsqrt ;st = ?(Y^2+X^2)
;
fdiv st(2),st ;st(2)=cosinus
fdiv ;st=sinus i st(1)=cosinus
fxch
cmp bx,0
je s_c6
fchs
;
s_c6: pop es
pop ax
pop bx
ret
sin_cos endp
;
;
cseg ends
end
;
;
; Fixer: SM2I.ASM
;
; * SM2I Converteix la matriu A de numeros (simple presissió) en format
; MICROSOFT,
; en la matriu A en format INTEL.
;
; * Format: push segm d'A
; push desp d'A
; push dimensió d'A
; call sm2i
;
;?------------------------------------------------------------
;
public sm2i
;
cseg segment public 'code'
assume cs:cseg
;
sm2i proc far
push bp
mov bp,sp
push ax
push cx
push dx
push si
push ds
;
; recollim arguments
;
mov cx,[bp+6]
mov si,[bp+8]
mov ax,[bp+10]
mov ds,ax
;
lin1: mov dx,[si+2]
mov ah,dl
and ah,80h
sub dh,(129?127)
jbe zero1
shr dh,1
jc e11
and dl,7fh
jmp e12
e11: or dl,80h
e12: and dh,7fh
or dh,ah
mov [si+2],dx
jmp e13
zero1: mov word ptr [si],0
mov word ptr [si+2],0
e13: add si,4
loop lin1
;
; retornem al modul principal
;
fi: pop ds
pop si
pop dx
pop cx
pop ax
mov sp,bp
pop bp
ret 6
sm2i endp
;
cseg ends
end
-
-
|