Routines |
Prev: F0FD | Up: Map | Next: F24C |
|
||||||||
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 |
Prev: F0FD | Up: Map | Next: F24C |