Prev: 6fb6 Up: Map Next: 706d
6fc5: Animate a laser beam.
Note the copious amounts of register swapping! These annotations need checking.
Input
IX Laser beam object
6fc5 ld d,(ix+$01) Laser Y position
6fc8 ld a,(ix+$02) Laser X position: pulse #1
6fcb bit 2,a Jump if bit-2 is reset
6fcd jr z,$7007
6fcf ld l,a L=X position: pules #1
6fd0 ld a,$08
6fd2 bit 0,l Negate (A=$F8) if bit-0 of pulse #1 is reset
6fd4 jr z,$6fd8
6fd6 neg
6fd8 add a,l H=laser Y position, L=updated X position
6fd9 ld e,a
6fda ld h,d
6fdb push hl Preserve HL - pulse Y,X position
6fdc call $72d0 HL=coord to screen address (using HL)
6fdf ld a,(ix+$01) Laser Y position
6fe2 cp $80 Jump if Y position >= 128
6fe4 jr nc,$6fea
6fe6 ld a,(hl) A=byte at Y,X position of laser pulse #1
6fe7 and a
6fe8 jr nz,$702c Jump if byte is empty
Update the on screen colour for the pulse.
6fea ld (ix+$02),e Update X position: pulse #1
6fed ld (hl),$ff Add a "full length" pulse to Y,X position
6fef pop hl Restores the pulse Y,X positions
6ff0 call $71d6 HL=coord to attribute file address (using HL)
6ff3 ld a,(ix+$07) Set screen colour attribute to the laser pulse colour
6ff6 ld (hl),a
6ff7 ld a,(ix+$06) Subtract 8 from laser pulse "length"
6ffa sub $08
6ffc ld (ix+$06),a
6fff and $f8
7001 jr nz,$7007 Jump if pulse length has bit 3-7 set
Update the X position of all the laser beam pulses.
7003 res 2,(ix+$02) Reset bit-2 of X position: pulse #1
7007 exx
7008 ld bc,$031c
700b ld e,$e0 Loop counter (14)
700d exx
700e ld e,$03 Loop counter (to process pulses #2, #3, #4)
7010 push ix BC is now the laser beam object
7012 pop bc
7013 inc bc Laser beam Y position
7014 inc bc Laser beam X position: pulse #1
7015 inc bc Laser beam X position: pulse #2
A loop (to the end of routine) which draws the pixel byte to the screen.
7016 ld a,(bc) A=X position (loops on pulse #2, #3, #4)
7017 xor (ix+$02) XOR with X position: pulse #1
701a and $f8
701c jr nz,$702f Jump if A has any of these bits set
701e exx
701f ld a,b
7020 ld b,c
7021 ld c,e
7022 exx
7023 inc bc Repeat for next X position pulse
7024 dec e
7025 jr nz,$7016
7027 ld (ix+$00),$00 Set laser beam to "unused"
702b ret
No pixel to draw, loop back and process next pulse.
702c pop hl
702d jr $7003
Update the length of the laser beam pulse.
702f ld a,(bc) Laser beam X position
7030 bit 2,a Jump if bit-2 is set
7032 jr nz,$704f
7034 dec (ix+$06) Decrement pulse length
7037 ld a,(ix+$06)
703a and $07 Return if pulse has any pixels set?
703c ret nz
703d ld a,($5dce) Random number
7040 and $03 Calculate the length of the laser pulse
7042 or $04
7044 or (ix+$06)
7047 ld (ix+$06),a
704a ld a,(bc) Current X position += 4
704b or $04
704d ld (bc),a
704e ret
704f ld a,(bc)
7050 ld l,a L=current X position pulse
7051 ld a,$08
7053 bit 0,l Negate (A=$F8) if bit-0 of pulse is reset
7055 jr z,$7059
7057 neg
7059 add a,l
705a ld (bc),a Update current X position
705b ld h,d H=laser Y position, L=updated X position
705c call $72d0 HL=coord to screen address (using HL)
705f exx
7060 ld a,b
7061 ld b,c
7062 ld c,e
7063 exx
Create a new laser beam pixel and merge with current screen pixel.
7064 cpl Create the pixel byte. E.g. $FC=11111100
7065 and (hl) Merge with current screen pixel
7066 ld (hl),a Update display file
7067 inc bc Next X position byte
7068 dec e
7069 jp nz,$7016 Repeat if counter > 0
706c ret
Prev: 6fb6 Up: Map Next: 706d