Prev: 6966 Up: Map Next: 6a2d
6971: Generate new game actor: alien, fuel, or collectible item.
Depending on the self-modifying code state, this routine either generates a new item/alien, or updates the item drop game timer.
Input
IX Item object.
6971 ld hl,$5dce Increment random number
6974 inc (hl)
6975 ld de,$0008 Set offset
6978 add ix,de Set IX to next group of bytes
697a push ix Copy IX to HL
697c pop hl
The self-modifying code routines change the address here to be either the inactive player (5d88) or the rocket object (5d30).
697d ld bc,$5d88 BC=inactive player or rocket object
6980 and a Clear the Carry flag
6981 sbc hl,bc If object pointed to by IX is before BC object, then jump back to the main loop
6983 jp c,$631c
Read the keyboard to introduce a slight pause?
6986 ld a,$fe Row: Shift,Z,X,C,V
6988 out ($fd),a Set port for reading keyboard
698a in a,($fe) ...and read that row of keys
698c bit 0,a Check if SHIFT key pressed
698e jr z,$6986 Jump if pressed
Now increment timer and get new random number.
6990 ld hl,($5dcc) Increment the game timer
6993 inc hl
6994 ld ($5dcc),hl
6997 ld h,$00 Make sure HL remains <= $00FF
6999 ld a,r Get a RANDOM number?
699b ld c,a
The self-modifying code routine changes this to `JP 6966`. That routine resets the interrupts, before changing instruction here to `LD A,(0244)` - an address in the ROM which always returns $C1.
699c ld a,($5dce) A=$C1, from 0244, because 5DCE is never used!
699f add a,(hl) A=byte from address $0000 - $00FF
69a0 add a,c Add R to the number
69a1 ld ($5dce),a Update random number
69a4 ex af,af' Jump if current alien number < 3
69a5 ld a,($5dcb)
69a8 cp $03
69aa jr c,$69b8
69ac ex af,af'
69ad and $1f
69af jr nz,$69d9 Drop fuel/collectible if RND is < 32
69b1 ld a,($5dcb) Drop fuel/collectible if current alien number >= 6
69b4 cp $06
69b6 jr nc,$69d9
69b8 ld a,($5dd7) Drop fuel/collectible if begin play delay counter > zero
69bb and a
69bc jr nz,$69d9
69be ld a,($5d00) Get jetman direction
69c1 and $3f
69c3 dec a
69c4 jr z,$69c9 If direction is zero, then find unused alien slot
69c6 dec a
69c7 jr nz,$69d9 Drop fuel/collectible if direction is still > zero
Find first unused alien slot.
69c9 ld hl,$5d50 Alien state objects
69cc ld b,$06 Loop counter (6 aliens)
69ce ld de,$0008
69d1 ld a,(hl) Generate new alien if the slot is unused
69d2 and a
69d3 jp z,$69e2
69d6 add hl,de else increment to the next alien object
69d7 djnz $69d1 ...and try again
Drop either a fuel pod or collectible item.
69d9 call $65f9 New fuel pod item
69dc call $65a8 New collectible item
69df jp $6310 Run main loop after resetting SP and EI
Generate new alien in the given state slot (HL).
69e2 push hl Push current alien to stack (will be copied to IX)
69e3 ex de,hl
69e4 ld hl,$6d94 Copy default alien state to current alien slot
69e7 ld bc,$0008
69ea ldir
69ec pop ix Restore IX to point to current item object
69ee ld a,($5dcc) Game timer
69f1 ld e,a Backup to E
69f2 and $40 A=either 0 or 64
69f4 ld (ix+$04),a Set item "direction"
69f7 ld (ix+$00),a Set item "movement"
69fa ld a,e Restore A to original game timer value
69fb and $7f
69fd add a,$28
69ff ld (ix+$02),a Update item Y position
6a02 push ix Copy current item object address to BC
6a04 pop bc
Calculate and update new colour attribute.
6a05 ld a,c Example: if BC = 5D78, C = $78 = 01111000
6a06 rra 00111100
6a07 rra 00011110
6a08 rra 00001111
6a09 and $03 00000011 <- result of AND $03
6a0b inc a 00000100
6a0c inc a 00000101 = $05
6a0d ld (ix+$03),a Update colour with value: $02, $03, $04, or $05
6a10 and $01
6a12 ld (ix+$06),a Update jump table offset to either 0 or 1
6a15 ld hl,$6a2d HL=item level object types
6a18 ld a,($5df0) Using the current player level, pull a value from the item level params table
6a1b and $07
6a1d ld e,a
6a1e ld d,$00
6a20 add hl,de
6a21 ld a,(ix+$00)
6a24 and $c0
6a26 or (hl)
6a27 ld (ix+$00),a Update item type to this value
6a2a jp $69d9 Drop fuel/collectible then execute the main loop
Prev: 6966 Up: Map Next: 6a2d