| Routines

59148: Print a tile

Used by the routines at 26075, 59406, 59461, 59516, 59575 and 60032. Copies a background tile of the play area into the back buffer at 40990, superimposes character sprite tiles and a foreground tile as appropriate, and then copies the resultant tile to the screen. Also sets the corresponding attribute byte.
Input
H | Screen row number (0-19)
L | Screen column number (0-31)
59148 | PUSH HL | Put the screen coordinates onto the stack
59149 | LD A,H | Compute the corresponding display file address in HL
59150 | AND 7
59152 | RRCA
59153 | RRCA
59154 | RRCA
59155 | ADD A,L
59156 | LD L,A
59157 | LD A,H
59158 | AND 24
59160 | ADD A,64
59162 | LD H,A
59163 | EX (SP),HL | Put the display file address onto the stack and get the screen coordinates back in HL
59164 | LD DE,(32766) | DE=play area coordinates of the top-left corner of the screen
59168 | ADD HL,DE | HL=play area coordinates of the tile to be printed
59169 | PUSH HL | Push these coordinates onto the stack...
59170 | EXX |
59171 | POP DE | ...and pop them into DE'
59172 | EXX |
In order to find the graphic data and attribute byte for the play area tile(s) to be printed at (X,Y), we need the T and T' values for that location; these values can be found in turn from the Z, Z' and Z'' values for the location. The Z value (0<=Z<=101) for the play area location (X,Y) is found in byte INT(X/8) of page 184+INT(Y/6). Then the Z' value is found in byte Z of page 191, and the Z'' value in byte 128+Z of page 184+X%8. Z'' and bit 7-(X%8) of Z' determine the address, P, of the T value for the play area location (X,Y): Z'' is the LSB, and the MSB is either 160+2*(Y%6) or 172+2*(Y%6), depending on whether bit 7-(X%8) of Z' is reset or set. The address of the T' value is P+256.
59173 | LD A,H | A=Y, the play area y-coordinate (2-39)
59174 | LD D,183 | Set D=184+INT(Y/6) (184-190)
59176 | INC D
59177 | SUB 6
59179 | JR NC,59176
59181 | ADD A,86 | 80<=A<=85
59183 | ADD A,A | A=160, 162, 164, 166, 168 or 170
59184 | LD B,A | B=160+2*(Y%6)
59185 | LD A,L | A=X, the play area x-coordinate (0-255)
59186 | AND 248 | Keep only bits 3-7
59188 | RRA | Slide them down into bits 0-4; now A=INT(X/8)
59189 | RRCA
59190 | RRCA
59191 | LD E,A | Point DE at the Z value for the play area location (X,Y)
59192 | LD A,L | A=X, the play area x-coordinate (0-255)
59193 | AND 7 | Keep only bits 0-2; now A=X%8
59195 | PUSH AF | Save this value briefly
59196 | ADD A,160 | 160<=A<=167
59198 | LD H,A | H=160+(X%8)
59199 | LD L,21 | Point HL at byte 21 of page 160+(X%8)
59201 | LD C,(HL) | Now C=128 (if X%8=0), 64, 32, 16, 8, 4, 2, or 1 (if X%8=7)
59202 | LD A,(DE) | A=Z (value of byte INT(X/8) of page 184+INT(Y/6))
59203 | LD L,A | L=Z (0-101)
59204 | LD H,191 | Point HL at the table of Z' values at 48896
59206 | LD A,(HL) | A=Z' (0, 1, 3, 7, 14, 31, 128, 134, 199, 215, 240, 252, or 255)
59207 | AND C | Is bit 7-(X%8) of Z' set?
59208 | JR Z,59214 | Jump if not
59210 | LD A,B | Otherwise set B=172+2*(Y%6)
59211 | ADD A,12
59213 | LD B,A
59214 | SET 7,L | L=128+Z (128-229)
59216 | POP AF | A=X%8
59217 | ADD A,184 | H=184+X%8
59219 | LD H,A
59220 | LD C,(HL) | C=Z'' (value of byte 128+Z of page 184+X%8)
59221 | SET 5,E | E=32+INT(X/8)
59223 | LD A,(DE) | A=value of byte 32+INT(X/8) of page 184+INT(Y/6)
59224 | LD L,A | L=attribute byte address LSB (0-27)
59225 | LD A,E | A=32+INT(X/8)
59226 | XOR 96 | A=64+INT(X/8)
59228 | LD E,A | Point DE at the window flags for the play area location (X,Y)
59229 | LD A,(BC) | A=T (value of byte Z'' of page 160+2*(Y%6) or 172+2*(Y%6))
We have collected the T value for the play area location (X,Y). Bits 7 and 6 of T have the following meanings:
Value | Meaning
--- | ---
11 | This location has a background tile and a transparent foreground tile
10 | This location has a blank background tile and a transparent foreground tile (used by windows and house number signs)
01 | This location has an opaque foreground tile only (characters with a z-coordinate of 1 will appear behind it)
00 | This location has a background tile only (characters with a z-coordinate of 1 will appear in front of it)
When bits 7 and 6 of T are both set (11), bits 2-5 of T and bit 7 of T' indicate the LSB of the address of the background tile's graphic data; the MSB is always 128. The LSBs of the addresses of the graphic data for the two half-tiles that make up the foreground tile are derived from bits 0-6 of T'; the MSBs are always 128. When bit 7 of T is set and bit 6 is reset (10), bits 3-5 are unused, and bit 2 is set only if the right-hand window of a pair is at this location. The LSBs of the addresses of the graphic data for the two half-tiles that make up the foreground tile are derived from T' (0-31) and the window flags; the MSBs are always 128. When bit 7 of T is reset, bit 5 is unused (always reset), and bits 2-4 indicate the MSB of the address of the tile's graphic data (128, 136, 144, 152 or 160); the LSB is equal to T'. Finally, bits 1 and 0 of T indicate the MSB of the address of the tile's attribute byte (168, 169, 170 or 171); the LSB (0-27, already collected in L at this point) is found in byte 32+INT(X/8) of page 184+INT(Y/6).
59230 | AND 3 | Keep only bits 0 and 1 of T
59232 | ADD A,168 | 168<=A<=171
59234 | LD H,A | 168<=H<=171
59235 | LD A,(HL) | A=play area tile attribute byte
59236 | LD (43038),A | Save it at 43038 for later retrieval
59239 | LD A,(BC) | A=T
59240 | INC B | B=161+2*(Y%6) or 173+2*(Y%6); now BC points at the T' value
59241 | RLCA | Does this play area location have a background tile and a foreground tile?
59242 | JR NC,59324 | Jump if not
The play area location under consideration has a background tile and a foreground tile.
59244 | BIT 7,A | Is there a window or a house number sign here?
59246 | JR NZ,59268 | Jump if not
There is a window or a house number sign at this location.
59248 | CALL 63450 | Collect the window flags
59251 | JR Z,59259 | Jump unless we are dealing with the right-hand window of a pair
59253 | AND 35 | Keep only bits 5 (light indicator), 1 and 0 (decoration indicator) of the window flags
59255 | ADD A,96 | Set bit 7 if the light is off (i.e. copy bit 5 into bit 7)
59257 | RRCA | Move bits 1 and 0 (decoration indicator) into bits 7 and 6, and the light indicator back into bit 5
59258 | RRCA
59259 | AND 224 | Keep only bits 5 (light indicator), 6 and 7 (decoration indicator) of the window flags
59261 | LD E,A | Copy these bits to E
59262 | LD A,(BC) | A=T' (0-31 for window tiles and house number sign tiles)
59263 | OR E | A=foreground tile identifier
59264 | LD L,159 | Use tile 159 in page 128 (which is blank) as the background tile
59266 | JR 59281 |
There is no window or house number sign at this location, and it has a background tile and a transparent foreground tile.
59268 | AND 120 | Keep only bits 2-5 of T
59270 | RRA
59271 | SCF | Shift bits 2-5 into bits 1-4 and set bit 7
59272 | RRA
59273 | LD L,A | L=background tile reference (even number >= 128)
59274 | LD A,(BC) | A=T'
59275 | RLCA | Is bit 7 of T' set?
59276 | JR NC,59279 | Jump if not
59278 | INC L | Increment the background tile reference (to an odd number >= 129)
59279 | SCF | A=T' with bit 7 set
59280 | RRA
59281 | LD E,A | E=foreground tile identifier
59282 | LD H,128 | Point HL at the background tile graphic data
Now HL holds the base address of the background tile graphic data.
59284 | PUSH DE | Save the foreground tile identifier (in E)
59285 | CALL 59136 | Copy the background tile into the back buffer at 40990
59288 | LD A,1 | Superimpose sprite tiles for characters who are indoors (z=1)
59290 | CALL 59640
59293 | POP BC | Restore the foreground tile identifier to C
Now we superimpose the foreground tile. The 16 graphic and mask bytes for the foreground tile are found in two groups of 8 bytes in pages 128-135.
59294 | LD B,192 | The LSB of the first group of 8 bytes is found in page 192
59296 | LD DE,40990 | Point DE at the back buffer at 40990
59299 | LD A,(BC) | A=LSB of the first group of 8 bytes
59300 | LD L,A | Copy the LSB to L
59301 | LD H,128 | Point HL at the first byte (a graphic byte) in the group
59303 | LD B,4 | There are 4 pairs of bytes per group
59305 | LD A,(DE) | A=back buffer byte
59306 | OR (HL) | OR on the graphic byte
59307 | INC H | Point HL at the corresponding mask byte
59308 | AND (HL) | AND on the mask byte
59309 | INC H | Point HL at the next graphic byte
59310 | LD (DE),A | Replace the back buffer byte
59311 | INC D | Point DE at the next back buffer byte
59312 | DJNZ 59305 | Jump back until all 8 bytes have been done
59314 | LD B,193 | The LSB of the second group of 8 bytes is found in page 193
59316 | LD A,(BC) | A=LSB of the second group of 8 bytes
59317 | INC C | Set the zero flag if we've just done the second group
59318 | LD C,255 | Signal: the second group is next
59320 | JR NZ,59300 | Jump back until both groups have been done
59322 | JR 59342 |
The play area location under consideration has only one tile: either a background tile (if bit 6 of T is reset), or an opaque foreground tile (bit 6 of T set).
59324 | AND 184 | Keep only bits 3-5 and 7 (bits 2-4 and 6 of T)
59326 | RLCA | Copy bit 6 of T into the carry flag
59327 | PUSH AF | Save the carry flag
59328 | SCF | Now A has bit 7 set, and a copy of bits 2-4 of T in bits 3-5
59329 | RRA
59330 | LD H,A | H=128, 136, 144, 152 or 160
59331 | LD A,(BC) | A=T'
59332 | LD L,A | Point HL at the tile graphic data
59333 | CALL 59136 | Copy the tile into the back buffer at 40990
59336 | POP AF | Restore the carry flag
59337 | LD A,1 | Superimpose sprite tiles for characters who are indoors (z=1) if we're dealing with a background tile
59339 | CALL NC,59640
Now we can superimpose sprite tiles for characters who are in the foreground.
59342 | LD A,2 | Superimpose sprite tiles for characters who are between a building and the sidewalk (z=2), and then for characters who are on the sidewalk or road (z=4)
59344 | CALL 59635
The tile in the back buffer is now ready to be drawn.
59347 | POP DE | DE=display file address
59348 | LD C,E | C=corresponding attribute file address LSB
59349 | LD A,D | A=display file address MSB (64, 72 or 80)
59350 | LD HL,40990 | Point HL at the back buffer containing the tile to be drawn
59353 | RRCA | A=88, 89 or 90
59354 | RRCA
59355 | RRCA
59356 | ADD A,80
59358 | LD B,A | Point BC at the appropriate byte of the attribute file
59359 | LD A,(43038) | Collect the attribute byte saved earlier at 43038
59362 | LD (BC),A | Copy it to the attribute file
59363 | JP 59139 | Copy the tile to the display file