Prev: 9FE6 Up: Map Next: A07A
A017: Paths : Finds a path based on a given coordinates (Axis, Vector).
Used by the routines at Action_f, Action_a3d0 and _a53d.
Input
IX Path data
DE Axis position to test.
BC Vector position to test.
(A19E) Determines if test required when path found.
EXIT 'C' flag : Set if failed to find path.
EXIT IX Points to path found.
Output
Both N/S and E/W paths can be tested.
Coordinates should be switched to match the axis and vector for the paths required.
Path_FindByCoord A017 LD (TempAl),BC
A01B LD HL,$FFFC
A01E ADD HL,DE
A01F EX DE,HL
Path_FindByCoord_0 A020 LD L,(IX+$00) Get axis of path.
A023 LD H,(IX+$01)
A026 AND A Get difference to coord.
A027 SBC HL,DE
A029 JR NC,Path_FindByCoord_2
Next path.
Path_FindByCoord_1 A02B LD BC,$000C Move onto next road
A02E ADD IX,BC
A030 JR Path_FindByCoord_0
Path_FindByCoord_2 A032 LD BC,$0009 Check value is within margin
A035 SBC HL,BC
A037 JR C,Path_FindByCoord_3
Path not found.
A039 SCF IF greater than margin, just end.
A03A RET
Path_FindByCoord_3 A03B LD BC,(TempAl)
A03F LD L,(IX+$02) Get end A of road.
A042 LD H,(IX+$03)
A045 SCF Difference
A046 SBC HL,BC
A048 JR NC,Path_FindByCoord_1
A04A LD L,(IX+$04) Get end B of road.
A04D LD H,(IX+$05)
A050 AND A Get difference
A051 SBC HL,BC
A053 JR C,Path_FindByCoord_1
Path found.
A055 LD A,(_a19e) Simply return with the result.
A058 AND A
A059 RET NZ
Search through table.
A05A PUSH IX
A05C POP DE
A05D LD HL,$B137
A060 LD B,$0C Loop
A062 LD C,$00 Number of matches.
_
Path_FindByCoord_4 A064 LD A,E
A065 CP (HL)
A066 INC HL
A067 JR NZ,Path_FindByCoord_5
A069 LD A,D
A06A CP (HL)
A06B JR NZ,Path_FindByCoord_5
A06D INC C Found, increase match counter.
Path_FindByCoord_5 A06E INC HL
A06F DJNZ Path_FindByCoord_4
A071 LD A,C See if two or more have been found.
A072 CP $02
A074 CCF If the result if less, return carry to indicate failed to find path.
A075 RET
DistanceA A076 DEFW $0029
DistanceB A078 DEFW $0029
Prev: 9FE6 Up: Map Next: A07A