Prev: 8EE7 Up: Map Next: 9052
8F5F: Draws anything that's not the road or the hero car
Used by the routines at main_loop, cpu_driver and escape_scene.
draw_everything_else 8F5F LD HL,$ED28 Point HL at (something above the stack)
8F62 LD ($A9E3),HL Self modify 'LD HL' @ A9E2 to load the stack? address
8F65 LD HL,$E900 Self modify 'LD HL' @ draw_hazards_14 to load $E900
8F68 LD ($AED0),HL
Add 32 to the first 21 entries of tables $E301 and $E336. If meddled with this affects the height of elements.
8F6B LD HL,$E301 HL = $E301
8F6E LD DE,$E336 DE = $E336
8F71 LD BC,$1520 B = 21 iterations, C = 32 (added to table entries)
dee_loop 8F74 LD A,(HL) *HL += 32
8F75 ADD A,C
8F76 LD (HL),A
8F77 LD A,(DE) *DE += 32
8F78 ADD A,C
8F79 LD (DE),A
Do these wrap around?
8F7A INC E DE++
8F7B INC L HL++
8F7C DJNZ dee_loop Loop while B > 0
Draw tunnel, if configured.
8F7E LD IY,$E315 IY = $E315
8F82 NOP Self modified: either CALL draw_tunnel, or NOPs
8F83 NOP
8F84 NOP
8F85 DEC IY IY--
8F87 LD A,($A240) Load road_buffer_offset into A
8F8A ADD A,$73 Add 115 so it's the right side objects data offset + 19
8F8C LD L,A Point HL at road buffer right side objects data
8F8D LD H,$EE
8F8F LD IX,$EAB0 IX = $EAB0
8F93 LD BC,$1420 Counter B = 20, Stride C = 32
dee_inner_loop 8F96 PUSH IX Preserve IX, HL, BC
8F98 PUSH HL
8F99 PUSH BC
8F9A LD A,($A222) Call (somewhere in draw_hazards) if n_hazards is set
8F9D AND A
8F9E CALL NZ,draw_hazards_14
8FA1 CALL dust_stones_stuff Call dust_stones_stuff
8FA4 NOP Self modified: either CALL draw_helicopter, or NOPs
8FA5 NOP
8FA6 NOP
8FA7 NOP Self modified: either CALL draw_tunnel, or NOPs
8FA8 NOP
8FA9 NOP
8FAA POP BC Restore IX, HL, BC
8FAB POP HL
8FAC POP IX
8FAE LD A,(HL) Fetch from right side objs data
8FAF AND A Jump to right hand stuff if non-zero [why not a CALL?]
8FB0 JR NZ,dee_right_hand_stuff
...
dee_continue_after_right_hand_done 8FB2 INC IX Advance IX by 2
8FB4 INC IX
8FB6 LD A,L Advance HL by 32
8FB7 ADD A,C
8FB8 LD L,A
8FB9 LD A,(HL) A = *HL -- reading $EE0C down to $EEF9 (wrapping!)
8FBA AND A Set flags
8FBB JR NZ,dee_left_hand_stuff Jump to dee_left_hand_stuff if non-zero -- left hand stuff, it will jump back here so I'm not sure why it's not a CALL
dee_continue_after_left_hand_done 8FBD INC IX Advance IX by 2
8FBF INC IX
8FC1 LD A,L Advance HL by -33
8FC2 SUB $21
8FC4 LD L,A
8FC5 DEC IY IY--
8FC7 DJNZ dee_inner_loop Loop to dee_inner_loop while B > 0 -- inner loop
..
8FC9 LD A,($8FA4) Load self modified instructions from earlier
8FCC AND A Return if drawing the helicopter
8FCD RET NZ
8FCE LD A,($A227) Return if floating_arrow is zero => no arrow
8FD1 AND A
8FD2 RET Z
Draw the floating arrow.
dee_draw_floating_arrow 8FD3 LD HL,$E1DF Point HL at floating_arrow_defns[0]
8FD6 LD E,$78 Set horizontal position to 120
8FD8 DEC A Jump if floating_arrow is 1 => left facing arrow
8FD9 JR Z,dee_floating_arrow_chosen
8FDB LD HL,$E1E4 Point HL at floating_arrow_defns[1]
8FDE LD E,$80 Set horizontal position to 128
dee_floating_arrow_chosen 8FE0 LD D,$30 D = $30
8FE2 LD C,(HL) Load width bytes
8FE3 INC HL Advance to flags
8FE4 LD B,(HL) Load flags
8FE5 SRL B flags >>= 1
8FE7 PUSH BC BC' = BC
8FE8 EXX
8FE9 POP BC
8FEA LD E,C E' = C'
8FEB LD C,$00 C' = 0
8FED EXX Unbank
8FEE INC HL Advance to height
8FEF LD B,(HL) Load height into B
8FF0 INC HL
8FF1 LD A,(HL) Load bitmap address into HL
8FF2 INC HL
8FF3 LD H,(HL)
8FF4 LD L,A
8FF5 JP draw_part_entry2 Exit via draw_part_entry2 (plotting)
Right hand object handling.
dee_right_hand_stuff 8FF8 LD E,A E = A
8FF9 LD A,(IX+$01) A = IX[1] -- what are we checking here?
8FFC AND A Set flags
8FFD JR NZ,dee_continue_after_right_hand_done Loop or exit?
8FFF PUSH IX Preserve IX, HL, BC
9001 PUSH HL
9002 PUSH BC
9003 LD A,E DE = E * 7
9004 ADD A,A
9005 ADD A,A
9006 ADD A,A
9007 SUB E
9008 LD E,A
9009 LD D,$00
900B LD HL,$901C Set return address to dee_right__return_901C (below)
900E PUSH HL
900F LD HL,($5CF8) Load addrof_right_hand_handlers
9012 ADD HL,DE Index right_hand_handlers
9013 LD E,(HL) Read argument for routine into DE & advance
9014 INC HL
9015 LD D,(HL)
9016 INC HL
9017 LD A,(HL) Read address of routine into HL
9018 INC HL
9019 LD H,(HL)
901A LD L,A
901B JP (HL) Indirect jump
dee_right__return_901C 901C POP BC Restore IX, HL, BC
901D POP HL
901E POP IX
9020 JP dee_continue_after_right_hand_done Continue
Left hand object handling.
dee_left_hand_stuff 9023 LD E,A E = A -- sampled = 5 (only)
9024 CP $02 Jump if A == 2 -- this test not present for RHS
9026 JR Z,dee_left__a_is_2
A != 2
dee_left__a_isnt_2 9028 LD A,(IX+$01) A = IX[1] -- what are we checking here?
902B AND A Set flags
902C JR NZ,dee_continue_after_left_hand_done Loop or exit?
dee_left__a_is_2 902E PUSH IX Preserve IX, HL, BC
9030 PUSH HL
9031 PUSH BC
9032 LD A,E DE = E * 7
9033 ADD A,A
9034 ADD A,A
9035 ADD A,A
9036 SUB E
9037 LD E,A
9038 LD D,$00
903A LD HL,$904B Set return address to dee_left__return (below)
903D PUSH HL
903E LD HL,($5CFE) Load addrof_left_hand_handlers
9041 ADD HL,DE Index left_hand_handlers
9042 LD E,(HL) Read argument for routine into DE & advance
9043 INC HL
9044 LD D,(HL)
9045 INC HL
9046 LD A,(HL) Read address of routine into HL
9047 INC HL
9048 LD H,(HL)
9049 LD L,A
B is used in the routines, what is it here? It must be passed in.
904A JP (HL) Indirect jump -- Call draw_stretchy_object_left draw_stretchy_object_right draw_tunnel_light_left draw_tunnel_light_right draw_object_right etc.
dee_left__return 904B POP BC Restore IX, HL, BC
904C POP HL
904D POP IX
904F JP dee_continue_after_left_hand_done Continue
Prev: 8EE7 Up: Map Next: 9052