        tab
        ttl       Floating Point Package
        bin
        dc.w      $fe00

************************************
*                                  *
*     Floating Point Package       *
*                                  *
* Copyright M. R. King 1982, 1984. *
* All rights reserved.             *
*                                  *
************************************

         dc.b     'Floating Point Package. '
         dc.b     'Copyright M.R.King, 1982, 1984. '
         dc.b     'All rights reserved.'
         ds.w     0
float    movem.l  d1,-(sp)
         move.w   #150*128,d1
         tst.l    d0
         beq.s    floatret
         bpl.s    floatpos
         eor.w    #$8000,d1
         neg.l    d0
floatpos cmp.l    #$00800000,d0
         bcc.s    floatsr
floatll  lsl.l    d0
         sub.w    #128,d1
         btst.l   #23,d0
         beq.s    floatll
         bra.s    floatex
floatrl  lsr.l    d0
         add.w    #128,d1
floatsr  cmp.l    #$00FFFFFF,d0
         bcc.s    floatrl
floatex  swap     d0
         and.w    #$007F,d0
         or.w     d1,d0
         swap     d0
floatret movem.l  (sp)+,d1
         rts

rnegate  tst.l    d0
         beq.s    fpnegret
         eor.l    #$80000000,d0
fpnegret rts

intpt    movem.l  d1-d2,-(sp)
*move.l  d0,-(sp)
*move.l  #$00008000,d0
*trap #0
*move.l  (sp)+,d0
         swap     d0
         move.w   d0,d1
         and.w    #$7F,d0
         or.w     #$80,d0
         swap     d0
         move.w   d1,d2
         lsr.w    #7,d1
         and.w    #$FF,d1
         sub.w    #150,d1
         bcc.s    intptsl
         neg.w    d1
         cmp.w    #24,d1
         bcc.s    intptzer
         tst.w    d2
         bpl.s    intptpos
         move.l   #-1,d2
         lsl.l    d1,d2
         not.l    d2
         and.l    d0,d2
         bne.s    intptni
         lsr.l    d1,d0
         neg.l    d0
         bra.s    intptret
intptni  lsr.l    d1,d0
         not.l    d0
         bra.s    intptret
intptsl  cmp.w    #9,d1
         bcc.s    intptofl
         tst.w    d2
         bpl.s    intptlp
         neg.l    d0
intptlp  asl.l    d1,d0
         bvc.s    intptret
intptofl movem.l  (sp)+,d1-d2
         move.l   #-$21,d0
         jmp      signal
intptpos lsr.l    d1,d0
intptret movem.l  (sp)+,d1-d2
         rts
intptzer tst.w    d2
         movem.l  (sp)+,d1-d2
         bpl.s    intptzp
         tst.l    d0
         beq.s    intptzr
         move.l   #-1,d0
         rts
intptzp  move.l   #0,d0
intptzr  rts

trunc    movem.l  d1-d2,-(sp)
         swap     d0
         move.w   d0,d1
         and.w    #$7F,d0
         or.w     #$80,d0
         swap     d0
         move.w   d1,d2
         lsr.w    #7,d1
         and.w    #$FF,d1
         sub.w    #150,d1
         bcc.s    truncsl
         neg.w    d1
         cmp.w    #24,d1
         bcc.s    trunczer
         lsr.l    d1,d0
         tst.w    d2
         bpl.s    truncst
         neg.l    d0
         bra.s    truncret
truncsl  cmp.w    #9,d1
         bcc.s    truncofl
         tst.w    d2
         bpl.s    trunclp
         neg.l    d0
trunclp  asl.l    d1,d0
         bvc.s    truncret
truncofl movem.l  (sp)+,d1-d2
         move.l   #-$21,d0
         jmp      signal
truncst  tst.l    d0
truncret movem.l  (sp)+,d1-d2
         rts
trunczer clr.l    d0
         bra.s    truncret

rdiv     movem.l  d1-d4,-(sp)
         clr.w    d4
         tst.l    d1
         bgt.s    fdiv1pos
         eor.w    #$0100,d4
         and.l    #$7FFFFFFF,d1
         bne.s    fdiv1pos
         movem.l  (sp)+,d1-d4
         move.l   #-$41,d0
         jmp      signal
