Prev: 9DB0 Up: Map Next: 9E2C
9DC0: Handler: Laser Beam
Used by the routine at 8D06.
Only handle the laser beam on every 4th frame.
Handler_LaserBeam 9DC0 LD A,($5E42)
9DC3 AND %00000001 Keep only bit 0.
9DC5 RET NZ
Search for a "free" laser beam slot.
9DC6 LD HL,$6000 HL=Laser_Param_1.
9DC9 LD DE,$0018 DE=0018 (each slot is 18 bytes).
9DCC LD B,$04 B=04 (counter; there are 4 "slots").
LaserBeam_Slot 9DCE LD A,(HL) If the slot is not in use, jump to Init_LaserBeam.
9DCF AND A
9DD0 JR Z,Init_LaserBeam
9DD2 ADD HL,DE HL=HL+DE (move onto the next slot).
9DD3 DJNZ LaserBeam_Slot Decrease counter by one and loop back to LaserBeam_Slot until counter is zero.
All laser beam slots are in use so just return...
9DD5 RET Return.
Possibly the "shoot right" code?
Handler_LaserBeam_0 9DD6 ADD A,$10 A=A+10.
9DD8 OR %00000100 Set bit 2.
9DDA AND %11111110 Keep only bits 1-7.
9DDC JR Handler_LaserBeam_2 Jump to Handler_LaserBeam_2.
Initialise a new laser beam.
Init_LaserBeam 9DDE LD (HL),$11 Mark the laser beam slot as "in-use".
9DE0 INC HL HL=Laser beam Y position.
9DE1 LD DE,$6078 DE=6078.
9DE4 LD B,$0D
9DE6 LD A,(DE)
9DE7 INC DE
9DE8 DEC A
9DE9 BIT 3,A
9DEB JR Z,Handler_LaserBeam_1
9DED DEC B
9DEE DEC B
Handler_LaserBeam_1 9DEF AND $04
9DF1 LD A,(DE)
9DF2 JR NZ,Handler_LaserBeam_0
9DF4 SUB $08
9DF6 AND $F8
9DF8 OR $05
Handler_LaserBeam_2 9DFA LD C,A
9DFB INC DE
9DFC INC DE
9DFD INC DE
9DFE LD A,(DE)
9DFF SUB B
9E00 LD (HL),A
9E01 INC HL
9E02 LD B,$03
9E04 LD (HL),C
9E05 LD A,C
9E06 AND $FB
Handler_LaserBeam_3 9E08 INC HL
9E09 LD (HL),A
9E0A DJNZ Handler_LaserBeam_3
9E0C INC HL
9E0D LD A,($5E40)
9E10 AND $18
9E12 ADD A,$60
9E14 LD (HL),A
9E15 INC HL
9E16 EX DE,HL
9E17 LD HL,$9E28
9E1A LD A,($5E40)
9E1D AND $03
9E1F LD C,A
9E20 LD B,$00
9E22 ADD HL,BC
9E23 LD A,(HL)
9E24 LD (DE),A
9E25 JP SoundsLaserBeam Jump to SoundsLaserBeam.
All the attributes a laser beam can be.
9E28 DEFB $47,$43,$43,$45
View the equivalent code in;
Prev: 9DB0 Up: Map Next: 9E2C