Prev: B57E Up: Map Next: B943
B645: Draw projectiles
Draw Enemy projectiles. Used by the routines at 947A and A915.
B645 LD IX,$5D22 Set IX to the base address for enemy projectiles configuration
B649 LD B,$14 Set B to the max number of enemy projectiles on screen
B64B JP $B654 Jump forward to read projectile data and draw
Draw Rex projectiles. Used by the routine at 947A.
B64E LD IX,$5B60 Set IX to the base address for Rex projectiles configuration
B652 LD B,$1E Set B to the max number of Rex projectiles
Read configuration data and draw projectiles
B654 LD A,(IX+$06) Set A the projectile status
B657 OR A is destroyed?
B658 JP Z,$B6F6 Jump if so
B65B CP $02 just hit?
B65D JP Z,$B7BD Jump if so
B660 CP $03 exploding?
B662 JP Z,$B7D8 Jump is so The projectile is flying
B665 LD L,(IX+$02) Set HL to the addres location in room graphic buffer
B668 LD H,(IX+$03)
B66B LD A,(IX+$0B) Set REG#a the projectile type
B66E AND $7F
B670 OR A is a basic laser?
B671 JP Z,$B893 draw basic laser sprite
B674 CP $01 is a basic laser?
B676 JP Z,$B893 draw basic laser sprite
B679 CP $04 is a spray?
B67B JP Z,$B867 draw spray sprite
B67E CP $02 is a laser?
B680 JP Z,$B8BC draw laser sprite $02
B683 CP $03 is a multiple?
B685 JP Z,$B893 draw basic laser sprite
B688 CP $06 is a laser?
B68A JP Z,$B920 draw laser sprite $06
B68D CP $07 is a missile?
B68F JP Z,$B7FC draw missile
B692 LD A,(IX+$00) Set A the projectile x-position
B695 ADC A,(IX+$04) Adds the projectile x-speed
B698 LD (IX+$00),A Set the new x-position
B69B LD ($A0AF),A Save the x-position at A0AF
B69E CP $F8 Projectile left room from the right?
B6A0 JP NC,$B700 Jump if so
B6A3 CP $09 Projectile left room from the left?
B6A5 JP C,$B700 Jump if so
B6A8 LD A,(IX+$01) Set A the proejctile y-position
B6AB ADC A,(IX+$05) Add the projectile y-speed
B6AE LD (IX+$01),A Save the new y-position
B6B1 LD ($A0B0),A Save the y-position at A0B0
B6B4 CP $C0 Projectile left room from the bottom?
B6B6 JP NC,$B700 Jump if so
B6B9 CP $18 Projectil left the room from the top?
B6BB JP C,$B700 Jump if so
B6BE LD A,$01 Computes address into the tile type buffer based on the computed position of the projectile
B6C0 CALL $A503
B6C3 LD A,(HL) Set A to the tile type impacted by the projectile
B6C4 CP $04 Is a destructible tile (needs 3 impacts to destroy)?
B6C6 JP Z,$B707 Jump forward to handle impact
B6C9 CP $05 Is a destructible tile (needs 2 impascts to destry)?
B6CB JP Z,$B707 Jump forward to handle impact
B6CE CP $06 Is a destructible tile (needs 1 impact to destroy)?
B6D0 JP Z,$B707 Jump forward to handle impact
B6D3 CALL $D08B Check if A is a 'background' type tile
B6D6 JP NZ,$B794 Jump if is not a background tile
the projectile continue flying
B6D9 LD A,(IX+$0B) the projectile is a missile?
B6DC AND $7F
B6DE CP $07
B6E0 JP Z,$B6F6 Jump and check the next projectile if so
B6E3 LD L,(IX+$02) Computes into HL the addres pointer into room graphics buffer for the new position of projectile
B6E6 LD H,(IX+$03)
B6E9 LD E,(IX+$07)
B6EC LD D,(IX+$08)
B6EF ADD HL,DE
B6F0 LD (IX+$02),L Set into projectile configuration buffer the new address
B6F3 LD (IX+$03),H
this projectile has been handled, go the next one
B6F6 LD DE,$000F Set DE to the length of projectile configuration buffer
B6F9 ADD IX,DE Adds to the previous base address into IX
B6FB DEC B Decrement B
B6FC JP NZ,$B654 Jump back if there are projectiles to handle
B6FF RET
the projectile has been destroyed
B700 LD (IX+$06),$00 Set the projectile status to destroyed
B704 JP $B6F6 Jump back and check for the next one
handle destructible tiles
B707 BIT 7,(IX+$0B) Check if projectile goes through objects
B70B JP NZ,$B6D9 Jump back if so and the projectile continue flying
B70E LD ($A093),A Set A093 to the destructible tile type
B711 INC A Increasee the tile type number (one more impact receive)
B712 LD (HL),A And set the new tile type into tile type buffer
B713 LD DE,$E19F Computes into HL the offset of the tile to the tile type buffer base address
B716 AND A
B717 SBC HL,DE
B719 PUSH HL Save HL
B71A LD DE,$DE9F Set A to the tile number into tile counter buffer based on the offset previously compted
B71D ADD HL,DE
B71E LD A,(HL)
B71F DEC A Decrement A, as tile count begins by 1.
B720 LD L,A Computes into HL the address of the tile into the mapping table of tile graphics and room graphic buffer. (every tile mapping spans two words)
B721 LD H,$00
B723 ADD HL,HL
B724 ADD HL,HL
B725 LD DE,$D962
B728 ADD HL,DE
B729 LD ($A095),HL Set into A095 this address
B72C INC HL Set DE the address for the tile graphic data
B72D INC HL
B72E LD E,(HL)
B72F INC HL
B730 LD D,(HL)
B731 PUSH HL Save HL
B732 LD HL,$0008 Increment tile graphic data address to point to the next tile
B735 ADD HL,DE
B736 EX DE,HL
B737 POP HL Restore HL
B738 DEC HL Puts the new addres into the mapping table of tile graphics and room graphics data
B739 LD (HL),E
B73A INC HL
B73B LD (HL),D
B73C EX DE,HL Exchange DE and HL
B73D LD DE,$63E0 Computes into HL the tile number based on the tile graphic data offset of the tile
B740 AND A
B741 SBC HL,DE
B743 SRL H
B745 RR L
B747 SRL H
B749 RR L
B74B SRL H
B74D RR L
B74F LD DE,$6BE0 Set into A the color attribute for the tile
B752 ADD HL,DE
B753 LD A,(HL)
B754 LD ($A097),A Set A097 to the color attribute
B757 LD A,($A093) Set A to destructible tile type
B75A CP $06 is tile type $06?
B75C JP NZ,$B764 Jump forward if not
B75F LD A,$47 Set color attribute to $47 (background color attribute)
B761 LD ($A097),A
B764 POP HL Restore HL
B765 PUSH HL Save HL
B766 LD DE,$5800 Set DE to attribute file base address
B769 ADD HL,DE Adds offset of the tile
B76A LD A,($A097) Set color attribute for the tile in attribute file
B76D LD (HL),A
B76E POP HL Save and restore HL
B76F PUSH HL
B770 LD DE,$E4FF Set color attribute for the tile in attribute buffer
B773 ADD HL,DE
B774 LD A,($A097)
B777 LD (HL),A
B778 POP HL Restore HL
B779 LD A,($A093) If tile type is destructible type $04 or $05 jump forward
B77C CP $04
B77E JP Z,$B794
B781 CP $05
B783 JP Z,$B794
B786 LD DE,$E19F Set tile type to $00 (background) at tile type buffer
B789 ADD HL,DE
B78A LD (HL),$00
B78C LD DE,($A095) Reset room graphic address into mapping table
B790 XOR A
B791 LD (DE),A
B792 INC DE
B793 LD (DE),A
the projectile has just impacted 1
B794 LD L,(IX+$02) Draw impact 1 projectile
B797 LD H,(IX+$03)
B79A LD (HL),$10
B79C LD (IX+$06),$00 Set state of projectile to destroyed
B7A0 LD A,($A013) Check if weapon used is $02
B7A3 CP $02
B7A5 JP Z,$B6F6 Jump to handle the next projectile
B7A8 LD (IX+$06),$02 Set impact 1 state for projectile
B7AC LD A,($D842) Sound channel 3 is in use?
B7AF CP $FF
B7B1 JP NZ,$B6F6 Jump to the next projectile if in use
B7B4 LD DE,$D787 Set DE to impact sound data
B7B7 CALL $D5E7 Configure sound channel and mixer register
B7BA JP $B6F6 Jump back to handle next projectile
the projectile has just impacted 2
B7BD LD L,(IX+$02) Draw impact 2 projectile
B7C0 LD H,(IX+$03)
B7C3 LD DE,$0020
B7C6 AND A
B7C7 SBC HL,DE
B7C9 LD (HL),$10
B7CB ADD HL,DE
B7CC LD (HL),$38
B7CE ADD HL,DE
B7CF LD (HL),$10
B7D1 LD (IX+$06),$03 Set projectile status to impact 2
B7D5 JP $B6F6 Jump back to handle next projectile
the projectile is exploding
B7D8 LD L,(IX+$02) Draw projectile exploding
B7DB LD H,(IX+$03)
B7DE LD DE,$0040
B7E1 AND A
B7E2 SBC HL,DE
B7E4 LD DE,$0020
B7E7 LD (HL),$10
B7E9 ADD HL,DE
B7EA LD (HL),$00
B7EC ADD HL,DE
B7ED LD (HL),$44
B7EF ADD HL,DE
B7F0 LD (HL),$00
B7F2 ADD HL,DE
B7F3 LD (HL),$10
B7F5 LD (IX+$06),$00 Set projectile status to destroyed
B7F9 JP $B6F6 Jump back to handle next projectile
Draw missile projectile
B7FC LD L,(IX+$01) Computes address into room graphic buffer based on x and y position of projectile
B7FF LD H,$00
B801 ADD HL,HL
B802 ADD HL,HL
B803 ADD HL,HL
B804 ADD HL,HL
B805 ADD HL,HL
B806 LD E,(IX+$00)
B809 SRL E
B80B SRL E
B80D SRL E
B80F LD D,$00
B811 ADD HL,DE
B812 LD DE,$E7FF
B815 ADD HL,DE
B816 LD (IX+$02),L Puts this address into the projectile configuration buffer
B819 LD (IX+$03),H
B81C PUSH HL Save HL
B81D LD A,(IX+$0C) Set A to the missile trajectory index
B820 LD E,A Computes the address into the missile trajectory position offset based on the missile trajectory index
B821 LD D,$00
B823 LD HL,$A9AF
B826 ADD HL,DE
B827 LD A,(HL) Set A to the offset y-position of the missile
B828 CP $1E is an end marker?
B82A JP NZ,$B838 Jump if not
B82D DEC (IX+$0C) Point the missile trajectory index to the last offset value
B830 DEC (IX+$0C)
B833 LD HL,$A9C9 Point HL to the last address into the missile trajectory position offset table
B836 LD A,$08 Set A to the y-offset of $08
B838 LD (IX+$05),A Set the y-offset into the projectile configuration buffer
B83B INC HL Increment the address into the missile trajectory position offset
B83C LD E,(HL) Set DE to the offset for the missile graphic data
B83D LD D,$00
B83F LD HL,$8F4A Set HL to the address for the missile graphic data heading right
B842 BIT 7,(IX+$04) Is x-offset is negative then set HL to the address for the missile graphic data heading left
B846 JP Z,$B84C
B849 LD HL,$8A42
B84C ADD HL,DE Adds the offset of the missile graphics data and exchange registers
B84D EX DE,HL
B84E POP HL Restore HL
B84F PUSH BC Save BC
B850 LD B,$04 Copy into room graphics data the graphic data of the missile
B852 LD A,(DE)
B853 LD (HL),A
B854 INC DE
B855 PUSH DE
B856 LD DE,$0020
B859 ADD HL,DE
B85A POP DE
B85B DJNZ $B852
B85D POP BC Restore BC
B85E INC (IX+$0C) Increment the missile trajectory index to the next pair of offsets
B861 INC (IX+$0C)
B864 JP $B692 Jump back and handle next projectile
draw spray bullet
B867 LD DE,$0040 Init offset to draw
B86A AND A
B86B SBC HL,DE
B86D LD DE,$0020
B870 BIT 7,(IX+$0B) Check subtype of spray bullet
B874 JP NZ,$B885 Jump if subtype is 1
draw spray bullet 0
B877 LD (HL),$10 Draw spray bullet 0
B879 ADD HL,DE
B87A LD (HL),$1C
B87C ADD HL,DE
B87D LD (HL),$38
B87F ADD HL,DE
B880 LD (HL),$08
B882 JP $B692 Jump back
draw spray bullet 1
B885 LD (HL),$00 Draw spray bullet 1
B887 ADD HL,DE
B888 LD (HL),$10
B88A ADD HL,DE
B88B LD (HL),$28
B88D ADD HL,DE
B88E LD (HL),$10
B890 JP $B692 Jump back
draw basic laser-type projectile
B893 BIT 7,(IX+$0B) Check laser-type projectile
B897 JP NZ,$B8AB Jump to draw basic laser-type 1
draw basic laser-type 0
B89A LD A,(IX+$04) Set A direction of projectile
B89D DEC A
B89E JP M,$B8A6 Jump if lase direction is left
B8A1 LD (HL),$B7 Draw laser sprite
B8A3 JP $B692 Jump back
B8A6 LD (HL),$ED Draw laser sprite
B8A8 JP $B692 Jump back
draw basic laser-type 1
B8AB LD A,(IX+$04) Set A direction of projectile
B8AE DEC A
B8AF JP M,$B8B7 Jump if laser direction is left
B8B2 LD (HL),$97 Draw laser sprite
B8B4 JP $B692 Jump back
B8B7 LD (HL),$E9 Draw laser sprite
B8B9 JP $B692 Jump back
draw laser
B8BC LD A,(IX+$0E) Decrement laser duration counter
B8BF DEC A
B8C0 LD (IX+$0E),A
B8C3 OR A is 0 ?
B8C4 JP NZ,$B8CE Jump if not
B8C7 LD (IX+$06),$00 Destroy laser
B8CB JP $B692 Jump back for next projectile
B8CE LD A,(IX+$0C) Set A to number of laser type $06 extensions
B8D1 DEC A if no need to create more laser type $06 jump back and handle next projectile
B8D2 OR A
B8D3 JP Z,$B692
B8D6 LD (IX+$0C),A Decrement the laser type $06 counter on projectile configuration buffer
B8D9 LD A,(IX+$0D) Set A093 to laser type $06 x-position + 1
B8DC INC A
B8DD LD ($A093),A
B8E0 LD A,(IX+$01) Set A095 to laser y-position
B8E3 LD ($A095),A
B8E6 LD A,$01 Set laser direction to left at A097
B8E8 LD ($A097),A
B8EB BIT 7,(IX+$04) laser x-delta is negative (moving left)?
B8EF JP NZ,$B8FE Jump if so
B8F2 XOR A Set laser diretion to right at A097
B8F3 LD ($A097),A
B8F6 LD A,($A093) Substract two byte to x-position of laser
B8F9 SUB $10
B8FB LD ($A093),A
B8FE XOR A Set 0 for y-position increment at A099
B8FF LD ($A099),A
B902 PUSH IX Save IX and BC
B904 PUSH BC
B905 CALL $B506 Configure weapon sound and check for weapon free slot
B908 XOR A Set A = 0 (used as laser type in nex routine)
B909 CALL $B5C1 Create a new laser type $06
B90C LD A,($A068) Set laser duration/graphic index from A068
B90F LD (IY+$0E),A
B912 LD (IY+$05),$00 Set y-delta to 0
B916 LD (IY+$0B),$06 Set laser type to $06
B91A POP BC Restore BC and IX
B91B POP IX
B91D JP $B692 Jump back and configure next projectile
B920 EX DE,HL Exchange DE and HL
B921 PUSH DE Save DE
B922 LD A,(IX+$0E) Point HL to the graphic of laser at B943 base on laser graphic index
B925 LD E,A
B926 LD D,$00
B928 LD HL,$B943
B92B ADD HL,DE
B92C LD A,R Set A to semi-random number (R: memory refresh register)
B92E AND (HL) Apply AND operator to laser graphics
B92F POP DE Puts this random graphics to room graphics buffer
B930 LD (DE),A
B931 LD A,(IX+$0E) Decrement laser graphic index
B934 DEC A
B935 LD (IX+$0E),A
B938 OR A if graphic index=0 then set projectile status to destroyed. Then jump back and configure next projectile
B939 JP NZ,$B692
B93C LD (IX+$06),$00
B940 JP $B692
Prev: B57E Up: Map Next: B943