Prev: 31274 Up: Map Next: 31447
31282: Prepare a question and answer
Used by the routine at 62464. Prepares a question message and stores its address in bytes 107 and 108 of the teacher's buffer; also prepares the answer message and stores its address in bytes 107 and 108 of EINSTEIN's buffer. Places the address of the interruptible subcommand routine at 31110 (make character speak) into bytes 105 and 106 of the teacher's buffer before returning.
Input
H Teacher's character number (163-166)
31282 PUSH HL Save the teacher's character number
31283 LD A,H A=teacher's character number
31284 CP 163 Is it MR WACKER?
31286 JR NZ,31378 Jump if not
MR WACKER is conducting this lesson, so we have to prepare a multiplication question and answer. First, generate two random numbers and store the ASCII codes of their digits in the question message.
31288 LD HL,61448 HL=61448: the '12' in 'WHAT IS 12 x 34?'
31291 LD B,2 There are two numbers to generate
31293 LD C,A Store the second (the multiplier) in C on pass 2
31294 CALL 24993 Collect a random number between 32 and 99 in A
31297 AND 127
31299 CP 100
31301 JR NC,31294
31303 CP 32
31305 JR C,31294
31307 PUSH AF Store this number temporarily
31308 LD (HL),47 Insert the ASCII codes for the digits of the number into the 'WHAT IS 12 x 34?' message
31310 INC (HL)
31311 SUB 10
31313 JR NC,31310
31315 ADD A,58
31317 INC L
31318 LD (HL),A
31319 POP AF Restore the number to A
31320 LD L,13 HL=61453: the '34' in 'WHAT IS 12 x 34?'
31322 DJNZ 31293 Jump back to insert the multiplier into the message
Now multiply the two numbers, and store the ASCII codes of the digits of the product in the answer message.
31324 LD DE,0 HL=0 (ready for multiplication), and DE=61463 (the '1234' in EINSTEIN's response message)
31327 LD L,23
31329 EX DE,HL
31330 ADD HL,BC HL=the product of the two numbers
31331 DEC A
31332 JR NZ,31330
31334 LD BC,64536 Calculate the 1000s digit and store its ASCII code in the appropriate spot
31337 INC A
31338 ADD HL,BC
31339 JR C,31337
31341 SBC HL,BC
31343 ADD A,47
31345 LD (DE),A
31346 LD BC,65436 Calculate the 100s digit and store its ASCII code in the appropriate spot
31349 LD A,47
31351 INC A
31352 ADD HL,BC
31353 JR C,31351
31355 SBC HL,BC
31357 INC E
31358 LD (DE),A
31359 LD A,L Calculate the 10s digit and store its ASCII code in the appropriate spot
31360 EX DE,HL
31361 INC L
31362 LD (HL),47
31364 INC (HL)
31365 SUB 10
31367 JR NC,31364
31369 ADD A,58 Store the ASCII code of the units digit in the appropriate spot
31371 INC L
31372 LD (HL),A
31373 LD HL,31256 This is the base address of the data table used for MR WACKER's questions and answers
31376 JR 31424
Some teacher other than MR WACKER is conducting this lesson.
31378 SUB 164 A=0 (MR ROCKITT), 1 (MR WITHIT), or 2 (MR CREAK)
31380 CALL 63779 Make MR CREAK ask the birth year question if appropriate
31383 LD B,128
31385 JR Z,31398 Jump if we're dealing with MR ROCKITT
31387 LD B,170
31389 LD L,34 HL=31266
31391 DEC A Are we dealing with MR WITHIT?
31392 JR Z,31398 Jump if so
31394 LD L,42 HL=31274
31396 LD B,212
Now HL points at one of the data tables at 31258 (MR ROCKITT), 31266 (MR WITHIT) and 31274 (MR CREAK). Each data table contains eight LSBs: four LSBs for each type of question. The LSBs correspond to (1) the identifier slot in the teacher's question; (2) the identifier slot in EINSTEIN's answer; (3) the base address of EINSTEIN's answer; and (4) the base address of the teacher's question.
31398 CALL 24993 Get a random number between 0 and 41 in A
31401 CP 42
31403 JR NC,31398
31405 ADD A,B A=128-169 (MR ROCKITT), 170-211 (MR WITHIT), or 212-253 (MR CREAK)
31406 BIT 0,A There are two types of question the teacher can ask; here we decide which one
31408 JR Z,31414
31410 INC L Move forward four spaces in the data table to the LSBs for the second type of question
31411 INC L
31412 INC L
31413 INC L
31414 LD D,240 Insert the random identifier into the teacher's question
31416 LD E,(HL)
31417 LD (DE),A
31418 INC L Insert the corresponding random identifier into EINSTEIN's answer
31419 LD E,(HL)
31420 XOR 1
31422 LD (DE),A
31423 INC L
31424 LD E,(HL) Store the address of the answer message in bytes 107 and 108 of EINSTEIN's buffer
31425 LD D,240
31427 LD (43371),DE
31431 INC L
31432 LD E,(HL) DE=address of the question message
This entry point is used by the routine at 63779.
31433 POP HL Restore the teacher's character number to H
31434 LD L,107 Store the address of the question message in bytes 107 and 108 of the teacher's buffer
31436 LD (HL),E
31437 INC L
31438 LD (HL),D
31439 LD L,106 Place the address of the interruptible subcommand routine at 31110 (make character speak) into bytes 105 and 106 of the teacher's buffer
31441 LD (HL),121
31443 DEC L
31444 LD (HL),134
31446 RET
Prev: 31274 Up: Map Next: 31447