| Chase H.Q. | Routines |
| Prev: AB33 | Up: Map | Next: AC3C |
|
Spawns hittable hazards in the road, like barriers and tumbleweeds.
|
||||
| spawn_hazards | AB9A | LD A,($A254) | Return if allow_spawning is zero | |
| AB9D | AND A | |||
| AB9E | RET Z | |||
| AB9F | CPL | C = 20 - allow_spawning (is 1/2 here) | ||
| ABA0 | ADD A,$15 | |||
| ABA2 | LD C,A | |||
| ABA3 | LD A,($A240) | Load road_buffer_offset into A | ||
| ABA6 | ADD A,$A0 | Add 160 so it's the hazards data offset | ||
| ABA8 | ADD A,C | A += C | ||
| ABA9 | LD L,A | Point HL at road buffer hazards data | ||
| ABAA | LD H,$EE | |||
| ABAC | LD A,(HL) | A = *HL -- load the hazard byte | ||
| ABAD | AND A | Set flags | ||
| ABAE | RET Z | Return if zero | ||
| ABAF | CP $04 | Is it 4? | ||
| ABB1 | LD DE,$0000 | DE = 0 | ||
| ABB4 | JR C,sh_abb9 | Jump if < 4 -- stop spawning barriers etc? jump/fork too? | ||
| ABB6 | LD E,$03 | E = 3 | ||
| ABB8 | SUB E | A -= E | ||
| sh_abb9 | ABB9 | LD B,$32 | B = 50 | |
| ABBB | DEC A | A-- | ||
| ABBC | JR Z,sh_abf2 | Jump if zero [A == 1] | ||
| ABBE | LD B,$DC | B = $DC | ||
| ABC0 | DEC A | A-- | ||
| ABC1 | JR Z,sh_abf2 | Jump if zero [A == 2] | ||
| ABC3 | INC L | L += 2 | ||
| ABC4 | INC L | |||
| ABC5 | LD (HL),D | *HL = D | ||
| ABC6 | INC L | L += 2 | ||
| ABC7 | INC L | |||
| ABC8 | LD (HL),D | *HL = D | ||
| ABC9 | LD A,E | A = E | ||
| ABCA | CP $03 | Is it 3? | ||
| ABCC | JR NZ,sh_abeb | Jump if non-zero | ||
| ABCE | LD A,($A221) | Load inhibit_collision_detection | ||
| ABD1 | AND A | Set flags | ||
| ABD2 | JR Z,sh_abe2 | Jump if zero | ||
|
Flag was set.
|
||||
| ABD4 | LD B,$20 | B = 32 | ||
| ABD6 | CALL sh_spawn | Call sh_spawn | ||
| ABD9 | LD B,$56 | B = 86 | ||
| ABDB | CALL sh_spawn | Call sh_spawn | ||
| ABDE | LD B,$8C | B = 140 | ||
| ABE0 | JR sh_abf2 | Calls sh_spawn then returns | ||
| sh_abe2 | ABE2 | LD B,$50 | B = 80 | |
| ABE4 | CALL sh_spawn | Call sh_spawn | ||
| ABE7 | LD B,$A0 | B = 160 | ||
| ABE9 | JR sh_abf2 | Calls sh_spawn then returns | ||
| sh_abeb | ABEB | LD B,$46 | B = 70 | |
| ABED | CALL sh_spawn | Call sh_spawn | ||
| ABF0 | LD B,$B4 | B = 180 | ||
| sh_abf2 | ABF2 | CALL sh_spawn | Call sh_spawn | |
| ABF5 | RET | Return | ||
|
I:B Stored at entry+5 e.g. $20/$46/$56/$50/$B4
I:C Stored at entry+1 e.g. $13
|
||||
| sh_spawn | ABF6 | EXX | Bank entry registers | |
| ABF7 | LD B,$06 | 6 iterations | ||
| ABF9 | LD HL,$A188 | Point HL at hazards table | ||
| ABFC | LD DE,$0014 | Stride of 20 bytes | ||
| sh_loop | ABFF | RLC (HL) | Check the flag byte to see if the entry is used (it's either $00 if empty, or $FF if used, so rotating it in place is not a problem) | |
| AC01 | JR NC,sh_found_spare | Jump to sh_found_spare if it didn't carry | ||
| AC03 | ADD HL,DE | Move to the next entry | ||
| AC04 | DJNZ sh_loop | Loop while iterations remain | ||
| AC06 | POP HL | |||
| AC07 | RET | Return | ||
|
HL points to the unused entry
|
||||
| sh_found_spare | AC08 | PUSH HL | IX = HL | |
| AC09 | POP IX | |||
| AC0B | LD BC,$0013 | Zero 20 bytes at HL | ||
| AC0E | LD D,H | |||
| AC0F | LD E,L | |||
| AC10 | INC DE | |||
| AC11 | LD (HL),$00 | |||
| AC13 | LDIR | |||
| AC15 | EXX | Restore entry registers | ||
| AC16 | LD HL,$AC3C | wordat(IX + 11) = Address of hazard_hit routine | ||
| AC19 | LD (IX+$0C),H | |||
| AC1C | LD (IX+$0B),L | |||
|
Gets hit when on the dirt track. sampled DE = $3 (tumbleweed), $0 (barrier)
|
||||
| AC1F | LD HL,($5CF6) | Point HL at the hazards data table entry (*$5CF6 -> hittable_objects_defs + 3) | ||
| AC22 | ADD HL,DE | |||
| AC23 | LD A,(HL) | Copy flag TBD | ||
| AC24 | LD (IX+$08),A | |||
| AC27 | INC HL | |||
| AC28 | LD A,(HL) | Copy lod address (e.g. tumbleweed_lods) | ||
| AC29 | LD (IX+$09),A | |||
| AC2C | INC HL | |||
| AC2D | LD A,(HL) | |||
| AC2E | LD (IX+$0A),A | |||
| AC31 | LD (IX+$05),B | IX[5] = B TBD -- passed in | ||
| AC34 | LD (IX+$01),C | IX[1] = C TBD | ||
| AC37 | LD (IX+$00),$FF | Mark the entry as used | ||
| AC3B | RET | Return | ||
| Prev: AB33 | Up: Map | Next: AC3C |