Prev: 68AC Up: Map Next: 68E8
68AD: Remove Sprites
Used by the routines at 6AAC, Game_Loop, 6E18, Handler_Fuel and 76D7.
RemoveSprites 68AD LD A,($781B) Return if *ActiveSpriteBlocks is zero (no sprite blocks on the screen).
68B0 AND A
68B1 RET Z
Whilst this routine is clearing sprites, the data is stored per character block, e.g. a kangaroo may span 3 character blocks - and data is stored individually for each of those three blocks, so the count is +3 for a kangaroo (when it is covering those three blocks).
68B2 LD HL,($781C) Load *SpriteBackgroundBuffer_Pointer into HL.
68B5 LD B,A Set a counter in B of the number of character blocks needed to clear all the sprites.
68B6 LD C,$00 Set a "clear" value (00) in C.
RemoveSingleSpriteBlock_Loop 68B8 DEC HL Load DE with the attribute buffer address of the sprite block.
68B9 LD D,(HL)
68BA DEC HL
68BB LD E,(HL)
68BC DEC HL Fetch the background attribute value.
68BD LD A,(HL)
68BE LD (DE),A Write the background attribute value to the attribute buffer address held in DE.
68BF DEC HL Move to next buffer entry.
Convert the attribute address to the corresponding screen buffer address.
68C0 LD A,D Taking the attribute buffer high byte, subtract 11.
68C1 SUB $11
68C3 OR %00000111 Adjust for the screen buffer memory layout.
68C5 LD D,A Write this back into D.
68C6 EX DE,HL Exchange the DE and HL registers.
68C7 LD (HL),C Write C to *HL.
68C8 DEC H Decrease H by one.
68C9 LD A,(DE) A=*DE.
68CA LD (HL),A Write A to *HL.
68CB DEC DE Decrease DE by one.
68CC DEC H Decrease H by one.
68CD LD (HL),C Write C to *HL.
68CE DEC H Decrease H by one.
68CF LD A,(DE) A=*DE.
68D0 LD (HL),A Write A to *HL.
68D1 DEC DE Decrease DE by one.
68D2 DEC H Decrease H by one.
68D3 LD (HL),C Write C to *HL.
68D4 DEC H Decrease H by one.
68D5 LD A,(DE) A=*DE.
68D6 LD (HL),A Write A to *HL.
68D7 DEC DE Decrease DE by one.
68D8 DEC H Decrease H by one.
68D9 LD (HL),C Write C to *HL.
68DA DEC H Decrease H by one.
68DB LD A,(DE) A=*DE.
68DC LD (HL),A Write A to *HL.
68DD EX DE,HL Exchange the DE and HL registers.
68DE DJNZ RemoveSingleSpriteBlock_Loop Decrease the sprite block counter by one and loop back to RemoveSingleSpriteBlock_Loop until all the sprite blocks have been reverted to backgrounds.
All sprite blocks are now reverted!
68E0 LD ($781C),HL Update the buffer position at *SpriteBackgroundBuffer_Pointer.
68E3 XOR A Mark that no sprite blocks are now active at *ActiveSpriteBlocks.
68E4 LD ($781B),A
68E7 RET Return.
Prev: 68AC Up: Map Next: 68E8