home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff306.lzh / Life / life68.asm < prev    next >
Assembly Source File  |  1990-01-11  |  4KB  |  221 lines

  1. ;
  2. ;   Life in 68020!  Three passes.
  3. ;
  4.     public    _pass1
  5.     public    _pass2
  6.     public    _pass3
  7.     public    _pass3t
  8. ;
  9. ;   First pass:  Calculates t+(t<<1)+(t>>1) for a huge bit string.
  10. ;
  11. ;   Arguments:  long *srca, *dsta, *dstb, len
  12. ;
  13. ;      srca is the source.
  14. ;      dsta is where the low-order destination is written
  15. ;      dstb is where the high-order destination is written
  16. ;      len is the total number of longwords needed
  17. ;
  18. _pass1:
  19.     movem.l    d1/d2/d3/d4/d5/d7/a0/a1/a2,-(sp)
  20.     move.l    40(a7),a0
  21.     move.l    44(a7),a1
  22.     move.l    48(a7),a2
  23.     move.l    52(a7),d7
  24.     move.l    #0,d5
  25.     bra    pass1in
  26. in2:
  27.     swap    d7
  28. inagain:
  29.     move.l    (a0)+,d0
  30.     move.l    d0,d1
  31.     move.l    d0,d2
  32.     lsr.b    #1,d5
  33.     roxr.l    #1,d1
  34.     move.l    d0,d5
  35.     move.b    (a0),d3
  36.     add.b    d3,d3
  37.     addx.l    d2,d2
  38.     move.l    d0,d3
  39.     eor.l    d1,d0
  40.     and.l    d1,d3
  41.     move.l    d2,d4
  42.     and.l    d0,d4
  43.     eor.l    d2,d0
  44.     eor.l    d4,d3
  45.     move.l    d0,(a1)+
  46.     move.l    d3,(a2)+
  47. pass1in:
  48.     dbra    d7,inagain
  49.     swap    d7
  50.     dbra    d7,in2
  51.     movem.l    (sp)+,d1/d2/d3/d4/d5/d7/a0/a1/a2
  52.     move.l    #0,d0
  53.     rts
  54. ;
  55. ;   This second pass does the main work.  It's also the main time sink.
  56. ;
  57. ;   Arguments:  long *srca, *srcb, *srcc, *dsta, mod, len
  58. ;
  59. ;      srca = main source.
  60. ;      srcb = low order source from above
  61. ;      srcc = high order source from above
  62. ;      dsta = where to put the results
  63. ;      mod = byte offset to next/previous row
  64. ;      len = number of longwords to do (again)
  65. ;
  66. _pass2:
  67.     movem.l    d1/d2/d3/d4/d7/a0/a1/a2/a3/a4/a5,-(sp)
  68.     move.l    48(a7),a0
  69.     move.l    52(a7),a2
  70.     move.l    56(a7),a3
  71.     move.l    60(a7),a1
  72.     move.l    64(a7),d0
  73.     move.l    68(a7),d7
  74.     move.l    d0,a4
  75.     neg.l    d0
  76.     move.l    d0,a5
  77.     bra    pass2in
  78. in3:
  79.     swap    d7
  80. in4:
  81.     move.l    (a4,a2.l),d0
  82.     move.l    d0,d1
  83.     move.l    (a5,a2.l),d2
  84.     eor.l    d2,d0
  85.     and.l    d2,d1
  86.     move.l    (a2)+,d2
  87.     move.l    d2,d3
  88.     and.l    d0,d3
  89.     eor.l    d2,d0
  90.     or.l    d3,d1
  91.     move.l    (a4,a3.l),d2
  92.     move.l    d2,d3
  93.     and.l    d1,d2
  94.     eor.l    d3,d1
  95.     move.l    (a5,a3.l),d3
  96.     move.l    d3,d4
  97.     and.l    d1,d3
  98.     eor.l    d4,d1
  99.     eor.l    d3,d2
  100.     move.l    (a3)+,d3
  101.     move.l    d3,d4
  102.     and.l    d1,d3
  103.     eor.l    d4,d1
  104.     eor.l    d3,d2
  105.     not.l    d0
  106.     eor.l    d1,d0
  107.     eor.l    d1,d2
  108.     or.l    (a0)+,d1
  109.     and.l    d1,d0
  110.     and.l    d2,d0
  111.     move.l    d0,(a1)+
  112. pass2in:
  113.     dbra    d7,in4
  114.     swap    d7
  115.     dbra    d7,in3
  116.     movem.l    (sp)+,d1/d2/d3/d4/d7/a0/a1/a2/a3/a4/a5
  117.     move.l    #0,d0
  118.     rts
  119. ;
  120. ;   Third pass.  Clears the perimeter.
  121. ;
  122. ;   Arguments:  long *dst, width, height
  123. ;
  124. ;      dst = destination (and source) to `clear'
  125. ;      width = width of screen in bytes (must be a multiple of 4)
  126. ;      height = height of screen in pixels
  127. ;
  128. _pass3:
  129.     movem.l    d1/d2/d7/a0,-(sp)
  130.     move.l    20(a7),a0
  131.     move.l    #0,d0
  132.     move.l    24(a7),d7
  133.     lsr.w    #2,d7
  134.     bra    loop5
  135. in5:
  136.     move.l    d0,(a0)+
  137. loop5:
  138.     dbra    d7,in5
  139.     sub.w    #2,a0
  140.     move.l    28(a7),d7
  141.     sub.l    #1,d7
  142.     move.l    24(a7),d2
  143.     move.l    #$fffe7fff,d1
  144.     bra    loop6
  145. in6:
  146.     and.l    d1,(a0)
  147.     add.w    d2,a0
  148. loop6:
  149.     dbra    d7,in6
  150.     sub.w    d2,a0
  151.     add.w    #2,a0
  152.     move.l    24(a7),d7
  153.     lsr.w    #2,d7
  154.     bra    loop7
  155. in7:
  156.     move.l    d0,(a0)+
  157. loop7:
  158.     dbra    d7,in7
  159.     movem.l    (sp)+,d1/d2/d7/a0
  160.     move.l    #0,d0
  161.     rts
  162. ;
  163. ;   Third pass.  Clears the perimeter, doing a torus wrap.
  164. ;
  165. ;   Arguments:  long *dst, width, height
  166. ;
  167. ;      dst = destination (and source) to `clear'
  168. ;      width = width of screen in bytes (must be a multiple of 4)
  169. ;      height = height of screen in pixels
  170. ;
  171. _pass3t:
  172.     movem.l    d1/d2/d7/a0/a1,-(sp)
  173.     move.l    24(a7),a0
  174.     move.l    #0,d0
  175.     move.l    32(a7),d2
  176.     sub.l    #2,d2
  177.     mulu.w    30(a7),d2
  178.     lea    (a0,d2.l),a1
  179.     move.l    28(a7),d7
  180.     lsr.w    #2,d7
  181.     bra    loop5t
  182. in5t:
  183.     move.l    (a1)+,(a0)+
  184. loop5t:
  185.     dbra    d7,in5t
  186.     move.l    28(a7),d7
  187.     lsr.w    #2,d7
  188.     bra    loop5u
  189. in5u:
  190.     move.l    (a0)+,(a1)+
  191. loop5u:
  192.     dbra    d7,in5u
  193.     move.l    24(a7),a0
  194.     move.l    28(a7),d0
  195.     lea    -1(a0,d0.l),a1
  196.     move.l    32(a7),d7
  197.     bra    int7t
  198. int6t:
  199.     btst    #6,(a0)
  200.     beq    fb1
  201.     or.b    #1,(a1)
  202.     btst    #1,(a1)
  203.     beq    fb2
  204. fb4:
  205.     or.b    #$80,(a0)
  206.     bra    fb3
  207. fb1:
  208.     and.b    #$fe,(a1)
  209.     btst    #1,(a1)
  210.     bne    fb4
  211. fb2:
  212.     and.b    #$7f,(a0)
  213. fb3:
  214.     add.w    d0,a0
  215.     add.w    d0,a1
  216. int7t:
  217.     dbra    d7,int6t
  218.     movem.l    (sp)+,d1/d2/d7/a0/a1
  219.     move.l    #0,d0
  220.     rts
  221.