![]() |
Routines |
| Prev: 66C0 | Up: Map | Next: 670A |
|
||||||||
| 66CE | LD L,$10 | Bytes 0x0F and 0x10 hold the address of the next character in the sub-submessage being written/spoken (if any) | ||||||
| 66D0 | LD A,(HL) | |||||||
| 66D1 | AND A | Are we working on a sub-submessage? | ||||||
| 66D2 | JR NZ,$66DC | Jump if so | ||||||
| 66D4 | LD L,$0E | Bytes 0x0D and 0x0E hold the address of the next character in the submessage being written/spoken (if any) | ||||||
| 66D6 | LD A,(HL) | |||||||
| 66D7 | AND A | Are we working on a submessage? | ||||||
| 66D8 | JR NZ,$66DC | Jump if so | ||||||
| 66DA | LD L,$0C | We're working on a top-level message | ||||||
| 66DC | LD D,(HL) | DE=address of the next character in the (sub)(sub)message | ||||||
| 66DD | DEC L | |||||||
| 66DE | LD E,(HL) | |||||||
| 66DF | LD A,(DE) | Pick up the character code in A | ||||||
| 66E0 | INC DE | Move the pointer to the next character and store the address for future reference | ||||||
| 66E1 | LD (HL),E | |||||||
| 66E2 | INC L | |||||||
| 66E3 | LD (HL),D | |||||||
| 66E4 | AND A | Has the end of the (sub)(sub)message been reached? | ||||||
| 66E5 | JR NZ,$66F0 | Jump if not | ||||||
|
We've reached the end of the (sub)(sub)message.
|
||||||||
| 66E7 | LD (HL),$00 | Signal: end of (sub)(sub)message | ||||||
| 66E9 | DEC L | L=0x0B (top-level message), 0x0D (submessage) or 0x0F (sub-submessage) | ||||||
| 66EA | BIT 2,L | Has the end of the top-level message been reached (L=0x0B)? | ||||||
| 66EC | RET Z | Return if so | ||||||
| 66ED | DEC L | Otherwise go up to the submessage or the top-level message and jump back to deal with it | ||||||
| 66EE | JR $66DC | |||||||
|
We haven't reached the end of the (sub)(sub)message yet. Determine whether the next code is a regular character code or a pointer to another message.
|
||||||||
| 66F0 | SUB $20 | |||||||
| 66F2 | CP $60 | |||||||
| 66F4 | JR NC,$66F9 | Jump with character codes 0x01-0x1F or 0x80 onwards | ||||||
| 66F6 | ADD A,$20 | |||||||
| 66F8 | RET | Return with the standard ASCII code in A | ||||||
| 66F9 | ADD A,$20 | |||||||
| 66FB | CP $03 | |||||||
| 66FD | RET C | Return with character codes 0x01 and 0x02 (end of line) | ||||||
|
The next character in the message is actually a pointer to another message. Find the address of that message, and store it for future reference.
|
||||||||
| 66FE | LD E,A | DE points to the LSB of the start address of the (sub)submessage | ||||||
| 66FF | LD D,$FE | |||||||
| 6701 | INC L | L=0x0D (submessage) or 0x0F (sub-submessage) | ||||||
| 6702 | LD A,(DE) | A=LSB of the start address of the (sub)submessage | ||||||
| 6703 | LD (HL),A | Store it in byte 0x0D or 0x0F of the character's buffer | ||||||
| 6704 | INC L | L=0x0E (submessage) or 0x10 (sub-submessage) | ||||||
| 6705 | INC D | A=MSB of the address of the (sub)submessage | ||||||
| 6706 | LD A,(DE) | |||||||
| 6707 | LD (HL),A | Store it in byte 0x0E or 0x10 of the character's buffer | ||||||
| 6708 | JR $66DC | Jump back to collect a character from this (sub)submessage | ||||||
| Prev: 66C0 | Up: Map | Next: 670A |