Routines 
Prev: 59632  Up: Map  Next: 59839 


59635  CALL 59640  Superimpose sprite tiles for characters whose zcoordinate is 2 (between a building and the sidewalk)  
59638  LD A,4  Prepare to superimpose sprite tiles for characters whose zcoordinate is 4 (on the sidewalk or road)  
This entry point is used by the routine at 59148 with A=1 (to superimpose sprite tiles for characters who are indoors).


59640  EXX  
59641  LD C,A  C'=1 (indoors), 2 (between buildings and the sidewalk) or 4 (on the sidewalk or road)  
59642  LD H,215  215 is the first character  
59644  LD L,4  Point HL' at byte 4 of the character's buffer  
59646  LD A,(HL)  A=character's zcoordinate (1, 2, 4 or 8)  
59647  AND C  Reset the zero flag if the character's sprite should be printed  
This entry point is used by the routine at 26002 with H=230 (Sam), DE holding the play area coordinates of a bullet, and the zero flag reset unless Sam's indoors.


59648  JR Z,59742  Consider the next character if this one should not be printed  
59650  LD L,0  Point HL' at byte 0 of the character's buffer  
59652  LD A,(HL)  A=character's animatory state  
59653  AND 127  Drop the direction bit (bit 7)  
59655  CP 120  Is this character's animatory state >= 120?  
59657  JR NC,59717  Jump if so  
The character's animatory state is < 120, which means he has a 5x3 sprite.


59659  INC L  L'=1  
59660  INC A  A=character's animatory state + 1  
59661  AND 7  Reduce this modulo 8  
59663  LD A,E  A=X, the play area xcoordinate (0255)  
59664  JR Z,59692  Jump if the character's animatory state is congruent to 7 mod 8  
The character's animatory state is congruent to 06 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).


59666  SUB (HL)  Subtract the character's xcoordinate  
59667  CP 3  Does any part of the sprite impinge on column X?  
59669  JR NC,59742  Jump if not  
59671  DEC L  L'=0  
59672  BIT 7,(HL)  Is the character facing left?  
59674  JR Z,59679  Jump if so  
59676  CPL  Set A to 2A if the character is facing right  
59677  ADD A,3  
59679  LD B,A  B'=0, 1 or 2 (the column of the character's sprite at (X,Y))  
59680  ADD A,A  A=5*B  
59681  ADD A,A  
59682  ADD A,B  
59683  LD B,A  B'=0, 5 or 10  
59684  LD L,2  Point HL' at byte 2 of the character's buffer  
59686  LD A,D  A=Y, the play area ycoordinate (239)  
59687  SUB (HL)  Subtract the character's ycoordinate  
59688  CP 5  Set the carry flag if the sprite impinges on row Y  
59690  JR 59740  
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).


59692  SUB (HL)  Subtract the character's xcoordinate  
59693  CP 5  Does any part of the character impinge on column X?  
59695  JR NC,59742  Jump if not  
59697  DEC L  L'=0  
59698  BIT 7,(HL)  Is the character facing left?  
59700  JR Z,59705  Jump if so  
59702  CPL  Set A=4A if the character is facing right  
59703  ADD A,5  
59705  LD B,A  B'=0, 1, 2, 3 or 4 (the column of the sprite at (X,Y))  
59706  ADD A,A  A=3*B'  
59707  ADD A,B  
59708  LD B,A  B'=0, 3, 6, 9 or 12  
59709  LD L,2  Point HL' at byte 2 of the character's buffer  
59711  LD A,D  A=Y, the play area ycoordinate (239)  
59712  SUB (HL)  Subtract the character's ycoordinate  
59713  CP 3  Set the carry flag if the sprite impinges on row Y  
59715  JR 59740  
The character's animatory state is >= 120, 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).


59717  LD L,1  Point HL' at byte 1 of the character's buffer  
59719  LD A,E  A=X, the play area xcoordinate (0255)  
59720  SUB (HL)  Subtract the character's xcoordinate  
59721  CP 2  Does any part of the sprite impinge on column X?  
59723  JR NC,59742  Consider the next character if not  
59725  DEC L  L'=0  
59726  BIT 7,(HL)  Is the character facing left?  
59728  JR Z,59732  Jump if so  
59730  XOR 1  Set A=1A  
59732  ADD A,A  A=0 or 2  
59733  LD B,A  B'=0 or 2  
59734  LD L,2  Point HL' at byte 2 of the character's buffer  
59736  LD A,D  A=Y, the play area ycoordinate (239)  
59737  SUB (HL)  Subtract the character's ycoordinate  
59738  CP 2  Set the carry flag if the sprite impinges on row Y  
59740  JR C,59750  Jump if the sprite impinges on row Y  
59742  INC H  Next character  
59743  LD A,H  A=character number  
59744  CP 231  Have we done all the characters (215230)?  
59746  JR NZ,59644  Jump back if not  
59748  EXX  
59749  RET  
The character's sprite impinges on the tile at coordinates (X,Y).


