Prev: B828 Up: Map Next: B8D2
B848: Scroll the horizon
Used by the routines at main_loop, cpu_driver and escape_scene.
Input
A' Seems to be using A' on entry
Output
A' Seems to be leaving A' with a value in it
scroll_horizon B848 LD HL,($A24A) Load speed into HL
B84B LD A,H Return if speed is zero
B84C OR L
B84D RET Z
B84E LD A,($A25C) Load current_curvature into A
B851 AND A Jump if current_curvature is zero
B852 JR Z,sh_straight_road
current_curvature is non-zero here.
sh_curved_road B854 EX AF,AF' Bank current_curvature (and unbank what?)
B855 RR H Bottom bit of H (speed.hi) moves to carry (H now unused)
A here must be the banked A'... it must be passed in. This doesn't make much sense to me.
B857 RLA A = ((A << 3) + (carry << 2)) & 6
B858 RLA
B859 RLA
B85A AND $06
B85C LD C,A BC = horizon_a25d + A
B85D LD A,($A25D)
B860 ADD A,C
B861 LD C,A
B862 LD B,$00
B864 LD HL,$B828 16 word horizon table at horizon_table
B867 ADD HL,BC HL += BC
B868 LD B,(HL) BC = wordat(HL)
B869 INC HL
B86A LD C,(HL)
Decrement horizon_a25e.
B86B LD HL,$A25E HL = &horizon_a25e
B86E DEC (HL) *HL--
B86F JR NZ,sh_straight_road Jump if non-zero
It became zero.
B871 LD (HL),B *HL = B [bottom byte of table entry]
B872 EX AF,AF' Bank A [must be because A gets overwritten next]
B873 LD A,C A = C
B874 JP P,sh_b879 Jump if positive
B877 NEG A = -A
sh_b879 B879 LD HL,$C7E8 Address of operand in 'LD A,x' @ C7E7 (horizon shift value 0..19)
B87C ADD A,(HL) A += *HL
B87D JP P,sh_b882 Jump if positive
B880 ADD A,$14 A += 20 -- negative case (or zero)
sh_b882 B882 CP $14 Jump if A < 20
B884 JR C,sh_b888
B886 SUB $14 A -= 20
sh_b888 B888 LD (HL),A *HL = A
sh_straight_road B889 XOR A Zero A, B, E
B88A LD B,A
B88B LD E,A
B88C EX AF,AF' Bank zeroed A
B88D LD A,($A258) Return if incline is zero (flat road)
B890 OR A
B891 RET Z
B892 JP P,sh_not_flat_road Jump if positive
Otherwise negative.
B895 INC E E = -(E + 1)
B896 NEG
sh_not_flat_road B898 LD HL,$B827 16 word horizon table at horizon_table
B89B LD C,A BC = A (B is zeroed earlier)
B89C ADD HL,BC HL += BC
B89D LD A,($A25B) A = fast_counter - var_a25b
B8A0 LD C,A
B8A1 LD A,($A23F)
B8A4 SUB C
B8A5 AND A Set flags
B8A6 RET Z Return if non-zero
B8A7 LD C,(HL) C = *HL -- loading from horizon table
sh_b8a8_loop B8A8 SUB C A -= C
B8A9 JR C,sh_b8b1_exit Jump if carry
B8AB INC B B++
B8AC EX AF,AF' Bank
B8AD ADD A,C A += C
B8AE EX AF,AF' Bank
B8AF JR sh_b8a8_loop Loop
sh_b8b1_exit B8B1 LD A,B Return if B is zero
B8B2 AND A
B8B3 RET Z
B8B4 LD HL,$A25A var_a25a += A
B8B7 ADD A,(HL)
B8B8 LD (HL),A
Sign extend based on low bit of E?
B8B9 LD A,B A = B
B8BA RR E Shift bottom bit of E out?
B8BC LD B,$00 B = 0 -- just widen to (B,A)
B8BE JR NC,sh_set_horizon Jump if no carry
Otherwise negative.
B8C0 DEC B B = $FF
B8C1 NEG A = -A
Adjust horizon_level by (B,A).
sh_set_horizon B8C3 LD HL,($A171) Change horizon_level by (B,A)
B8C6 LD C,A
B8C7 ADD HL,BC
B8C8 LD ($A171),HL
B8CB EX AF,AF' Bank
B8CC LD HL,$A25B var_a25b += A
B8CF ADD A,(HL)
B8D0 LD (HL),A
B8D1 RET Return
Prev: B828 Up: Map Next: B8D2