Routines
 Prev: 6EC3 Up: Map Next: 6FC3
6EC5: Add a message to the message queue
Used by the routines at 75CA, 7603, 790D, 7996, 7B6A and FB52. 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
6EC5 LD E,A E=number of the message to be queued
6EC6 LD HL,\$7FB7 7FB7 holds the index of the current message in the message queue at 7FB8
6EC9 LD A,(HL) Pick up the index of the current message
6ECA DEC A A=index of the last message in the queue
6ECB AND \$07
6ECD ADD A,\$B8 Point HL at the corresponding slot in the message queue at 7FB8
6ECF LD L,A
6ED0 LD A,(HL) Pick up the message number from this slot
6ED1 AND A Is the slot empty?
6ED2 JR Z,\$6EE2 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.
6ED4 LD B,\$07 There are six messages to move up a slot, and one to remove completely
6ED6 LD C,\$00 The final slot will be made empty
6ED8 LD A,(HL) Pick up the message number from this slot
6ED9 LD (HL),C Replace it with 0 or the message number from the previous slot
6EDA LD C,A Save the old contents of this slot
6EDB LD A,L Point HL at the previous slot in the message queue
6EDC DEC A
6EDD OR \$08
6EDF LD L,A
6EE0 DJNZ \$6ED8 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.
6EE2 LD L,\$B7 HL=7FB7 (which holds the index of the current message in the message queue at 7FB8)
6EE4 LD L,(HL) Copy the index to L
6EE5 LD A,L A=index of the next message in the queue
6EE6 INC A
6EE7 AND \$07
6EE9 ADD A,\$B8 Point HL at the corresponding slot in the queue
6EEB LD L,A
6EEC LD A,(HL) Pick up the message number from this slot
6EED AND A Is the slot empty?
6EEE JR NZ,\$6EE5 Jump back if not to check the next slot
6EF0 LD (HL),E Store the message number in this slot
6EF1 NOP
6EF2 NOP
6EF3 NOP
This entry point is used by the routines at 78FC, 790D and F000.
6EF4 LD HL,\$7FB7 7FB7 holds the index of the current message in the message queue at 7FB8
6EF7 LD A,(HL) Pick up the index of the current message (0-7)
6EF8 AND \$07 Point HL at the corresponding slot in the message queue
6EFC LD L,A
6EFD LD A,(HL) Pick up the number of the current message
6EFE AND A Is there a message being displayed at the moment?
6EFF JR NZ,\$6F0A Jump if so
6F01 CALL \$FA79 Check whether there are any messages remaining in the message queue
6F04 LD HL,(\$5C78) Collect the two least significant bytes of the system variable FRAMES in HL
6F07 JR NZ,\$6F26 Jump if there is another message waiting in the queue
6F09 RET Z This return always happens
There is a message being displayed at the moment.
6F0A CALL \$75D0 A=minimum number of subintervals of 0.64s that the current message (or message portion) should be displayed for before being replaced
6F0D LD HL,\$0000 DE=32*A
6F10 LD DE,\$0020
6F14 DEC A
6F15 JR NZ,\$6F13
6F17 EX DE,HL
6F18 LD HL,(\$5C78) Collect the two least significant bytes of the system variable FRAMES in HL
6F1B LD BC,(\$7FA0) BC=two least significant bytes of the system variable FRAMES as they were when the last message was displayed
6F1F SBC HL,BC Is it time to display the next message (or next portion of the current message) yet?
6F21 SBC HL,DE
6F23 RET C Return if not
6F24 ADD HL,DE Restore the current value of the two least significant bytes of the system variable FRAMES to HL
6F26 LD (\$7FA0),HL Update the message display timer at 7FA0
This entry point is used by the routine at 7414.
6F29 EXX
6F2A LD HL,\$7F7F Fill the message buffer at 7F60 with spaces
6F2D LD BC,\$2020
6F30 LD (HL),C
6F31 DEC L
6F32 DJNZ \$6F30
6F34 EXX
6F35 LD HL,\$7F81 7F81 holds the submessage indicator (0, 2, 4, 6 or 8)
6F38 LD A,(HL) Pick it up in A
6F39 AND A Are we in the middle of a message at the moment?
6F3A JR NZ,\$6F60 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.
6F3C LD L,\$B7 HL=7FB7 (which holds the index of the current message in the message queue at 7FB8)
6F3E LD A,(HL) Pick up this index
6F3F INC (HL) Increment the index
6F40 AND \$07 Point HL at the current message in the queue
6F44 LD L,A
6F45 LD (HL),\$00 Set the current message number to 0 (no message)
6F47 SUB \$07 Point HL at the next message in the queue
6F49 OR \$08
6F4B LD L,A
6F4C LD A,(HL) Pick up the message number
6F4D AND A Is there another message waiting in the queue?
6F4E JR Z,\$6F76 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.
6F50 LD C,A Point BC at the LSB of the message address
6F51 LD B,\$6C
6F53 LD L,\$81 Increase the submessage indicator at 7F81 by 2 (to 2, 4, 6 or 8)
6F55 INC (HL)
6F56 INC (HL)
6F57 LD L,(HL) Point HL at where the LSB of the message address will be stored
6F58 SET 7,L
6F5A LD A,(BC) Copy the LSB of the message address here
6F5B LD (HL),A
6F5C INC B Point BC at the MSB of the message address
6F5D INC L Point HL at where the MSB of the message address will be stored
6F5E LD A,(BC) Copy the MSB of the message address here
6F5F LD (HL),A
6F60 LD L,\$81 HL=7F81 (submessage indicator)
6F62 LD L,(HL) Point HL at the LSB of the address of the next character in the message
6F63 SET 7,L
6F65 LD E,(HL) Pick up the LSB in E
6F66 INC (HL) Increment the LSB
6F67 INC HL Point HL at the MSB of the address of the next character in the message
6F68 LD D,(HL) Pick up the MSB in D
6F69 JR NZ,\$6F6C Jump unless the LSB rolled over to 0
6F6B INC (HL) Increment the MSB
6F6C LD A,(DE) A=ASCII code of the next character in the message
6F6D AND A Is it the end marker?
6F6E JR NZ,\$6F7F Jump if not
We've reached the end of the top-level message or a submessage.
6F70 LD L,\$81 HL=7F81 (submessage indicator)
6F72 DEC (HL) Reduce the submessage indicator by 2
6F73 DEC (HL)
6F74 JR NZ,\$6F3A Jump unless we've reached the end of the top-level message
It's time to print the contents of the message buffer.
6F76 LD HL,\$7F60 Point HL at the first byte of the message buffer at 7F60
6F79 LD DE,\$5080 DE=display file address
6F7C JP \$6E00 Print the contents of the message buffer
At this point A holds the ASCII code of the next character in the message.
6F7F CP \$20 Is the ASCII code of the character < 0x20?
6F81 JR C,\$6F50 Jump if so to deal with a submessage
6F83 JR NZ,\$6F90 Jump if the ASCII code of the character is > 0x20
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.
6F85 LD HL,\$7F81 Copy the submessage indicator and submessage addresses from 7F81 to 7F00-7F0F
6F88 LD BC,\$0010
6F8B LD DE,\$7F00
6F8E LDIR
6F90 CP \$60 Is the ASCII code of the character < 0x60?
6F92 JR C,\$6F9C Jump if so
6F94 JR Z,\$6F76 Jump if the ASCII code of the character is 0x60 (newline)
6F96 CP \$64 Is the ASCII code of the character >= 0x64?
6F98 JR NC,\$6F50 Jump if so to deal with a submessage
6F9A JR \$6FBC Jump forward to deal with ASCII code 0x61 or 0x62 (0x63 is not used)
6F9C EXX
6F9D INC L Point HL' at the next free byte in the message buffer at 7F60
6F9E LD (HL),A Store the ASCII code of the message character there
6F9F BIT 7,L Reset the zero flag if we've reached the end of the message buffer (HL'=7F80)
6FA1 EXX
6FA2 JR Z,\$6F60 Jump if there's still space left in the message buffer
The message buffer at 7F60 is full.
6FA4 LD HL,\$7F00 Restore the submessage indicator and message addresses to 7F81
6FA7 LD DE,\$7F81
6FAA LD BC,\$0010