Advertisement
vladikcomper

Sonic 2 - CPZ deformation code annotated

Jun 22nd, 2012
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ===========================================================================
  2. ; loc_D27C:
  3. SwScrl_CPZ:
  4.     move.w  (Camera_X_pos_diff).w,d4
  5.     ext.l   d4
  6.     asl.l   #5,d4               ; d4 = CamXdiff / 8 (16 fixed)
  7.     move.w  (Camera_Y_pos_diff).w,d5
  8.     ext.l   d5
  9.     asl.l   #6,d5               ; d5 = CamYdiff / 4 (16 fixed)
  10.     bsr.w   SetHorizVertiScrollFlagsBG  ; scroll layer #1!
  11.     move.w  (Camera_X_pos_diff).w,d4
  12.     ext.l   d4
  13.     asl.l   #7,d4               ; d4 = CamXdiff / 2 (16 fixed)
  14.     moveq   #4,d6               ; set bit #2 of scroll flags
  15.     bsr.w   SetHorizScrollFlagsBG2      ; scroll layer #2!
  16.  
  17.     move.w  (Camera_BG_Y_pos).w,d0
  18.     move.w  d0,(Camera_BG2_Y_pos).w
  19.     move.w  d0,(Vscroll_Factor+2).w     ; set Y-pos to VSRAM buffer
  20.     move.b  (Scroll_flags_BG).w,d0
  21.     or.b    (Scroll_flags_BG2).w,d0
  22.     move.b  d0,(Scroll_flags_BG3).w
  23.     clr.b   (Scroll_flags_BG).w
  24.     clr.b   (Scroll_flags_BG2).w
  25.     move.b  (Vint_runcount+3).w,d1      ; >> weak point, what if game lags?
  26.     andi.w  #7,d1
  27.     bne.s   +
  28.     subq.w  #1,(TempArray_LayerDef).w
  29. +
  30.     lea (byte_DDD0+1).l,a0      ; ???
  31.     move.w  (Camera_BG_Y_pos).w,d0
  32.     move.w  d0,d2               ; d2 = BG Ypos
  33.     andi.w  #$3F0,d0
  34.     lsr.w   #4,d0               ; d0 = number of 16-px scroll block to start from
  35.     lea (a0,d0.w),a0
  36.     move.w  d0,d4               ; d4 = current 16-px block
  37.     lea (Horiz_Scroll_Buf).w,a1
  38.     move.w  #$E,d1              ; d1 = 16-px blocks to do
  39.     move.w  (Camera_X_pos).w,d0
  40.     neg.w   d0
  41.     swap    d0              ; setup plane A scrolling
  42.     andi.w  #$F,d2              ; d2 = pixels left outside of screen for the top block
  43.     move.w  (Camera_BG_X_pos).w,d0      ; load scroll value for layer #1
  44.     cmpi.b  #$12,d4             ; are we going to scroll block $12 (ripple)?
  45.     beq.s   loc_D34A            ; if yes, branch
  46.     blo.s   +               ; if less than, branch
  47.     move.w  (Camera_BG2_X_pos).w,d0     ; load scroll value for layer #2
  48. +
  49.     neg.w   d0
  50.     add.w   d2,d2
  51.     jmp ++(pc,d2.w)         ; jump to 'move.l d0,(a1)+' sequence, at position calculated with D2
  52. ; ===========================================================================
  53.  
  54. -   move.w  (Camera_BG_X_pos).w,d0      ; load scroll value for layer #1
  55.     cmpi.b  #$12,d4             ; are we going to scroll block $12?
  56.     beq.s   +++             ; if yes, branch
  57.     blo.s   +               ; if less than, branch
  58.     move.w  (Camera_BG2_X_pos).w,d0     ; load scroll value for layer #2
  59. +
  60.     neg.w   d0
  61.  
  62. +   rept 16         ; sequence to scroll 16-px block
  63.     move.l  d0,(a1)+
  64.     endm
  65.     addq.b  #1,d4       ; increase current block number
  66.     dbf d1,-        ; repeat for $F 16-px blocks
  67.     rts
  68. ; ===========================================================================
  69. ; Prepare to scroll block $12 (ripple), partially
  70. loc_D34A:
  71.     move.w  #bytesToLcnt($40),d0
  72.     sub.w   d2,d0
  73.     move.w  d0,d2
  74.     bra.s   ++
  75. ; ===========================================================================
  76. ; Prepare to scroll block $12 (ripple), full
  77. +
  78.     move.w  #$F,d2
  79. +
  80.     move.w  (Camera_BG_X_pos).w,d3
  81.     neg.w   d3
  82.     move.w  (TempArray_LayerDef).w,d0
  83.     andi.w  #$1F,d0
  84.     lea SwScrl_RippleData(pc),a2
  85.     lea (a2,d0.w),a2
  86.  
  87. -   move.b  (a2)+,d0
  88.     ext.w   d0
  89.     add.w   d3,d0
  90.     move.l  d0,(a1)+
  91.     dbf d2,-
  92.  
  93.     addq.b  #1,d4       ; increase current block number
  94.     dbf d1,--       ; repeat for $F 16-px blocks
  95.     rts
  96. ; ===========================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement