Routines |
Prev: 90B6 | Up: Map | Next: 91BE |
Used by the routine at 89AD.
|
||||
90C0 | LD IX,$8100 | Point IX at the first byte of the first entity buffer at 8100 | ||
The entity-moving loop begins here.
|
||||
90C4 | LD A,(IX+$00) | Pick up the first byte of the current entity's buffer | ||
90C7 | CP $FF | Have we already dealt with every entity? | ||
90C9 | RET Z | Return if so | ||
90CA | AND $03 | Keep only bits 0 and 1 (which determine the type of entity) | ||
90CC | JP Z,$91B6 | Jump to consider the next entity buffer if this one belongs to an arrow or is unused | ||
90CF | CP $01 | Is this a horizontal guardian? | ||
90D1 | JP Z,$9133 | Jump if so | ||
90D4 | CP $02 | Is this a vertical guardian? | ||
90D6 | JP Z,$917F | Jump if so | ||
We are dealing with a rope.
|
||||
90D9 | BIT 7,(IX+$00) | Is the rope currently swinging right to left? | ||
90DD | JR Z,$90FF | Jump if so | ||
The rope is swinging left to right.
|
||||
90DF | LD A,(IX+$01) | Pick up the animation frame index | ||
90E2 | BIT 7,A | Is the rope currently swinging away from the centre? | ||
90E4 | JR Z,$90F5 | Jump if so | ||
The rope is swinging left to right, towards the centre (0x84<=A<=0xB6).
|
||||
90E6 | SUB $02 | Subtract 2 from the animation frame index in A | ||
90E8 | CP $94 | Is it still 0x94 or greater? | ||
90EA | JR NC,$911D | If so, use it as the next animation frame index | ||
90EC | SUB $02 | Subtract 2 from the animation frame index again | ||
90EE | CP $80 | Is it 0x80 now? | ||
90F0 | JR NZ,$911D | If not, use it as the next animation frame index | ||
90F2 | XOR A | The rope has reached the centre, so the next animation frame index is 0 | ||
90F3 | JR $911D | Jump to set it | ||
The rope is swinging left to right, away from the centre (0x00<=A<=0x34).
|
||||
90F5 | ADD A,$02 | Add 2 to the animation frame index in A | ||
90F7 | CP $12 | Is it now 0x12 or greater? | ||
90F9 | JR NC,$911D | If so, use it as the next animation frame index | ||
90FB | ADD A,$02 | Add 2 to the animation frame index again | ||
90FD | JR $911D | Use this value as the next animation frame index | ||
The rope is swinging right to left.
|
||||
90FF | LD A,(IX+$01) | Pick up the animation frame index | ||
9102 | BIT 7,A | Is the rope currently swinging away from the centre? | ||
9104 | JR NZ,$9115 | Jump if so | ||
The rope is swinging right to left, towards the centre (0x04<=A<=0x36).
|
||||
9106 | SUB $02 | Subtract 2 from the animation frame index in A | ||
9108 | CP $14 | Is it still 0x14 or greater? | ||
910A | JR NC,$911D | If so, use it as the next animation frame index | ||
910C | SUB $02 | Subtract 2 from the animation frame index again | ||
910E | OR A | Is it 0 now? | ||
910F | JR NZ,$911D | If not, use it as the next animation frame index | ||
9111 | LD A,$80 | The rope has reached the centre, so the next animation frame index is 0x80 | ||
9113 | JR $911D | Jump to set it | ||
The rope is swinging right to left, away from the centre (0x80<=A<=0xB4).
|
||||
9115 | ADD A,$02 | Add 2 to the animation frame index in A | ||
9117 | CP $92 | Is it now 0x92 or greater? | ||
9119 | JR NC,$911D | If so, use it as the next animation frame index | ||
911B | ADD A,$02 | Add 2 to the animation frame index again | ||
Now A holds the rope's next animation frame index.
|
||||
911D | LD (IX+$01),A | Update the animation frame index | ||
9120 | AND $7F | Reset bit 7 | ||
9122 | CP (IX+$07) | Does A match the eighth byte of the rope's buffer (0x36)? | ||
9125 | JP NZ,$91B6 | If not, jump to consider the next entity | ||
9128 | LD A,(IX+$00) | Flip bit 7 of the first byte of the rope's buffer: the rope has just changed direction and will now swing back towards the centre | ||
912B | XOR $80 | |||
912D | LD (IX+$00),A | |||
9130 | JP $91B6 | Jump to consider the next entity | ||
We are dealing with a horizontal guardian.
|
||||
9133 | BIT 7,(IX+$00) | Is the guardian currently moving left to right? | ||
9137 | JR NZ,$915C | Jump if so | ||
This guardian is moving right to left.
|
||||
9139 | LD A,(IX+$00) | Update the guardian's animation frame (in bits 5 and 6 of the first byte of its buffer) | ||
913C | SUB $20 | |||
913E | AND $7F | |||
9140 | LD (IX+$00),A | |||
9143 | CP $60 | Is it time to update the x-coordinate of the guardian sprite? | ||
9145 | JR C,$91B6 | If not, jump to consider the next entity | ||
9147 | LD A,(IX+$02) | Pick up the sprite's current screen x-coordinate (0-31) | ||
914A | AND $1F | |||
914C | CP (IX+$06) | Has the guardian reached the leftmost point of its path? | ||
914F | JR Z,$9156 | Jump if so | ||
9151 | DEC (IX+$02) | Decrement the sprite's x-coordinate | ||
9154 | JR $91B6 | Jump to consider the next entity | ||
9156 | LD (IX+$00),$81 | The guardian will now start moving left to right | ||
915A | JR $91B6 | Jump to consider the next entity | ||
This guardian is moving left to right.
|
||||
915C | LD A,(IX+$00) | Update the guardian's animation frame (in bits 5 and 6 of the first byte of its buffer) | ||
915F | ADD A,$20 | |||
9161 | OR $80 | |||
9163 | LD (IX+$00),A | |||
9166 | CP $A0 | Is it time to update the x-coordinate of the guardian sprite? | ||
9168 | JR NC,$91B6 | If not, jump to consider the next entity | ||
916A | LD A,(IX+$02) | Pick up the sprite's current screen x-coordinate (0-31) | ||
916D | AND $1F | |||
916F | CP (IX+$07) | Has the guardian reached the rightmost point of its path? | ||
9172 | JR Z,$9179 | Jump if so | ||
9174 | INC (IX+$02) | Increment the sprite's x-coordinate | ||
9177 | JR $91B6 | Jump to consider the next entity | ||
9179 | LD (IX+$00),$61 | The guardian will now start moving right to left | ||
917D | JR $91B6 | Jump to consider the next entity | ||
We are dealing with a vertical guardian.
|
||||
917F | LD A,(IX+$00) | Flip bit 3 of the first byte of the guardian's buffer (if bit 4 is set, the guardian's animation frame is updated on every pass through this routine; otherwise, it is updated on every second pass when bit 3 is set) | ||
9182 | XOR $08 | |||
9184 | LD (IX+$00),A | |||
9187 | AND $18 | Are bits 3 and 4 both reset now? | ||
9189 | JR Z,$9193 | Jump if so | ||
918B | LD A,(IX+$00) | Update the guardian's animation frame (in bits 5-7 of the first byte of its buffer) | ||
918E | ADD A,$20 | |||
9190 | LD (IX+$00),A | |||
9193 | LD A,(IX+$03) | Update the guardian's y-coordinate | ||
9196 | ADD A,(IX+$04) | |||
9199 | LD (IX+$03),A | |||
919C | CP (IX+$07) | Has the guardian reached the lowest point of its path (maximum y-coordinate)? | ||
919F | JR NC,$91AE | If so, jump to change its direction of movement | ||
91A1 | CP (IX+$06) | Compare the new y-coordinate with the minimum value (the highest point of its path) | ||
91A4 | JR Z,$91A8 | If they match, jump to change the guardian's direction of movement | ||
91A6 | JR NC,$91B6 | If the new y-coordinate is above the minimum value, jump to consider the next entity | ||
91A8 | LD A,(IX+$06) | Make sure that the guardian's y-coordinate is set to its minimum value | ||
91AB | LD (IX+$03),A | |||
91AE | LD A,(IX+$04) | Negate the y-coordinate increment; this changes the guardian's direction of movement | ||
91B1 | NEG | |||
91B3 | LD (IX+$04),A | |||
The current entity has been dealt with. Time for the next one.
|
||||
91B6 | LD DE,$0008 | Point IX at the first byte of the next entity's buffer | ||
91B9 | ADD IX,DE | |||
91BB | JP $90C4 | Jump back to deal with it |
Prev: 90B6 | Up: Map | Next: 91BE |