home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #2 / amigaacscoverdisc1998-021998.iso / games / doom / adoom / src / amiga_fixed.s < prev    next >
Text File  |  1998-01-08  |  2KB  |  127 lines

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