Prev: 61693 Up: Map Next: 62028
61696: Make a teacher conduct a class
Used by command lists 22, 24, 58, 60 and 62 to make a teacher conduct a class (after having walked to the edge of the blackboard).
Input
H Teacher's character number (201-204)
Output
61696 LD A,(32736) 32736 holds the current lesson descriptor
61699 AND 240 Keep only the teacher-identifying bits and shift them into bits 0-3
61701 RLCA
61702 RLCA
61703 RLCA
61704 RLCA
61705 ADD A,199 Now A=character number of the teacher taking ERIC's class (201-203)
61707 CP H Is this teacher conducting ERIC's class?
61708 JR Z,61760 Jump if so
This teacher is not conducting ERIC's class, so he has it easy: wipe the board, write on the board (maybe), tell the class what to do, and pace up and down.
61710 LD BC,26639 Redirect control to the routine at 26639 (wipe board) and return to 61716 (below) when done
61713 CALL 25503
61716 LD L,1 Point HL at byte 1 of the teacher's buffer
61718 LD A,(HL) A=teacher's x-coordinate
61719 ADD A,3 A=x-coordinate of the middle of the blackboard
61721 LD L,11 Place this in byte 11 ready for the routine at 25581
61723 LD (HL),A
61724 LD BC,25581 Redirect control to the routine at 25581 (walk to a location) and return to 61730 (below) when done
61727 CALL 25503
61730 CALL 25233 A=random number
61733 LD BC,26752 Routine at 26752: write on board
61736 CP 160 Should the teacher write on the board?
61738 CALL NC,25503 If so, redirect control to the routine at 26752 and return to 61741 (below) when done
61741 CALL 61533 Tell the class what to do
61744 LD L,1 Point HL at byte 1 of the teacher's buffer
61746 LD A,(HL) A=teacher's x-coordinate
61747 XOR 3 Now A=x-coordinate of the location 3 paces behind the teacher
61749 LD L,11 Place this in byte 11 of the teacher's buffer, ready for the routine at 25581
61751 LD (HL),A
61752 LD BC,25581 Redirect control to the routine at 25581 (walk to a location) and return to 61758 (below) when done
61755 CALL 25503
61758 JR 61744 Make the teacher pace up (or down) again
The teacher is taking ERIC's class. This is a far more difficult task.
61760 LD A,(32640) Set bit 6 at 32640, indicating that ERIC should be in class now
61763 SET 6,A
61765 LD (32640),A
61768 CALL 61512 Are ERIC and EINSTEIN both in class?
61771 JR Z,61813 Jump if so
ERIC is not in class, but EINSTEIN is. EINSTEIN must therefore grass.
61773 LD BC,61463 Routine at 61463: make EINSTEIN talk
61776 LD E,18 18: Please Sir...ERIC is not here
61778 CALL 25503 Make EINSTEIN grass on ERIC, and return to 61781 (below) when done
61781 LD C,208 208=EINSTEIN
61783 CALL 61487 Give lines to EINSTEIN (maybe)
61786 CALL 32021 Set the zero flag if ERIC is in class
61789 LD A,(32640) 32640 holds various game status flags
61792 JR Z,61802 Jump if ERIC is in class
61794 SET 7,A Set bit 7 at 32640: the teacher's next absence reprimand should be 'STAY TILL I DISMISS YOU'
61796 LD (32640),A
61799 JP 61648 Go and find ERIC
ERIC is in class now, having shown up while EINSTEIN was grassing on him for being absent.
61802 RLCA Push bit 7 of 32640 into the carry flag
61803 LD B,20 20: STAY TILL I DISMISS YOU
61805 LD A,210 210=ERIC
61807 JR C,61810 Jump if the teacher's already had to chase or give lines to ERIC for being late or leaving early
61809 DEC B B=19: DON'T BE LATE AGAIN
61810 CALL 61504 Give ERIC lines
61813 LD A,(32640) Set bits 6 (ERIC should be in class) and 7 (the teacher's next absence reprimand should be 'STAY TILL I DISMISS YOU') at 32640
61816 OR 192
61818 LD (32640),A
61821 CALL 61512 Is ERIC in class?
61824 JR NZ,61773 Jump if not
Now is EINSTEIN's chance to grass on ERIC for hitting him.
61826 CALL 25233 A=random number
61829 CP 220 Should EINSTEIN tell tales?
61831 JR C,61852 Jump if not
61833 LD E,87 87: Please Sir...ERIC hit me
61835 LD BC,61463 Redirect control to the routine at 61463 (make EINSTEIN talk) and return to 61841 (below) when done
61838 CALL 25503
61841 LD BC,25042 B=97: DON'T HIT YOUR MATES; C=210 (ERIC)
61844 CALL 61487 Give EINSTEIN or ERIC lines
61847 CALL 61512 Is ERIC in class?
61850 JR NZ,61773 Jump if not
Now is EINSTEIN's opportunity to grass on someone for writing on the blackboard. However, the opportunity is wasted, because the CALL to 26453 (at 61852 below) returns a valid blackboard ID only if the character is standing within four spaces of the left edge of the blackboard, which is not the case when the teacher is waiting for EINSTEIN to grass (teachers stand at the right edge of the blackboard for that, more than four spaces away). This is a bug.
61852 CALL 26453 Collect information about the blackboard
61855 INC B The intent here is to point BC at the second byte of the blackboard's buffer, which holds the character number of the person who last wrote on it; instead, BC points at 32516 if the teacher is on the top floor, or 32515 if he's on the middle floor
61856 LD C,B
61857 LD B,127
61859 LD A,(BC) Now A is supposed to hold the character number of the person who last wrote on the board; instead it holds the contents of 32515 or 32516 (bytes 3 and 4 of the SRB), which will never be 206 or 210
61860 CP 210 Did ERIC write on the board?
61862 JR Z,61879 Jump if so (this jump is never made)
61864 CP 206 Or did BOY WANDER?
61866 JR NZ,61899 Jump if not (this jump is always made)
61868 CALL 25233 A=random number
61871 CP 195 Should EINSTEIN blame BOY WANDER for writing on the board?
61873 LD A,206 206=BOY WANDER
61875 JR C,61879 Jump if so
61877 LD A,210 Blame ERIC instead
61879 LD (32656),A Place the character number of the scapegoat into 32656
61882 LD BC,61463 Routine at 61463: make EINSTEIN talk
61885 LD E,88 88: Please Sir...[7] wrote on the board
61887 CALL 25503 Redirect control to the routine at 61463 and return to 61890 (below) when done
61890 LD A,(32656) A=206 (BOY WANDER) or 210 (ERIC)
61893 LD C,A Copy the scapegoat's character number to C
61894 LD B,86 86: DON'T TOUCH BLACKBOARDS
61896 CALL 61487 Give lines to EINSTEIN, ERIC or BOY WANDER
The next section of code makes the teacher wipe the board. Note that the teacher may already have wiped the board at this point, and therefore will not be standing at the right edge of the board (the correct location to begin wiping); this is a bug.
61899 LD BC,26639 Redirect control to the routine at 26639 (wipe board) and return to 61905 (below) when done
61902 CALL 25503
61905 LD L,1 Point HL at byte 1 of the teacher's buffer
61907 LD A,(HL) A=teacher's x-coordinate
61908 ADD A,3 A=x-coordinate of the middle of the blackboard
61910 LD L,11 Place this in byte 11 of the teacher's buffer, ready for the routine at 25581
61912 LD (HL),A
61913 LD BC,25581 Redirect control to the routine at 25581 (walk to location) and return to 61919 (below) when done
61916 CALL 25503
The teacher has wiped the board, and is ready to start the class.
61919 CALL 61512 Is ERIC in class?
61922 JP NZ,61773 Jump if not
61925 CALL 25233 A=random number
61928 LD BC,26752 Routine at 26752: write on board
61931 CP 184 Should the teacher write on the board?
61933 CALL NC,25503 Redirect control to 26752 if so, and return to 61936 (below) when done
61936 CALL 61512 Is ERIC in class?
61939 JR NZ,61922 Jump if not
61941 CALL 25233 A=random number
61944 CP 232 Should this be a questions-and-answers lesson?
61946 JR C,61972 Jump if so
This is not going to be a questions-and-answers lesson.
61948 CALL 61533 Tell the class what to do
61951 CALL 61512 Is ERIC in class?
61954 JR NZ,61922 Jump if not
61956 LD L,1 Point HL at byte 1 of the teacher's buffer
61958 LD A,(HL) A=teacher's x-coordinate
61959 XOR 3 Now A=x-coordinate of location three paces behind the teacher
61961 LD L,11 Place this in byte 11 of the teacher's buffer ready for the routine at 25581
61963 LD (HL),A
61964 LD BC,25581 Redirect control to the routine at 25581 (walk to location) and return to 61970 (below) when done
61967 CALL 25503
61970 JR 61951 Check whether ERIC's in class, then pace up (or down) again
This is going to be a questions-and-answers lesson. Pick a question-answer word pair, and decide which word will be in the question, and which in the answer.
61972 CALL 25233 A=random number
61975 AND 135 Keep only bits 0-2 (the word pair identifier) and bit 7 (indicates which word will be in the question)
61977 PUSH AF Save bit 7 for now
61978 LD C,A
61979 LD DE,32652 Point DE at the first byte of message 10
61982 LD A,H Set A=160 (if the teacher is MR WITHIT), 176 (MR ROCKITT), or 192 (MR CREAK)
61983 SUB D
61984 ADD A,A
61985 ADD A,A
61986 ADD A,A
61987 ADD A,A
61988 OR C Now A holds the message number of a random mountain, animal or king
61989 LD (DE),A Place this into 32652 (message 10)
61990 ADD A,8 Set A to the message number of the corresponding country, habitat or date
61992 LD E,142 Place this into 32654 (the first byte of message 11)
61994 LD (DE),A
61995 POP AF Restore the random bit 7 to A
61996 RLCA Push it into the carry flag
61997 SBC A,A Set A to 73 or 75 (MR WITHIT), 77 or 79 (MR ROCKITT), 81 or 83 (MR CREAK); this is the message number for EINSTEIN's reply
61998 ADD A,H
61999 ADD A,H
62000 ADD A,A
62001 ADD A,39
62003 LD (53259),A Store it in byte 11 of EINSTEIN's buffer, ready for the routine at 61467
62006 INC A Set E to 74 or 76 (MR WITHIT), 78 or 80 (MR ROCKITT), 82 or 84 (MR CREAK); this is the message number for the teacher's question
62007 LD E,A
62008 LD BC,27144 Redirect control to the routine at 27144 (make character speak) and return to 62014 (below) when done
62011 CALL 25503
62014 LD BC,61467 Redirect control to the routine at 61467 (make EINSTEIN answer) and return to 62020 (below) when done
62017 CALL 25503
62020 CALL 61512 Is ERIC in class?
62023 JR Z,61972 Jump if so
62025 JP 61773 Otherwise make EINSTEIN grass on the absent ERIC
Prev: 61693 Up: Map Next: 62028