home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 39 / af039a.adf / play_anim.s < prev    next >
Text File  |  1992-08-24  |  4KB  |  189 lines

  1. ;    include    nfa.i
  2. *****************************************************************************
  3. _play_anim ; a4-> animation buffer ,a5->loop back point, d0 = 'INIT' to start anim
  4.     cmp.l    #'INIT',d0
  5.     bne.s    .not_init
  6.         move.l    (a4)+,a5        frames, noloop
  7.         bsr.s    _first_frame
  8.         move.l    #'FRM2',d0
  9.         rts
  10. .not_init
  11.     cmp.l    #'FRM2',d0
  12.     bne.s    .not_frame2
  13.         bsr        _d2w
  14.         bsr        _next_frame
  15.         move.l    a5,d0
  16.         tst.w    d0
  17.         beq.s    .loop
  18. .noloop
  19.             sub.l    a5,a5
  20.             clr.w    d0
  21.             swap    d0
  22.             rts
  23. .loop
  24.             move.l    a4,a5       loop back point
  25.             move.l    d0,d1
  26.             swap    d1
  27.             move.w    d1,d0        loop count in d0 twice
  28.             rts
  29. .not_frame2
  30.     cmp.l    #'STOP',d0
  31.     bne.s    .normal_frame
  32.         rts
  33. .normal_frame
  34.     move.l    d0,-(sp)            i have actually got to use the stack!
  35.     bsr     _next_frame
  36.     move.l    (sp)+,d0
  37.     subq.w    #1,d0
  38.     cmp.w    #1,d0
  39.     bne.s    .end
  40.         swap    d0
  41.         tst.w    d0                does it loop?
  42.         bne.s    .isloop
  43.             move.l    #'STOP',d0
  44. ;            bsr        _d2w
  45.             rts
  46. .isloop
  47.         move.w    d0,d1
  48.         swap    d0
  49.         move.w    d1,d0
  50.         move.l    a5,a4
  51. .end
  52.     rts
  53. *****************************************************************************
  54. _first_frame
  55.     bsr        _use_anim_pal
  56.     move.l    _w_screen,a0
  57.     moveq    #256-(A_SCREEN_HEIGHT-1),d7
  58.     neg.b    d7
  59. .lineloop
  60.         moveq    #A_PLANES-1,d5
  61. .planeloop
  62.             moveq    #A_SCREEN_WIDTH,d6
  63. .another_groinal_overlay
  64.             moveq    #0,d0
  65.             move.b    (a4)+,d0
  66.             bmi.s    .byte_run
  67. .normal_data
  68.                 sub.w    d0,d6                count down
  69.                 subq.w    #1,d6
  70. .ndloop
  71.                     move.b    (a4)+,(a0)+
  72.                     dbra    d0,.ndloop
  73.                 tst.w    d6
  74.                 beq.s    .plane_done
  75.                 bra.s    .another_groinal_overlay
  76. .byte_run
  77.                 neg.b    d0
  78.                 sub.w    d0,d6
  79.                 subq.w    #1,d6
  80.                 move.b    (a4)+,d1
  81. .brloop
  82.                     move.b    d1,(a0)+
  83.                     dbra    d0,.brloop
  84.                 tst.w    d6
  85.                 bne.s    .another_groinal_overlay
  86. .plane_done
  87.             lea        A_SCREEN_WIDTH*(A_SCREEN_HEIGHT-1)(a0),a0
  88.             dbra    d5,.planeloop
  89.         adda.l    #A_SCREEN_WIDTH-A_PLANES*A_SCREEN_WIDTH*A_SCREEN_HEIGHT,a0
  90.         dbra    d7,.lineloop
  91.     rts
  92. *****************************************************************************
  93. _d2w
  94.     move.w    #A_SCREEN_WIDTH*A_SCREEN_HEIGHT*A_PLANES/4-1,d1
  95.     move.l    _d_screen,a0
  96.     move.l    _w_screen,a1
  97.  
  98. .cloop
  99.         move.l    (a0)+,(a1)+
  100.         dbra    d1,.cloop
  101.     rts
  102. *****************************************************************************
  103. _use_anim_pal ; a4-> palette
  104.     move.l  _copper_list,a1
  105.     move.l  _copper_list+4,a2
  106.     move.w    #$180,d0
  107. .a1loop
  108.         cmp.w   (a1)+,d0
  109.         bne.s    .a1loop
  110. .a2loop
  111.         cmp.w   (a2)+,d0
  112.         bne.s    .a2loop
  113.     moveq    #1<<A_PLANES-1,d1
  114. .loop
  115.         move.w    (a4)+,d0
  116.         move.w  d0,(a1)
  117.         move.w  d0,(a2)
  118.         addq.l    #4,a1
  119.         addq.l    #4,a2
  120.         dbra    d1,.loop
  121.     rts
  122. *****************************************************************************
  123. _next_frame
  124.  
  125.     move.l    _w_screen,a0
  126.     moveq    #A_SCREEN_WIDTH,d2        for moving down a line
  127.     moveq    #A_PLANES-1,d7
  128. .ploop
  129.         cmpi.b    #-1,(A4)
  130.         bne.s    .this_plane_used
  131.             addq.l    #1,a4
  132.             bra.s    .no_plane
  133. .this_plane_used
  134.         moveq    #A_SCREEN_WIDTH-1,d6
  135. .xloop
  136.             move.l    a0,a3            screen pointer for this column
  137.             moveq    #0,d5
  138.             move.b    (a4)+,d5
  139.             beq.s    .next_column
  140.             subq.w    #1,d5
  141. .yloop
  142.                 moveq    #0,d0
  143.                 move.b    (a4)+,d0
  144.                 bgt.s    .skip_ops
  145.                 beq.s    .same_ops
  146. .unique_ops
  147.                 andi.w    #%1111111,d0
  148.                 subq.w    #1,d0
  149. .unique_loop
  150.                     move.b    (a4)+,(a3)
  151.                     adda.w    d2,a3
  152.                     dbra    d0,.unique_loop
  153.                 dbra    d5,.yloop
  154.                 bra.s    .next_column
  155. .same_ops
  156.                 moveq    #0,d4
  157.                 move.b    (a4)+,d4
  158.                 subq.w    #1,d4
  159.                 move.b    (a4)+,d3
  160. .sameloop
  161.                     move.b    d3,(a3)
  162.                     adda.w    d2,a3                    move down a line
  163.                     dbra    d4,.sameloop
  164.                 dbra    d5,.yloop
  165.                 bra.s    .next_column
  166. .skip_ops
  167.                 add.w    d0,d0                        for lookup
  168.                 adda.w    .offsets(pc,d0.w),a3        skip
  169.                 dbra    d5,.yloop
  170.  
  171. .next_column
  172.             addq.l    #1,a0
  173.             dbra    d6,.xloop
  174. .next_plane
  175.         lea        A_SCREEN_WIDTH*(A_SCREEN_HEIGHT-1)(a0),a0
  176.         dbra    d7,.ploop
  177.     rts
  178. .no_plane
  179.         lea        A_SCREEN_WIDTH*A_SCREEN_HEIGHT(a0),a0
  180.         dbra    d7,.ploop
  181.     rts
  182. .offsets
  183. dct    set    0
  184.     rept    A_SCREEN_HEIGHT
  185.     dc.w    dct
  186. dct    set        dct+A_SCREEN_WIDTH
  187.     endr
  188. *****************************************************************************
  189.