Prev: A133 Up: Map Next: A1A5
A13E: Draws a windows in the display file
Reads the text definition data format (explained at AAAE) and draws the border and content of the windows Used by the routines at 947A, 9C76, A7CE, D871, DAC0 and DED2
Input
IX Address of the text definition data
B Number of lines of the windows
A13E PUSH IX Save IX and BC
A140 PUSH BC
A141 LD A,$01 Initialise the width of the popup at A095
A143 LD ($A095),A
First compute the width of the windows based on the max length of all the lines of text plus 2 Special case: the first line of text computes a width of length of text plus 1
A146 LD A,$01 Initialise the temporal computed width of the windows at A093
A148 LD ($A093),A
A14B LD DE,$0003 In the first iteration, point IX to the first character of the line. Subsequent iterations points to the vertical position
A14E ADD IX,DE
A150 LD A,(IX+$00) Pick up the character at IX
A153 OR A Is the character an end of marker ($00)?
A154 JP Z,$A160 Jump if so
A157 LD HL,$A093 Increment the temporal computed width at A093
A15A INC (HL)
A15B INC IX Increment the address pointer to read the next character
A15D JP $A150 Jump back to A150 and repeat the process
A160 LD A,($A093) Compare the width computed in the last iteration with the max width previously saved
A163 LD HL,$A095
A166 CP (HL)
A167 JP C,$A16D Jump to A16D if the max width is greater or equal than the current computed width
A16A LD ($A095),A Update the max width of the windows at A095 with the new computed value
A16D DJNZ $A146 Jump back while there are lines to process
The next section of code obtain the position and color attributes of the windows
A16F POP BC Restore BC and IX
A170 POP IX
A172 PUSH IX Save BC and IX
A174 PUSH BC
A175 LD A,B Is there only one line of text?
A176 CP $01
A178 JP NZ,$A17F Jump if not
A17B LD HL,$A095 Increment the width of the windows by one at A095. This account for the special case described above
A17E INC (HL)
A17F LD A,(IX+$01) Pick up the horizontal position of the first line of text
A182 SUB $03 Substract 3 to obtain the horizontal position of the windows: one for the border and two for the left margin.
A184 LD H,A Save the horizontal position of the windows at H
A185 LD A,(IX+$02) Pick up the vertical position of the first line of text
A188 SRL A The position is defined in bits 7-3 so move this value to bits 4-0
A18A SRL A
A18C SRL A
A18E DEC A Decrement by one to account for the top border
A18F LD L,A Save the vertical position of the windows at L
A190 LD E,B Save the number of lines of the windows in register E
A191 LD A,($A095) Pick up the width of the windows saved at A095
A194 SUB $02 Substract 2 for the borders
A196 LD D,A Save the width of the windows (minus borders) at D
A197 LD A,$47 Save at A the color attributes for the windows border
A199 LD C,$07 Save at C the color attributes for the windows body
A19B CALL $CE7B Draws the windows borders in the display file
A19E POP BC Save BC and IX
A19F POP IX
A1A1 CALL $A2DF Print the text content of the windows in the display file
A1A4 RET
Prev: A133 Up: Map Next: A1A5