| Routines

F100: Make a teacher conduct a class

Used by command lists 0x16, 0x18, 0x3A, 0x3C and 0x3E to make a teacher conduct a class (after having walked to the edge of the blackboard).
Input
H | Teacher's character number (0xC9-0xCC)
F100 | LD A,($7FE0) | 7FE0 holds the current lesson descriptor
F103 | AND $F0 | Keep only the teacher-identifying bits and shift them into bits 0-3
F105 | RLCA
F106 | RLCA
F107 | RLCA
F108 | RLCA
F109 | ADD A,$C7 | Now A=character number of the teacher taking ERIC's class (0xC9-0xCB)
F10B | CP H | Is this teacher conducting ERIC's class?
F10C | JR Z,$F140 | 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.
F10E | LD BC,$680F | Redirect control to the routine at 680F (wipe board) and return to F114 (below) when done
F111 | CALL $639F
F114 | LD L,$01 | Point HL at byte 0x01 of the teacher's buffer
F116 | LD A,(HL) | A=teacher's x-coordinate
F117 | ADD A,$03 | A=x-coordinate of the middle of the blackboard
F119 | LD L,$0B | Place this in byte 0x0B ready for the routine at 63ED
F11B | LD (HL),A
F11C | LD BC,$63ED | Redirect control to the routine at 63ED (walk to a location) and return to F122 (below) when done
F11F | CALL $639F
F122 | CALL $6291 | A=random number
F125 | LD BC,$6880 | Routine at 6880: write on board
F128 | CP $A0 | Should the teacher write on the board?
F12A | CALL NC,$639F | If so, redirect control to the routine at 6880 and return to F12D (below) when done
F12D | CALL $F05D | Tell the class what to do
F130 | LD L,$01 | Point HL at byte 0x01 of the teacher's buffer
F132 | LD A,(HL) | A=teacher's x-coordinate
F133 | XOR $03 | Now A=x-coordinate of the location 3 paces behind the teacher
F135 | LD L,$0B | Place this in byte 0x0B of the teacher's buffer, ready for the routine at 63ED
F137 | LD (HL),A
F138 | LD BC,$63ED | Redirect control to the routine at 63ED (walk to a location) and return to F13E (below) when done
F13B | CALL $639F
F13E | JR $F130 | Make the teacher pace up (or down) again
The teacher is taking ERIC's class. This is a far more difficult task.
F140 | LD A,($7F80) | Set bit 6 at 7F80, indicating that ERIC should be in class now
F143 | SET 6,A
F145 | LD ($7F80),A
F148 | CALL $F048 | Are ERIC and EINSTEIN both in class?
F14B | JR Z,$F175 | Jump if so
ERIC is not in class, but EINSTEIN is. EINSTEIN must therefore grass.
F14D | LD BC,$F017 | Routine at F017: make EINSTEIN talk
F150 | LD E,$12 | 0x12: Please Sir...ERIC is not here
F152 | CALL $639F | Make EINSTEIN grass on ERIC, and return to F155 (below) when done
F155 | LD C,$D0 | 0xD0=EINSTEIN
F157 | CALL $F02F | Give lines to EINSTEIN (maybe)
F15A | CALL $7D15 | Set the zero flag if ERIC is in class
F15D | LD A,($7F80) | 7F80 holds various game status flags
F160 | JR Z,$F16A | Jump if ERIC is in class
F162 | SET 7,A | Set bit 7 at 7F80: the teacher's next absence reprimand should be 'STAY TILL I DISMISS YOU'
F164 | LD ($7F80),A
F167 | JP $F0D0 | Go and find ERIC
ERIC is in class now, having shown up while EINSTEIN was grassing on him for being absent.
F16A | RLCA | Push bit 7 of 7F80 into the carry flag
F16B | LD B,$14 | 0x14: STAY TILL I DISMISS YOU
F16D | LD A,$D2 | 0xD2=ERIC
F16F | JR C,$F172 | Jump if the teacher's already had to chase or give lines to ERIC for being late or leaving early
F171 | DEC B | B=0x13: DON'T BE LATE AGAIN
F172 | CALL $F040 | Give ERIC lines
F175 | LD A,($7F80) | Set bits 6 (ERIC should be in class) and 7 (the teacher's next absence reprimand should be 'STAY TILL I DISMISS YOU') at 7F80
F178 | OR $C0
F17A | LD ($7F80),A
F17D | CALL $F048 | Is ERIC in class?
F180 | JR NZ,$F14D | Jump if not
Now is EINSTEIN's chance to grass on ERIC for hitting him.
F182 | CALL $6291 | A=random number
F185 | CP $DC | Should EINSTEIN tell tales?
F187 | JR C,$F19C | Jump if not
F189 | LD E,$57 | 0x57: Please Sir...ERIC hit me
F18B | LD BC,$F017 | Redirect control to the routine at F017 (make EINSTEIN talk) and return to F191 (below) when done
F18E | CALL $639F
F191 | LD BC,$61D2 | B=0x61: DON'T HIT YOUR MATES; C=0xD2 (ERIC)
F194 | CALL $F02F | Give EINSTEIN or ERIC lines
F197 | CALL $F048 | Is ERIC in class?
F19A | JR NZ,$F14D | 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 6755 (at F19C 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.
F19C | CALL $6755 | Collect information about the blackboard
F19F | 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 7F04 if the teacher is on the top floor, or 7F03 if he's on the middle floor
F1A0 | LD C,B
F1A1 | LD B,$7F
F1A3 | 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 7F03 or 7F04 (bytes 0x03 and 0x04 of the SRB), which will never be 0xCE or 0xD2
F1A4 | CP $D2 | Did ERIC write on the board?
F1A6 | JR Z,$F1B7 | Jump if so (this jump is never made)
F1A8 | CP $CE | Or did BOY WANDER?
F1AA | JR NZ,$F1CB | Jump if not (this jump is always made)
F1AC | CALL $6291 | A=random number
F1AF | CP $C3 | Should EINSTEIN blame BOY WANDER for writing on the board?
F1B1 | LD A,$CE | 0xCE=BOY WANDER
F1B3 | JR C,$F1B7 | Jump if so
F1B5 | LD A,$D2 | Blame ERIC instead
F1B7 | LD ($7F90),A | Place the character number of the scapegoat into 7F90
F1BA | LD BC,$F017 | Routine at F017: make EINSTEIN talk
F1BD | LD E,$58 | 0x58: Please Sir...[0x07] wrote on the board
F1BF | CALL $639F | Redirect control to the routine at F017 and return to F1C2 (below) when done
F1C2 | LD A,($7F90) | A=0xCE (BOY WANDER) or 0xD2 (ERIC)
F1C5 | LD C,A | Copy the scapegoat's character number to C
F1C6 | LD B,$56 | 0x56: DON'T TOUCH BLACKBOARDS
F1C8 | CALL $F02F | 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.
F1CB | LD BC,$680F | Redirect control to the routine at 680F (wipe board) and return to F1D1 (below) when done
F1CE | CALL $639F
F1D1 | LD L,$01 | Point HL at byte 0x01 of the teacher's buffer
F1D3 | LD A,(HL) | A=teacher's x-coordinate
F1D4 | ADD A,$03 | A=x-coordinate of the middle of the blackboard
F1D6 | LD L,$0B | Place this in byte 0x0B of the teacher's buffer, ready for the routine at 63ED
F1D8 | LD (HL),A
F1D9 | LD BC,$63ED | Redirect control to the routine at 63ED (walk to location) and return to F1DF (below) when done
F1DC | CALL $639F
The teacher has wiped the board, and is ready to start the class.
F1DF | CALL $F048 | Is ERIC in class?
F1E2 | JP NZ,$F14D | Jump if not
F1E5 | CALL $6291 | A=random number
F1E8 | LD BC,$6880 | Routine at 6880: write on board
F1EB | CP $B8 | Should the teacher write on the board?
F1ED | CALL NC,$639F | Redirect control to 6880 if so, and return to F1F0 (below) when done
F1F0 | CALL $F048 | Is ERIC in class?
F1F3 | JR NZ,$F1E2 | Jump if not
F1F5 | CALL $6291 | A=random number
F1F8 | CP $E8 | Should this be a questions-and-answers lesson?
F1FA | JR C,$F214 | Jump if so
This is not going to be a questions-and-answers lesson.
F1FC | CALL $F05D | Tell the class what to do
F1FF | CALL $F048 | Is ERIC in class?
F202 | JR NZ,$F1E2 | Jump if not
F204 | LD L,$01 | Point HL at byte 0x01 of the teacher's buffer
F206 | LD A,(HL) | A=teacher's x-coordinate
F207 | XOR $03 | Now A=x-coordinate of location three paces behind the teacher
F209 | LD L,$0B | Place this in byte 0x0B of the teacher's buffer ready for the routine at 63ED
F20B | LD (HL),A
F20C | LD BC,$63ED | Redirect control to the routine at 63ED (walk to location) and return to F212 (below) when done
F20F | CALL $639F
F212 | JR $F1FF | 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.
F214 | CALL $6291 | A=random number
F217 | AND $87 | Keep only bits 0-2 (the word pair identifier) and bit 7 (indicates which word will be in the question)
F219 | PUSH AF | Save bit 7 for now
F21A | LD C,A |
F21B | LD DE,$7F8C | Point DE at the first byte of message 0x0A
F21E | LD A,H | Set A=0xA0 (if the teacher is MR WITHIT), 0xB0 (MR ROCKITT), or 0xC0 (MR CREAK)
F21F | SUB D
F220 | ADD A,A
F221 | ADD A,A
F222 | ADD A,A
F223 | ADD A,A
F224 | OR C | Now A holds the message number of a random mountain, animal or king
F225 | LD (DE),A | Place this into 7F8C (message 0x0A)
F226 | ADD A,$08 | Set A to the message number of the corresponding country, habitat or date
F228 | LD E,$8E | Place this into 7F8E (the first byte of message 0x0B)
F22A | LD (DE),A
F22B | POP AF | Restore the random bit 7 to A
F22C | RLCA | Push it into the carry flag
F22D | SBC A,A | Set A to 0x49 or 0x4B (MR WITHIT), 0x4D or 0x4F (MR ROCKITT), 0x51 or 0x53 (MR CREAK); this is the message number for EINSTEIN's reply
F22E | ADD A,H
F22F | ADD A,H
F230 | ADD A,A
F231 | ADD A,$27
F233 | LD ($D00B),A | Store it in byte 0x0B of EINSTEIN's buffer, ready for the routine at F01B
F236 | INC A | Set E to 0x4A or 0x4C (MR WITHIT), 0x4E or 0x50 (MR ROCKITT), 0x52 or 0x54 (MR CREAK); this is the message number for the teacher's question
F237 | LD E,A
F238 | LD BC,$6A08 | Redirect control to the routine at 6A08 (make character speak) and return to F23E (below) when done
F23B | CALL $639F
F23E | LD BC,$F01B | Redirect control to the routine at F01B (make EINSTEIN answer) and return to F244 (below) when done
F241 | CALL $639F
F244 | CALL $F048 | Is ERIC in class?
F247 | JR Z,$F214 | Jump if so
F249 | JP $F14D | Otherwise make EINSTEIN grass on the absent ERIC