Login

Subversion Repositories NedoOS

Rev

Rev 881 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

        ;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