;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