|  | Routines | 
| Prev: E8F0 | Up: Map | Next: E9BF | 
| 
 | ||||||||||||
| E8F3 | CALL $E8F8 | Superimpose sprite tiles for characters whose z-coordinate is 2 (between a building and the sidewalk) | ||||||||||
| E8F6 | LD A,$04 | Prepare to superimpose sprite tiles for characters whose z-coordinate is 4 (on the sidewalk or road) | ||||||||||
| 
This entry point is used by the routine at E70C with A=1 (to superimpose sprite tiles for characters who are indoors).
 | ||||||||||||
| E8F8 | EXX | |||||||||||
| E8F9 | LD C,A | C'=1 (indoors), 2 (between buildings and the sidewalk) or 4 (on the sidewalk or road) | ||||||||||
| E8FA | LD H,$D7 | 0xD7 is the first character | ||||||||||
| E8FC | LD L,$04 | Point HL' at byte 0x04 of the character's buffer | ||||||||||
| E8FE | LD A,(HL) | A=character's z-coordinate (1, 2, 4 or 8) | ||||||||||
| E8FF | AND C | Reset the zero flag if the character's sprite should be printed | ||||||||||
| 
This entry point is used by the routine at 6592 with H=0xE6 (Sam), DE holding the play area coordinates of a bullet, and the zero flag reset unless Sam's indoors.
 | ||||||||||||
| E900 | JR Z,$E95E | Consider the next character if this one should not be printed | ||||||||||
| E902 | LD L,$00 | Point HL' at byte 0x00 of the character's buffer | ||||||||||
| E904 | LD A,(HL) | A=character's animatory state | ||||||||||
| E905 | AND $7F | Drop the direction bit (bit 7) | ||||||||||
| E907 | CP $78 | Is this character's animatory state >= 0x78? | ||||||||||
| E909 | JR NC,$E945 | Jump if so | ||||||||||
| 
The character's animatory state is < 0x78, which means he has a 5x3 sprite.
 | ||||||||||||
| E90B | INC L | L'=0x01 | ||||||||||
| E90C | INC A | A=character's animatory state + 1 | ||||||||||
| E90D | AND $07 | Reduce this modulo 8 | ||||||||||
| E90F | LD A,E | A=X, the play area x-coordinate (0-255) | ||||||||||
| E910 | JR Z,$E92C | Jump if the character's animatory state is congruent to 7 mod 8 | ||||||||||
| 
The character's animatory state is congruent to 0-6 mod 8, which means he has a sprite with 5 rows and 3 columns. Check whether any part of the sprite impinges on the tile at (X,Y).
 | ||||||||||||
| E912 | SUB (HL) | Subtract the character's x-coordinate | ||||||||||
| E913 | CP $03 | Does any part of the sprite impinge on column X? | ||||||||||
| E915 | JR NC,$E95E | Jump if not | ||||||||||
| E917 | DEC L | L'=0x00 | ||||||||||
| E918 | BIT 7,(HL) | Is the character facing left? | ||||||||||
| E91A | JR Z,$E91F | Jump if so | ||||||||||
| E91C | CPL | Set A to 2-A if the character is facing right | ||||||||||
| E91D | ADD A,$03 | |||||||||||
| E91F | LD B,A | B'=0, 1 or 2 (the column of the character's sprite at (X,Y)) | ||||||||||
| E920 | ADD A,A | A=5*B | ||||||||||
| E921 | ADD A,A | |||||||||||
| E922 | ADD A,B | |||||||||||
| E923 | LD B,A | B'=0, 5 or 10 | ||||||||||
| E924 | LD L,$02 | Point HL' at byte 0x02 of the character's buffer | ||||||||||
| E926 | LD A,D | A=Y, the play area y-coordinate (2-39) | ||||||||||
| E927 | SUB (HL) | Subtract the character's y-coordinate | ||||||||||
| E928 | CP $05 | Set the carry flag if the sprite impinges on row Y | ||||||||||
| E92A | JR $E95C | |||||||||||
| 
The character's animatory state is congruent to 7 mod 8, which means he has a sprite with 3 rows and 5 columns. Check whether any part of the sprite impinges on the tile at (X,Y).
 | ||||||||||||
