home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 500-599 / ff588.lza / MandelSquare / Source / Iterate.asm < prev    next >
Assembly Source File  |  1992-01-04  |  3KB  |  103 lines

  1. ** Revision Header * Header built automatically - do not edit! *************
  2. *
  3. *    (C) Copyright 1991 by Olaf `Olsen' Barthel, all rights reserved
  4. *
  5. *    Name .....: Iterate.asm
  6. *    Created ..: Monday 26-Aug-91 11:20
  7. *    Revision .: 3
  8. *
  9. *    Date            Author          Comment
  10. *    =========       ========        ====================
  11. *    17-Sep-91    Olsen        Loop rearranged again
  12. *    12-Sep-91    Olsen        Loop rearranged for earlier termination
  13. *    26-Aug-91    Olsen        Created this file!
  14. *
  15. ****************************************************************************
  16.  
  17.     csect    text,0,0,1,2
  18.  
  19.     xdef    _Iterate
  20.  
  21. ;    BYTE Iterate(double RealValue,double ImaginaryValue);
  22. ;
  23. ;        Fast hand-coded '881 assembly language subroutine,
  24. ;    all arguments are passed on the stack since either SAS/C
  25. ;    fails to correctly pass them in registers or the register
  26. ;    values have to be converted to extended precision (hey, I
  27. ;    don't have an '881 users' manual here!).
  28. ;
  29. ;    Register usage is a follows:
  30. ;
  31. ;        d0    = MaxIterations
  32. ;        d1    = Iterations
  33. ;
  34. ;        fp0    = RealTemp
  35. ;        fp1    = ImaginaryTemp
  36. ;
  37. ;        fp2    = Real
  38. ;        fp3    = Imaginary
  39. ;
  40. ;        fp4    = RealValue
  41. ;        fp5    = ImaginaryValue
  42. ;
  43. ;        fp6    = Scratch
  44.  
  45. RealArg        equ    12*7+4
  46. ImaginaryArg    equ    RealArg+8
  47.  
  48. _Iterate:
  49.     fmovem.x fp0-fp6,-(sp)            ; Save registers
  50.  
  51.     fmove.d    RealArg(sp),fp4            ; RealValue
  52.     fmove.d    ImaginaryArg(sp),fp5        ; ImaginaryValue
  53.  
  54.     move.l    _MaxIteration(a4),d0        ; MaxIteration -> d0
  55.  
  56.     moveq    #0,d1                ; i = 0
  57.  
  58.     fmove.x    fp4,fp2                ; Real = RealValue
  59.     fmove.x    fp5,fp3                ; Imaginary = ImaginaryValue
  60.  
  61.     bra.b    Skip
  62.  
  63. Loop:    fmul.x    #2.0,fp3            ; Imaginary *= 2
  64.     fmul.x    fp2,fp3                ; Imaginary *= Real
  65.     fadd.x    fp5,fp3                ; Imaginary += ImaginaryValue
  66.  
  67.     fmove.x    fp0,fp2                ; Real = RealTemp
  68.     fsub.x    fp1,fp2                ; Real -= ImaginaryTemp
  69.     fadd.x    fp4,fp2                ; Real += RealValue
  70.  
  71. Skip:    fmove.x    fp2,fp0                ; RealTemp = Real
  72.     fmove.x    fp3,fp1                ; ImaginaryTemp = Imaginary
  73.  
  74.     fmul.x    fp0,fp0                ; RealTemp = RealTemp^2
  75.     fmul.x    fp1,fp1                ; ImaginaryTemp = ImaginaryTemp^2
  76.  
  77.     fmove.x    fp0,fp6                ; RealTemp -> fp6
  78.     fadd.x    fp1,fp6                ; RealTemp += ImaginaryTemp
  79.     fabs.x    fp6,fp6                ; RealTemp = fabs(RealTemp)
  80.  
  81.     fcmp.x    #4.0,fp6            ; RealTemp > 4?
  82.     fbgt.w    Exit                ; true -> break
  83.  
  84.     addq    #1,d1                ; Iterations++;
  85.     subq    #1,d0                ; Maximum number reached?
  86.     bgt.b    Loop                ; false -> Loop;
  87.  
  88.     fmovem.x (sp)+,fp0-fp6            ; Restore registers, return 0
  89.     rts
  90.  
  91. Exit:    move.l    _Wave(a4),a0            ; Get colour wave table
  92.     move.b    (a0,d1.w),d0            ; Get wave index, always > 0
  93.  
  94.     fmovem.x (sp)+,fp0-fp6            ; Restore registers
  95.     rts
  96.  
  97.     section    __MERGED,data
  98.  
  99.     xref    _Wave
  100.     xref    _MaxIteration
  101.  
  102.     end
  103.