fdiv1pos tst.l    d0
         bgt.s    fdiv0pos
         and.l    #$7FFFFFFF,d0
         beq.s    fdivret
         eor.w    #$0100,d4
fdiv0pos bsr      fpextrct
         add.w    #151,d2
         sub.w    d3,d2
         bcs.s    fdivzero
         clr.l    d3
fpdivlp  sub.w    #1,d2
         bcs.s    fdivzero
         lsl.l    d3
         cmp.l    d1,d0
         bcs.s    fdvnosub
         sub.l    d1,d0
         add.l    #1,d3
fdvnosub lsl.l    d0
         btst.l   #23,d3
         beq.s    fpdivlp
         cmp.w    #256,d2
         bcs.s    fdivnofl
         movem.l  (sp)+,d1-d4
         move.l   #-$21,d0
         jmp      signal
fdivnofl or.w     d4,d2
         lsl.w    #7,d2
         swap     d3
         and.w    #$007F,d3
         or.w     d2,d3
         swap     d3
         move.l   d3,d0
fdivret  movem.l  (sp)+,d1-d4
         rts
fdivzero clr.l    d0
         bra.s    fdivret

rmult    movem.l  d1-d6,-(sp)
         clr.w    d6
         tst.l    d0
         bgt.s    fmul0pos
         and.l    #$7FFFFFFF,d0
         beq      fmulret
         eor.w    #$0100,d6
fmul0pos tst.l    d1
         bgt.s    fmul1pos
         and.l    #$7FFFFFFF,d1
         beq.s    fmulzero
         eor.w    #$0100,d6
fmul1pos bsr      fpextrct
         add.w    d3,d2
         sub.w    #126,d2
         bcs.s    fmulzero
         move.l   d0,d3
         move.l   d1,d4
         mulu     d0,d1
         swap     d0
         swap     d4
         mulu     d4,d0
         swap     d1
         move.w   d4,d5
         mulu     d3,d5
         add.w    d5,d1
         clr.w    d5
         swap     d5
         addx.l   d5,d0
         swap     d3
         swap     d4
         mulu     d4,d3
         add.w    d3,d1
         clr.w    d3
         swap     d3
         addx.l   d3,d0
         lsl.l    #8,d0
         rol.w    #8,d1
         move.b   d1,d0
         lsl.w    d1
         btst.l   #23,d0
         bne.s    fmnoshft
         roxl.l   d0
         sub.w    #1,d2
         bcs.s    fmulzero
         lsl.w    d1
fmnoshft clr.l    d1
         addx.l   d1,d0
         btst.l   #24,d0
         beq.s    fmnocarr
         lsr.l    d0
         add.w    #1,d2
fmnocarr cmp.w    #256,d2
         bcs.s    fmulnofl
         movem.l  (sp)+,d1-d6
         move.l   #-$21,d0
         jmp      signal
fmulzero clr.l    d0
         bra.s    fmulret
fmulnofl swap     d0
         and.w    #$007F,d0
         or.w     d6,d2
         lsl.w    #7,d2
         or.w     d2,d0
         swap     d0
fmulret  movem.l  (sp)+,d1-d6
         rts

fpextrct swap    d0
         move.w  d0,d2
         and.w   #$007F,d0
         or.w    #$0080,d0
         swap    d0
         lsr.w   #7,d2
         swap    d1
         move.w  d1,d3
         and.w   #$007F,d1
         or.w    #$0080,d1
         swap    d1
         lsr     #7,d3
         rts

rplus    movem.l  d1-d4,-(sp)
         clr.w    d4
         tst.l    d0
         bne.s    fadd0nz
         move.l   d1,d0
         bra      fpasret
fadd0nz  bpl.s    fadd0pos
         and.l    #$7FFFFFFF,d0
         exg      d0,d1
         bra.s    fsub1pos
fadd0pos tst.l    d1
         beq      fpasret
         bpl.s    fadd1pos
         and.l    #$7FFFFFFF,d1
         bra.s    fsub0pos
fadd1pos cmp.l    d1,d0
         bcc.s    fadd0big
         exg      d0,d1
