Prev: 36101 Up: Map Next: 36211
36111: Move the horizontal guardians in the current cavern
Used by the routine at 34574.
Input
Output
36111 LD IY,32958 Point IY at the first byte of the first horizontal guardian definition at 32958
36115 LD DE,7 Prepare DE for addition (there are 7 bytes in a guardian definition)
The guardian-moving loop begins here.
36118 LD A,(IY+0) Pick up the first byte of the guardian definition
36121 CP 255 Have we dealt with all the guardians yet?
36123 RET Z Return if so
36124 OR A Is this guardian definition blank?
36125 JR Z,36207 If so, skip it and consider the next one
36127 LD A,(32957) Pick up the value of the game clock at 32957
36130 AND 4 Move bit 2 (which is toggled on each pass through the main loop) to bit 7 and clear all the other bits
36132 RRCA
36133 RRCA
36134 RRCA
36135 AND (IY+0) Combine this bit with bit 7 of the first byte of the guardian definition, which specifies the guardian's animation speed: 0=normal, 1=slow
36138 JR NZ,36207 Jump to consider the next guardian if this one is not due to be moved on this pass
The guardian will be moved on this pass.
36140 LD A,(IY+4) Pick up the current animation frame (0-7)
36143 CP 3 Is it 3 (the terminal frame for a guardian moving right)?
36145 JR Z,36163 Jump if so to move the guardian right across a cell boundary or turn it round
36147 CP 4 Is the current animation frame 4 (the terminal frame for a guardian moving left)?
36149 JR Z,36186 Jump if so to move the guardian left across a cell boundary or turn it round
36151 JR NC,36158 Jump if the animation frame is 5, 6 or 7
36153 INC (IY+4) Increment the animation frame (this guardian is moving right)
36156 JR 36207 Jump forward to consider the next guardian
36158 DEC (IY+4) Decrement the animation frame (this guardian is moving left)
36161 JR 36207 Jump forward to consider the next guardian
36163 LD A,(IY+1) Pick up the LSB of the address of the guardian's location in the attribute buffer at 23552
36166 CP (IY+6) Has the guardian reached the rightmost point in its path?
36169 JR NZ,36177 Jump if not
36171 LD (IY+4),7 Set the animation frame to 7 (turning the guardian round to face left)
36175 JR 36207 Jump forward to consider the next guardian
36177 LD (IY+4),0 Set the animation frame to 0 (the initial frame for a guardian moving right)
36181 INC (IY+1) Increment the guardian's x-coordinate (moving it right across a cell boundary)
36184 JR 36207 Jump forward to consider the next guardian
36186 LD A,(IY+1) Pick up the LSB of the address of the guardian's location in the attribute buffer at 23552
36189 CP (IY+5) Has the guardian reached the leftmost point in its path?
36192 JR NZ,36200 Jump if not
36194 LD (IY+4),0 Set the animation frame to 0 (turning the guardian round to face right)
36198 JR 36207 Jump forward to consider the next guardian
36200 LD (IY+4),7 Set the animation frame to 7 (the initial frame for a guardian moving left)
36204 DEC (IY+1) Decrement the guardian's x-coordinate (moving it left across a cell boundary)
The current guardian definition has been dealt with. Time for the next one.
36207 ADD IY,DE Point IY at the first byte of the next horizontal guardian definition
36209 JR 36118 Jump back to deal with the next horizontal guardian
Prev: 36101 Up: Map Next: 36211