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 |