home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -websites- / amidoom / adoom_src-0.7.lha / ADoom_src / amiga_fixed.s < prev    next >
Text File  |  1998-01-16  |  2KB  |  152 lines

  1.         mc68020
  2.         mc68881
  3.         multipass
  4. ;;;        debug    on,lattice4
  5.  
  6.         xdef    _FixedMul
  7.         xdef    @FixedMul_040
  8.         xdef    @FixedMul_060fpu
  9.         xdef    @FixedMul_060
  10.         xdef    _FixedDiv
  11.         xdef    @FixedDiv_040
  12.         xdef    @FixedDiv_060fpu
  13.         xdef    @SetFPMode
  14.  
  15. ; pointers to CPU-specific FixedMul and FixedDiv routine
  16.  
  17. _FixedMul    dc.l    0
  18. _FixedDiv    dc.l    0
  19.  
  20. ; set 68060 FPU rounding mode to "truncate towards minus infinity"
  21. ; otherwise demos get out of step and play wrong
  22.  
  23. @SetFPMode    fmove.l    fpcr,d0
  24.         or.b    #$20,d0
  25.         and.b    #~$10,d0
  26.         fmove.l    d0,fpcr
  27.         rts
  28.  
  29.         cnop    0,4
  30.  
  31. ; fixed_t FixedMul (fixed_t a, fixed_t b)
  32.  
  33. @FixedMul_040    muls.l    d1,d1:d0
  34.         move.w    d1,d0
  35.         swap    d0
  36.         rts
  37.  
  38.         cnop    0,4
  39.  
  40. ; special version for 68060 which otherwise traps and emulates 64-bit muls.l
  41.  
  42. @FixedMul_060fpu
  43.         fmove.l    d0,fp0
  44.         fmul.l    d1,fp0
  45.         fmul.s    #0.000015258789,fp0    ; d0 * d1 / 65536 (* reciprocal)
  46.         fmove.l    fp0,d0
  47.         rts
  48.  
  49.         cnop    0,4
  50.  
  51. ; I'm told all Amiga 68060 accelerators have FPUs, but just in case...
  52.  
  53. @FixedMul_060    movem.l d2-d5,-(sp)
  54.  
  55.         clr.b    d5          ; clear sign tag
  56.         tst.l    d0          ; multiplier negative?
  57.         bge    .not1
  58.         neg.l    d0
  59.         or.b    #1,d5
  60. .not1
  61.         tst.l    d1          ; multiplicand negative?
  62.         bge    .not2
  63.         neg.l    d1
  64.         eor.b    #1,d5
  65. .not2
  66.         move.l    d0,d2       ; mr
  67.         move.l    d0,d3       ; mr
  68.         move.l    d1,d4       ; md
  69.         swap    d3          ; hi_mr in lo d3
  70.         swap    d4          ; hi_md in lo d4
  71.  
  72.         mulu.w    d1,d0       ; [1] lo_mr * lo_md
  73.         mulu.w    d3,d1       ; [2] hi_mr * lo_md
  74.         mulu.w    d4,d2       ; [3] lo_mr * hi_md
  75.         mulu.w    d4,d3       ; [4] hi_mr * hi_md
  76.  
  77.         clr.l    d4
  78.         swap    d0
  79.         add.w    d1,d0
  80.         addx.l    d4,d3
  81.         add.w    d2,d0
  82.         addx.l    d4,d3
  83.         swap    d0
  84.  
  85.         clr.w    d1
  86.         clr.w    d2
  87.  
  88.         swap    d1
  89.         swap    d2
  90.         add.l    d2,d1
  91.         add.l    d3,d1
  92.  
  93.         tst.b    d5          ; check sign of result
  94.         beq    .skip
  95.  
  96.         not.l    d0
  97.         not.l    d1
  98.         addq.l    #1,d0
  99.         addx.l    d4,d1
  100.  
  101. .skip
  102.         move.w    d1,d0
  103.         swap    d0
  104.  
  105.         movem.l    (sp)+,d2-d5
  106.         rts
  107.  
  108.         cnop    0,4
  109.  
  110. ; fixed_t FixedDiv (fixed_t a, fixed_t b)
  111.  
  112. @FixedDiv_040    movem.l    d2/d3,-(sp)
  113.         move.l    d0,d3
  114.         swap    d0
  115.         move.w    d0,d2
  116.         ext.l    d2
  117.         move.w    #0,d0
  118.         tst.l    d1
  119.         beq.l    3$
  120.         divs.l    d1,d2:d0
  121.         bvc.b    1$
  122. 3$        eor.l    d1,d3
  123.         bmi.b    2$
  124.         move.l    #$7fffffff,d0
  125.         bra.b    1$
  126. 2$        move.l    #$80000000,d0
  127. 1$        movem.l    (sp)+,d2/d3
  128.         rts
  129.  
  130.         cnop    0,4
  131.  
  132. ; m68060fpu fixed division
  133.  
  134. @FixedDiv_060fpu
  135.         tst.l    d1
  136.         beq.b    3$        ; check for divide by 0 !
  137.         fmove.l    d0,fp0
  138.         fmove.l    d1,fp1
  139.         fdiv.x    fp1,fp0
  140.         fmul.s    #65536.0,fp0
  141.         fmove.l    fp0,d0
  142.         rts
  143.  
  144. 3$        eor.l    d1,d0
  145.         bmi.b    2$
  146.         move.l    #$7fffffff,d0
  147.         bra.b    1$
  148. 2$        move.l    #$80000000,d0
  149. 1$        rts
  150.  
  151.         end
  152.