fadd0big bsr      fpextrct
         sub.w    d3,d2
         add.w    d2,d3
         cmp.w    #24,d2
         bcc      fasquick
         lsr.l    d2,d1
         add.l    d1,d0
         btst.l   #24,d0
         beq      fasquick
         add.l    #1,d0
         lsr.l    #1,d0
         add.b    #1,d3
         bcc.s    fasquick
         movem.l  (sp)+,d1-d4
         move.l   #-$21,d0
         jmp      signal
rminus   movem.l  d1-d4,-(sp)
         clr.w    d4
         tst.l    d1
         beq.s    fpasret
         bpl.s    fsub1pos
         and.l    #$7FFFFFFF,d1
         exg      d0,d1
         bra.s    fadd0pos
fsub1pos tst.l    d0
         bne.s    fsub0nz
         move.l   d1,d0
         eor.l    #$80000000,d0
         bra.s    fpasret
fsub0nz  bpl.s    fsub0pos
         and.l    #$7FFFFFFF,d0
         eor.w    #$0100,d4
         bra.s    fadd1pos
fsub0pos cmp.l    d1,d0
         bcc.s    fsub0big
         exg      d0,d1
         eor.w    #$0100,d4
fsub0big bsr      fpextrct
         sub.w    d3,d2
         add.w    d2,d3
         cmp.w    #24,d2
         bcc.s    fasquick
         lsr.l    d2,d1
         sub.l    d1,d0
         beq.s    fpasret
         bhi.s    fsubsrch
         neg.l    d0
         eor.w    #$0100,d4
         bra      fsubsrch
fsbsrchl sub.b    #1,d3
         bcs.s    fsubzero
         lsl.l    d0
fsubsrch btst.l   #23,d0
         beq.s    fsbsrchl
fasquick or.w     d3,d4
         lsl.w    #7,d4
         swap     d0
         and.w    #$007F,d0
         or.w     d4,d0
         swap     d0
fpasret  tst.l    d0
         bpl.s    fpasretp
         and.l    #$7FFFFFFF,d0
         beq.s    fpasretp
         eor.l    #$80000000,d0
fpasretp movem.l  (sp)+,d1-d4
         rts
fsubzero clr.l    d0
         bra.s    fpasretp

fracpt   movem.l  d1-d2,-(sp)
* move.l d0,-(sp)
* move.l #$8000,d0
* trap #0
* move.l (sp)+,d0
         swap     d0
         move.w   d0,d1
         bpl.s    fractpen
         and.w    #$7F,d0
         or.w     #$80,d0
         swap     d0
         lsr.w    #7,d1
         and.w    #$FF,d1
         sub.w    #126,d1
         blo.s    fracptal
         cmp.w    #24,d1
         bcc.s    fracptzr
         lsl.l    d1,d0
         move.w   #126,d1
         neg.l    d0
         and.l    #$00FFFFFF,d0
         bne.s    fracptsc
         bra.s    fracptzr
fracptsl sub.w    #1,d1
         bcs.s    fracptzr
         lsl.l    #1,d0
fracptsc btst.l   #23,d0
         beq.s    fracptsl
         bra.s    fracptex
fracptal neg.w    d1
         lsr.l    d1,d0
         sub.l    #$1000000,d0
         beq.s    fracptzr
         neg.l    d0
         move.w   #126,d1
fracptex lsl.w    #7,d1
         swap     d0
         and.w    #$007F,d0
         or.w     d1,d0
         swap     d0
fracptrt movem.l  (sp)+,d1-d2
         rts
fracptzr clr.l    d0
         bra.s    fracptrt

fraction movem.l  d1-d2,-(sp)
         swap     d0
         move.w   d0,d1
fractpen and.w    #$7F,d0
         swap     d0
         lsr.w    #7,d1
         move.w   d1,d2
         and.w    #$FF,d1
         and.w    #$0100,d2
         sub.w    #126,d1
         bls.s    fractal
         cmp.w    #24,d1
         bcc.s    fractzr
         lsl.l    d1,d0
         move.w   #126,d1
         and.l    #$00FFFFFF,d0
         bne.s    fractsc
         bra.s    fractzr
fractsl  sub.w    #1,d1
         bcs.s    fractzr
         lsl.l    #1,d0
