home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
213a.lha
/
Sozobon-C
/
libfp
/
fpmul.s
< prev
next >
Wrap
Text File
|
1996-02-14
|
2KB
|
119 lines
* Copyright (c) 1988 by Sozobon, Limited. Author: Johann Ruegg
*
* Permission is granted to anyone to use this software for any purpose
* on any computer system, and to redistribute it freely, with the
* following restrictions:
* 1) No charge may be made other than reasonable charges for reproduction.
* 2) Modified versions must be clearly marked as such.
* 3) The authors are not responsible for any harmful consequences
* of using this software, even if they result from defects in it.
*
* fpmul
*
.globl _fpmult
.globl _fpmul
.globl fpmul
fpmul:
_fpmul:
_fpmult:
move.l d3,a1 * save d3
move.l 4(sp),d0
move.l 8(sp),d1
move.b d0,d2
beq ret0
move.b d1,d3
beq ret0
and.b #$7f,d0
and.b #$7f,d1
eor.b d2,d3
bpl mpos
* result negative
movem.l d4-d5,-(sp)
bsr _u_mul
movem.l (sp)+,d4-d5
tst.b d0
beq ret0
move.l a1,d3 * restore d3
or.b #$80,d0
rts
* result positive
mpos:
movem.l d4-d5,-(sp)
bsr _u_mul
movem.l (sp)+,d4-d5
move.l a1,d3 * restore d3
rts
ret0:
move.l a1,d3 * restore d3
clr.l d0
rts
_u_mul:
move.l d3,a2 * save d3
move.b d0,d2
add.b d1,d2
cmp.b #$40,d2
bls underfl
cmp.b #$bf,d2
bhi overfl
sub.b #$40,d2 * result exp
clr.b d0
clr.b d1
move.w d0,d3
mulu.w d1,d3
* clr.w d3 already 0 since low bytes 0
swap d3
move.w d0,d4
move.w d1,d5
swap d0
swap d1
mulu d0,d5
mulu d1,d4
add.l d3,d4 * no carry since d3 <= fe01 && d4 <= fffe0001
add.l d4,d5
bcc nocar
move.w #1,d5
bra t1
nocar:
clr.w d5
t1:
swap d5
mulu d1,d0
add.l d5,d0
bcc nocar2
roxr.l #1,d0
addq.b #1,d2
bmi overfl
bra norm
nocar2:
bmi norm
add.l d0,d0 * only need at most 1 shift since started norm AB
subq.b #1,d2
beq underfl
norm:
tst.b d0
bpl noround
add.l #$80,d0
bcc nocar3
roxr.l #1,d0
addq.b #1,d2
bmi overfl
nocar3:
noround:
move.l a2,d3 * restore d3
move.b d2,d0
rts
underfl:
move.l a2,d3 * restore d3
clr.l d0
rts
overfl:
move.l a2,d3 * restore d3
move.l #$ffffff7f,d0
rts