Prev: A9DE Up: Map Next: AAC6
AA38: Draw the helicopter
AB89 (in drive_helicopter) self modifies 8FA4 to call this.
Input
B Counter
IY Somewhere in the $E315 buffer
draw_helicopter AA38 LD A,B Return if counter isn't 3
AA39 CP $03
AA3B RET NZ
AA3C LD A,(IY+$4F) A = IY[$4F] - IY[$4E] -- a delta between two bytes in this unknown $E315 buffer
AA3F SUB (IY+$4E)
AA42 LD D,$00 D = 0
AA44 LD H,D HL = 0
AA45 LD L,D
AA46 LD E,A E = A => DE = A -- DE is now the delta from above, widened
AA47 LD A,($A23F) Load fast_counter
AA4A LD B,$08 B = 8
AA4C AND $E0 fast_counter & $E0
Multiplier
dhl_loop1 AA4E RLA Shift top bit out
AA4F JR NC,dhl_aa52 If it was set then HL += DE
AA51 ADD HL,DE
dhl_aa52 AA52 ADD HL,HL HL <<= 1
AA53 DJNZ dhl_loop1 Loop dhl_loop1 while B > 0
AA55 LD A,H A = H / 2 -- is this undoing overshoot?
AA56 RRA
AA57 LD ($AA8D),A Self modify 'LD A' @ AA8C (below)
AA5A LD A,$00 A = <self modified> -- Self modified by AAEE (in move_helicopter)
AA5C SUB (IY+$4E) A -= IY[$4E]
AA5F LD ($AA77),A Self modify 'ADD A' @ AA76 (below)
AA62 LD B,$05 5 iterations
AA64 LD A,($A234) A = counter_A & 1 -- counter used for turbo smoke and helicopter blades
AA67 AND $01
AA69 LD HL,($5D08) Load addrof_helicopter_stuff_1
AA6C JR Z,dhl_aa71 If A was set
AA6E LD HL,($5D0A) Kiad addrof_helicopter_stuff_2
dhl_aa71 AA71 LD E,(HL) DE = wordat(HL); HL += 2
AA72 INC HL
AA73 LD D,(HL)
AA74 INC HL
AA75 LD A,(DE) A = *DE
AA76 ADD A,$00 A += <self modified> -- Self modified by AA5F (above)
AA78 INC DE DE++
AA79 PUSH IY Preserve IY, HL, BC
AA7B PUSH HL
AA7C PUSH BC
AA7D CALL dhl_aa94 Call dhl_aa94
AA80 POP BC Restore IY, HL, BC
AA81 POP HL
AA82 POP IY
AA84 DJNZ dhl_aa71 Loop loop_aa71 while B > 0
AA86 LD E,(HL) DE = wordat(HL); HL++
AA87 INC HL
AA88 LD D,(HL)
AA89 XOR A A = 0
AA8A PUSH IY Preserve IY
AA8C LD A,$00 A = <self modified> -- Self modified by AA57 (above)
AA8E CALL dhl_aa94 Call dhl_aa94
AA91 POP IY Restore IY
AA93 RET Return
dhl_aa94 AA94 LD BC,$0000 BC = <self modified> -- Self modified by AB00, move_helicopter_4 + others
AA97 NEG A = -A
AA99 LD ($933E),A Self modify 'LD D,x' @ draw_object_right_7 to load A
AA9C LD A,(DE) HL = *DE++
AA9D INC DE
AA9E LD L,A
AA9F LD H,$00
AAA1 AND A Set flags
AAA2 JP P,dhl_aaa6
AAA5 DEC H H--
dhl_aaa6 AAA6 ADD HL,BC HL += BC
AAA7 EX DE,HL
AAA8 LD B,(HL) B = *HL
AAA9 RLC B B <<= 3
AAAB RLC B
AAAD RLC B
AAAF LD A,D A = D
AAB0 AND A Set flags
AAB1 LD A,E A = E
AAB2 LD C,$00 C = 0
AAB4 JP M,dhl_aac1
AAB7 RET NZ Return if non-zero
AAB8 CP $80 Jump to draw_object_right_helicopter_entrypt if A >= 128
AABA JP NC,draw_object_right_helicopter_entrypt
AABD ADD A,B A += B
AABE JP draw_object_left_helicopter_entrypt Exit via draw_object_left_helicopter_entrypt
dhl_aac1 AAC1 ADD A,B A += B
AAC2 RET NC Return if no carry
AAC3 JP draw_object_left_helicopter_entrypt Exit via draw_object_left_helicopter_entrypt
Prev: A9DE Up: Map Next: AAC6