![]() |
Routines |
| Prev: 30804 | Up: Map | Next: 31076 |
|
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.
|
||||||||
| 30906 | LD DE,(53761) | Pick up ERIC's coordinates in DE | ||||||
| 30910 | LD L,2 | Point HL at byte 2 of the frog's buffer | ||||||
| 30912 | LD A,(HL) | A=frog's y-coordinate | ||||||
| 30913 | CP D | Does it match ERIC's y-coordinate? | ||||||
| 30914 | JR NZ,30934 | Jump if not | ||||||
| 30916 | DEC L | L=1 | ||||||
| 30917 | LD A,(HL) | A=frog's x-coordinate | ||||||
| 30918 | SUB E | Is ERIC to the left of the frog? | ||||||
| 30919 | JR NC,30923 | Jump if so | ||||||
| 30921 | NEG | |||||||
| 30923 | CP 4 | Now A=horizontal distance between the frog and ERIC | ||||||
| 30925 | JR NC,30934 | Jump if this is greater than 3 | ||||||
| 30927 | CALL 25233 | A=random number >= 192 | ||||||
| 30930 | OR 192 | |||||||
| 30932 | JR 30940 | |||||||
| 30934 | CALL 25233 | A=random number | ||||||
| 30937 | CP 192 | Return 3 times out of 4 (without moving the frog) when ERIC is not nearby | ||||||
| 30939 | 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).
|
||||||||
| 30940 | CP 240 | A>=192 at this point | ||||||
| 30942 | JR C,30960 | Jump if 192<=A<240 (75% of the time) to make a short or long hop | ||||||
| 30944 | CALL 25012 | Update the SRB for the frog's current animatory state and location | ||||||
| 30947 | INC A | A=29/157: frog airborne (phase one) | ||||||
| 30948 | CALL 30534 | Update the frog's animatory state and then resume control at entry point 30951 (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).
|
||||||||
| 30951 | CALL 25012 | Update the SRB for the frog's current animatory state | ||||||
| 30954 | DEC A | A=28/156: frog sitting | ||||||
| 30955 | XOR 128 | Turn the frog round | ||||||
| 30957 | JP 30903 | Update the frog's animatory state and then resume control at the main entry point (30906) | ||||||
|
The frog is planning a hop. Decide between a short hop (one space forward) and a long hop (three spaces forward).
|
||||||||
| 30960 | LD L,0 | Point HL at byte 0 of the frog's buffer | ||||||
| 30962 | CP 216 | Set the carry flag if 192<=A<216 | ||||||
| 30964 | BIT 7,(HL) | Set the zero flag if the frog is facing left | ||||||
| 30966 | LD L,1 | Pick up the frog's x-coordinate in E and y-coordinate in D | ||||||
| 30968 | LD E,(HL) | |||||||
| 30969 | LD L,2 | |||||||
| 30971 | LD D,(HL) | |||||||
| 30972 | JR C,31016 | Jump if A<216 (50% of the time) to consider a long hop | ||||||
| 30974 | JR NZ,30978 | Jump if the frog is facing right | ||||||
| 30976 | DEC E | |||||||
| 30977 | DEC E | |||||||
| 30978 | INC E | E=x-coordinate of the spot directly in front of the frog | ||||||
| 30979 | LD HL,32756 | 32756 holds the door/window status flags | ||||||
| 30982 | LD A,(HL) | Pick these up in A | ||||||
| 30983 | LD B,A | Save a copy of them in B briefly | ||||||
| 30984 | AND 63 | Reset bits 6 and 7 of the door/window status flags (i.e. pretend that the windows are closed) | ||||||
| 30986 | LD (HL),A | |||||||
| 30987 | CALL 30292 | Check for closed doors and walls in the frog's path | ||||||
| 30990 | LD (HL),B | Restore the original door/window status flags | ||||||
| 30991 | LD H,212 | 212=frog | ||||||
| 30993 | JR C,30944 | Turn the frog round if there's a wall or closed door in its path | ||||||
| 30995 | CALL 25012 | Update the SRB for the frog's current animatory state and location | ||||||
| 30998 | INC A | A=29/157: frog airborne (phase one) | ||||||
| 30999 | RLCA | |||||||
| 31000 | RRCA | |||||||
| 31001 | JR C,31005 | Jump if the frog is facing right | ||||||
| 31003 | DEC E | |||||||
| 31004 | DEC E | |||||||
| 31005 | INC E | Now E=x-coordinate of the spot directly in front of the frog | ||||||
| 31006 | CALL 30534 | Update the frog's animatory state and then resume control at entry point 31009 (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.
|
||||||||
| 31009 | CALL 25012 | Update the SRB for the frog's current animatory state and location | ||||||
| 31012 | DEC A | A=28/156: frog sitting | ||||||
| 31013 | JP 30903 | Update the frog's animatory state and then resume control at the main entry point (30906) | ||||||
|
The frog is planning a long hop. Check whether the coast is clear up to three spaces ahead.
|
||||||||
| 31016 | LD C,0 | |||||||
| 31018 | JR NZ,31022 | Jump if the frog is facing right | ||||||
| 31020 | DEC C | |||||||
| 31021 | DEC C | |||||||
| 31022 | INC C | C=1 if the frog's facing right, 255 if facing left | ||||||
| 31023 | LD HL,32756 | 32756 holds the door/window status flags | ||||||
| 31026 | LD A,(HL) | Pick these up in A | ||||||
| 31027 | LD B,A | Save a copy of them in B briefly | ||||||
| 31028 | AND 63 | Reset bits 6 and 7 of the door/window status flags (i.e. pretend that the windows are closed) | ||||||
| 31030 | LD (HL),A | |||||||
| 31031 | PUSH BC | |||||||
| 31032 | LD B,3 | We will test up to 3 spaces in front of the frog | ||||||
| 31034 | LD A,E | Set E to the x-coordinate of the spot 1, 2 or 3 spaces in front of the frog | ||||||
| 31035 | ADD A,C | |||||||
| 31036 | LD E,A | |||||||
| 31037 | PUSH DE | |||||||
| 31038 | CALL 30292 | Check for walls and closed doors in the frog's path | ||||||
| 31041 | POP DE | |||||||
| 31042 | JR C,31046 | Jump if there is one | ||||||
| 31044 | DJNZ 31034 | Jump back until we've checked up to 3 spaces in front of the frog | ||||||
| 31046 | POP BC | |||||||
| 31047 | LD (HL),B | Restore the original door/window status flags to 32756 | ||||||
| 31048 | LD H,212 | 212=frog | ||||||
| 31050 | JP C,30944 | Turn the frog round if there's a wall or closed door less than four spaces ahead | ||||||
| 31053 | CALL 30995 | Otherwise move the frog one space forward and adjust its animatory state to 29/157 (airborne, phase one) | ||||||
| 31056 | LD L,17 | Change the address in bytes 17 and 18 of the frog's buffer to 31061 (below) so that we resume there | ||||||
| 31058 | LD (HL),85 | |||||||
| 31060 | RET | |||||||
| 31061 | CALL 30995 | Move the frog one space forward and adjust its animatory state to 30/158 (airborne, phase 2) | ||||||
| 31064 | LD L,17 | Change the address in bytes 17 and 18 of the frog's buffer to 31069 (below) so that we resume there | ||||||
| 31066 | LD (HL),93 | |||||||
| 31068 | RET | |||||||
|
This entry point is used when the frog is at the highest point of a long hop.
|
||||||||
| 31069 | CALL 25012 | Update the SRB for the frog's current animatory state and location | ||||||
| 31072 | DEC A | A=29/157: frog airborne (phase one) | ||||||
| 31073 | JP 30999 | Move the frog one space forward | ||||||
| Prev: 30804 | Up: Map | Next: 31076 |