Routines
 Prev: 59136 Up: Map Next: 59366
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
59156 LD L,A
59157 LD A,H
59158 AND 24
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
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
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)
59213 LD B,A
59214 SET 7,L L=128+Z (128-229)
59216 POP AF A=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
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