| Routines

26958: Print the speech bubble

Used by the routine at 27144. Returns with the carry flag set if the character about to speak is off-screen.
Input
H | Number of the character about to speak (200-204, 208)
26958 | LD A,(32767) | B=leftmost column of the play area on screen
26961 | LD B,A
26962 | LD L,1 | Byte 1 holds the character's x-coordinate
26964 | LD A,(HL) | A=x-coordinate of the character's head (and therefore of the speech bubble lip when it's printed)
26965 | INC A
26966 | SUB B | Return with the carry flag set if the character's head is off-screen to the left
26967 | RET C
26968 | CP 32 | Return with the carry flag set if the character's head is off-screen to the right
26970 | CCF
26971 | RET C
26972 | LD C,A | 0<=C<=31 (screen x-coordinate of the character's head)
26973 | AND 7 | Point DE at an entry in the 8-byte table at 57720, whose contents are (128, 64, 32, 16, 8, 4, 2, 1)
26975 | ADD A,120
26977 | LD E,A
26978 | LD D,225
26980 | LD A,(DE) | The bit set in A corresponds to the bit that needs to be set in the SRB byte for the lip of the speech bubble; store it in 32761
26981 | LD (32761),A
26984 | LD A,C | A=screen column for lip of speech bubble (0-31)
26985 | RRCA | Set E to 0, 1, 2 or 3 (quarter of the screen in which the bubble will be printed)
26986 | RRCA
26987 | RRCA
26988 | AND 3
26990 | LD E,A
26991 | LD A,H | A=number of the character about to speak
26992 | INC L | L=2, which byte holds the character's y-coordinate
26993 | CP 208 | A=0 for EINSTEIN, -1 for a teacher
26995 | SBC A,A
26996 | ADD A,(HL) | A=y-coordinate of the lip of the speech bubble
26997 | PUSH HL |
26998 | ADD A,A | Compute the LSB of the address of the SRB byte corresponding to the location of the speech bubble lip and store it in 32760
26999 | ADD A,A
27000 | LD L,A
27001 | ADD A,E
27002 | LD (32760),A
27005 | LD A,B | Put the current column of the play area at the far left of the screen into 32762 for later use by the routine at 26849
27006 | LD (32762),A
27009 | LD H,11 | HL=attribute file address for the lip of the speech bubble
27011 | ADD HL,HL
27012 | ADD HL,HL
27013 | ADD HL,HL
27014 | LD A,L
27015 | ADD A,C
27016 | LD L,A
27017 | LD DE,39136 | 39136: Lip UDG
27020 | CALL 26941 | Print the lip of the speech bubble
27023 | LD BC,65504 | BC=-32
27026 | ADD HL,BC | Up a line
27027 | PUSH HL | Store this attribute file address
27028 | LD A,L | HL=attribute file address for the top left corner of the speech bubble
27029 | AND 248
27031 | LD L,A
27032 | ADD HL,BC
27033 | LD DE,39392 | 39392: Top left corner UDG
27036 | CALL 26941 | Print the top left corner of the speech bubble
27039 | LD C,6 | There are 6 UDGs in the top middle section of the speech bubble
27041 | LD DE,39648 | 39648: Top-middle section UDG
27044 | INC L |
27045 | CALL 26941 | Print a top-middle section UDG
27048 | DEC C |
27049 | JR NZ,27041 | Jump back until all of the top middle section has been printed
27051 | LD DE,39904 | 39904: Top right corner UDG
27054 | INC L |
27055 | CALL 26941 | Print the top right corner of the speech bubble
27058 | LD C,25 | HL=attribute file address for bottom left corner of speech bubble
27060 | ADD HL,BC
27061 | LD DE,40160 | 40160: Bottom left corner UDG
27064 | CALL 26941 | Print the bottom left corner of the speech bubble
27067 | LD C,6 | There are 6 UDGs in the bottom middle section of the speech bubble
27069 | LD DE,40416 | 40416: Bottom-middle section UDG
27072 | INC L |
27073 | CALL 26941 | Print a bottom-middle section UDG
27076 | DEC C |
27077 | JR NZ,27069 | Jump back until all of the bottom middle section has been printed
27079 | INC L |
27080 | LD DE,40672 | 40672: Bottom right corner UDG
27083 | CALL 26941 | Print the bottom right corner of the speech bubble
27086 | POP HL | Retrieve the attribute file address for the spot above the lip of the speech bubble
27087 | LD A,H | Set HL to the address of the bottom pixel line of the character square above the lip
27088 | AND 11
27090 | ADD A,A
27091 | ADD A,A
27092 | ADD A,A
27093 | ADD A,7
27095 | LD H,A
27096 | LD (HL),66 | 'Open' the part above the lip (previously closed by a middle section UDG)
27098 | LD HL,23360 | Clear the first 64 bytes at 23296 (which will be used as a buffer for the speech text graphic data by the routine at 27144)
27101 | DEC L
27102 | LD (HL),0
27104 | JR NZ,27101
27106 | POP HL | Restore the character number to H
27107 | AND A | Return with the carry flag reset to signal that the speech bubble has been printed
27108 | RET