fractsc  btst.l   #23,d0
         beq.s    fractsl
         bra.s    fractex
fractal  add.w    #126,d1
fractex  or.w     d2,d1
         lsl.w    #7,d1
         swap     d0
         and.w    #$007F,d0
         or.w     d1,d0
         swap     d0
fractrt  movem.l  (sp)+,d1-d2
         rts
fractzr  clr.l    d0
         bra.s    fractrt

rpower   movem.l d1-d3,-(sp)
         move.l d1,d3
         beq.s rpzer
         bpl.s rppos
         neg.l d3
         move.l d0,d1
         move.l #$3f800000,d0
         bsr rdiv
rppos    move.l #$3f800000,d2
         move.l d0,d1
rploop   btst #0,d3
         beq.s rpno
         move.l d2,d0
         bsr rmult
         move.l d0,d2
rpno     lsr.l #1,d3
         beq.s rpret
         move.l d1,d0
         bsr rmult
         move.l d0,d1
         bra rploop
rpret    move.l d2,d0
         movem.l (sp)+,d1-d3
         rts
rpzer    move.l #$3f800000,d2
         bra rpret

intpower movem.l d1-d3,-(sp)
         move.l d1,d3
         beq.s intpzer
         bmi.s intpneg
         moveq #1,d2
         move.l d0,d1
intploop btst #0,d3
         beq.s intpno
         move.l d2,d0
         jsr mull
         move.l d0,d2
intpno   lsr.l #1,d3
         beq.s intpret
         move.l d1,d0
         jsr mull
         move.l d0,d1
         bra intploop
intpret  move.l d2,d0
         movem.l (sp)+,d1-d3
         rts
intpzer  moveq #1,d2
         bra intpret
intpneg  clr.l d2
         bra intpret

sqrt     move.w   ccr,-(sp)
         and.l    #$7FFFFFFF,d0
         beq.s    psqrtret
         movem.l  d1-d4,-(sp)
         swap     d0
         move.w   d0,d1
         and.w    #$007F,d0
         or.w     #$0080,d0
         swap     d0
         lsl.l    #7,d0
         sub.w    #$3F80,d1
         asr.w    #1,d1
         add.w    #$3F00,d1
         btst.l   #6,d1
         beq.s    fpsqrtns
         lsl.l    #1,d0
fpsqrtns move.l   #0,d2
         move.l   #0,d3
         move.l   #23,d4
fpsqrtlp lsl.l    #1,d0
         roxl.l   #1,d2
         lsl.l    #1,d0
         roxl.l   #1,d2
         lsl.l    #1,d3
         add.l    #1,d3
         sub.l    d3,d2
         bcs.s    fpsqrtob
         add.l    #1,d3
         dbra     d4,fpsqrtlp
         bra.s    fpsqrtnm
fpsqrtob add.l    d3,d2
         sub.l    #1,d3
         dbra     d4,fpsqrtlp
fpsqrtnm add.w    #$0080,d1
         add.l    #1,d3
         lsr.l    #1,d3
         btst.l   #24,d3
         bne.s    fpsqrtnm
         and.w    #$7F80,d1
         move.w   d1,d0
         swap     d3
         and.w    #$007F,d3
         or.l     d3,d0
         movem.l  (sp)+,d1-d4
psqrtret move.w   (sp)+,ccr
         swap     d0
         rts

printstring equ $10c4
signal      equ $1114
mull        equ $1120
freestore   equ $3ff0
nl          equ 10

define macro
   lea \1,a0
   move.l #\2,d0
   bsr defext
   endm

begin equ *
   define intpower,$1144
   define rplus,$1148
   define rminus,$114c
   define rmult,$1150
   define rdiv,$1154
   define rpower,$1158
   define rnegate,$115c
   define float,$1160
   define fracpt,$1164
   define intpt,$1168
   define sqrt,$116c
   lea begin,a0
   move.l a0,freestore
   lea done,a0
   jsr printstring
   rts

defext exg d0,a0
   add.w 2(a0),a0
   move.l d0,4(a0)
   rts

done dc.b end-*-1,'FLOATING loaded',nl
end equ *
   ds.w 0
   bra.w begin
   end
