jetpac | Routines |
Prev: 6a35 | Up: Map | Next: 6beb |
TODO: annotations are really messy/wrong here, needs lots more work to understand how the movement is calculated.
|
||||||||
6ab8 | ld hl,$5dcb | Increment current alien number | ||||||
6abb | inc (hl) | |||||||
6abc | call $6cb0 | Update actor direction | ||||||
6abf | call $6e1b | Fire laser beam (returns C) | ||||||
6ac2 | dec c | |||||||
6ac3 | jp z,$6beb | Add the points for a kill if alien is dead | ||||||
6ac6 | call $6de9 | Alien collision check (returns E) | ||||||
6ac9 | dec e | |||||||
6aca | jp z,$6456 | Alien killed by collision if E is zero | ||||||
6acd | xor a | |||||||
6ace | ld ($5dc9),a | Reset alien new direction flag | ||||||
Check which direction alien is travelling after hitting a platform.
|
||||||||
6ad1 | call $75e8 | Platform collision (returns E) | ||||||
6ad4 | bit 2,e | Update alien X position if bit-2 is reset | ||||||
6ad6 | jr z,$6af1 | |||||||
6ad8 | bit 7,e | Set alien direction to up if bit-7 set | ||||||
6ada | jp nz,$6bcd | |||||||
6add | bit 4,e | Set alien direction to down if bit-4 set | ||||||
6adf | jp nz,$6bd4 | |||||||
Move the flying saucer in a slightly more erratic way (the XOR), rather than just heading directly for the Jetman.
|
||||||||
6ae2 | ld a,e | Update alien "moving" value | ||||||
6ae3 | and $40 | |||||||
6ae5 | xor $40 | |||||||
6ae7 | ld e,a | |||||||
6ae8 | ld a,(ix+$04) | |||||||
6aeb | and $bf | |||||||
6aed | or e | |||||||
6aee | ld (ix+$04),a | |||||||
Calculate new horizontal position and speed.
|
||||||||
6af1 | ld a,(ix+$05) | Alien X speed | ||||||
6af4 | ld b,a | Calculate new speed? | ||||||
6af5 | and $0f | |||||||
6af7 | ld c,a | |||||||
6af8 | ld a,b | |||||||
6af9 | and $f0 | |||||||
6afb | ld b,a | |||||||
6afc | ld a,($5d01) | Jetman X position | ||||||
6aff | sub (ix+$01) | Subtract alien X position | ||||||
6b02 | jp p,$6b74 | If Jetman X > alien X, then jump | ||||||
6b05 | bit 6,(ix+$04) | If alien is moving left, then jump | ||||||
6b09 | jp z,$6b96 | |||||||
6b0c | ld a,c | If current speed is less than max, then increment | ||||||
6b0d | cp $0f | |||||||
6b0f | jr nc,$6b12 | |||||||
6b11 | inc a | |||||||
Calculate new X position.
|
||||||||
6b12 | ld c,a | C=current speed | ||||||
6b13 | ld h,(ix+$01) | H=X position | ||||||
6b16 | call $6bdb | Calculates and returns DE, new position offset | ||||||
6b19 | and a | Clear the carry flag | ||||||
6b1a | sbc hl,de | |||||||
Update the X position and speed
|
||||||||
6b1c | ld (ix+$01),h | Update X position | ||||||
6b1f | ld a,l | Calculate and update X speed | ||||||
6b20 | and $f0 | |||||||
6b22 | or c | |||||||
6b23 | ld (ix+$05),a | |||||||
Calculate new Y position and speed.
|
||||||||
6b26 | ld a,(ix+$06) | Alien Y speed | ||||||
6b29 | ld b,a | |||||||
6b2a | and $0f | |||||||
6b2c | ld c,a | |||||||
6b2d | ld a,b | |||||||
6b2e | and $f0 | |||||||
6b30 | ld b,a | |||||||
6b31 | ld a,($5d02) | Jetman Y position | ||||||
6b34 | sub (ix+$02) | Subtract alien Y position | ||||||
6b37 | jp p,$6ba2 | If Jetman Y > alien Y, then jump | ||||||
6b3a | bit 7,(ix+$04) | If alien is moving up then increment Y position (if not at top of screen) and jump to 6b49 | ||||||
6b3e | jp z,$6bc3 | |||||||
6b41 | ld a,c | Calculate new down Y position if C > 0 (presumably above the ground) | ||||||
6b42 | dec a | |||||||
6b43 | jr nz,$6bae | |||||||
6b45 | res 7,(ix+$04) | else moving direction must be set to up... | ||||||
6b49 | ld c,a | ..and C will have been decremented here | ||||||
6b4a | ld h,(ix+$02) | H=Y position | ||||||
6b4d | call $6bdb | Calculates and returns DE, new position offset | ||||||
6b50 | and a | Clear the carry flag | ||||||
6b51 | sbc hl,de | |||||||
6b53 | ld a,h | Set moving direction as down if at top of screen | ||||||
6b54 | cp $28 | |||||||
6b56 | jr nc,$6b5c | |||||||
6b58 | set 7,(ix+$04) | |||||||
6b5c | ld (ix+$02),a | Update Y position | ||||||
6b5f | ld a,l | Update Y speed | ||||||
6b60 | and $f0 | |||||||
6b62 | or c | |||||||
6b63 | ld (ix+$06),a | |||||||
Draw the alien if a new direction is set, otherwise repeat platform collision check again.
|
||||||||
6b66 | ld a,($5dc9) | Draw the alien if the new direction flag is set, | ||||||
6b69 | and a | otherwise, increment it | ||||||
6b6a | jp nz,$6d43 | |||||||
6b6d | inc a | |||||||
6b6e | ld ($5dc9),a | } | ||||||
6b71 | jp $6ad1 | Jump back and repeat collision check | ||||||
Check moving direction and update.
|
||||||||
6b74 | bit 6,(ix+$04) | Check moving left/right bit | ||||||
6b78 | jr z,$6b8e | If moving left, increment speed (via jump) | ||||||
6b7a | ld a,c | |||||||
6b7b | dec a | |||||||
6b7c | jp nz,$6b12 | If not zero, calculate X direction/speed | ||||||
6b7f | res 6,(ix+$04) | else set X moving to "right" | ||||||
6b83 | ld c,a | A (speed) was decremented from 0, so will now be FF | ||||||
6b84 | ld h,(ix+$01) | H=X position | ||||||
6b87 | call $6bdb | Calculates and returns DE, new position offset | ||||||
6b8a | add hl,de | |||||||
6b8b | jp $6b1c | Update the X position and speed | ||||||
6b8e | ld a,c | If current speed is less than max, then increment | ||||||
6b8f | cp $0f | |||||||
6b91 | jr nc,$6b83 | |||||||
6b93 | inc a | |||||||
6b94 | jr $6b83 | Update position | ||||||
6b96 | ld a,c | A=speed | ||||||
6b97 | dec a | |||||||
6b98 | jp nz,$6b83 | Update X position and speed unless zero | ||||||
6b9b | set 6,(ix+$04) | Set moving direction to "right" | ||||||
6b9f | jp $6b12 | Update X direction/speed | ||||||
6ba2 | bit 7,(ix+$04) | Check Jetman moving direction | ||||||
6ba6 | jr z,$6bb9 | Jump if top bit not set | ||||||
6ba8 | ld a,c | Jump if C >= 15 | ||||||
6ba9 | cp $0f | |||||||
6bab | jr nc,$6bae | |||||||
6bad | inc a | else increment it | ||||||
6bae | ld c,a | (will be C = C - 1) | ||||||
6baf | ld h,(ix+$02) | |||||||
6bb2 | call $6bdb | Calculates and returns DE, new position offset | ||||||
6bb5 | add hl,de | |||||||
6bb6 | jp $6b53 | Update Y position and speed | ||||||
6bb9 | ld a,c | A=speed | ||||||
6bba | dec a | |||||||
6bbb | jr nz,$6b49 | If speed > 0 move upwards | ||||||
6bbd | set 7,(ix+$04) | else set moving direction to "down" | ||||||
6bc1 | jr $6bae | ...and update Y position and speed | ||||||
6bc3 | ld a,c | If current speed is less than max, then increment it, and update position | ||||||
6bc4 | cp $0f | |||||||
6bc6 | jp nc,$6b49 | |||||||
6bc9 | inc a | |||||||
6bca | jp $6b49 | |||||||
Change alien moving direction to up.
|
||||||||
6bcd | res 7,(ix+$04) | |||||||
6bd1 | jp $6af1 | |||||||
Change alien moving direction to down.
|
||||||||
6bd4 | set 7,(ix+$04) | |||||||
6bd8 | jp $6af1 | |||||||
Returns DE (new position) as calculated from the speed (C).
|
||||||||
6bdb | ld l,b | |||||||
6bdc | ld a,c | C should be <= 15. Example, if value is $0F: | ||||||
6bdd | rla | 0 00011110 | ||||||
6bde | rla | 0 00111100 | ||||||
6bdf | rla | 0 01111000 | ||||||
6be0 | rla | 0 11110000 | ||||||
6be1 | and $f0 | Clear lower 4 bits...just in case! | ||||||
6be3 | ld e,a | |||||||
6be4 | ld d,$00 | |||||||
6be6 | sla e | 1 11100000 | ||||||
6be8 | rl d | If E >= 8, then bit-0 of D is set | ||||||
6bea | ret |
Prev: 6a35 | Up: Map | Next: 6beb |