Advertisement
vladikcomper

Sonic 1 - Level Layout Redraw Code

Aug 31st, 2012
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ============================================================================
  2. ; ----------------------------------------------------------------------------
  3. ; Routine to redraw level layout as Sonic goes
  4. ; Called during VInt
  5. ; ----------------------------------------------------------------------------
  6.  
  7. Level_RedrawLayout:
  8.         lea (VDP_CtrlPort).l,a5
  9.         lea (VDP_DataPort).l,a6
  10.         lea (vScrollBuff+2).w,a2    ; load scroll engine vars (Plane B)
  11.         lea (vCameraBuff+8).w,a3    ; load Camera (Plane B)
  12.         lea (vLevelLayout+$40).w,a4 ; load BG layout
  13.         move.w  #$6000,d2       ; VRAM param
  14.         bsr.w   Level_RedrawBG1
  15.         lea (vScrollBuff+4).w,a2
  16.         lea (vCameraBuff+$10).w,a3
  17.         bsr.w   Level_RedrawBG2
  18.  
  19.         lea (vScrollBuff).w,a2  ; load scroll engine vars
  20.         lea (vCameraBuff).w,a3  ; load Camera
  21.         lea (vLevelLayout).w,a4 ; load FG layout
  22.         move.w  #$4000,d2       ; VRAM param
  23.         tst.b   (a2)
  24.         beq.s   @NoScroll       ; if no scroll flags were set, quit
  25.         bclr    #0,(a2)         ; level scrolls upwards?
  26.         beq.s   @ChkScrollDown      ; if not, branch
  27.         moveq   #-$10,d4
  28.         moveq   #-$10,d5
  29.         bsr.w   Level_Draw_CalcVRAMloc
  30.         moveq   #-$10,d4
  31.         moveq   #-$10,d5
  32.         bsr.w   Level_DrawBlocks_Horiz
  33.  
  34.     @ChkScrollDown:
  35.         bclr    #1,(a2)         ; level scrolls downwards?
  36.         beq.s   @ChkScrollLeft      ; if not, branch
  37.         move.w  #$E0,d4
  38.         moveq   #-$10,d5
  39.         bsr.w   Level_Draw_CalcVRAMloc
  40.         move.w  #$E0,d4
  41.         moveq   #-$10,d5
  42.         bsr.w   Level_DrawBlocks_Horiz
  43.  
  44.     @ChkScrollLeft:
  45.         bclr    #2,(a2)         ; level scrolls backwards?
  46.         beq.s   @ChkScrollRight     ; if not, branch
  47.         moveq   #-$10,d4
  48.         moveq   #-$10,d5
  49.         bsr.w   Level_Draw_CalcVRAMloc
  50.         moveq   #-$10,d4
  51.         moveq   #-$10,d5
  52.         bsr.w   Level_DrawBlocks_Vert
  53.  
  54.     @ChkScrollRight:
  55.         bclr    #3,(a2)         ; level scroll forwards?
  56.         beq.s   @NoScroll       ; if not, branch
  57.         moveq   #-$10,d4
  58.         move.w  #320,d5
  59.         bsr.w   Level_Draw_CalcVRAMloc
  60.         moveq   #-$10,d4
  61.         move.w  #320,d5
  62.         bsr.w   Level_DrawBlocks_Vert
  63.  
  64.     @NoScroll:
  65.         rts
  66.        
  67.  
  68. ; ===========================================================================
  69. Level_RedrawBG1:
  70.         tst.b   (a2)
  71.         beq.w   @NoScroll       ; if no scroll flags were set, quit
  72.         bclr    #0,(a2)         ; BG scrolls upwards?
  73.         beq.s   @ChkScrollDown      ; if not, branch
  74.         moveq   #-$10,d4
  75.         moveq   #-$10,d5
  76.         bsr.w   Level_Draw_CalcVRAMloc
  77.         moveq   #-$10,d4
  78.         moveq   #-$10,d5
  79.         moveq   #$1F,d6
  80.         bsr.w   Level_DrawBlocks_Horiz_2
  81.  
  82.     @ChkScrollDown:
  83.         bclr    #1,(a2)         ; BG scrolls downwards?
  84.         beq.s   @ChkScrollLeft      ; if not, branch
  85.         move.w  #$E0,d4
  86.         moveq   #-$10,d5
  87.         bsr.w   Level_Draw_CalcVRAMloc
  88.         move.w  #$E0,d4
  89.         moveq   #-$10,d5
  90.         moveq   #$1F,d6
  91.         bsr.w   Level_DrawBlocks_Horiz_2
  92.  
  93.     @ChkScrollLeft:
  94.         bclr    #2,(a2)         ; BG scrolls left?
  95.         beq.s   @ChkScrollRight     ; if not, branch
  96.         moveq   #-$10,d4
  97.         moveq   #-$10,d5
  98.         bsr.w   Level_Draw_CalcVRAMloc
  99.         moveq   #-$10,d4
  100.         moveq   #-$10,d5
  101.         move.w  ($FFFFF7F0).w,d6    ; block height (in pixels)
  102.         move.w  4(a3),d1        ; Camera Ypos
  103.         andi.w  #$FFF0,d1
  104.         sub.w   d1,d6
  105.         blt.s   @ChkScrollRight     ; if block is outside screen area, skip scroll
  106.         lsr.w   #4,d6           ; get blocks num
  107.         cmpi.w  #$F,d6          ; is blocks num > $10?
  108.         bcs.s   @skip           ; if not, branch
  109.         moveq   #$F,d6
  110.     @skip:  bsr.w   Level_DrawBlocks_Vert_2
  111.  
  112.     @ChkScrollRight:
  113.         bclr    #3,(a2)         ; BG scrolls right
  114.         beq.s   @NoScroll       ; if not, branch
  115.         moveq   #-$10,d4
  116.         move.w  #320,d5
  117.         bsr.w   Level_Draw_CalcVRAMloc
  118.         moveq   #-$10,d4
  119.         move.w  #320,d5
  120.         move.w  ($FFFFF7F0).w,d6    ; block height (in pixels)
  121.         move.w  4(a3),d1        ; Camera Ypos
  122.         andi.w  #$FFF0,d1
  123.         sub.w   d1,d6
  124.         blt.s   @NoScroll       ; if block is outside screen area, skip scroll
  125.         lsr.w   #4,d6           ; get blocks num
  126.         cmpi.w  #$F,d6          ; is blocks num > $10?
  127.         bcs.s   @skip2          ; if not, branch
  128.         moveq   #$F,d6
  129.     @skip2: bsr.w   Level_DrawBlocks_Vert_2
  130.  
  131.     @NoScroll:
  132.         rts
  133.  
  134. ; ===========================================================================
  135.  
  136. Level_RedrawBG2:
  137.         tst.b   (a2)
  138.         beq.w   @NoScroll       ; if no scroll flags were set, quit
  139.         bclr    #2,(a2)         ; BG scrolls left?
  140.         beq.s   @ChkScrollRight     ; if not, branch
  141.         cmpi.w  #$10,(a3)       ; is camera X pos >= $10?
  142.         bcs.s   @ChkScrollRight     ; if not, branch
  143.         move.w  ($FFFFF7F0).w,d4
  144.         move.w  4(a3),d1        ; Camera Y pos
  145.         andi.w  #$FFF0,d1
  146.         sub.w   d1,d4
  147.         move.w  d4,-(sp)
  148.         moveq   #-$10,d5
  149.         bsr.w   Level_Draw_CalcVRAMloc
  150.         move.w  (sp)+,d4
  151.         moveq   #-$10,d5
  152.         move.w  ($FFFFF7F0).w,d6
  153.         move.w  4(a3),d1
  154.         andi.w  #$FFF0,d1
  155.         sub.w   d1,d6
  156.         blt.s   @ChkScrollRight
  157.         lsr.w   #4,d6
  158.         subi.w  #$E,d6
  159.         bhs.s   @ChkScrollRight
  160.         neg.w   d6
  161.         bsr.w   Level_DrawBlocks_Vert_2
  162.  
  163.     @ChkScrollRight:
  164.         bclr    #3,(a2)         ; BG scrolls right?
  165.         beq.s   @NoScroll       ; if not, branch
  166.         move.w  ($FFFFF7F0).w,d4
  167.         move.w  4(a3),d1        ; Camera Y pos
  168.         andi.w  #$FFF0,d1
  169.         sub.w   d1,d4
  170.         move.w  d4,-(sp)
  171.         move.w  #320,d5
  172.         bsr.w   Level_Draw_CalcVRAMloc
  173.         move.w  (sp)+,d4
  174.         move.w  #320,d5
  175.         move.w  ($FFFFF7F0).w,d6
  176.         move.w  4(a3),d1
  177.         andi.w  #$FFF0,d1
  178.         sub.w   d1,d6
  179.         blt.s   @NoScroll
  180.         lsr.w   #4,d6
  181.         subi.w  #$E,d6
  182.         bhs.s   @NoScroll
  183.         neg.w   d6
  184.         bsr.w   Level_DrawBlocks_Vert_2
  185.  
  186.     @NoScroll:
  187.         rts
  188.  
  189. ; ===========================================================================
  190. ; ############# NOT IMPRELENTED #############################################
  191.  
  192. loc_6AAC:
  193.         bclr    #3,(a2)
  194.         beq.s   locret_6AD6
  195.         move.w  #$D0,d4
  196.         move.w  4(a3),d1
  197.         andi.w  #-$10,d1
  198.         sub.w   d1,d4
  199.         move.w  d4,-(sp)
  200.         move.w  #$140,d5
  201.         bsr.w   sub_6C3C
  202.         move.w  (sp)+,d4
  203.         move.w  #320,d5
  204.         moveq   #2,d6
  205.         bsr.w   Level_DrawBlocks_Vert_2
  206.  
  207. locret_6AD6:
  208.         rts
  209.  
  210.  
  211.  
  212. ; ============================================================================
  213. ; ----------------------------------------------------------------------------
  214. ; Draw Horizontal Line of blocks (for vertical scrolling)
  215. ; ----------------------------------------------------------------------------
  216.  
  217. Level_DrawBlocks_Horiz:
  218.         moveq   #$15,d6         ; do $16 blocks (352 px)
  219.  
  220. ; ----------------------------------------------------------------------------
  221. Level_DrawBlocks_Horiz_2:
  222.         move.l  #$800000,d7     ; row factor
  223.         move.l  d0,d1
  224.  
  225.     @DoBlock:
  226.         movem.l d4-d5,-(sp)
  227.         bsr.w   Level_Draw_LoadBlock
  228.         move.l  d1,d0
  229.         bsr.w   Level_DrawBlock
  230.         addq.b  #4,d1
  231.         andi.b  #$7F,d1
  232.         movem.l (sp)+,d4-d5
  233.         addi.w  #$10,d5
  234.         dbf d6,@DoBlock
  235.         rts
  236.  
  237.  
  238.  
  239. ; ============================================================================
  240. ; ----------------------------------------------------------------------------
  241. ; Draw Vertical Line of blocks (for horizontal scrolling)
  242. ; ----------------------------------------------------------------------------
  243.  
  244. Level_DrawBlocks_Vert:
  245.         moveq   #$F,d6          ; do $10 blocks (256 px)
  246.  
  247. ; ----------------------------------------------------------------------------
  248. Level_DrawBlocks_Vert_2:
  249.         move.l  #$800000,d7
  250.         move.l  d0,d1
  251.  
  252.     @DoBlock:
  253.         movem.l d4-d5,-(sp)
  254.         bsr.w   Level_Draw_LoadBlock
  255.         move.l  d1,d0
  256.         bsr.w   Level_DrawBlock
  257.         addi.w  #$100,d1
  258.         andi.w  #$FFF,d1
  259.         movem.l (sp)+,d4-d5
  260.         addi.w  #$10,d4
  261.         dbf d6,@DoBlock
  262.         rts
  263.  
  264.  
  265. ; ============================================================================
  266. ; ---------------------------------------------------------------------------
  267. ; Subroutine to draw 16x16 block on screen
  268. ; ---------------------------------------------------------------------------
  269.  
  270. Level_DrawBlock:
  271.         or.w    d2,d0
  272.         swap    d0
  273.         btst    #4,(a0)
  274.         bne.s   @FlipY
  275.         btst    #3,(a0)
  276.         bne.s   @FlipX
  277.         move.l  d0,(a5)     ; Set VRAM loc
  278.         move.l  (a1)+,(a6)  ; Write first 16x16 block half
  279.         add.l   d7,d0       ; Next screen row
  280.         move.l  d0,(a5)     ; Set VRAM loc
  281.         move.l  (a1)+,(a6)  ; Write second 16x16 block half
  282.         rts
  283.  
  284.     @FlipX:
  285.         move.l  d0,(a5)     ; Set VRAM loc
  286.         move.l  (a1)+,d4
  287.         eori.l  #$08000800,d4
  288.         swap    d4
  289.         move.l  d4,(a6)     ; Write first 16x16 block half
  290.         add.l   d7,d0       ; Next screen row
  291.         move.l  d0,(a5)     ; Set VRAM loc
  292.         move.l  (a1)+,d4
  293.         eori.l  #$8000800,d4
  294.         swap    d4
  295.         move.l  d4,(a6)     ; Write second 16x16 block half
  296.         rts
  297.  
  298.     @FlipY:
  299.         btst    #3,(a0)
  300.         bne.s   @FlipXY
  301.         move.l  d0,(a5)     ; Set VRAM loc
  302.         move.l  (a1)+,d5
  303.         move.l  (a1)+,d4
  304.         eori.l  #$10001000,d4
  305.         move.l  d4,(a6)     ; Write first 16x16 block half
  306.         add.l   d7,d0       ; Next screen row
  307.         move.l  d0,(a5)
  308.         eori.l  #$10001000,d5
  309.         move.l  d5,(a6)     ; Write second 16x16 block half
  310.         rts
  311.  
  312.     @FlipXY:
  313.         move.l  d0,(a5)     ; Set VRAM loc
  314.         move.l  (a1)+,d5
  315.         move.l  (a1)+,d4
  316.         eori.l  #$18001800,d4
  317.         swap    d4
  318.         move.l  d4,(a6)     ; Write first 16x16 block half
  319.         add.l   d7,d0       ; Next screen row
  320.         move.l  d0,(a5)     ; Set VRAM loc
  321.         eori.l  #$18001800,d5
  322.         swap    d5
  323.         move.l  d5,(a6)     ; Write second 16x16 block half
  324.         rts
  325.        
  326.  
  327. ; ===========================================================================
  328. ; ############# UNUSED ######################################################
  329.         rts
  330. ; ===========================================================================
  331. ; ############# UNUSED ######################################################
  332.         move.l  d0,(a5)
  333.         move.w  #$2000,d5
  334.         move.w  (a1)+,d4
  335.         add.w   d5,d4
  336.         move.w  d4,(a6)
  337.         move.w  (a1)+,d4
  338.         add.w   d5,d4
  339.         move.w  d4,(a6)
  340.         add.l   d7,d0
  341.         move.l  d0,(a5)
  342.         move.w  (a1)+,d4
  343.         add.w   d5,d4
  344.         move.w  d4,(a6)
  345.         move.w  (a1)+,d4
  346.         add.w   d5,d4
  347.         move.w  d4,(a6)
  348.         rts
  349.  
  350. ; ---------------------------------------------------------------------------
  351. ; Subroutine to load 16x16 by its number
  352. ; ---------------------------------------------------------------------------
  353. ;sub_6BD6:              ; XREF: sub_6ADA; sub_6B06
  354. Level_Draw_LoadBlock:
  355.         lea (vMaps16x16).w,a1   ; 16x16 blocks
  356.         add.w   4(a3),d4        ; d4 += CamY
  357.         add.w   (a3),d5         ; d5 += CamX
  358.         move.w  d4,d3
  359.         lsr.w   #1,d3
  360.         andi.w  #$380,d3
  361.         lsr.w   #3,d5
  362.         move.w  d5,d0
  363.         lsr.w   #5,d0
  364.         andi.w  #$7F,d0
  365.         add.w   d3,d0
  366.         moveq   #-1,d3
  367.         move.b  (a4,d0.w),d3
  368.         beq.s   @Return
  369.         subq.b  #1,d3
  370.         andi.w  #$7F,d3
  371.         ror.w   #7,d3
  372.         add.w   d4,d4
  373.         andi.w  #$1E0,d4
  374.         andi.w  #$1E,d5
  375.         add.w   d4,d3
  376.         add.w   d5,d3
  377.         movea.l d3,a0
  378.         move.w  (a0),d3
  379.         andi.w  #$3FF,d3
  380.         lsl.w   #3,d3
  381.         adda.w  d3,a1           ; calculate this block offset
  382.  
  383.     @Return:
  384.         rts
  385.  
  386. ; ============================================================================
  387.  
  388. ;sub_6C20:
  389. Level_Draw_CalcVRAMloc:
  390.         add.w   4(a3),d4    ; d4 += CamY
  391.         add.w   (a3),d5     ; d5 += CamX
  392.         andi.w  #$F0,d4     ; d4 -> Y Block Pos (range $100)
  393.         andi.w  #$1F0,d5    ; d5 -> X Block Pos (range $200)
  394.         lsl.w   #4,d4       ; d4 *= $10
  395.         lsr.w   #2,d5       ; d5 /= 4
  396.         add.w   d5,d4       ; d4 -> (YBlock * $10) + (XBlock / 4)
  397.         moveq   #3,d0
  398.         swap    d0      ; d0 = $0003 0000
  399.         move.w  d4,d0       ; d0 = $0003 xxxx ???
  400.         rts
  401.        
  402. ; ############# UNUSED ######################################################
  403.  
  404. sub_6C3C:
  405. ; Same as above, but some different VRAM loc shit
  406.         add.w   4(a3),d4
  407.         add.w   (a3),d5
  408.         andi.w  #$F0,d4
  409.         andi.w  #$1F0,d5
  410.         lsl.w   #4,d4
  411.         lsr.w   #2,d5
  412.         add.w   d5,d4
  413.         moveq   #2,d0
  414.         swap    d0
  415.         move.w  d4,d0
  416.         rts
  417. ; End of function sub_6C3C
  418.  
  419.  
  420. ; ===========================================================================
  421. ; ---------------------------------------------------------------------------
  422. ; Subroutine to draw playfield when level appears
  423. ; ---------------------------------------------------------------------------
  424.  
  425. Level_DrawLayout:
  426.         lea (VDP_CtrlPort).l,a5
  427.         lea (VDP_DataPort).l,a6
  428.         lea (vCameraPlaneA).w,a3    ; camera location for Plane A
  429.         lea (vLevelLayout).w,a4 ; FG layout
  430.         move.w  #$4000,d2
  431.         bsr.s   @DrawPlane
  432.         lea (vCameraPlaneB).w,a3    ; camera location for Plane B
  433.         lea (vLevelLayout+$40).w,a4 ; BG layout
  434.         move.w  #$6000,d2
  435.  
  436.  
  437. @DrawPlane:
  438.         moveq   #-$10,d4
  439.         moveq   #$F,d6
  440.  
  441.     @DrawBlockRow:
  442.         movem.l d4-d6,-(sp)
  443.         moveq   #0,d5
  444.         move.w  d4,d1
  445.         bsr.w   Level_Draw_CalcVRAMloc
  446.         move.w  d1,d4           ; d4 = -$10
  447.         moveq   #0,d5
  448.         moveq   #$1F,d6         ; do $20 blocks
  449.         bsr.w   Level_DrawBlocks_Horiz_2;sub_6ADA
  450.         movem.l (sp)+,d4-d6
  451.         addi.w  #$10,d4
  452.         dbf d6,@DrawBlockRow    ; do $10 rows of $20 blocks
  453.         rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement