| Routines

6E3C: Check whether a boy can be seen by a teacher

Used by the routines at 6F1E, 7000 and F41F. Returns with the carry flag set if the boy can be seen by a teacher, and the teacher's character number in H'.
Input
H | 0xA7 (BOY WANDER), 0xA8 (ANGELFACE) or 0xAC (ERIC)
6E3C | CALL $6E90 | Get the floor (0x9B, 0xA2, 0xA9) nearest to the character in D
This entry point is used by the routine at 77AC.
6E3F | CALL $6EA7 | Get the teacher's visibility range in [C,B]
6E42 | EXX |
6E43 | LD B,$04 | There are 4 teachers
6E45 | LD H,$A3 | And the first is 0xA3=MR WACKER
6E47 | LD L,$62 | Collect the teacher's x-coordinate from byte 0x62 of his buffer
6E49 | LD A,(HL)
6E4A | EXX |
6E4B | CP B | Is the teacher at or to the left of the upper bound of the visibility range?
6E4C | JR Z,$6E57 | Jump if so
6E4E | JR C,$6E57
6E50 | EXX |
6E51 | INC H | Next teacher
6E52 | DJNZ $6E47 | Jump back until all four teachers are done
6E54 | AND A | Clear the carry flag to indicate that the boy wasn't seen by a teacher
6E55 | EXX |
6E56 | RET |
6E57 | CP C | Is the teacher to the left of the lower bound of the visibility range?
6E58 | JR C,$6E50 | Jump back to consider the next teacher if so
The teacher's x-coordinate is within the visibility range [C,B]. Now check his y-coordinate.
6E5A | EXX |
6E5B | LD L,$70 | Is there an uninterruptible subcommand routine address in bytes 0x6F and 0x70 of the teacher's buffer?
6E5D | LD A,(HL)
6E5E | AND A
6E5F | JR NZ,$6E51 | Jump back to consider the next teacher if so (this one is occupied)
6E61 | LD L,$61 | Collect the teacher's y-coordinate from byte 0x61 of his buffer
6E63 | LD A,(HL)
6E64 | INC L | L=0x62
6E65 | EXX |
6E66 | CP $9E | Is the teacher near or on the top floor?
6E68 | JR NC,$6E6E | Jump if not
6E6A | LD A,$9B | This is the y-coordinate of the top floor
6E6C | JR $6E76 |
6E6E | CP $A5 |
6E70 | LD A,$A2 | This is the y-coordinate of the middle floor
6E72 | JR C,$6E76 | Jump if the teacher is near or on the middle floor
6E74 | LD A,$A9 | This is the y-coordinate of the bottom floor
6E76 | CP D | Is the teacher within the y-coordinate visibility range?
6E77 | JR NZ,$6E50 | Jump back to consider the next teacher if not
The teacher is close enough to the boy to see him. But is the teacher facing the right way?
6E79 | EXX |
6E7A | LD A,(HL) | A=teacher's x-coordinate
6E7B | EXX |
6E7C | CP E | Is the teacher standing right where the boy is?
6E7D | SCF | Return with the carry flag set if so
6E7E | RET Z
6E7F | CP E | A=0x80 if the boy is to the right of the teacher, 0x00 if the boy is to the left
6E80 | LD A,$00
6E82 | RRA
6E83 | EXX |
6E84 | LD L,$60 | Byte 0x60 of the teacher's buffer holds his animatory state
6E86 | XOR (HL) | Reset bit 7 of A if the teacher is facing the boy
6E87 | LD L,$62 |
6E89 | EXX |
6E8A | RLCA | Push bit 7 of A into the carry flag
6E8B | CCF | Return with the carry flag set if the teacher is facing the boy
6E8C | RET C
6E8D | JR $6E50 | Otherwise consider the next teacher