; 68881/2 FPSP on H38 as 'FPSP_8x_ASM'
;
; 30th November 1996
;
;
SYS_FPSL  EQU       $D4
;
; Table of exception offsets
;
XFST      DC.L      REAL_FLINE-XFST
          DC.L      REAL_BSUN-XFST
          DC.L      REAL_INEX-XFST
          DC.L      REAL_DZ-XFST
          DC.L      REAL_UNFL-XFST
          DC.L      REAL_OPERR-XFST
          DC.L      REAL_OVFL-XFST
          DC.L      REAL_SNAN-XFST
          DC.L      0,0
;
; Branches to the operations
;
;
TOP1    BRA        FMOVECR
        ALIGN8
        BRA        FACOSS
        ALIGN8
        BRA        FACOSD
        ALIGN8
        BRA        FACOSX
        ALIGN8
        BRA        FASINS
        ALIGN8
        BRA        FASIND
        ALIGN8
        BRA        FASINX
        ALIGN8
        BRA        FATANS
        ALIGN8
        BRA        FATAND
        ALIGN8
        BRA        FATANX
        ALIGN8
        BRA        FATANHS
        ALIGN8
        BRA        FATANHD
        ALIGN8
        BRA        FATANHX
        ALIGN8
        BRA        FCOSS
        ALIGN8
        BRA        FCOSD
        ALIGN8
        BRA        FCOSX
        ALIGN8
        BRA        FCOSHS
        ALIGN8
        BRA        FCOSHD
        ALIGN8
        BRA        FCOSHX
        ALIGN8
        BRA        FETOXS
        ALIGN8
        BRA        FETOXD
        ALIGN8
        BRA        FETOXX
        ALIGN8
        BRA        FETOXM1S
        ALIGN8
        BRA        FETOXM1D
        ALIGN8
        BRA        FETOXM1X
        ALIGN8
        BRA        FGETEXPS
        ALIGN8
        BRA        FGETEXPD
        ALIGN8
        BRA        FGETEXPX
        ALIGN8
        BRA        FGETMANS
        ALIGN8
        BRA        FGETMAND
        ALIGN8
        BRA        FGETMANX
        ALIGN8
        BRA        FLOG10S
        ALIGN8
        BRA        FLOG10D
        ALIGN8
        BRA        FLOG10X
        ALIGN8
        BRA        FLOG2S
        ALIGN8
        BRA        FLOG2D
        ALIGN8
        BRA        FLOG2X
        ALIGN8
        BRA        FLOGNS
        ALIGN8
        BRA        FLOGND
        ALIGN8
        BRA        FLOGNX
        ALIGN8
        BRA        FLOGNP1S
        ALIGN8
        BRA        FLOGNP1D
        ALIGN8
        BRA        FLOGNP1X
        ALIGN8
        BRA        FMODS
        ALIGN8
        BRA        FMODD
        ALIGN8
        BRA        FMODX
        ALIGN8
        BRA        FREMS
        ALIGN8
        BRA        FREMD
        ALIGN8
        BRA        FREMX
        ALIGN8
        BRA        FSCALES
        ALIGN8
        BRA        FSCALED
        ALIGN8
        BRA        FSCALEX
        ALIGN8
        BRA        FSINS
        ALIGN8
        BRA        FSIND
        ALIGN8
        BRA        FSINX
        ALIGN8
        BRA        FSINCOSS
        ALIGN8
        BRA        FSINCOSD
        ALIGN8
        BRA        FSINCOSX
        ALIGN8
        BRA        FSINHS
        ALIGN8
        BRA        FSINHD
        ALIGN8
        BRA        FSINHX
        ALIGN8
        BRA        FTANS
        ALIGN8
        BRA        FTAND
        ALIGN8
        BRA        FTANX
        ALIGN8
        BRA        FTANHS
        ALIGN8
        BRA        FTANHD
        ALIGN8
        BRA        FTANHX
        ALIGN8
        BRA        FTENTOXS
        ALIGN8
        BRA        FTENTOXD
        ALIGN8
        BRA        FTENTOXX
        ALIGN8
        BRA        FTWOTOXS
        ALIGN8
        BRA        FTWOTOXD
        ALIGN8
        BRA        FTWOTOXX
        ALIGN8
        BRA        FABSS
        ALIGN8
        BRA        FABSD
        ALIGN8
        BRA        FABSX
        ALIGN8
        BRA        FADDS
        ALIGN8
        BRA        FADDX
        ALIGN8
        BRA        FDIVS
        ALIGN8
        BRA        FDIVD
        ALIGN8
        BRA        FDIVX
        ALIGN8
        BRA        FINTS
        ALIGN8
        BRA        FINTD
        ALIGN8
        BRA        FINTX
        ALIGN8
        BRA        FINTRZS
        ALIGN8
        BRA        FINTRZD
        ALIGN8
        BRA        FINTRZX
        ALIGN8
        BRA        FMULS
        ALIGN8
        BRA        FMULD
        ALIGN8
        BRA        FMULX
        ALIGN8
        BRA        FNEGS
        ALIGN8
        BRA        FNEGD
        ALIGN8
        BRA        FNEGX
        ALIGN8
        BRA        FSQRTS
        ALIGN8
        BRA        FSQRTD
        ALIGN8
        BRA        FSQRTX
        ALIGN8
        BRA        FSUBS
        ALIGN8
        BRA        FSUBD
        ALIGN8
        BRA        FSUBX