| E92C | SUB (HL) | Subtract the character's x-coordinate | ||||||||||
| E92D | CP $05 | Does any part of the character impinge on column X? | ||||||||||
| E92F | JR NC,$E95E | Jump if not | ||||||||||
| E931 | DEC L | L'=0x00 | ||||||||||
| E932 | BIT 7,(HL) | Is the character facing left? | ||||||||||
| E934 | JR Z,$E939 | Jump if so | ||||||||||
| E936 | CPL | Set A=4-A if the character is facing right | ||||||||||
| E937 | ADD A,$05 | |||||||||||
| E939 | LD B,A | B'=0, 1, 2, 3 or 4 (the column of the sprite at (X,Y)) | ||||||||||
| E93A | ADD A,A | A=3*B' | ||||||||||
| E93B | ADD A,B | |||||||||||
| E93C | LD B,A | B'=0, 3, 6, 9 or 12 | ||||||||||
| E93D | LD L,$02 | Point HL' at byte 0x02 of the character's buffer | ||||||||||
| E93F | LD A,D | A=Y, the play area y-coordinate (2-39) | ||||||||||
| E940 | SUB (HL) | Subtract the character's y-coordinate | ||||||||||
| E941 | CP $03 | Set the carry flag if the sprite impinges on row Y | ||||||||||
| E943 | JR $E95C | |||||||||||
| 
The character's animatory state is >= 0x78, which means he has a sprite with 2 rows and 2 columns. Check whether any part of the sprite impinges on the tile at (X,Y).
 | ||||||||||||
| E945 | LD L,$01 | Point HL' at byte 0x01 of the character's buffer | ||||||||||
| E947 | LD A,E | A=X, the play area x-coordinate (0-255) | ||||||||||
| E948 | SUB (HL) | Subtract the character's x-coordinate | ||||||||||
| E949 | CP $02 | Does any part of the sprite impinge on column X? | ||||||||||
| E94B | JR NC,$E95E | Consider the next character if not | ||||||||||
| E94D | DEC L | L'=0x00 | ||||||||||
| E94E | BIT 7,(HL) | Is the character facing left? | ||||||||||
| E950 | JR Z,$E954 | Jump if so | ||||||||||
| E952 | XOR $01 | Set A=1-A | ||||||||||
| E954 | ADD A,A | A=0 or 2 | ||||||||||
| E955 | LD B,A | B'=0 or 2 | ||||||||||
| E956 | LD L,$02 | Point HL' at byte 0x02 of the character's buffer | ||||||||||
| E958 | LD A,D | A=Y, the play area y-coordinate (2-39) | ||||||||||
| E959 | SUB (HL) | Subtract the character's y-coordinate | ||||||||||
| E95A | CP $02 | Set the carry flag if the sprite impinges on row Y | ||||||||||
| E95C | JR C,$E966 | Jump if the sprite impinges on row Y | ||||||||||
| E95E | INC H | Next character | ||||||||||
| E95F | LD A,H | A=character number | ||||||||||
| E960 | CP $E7 | Have we done all the characters (0xD7-0xE6)? | ||||||||||
| E962 | JR NZ,$E8FC | Jump back if not | ||||||||||
| E964 | EXX | |||||||||||
| E965 | RET | |||||||||||
| 
The character's sprite impinges on the tile at coordinates (X,Y).
 | ||||||||||||
| E966 | ADD A,B | A=0-14 (index of the sprite tile at (X,Y)) | ||||||||||
| E967 | ADD A,$D7 | 0xD7<=A<=0xE5 | ||||||||||
| E969 | EXX | |||||||||||
| E96A | LD H,A | 0xD7<=H<=0xE5 | ||||||||||
| E96B | EXX | |||||||||||
| E96C | LD L,$00 | Point HL' at byte 0x00 of the character's buffer | ||||||||||
| E96E | LD A,(HL) | A=character's animatory state | ||||||||||
| E96F | AND $07 | Keep only bits 0-2 | ||||||||||
| E971 | LD A,(HL) | A=character's animatory state | ||||||||||
| E972 | JR NZ,$E976 | Jump if the animatory state is congruent to 1-7 mod 8 | ||||||||||
| E974 | ADD A,$02 | Add 2 if the animatory state is congruent to 0 mod 8 | ||||||||||
| E976 | OR $80 | A>=0x81 | ||||||||||
| E978 | EXX | |||||||||||
| E979 | LD L,A | L>=0x81, 0xD7<=H<=0xE5 | ||||||||||
| E97A | LD A,(HL) | A=sprite tile reference (0x00-0xD6, 0xD9-0xFF) | ||||||||||
| E97B | LD E,A | Copy this to E | ||||||||||
| E97C | AND A | Set the zero flag if this is the blank tile | ||||||||||
| E97D | EXX | |||||||||||
| E97E | JR Z,$E95E | Jump back to consider the next character if the sprite tile is blank | ||||||||||
| 
A tile of this character's sprite needs to be printed at (X,Y). The apparent intention of the next section of code is to treat animatory states 0x78-0x7F/0xF8-0xFF (used only by the hook) specially, but the next instruction copies L' (which holds 0) instead of L (which holds the adjusted animatory state) into A.
 | ||||||||||||
