Routines |
Prev: 7854 | Up: Map | Next: 7964 |
This uninterruptible subcommand routine controls the frog's movements. The main entry point is used when the frog is sitting on the floor, deciding whether to stay put or take a hop.
|
||||||||
78BA | LD DE,($D201) | Pick up ERIC's coordinates in DE | ||||||
78BE | LD L,$02 | Point HL at byte 0x02 of the frog's buffer | ||||||
78C0 | LD A,(HL) | A=frog's y-coordinate | ||||||
78C1 | CP D | Does it match ERIC's y-coordinate? | ||||||
78C2 | JR NZ,$78D6 | Jump if not | ||||||
78C4 | DEC L | L=0x01 | ||||||
78C5 | LD A,(HL) | A=frog's x-coordinate | ||||||
78C6 | SUB E | Is ERIC to the left of the frog? | ||||||
78C7 | JR NC,$78CB | Jump if so | ||||||
78C9 | NEG | |||||||
78CB | CP $04 | Now A=horizontal distance between the frog and ERIC | ||||||
78CD | JR NC,$78D6 | Jump if this is greater than 3 | ||||||
78CF | CALL $6291 | A=random number >= 0xC0 | ||||||
78D2 | OR $C0 | |||||||
78D4 | JR $78DC | |||||||
78D6 | CALL $6291 | A=random number | ||||||
78D9 | CP $C0 | Return 3 times out of 4 (without moving the frog) when ERIC is not nearby | ||||||
78DB | RET C | |||||||
The frog has decided to move. It has three options: turn round, short hop (one space forward), or long hop (three spaces forward).
|
||||||||
78DC | CP $F0 | A>=0xC0 at this point | ||||||
78DE | JR C,$78F0 | Jump if 0xC0<=A<0xF0 (75% of the time) to make a short or long hop | ||||||
78E0 | CALL $61B4 | Update the SRB for the frog's current animatory state and location | ||||||
78E3 | INC A | A=0x1D/0x9D: frog airborne (phase one) | ||||||
78E4 | CALL $7746 | Update the frog's animatory state and then resume control at entry point 78E7 (below) | ||||||
This entry point is used when the frog has jumped into the air in order to turn round (either by choice, or because a wall or closed door is in the way).
|
||||||||
78E7 | CALL $61B4 | Update the SRB for the frog's current animatory state | ||||||
78EA | DEC A | A=0x1C/0x9C: frog sitting | ||||||
78EB | XOR $80 | Turn the frog round | ||||||
78ED | JP $78B7 | Update the frog's animatory state and then resume control at the main entry point (78BA) | ||||||
The frog is planning a hop. Decide between a short hop (one space forward) and a long hop (three spaces forward).
|
||||||||
78F0 | LD L,$00 | Point HL at byte 0x00 of the frog's buffer | ||||||
78F2 | CP $D8 | Set the carry flag if 0xC0<=A<0xD8 | ||||||
78F4 | BIT 7,(HL) | Set the zero flag if the frog is facing left | ||||||
78F6 | LD L,$01 | Pick up the frog's x-coordinate in E and y-coordinate in D | ||||||
78F8 | LD E,(HL) | |||||||
78F9 | LD L,$02 | |||||||
78FB | LD D,(HL) | |||||||
78FC | JR C,$7928 | Jump if A<0xD8 (50% of the time) to consider a long hop | ||||||
78FE | JR NZ,$7902 | Jump if the frog is facing right | ||||||
7900 | DEC E | |||||||
7901 | DEC E | |||||||
7902 | INC E | E=x-coordinate of the spot directly in front of the frog | ||||||
7903 | LD HL,$7FF4 | 7FF4 holds the door/window status flags | ||||||
7906 | LD A,(HL) | Pick these up in A | ||||||
7907 | LD B,A | Save a copy of them in B briefly | ||||||
7908 | AND $3F | Reset bits 6 and 7 of the door/window status flags (i.e. pretend that the windows are closed) | ||||||
790A | LD (HL),A | |||||||
790B | CALL $7654 | Check for closed doors and walls in the frog's path | ||||||
790E | LD (HL),B | Restore the original door/window status flags | ||||||
790F | LD H,$D4 | 0xD4=frog | ||||||
7911 | JR C,$78E0 | Turn the frog round if there's a wall or closed door in its path | ||||||
7913 | CALL $61B4 | Update the SRB for the frog's current animatory state and location | ||||||
7916 | INC A | A=0x1D/0x9D: frog airborne (phase one) | ||||||
7917 | RLCA | |||||||
7918 | RRCA | |||||||
7919 | JR C,$791D | Jump if the frog is facing right | ||||||
791B | DEC E | |||||||
791C | DEC E | |||||||
791D | INC E | Now E=x-coordinate of the spot directly in front of the frog | ||||||
791E | CALL $7746 | Update the frog's animatory state and then resume control at entry point 7921 (below) | ||||||
This entry point is used when the frog has just jumped into the air for a short hop, or is just about to finish a long hop. Either way, the frog is going to land now.
|
||||||||
7921 | CALL $61B4 | Update the SRB for the frog's current animatory state and location | ||||||
7924 | DEC A | A=0x1C/0x9C: frog sitting | ||||||
7925 | JP $78B7 | Update the frog's animatory state and then resume control at the main entry point (78BA) | ||||||
The frog is planning a long hop. Check whether the coast is clear up to three spaces ahead.
|
||||||||
7928 | LD C,$00 | |||||||
792A | JR NZ,$792E | Jump if the frog is facing right | ||||||
792C | DEC C | |||||||
792D | DEC C | |||||||
792E | INC C | C=0x01 if the frog's facing right, 0xFF if facing left | ||||||
792F | LD HL,$7FF4 | 7FF4 holds the door/window status flags | ||||||
7932 | LD A,(HL) | Pick these up in A | ||||||
7933 | LD B,A | Save a copy of them in B briefly | ||||||
7934 | AND $3F | Reset bits 6 and 7 of the door/window status flags (i.e. pretend that the windows are closed) | ||||||
7936 | LD (HL),A | |||||||
7937 | PUSH BC | |||||||
7938 | LD B,$03 | We will test up to 3 spaces in front of the frog | ||||||
793A | LD A,E | Set E to the x-coordinate of the spot 1, 2 or 3 spaces in front of the frog | ||||||
793B | ADD A,C | |||||||
793C | LD E,A | |||||||
793D | PUSH DE | |||||||
793E | CALL $7654 | Check for walls and closed doors in the frog's path | ||||||
7941 | POP DE | |||||||
7942 | JR C,$7946 | Jump if there is one | ||||||
7944 | DJNZ $793A | Jump back until we've checked up to 3 spaces in front of the frog | ||||||
7946 | POP BC | |||||||
7947 | LD (HL),B | Restore the original door/window status flags to 7FF4 | ||||||
7948 | LD H,$D4 | 0xD4=frog | ||||||
794A | JP C,$78E0 | Turn the frog round if there's a wall or closed door less than four spaces ahead | ||||||
794D | CALL $7913 | Otherwise move the frog one space forward and adjust its animatory state to 0x1D/0x9D (airborne, phase one) | ||||||
7950 | LD L,$11 | Change the address in bytes 0x11 and 0x12 of the frog's buffer to 7955 (below) so that we resume there | ||||||
7952 | LD (HL),$55 | |||||||
7954 | RET | |||||||
7955 | CALL $7913 | Move the frog one space forward and adjust its animatory state to 0x1E/0x9E (airborne, phase 2) | ||||||
7958 | LD L,$11 | Change the address in bytes 0x11 and 0x12 of the frog's buffer to 795D (below) so that we resume there | ||||||
795A | LD (HL),$5D | |||||||
795C | RET | |||||||
This entry point is used when the frog is at the highest point of a long hop.
|
||||||||
795D | CALL $61B4 | Update the SRB for the frog's current animatory state and location | ||||||
7960 | DEC A | A=0x1D/0x9D: frog airborne (phase one) | ||||||
7961 | JP $7917 | Move the frog one space forward |
Prev: 7854 | Up: Map | Next: 7964 |