home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1062 / calc881.s next >
Encoding:
Text File  |  1990-12-28  |  4.7 KB  |  168 lines

  1.  
  2. # vi:set ts=8 sw=8:
  3. #                         C A L C
  4. #
  5. #     Update history, most recent first.
  6. #
  7. #   Date     Int  Modification
  8. # ---------  ---  --------------------------------------------------------------
  9. # 15-Feb-88  JBM  Pulled the whole loop out of gen, a integrated old iterate().
  10. #           Added optimization for last iteration (not doing it).
  11. # 12-Feb-88  JBM  Worked with James to hack the inner loop in assembler.
  12. # 11-Feb-88  JBM  Added iteration limit parameter.
  13. # 05-Feb-88  JBM  Split from gen.
  14. #
  15.  
  16.     file    "calc.s"    # tell sdb where our source is
  17.     global    Calc        # tell linker what we are
  18.  
  19.     set    FOUR,0x4010000000000000    # 4.0
  20.     set    MEG,0x412e848000000000    # 1 million
  21.     set    DIVERGE,MEG    # SET THIS THE WAY YOU WANT IT
  22.  
  23.     set    F%1,-128    # local variable space
  24.     set    FPO%1,28    # fmovm save area
  25.     set    FPM%1,0x003f    # floating point register save mask
  26.     set    M%1,0x00fc    # 68000 register save mask
  27.  
  28.     set    buf,8        # unsigned short int *
  29.     set    cols,12+2    # int
  30.     set    rows,16+2    # int
  31.     set    Miter,20+2    # unsigned short int
  32.     set    Rmin,24        # double
  33.     set    Rinc,32        # double
  34.     set    Imin,40        # double
  35.     set    Iinc,48        # double
  36.  
  37. # d0 - temp for count corr.    a0 - Current pointer to output buffer
  38. # d1 - max iterations        a1 - (unused)
  39. # d2 - iteration count        a2 - (unused)
  40. # d3 - x position        a3 - (unused)
  41. # d4 - y position        a4 - (unused)
  42. # d5 - cols            a5 - (unused)
  43. # d6 - (unused)            fp - argument frame pointer
  44. # d7 - (unused)            sp - stack pointer
  45.  
  46. # fp0 - 
  47. # fp1 - 
  48. # fp2 - real coordinate
  49. # fp3 - imaginary coordinate
  50. # fp4 - 
  51. # fp5 - 
  52. # fp6 - Holds one million constant
  53. # fp7 - 
  54.  
  55.     text
  56.  
  57. Calc:    tst.b    F%1-256(%sp)        # ? beats me
  58.     link    %fp,&F%1        # allocate local vars space
  59.     movm.l    &M%1,(4,%sp)        # save caller's registers
  60.     fmovm    &FPM%1,(FPO%1,%sp)    # save callers 881 registers
  61.  
  62.     mov.l    &0,%d0        # we use these for word
  63.     mov.l    &0,%d1
  64.     mov.l    &0,%d2
  65.     mov.l    &0,%d3
  66.     mov.l    &0,%d4
  67.     mov.l    &0,%d5
  68.     mov.l    (buf,%fp),%a0    # address of output buffer
  69.     mov.w    (cols,%fp),%d5    # number of columns
  70.     mov.w    (rows,%fp),%d4    # number of rows
  71.     sub.w    &1,%d4        # loop from rows-1 down
  72.     mov.w    (Miter,%fp),%d1    # get low 16 bits of max_iter
  73.     sub.w    &2,%d1        # because fdbcc goes to -1, and off by 1
  74.     fmov.d    &DIVERGE,%fp6    # see config above
  75.  
  76. L%%3:    fmov.w    %d4,%fp0    # get and convert y pixel offset
  77.     fmov.d    (Iinc,%fp),%fp3    # get imagnary amount per pixel
  78.     fmul.x    %fp0,%fp3    # multiply y to get offset
  79.     fmov.d    (Imin,%fp),%fp0    # get and extend imaginary base
  80.     fadd.x    %fp0,%fp3    # add to base to get coordinate
  81.  
  82.     mov.l    &0,%d3        # start at beginning of row
  83. L%%2:    fmov.w    %d3,%fp0    # see above
  84.     fmov.d    (Rinc,%fp),%fp2
  85.     fmul.x    %fp0,%fp2
  86.     fmov.d    (Rmin,%fp),%fp0
  87.     fadd.x    %fp0,%fp2    # real coordinate
  88.  
  89.     fmovcr    &0x0F,%fp4    # Zr
  90.     fmovcr    &0x0F,%fp5    # Zi
  91.     fmovcr    &0x0F,%fp0    # Zr2
  92.     fmovcr    &0x0F,%fp7    # Zi2
  93.  
  94.     mov.w    %d1,%d2        # get max iterations (count down for fdbcc)
  95. # fmov.d %fp2,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
  96. # fmov.d %fp3,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
  97. # mov.l &prnl,(%sp); jsr printf
  98. L%%1:
  99. # fmov.d %fp4,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
  100. # fmov.d %fp5,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
  101. # mov.l &prnl,(%sp); jsr printf
  102.     fsub.x    %fp7,%fp0    # Zr2-Zi2
  103.     fadd.x    %fp2,%fp0    # +Cr
  104.  
  105.     fmov.x    %fp4,%fp1    # get Zr
  106.     fmul.x    %fp5,%fp1    # Zi*Zr
  107.     fadd.x    %fp1,%fp1    # *2
  108.     fadd.x    %fp3,%fp1    # +Ci
  109.  
  110.     fmov.x    %fp0,%fp4    # save next Zr
  111.     fmov.x    %fp1,%fp5    # save next Zi
  112.     fmul.x    %fp0,%fp0    # save next Zr2
  113.  
  114.     fmul.x    %fp1,%fp1
  115.     fmov.x    %fp1,%fp7    # save next Zi2
  116.  
  117.     fadd.x    %fp0,%fp1    # Zr2+Zi2 (distance squared)
  118.     fcmp.x    %fp1,%fp6    # infinity yet?
  119.     fdbnlt    %d2,L%%1    # ran away to infinity or we got bored
  120.  
  121.     mov.w    %d1,%d0        # copy max
  122.     sub.w    %d2,%d0        # flip from leftover to actual count
  123.     add.w    &1,%d0        # we actually went one more iteration
  124.     mov.w    %d0,(%a0)+    # save count in buffer
  125.  
  126. # fmov.w %d0,%fp1
  127. # fmov.d %fp1,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
  128. # mov.l &prnl,(%sp); jsr printf
  129.  
  130. # mov.l %d0,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
  131. # mov.l %d1,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
  132. # mov.l %d2,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
  133. # mov.l %d3,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
  134. # mov.l %d4,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
  135. # mov.l %d5,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
  136. # mov.l &prnl,(%sp); jsr printf
  137.  
  138.     add.w    &1,%d3        # bump up the x counter
  139.     cmp.w    %d3,%d5
  140.     blt    L%%2        # x < cols, loop back
  141.  
  142.     sub.w    &1,%d4        # one more row done
  143.     tst.w    %d4
  144.     bge    L%%3        # still >0, loop back
  145.  
  146.     movm.l    (4,%sp),&0x00fc
  147.     fmovm    (FPO%1,%sp),&0x003f
  148.     unlk    %fp
  149.     rts
  150.  
  151. # fmov.d %fp2,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
  152. # mov.l %d0,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
  153. # mov.l &prnl,(%sp); jsr printf
  154.  
  155.     data    2
  156.     align    2
  157. prfl:
  158.     byte    '%,'.,'1,'7,'l,'e,0x20,0x00
  159.     align    2
  160. prin:
  161.     byte    '%,'d,0x20,0x00
  162.     align    2
  163. prnl:
  164.     byte    '\n,0x00
  165.     align    2
  166. prdt:
  167.     byte    '.,0x00
  168.