Prev: A399 Up: Map Next: A60E
A579: Lays out roadside objects
Used by the routines at main_loop, cpu_driver and escape_scene.
layout_objects A579 LD HL,$E34F Address of object_positions
A57C LD B,$15 21 iterations [max no of objects on-screen?]
Turn a run of sizes into accumulating values.
A57E XOR A total = 0
lo_loop1 A57F ADD A,(HL) total += *HL
A580 LD (HL),A *HL++ = total
A581 INC L
A582 DJNZ lo_loop1 Loop lo_loop1 while B > 0
A584 LD ($A60B),SP Save SP to restore on exit (self modify)
A588 LD SP,$EB00 SP = $EB00
A58B LD D,$EE Point DE at road buffer (somewhere)
A58D LD A,($A240) Load road_buffer_offset into A
A590 ADD A,$40 Add 64 so it's the lanes data offset
A592 LD E,A E = calculated offset
A593 LD IY,$E34F Address of object_positions
A597 LD B,$15 B = 21
A599 LD A,($A265) A = fork_visible
A59C AND A Set flags
A59D JP Z,lo_loop2 Jump to lo_loop2 if zero [not in forked road]
A5A0 LD A,($A266) A = fork_countdown
A5A3 AND A Set flags
A5A4 JR Z,layout_objects_4 [not about to fork the road]
A5A6 LD B,A B = A
lo_loop2 A5A7 LD A,(DE) A = *DE
A5A8 EXX
A5A9 LD E,A E = A
A5AA LD A,(IY+$00) A = ~(IY[0] * 2)
A5AD ADD A,A
A5AE CPL
A5AF LD L,A L = A
A5B0 LD A,E A = E & 3
A5B1 AND $03
A5B3 JR NZ,layout_objects_1
A5B5 LD H,$E8 H = $E8
A5B7 LD B,(HL) B = *HL
A5B8 DEC L L--
A5B9 LD C,(HL) C = *HL
A5BA PUSH BC
layout_objects_0 A5BB LD H,$EC H = $EC
A5BD JR lo_a5da Jump to lo_a5da
layout_objects_1 A5BF ADD A,$E7 H = A + $E7
A5C1 LD H,A
Sampled HL = $E869 $E865 $E863 $E861 (road drawing left)
A5C2 LD B,(HL) B = *HL
A5C3 DEC L L--
A5C4 LD C,(HL) C = *HL
A5C5 PUSH BC
A5C6 RL E
A5C8 BIT 7,E
A5CA JP Z,layout_objects_2
A5CD JR C,layout_objects_0
A5CF LD A,$03 A = 3
A5D1 JR layout_objects_3
layout_objects_2 A5D3 LD A,$03 A = 3
A5D5 JR C,layout_objects_3
A5D7 DEC A A--
layout_objects_3 A5D8 ADD A,H H += A
A5D9 LD H,A
lo_a5da A5DA LD C,(HL) C = *HL
A5DB INC L L++
A5DC LD B,(HL) B = *HL
A5DD PUSH BC
A5DE EXX
A5DF INC IY IY++
A5E1 INC E E++
A5E2 DJNZ lo_loop2 Loop to lo_loop2 while B > 0
A5E4 LD A,($A266) A = fork_countdown
A5E7 AND A Set flags
A5E8 JP Z,lo_return Jump to lo_return if zero
layout_objects_4 A5EB LD A,($A266) A = ~fork_countdown + 22
A5EE CPL
A5EF ADD A,$16
A5F1 JR Z,lo_return Jump to lo_return if zero
A5F3 LD B,A B = A
A5F4 LD H,$EB H = $EB
lo_loop3 A5F6 LD A,(IY+$00) L = ~(IY[0] * 2)
A5F9 ADD A,A
A5FA CPL
A5FB LD L,A
A5FC DEC H H--
A5FD LD D,(HL) D = *HL
A5FE DEC L L--
A5FF LD E,(HL) E = *HL
A600 PUSH DE
A601 INC H H++
A602 LD E,(HL) E = *HL
A603 INC L L++
A604 LD D,(HL) D = *HL
A605 PUSH DE
A606 INC IY IY++
A608 DJNZ lo_loop3 Loop lo_loop3 while B > 0
lo_return A60A LD SP,$0000 Restore original stack pointer (self modified above)
A60D RET Return
Prev: A399 Up: Map Next: A60E