;
FMOVECR   MOVE.L    D0,-(A7)
          MOVE.L    8(A7),D0  constant
          ANDI.W    #$7F,D0   keep the relevant bits
          BEQ       PI
          SUBI.W    #$B,D0
          BMI       ZERO      not valid
          CMPI.W    #4,D0
          BLE       TAB       OK
          SUBI.W    #$30-$B,D0
          BMI       ZERO      not valid either
          ADDQ.W    #5,D0
          CMPI.W    #20,D0
          BGT       ZERO      again not valid
TAB       JSR       (FMTB,D0.W*8)
EXIT      MOVE.L    (A7)+,D0
          RTS
;
ZERO      FMOVECR   #$0F,FP0  set zero
          BRA       EXIT
;
PI        FMOVECR   #0,FP0    set PI
          BRA       EXIT
;
FMTB      FMOVECR   #$B,FP0
          RTS
          NOP
          FMOVECR   #$D,FP0
          RTS
          NOP
          FMOVECR   #$E,FP0
          RTS
          NOP
          FMOVECR   #$F,FP0
          RTS
          NOP
          FMOVECR   #$30,FP0
          RTS
          NOP
          FMOVECR   #$31,FP0
          RTS
          NOP
          FMOVECR   #$32,FP0
          RTS
          NOP
          FMOVECR   #$33,FP0
          RTS
          NOP
          FMOVECR   #$34,FP0
          RTS
          NOP
          FMOVECR   #$35,FP0
          RTS
          NOP
          FMOVECR   #$36,FP0
          RTS
          NOP
          FMOVECR   #$37,FP0
          RTS
          NOP
          FMOVECR   #$38,FP0
          RTS
          NOP
          FMOVECR   #$39,FP0
          RTS
          NOP
          FMOVECR   #$3A,FP0
          RTS
          NOP
          FMOVECR   #$3B,FP0
          RTS
          NOP
          FMOVECR   #$3C,FP0
          RTS
          NOP
          FMOVECR   #$3D,FP0
          RTS
          NOP
          FMOVECR   #$3E,FP0
          RTS
          NOP
          FMOVECR   #$3F,FP0
          RTS
          NOP
;
; MONADIC
;
; Fy.z    4(A7),FP0
; RTS
;
FACOSS    FACOS.S   4(A7),FP0
          RTS
FACOSD    FACOS.D   4(A7),FP0
          RTS
FACOSX    FACOS.X   4(A7),FP0
          RTS
FASINS    FASIN.S   4(A7),FP0
          RTS
FASIND    FASIN.D   4(A7),FP0
          RTS
FASINX    FASIN.X   4(A7),FP0
          RTS
FATANS    FATAN.S   4(A7),FP0
          RTS
FATAND    FATAN.D   4(A7),FP0
          RTS
FATANX    FATAN.X   4(A7),FP0
          RTS
FATANHS   FATANH.S  4(A7),FP0
          RTS
FATANHD   FATANH.D  4(A7),FP0
          RTS
FATANHX   FATANH.X  4(A7),FP0
          RTS
FCOSS     FCOS.S    4(A7),FP0
          RTS
FCOSD     FCOS.D    4(A7),FP0
          RTS
FCOSX     FCOS.X    4(A7),FP0
          RTS
FCOSHS    FCOSH.S   4(A7),FP0
          RTS
FCOSHD    FCOSH.D   4(A7),FP0
          RTS
FCOSHX    FCOSH.X   4(A7),FP0
          RTS
FETOXS    FETOX.S   4(A7),FP0
          RTS
FETOXD    FETOX.D   4(A7),FP0
          RTS
FETOXX    FETOX.X   4(A7),FP0
          RTS
FETOXM1S  FETOXM1.S 4(A7),FP0
          RTS
