Don_Adan |
01 February 2012 14:53 |
1 Attachment(s)
Here is mathffp.library source.
Code:
; Resourced version of mathffp.library (40.1) from Amiga ROM 3.1 for Amiga68k ROM 1.0
; For easy recognition all changes are done using lower cases and ";" signs
; Original code is removed with ";" signs
; New code is added using lower cases only
; We made it...
; OS Group: Bryce Nesbitt, Michael Sinz, Peter Cherna, Darren Greenwald, Randell Jesup, Jerry Horanoff
; GFX: Allan Havemose, Bart 'Kodiak' Whitebook, Spence Shanson, Steve Beats, Chris Green, Ray Brand, Jim Barkley
; Special Projects: Eric Cotton, Martin Hunt, Bill Koester, Martin Taillefer, Brian Jackson, Kaori Kuwata, David Junod, Palmyra Pawlik, Kevin Klop
; NET: Brian Jackson, Greg Miller, Kenneth Dyke
; GUI: Peter Cherna, Martin Taillefer, David Junod, Kaori Kuwata
; Others: Andy Finkel, Dale 'Duck' Luck, Jim 'Jimm' Mackraz, Jeff Porter, Carolyn Scheppner, David Haynie,
; Lauren Brown, CATS (Commodore Amiga Technical Support), QA (Quality Assurance), SA (Software Assurance)
; Thanks to: Bill Hawes, Software Distillery
; Better than ever.
;lbC040944 ILLEGAL
; dc.l lbC040944
; dc.l lbC040DE0
; dc.l $80280988
; dc.l mathffplibrar.MSG
; dc.l mathffp401163.MSG
; dc.l lbL040988
;mathffplibrar.MSG dc.b 'mathffp.library',0
;mathffp401163.MSG dc.b 'mathffp 40.1 (16.3.93)',$D,$A,0
; dc.b 0
;lbL040988 dc.l $22
; dc.l lbW0409C8
; dc.l lbW040998
; dc.l 0
;lbW040998 dc.w $A008
; dc.w $900
; dc.w $800A
; dc.l mathffplibrar.MSG
; dc.l $A00E0600
; dc.l $90140028
; dc.l $90160001
; dc.w $8018
; dc.l mathffp401163.MSG
; dc.w 0
;lbC0409B6 ADDQ.W #1,$20(A6)
; MOVE.L A6,D0
; RTS
;lbC0409BE SUBQ.W #1,$20(A6)
;lbC0409C2 MOVEQ #0,D0
; RTS
; dc.w 0
;lbW0409C8 dc.w $FFFF
; dc.w lbC0409B6-lbW0409C8
; dc.w lbC0409BE-lbW0409C8
; dc.w lbC0409C2-lbW0409C8
; dc.w lbC0409C2-lbW0409C8
; dc.w lbC0409EC-lbW0409C8
; dc.w lbC040A40-lbW0409C8
; dc.w lbC040A78-lbW0409C8
; dc.w lbC040AB4-lbW0409C8
; dc.w lbC040ADC-lbW0409C8
; dc.w lbC040AE2-lbW0409C8
; dc.w lbC040B06-lbW0409C8
; dc.w lbC040AEC-lbW0409C8
; dc.w lbC040BFC-lbW0409C8
; dc.w lbC040CC4-lbW0409C8
; dc.w lbC040D46-lbW0409C8
; dc.w lbC040D3C-lbW0409C8
; dc.w $FFFF
;lbC0409EC MOVE.B D0,D1
; BMI.S lbC040A14
; BEQ.S lbC040A04
; CLR.B D0
; SUB.B #$41,D1
; BMI.S lbC040A10
; SUB.B #$1F,D1
; BPL.S lbC040A06
; NEG.B D1
; LSR.L D1,D0
;lbC040A04 RTS
;lbC040A06 MOVEQ #-1,D0
; LSR.L #1,D0
; ORI.B #2,CCR
; RTS
;lbC040A10 MOVEQ #0,D0
; RTS
;lbC040A14 CLR.B D0
; SUB.B #$C1,D1
; BMI.S lbC040A10
; SUB.B #$1F,D1
; BPL.S lbC040A2A
; NEG.B D1
; LSR.L D1,D0
; NEG.L D0
; RTS
;lbC040A2A BNE.S lbC040A32
; NEG.L D0
; TST.L D0
; BMI.S lbC040A04
;lbC040A32 MOVEQ #0,D0
; BSET #$1F,D0
; ORI.B #2,CCR
; RTS
; dc.w 0
;lbC040A40 MOVEQ #$5F,D1
; TST.L D0
; BEQ.S lbC040A76
; BPL.S lbC040A50
; MOVEQ #-$20,D1
; NEG.L D0
; BVS.S lbC040A74
; SUBQ.B #1,D1
;lbC040A50 CMP.L #$7FFF,D0
; BHI.S lbC040A5E
; SWAP D0
; SUB.B #$10,D1
;lbC040A5E ADD.L D0,D0
; DBMI D1,lbC040A5E
; TST.B D0
; BPL.S lbC040A74
; ADD.L #$100,D0
; BCC.S lbC040A74
; ROXR.L #1,D0
; ADDQ.B #1,D1
;lbC040A74 MOVE.B D1,D0
;lbC040A76 RTS
;lbC040A78 TST.B D1
; BPL.S lbC040A88
; TST.B D0
; BPL.S lbC040A88
; CMP.B D0,D1
; BNE.S lbC040A8E
; CMP.L D0,D1
; BRA.S lbC040A8E
;lbC040A88 CMP.B D1,D0
; BNE.S lbC040A8E
; CMP.L D1,D0
;lbC040A8E MOVEM.L A6,-(SP)
; MOVEA.L 4,A6
; JSR -$210(A6)
; MOVEA.L (SP)+,A6
; MOVE.W D0,D1
; MOVEQ #0,D0
; MOVE.W D1,CCR
; BLT.S lbC040AAE
; BGT.S lbC040AAA
; BRA.S lbC040AB0
;lbC040AAA SUBQ.L #1,D0
; BRA.S lbC040AB0
;lbC040AAE ADDQ.L #1,D0
;lbC040AB0 MOVE.W D1,CCR
; RTS
;lbC040AB4 TST.B D1
; MOVEM.L A6,-(SP)
; MOVEA.L 4,A6
; JSR -$210(A6)
; MOVEA.L (SP)+,A6
; MOVE.W D0,D1
; MOVEQ #0,D0
; MOVE.W D1,CCR
; BLT.S lbC040AD2
; BGT.S lbC040AD6
; BRA.S lbC040AD8
;lbC040AD2 SUBQ.L #1,D0
; BRA.S lbC040AD8
;lbC040AD6 ADDQ.L #1,D0
;lbC040AD8 MOVE.W D1,CCR
; RTS
;lbC040ADC ANDI.B #$7F,D0
; RTS
;lbC040AE2 TST.B D0
; BEQ.S lbC040AEA
; EORI.B #$80,D0
;lbC040AEA RTS
;lbC040AEC MOVEM.L D3-D5,-(SP)
; MOVE.B D1,D4
; BEQ.S lbC040B5A
; EORI.B #$80,D4
; BMI.L lbC040B80
; MOVE.B D0,D5
; BMI.L lbC040B86
; BNE.S lbC040B16
; BRA.S lbC040B50
;lbC040B06 MOVEM.L D3-D5,-(SP)
; MOVE.B D1,D4
; BMI.S lbC040B80
; BEQ.S lbC040B5A
; MOVE.B D0,D5
; BMI.S lbC040B86
; BEQ.S lbC040B50
;lbC040B16 SUB.B D4,D5
; BMI.S lbC040B62
; MOVE.B D0,D4
; CMP.B #$18,D5
; BCC.S lbC040B5A
; MOVE.L D1,D3
; CLR.B D3
; LSR.L D5,D3
; MOVE.B #$80,D0
; ADD.L D3,D0
; BCS.S lbC040B38
;lbC040B30 MOVE.B D4,D0
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040B38 ROXR.L #1,D0
; ADDQ.B #1,D4
; BVS.S lbC040B40
; BCC.S lbC040B30
;lbC040B40 MOVEQ #-1,D0
; SUBQ.B #1,D4
; MOVE.B D4,D0
; ORI.B #2,CCR
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040B50 MOVE.L D1,D0
; MOVE.B D4,D0
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040B5A TST.B D0
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040B62 CMP.B #$E8,D5
; BLE.S lbC040B50
; NEG.B D5
; MOVE.L D1,D3
; CLR.B D0
; LSR.L D5,D0
; MOVE.B #$80,D3
; ADD.L D3,D0
; BCS.S lbC040B38
; MOVE.B D4,D0
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040B80 MOVE.B D0,D5
; BMI.S lbC040B16
; BEQ.S lbC040B50
;lbC040B86 MOVEQ #-$80,D3
; EOR.B D3,D5
; SUB.B D4,D5
; BEQ.S lbC040BE8
; BMI.S lbC040BD4
; CMP.B #$18,D5
; BCC.S lbC040B5A
; MOVE.B D0,D4
; MOVE.B D3,D0
; MOVE.L D1,D3
;lbC040B9C CLR.B D3
; LSR.L D5,D3
; SUB.L D3,D0
; BMI.S lbC040B30
;lbC040BA4 MOVE.B D4,D5
;lbC040BA6 CLR.B D0
; SUBQ.B #1,D4
; CMP.L #$7FFF,D0
; BHI.S lbC040BB8
; SWAP D0
; SUB.B #$10,D4
;lbC040BB8 ADD.L D0,D0
; DBMI D4,lbC040BB8
; EOR.B D4,D5
; BMI.S lbC040BCC
; MOVE.B D4,D0
; BEQ.S lbC040BCC
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040BCC MOVEQ #0,D0
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040BD4 CMP.B #$E8,D5
; BLE.L lbC040B50
; NEG.B D5
; MOVE.L D0,D3
; MOVE.L D1,D0
; MOVE.B #$80,D0
; BRA.S lbC040B9C
;lbC040BE8 MOVE.B D0,D5
; EXG D5,D4
; MOVE.B D1,D0
; SUB.L D1,D0
; BEQ.S lbC040BCC
; BPL.S lbC040BA4
; NEG.L D0
; MOVE.B D5,D4
; BRA.S lbC040BA6
; dc.w 0
;lbC040BFC MOVEM.L D3-D5,-(SP)
; MOVE.B D0,D5
; BEQ.S lbC040C56
; MOVE.B D1,D4
; BEQ.S lbC040C78
; ADD.W D5,D5
; ADD.W D4,D4
; MOVEQ #-$80,D3
; EOR.B D3,D4
; EOR.B D3,D5
; ADD.B D4,D5
; BVS.S lbC040C80
; MOVE.B D3,D4
; EOR.W D4,D5
; ROR.W #1,D5
; SWAP D5
; MOVE.W D1,D5
; CLR.B D0
; CLR.B D5
; MOVE.W D5,D4
; MULU.W D0,D4
; SWAP D4
; MOVE.L D0,D3
; SWAP D3
; MULU.W D5,D3
; ADD.L D3,D4
; SWAP D1
; MOVE.L D1,D3
; MULU.W D0,D3
; ADD.L D3,D4
; CLR.W D4
; ADDX.B D4,D4
; SWAP D4
; SWAP D0
; MULU.W D1,D0
; SWAP D1
; SWAP D5
; ADD.L D4,D0
; BPL.S lbC040C5C
; ADD.L #$80,D0
; MOVE.B D5,D0
; BEQ.S lbC040C78
;lbC040C56 MOVEM.L (SP)+,D3-D5
; RTS
;lbC040C5C SUBQ.B #1,D5
; BVS.S lbC040C78
; BCS.S lbC040C78
; MOVEQ #$40,D4
; ADD.L D4,D0
; ADD.L D0,D0
; BCC.S lbC040C6E
; ROXR.L #1,D0
; ADDQ.B #1,D5
;lbC040C6E MOVE.B D5,D0
; BEQ.S lbC040C78
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040C78 MOVEQ #0,D0
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040C80 BPL.S lbC040C78
; EOR.B D1,D0
; OR.L #$FFFFFF7F,D0
; TST.B D0
; ORI.B #2,CCR
; MOVEM.L (SP)+,D3-D5
; RTS
; dc.w 0
;lbC040C98 DIVU.W #0,D0
; TST.L D1
; BNE.S lbC040CC4
;lbC040CA0 OR.L #$FFFFFF7F,D0
; TST.B D0
; ORI.B #2,CCR
;lbC040CAC MOVEM.L (SP)+,D3-D5
; RTS
;lbC040CB2 SWAP D1
; SWAP D0
;lbC040CB6 EOR.B D1,D0
; BRA.S lbC040CA0
;lbC040CBA BMI.S lbC040CB6
;lbC040CBC MOVEQ #0,D0
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040CC4 MOVEM.L D3-D5,-(SP)
; MOVE.B D1,D5
; BEQ.S lbC040C98
; MOVE.L D0,D4
; BEQ.S lbC040CAC
; MOVEQ #-$80,D3
; ADD.W D5,D5
; ADD.W D4,D4
; EOR.B D3,D5
; EOR.B D3,D4
; SUB.B D5,D4
; BVS.S lbC040CBA
; CLR.B D0
; SWAP D0
; SWAP D1
; CMP.W D1,D0
; BMI.S lbC040CEE
; ADDQ.B #2,D4
; BVS.S lbC040CB2
; ROR.L #1,D0
;lbC040CEE SWAP D0
; MOVE.B D3,D5
; EOR.W D5,D4
; LSR.W #1,D4
; MOVE.L D0,D3
; DIVU.W D1,D3
; MOVE.W D3,D5
; MULU.W D1,D3
; SUB.L D3,D0
; SWAP D0
; SWAP D1
; MOVE.W D1,D3
; CLR.B D3
; MULU.W D5,D3
; SUB.L D3,D0
; BCC.S lbC040D14
;lbC040D0E SUBQ.W #1,D5
; ADD.L D1,D0
; BCC.S lbC040D0E
;lbC040D14 MOVE.L D1,D3
; SWAP D3
; CLR.W D0
; DIVU.W D3,D0
; SWAP D5
; BMI.S lbC040D28
; MOVE.W D0,D5
; ADD.L D5,D5
; SUBQ.B #1,D4
; MOVE.W D5,D0
;lbC040D28 MOVE.W D0,D5
; ADD.L #$80,D5
; MOVE.L D5,D0
; MOVE.B D4,D0
; BEQ.S lbC040CBC
; MOVEM.L (SP)+,D3-D5
; RTS
;lbC040D3C BSR.L lbC040AE2
; BSR.S lbC040D46
; BRA.L lbC040AE2
;lbC040D46 MOVE.B D0,D1
; BMI.S lbC040D72
; BEQ.S lbC040D6C
; CLR.B D0
; SUB.B #$41,D1
; BMI.S lbC040D6E
; SUB.B #$1F,D1
; BPL.S lbC040D62
; NEG.B D1
; LSR.L D1,D0
; LSL.L D1,D0
; NEG.B D1
;lbC040D62 ADD.B #$1F,D1
; ADD.B #$41,D1
; MOVE.B D1,D0
;lbC040D6C RTS
;lbC040D6E MOVEQ #0,D0
; RTS
;lbC040D72 BSR.L lbC040AE2
; MOVE.L D0,-(SP)
; BSR.S lbC040D46
; MOVE.L D0,-(SP)
; MOVE.L D0,D1
; MOVE.L 4(SP),D0
; BSR.L lbC040AEC
; MOVEM.L (SP),D0
; BEQ.S lbC040D96
; MOVE.L #$80000041,D1
; BSR.L lbC040B06
;lbC040D96 ADDQ.L #8,SP
; BRA.L lbC040AE2
; dc.b 'MC68343 FLOATING POINT FIRMWARE(C) COPYRIGHT'
; dc.b ' 1981 BY MOTOROLA INC.',0,0
;lbC040DE0
MatchTag
ILLEGAL ; match word
dc.l MatchTag ; match tag
dc.l EndSkip ; end skip
dc.b $80 ; flags
dc.b $29 ; version
dc.b 9 ; type
dc.b $88 ; priority
dc.l mathffplibrar.MSG ; name
dc.l mathffp401163.MSG ; id string
dc.l MakeLibrary
MakeLibrary
dc.l $22 ; dSize
dc.l Vectors
dc.l Structure
dc.l 0 ; Init
Structure
dc.w $A008 ; base offset $8
dc.w $900 ; type
dc.w $800A ; base offset $A
dc.l mathffplibrar.MSG ; name
dc.w $A00E ; base offset $E
dc.w $0600 ; id ???
dc.w $9014 ; base offset $14
dc.w $0029 ; version
dc.w $9016 ; base offset $16
dc.w $0000 ; revision
dc.w $8018 ; base offset $18
dc.l mathffp401163.MSG ; id string
dc.w 0 ; no more
LibOpen
addq.w #1,$20(A6)
move.l A6,D0
rts
Vectors dc.w $FFFF
dc.w LibOpen-Vectors ; -6 _LVOLibOpen
dc.w LibClose-Vectors ; -12 _LVOLibClose
dc.w LibExpunge-Vectors ; -18 _LVOLibExpunge
dc.w LibReserved-Vectors ; -24 _LVOLibReserved
dc.w SPFix-Vectors ; -30 * _LVOSPFix
dc.w SPFlt-Vectors ; -36 _LVOSPFlt
dc.w SPCmp-Vectors ; -42 * _LVOSPCmp
dc.w SPTst-Vectors ; -48 * _LVOSPTst
dc.w SPAbs-Vectors ; -54 * _LVOSPAbs
dc.w SPNeg-Vectors ; -60 * _LVOSPNeg
dc.w SPAdd-Vectors ; -66 _LVOSPAdd
dc.w SPSub-Vectors ; -72 _LVOSPSub
dc.w SPMul-Vectors ; -78 * _LVOSPMul
dc.w SPDiv-Vectors ; -84 * _LVOSPDiv
dc.w SPFloor-Vectors ; -90 * _LVOSPFloor
dc.w SPCeil-Vectors ; -96 * _LVOSPCeil
dc.w $FFFF
SPFlt MOVEQ #$5F,D1
TST.L D0
BEQ.B FltZero
BPL.B FltPlus
MOVEQ #-$20,D1
NEG.L D0
BVS.B FltBvs
SUBQ.B #1,D1
FltPlus CMP.L #$7FFF,D0
BHI.B FltDBMI
SWAP D0
SUB.B #$10,D1
FltDBMI ADD.L D0,D0
DBMI D1,FltDBMI
TST.B D0
BPL.B FltBvs
ADD.L #$100,D0
BCC.B FltBvs
ROXR.L #1,D0
ADDQ.B #1,D1
FltBvs MOVE.B D1,D0
FltZero RTS
SPCmp tst.b D1
bpl.b PlusCmp
tst.b D0
bpl.b PlusCmp
exg D0,D1
PlusCmp
cmp.b D1,D0
bne.b TestCmp
cmp.l D1,D0
TestCmp
bsr.b GetCC
blt.b OneCmp
bgt.b MinusOneCmp
ZeroCmp
moveq #0,D0
bra.b QuitCmp
MinusOneCmp
moveq #-1,D0
bra.b QuitCmp
OneCmp
moveq #1,D0
bra.b QuitCmp
GetCC
pea (A6)
move.l 4.W,A6
jsr -$210(A6) ; GetCC
move.l (SP)+,A6
move.w D0,D1
QuitCmp
move.w D1,CCR
rts
SPTst
tst.b D1
bsr.b GetCC
blt.b MinusOneCmp
bgt.b OneCmp
bra.b ZeroCmp
SPAbs and.b #$7F,D0
rts
SPDiv
movem.l D3-D5,-(SP)
move.b D1,D5
beq.b DivZero
move.l D0,D4
beq.b DivQuit
moveq #-$80,D3
add.w D5,D5
add.w D4,D4
eor.b D3,D5
eor.b D3,D4
sub.b D5,D4
bvs.b DivOflow
clr.b D0
swap D0
swap D1
cmp.w D1,D0
bmi.b DivMinus
addq.b #2,D4
bvs.b DivOverflow
ror.l #1,D0
DivMinus
swap D0
move.b D3,D5
eor.w D5,D4
lsr.w #1,D4
move.l D0,D3
divu.w D1,D3
move.w D3,D5
mulu.w D1,D3
sub.l D3,D0
swap D0
swap D1
move.w D1,D3
clr.b D3
mulu.w D5,D3
sub.l D3,D0
bcc.b DivOK
DivMore
subq.w #1,D5
add.l D1,D0
bcc.b DivMore
DivOK
move.l D1,D3
swap D3
clr.w D0
divu.w D3,D0
swap D5
bmi.b DivNorm
move.w D0,D5
add.l D5,D5
subq.b #1,D4
move.w D5,D0
DivNorm
move.w D0,D5
add.l #$80,D5
move.l D5,D0
move.b D4,D0
beq.b DivUnder
DivQuit
movem.l (SP)+,D3-D5
rts
DivZero
divu.w #0,D0 ; call divide by zero handler
bra.b DivSkip
DivOverflow
swap D1
swap D0
DivFlow
eor.b D1,D0
DivSkip
or.l #$FFFFFF7F,D0
tst.b D0
or.b #2,CCR ; SET OVERFLOW BIT ON
bra.b DivQuit
MulUnder
DivOflow
bmi.b DivFlow
MulZero
DivUnder
moveq #0,D0
bra.b DivQuit
MulNorma
subq.b #1,D5
bvs.b MulZero
bcs.b MulZero
moveq #$40,D4
add.l D4,D0
add.l D0,D0
bcc.b MulNumber
roxr.l #1,D0
addq.b #1,D5
MulNumber
move.b D5,D0
beq.b MulZero
bra.b MulQuit
SPMul
movem.l D3-D5,-(SP)
move.b D0,D5
beq.b MulQuit
move.b D1,D4
beq.b MulZero
add.w D5,D5
add.w D4,D4
moveq #-$80,D3
eor.b D3,D4
eor.b D3,D5
add.b D4,D5
bvs.b MulUnder
move.b D3,D4
eor.w D4,D5
ror.w #1,D5
swap D5
move.w D1,D5
clr.b D0
clr.b D5
move.w D5,D4
mulu.w D0,D4
swap D4
move.l D0,D3
swap D3
mulu.w D5,D3
add.l D3,D4
swap D1
move.l D1,D3
mulu.w D0,D3
add.l D3,D4
clr.w D4
addx.b D4,D4
swap D4
swap D0
mulu.w D1,D0
swap D1
swap D5
add.l D4,D0
bpl.b MulNorma
add.l #$80,D0
move.b D5,D0
beq.b MulZero
MulQuit
movem.l (SP)+,D3-D5
rts
SPFix
move.b D0,D1
bmi.b FixMinus
beq.b FixQuit
sub.b #$41,D1
bmi.b Zero
sub.b #$1F,D1
bpl.b FixPlus
clr.b D0
neg.b D1
lsr.l D1,D0
FixQuit
rts
FixPlus
moveq #-1,D0
lsr.l #1,D0
bra.b FixCCR
FixMinus
sub.b #$C1,D1
bmi.b Zero
clr.b D0
sub.b #$1F,D1
bpl.b FixOflow
neg.b D1
lsr.l D1,D0
neg.l D0
rts
FixOflow
bne.b FixOver
neg.l D0
bmi.b FixQuit
FixOver
moveq #1,D0
ror.l #1,D0
FixCCR
or.b #2,CCR ; SET OVERFLOW BIT ON
rts
LibClose
subq.w #1,$20(A6)
LibReserved
LibExpunge
Zero
moveq #0,D0
rts
SPCeil bsr.b SPNeg
bsr.b SPFloor
SPNeg tst.b D0
beq.b ZeroNeg
eor.b #$80,D0
ZeroNeg
rts
SPFloor
move.b D0,D1
bmi.b MinusFloor
beq.b QuitFloor
sub.b #$41,D1
bmi.b Zero
sub.b #$1F,D1
bpl.b PlusFloor
neg.b D1
lsr.l D1,D0
lsl.l D1,D0
neg.b D1
PlusFloor
add.b #$60,D1
move.b D1,D0
QuitFloor
rts
MinusFloor
bsr.b SPNeg
move.l D0,-(SP)
bsr.b SPFloor
move.l (SP),D1
exg D0,D1
move.l D1,-(SP)
bsr.b SPSub
movem.l (SP)+,D0/D1
beq.b SPNeg
move.l #$80000041,D1
bsr.b SPAdd
bra.b SPNeg
SPSub
movem.l D3-D5,-(SP)
moveq #-128,D3
move.b D1,D4
beq.b NoChange
eor.b D3,D4
bmi.b Minus1
move.b D0,D5
bmi.b Minus2
bne.b Back1
Result
move.l D1,D0
bra.b Restore
Large cmp.b #$E8,D5
ble.b Result
neg.b D5
clr.b D0
lsr.l D5,D0
move.l D1,D5
move.b D3,D5
add.l D5,D0
bcs.b Carry
bra.b Restore
NoChange
tst.b D0
bra.b QuitAdd
SPAdd movem.l D3-D5,-(SP)
moveq #-128,D3
move.b D1,D4
bmi.b Minus1
beq.b NoChange
move.b D0,D5
bmi.B Minus2
beq.b Result
Back1
sub.b D4,D5
bmi.b Large
move.b D0,D4
cmp.b #$18,D5
bcc.b NoChange
move.b D3,D0
move.l D1,D3
clr.b D3
lsr.l D5,D3
add.l D3,D0
bcs.b Carry
Restore
move.b D4,D0
QuitAdd
movem.l (SP)+,D3-D5
rts
Carry
roxr.l #1,D0
addq.b #1,D4
bvs.b Overflow
bcc.b Restore
Overflow
moveq #-1,D0
subq.b #1,D4
move.b D4,D0
or.b #2,CCR
bra.b QuitAdd
Minus1 move.b D0,D5
bmi.b Back1
beq.b Result
Minus2
eor.b D3,D5
sub.b D4,D5
beq.b Equal
bmi.b Large2
cmp.b #$18,D5
bcc.b NoChange
move.b D0,D4
move.b D3,D0
move.l D1,D3
Back2 clr.b D3
lsr.l D5,D3
sub.l D3,D0
bmi.b Restore
Back3 move.b D4,D5
Back4 clr.b D0
subq.b #1,D4
cmp.l #$7FFF,D0
bhi.b Shift
swap D0
sub.b #$10,D4
Shift add.l D0,D0
dbmi D4,Shift
eor.b D4,D5
bmi.b Under
move.b D4,D0
bne.b QuitAdd
Under
moveq #0,D0
bra.b QuitAdd
Large2 cmp.b #$E8,D5
ble.w Result
neg.b D5
move.l D0,D3
move.l D1,D0
move.b #$80,D0
bra.b Back2
Equal move.b D0,D5
exg D5,D4
move.b D1,D0
sub.l D1,D0
beq.b Under
bpl.b Back3
neg.l D0
move.b D5,D4
bra.b Back4
mathffplibrar.MSG dc.b 'mathffp.library',0
mathffp401163.MSG dc.b 'mathffp 41.0 (1.2.2012)',$D,$A,0
cnop 0,4
EndSkip
Here are original Motorola's FFP (commented) source code.
|