| E980 | LD A,L | A=0 | ||||||||||
| E981 | CP $F8 | This instruction sets the carry flag | ||||||||||
| E983 | EXX | |||||||||||
| E984 | JR C,$E98F | This jump is always made | ||||||||||
| 
The next section of code is never executed.
 | ||||||||||||
| E986 | LD H,$DB | Point HL at one of the eight bytes at DBF8 (which are all zero) | ||||||||||
| E988 | LD A,(HL) | Pick up the byte | ||||||||||
| E989 | AND A | Set the zero flag | ||||||||||
| E98A | JR Z,$E98F | This jump would always be made | ||||||||||
| E98C | LD ($A81E),A | Update the attribute byte stored at A81E | ||||||||||
| 
Normal service resumes here.
 | ||||||||||||
| E98F | EXX | |||||||||||
| E990 | LD A,(HL) | A=character's animatory state | ||||||||||
| E991 | EXX | |||||||||||
| E992 | LD D,$C7 | Point DE at the graphic data for the sprite tile | ||||||||||
| E994 | LD HL,$A01E | Point HL at the back buffer at A01E | ||||||||||
| E997 | RLCA | Is the character facing right? | ||||||||||
| E998 | JR C,$E9A9 | Jump if so | ||||||||||
| 
The character is facing left, so we can use the tile as-is (there is no need to flip it).
 | ||||||||||||
| E99A | EX DE,HL | Now DE points at the back buffer, and HL points at the graphic data for the sprite tile | ||||||||||
| E99B | LD A,(DE) | Pick up a graphic byte from the back buffer | ||||||||||
| E99C | OR (HL) | OR on the sprite tile graphic byte | ||||||||||
| E99D | INC H | Point HL at the sprite tile mask byte | ||||||||||
| E99E | AND (HL) | AND on the sprite tile mask byte | ||||||||||
| E99F | LD (DE),A | Update the back buffer byte | ||||||||||
| E9A0 | INC H | Point HL at the next graphic byte of the sprite tile | ||||||||||
| E9A1 | INC D | Point DE at the next byte of the back buffer | ||||||||||
| E9A2 | BIT 3,D | Have we finished all 8 bytes? | ||||||||||
| E9A4 | JR Z,$E99B | Jump back if not | ||||||||||
| E9A6 | EX DE,HL | This instruction is redundant | ||||||||||
| E9A7 | JR $E9BC | Consider the next character | ||||||||||
| 
The character is facing right, so we need to flip the tile.
 | ||||||||||||
| E9A9 | LD B,$7E | The table of mirror bytes is in page 0x7E | ||||||||||
| E9AB | LD A,(DE) | Pick up a sprite tile graphic byte | ||||||||||
| E9AC | LD C,A | Copy it to C | ||||||||||
| E9AD | LD A,(BC) | A=mirror image of the sprite tile graphic byte | ||||||||||
| E9AE | OR (HL) | OR on the back buffer graphic byte | ||||||||||
| E9AF | LD (HL),A | Store the result in the back buffer | ||||||||||
| E9B0 | INC D | Point DE at the sprite tile mask byte | ||||||||||
| E9B1 | LD A,(DE) | Pick this up in A | ||||||||||
| E9B2 | LD C,A | Copy it to C | ||||||||||
| E9B3 | LD A,(BC) | A=mirror image of the sprite tile mask byte | ||||||||||
| E9B4 | AND (HL) | AND on the back buffer graphic byte | ||||||||||
| E9B5 | LD (HL),A | Store the result in the back buffer | ||||||||||
| E9B6 | INC D | Point DE at the next graphic byte of the sprite tile | ||||||||||
| E9B7 | INC H | Point HL at the next byte of the back buffer | ||||||||||
| E9B8 | BIT 3,H | Have we finished all 8 bytes? | ||||||||||
| E9BA | JR Z,$E9AB | Jump back if not | ||||||||||
| E9BC | EXX | |||||||||||
| E9BD | JR $E95E | Jump back to consider the next character | ||||||||||
| Prev: E8F0 | Up: Map | Next: E9BF |