FETOXM1D  FETOXM1.D 4(A7),FP0
          RTS
FETOXM1X  FETOXM1.X 4(A7),FP0
          RTS
FGETEXPS  FGETEXP.S 4(A7),FP0
          RTS
FGETEXPD  FGETEXP.D 4(A7),FP0
          RTS
FGETEXPX  FGETEXP.X 4(A7),FP0
          RTS
FGETMANS  FGETMAN.S 4(A7),FP0
          RTS
FGETMAND  FGETMAN.D 4(A7),FP0
          RTS
FGETMANX  FGETMAN.X 4(A7),FP0
          RTS
FLOG10S   FLOG10.S  4(A7),FP0
          RTS
FLOG10D   FLOG10.D  4(A7),FP0
          RTS
FLOG10X   FLOG10.X  4(A7),FP0
          RTS
FLOG2S    FLOG2.S   4(A7),FP0
          RTS
FLOG2D    FLOG2.D   4(A7),FP0
          RTS
FLOG2X    FLOG2.X   4(A7),FP0
          RTS
FLOGNS    FLOGN.S   4(A7),FP0
          RTS
FLOGND    FLOGN.D   4(A7),FP0
          RTS
FLOGNX    FLOGN.X   4(A7),FP0
          RTS
FLOGNP1S  FLOGNP1.S 4(A7),FP0
          RTS
FLOGNP1D  FLOGNP1.D 4(A7),FP0
          RTS
FLOGNP1X  FLOGNP1.X 4(A7),FP0
          RTS
FSINS     FSIN.S    4(A7),FP0
          RTS
FSIND     FSIN.D    4(A7),FP0
          RTS
FSINX     FSIN.X    4(A7),FP0
          RTS
FSINCOSS  FSINCOS.S 4(A7),FP0:FP1
          RTS
FSINCOSD  FSINCOS.D 4(A7),FP0:FP1
          RTS
FSINCOSX  FSINCOS.X 4(A7),FP0:FP1
          RTS
FSINHS    FSINH.S   4(A7),FP0
          RTS
FSINHD    FSINH.D   4(A7),FP0
          RTS
FSINHX    FSINH.X   4(A7),FP0
          RTS
FTANS     FTAN.S    4(A7),FP0
          RTS
FTAND     FTAN.D    4(A7),FP0
          RTS
FTANX     FTAN.X    4(A7),FP0
          RTS
FTANHS    FTANH.S   4(A7),FP0
          RTS
FTANHD    FTANH.D   4(A7),FP0
          RTS
FTANHX    FTANH.X   4(A7),FP0
          RTS
FTENTOXS  FTENTOX.S 4(A7),FP0
          RTS
FTENTOXD  FTENTOX.D 4(A7),FP0
          RTS
FTENTOXX  FTENTOX.X 4(A7),FP0
          RTS
FTWOTOXS  FTWOTOX.S 4(A7),FP0
          RTS
FTWOTOXD  FTWOTOX.D 4(A7),FP0
          RTS
FTWOTOXX  FTWOTOX.X 4(A7),FP0
          RTS
FABSS     FABS.S    4(A7),FP0
          RTS
FABSD     FABS.D    4(A7),FP0
          RTS
FABSX     FABS.X    4(A7),FP0
          RTS
FINTS     FINT.S    4(A7),FP0
          RTS
FINTD     FINT.D    4(A7),FP0
          RTS
FINTX     FINT.X    4(A7),FP0
          RTS
FINTRZS   FINTRZ.S  4(A7),FP0
          RTS
FINTRZD   FINTRZ.D  4(A7),FP0
          RTS
FINTRZX   FINTRZ.X  4(A7),FP0
          RTS
FNEGS     FNEG.S    4(A7),FP0
          RTS
FNEGD     FNEG.D    4(A7),FP0
          RTS
FNEGX     FNEG.X    4(A7),FP0
          RTS
FSQRTS    FSQRT.S   4(A7),FP0
          RTS
FSQRTD    FSQRT.D   4(A7),FP0
          RTS
FSQRTX    FSQRT.X   4(A7),FP0
          RTS
;
; DYADIC
;
; FMOVE.y 4(A7),FP0
; FSUB.y  w+4(A7),FP0
; RTS
;
; y = S, D, X and w = 4, 8, 12
;
FMODS     FMOVE.S   4(A7),FP0
          FMOD.S    8(A7),FP0
          RTS
FMODD     FMOVE.D   4(A7),FP0
          FMOD.D    12(A7),FP0
          RTS
FMODX     FMOVE.X   4(A7),FP0
          FMOD.X    16(A7),FP0
          RTS
