;MAIN "VERA",8
; Path Searcher: mixed 4,8-way waves
; by Sam Style
DX_MAP EQU 64
DY_MAP EQU 64
MAXWAVE EQU 100 ;40 ;Длина волны
MAXDIST EQU 8 ;13 ;Дистанция на кот. волна может отклонятся
;от искомой точки
;MASSIVE EQU #E000
;---------- направления ---
DIR_DR EQU 0 ;вниз-вправо
DIR_R EQU 1 ;вправо
DIR_UR EQU 2 ;вверх-вправо
DIR_D EQU 3 ;вниз
DIR_U EQU 4 ;вверх
DIR_DL EQU 5 ;вниз-влево
DIR_L EQU 6 ;влево
DIR_UL EQU 7 ;вверх-влево
;--------------------------
; ORG SRCH_PATH
; ORG #6000,0
; DISP #F000
WAVE
;HL=(HEROCRD) ;H=Y,L=X
;de=куда ;D=Y,E=X
LD A,H
LD H,L
LD L,A
LD A,D
LD D,E
LD E,A
;HL=(HEROCRD) ;H=X,L=Y
;de=куда ;D=X,E=Y
LD (XY_bgn),HL ;Откуда искать путь
LD (XY_end),DE ;Куда
CALL FILLMAP ;заливаем карту волнами
LD DE,0 ;d=X, e=Y
XY_bgn EQU $-2
CALL MAP_ADR
PUSH HL
LD DE,0 ;d=X, e=Y
XY_cur EQU $-2
CALL MAP_ADR ; DE - адрес цели (нач.точка)
POP DE ; HL - адрес тек.точки
EXX
LD HL,stack
LD (HL),#FF
INC HL
;Делаем шаг на клетку с мин.номером
Steps EXX
AND A
SBC HL,DE
JR Z,stp_2
ADD HL,DE
stp_1 CALL STEPIN
EXX
LD (HL),A
INC HL
JR Steps
stp_2
EXX
DEC HL
RET
STEPIN
LD C,255
LD (mxxz18+1),HL
DEC HL ; влево
LD A,(HL)
CP 2
JR C,mxxz11
CP C
JR NC,mxxz11
LD (mxxz18+1),HL
LD C,(HL)
LD B,DIR_R ; идем обратно, поэтому номер другой
mxxz11
LD A,L ; влево вниз
ADD A,DX_MAP
LD L,A
ADC A,H
SUB L
LD H,A
LD A,(HL)
CP 2
JR C,mxxz12
CP C
JR NC,mxxz12
LD (mxxz18+1),HL
LD C,(HL)
LD B,DIR_UR
mxxz12 INC HL ; вниз
LD A,(HL)
CP 2
JR C,mxxz13
CP C
JR NC,mxxz13
LD (mxxz18+1),HL
LD C,(HL)
LD B,DIR_U
mxxz13 INC HL ; вправо-вниз
LD A,(HL)
CP 2
JR C,mxxz14
CP C
JR NC,mxxz14
LD (mxxz18+1),HL
LD C,(HL)
LD B,DIR_UL
mxxz14 LD A,L ; вправо
SUB DX_MAP
LD L,A
SBC A,L
ADD A,H
LD H,A
LD A,(HL)
CP 2
JR C,mxxz15
CP C
JR NC,mxxz15
LD (mxxz18+1),HL
LD C,(HL)
LD B,DIR_L
mxxz15 LD A,L ; вправо-вверх
SUB DX_MAP
LD L,A
SBC A,L
ADD A,H
LD H,A
LD A,(HL)
CP 2
JR C,mxxz16
CP C
JR NC,mxxz16
LD (mxxz18+1),HL
LD C,(HL)
LD B,DIR_DL
mxxz16 DEC HL
LD A,(HL)
CP 2
JR C,mxxz17
CP C
JR NC,mxxz17
LD (mxxz18+1),HL
LD C,(HL)
LD B,DIR_D
mxxz17 DEC HL
LD A,(HL)
CP 2
JR C,mxxz18
CP C
LD A,DIR_DR
RET C
mxxz18 LD HL,0
LD A,B
RET
;----------------------
; заливка карты волнами
FILLMAP
LD DE,(XY_end)
CALL MAP_ADR
LD (WaveEnd+1),HL
LD HL,0
PUSH HL
LD DE,(XY_bgn)
CALL MAP_ADR
PUSH HL
LD A,255
LD (Distan),A
LD A,2
Next LD (WaveNr),A
XOR A
LD (WaveLen),A
LD HL,stack
LD (SP_reg),HL
Loop POP DE ; заносим в помеченое место
LD A,D ; номер волны
OR E
JR Z,WaveEnd
LD A,0
WaveNr EQU $-1
LD (DE),A
PUSH DE
EX DE,HL
LD A,L ; !!! ТУТ ЗАТОЧКА ПОД DX_MAP=64
AND 63
LD B,A
ADD HL,HL
ADD HL,HL
LD A,H
AND 63
LD C,A
; B,C = X,Y тек.точки
LD DE,0 ; D,E = X,Y цели
XY_end EQU $-2
LD A,B
SUB D
JR NC,clu_1
NEG
clu_1 LD D,A
LD A,C
SUB E
JR NC,clu_2
NEG
clu_2 ADD A,D ; A = тек.расстояние
CP 0
Distan EQU $-1
JR NC,clu_3
LD (Distan),A
LD (zistan+1),A
LD (XY_cur),BC
clu_3
zistan SUB 0
CP MAXDIST
POP DE
CALL C,AROUND
JR Loop
WaveEnd LD A,(0) ;ok ; начальная точка достигнута
INC A
CP 3
RET NC
LD A,(WaveNr)
CP MAXWAVE
RET NC
LD A,(WaveLen) ; волна не распространяется
AND A
RET Z
LD B,A ; все запомненные координаты
LD HL,0 ; на стек
PUSH HL
LD HL,stack
wend_1 LD D,(HL)
INC HL
LD E,(HL)
INC HL
PUSH DE
DJNZ wend_1
LD A,(WaveNr) ; следующая волна
INC A
JR Next
AROUND
LD HL,0 ; помечаем и запоминаем
SP_reg EQU $-2
LD BC,0 ; свободных соседей вокруг D,E
WaveLen EQU $-2
DEC DE
LD A,(DE)
SUB 1
JR NC,mzzz1A
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
SET 2,B
mzzz1A LD A,E
SUB DX_MAP-1
LD E,A
SBC A,E
ADD A,D
LD D,A
LD A,(DE)
SUB 1
JR NC,mzzz1B
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
SET 1,B
mzzz1B LD A,E
ADD A,DX_MAP+1
LD E,A
ADC A,D
SUB E
LD D,A
LD A,(DE)
SUB 1
JR NC,mzzz1C
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
SET 0,B
mzzz1C LD A,E
ADD A,DX_MAP-1
LD E,A
ADC A,D
SUB E
LD D,A
LD A,(DE)
SUB 1
JR NC,mzzz1D
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
SET 3,B
mzzz1D DEC DE
LD A,B
AND %1100
JR NZ,mzzz1E
LD A,(DE)
SUB 1
JR NC,mzzz1E
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
mzzz1E INC DE
INC DE
LD A,B
AND %1001
JR NZ,mzzz1F
LD A,(DE)
SUB 1
JR NC,mzzz1F
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
mzzz1F LD A,E
SUB DX_MAP
LD E,A
SBC A,E
ADD A,D
LD D,A
LD A,E
SUB DX_MAP
LD E,A
SBC A,E
ADD A,D
LD D,A
LD A,B
AND %0011
JR NZ,mzzz1G
LD A,(DE)
SUB 1
JR NC,mzzz1G
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
mzzz1G DEC DE
DEC DE
LD A,B
AND %0110
JR NZ,aro_EX
LD A,(DE)
SUB 1
JR NC,aro_EX
LD (DE),A
LD (HL),D
INC HL
LD (HL),E
INC HL
INC C
aro_EX LD (SP_reg),HL
LD A,C
LD (WaveLen),A
RET
MAP_ADR
; !!! ЗАТОЧЕНО ПОД DX_MAP=64
;d=X, e=Y
LD L,0
LD H,E
LD E,D
LD D,L;0
;AND A
;RR H
srl h
RR L
RR H
RR L
ADD HL,DE
LD DE,MASSIVE
ADD HL,DE
RET
; DISPLAY "Длина процедуры",$-SRCH_PATH
; DISPLAY "Длина процедуры",$-#F000