Routines |
Prev: 56110 | Up: Map | Next: 56293 |
Get the current tile horizontal co-ordinate.
|
||||
MoveTile_Right | 56190 | LD A,(59229) | Take *Tile_Horizontal_Position and decrease it by one, which adjusts the value for the tile width. Write this value back to *Tile_Horizontal_Coordinate. | |
56193 | DEC A | |||
56194 | LD (59231),A | |||
Set the total of how many spaces the tile will be moving.
|
||||
56197 | LD A,(59233) | B=*Tile_SpacesToMove. | ||
56200 | LD B,A | |||
This is the tile loop, each space moved will decrease this counter by one.
|
||||
MoveTile_Right_Loop | 56201 | PUSH BC | Stash the number of spaces left to move on the stack. | |
Get the current tile vertical co-ordinate.
|
||||
56202 | LD A,(59230) | Take *Tile_Vertical_Position and add 2 which adjusts the value for the tile height. Write this value back to *Tile_Vertical_Coordinate. | ||
56205 | ADD A,2 | |||
56207 | LD (59232),A | |||
Start moving the tile a single space.
|
||||
56210 | LD B,4 | Set a counter in B for the height of the tile in bytes (4 rows). | ||
MoveTile_Right_RowLoop | 56212 | PUSH BC | Stash the row counter (tile height) on the stack. | |
Get the screen buffer address from the co-ordinates.
|
||||
56213 | LD A,(59231) | B=*Tile_Horizontal_Coordinate. | ||
56216 | LD B,A | |||
56217 | LD A,(59232) | C=*Tile_Vertical_Coordinate. | ||
56220 | LD C,A | |||
56221 | CALL Calculate_ScreenBlockAddress | Call Calculate_ScreenBlockAddress. | ||
56224 | LD A,8 | Set the number of bytes in a character block to A. | ||
56226 | LD BC,4 | Set a counter in B for the number of bytes in a row (4), and set C to 0 which is used for erasing the left-over tile pixels. | ||
56229 | PUSH HL | HL=screen buffer address of the tile. | ||
56230 | POP DE | DE=screen buffer address of the tile (using the stack) + 1. | ||
56231 | INC DE | |||
56232 | PUSH HL | Stash the current screen buffer address of the tile on the stack. | ||
Start moving the current row.
|
||||
MoveTile_Right_ColumnLoop | 56233 | PUSH HL | Stash the current screen buffer address of the tile on the stack. | |
56234 | LDDR | Move 0004 screen data bytes from right to left. | ||
This leaves the last byte unprocessed - which should be blank. So, let's erase it.
|
||||
56236 | INC HL | Erase the right-most byte (C contains 0). | ||
56237 | LD (HL),C | |||
56238 | POP HL | Restore the current screen buffer address from the stack. | ||
56239 | INC H | Move down one row. | ||
Update the screen buffer address for the next loop iteration.
|
||||
56240 | PUSH HL | HL=screen buffer address of the tile. | ||
56241 | POP DE | DE=screen buffer address of the tile (using the stack) + 1. | ||
56242 | INC DE | |||
56243 | LD BC,4 | Restore BC back to 0004. | ||
56246 | DEC A | Decrease the column/ byte counter by one. | ||
56247 | JP NZ,MoveTile_Right_ColumnLoop | Jump to MoveTile_Right_ColumnLoop until all four bytes in this row have been moved. | ||
Now onto the attribute buffer bytes.
Convert the screen buffer location into a corresponding attribute buffer address.
|
||||
56250 | POP HL | Restore the current screen buffer address from the stack. | ||
56251 | CALL Calculate_AttributeAddress | Call Calculate_AttributeAddress. | ||
56254 | PUSH DE | HL=attribute buffer address of the tile (using the stack). | ||
56255 | POP HL | |||
56256 | INC DE | DE=attribute buffer address of the tile + 1. | ||
56257 | LD BC,5 | Move 0005 attribute bytes from right to left. | ||
56260 | LDDR | |||
This leaves the last attribute space unprocessed - which should be blank. So, let's erase it.
|
||||
56262 | LD A,71 | A=INK: WHITE, PAPER: BLACK (BRIGHT) . | ||
56264 | INC DE | Erase the right-most attribute block. | ||
56265 | LD (DE),A | |||
Move to the next attribute row.
|
||||
56266 | LD HL,59231 | Increment *Tile_Horizontal_Coordinate by one. | ||
56269 | INC (HL) | |||
56270 | POP BC | Restore the attribute row counter from the stack. | ||
56271 | DJNZ MoveTile_Right_RowLoop | Decrease the attribute row counter by one and loop back to MoveTile_Right_RowLoop until the whole row has been processed. | ||
The tile has successfully moved one space!
|
||||
56273 | POP BC | Using the number of spaces left to move (from the stack) call Sound_TileMovement. | ||
56274 | PUSH BC | |||
56275 | CALL Sound_TileMovement | |||
56278 | LD A,(59229) | Take *Tile_Horizontal_Position and decrease it by one, which adjusts the value for the tile width. Write it back to *Tile_Horizontal_Coordinate. | ||
56281 | DEC A | |||
56282 | LD (59231),A | |||
56285 | LD HL,59230 | Increment *Tile_Vertical_Position by one. | ||
56288 | INC (HL) | |||
56289 | POP BC | Restore the number of spaces left to move from the stack. | ||
56290 | DJNZ MoveTile_Right_Loop | Decrease the number of spaces counter by one and loop back to MoveTile_Right_Loop until the tile is in the destination space. | ||
56292 | RET | Return. |
Prev: 56110 | Up: Map | Next: 56293 |