home *** CD-ROM | disk | FTP | other *** search
- ; Static Name Aliases
- ;
- TITLE mulm
-
- include qhead.asm
-
- _DATA SEGMENT
- temp DW NQ+2 DUP (?)
- _DATA ENDS
-
- _TEXT SEGMENT
-
- ; Multiply mantissa of x by mantissa of y, result to y
- ; subm( x, y )
- PUBLIC _mulm
- _mulm PROC NEAR
- push bp
- mov bp,sp
- push si
- push di
- push ax
- push bx
- push cx
- push dx
- push es
-
- push ds
- pop es
-
- ; temp area for the product
- lea bx,temp
- ; clear the temp area
- xor ax,ax
- mov di,bx
- mov cx,NQ+2
- rep stosw
-
- mov si,WORD PTR [bp+4] ;source
- mov di,WORD PTR [bp+6] ;dest
-
- xor cx,cx ; for adc 0
-
- hh = OMG-1
-
- rept OMG-1
-
- g = 0
- h = hh
- rept (hh+1)/2
- if g LE OMG-2
- if h LE OMG-2
- zmul g,h
- zmul h,g
- endif
- endif
- g = g+1
- h = h-1
- endm
-
- if g EQ h
- zmul g,g
- endif
-
- hh = hh-1
-
- endm
-
- zmul 0,0
-
- mulnorm:
-
- call mdnorm
-
- mov si,bx
- add si,4
- add di,4
- mov cx,OMG
- rep movsw
-
-
- pop es
- pop dx
- pop cx
- pop bx
- pop ax
- pop di
- pop si
- pop bp
- ret
- _mulm ENDP
-
-
-
- ; Source has at most 16 significant bits
-
- PUBLIC _mulin
- _mulin PROC NEAR
- push bp
- mov bp,sp
- push si
- push di
- push ax
- push bx
- push cx
- push dx
- push es
-
- push ds
- pop es
-
- ; temp area
- lea bx,temp
- ; clear the temp area
- xor ax,ax
- mov di,bx
- mov cx,NQ+2
- rep stosw
-
- mov si,WORD PTR [bp+4] ;source
- mov di,WORD PTR [bp+6] ;dest
-
- xor cx,cx ; for adc 0
-
-
- h = OMG-2
-
- rept OMG-1
- zmul h,0
- h = h-1
- endm
-
- jmp mulnorm
-
- _mulin ENDP
-
-
-
- ; normalize and round off
- ; enter with source = bx, dest = di
-
- PUBLIC mdnorm
- mdnorm PROC NEAR
-
- mov cx,3
- $normlp:
- test word ptr [bx]+6,08000H
- jnz $round
-
- ; shift up 1 bit and decrement exponent
- g = NQ+NQ
- clc
- rept OMG
- rcl word ptr [bx]+g,1
- g = g-2
- endm
- sub word ptr [di]+2,1
- loop $normlp
-
- $round:
-
-
- ; round off
- g = NQ+NQ
- test word ptr [bx]+g,08000H
- jnz $doround
- jmp $done
-
- $doround:
- xor cx,cx
- g = NQ+NQ-2
- add word ptr [bx]+g,1
- rept OMG-1
- g = g-2
- adc word ptr [bx]+g,cx
- endm
-
- ; check for overflow on rounding up
- test word ptr [bx]+4,0FFFFH
- jz $done
-
- ; shift down 1 bit and increment exponent
- g = 4
- clc
- rept OMG
- rcr word ptr [bx]+g,1
- g = g+2
- endm
- add word ptr [di]+2,1
-
-
- $done:
- ret
- mdnorm ENDP
-
- _TEXT ENDS
- END
-