Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ============================================================================
- ; ----------------------------------------------------------------------------
- ; Routine to redraw level layout as Sonic goes
- ; Called during VInt
- ; ----------------------------------------------------------------------------
- Level_RedrawLayout:
- lea (VDP_CtrlPort).l,a5
- lea (VDP_DataPort).l,a6
- lea (vScrollBuff+2).w,a2 ; load scroll engine vars (Plane B)
- lea (vCameraBuff+8).w,a3 ; load Camera (Plane B)
- lea (vLevelLayout+$40).w,a4 ; load BG layout
- move.w #$6000,d2 ; VRAM param
- bsr.w Level_RedrawBG1
- lea (vScrollBuff+4).w,a2
- lea (vCameraBuff+$10).w,a3
- bsr.w Level_RedrawBG2
- lea (vScrollBuff).w,a2 ; load scroll engine vars
- lea (vCameraBuff).w,a3 ; load Camera
- lea (vLevelLayout).w,a4 ; load FG layout
- move.w #$4000,d2 ; VRAM param
- tst.b (a2)
- beq.s @NoScroll ; if no scroll flags were set, quit
- bclr #0,(a2) ; level scrolls upwards?
- beq.s @ChkScrollDown ; if not, branch
- moveq #-$10,d4
- moveq #-$10,d5
- bsr.w Level_Draw_CalcVRAMloc
- moveq #-$10,d4
- moveq #-$10,d5
- bsr.w Level_DrawBlocks_Horiz
- @ChkScrollDown:
- bclr #1,(a2) ; level scrolls downwards?
- beq.s @ChkScrollLeft ; if not, branch
- move.w #$E0,d4
- moveq #-$10,d5
- bsr.w Level_Draw_CalcVRAMloc
- move.w #$E0,d4
- moveq #-$10,d5
- bsr.w Level_DrawBlocks_Horiz
- @ChkScrollLeft:
- bclr #2,(a2) ; level scrolls backwards?
- beq.s @ChkScrollRight ; if not, branch
- moveq #-$10,d4
- moveq #-$10,d5
- bsr.w Level_Draw_CalcVRAMloc
- moveq #-$10,d4
- moveq #-$10,d5
- bsr.w Level_DrawBlocks_Vert
- @ChkScrollRight:
- bclr #3,(a2) ; level scroll forwards?
- beq.s @NoScroll ; if not, branch
- moveq #-$10,d4
- move.w #320,d5
- bsr.w Level_Draw_CalcVRAMloc
- moveq #-$10,d4
- move.w #320,d5
- bsr.w Level_DrawBlocks_Vert
- @NoScroll:
- rts
- ; ===========================================================================
- Level_RedrawBG1:
- tst.b (a2)
- beq.w @NoScroll ; if no scroll flags were set, quit
- bclr #0,(a2) ; BG scrolls upwards?
- beq.s @ChkScrollDown ; if not, branch
- moveq #-$10,d4
- moveq #-$10,d5
- bsr.w Level_Draw_CalcVRAMloc
- moveq #-$10,d4
- moveq #-$10,d5
- moveq #$1F,d6
- bsr.w Level_DrawBlocks_Horiz_2
- @ChkScrollDown:
- bclr #1,(a2) ; BG scrolls downwards?
- beq.s @ChkScrollLeft ; if not, branch
- move.w #$E0,d4
- moveq #-$10,d5
- bsr.w Level_Draw_CalcVRAMloc
- move.w #$E0,d4
- moveq #-$10,d5
- moveq #$1F,d6
- bsr.w Level_DrawBlocks_Horiz_2
- @ChkScrollLeft:
- bclr #2,(a2) ; BG scrolls left?
- beq.s @ChkScrollRight ; if not, branch
- moveq #-$10,d4
- moveq #-$10,d5
- bsr.w Level_Draw_CalcVRAMloc
- moveq #-$10,d4
- moveq #-$10,d5
- move.w ($FFFFF7F0).w,d6 ; block height (in pixels)
- move.w 4(a3),d1 ; Camera Ypos
- andi.w #$FFF0,d1
- sub.w d1,d6
- blt.s @ChkScrollRight ; if block is outside screen area, skip scroll
- lsr.w #4,d6 ; get blocks num
- cmpi.w #$F,d6 ; is blocks num > $10?
- bcs.s @skip ; if not, branch
- moveq #$F,d6
- @skip: bsr.w Level_DrawBlocks_Vert_2
- @ChkScrollRight:
- bclr #3,(a2) ; BG scrolls right
- beq.s @NoScroll ; if not, branch
- moveq #-$10,d4
- move.w #320,d5
- bsr.w Level_Draw_CalcVRAMloc
- moveq #-$10,d4
- move.w #320,d5
- move.w ($FFFFF7F0).w,d6 ; block height (in pixels)
- move.w 4(a3),d1 ; Camera Ypos
- andi.w #$FFF0,d1
- sub.w d1,d6
- blt.s @NoScroll ; if block is outside screen area, skip scroll
- lsr.w #4,d6 ; get blocks num
- cmpi.w #$F,d6 ; is blocks num > $10?
- bcs.s @skip2 ; if not, branch
- moveq #$F,d6
- @skip2: bsr.w Level_DrawBlocks_Vert_2
- @NoScroll:
- rts
- ; ===========================================================================
- Level_RedrawBG2:
- tst.b (a2)
- beq.w @NoScroll ; if no scroll flags were set, quit
- bclr #2,(a2) ; BG scrolls left?
- beq.s @ChkScrollRight ; if not, branch
- cmpi.w #$10,(a3) ; is camera X pos >= $10?
- bcs.s @ChkScrollRight ; if not, branch
- move.w ($FFFFF7F0).w,d4
- move.w 4(a3),d1 ; Camera Y pos
- andi.w #$FFF0,d1
- sub.w d1,d4
- move.w d4,-(sp)
- moveq #-$10,d5
- bsr.w Level_Draw_CalcVRAMloc
- move.w (sp)+,d4
- moveq #-$10,d5
- move.w ($FFFFF7F0).w,d6
- move.w 4(a3),d1
- andi.w #$FFF0,d1
- sub.w d1,d6
- blt.s @ChkScrollRight
- lsr.w #4,d6
- subi.w #$E,d6
- bhs.s @ChkScrollRight
- neg.w d6
- bsr.w Level_DrawBlocks_Vert_2
- @ChkScrollRight:
- bclr #3,(a2) ; BG scrolls right?
- beq.s @NoScroll ; if not, branch
- move.w ($FFFFF7F0).w,d4
- move.w 4(a3),d1 ; Camera Y pos
- andi.w #$FFF0,d1
- sub.w d1,d4
- move.w d4,-(sp)
- move.w #320,d5
- bsr.w Level_Draw_CalcVRAMloc
- move.w (sp)+,d4
- move.w #320,d5
- move.w ($FFFFF7F0).w,d6
- move.w 4(a3),d1
- andi.w #$FFF0,d1
- sub.w d1,d6
- blt.s @NoScroll
- lsr.w #4,d6
- subi.w #$E,d6
- bhs.s @NoScroll
- neg.w d6
- bsr.w Level_DrawBlocks_Vert_2
- @NoScroll:
- rts
- ; ===========================================================================
- ; ############# NOT IMPRELENTED #############################################
- loc_6AAC:
- bclr #3,(a2)
- beq.s locret_6AD6
- move.w #$D0,d4
- move.w 4(a3),d1
- andi.w #-$10,d1
- sub.w d1,d4
- move.w d4,-(sp)
- move.w #$140,d5
- bsr.w sub_6C3C
- move.w (sp)+,d4
- move.w #320,d5
- moveq #2,d6
- bsr.w Level_DrawBlocks_Vert_2
- locret_6AD6:
- rts
- ; ============================================================================
- ; ----------------------------------------------------------------------------
- ; Draw Horizontal Line of blocks (for vertical scrolling)
- ; ----------------------------------------------------------------------------
- Level_DrawBlocks_Horiz:
- moveq #$15,d6 ; do $16 blocks (352 px)
- ; ----------------------------------------------------------------------------
- Level_DrawBlocks_Horiz_2:
- move.l #$800000,d7 ; row factor
- move.l d0,d1
- @DoBlock:
- movem.l d4-d5,-(sp)
- bsr.w Level_Draw_LoadBlock
- move.l d1,d0
- bsr.w Level_DrawBlock
- addq.b #4,d1
- andi.b #$7F,d1
- movem.l (sp)+,d4-d5
- addi.w #$10,d5
- dbf d6,@DoBlock
- rts
- ; ============================================================================
- ; ----------------------------------------------------------------------------
- ; Draw Vertical Line of blocks (for horizontal scrolling)
- ; ----------------------------------------------------------------------------
- Level_DrawBlocks_Vert:
- moveq #$F,d6 ; do $10 blocks (256 px)
- ; ----------------------------------------------------------------------------
- Level_DrawBlocks_Vert_2:
- move.l #$800000,d7
- move.l d0,d1
- @DoBlock:
- movem.l d4-d5,-(sp)
- bsr.w Level_Draw_LoadBlock
- move.l d1,d0
- bsr.w Level_DrawBlock
- addi.w #$100,d1
- andi.w #$FFF,d1
- movem.l (sp)+,d4-d5
- addi.w #$10,d4
- dbf d6,@DoBlock
- rts
- ; ============================================================================
- ; ---------------------------------------------------------------------------
- ; Subroutine to draw 16x16 block on screen
- ; ---------------------------------------------------------------------------
- Level_DrawBlock:
- or.w d2,d0
- swap d0
- btst #4,(a0)
- bne.s @FlipY
- btst #3,(a0)
- bne.s @FlipX
- move.l d0,(a5) ; Set VRAM loc
- move.l (a1)+,(a6) ; Write first 16x16 block half
- add.l d7,d0 ; Next screen row
- move.l d0,(a5) ; Set VRAM loc
- move.l (a1)+,(a6) ; Write second 16x16 block half
- rts
- @FlipX:
- move.l d0,(a5) ; Set VRAM loc
- move.l (a1)+,d4
- eori.l #$08000800,d4
- swap d4
- move.l d4,(a6) ; Write first 16x16 block half
- add.l d7,d0 ; Next screen row
- move.l d0,(a5) ; Set VRAM loc
- move.l (a1)+,d4
- eori.l #$8000800,d4
- swap d4
- move.l d4,(a6) ; Write second 16x16 block half
- rts
- @FlipY:
- btst #3,(a0)
- bne.s @FlipXY
- move.l d0,(a5) ; Set VRAM loc
- move.l (a1)+,d5
- move.l (a1)+,d4
- eori.l #$10001000,d4
- move.l d4,(a6) ; Write first 16x16 block half
- add.l d7,d0 ; Next screen row
- move.l d0,(a5)
- eori.l #$10001000,d5
- move.l d5,(a6) ; Write second 16x16 block half
- rts
- @FlipXY:
- move.l d0,(a5) ; Set VRAM loc
- move.l (a1)+,d5
- move.l (a1)+,d4
- eori.l #$18001800,d4
- swap d4
- move.l d4,(a6) ; Write first 16x16 block half
- add.l d7,d0 ; Next screen row
- move.l d0,(a5) ; Set VRAM loc
- eori.l #$18001800,d5
- swap d5
- move.l d5,(a6) ; Write second 16x16 block half
- rts
- ; ===========================================================================
- ; ############# UNUSED ######################################################
- rts
- ; ===========================================================================
- ; ############# UNUSED ######################################################
- move.l d0,(a5)
- move.w #$2000,d5
- move.w (a1)+,d4
- add.w d5,d4
- move.w d4,(a6)
- move.w (a1)+,d4
- add.w d5,d4
- move.w d4,(a6)
- add.l d7,d0
- move.l d0,(a5)
- move.w (a1)+,d4
- add.w d5,d4
- move.w d4,(a6)
- move.w (a1)+,d4
- add.w d5,d4
- move.w d4,(a6)
- rts
- ; ---------------------------------------------------------------------------
- ; Subroutine to load 16x16 by its number
- ; ---------------------------------------------------------------------------
- ;sub_6BD6: ; XREF: sub_6ADA; sub_6B06
- Level_Draw_LoadBlock:
- lea (vMaps16x16).w,a1 ; 16x16 blocks
- add.w 4(a3),d4 ; d4 += CamY
- add.w (a3),d5 ; d5 += CamX
- move.w d4,d3
- lsr.w #1,d3
- andi.w #$380,d3
- lsr.w #3,d5
- move.w d5,d0
- lsr.w #5,d0
- andi.w #$7F,d0
- add.w d3,d0
- moveq #-1,d3
- move.b (a4,d0.w),d3
- beq.s @Return
- subq.b #1,d3
- andi.w #$7F,d3
- ror.w #7,d3
- add.w d4,d4
- andi.w #$1E0,d4
- andi.w #$1E,d5
- add.w d4,d3
- add.w d5,d3
- movea.l d3,a0
- move.w (a0),d3
- andi.w #$3FF,d3
- lsl.w #3,d3
- adda.w d3,a1 ; calculate this block offset
- @Return:
- rts
- ; ============================================================================
- ;sub_6C20:
- Level_Draw_CalcVRAMloc:
- add.w 4(a3),d4 ; d4 += CamY
- add.w (a3),d5 ; d5 += CamX
- andi.w #$F0,d4 ; d4 -> Y Block Pos (range $100)
- andi.w #$1F0,d5 ; d5 -> X Block Pos (range $200)
- lsl.w #4,d4 ; d4 *= $10
- lsr.w #2,d5 ; d5 /= 4
- add.w d5,d4 ; d4 -> (YBlock * $10) + (XBlock / 4)
- moveq #3,d0
- swap d0 ; d0 = $0003 0000
- move.w d4,d0 ; d0 = $0003 xxxx ???
- rts
- ; ############# UNUSED ######################################################
- sub_6C3C:
- ; Same as above, but some different VRAM loc shit
- add.w 4(a3),d4
- add.w (a3),d5
- andi.w #$F0,d4
- andi.w #$1F0,d5
- lsl.w #4,d4
- lsr.w #2,d5
- add.w d5,d4
- moveq #2,d0
- swap d0
- move.w d4,d0
- rts
- ; End of function sub_6C3C
- ; ===========================================================================
- ; ---------------------------------------------------------------------------
- ; Subroutine to draw playfield when level appears
- ; ---------------------------------------------------------------------------
- Level_DrawLayout:
- lea (VDP_CtrlPort).l,a5
- lea (VDP_DataPort).l,a6
- lea (vCameraPlaneA).w,a3 ; camera location for Plane A
- lea (vLevelLayout).w,a4 ; FG layout
- move.w #$4000,d2
- bsr.s @DrawPlane
- lea (vCameraPlaneB).w,a3 ; camera location for Plane B
- lea (vLevelLayout+$40).w,a4 ; BG layout
- move.w #$6000,d2
- @DrawPlane:
- moveq #-$10,d4
- moveq #$F,d6
- @DrawBlockRow:
- movem.l d4-d6,-(sp)
- moveq #0,d5
- move.w d4,d1
- bsr.w Level_Draw_CalcVRAMloc
- move.w d1,d4 ; d4 = -$10
- moveq #0,d5
- moveq #$1F,d6 ; do $20 blocks
- bsr.w Level_DrawBlocks_Horiz_2;sub_6ADA
- movem.l (sp)+,d4-d6
- addi.w #$10,d4
- dbf d6,@DrawBlockRow ; do $10 rows of $20 blocks
- rts
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement