Prev: DBE5 Up: Map Next: DCC2
DC4B: Move Tile Down
Used by the routines at EE61 and F43E.
MoveTile_Down DC4B LD A,($E75E) Take *Tile_Vertical_Position and decrease it by one, which adjusts the value for the tile height. Write this value back to *Tile_Vertical_Coordinate.
DC4E DEC A
DC4F LD ($E760),A
Set the total of how many spaces the tile will be moving.
DC52 LD A,($E761) B=*Tile_SpacesToMove.
DC55 LD B,A
This is the tile loop, each space moved will decrease this counter by one.
MoveTile_Down_Loop DC56 PUSH BC Stash the number of spaces left to move on the stack.
DC57 LD A,($E75D) Take *Tile_Horizontal_Position and add 02 which adjusts the value for the tile height. Write this value back to *Tile_Horizontal_Coordinate.
DC5A ADD A,$02
DC5C LD ($E75F),A
Start moving the tile a single space.
DC5F LD B,$04 Set a counter in B for the height of the tile in bytes (04 rows).
MoveTile_Down_RowLoop DC61 PUSH BC Stash the row counter (tile height) on the stack.
Get the screen buffer address from the co-ordinates.
DC62 LD A,($E75F) B=*Tile_Horizontal_Coordinate.
DC65 LD B,A
DC66 LD A,($E760) C=*Tile_Vertical_Coordinate.
DC69 LD C,A
DC6A CALL Calculate_ScreenBlockAddress Call Calculate_ScreenBlockAddress.
DC6D PUSH HL Stash the destination screen buffer address on the stack.
DC6E INC B Call Calculate_ScreenBlockAddress but increment the position by one. This allows us to fetch the screen buffer address of the next position. DE=screen buffer address of the tile + 01.
DC6F CALL Calculate_ScreenBlockAddress
DC72 PUSH HL
DC73 POP DE
DC74 POP HL HL=screen buffer address of the tile.
DC75 LD A,$08 Set the number of bytes in a character block to A.
DC77 LD BC,$0004 Set a counter in B for the number of bytes in a row (04), and set C to 00 which is used for erasing the left-over tile pixels.
DC7A PUSH HL Stash the current screen buffer address of the tile on the stack.
Start moving the current row.
MoveTile_Down_ColumnLoop DC7B PUSH HL Stash the current screen buffer address of the tile on the stack.
DC7C PUSH DE Stash the current screen buffer address of the tile on the stack.
DC7D LDIR LDIR.
DC7F DEC HL Decrease HL by one.
DC80 PUSH HL Stash HL on the stack.
DC81 LD (HL),C Write C to *HL.
DC82 POP DE Restore DE from the stack.
DC83 DEC DE Decrease DE by one.
DC84 LD BC,$0003 BC=0003.
DC87 LDDR LDDR.
DC89 POP DE Restore DE and HL from the stack.
DC8A POP HL
DC8B INC D Move to the next pixel row in the destination address.
DC8C INC H Move to the next pixel row in the source address.
DC8D LD BC,$0004 BC=0004.
DC90 DEC A Decrease the pixel row counter by one.
DC91 JP NZ,MoveTile_Down_ColumnLoop Jump back to MoveTile_Down_ColumnLoop until all pixels in the row have been moved.
DC94 POP HL Restore HL from the stack.
DC95 CALL Calculate_AttributeAddress Call Calculate_AttributeAddress.
Move DE down one attribute row.
DC98 LD HL,$0020 DE+=0020.
DC9B ADD HL,DE
DC9C EX DE,HL
DC9D LD BC,$0004 Copy 0004 attribute bytes from .
DCA0 LDIR
DCA2 LD BC,$0003 BC=0003.
DCA5 LD A,$47 A=INK: WHITE, PAPER: BLACK (BRIGHT) .
DCA7 DEC HL Decrease HL by one.
DCA8 LD (HL),A Write A to *HL.
DCA9 PUSH HL Stash HL on the stack.
DCAA POP DE Restore DE from the stack.
DCAB DEC DE Decrease DE by one.
DCAC LDDR LDDR.
DCAE LD HL,$E75F Decrease *Tile_Horizontal_Coordinate by one.
DCB1 DEC (HL)
DCB2 POP BC Restore the pixel row counter from the stack.
DCB3 DJNZ MoveTile_Down_RowLoop Decrease the pixel row counter by one and loop back to MoveTile_Down_RowLoop until counter is zero.
The tile has successfully moved one space!
DCB5 POP BC Using the number of spaces left to move (from the stack) call Sound_TileMovement.
DCB6 PUSH BC
DCB7 CALL Sound_TileMovement
DCBA LD HL,$E75D Increment *Tile_Horizontal_Position by one.
DCBD INC (HL)
DCBE POP BC Restore the number of spaces left to move from the stack.
DCBF DJNZ MoveTile_Down_Loop Decrease the number of spaces counter by one and loop back to MoveTile_Down_Loop until the tile is in the destination space.
DCC1 RET Return.
Prev: DBE5 Up: Map Next: DCC2