home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -screenplay- / otherstuff / adoomppc_src / amiga_fixed.s < prev    next >
Text File  |  1998-04-23  |  1KB  |  85 lines

  1.  
  2.         .extern    SetFPMode
  3.         .extern    FixedMul
  4.         .extern    FixedDiv
  5.  
  6. # set rounding mode to "truncate towards minus infinity"
  7. # otherwise demos get out of step and play wrong
  8.  
  9. SetFPMode:    mtfsb1    30
  10.         mtfsb1    31
  11.         blr
  12.  
  13. # fixed_t FixedMul (fixed_t a, fixed_t b)
  14.  
  15. FixedMul:    mullw    r5,r3,r4
  16.         mulhw    r6,r3,r4
  17.         rlwinm    r3,r5,16,16,31
  18.         rlwimi    r3,r6,16,0,15
  19.         blr
  20.  
  21. # fixed_t FixedDiv (fixed_t a, fixed_t b)
  22.  
  23. FixedDiv:    cmpwi    r4,0
  24.         beq    over
  25.  
  26.         subi    r1,r1,8        # make space on stack for FP
  27.  
  28. # convert a to double
  29.  
  30.         cmpwi    r3,0
  31.         lis    r5,0x4330
  32.         li    r6,0
  33.         bge    cont1
  34.         neg    r3,r3
  35. cont1:        stw    r3,4(r1)
  36.         stw    r5,0(r1)
  37.         lfd    f0,0(r1)
  38.         stw    r6,4(r1)
  39.         lfd    f1,0(r1)
  40.         fsub    f0,f0,f1
  41.         bge    conv2
  42.         fneg    f0,f0
  43.  
  44. # convert b to double
  45.  
  46. conv2:        cmpwi    r4,0
  47.         bge    cont2
  48.         neg    r4,r4
  49. cont2:        stw    r4,4(r1)
  50.         lfd    f1,0(r1)
  51.         stw    r6,4(r1)
  52.         lfd    f2,0(r1)
  53.         fsub    f1,f1,f2
  54.         bge    ldcons
  55.         fneg    f1,f1
  56.  
  57. # load 1/65536
  58.  
  59. ldcons:        lis    r5,0x40F0
  60.         stw    r5,0(r1)
  61.         stw    r6,4(r1)
  62.         lfd    f2,0(r1)
  63.  
  64. # do fixed pt division
  65.  
  66.         fdiv    f0,f0,f1
  67.         fmul    f0,f0,f2
  68.  
  69.         fctiw    f0,f0
  70.         stfd    f0,(r1)
  71.         lwz    r3,4(r1)
  72.  
  73.         addi    r1,r1,8
  74.         blr
  75.  
  76. # divide by 0, overflow
  77.  
  78. over:        cmpwi    r3,0
  79.         lis    r3,-0x8000
  80.         blt    return
  81.         not    r3,r3
  82. return:        blr
  83.  
  84.  
  85.