FREMS     FMOVE.S   4(A7),FP0
          FREM.S    8(A7),FP0
          RTS
FREMD     FMOVE.D   4(A7),FP0
          FREM.D    12(A7),FP0
          RTS
FREMX     FMOVE.X   4(A7),FP0
          FREM.X    16(A7),FP0
          RTS
FSCALES   FMOVE.S   4(A7),FP0
          FSCALE.S  8(A7),FP0
          RTS
FSCALED   FMOVE.D   4(A7),FP0
          FSCALE.D  12(A7),FP0
          RTS
FSCALEX   FMOVE.X   4(A7),FP0
          FSCALE.X  16(A7),FP0
          RTS
FADDS     FMOVE.S   4(A7),FP0
          FADD.S    8(A7),FP0
          RTS
FADDD     FMOVE.D   4(A7),FP0
          FADD.D    12(A7),FP0
          RTS
FADDX     FMOVE.X   4(A7),FP0
          FADD.X    16(A7),FP0
          RTS
FDIVS     FMOVE.S   4(A7),FP0
          FDIV.S    8(A7),FP0
          RTS
FDIVD     FMOVE.D   4(A7),FP0
          FDIV.D    12(A7),FP0
          RTS
FDIVX     FMOVE.X   4(A7),FP0
          FDIV.X    16(A7),FP0
          RTS
FMULS     FMOVE.S   4(A7),FP0
          FMUL.S    8(A7),FP0
          RTS
FMULD     FMOVE.D   4(A7),FP0
          FMUL.D    12(A7),FP0
          RTS
FMULX     FMOVE.X   4(A7),FP0
          FMUL.X    16(A7),FP0
          RTS
FSUBS     FMOVE.S   4(A7),FP0
          FSUB.S    8(A7),FP0
          RTS
FSUBD     FMOVE.D   4(A7),FP0
          FSUB.D    12(A7),FP0
          RTS
FSUBX     FMOVE.X   4(A7),FP0
          FSUB.X    16(A7),FP0
          RTS
;
; User enabled exception handlers
;
; All are RTE except BSUN where a response IS required.
;
REAL_BSUN:
          MOVE.W    #6,-(A7)
          BSR       FP_NT
          MOVE.L    D0,-(A7)
          FMOVEM.L  FPSR,D0
          BCLR      #24,D0    clear BSUN bit
          FMOVEM.L  D0,FPSR
          MOVE.L    (A7)+,D0
          RTE
;
REAL_DZ:
          CLR.W     -(A7)
          BSR       FP_NT
          RTE
;
REAL_INEX:
          MOVE.W    #1,-(A7)
          BSR       FP_NT
          RTE
;
REAL_UNFL:
          MOVE.W    #3,-(A7)
          BSR       FP_NT
          RTE
;
REAL_OPERR:
          MOVE.W    #5,-(A7)
          BSR       FP_NT
          RTE
;
REAL_OVFL:
          MOVE.W    #2,-(A7)
          BSR       FP_NT
          RTE
;
REAL_SNAN:
          MOVE.W    #4,-(A7)
          BSR       FP_NT
          RTE
;
REAL_FLINE:
          MOVE.W    #7,-(A7)
          BSR       FP_NT
          RTE
;
; FP_NT branches to a user 'real_xxxx' routine if the
; address in the program's save area (if any) is non zero
;
; On entry a word containing 0 to 9 for the appropriate 'xxxx'
; is on the stack. If no user table is found a normal return is made
; otherwise a jump is made to the address in the table.
;
; No registers are used and the stack is cleared.
;
FP_NT   MOVEM.L     D0-2/A0,-(A7)
        MOVEQ       #MT_INF,D0
        TRAP        #1
        MOVE.L      SYS_FPSL(A0),D0        address of save area list
        BEQ         FP_NT1                 there is no list
FP_NT3  CMP.L       -8(D0.L),D1            This job? . . .
        BEQ         FP_NT2                 . . . yes
        MOVE.L      (D0.L),D0              next area
        BNE         FP_NT3                 not finished yet
FP_NT1  MOVE.L      $10(A7),A0             return address
        BRA         FP_NT4
FP_NT2  MOVE.L      $C(D0.L),D0
        BEQ         FP_NT1                 no user table
        MOVEA.L     D0,A0
        MOVE.W      $14(A7),D0             'xxxx' number
        ADDA.W      (A0,D0.W*2),A0         routine address
FP_NT4  MOVE.L      A0,$12(A7)             set routine address for RTS
        MOVEM.L     (A7)+,D0-2/A0
        ADDQ.L      #2,A7                  adjust stack
        RTS
