Advertisement
vladikcomper

Sonic 1 - Spin Dust and Skid Dust objects

May 27th, 2012
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Obj05:
  2.         moveq   #0,d0
  3.         move.b  $24(a0),d0
  4.         move    Obj05_Index(pc,d0.w),d1
  5.         jmp Obj05_Index(pc,d1.w)
  6. ; ===========================================================================
  7. Obj05_Index:    dc.w    Obj05_Init-Obj05_Index      ; 0
  8.         dc.w    Obj05_Main-Obj05_Index      ; 2
  9.         dc.w    Obj05_Delete-Obj05_Index    ; 4
  10.         dc.w    Obj05_DoSkid-Obj05_Index    ; 6
  11. ; ===========================================================================
  12.  
  13. Obj05_Init:
  14.         addq.b  #2,$24(a0)      ; => "Obj05_Main"
  15.         move.l  #Map_Obj05,4(a0)
  16.         or.b    #4,1(a0)
  17.         move.b  #1,$18(a0)
  18.         move.b  #$10,$19(a0)
  19.         move    #$7A0,2(a0)
  20.         move    #$D000,$3E(a0)      ; Sonic's object address ($FFFFD000)
  21.         move    #$F400,$3C(a0)      ; DMA destination address (VRAM)
  22.  
  23. Obj05_Main:
  24.         movea.w $3E(a0),a2      ; a2 = Character Object
  25.         moveq   #0,d0
  26.         move.b  $1C(a0),d0      ; d0 = AnimID
  27.         add d0,d0           ; d0 = AnimID*2
  28.         move    Obj05_Index2(pc,d0.w),d1
  29.         jmp Obj05_Index2(pc,d1.w)   ; choose routine according to animation number
  30. ; ===========================================================================
  31. Obj05_Index2:   dc.w    Obj05_Display-Obj05_Index2  ; 0
  32.         dc.w    Obj05_Splash-Obj05_Index2   ; 1
  33.         dc.w    Obj05_Dust-Obj05_Index2     ; 2
  34.         dc.w    Obj05_Display-Obj05_Index2  ; 3
  35. ; ===========================================================================
  36.  
  37. Obj05_Splash:
  38.         move    ($FFFFF646).w,$C(a0)    ; Ypos = Water Level
  39.         tst.b   $1D(a0)         ; is animation over?
  40.         bne.s   Obj05_Display       ; if not, branch
  41.         move    8(a2),8(a0)     ; Xpos = Sonic.Xpos
  42.         move.b  #0,$22(a0)
  43.         and #$7FFF,2(a0)
  44.         bra.s   Obj05_Display
  45. ; ===========================================================================
  46.  
  47. Obj05_Dust:
  48.         cmp.b   #4,$24(a2)
  49.         bcc.s   Obj05_ResetAnim
  50.         tst.b   $39(a2)
  51.         beq.s   Obj05_ResetAnim
  52.     ;   lea ($FFFFD000).w,a2    ; -- WAS LOADED ALREADY!
  53.     ;   cmpi.b  #6,$24(a2)      ; -- DUPLICATE CHECK!
  54.     ;   bcc.s   Obj05_ResetAnim     ;
  55.     ;   tst.b   $39(a2)         ; -- DUPLICATE CHECK!
  56.     ;   beq.s   Obj05_ResetAnim     ;
  57.         move.b  1(a2),1(a0)
  58.         move.w  8(a2),8(a0)
  59.         move.w  $C(a2),$C(a0)
  60.         move.b  $22(a2),$22(a0)
  61.         and.b   #1,$22(a0)
  62.         subq.w  #5,$C(a0)       ; -- was SUB, optimized to SUBQ
  63.         tst.b   $1D(a0)         ; is animation over?
  64.         bne.s   Obj05_Display       ; if not, branch
  65.         and.w   #$7FFF,2(a0)
  66.         tst.b   2(a2)
  67.         bpl.s   Obj05_Display
  68.         or.w    #$8000,2(a0)
  69. ; ===========================================================================
  70.  
  71. Obj05_Display:
  72.         lea Ani_Obj05(pc),a1    ; -- used mode (xxx).l, optimized to d16(pc)
  73.         jsr AnimateSprite
  74.         bsr.w   Load_SpinDust_DPLC
  75.         bra.s   DisplaySprite
  76. ; ===========================================================================
  77.  
  78. Obj05_ResetAnim:
  79.         sf.b    $1C(a0)         ; -- used MOVE.B #0, optimized to ST (takes less space)
  80.         rts
  81. ; ===========================================================================
  82.  
  83. Obj05_Delete:
  84.         bra.w   DeleteObject
  85. ; ===========================================================================
  86.  
  87.  
  88. Obj05_DoSkid:
  89.         movea.w $3E(a0),a2      ; a2 = Character
  90.         moveq   #$10,d1
  91.         cmp.b   #$D,$1C(a2)
  92.         beq.s   loc_1DE64
  93.         moveq   #6,d1
  94.         cmp.b   #3,$21(a2)
  95.         beq.s   loc_1DE64
  96.         move.b  #2,$24(a0)
  97.         move.b  #0,$32(a0)
  98.         rts
  99. ; ===========================================================================
  100.  
  101. loc_1DE64:
  102.         subq.b  #1,$32(a0)      ; is timer over?
  103.         bpl.s   Load_SpinDust_DPLC  ; if not, branch
  104.         move.b  #3,$32(a0)      ; reset timer
  105.         jsr SingleObjLoad
  106.         bne.s   Load_SpinDust_DPLC
  107.         move.b  0(a0),0(a1)
  108.         move    8(a2),8(a1)
  109.         move    $C(a2),$C(a1)
  110.        
  111.     ; -- This was check for Tails, do not want
  112.     ;   tst.b   $34(a0)
  113.     ;   beq.s   loc_1DE9A
  114.     ;   subq.w  #4,d1           ; -- was SUB, optimized to SUBQ
  115.  
  116.     ;loc_1DE9A:
  117.         add.w   d1,$C(a1)
  118.         move.b  #0,$22(a1)
  119.         move.b  #3,$1C(a1)
  120.         addq.b  #2,$24(a1)
  121.         move.l  4(a0),4(a1)
  122.         move.b  1(a0),1(a1)
  123.         move.b  #1,$18(a1)
  124.         move.b  #4,$19(a1)
  125.         move.w  2(a0),2(a1)
  126.         move.w  $3E(a0),$3E(a1)
  127.         and.w   #$7FFF,2(a1)
  128.         tst.w   2(a2)
  129.         bpl.s   Load_SpinDust_DPLC
  130.         or  #-$8000,2(a1)
  131.  
  132.     ; -- Totally useless branch, hey, that code is below!
  133.     ;loc_1DEE0:
  134.     ;   bra.s   Load_SpinDust_DPLC
  135.     ;   rts
  136. ; ===========================================================================
  137.  
  138. Load_SpinDust_DPLC:
  139.         moveq   #0,d0
  140.         move.b  $1A(a0),d0      ; d0 = Frame
  141.         cmp.b   $30(a0),d0      ; Frame = LastFrame?
  142.         beq.w   locret_1DF36        ; if yes, branch
  143.         move.b  d0,$30(a0)      ; LastFrame = Frame
  144.         lea off_1E074(pc),a2    ; -- used mode (xxx).l, optimized to d16(pc)
  145.         add.w   d0,d0
  146.         add.w   (a2,d0.w),a2
  147.         move.w  (a2)+,d5
  148.         subq.w  #1,d5
  149.         bmi.w   locret_1DF36
  150.         move.w  $3C(a0),d4
  151.  
  152. loc_1DF0A:
  153.         moveq   #0,d1
  154.         move.w  (a2)+,d1
  155.         move.w  d1,d3
  156.         lsr.w   #8,d3
  157.         and.w   #$F0,d3
  158.         add.w   #$10,d3
  159.         and.w   #$FFF,d1
  160.         lsl.l   #5,d1
  161.         add.l   #Art_Dust,d1
  162.         move.w  d4,d2
  163.         add.w   d3,d4
  164.         add.w   d3,d4
  165.         jsr (QueueDMATransfer).l
  166.         dbf d5,loc_1DF0A
  167.  
  168. locret_1DF36:
  169.         rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement