Prev: B848 Up: Map Next: B9F4
B8D2: Horizon stuff / Car jumping stuff
Called from read_map
Input
Used by the routine at read_map.
update_road_level B8D2 LD A,($A25A) BC = var_a25a -- set by scroll_horizon
B8D5 LD B,A
B8D6 LD C,$00
B8D8 LD A,($A258) Load incline ($FD..$03 = climbing..descending)
B8DB OR A Set flags
B8DC JP P,url_incline_set Jump if road descending (positive incline)
Otherwise road climbing (negative incline).
B8DF NEG A = -A -- make positive ($FD..$FF => 3..1)
B8E1 INC C C++ -- C becomes 1
url_incline_set B8E2 SUB B Jump if (A-B) == 0 (B is copy of var_a25a, not used again)
B8E3 JR Z,url_read_road_height
url_incline_was_nonzero B8E5 RR C 9-bit rotate right through carry -- C can be 0 or 1?
B8E7 LD B,$00 BC = C
B8E9 JR NC,url_alter_horizon_level Jump if no carry
Otherwise negative?
B8EB NEG A = -A -- invert incline
B8ED DEC B B = $FF
url_alter_horizon_level B8EE LD HL,($A171) Point HL at horizon_level
B8F1 LD C,A C = A
B8F2 ADD HL,BC HL += BC
B8F3 LD ($A171),HL Store horizon_level
url_read_road_height B8F6 LD A,($A240) Load road_buffer_offset into A
B8F9 ADD A,$22 Add (32+2) so it's the height data
B8FB LD H,$EE Point HL at road buffer height data
B8FD LD L,A
B8FE XOR A Zero var_a25b and var_a25a
B8FF LD ($A25B),A
B902 LD ($A25A),A
B905 LD A,(HL) A = (height byte) >> 1
B906 SRA A
B908 JP P,url_positive Jump if positive (or zero?)
B90B INC A A++
url_positive B90C LD ($A258),A incline = A
B90F DEC L Step back 2 in the height data (frontmost height byte?)
B910 DEC L
B911 LD A,(HL) Read height byte
B912 LD C,A Copy to C
B913 OR A Set flags
B914 LD B,$00 B = 0
B916 JR Z,url_ge_3 Jump if height was zero
B918 LD B,$06 B = 6
B91A JP P,url_another_positive Jump if positive
Else negative.
B91D NEG A = -A
B91F LD B,$03 B = 3
url_another_positive B921 CP $03 Jump if A >= 3
B923 JR NC,url_ge_3
B925 LD B,$00 B = 0
url_ge_3 B927 LD A,B A = B
B928 LD ($B5B0),A Self modify 'ADD A,x' @ B5AF
B92B LD HL,$A259 Address of var_a259
B92E LD A,(HL) Read var_a259
B92F AND A Set flags
B930 JP P,url_potato Jump if positive
Else negative or zero.
B933 BIT 7,C Test bit 7
B935 JR NZ,url_potato Jump if non-zero
Else zero.
B937 NEG A = -A - 2
B939 SUB $02
B93B JR C,url_potato Jump if carry (-A < 2)
Else ?
B93D LD B,A B = A
B93E LD A,($B064) Load jump counter
B941 AND A Set flags
B942 JR NZ,url_potato Jump if non-zero
B944 LD DE,($A24A) DE = speed
B948 RR D 9-bit rotate right via carry
B94A LD A,E A = E
B94B RLA 9-bit rotate left via carry
B94C RLA
B94D AND $03 D = ~(A & 3) + 4
B94F CPL
B950 ADD A,$04
B952 LD D,A
B953 LD A,B A = B - D
B954 SUB D
B955 JR C,url_potato Jump if <=
B957 JR Z,url_potato
B959 PUSH HL Preserve HL
B95A RLCA HL = B057 + A*2 -- 1-indexed pointer into table_b059 [sampled A: 3,2,4]
B95B LD E,A
B95C LD D,$00
B95E LD HL,$B057
B961 ADD HL,DE
B962 LD E,(HL) E = *HL++ (loads one of 2/4/6/8/10)
B963 INC HL
B964 LD A,(HL) Load new jump value [sampled: $B060] (loads one of 8/6/4/2/0)
B965 LD ($B064),A Set jump counter
B968 LD HL,$B045 HL = hero_car_jump_table + E -- points into jump values table
B96B ADD HL,DE
B96C LD ($B07A),HL Self modify mhc_midair (mhc_midair)
B96F POP HL Restore HL (which is what?)
url_potato B970 LD (HL),C *HL = C
B971 LD A,($A25C) Load current_curvature into A
B974 EX AF,AF' Preserve it
B975 LD A,($A240) Load road_buffer_offset into A
B978 LD H,$EE Point HL at road buffer curvature data
B97A LD L,A
B97B LD A,($A265) Test fork_visible
B97E AND A
B97F LD A,(HL) Load a curvature byte
B980 JR Z,url_fork_not_visible Jump if fork_visible was zero
Forked road is visible.
url_fork_visible B982 LD A,($A269) Jump if fork_in_progress is zero [set while the road forks]
B985 AND A
B986 JR Z,url_fork_not_visible
B988 LD A,($A249) Check fork_taken
B98B AND A
B98C LD A,(HL) Load a curvature byte again
B98D JR Z,url_fork_not_visible Jump if left fork was taken
B98F NEG Negate if right fork was taken
url_fork_not_visible B991 LD ($A25C),A Store new curvature value to current_curvature
B994 AND A Set flags
B995 LD E,A E = A
B996 JR Z,url_b9c2 Jump if curvature byte was zero
B998 LD E,$01 E = 1
B99A JP P,url_b9a1 Jump if positive
Otherwise negative
B99D RL E
B99F NEG A = -A -- make positive
url_b9a1 B9A1 LD D,A D = A
B9A2 ADD A,A A *= 4
B9A3 ADD A,A
B9A4 LD ($A25D),A horizon_a25d = A
B9A7 LD B,A B = A
B9A8 LD A,($A25E) Jump if horizon_a25e is non-zero
B9AB AND A
B9AC JR NZ,url_b9c5
B9AE LD HL,($A24A) Load speed into HL
B9B1 LD A,L Speed low byte
B9B2 RR H Bottom bit of H moves to carry (H now unused)
B9B4 RLA A = (A << 3) & 6
B9B5 RLA
B9B6 RLA
B9B7 AND $06
B9B9 ADD A,B A += B
B9BA LD C,A BC = A
B9BB LD B,$00
B9BD LD HL,$B828 HL = horizon_table + BC
B9C0 ADD HL,BC
B9C1 LD A,(HL) A = *HL
url_b9c2 B9C2 LD ($A25E),A horizon_a25e = A
url_b9c5 B9C5 LD A,($A262) A = var_a262
B9C8 LD B,A BC = A
B9C9 LD C,$00
B9CB EX AF,AF'
B9CC AND A Set flags
B9CD JP P,url_b9d3 Jump if positive
Otherwise negative
B9D0 NEG A = -A -- make positive
B9D2 INC C C++
url_b9d3 B9D3 SUB B A -= B
B9D4 JR C,url_b9ec Jump if <=
B9D6 JR Z,url_b9ec
B9D8 LD B,A B = A
B9D9 ADD A,A A = A * 4
B9DA ADD A,A
B9DB SRL B B >>= 1
B9DD ADD A,B A += B
B9DE RR C
B9E0 LD B,$00 B = 0
B9E2 JR NC,url_set_hz_adjust Jump if no carry
url_b9e4 B9E4 DEC B B--
B9E5 NEG A = -A
url_set_hz_adjust B9E7 LD C,A C = A
B9E8 LD ($A25F),BC Set horizontal_adjust to BC (this shifts the car left/right if +ve/-ve)
url_b9ec B9EC XOR A A = 0
B9ED LD ($A261),A var_a261 = 0
B9F0 LD ($A262),A var_a262 = 0
B9F3 RET Return
Prev: B848 Up: Map Next: B9F4