Routines
 Prev: 26002 Up: Map Next: 26222
26075: Move and draw the bullets
 Used by the routine at 61568. For each bullet currently in flight, calculates the bullet's next location and draws it there (unless it has hit Sam). 26075 LD HL,32743 32743 holds the bullet timer 26078 DEC (HL) Is it time to move and redraw the bullets? 26079 RET NZ Return if not 26080 LD A,(32671) Collect the MSB of Sam's cash supply 26083 LD C,3 Keep only bits 0 and 1 of the MSB 26085 AND C 26086 XOR C A=6-A 26087 ADD A,C 26088 LD (HL),A Reinitialise the bullet timer at 32743 to 3, 4, 5 or 6 26089 LD L,192 HL=32704 (first byte of bullet buffer 1) The following loop checks each bullet to see whether it is in flight or has flown off the screen. 26091 LD DE,(32766) Collect the x- and y-coordinates of the top-left tile of the play area on screen in E and D 26095 LD A,(HL) A=x-coordinate of the leftmost column of the play area that was on screen the last time the bullet was drawn 26096 LD (HL),E Replace that x-coordinate with the current value 26097 SUB E A=bullet's current screen x-coordinate 26098 INC HL 26099 ADD A,(HL) 26100 LD E,A Copy this to E 26101 LD (HL),A Also store it in the bullet buffer 26102 INC HL Point HL at the third byte of the bullet buffer 26103 CP 32 Has the bullet flown off screen to the right? 26105 JR NC,26111 Jump if so 26107 LD A,(HL) A=bullet's current screen y-coordinate (or 0 if the bullet is not in flight) 26108 AND A Is the bullet in flight at the moment? 26109 JR NZ,26120 Jump if so 26111 LD (HL),0 Set the third byte of the bullet's buffer to 0, indicating that it is not in flight 26113 INC L Point HL at the last byte of the bullet buffer 26114 INC L Point HL at the first byte of the next bullet buffer 26115 BIT 3,L Have we dealt with both bullets yet? 26117 JR Z,26091 Jump back if not 26119 RET This bullet is currently in flight. 26120 LD A,D A=y-coordinate of the topmost row of the play area on screen 26121 CP 20 Is the sidewalk on screen at the moment? 26123 JR NZ,26111 Terminate the bullet if not 26125 LD D,(HL) D=bullet's current screen y-coordinate 26126 PUSH HL Save the pointer to the bullet buffer 26127 EX DE,HL Transfer the bullet's screen x- and y-coordinates to L and H 26128 CALL 59148 Print the play area tile at these coordinates, thus erasing the bullet 26131 POP HL Restore the bullet buffer pointer to HL 26132 INC HL Point HL at the fourth byte of the bullet buffer 26133 LD A,32 Flip bit 5 of this byte 26135 XOR (HL) 26136 LD (HL),A 26137 DEC HL Point HL at the second byte of the bullet buffer (which holds the bullet's screen x-coordinate) 26138 DEC HL 26139 DEC (HL) Decrement the bullet's screen x-coordinate 26140 ADD A,A Is the bullet flying leftwards? 26141 JR NC,26145 Jump if so 26143 INC (HL) Otherwise increment the bullet's x-coordinate 26144 INC (HL) 26145 LD E,(HL) E=bullet's next screen x-coordinate 26146 INC HL Point HL at the third byte of the bullet buffer 26147 BIT 5,E Would the bullet now be off-screen to the left or right? 26149 JR NZ,26111 Terminate the bullet if so 26151 ADD A,A Is the bullet flying perfectly horizontally? 26152 JR NC,26188 Jump if so The bullet is flying at an angle towards the ground or the sky. 26154 ADD A,A Push what was bit 5 of the fourth byte of the bullet buffer into the carry flag (and ignore it) 26155 NOP 26156 NOP 26157 ADD A,A Set the carry flag if the bullet is flying towards the sky 26158 INC HL Point HL at the fourth byte of the bullet buffer 26159 JR C,26178 Jump if the bullet is flying towards the sky The bullet is flying at an angle towards the ground. 26161 RES 3,(HL) Reset bit 3 to prevent overflow (which would affect bits 4-7) 26163 INC (HL) Increment the pixel row counter in bits 0-2 26164 LD A,(HL) Pick up the fourth byte of the bullet buffer 26165 AND 7 Keep only bits 0-2 (the pixel row counter) 26167 DEC HL Point HL at the third byte of the bullet buffer 26168 JR NZ,26188 Jump unless the pixel row counter rolled over from 7 to 0 26170 INC (HL) Increment the bullet's screen y-coordinate 26171 LD A,(HL) A=bullet's next screen y-coordinate 26172 CP 20 Has the bullet flown off the bottom of the screen? 26174 JR Z,26111 Terminate it if so 26176 JR 26188 The bullet is flying at an angle towards the sky. 26178 SET 3,(HL) Set bit 3 to prevent underflow (which would affect bits 4-7) 26180 LD A,(HL) Pick up the fourth byte of the bullet buffer 26181 DEC (HL) Decrement the pixel row counter in bits 0-2 26182 AND 7 A=previous value of the pixel row counter (0-7) 26184 DEC HL Point HL at the third byte of the bullet buffer 26185 JR NZ,26188 Jump unless the pixel row counter rolled over from 0 to 7 26187 DEC (HL) Decrement the bullet's screen y-coordinate 26188 LD D,(HL) D=bullet's next screen y-coordinate Having calculated where the bullet is going next, we check whether it would hit Sam. 26189 CALL 26002 Would the bullet hit Sam? 26192 JR C,26111 Terminate the bullet if so The bullet has not flown off the screen or hit Sam, so now we draw it. 26194 LD A,D A=bullet's next screen y-coordinate 26195 AND 7 Point DE at the top pixel row of the screen cell in which the bullet will be drawn 26197 RRCA 26198 RRCA 26199 RRCA 26200 ADD A,E 26201 LD E,A 26202 LD A,D 26203 AND 24 26205 ADD A,64 26207 LD D,A 26208 INC HL Point HL at the fourth byte of the bullet buffer 26209 LD A,(HL) Point DE at the exact pixel row of the screen cell in which the bullet will be drawn 26210 AND 7 26212 ADD A,D 26213 LD D,A 26214 LD A,(DE) Pick up the current pixel row from the display file 26215 OR 60 Set bits 2-5 26217 AND 189 Reset bits 6 and 1 26219 LD (DE),A Draw the bullet 26220 JR 26114 Jump back to deal with the next bullet
 Prev: 26002 Up: Map Next: 26222