Manic Miner: Routine at 36111

| Routines

36111: Move the horizontal guardians in the current cavern

Used by the routine at 34574.
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