59750  ADD A,B  A=014 (index of the sprite tile at (X,Y))  
59751  ADD A,215  215<=A<=229  
59753  EXX  
59754  LD H,A  215<=H<=229  
59755  EXX  
59756  LD L,0  Point HL' at byte 0 of the character's buffer  
59758  LD A,(HL)  A=character's animatory state  
59759  AND 7  Keep only bits 02  
59761  LD A,(HL)  A=character's animatory state  
59762  JR NZ,59766  Jump if the animatory state is congruent to 17 mod 8  
59764  ADD A,2  Add 2 if the animatory state is congruent to 0 mod 8  
59766  OR 128  A>=129  
59768  EXX  
59769  LD L,A  L>=129, 215<=H<=229  
59770  LD A,(HL)  A=sprite tile reference (0214, 217255)  
59771  LD E,A  Copy this to E  
59772  AND A  Set the zero flag if this is the blank tile  
59773  EXX  
59774  JR Z,59742  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 120127/248255 (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.


59776  LD A,L  A=0  
59777  CP 248  This instruction sets the carry flag  
59779  EXX  
59780  JR C,59791  This jump is always made  
The next section of code is never executed.


59782  LD H,219  Point HL at one of the eight bytes at 56312 (which are all zero)  
59784  LD A,(HL)  Pick up the byte  
59785  AND A  Set the zero flag  
59786  JR Z,59791  This jump would always be made  
59788  LD (43038),A  Update the attribute byte stored at 43038  
Normal service resumes here.


59791  EXX  
59792  LD A,(HL)  A=character's animatory state  
59793  EXX  
59794  LD D,199  Point DE at the graphic data for the sprite tile  
59796  LD HL,40990  Point HL at the back buffer at 40990  
59799  RLCA  Is the character facing right?  
59800  JR C,59817  Jump if so  
The character is facing left, so we can use the tile asis (there is no need to flip it).


59802  EX DE,HL  Now DE points at the back buffer, and HL points at the graphic data for the sprite tile  
59803  LD A,(DE)  Pick up a graphic byte from the back buffer  
59804  OR (HL)  OR on the sprite tile graphic byte  
59805  INC H  Point HL at the sprite tile mask byte  
59806  AND (HL)  AND on the sprite tile mask byte  
59807  LD (DE),A  Update the back buffer byte  
59808  INC H  Point HL at the next graphic byte of the sprite tile  
59809  INC D  Point DE at the next byte of the back buffer  
59810  BIT 3,D  Have we finished all 8 bytes?  
59812  JR Z,59803  Jump back if not  
59814  EX DE,HL  This instruction is redundant  
59815  JR 59836  Consider the next character  
The character is facing right, so we need to flip the tile.


59817  LD B,126  The table of mirror bytes is in page 126  
59819  LD A,(DE)  Pick up a sprite tile graphic byte  
59820  LD C,A  Copy it to C  
59821  LD A,(BC)  A=mirror image of the sprite tile graphic byte  
59822  OR (HL)  OR on the back buffer graphic byte  
59823  LD (HL),A  Store the result in the back buffer  
59824  INC D  Point DE at the sprite tile mask byte  
59825  LD A,(DE)  Pick this up in A  
59826  LD C,A  Copy it to C  
59827  LD A,(BC)  A=mirror image of the sprite tile mask byte  
59828  AND (HL)  AND on the back buffer graphic byte  
59829  LD (HL),A  Store the result in the back buffer  
59830  INC D  Point DE at the next graphic byte of the sprite tile  
59831  INC H  Point HL at the next byte of the back buffer  
59832  BIT 3,H  Have we finished all 8 bytes?  
59834  JR Z,59819  Jump back if not  
59836  EXX  
59837  JR 59742  Jump back to consider the next character 
Prev: 59632  Up: Map  Next: 59839 