| Routines

78BA: Control the frog

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.
Input
H | 0xD4 (frog)
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 |
This entry point is used when the frog has just jumped into the air in order to make a long hop (three spaces forward). It is also used by the routine at 7A16 to introduce the frog into the game with an initial animatory state of 0x1D (facing left, airborne, phase 1) and location (59,10).
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