Prev: 28355 Up: Map Next: 28611
28357: Add a message to the message queue
Used by the routines at 30154, 30211, 30989, 31126, 31594 and 64338. Adds a message to the message queue, and updates the message line (by clearing it or displaying the next message or message portion) if necessary.
Input
A Message number
28357 LD E,A E=number of the message to be queued
28358 LD HL,32695 32695 holds the index of the current message in the message queue at 32696
28361 LD A,(HL) Pick up the index of the current message
28362 DEC A A=index of the last message in the queue
28363 AND 7
28365 ADD A,184 Point HL at the corresponding slot in the message queue at 32696
28367 LD L,A
28368 LD A,(HL) Pick up the message number from this slot
28369 AND A Is the slot empty?
28370 JR Z,28386 Jump if so
The message queue is full. To make space for the new message, we remove the second message from the queue, and move the following messages up a slot, thus leaving the final slot free.
28372 LD B,7 There are six messages to move up a slot, and one to remove completely
28374 LD C,0 The final slot will be made empty
28376 LD A,(HL) Pick up the message number from this slot
28377 LD (HL),C Replace it with 0 or the message number from the previous slot
28378 LD C,A Save the old contents of this slot
28379 LD A,L Point HL at the previous slot in the message queue
28380 DEC A
28381 OR 8
28383 LD L,A
28384 DJNZ 28376 Jump back to deal with the remaining slots
The following loop looks for the first empty slot in the message queue, and stores the message number there.
28386 LD L,183 HL=32695 (which holds the index of the current message in the message queue at 32696)
28388 LD L,(HL) Copy the index to L
28389 LD A,L A=index of the next message in the queue
28390 INC A
28391 AND 7
28393 ADD A,184 Point HL at the corresponding slot in the queue
28395 LD L,A
28396 LD A,(HL) Pick up the message number from this slot
28397 AND A Is the slot empty?
28398 JR NZ,28389 Jump back if not to check the next slot
28400 LD (HL),E Store the message number in this slot
28401 NOP
28402 NOP
28403 NOP
This entry point is used by the routines at 30972, 30989 and 61440.
28404 LD HL,32695 32695 holds the index of the current message in the message queue at 32696
28407 LD A,(HL) Pick up the index of the current message (0-7)
28408 AND 7 Point HL at the corresponding slot in the message queue
28410 ADD A,184
28412 LD L,A
28413 LD A,(HL) Pick up the number of the current message
28414 AND A Is there a message being displayed at the moment?
28415 JR NZ,28426 Jump if so
28417 CALL 64121 Check whether there are any messages remaining in the message queue
28420 LD HL,(23672) Collect the two least significant bytes of the system variable FRAMES in HL
28423 JR NZ,28454 Jump if there is another message waiting in the queue
28425 RET Z This return always happens
There is a message being displayed at the moment.
28426 CALL 30160 A=minimum number of subintervals of 0.64s that the current message (or message portion) should be displayed for before being replaced
28429 LD HL,0 DE=32*A
28432 LD DE,32
28435 ADD HL,DE
28436 DEC A
28437 JR NZ,28435
28439 EX DE,HL
28440 LD HL,(23672) Collect the two least significant bytes of the system variable FRAMES in HL
28443 LD BC,(32672) BC=two least significant bytes of the system variable FRAMES as they were when the last message was displayed
28447 SBC HL,BC Is it time to display the next message (or next portion of the current message) yet?
28449 SBC HL,DE
28451 RET C Return if not
28452 ADD HL,DE Restore the current value of the two least significant bytes of the system variable FRAMES to HL
28453 ADD HL,BC
28454 LD (32672),HL Update the message display timer at 32672
This entry point is used by the routine at 29716.
28457 EXX
28458 LD HL,32639 Fill the message buffer at 32608 with spaces
28461 LD BC,8224
28464 LD (HL),C
28465 DEC L
28466 DJNZ 28464
28468 EXX
28469 LD HL,32641 32641 holds the submessage indicator (0, 2, 4, 6 or 8)
28472 LD A,(HL) Pick it up in A
28473 AND A Are we in the middle of a message at the moment?
28474 JR NZ,28512 Jump if so
We've reached the end of the current message. Time to display the next message, or clear the message line if there are no messages waiting in the queue.
28476 LD L,183 HL=32695 (which holds the index of the current message in the message queue at 32696)
28478 LD A,(HL) Pick up this index
28479 INC (HL) Increment the index
28480 AND 7 Point HL at the current message in the queue
28482 ADD A,184
28484 LD L,A
28485 LD (HL),0 Set the current message number to 0 (no message)
28487 SUB 7 Point HL at the next message in the queue
28489 OR 8
28491 LD L,A
28492 LD A,(HL) Pick up the message number
28493 AND A Is there another message waiting in the queue?
28494 JR Z,28534 Jump if not to clear the message line
Here we transition from no message to top-level message, or from one message level to a submessage. A holds the (sub)message number.
28496 LD C,A Point BC at the LSB of the message address
28497 LD B,108
28499 LD L,129 Increase the submessage indicator at 32641 by 2 (to 2, 4, 6 or 8)
28501 INC (HL)
28502 INC (HL)
28503 LD L,(HL) Point HL at where the LSB of the message address will be stored
28504 SET 7,L
28506 LD A,(BC) Copy the LSB of the message address here
28507 LD (HL),A
28508 INC B Point BC at the MSB of the message address
28509 INC L Point HL at where the MSB of the message address will be stored
28510 LD A,(BC) Copy the MSB of the message address here
28511 LD (HL),A
28512 LD L,129 HL=32641 (submessage indicator)
28514 LD L,(HL) Point HL at the LSB of the address of the next character in the message
28515 SET 7,L
28517 LD E,(HL) Pick up the LSB in E
28518 INC (HL) Increment the LSB
28519 INC HL Point HL at the MSB of the address of the next character in the message
28520 LD D,(HL) Pick up the MSB in D
28521 JR NZ,28524 Jump unless the LSB rolled over to 0
28523 INC (HL) Increment the MSB
28524 LD A,(DE) A=ASCII code of the next character in the message
28525 AND A Is it the end marker?
28526 JR NZ,28543 Jump if not
We've reached the end of the top-level message or a submessage.
28528 LD L,129 HL=32641 (submessage indicator)
28530 DEC (HL) Reduce the submessage indicator by 2
28531 DEC (HL)
28532 JR NZ,28474 Jump unless we've reached the end of the top-level message
It's time to print the contents of the message buffer.
28534 LD HL,32608 Point HL at the first byte of the message buffer at 32608
28537 LD DE,20608 DE=display file address
28540 JP 28160 Print the contents of the message buffer
At this point A holds the ASCII code of the next character in the message.
28543 CP 32 Is the ASCII code of the character < 32?
28545 JR C,28496 Jump if so to deal with a submessage
28547 JR NZ,28560 Jump if the ASCII code of the character is > 32
The next character in the message is a space. In case there's not enough room left in the message buffer for the word that follows, we now save the submessage indicator and submessage addresses.
28549 LD HL,32641 Copy the submessage indicator and submessage addresses from 32641 to 32512-32527
28552 LD BC,16
28555 LD DE,32512
28558 LDIR
28560 CP 96 Is the ASCII code of the character < 96?
28562 JR C,28572 Jump if so
28564 JR Z,28534 Jump if the ASCII code of the character is 96 (newline)
28566 CP 100 Is the ASCII code of the character >= 100?
28568 JR NC,28496 Jump if so to deal with a submessage
28570 JR 28604 Jump forward to deal with ASCII code 97 or 98 (99 is not used)
28572 EXX
28573 INC L Point HL' at the next free byte in the message buffer at 32608
28574 LD (HL),A Store the ASCII code of the message character there
28575 BIT 7,L Reset the zero flag if we've reached the end of the message buffer (HL'=32640)
28577 EXX
28578 JR Z,28512 Jump if there's still space left in the message buffer
The message buffer at 32608 is full.
28580 LD HL,32512 Restore the submessage indicator and message addresses to 32641
28583 LD DE,32641
28586 LD BC,16
28589 LDIR
28591 LD L,128 HL=32640 (message buffer overflow byte)
28593 LD A,(HL) Remove all characters from the end of the message buffer back to the last space
28594 LD (HL),C
28595 DEC L
28596 LD C,32
28598 CP 32
28600 JR NZ,28593
28602 JR 28534 Print the contents of the message buffer
The ASCII code of the next character in the message is 97 (person or group of people) or 98 (verb).
28604 ADD A,100 A=197 or 198
28606 CALL 28616 Randomly select a message number for either a verb or a person or group of people
28609 JR 28496
Prev: 28355 Up: Map Next: 28611