Prev: 59632 Up: Map Next: 59839
59635: Superimpose sprite tiles onto a tile of the play area
Used by the routine at 59148. If any part of a character's sprite needs to be printed at the row and column specified by DE', the appropriate tile is located and superimposed onto the contents of the buffer at 40990.
Input
A 2
D' Play area y-coordinate
E' Play area x-coordinate
59635 CALL 59640 Superimpose sprite tiles for characters whose z-coordinate is 2 (between a building and the sidewalk)
59638 LD A,4 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 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 z-coordinate (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 x-coordinate (0-255)
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 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).
59666 SUB (HL) Subtract the character's x-coordinate
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 2-A 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 y-coordinate (2-39)
59687 SUB (HL) Subtract the character's y-coordinate
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 x-coordinate
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=4-A 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 y-coordinate (2-39)
59712 SUB (HL) Subtract the character's y-coordinate
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 x-coordinate (0-255)
59720 SUB (HL) Subtract the character's x-coordinate
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=1-A
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 y-coordinate (2-39)
59737 SUB (HL) Subtract the character's y-coordinate
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 (215-230)?
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=0-14 (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 0-2
59761 LD A,(HL) A=character's animatory state
59762 JR NZ,59766 Jump if the animatory state is congruent to 1-7 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 (0-214, 217-255)
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 120-127/248-255 (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 as-is (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