?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         ;MAIN "VERA",8
  2.  
  3. ; Path Searcher: mixed 4,8-way waves
  4. ; by Sam Style
  5.  
  6. DX_MAP  EQU 64
  7. DY_MAP  EQU 64
  8. MAXWAVE EQU 100 ;40  ;Длина волны
  9. MAXDIST EQU 8 ;13    ;Дистанция на кот. волна может отклонятся
  10.                      ;от искомой точки
  11. ;MASSIVE EQU #E000
  12.  
  13. ;---------- направления ---
  14. DIR_DR  EQU 0 ;вниз-вправо
  15. DIR_R   EQU 1 ;вправо
  16. DIR_UR  EQU 2 ;вверх-вправо
  17. DIR_D   EQU 3 ;вниз
  18. DIR_U   EQU 4 ;вверх
  19. DIR_DL  EQU 5 ;вниз-влево
  20. DIR_L   EQU 6 ;влево
  21. DIR_UL  EQU 7 ;вверх-влево
  22. ;--------------------------
  23.  
  24. ;       ORG SRCH_PATH
  25. ;       ORG #6000,0
  26. ;       DISP #F000
  27.  
  28. WAVE
  29. ;HL=(HEROCRD) ;H=Y,L=X
  30. ;de=куда ;D=Y,E=X
  31.         LD A,H
  32.         LD H,L
  33.         LD L,A
  34.  
  35.         LD A,D
  36.         LD D,E
  37.         LD E,A
  38. ;HL=(HEROCRD) ;H=X,L=Y
  39. ;de=куда ;D=X,E=Y
  40.         LD (XY_bgn),HL  ;Откуда искать путь
  41.         LD (XY_end),DE  ;Куда
  42.         CALL FILLMAP    ;заливаем карту волнами
  43.  
  44.         LD DE,0 ;d=X, e=Y
  45. XY_bgn  EQU $-2
  46.         CALL MAP_ADR
  47.         PUSH HL
  48.         LD DE,0 ;d=X, e=Y
  49. XY_cur  EQU $-2
  50.         CALL MAP_ADR    ; DE - адрес цели (нач.точка)
  51.         POP DE          ; HL - адрес тек.точки
  52.  
  53.         EXX
  54.         LD HL,stack
  55.         LD (HL),#FF
  56.         INC HL
  57.  
  58. ;Делаем шаг на клетку с мин.номером
  59. Steps   EXX
  60.         AND A
  61.         SBC HL,DE
  62.         JR Z,stp_2
  63.         ADD HL,DE
  64. stp_1   CALL STEPIN
  65.         EXX
  66.         LD (HL),A
  67.         INC HL
  68.         JR Steps
  69. stp_2
  70.         EXX
  71.         DEC HL
  72.         RET
  73.  
  74. STEPIN
  75.         LD C,255
  76.         LD (mxxz18+1),HL
  77.  
  78.         DEC HL          ; влево
  79.         LD A,(HL)
  80.         CP 2
  81.         JR C,mxxz11
  82.         CP C
  83.         JR NC,mxxz11
  84.         LD (mxxz18+1),HL
  85.         LD C,(HL)
  86.         LD B,DIR_R      ; идем обратно, поэтому номер другой
  87.  
  88. mxxz11
  89.         LD A,L          ; влево вниз
  90.         ADD A,DX_MAP
  91.         LD L,A
  92.         ADC A,H
  93.         SUB L
  94.         LD H,A
  95.         LD A,(HL)
  96.         CP 2
  97.         JR C,mxxz12
  98.         CP C
  99.         JR NC,mxxz12
  100.         LD (mxxz18+1),HL
  101.         LD C,(HL)
  102.         LD B,DIR_UR
  103.  
  104. mxxz12  INC HL          ; вниз
  105.         LD A,(HL)
  106.         CP 2
  107.         JR C,mxxz13
  108.         CP C
  109.         JR NC,mxxz13
  110.         LD (mxxz18+1),HL
  111.         LD C,(HL)
  112.         LD B,DIR_U
  113.  
  114. mxxz13  INC HL          ; вправо-вниз
  115.         LD A,(HL)
  116.         CP 2
  117.         JR C,mxxz14
  118.         CP C
  119.         JR NC,mxxz14
  120.         LD (mxxz18+1),HL
  121.         LD C,(HL)
  122.         LD B,DIR_UL
  123.  
  124. mxxz14  LD A,L          ; вправо
  125.         SUB DX_MAP
  126.         LD L,A
  127.         SBC A,L
  128.         ADD A,H
  129.         LD H,A
  130.         LD A,(HL)
  131.         CP 2
  132.         JR C,mxxz15
  133.         CP C
  134.         JR NC,mxxz15
  135.         LD (mxxz18+1),HL
  136.         LD C,(HL)
  137.         LD B,DIR_L
  138.  
  139. mxxz15  LD A,L          ; вправо-вверх
  140.         SUB DX_MAP
  141.         LD L,A
  142.         SBC A,L
  143.         ADD A,H
  144.         LD H,A
  145.         LD A,(HL)
  146.         CP 2
  147.         JR C,mxxz16
  148.         CP C
  149.         JR NC,mxxz16
  150.         LD (mxxz18+1),HL
  151.         LD C,(HL)
  152.         LD B,DIR_DL
  153.  
  154. mxxz16  DEC HL
  155.         LD A,(HL)
  156.         CP 2
  157.         JR C,mxxz17
  158.         CP C
  159.         JR NC,mxxz17
  160.         LD (mxxz18+1),HL
  161.         LD C,(HL)
  162.         LD B,DIR_D
  163.  
  164. mxxz17  DEC HL
  165.         LD A,(HL)
  166.         CP 2
  167.         JR C,mxxz18
  168.         CP C
  169.         LD A,DIR_DR
  170.         RET C
  171.  
  172. mxxz18  LD HL,0
  173.         LD A,B
  174.         RET
  175.  
  176. ;----------------------
  177. ; заливка карты волнами
  178.  
  179. FILLMAP
  180.         LD DE,(XY_end)
  181.         CALL MAP_ADR
  182.         LD (WaveEnd+1),HL
  183.  
  184.         LD HL,0
  185.         PUSH HL
  186.         LD DE,(XY_bgn)
  187.         CALL MAP_ADR
  188.         PUSH HL
  189.         LD A,255
  190.         LD (Distan),A
  191.         LD A,2
  192. Next    LD (WaveNr),A
  193.         XOR A
  194.         LD (WaveLen),A
  195.         LD HL,stack
  196.         LD (SP_reg),HL
  197. Loop    POP DE                  ; заносим в помеченое место
  198.         LD A,D                  ; номер волны
  199.         OR E
  200.         JR Z,WaveEnd
  201.         LD A,0
  202. WaveNr  EQU $-1
  203.         LD (DE),A
  204.  
  205.         PUSH DE
  206.         EX DE,HL
  207.         LD A,L          ; !!! ТУТ ЗАТОЧКА ПОД DX_MAP=64
  208.         AND 63
  209.         LD B,A
  210.         ADD HL,HL
  211.         ADD HL,HL
  212.         LD A,H
  213.         AND 63
  214.         LD C,A
  215.                         ; B,C = X,Y тек.точки
  216.         LD DE,0         ; D,E = X,Y цели
  217. XY_end  EQU $-2
  218.         LD A,B
  219.         SUB D
  220.         JR NC,clu_1
  221.         NEG
  222. clu_1   LD D,A
  223.         LD A,C
  224.         SUB E
  225.         JR NC,clu_2
  226.         NEG
  227. clu_2   ADD A,D         ; A = тек.расстояние
  228.         CP 0
  229. Distan  EQU $-1
  230.         JR NC,clu_3
  231.         LD (Distan),A
  232.         LD (zistan+1),A
  233.         LD (XY_cur),BC
  234. clu_3
  235. zistan  SUB 0
  236.         CP MAXDIST
  237.  
  238.         POP DE
  239.         CALL C,AROUND
  240.         JR Loop
  241.  
  242. WaveEnd LD A,(0) ;ok             ; начальная точка достигнута
  243.         INC A
  244.         CP 3
  245.         RET NC
  246.         LD A,(WaveNr)
  247.         CP MAXWAVE
  248.         RET NC
  249.         LD A,(WaveLen)          ; волна не распространяется
  250.         AND A
  251.         RET Z
  252.         LD B,A                  ; все запомненные координаты
  253.         LD HL,0                 ; на стек
  254.         PUSH HL
  255.         LD HL,stack
  256. wend_1  LD D,(HL)
  257.         INC HL
  258.         LD E,(HL)
  259.         INC HL
  260.         PUSH DE
  261.         DJNZ wend_1
  262.         LD A,(WaveNr)           ; следующая волна
  263.         INC A
  264.         JR Next
  265.  
  266. AROUND
  267.         LD HL,0                 ; помечаем и запоминаем
  268. SP_reg  EQU $-2
  269.         LD BC,0                 ; свободных соседей вокруг D,E
  270. WaveLen EQU $-2
  271.  
  272.         DEC DE
  273.         LD A,(DE)
  274.         SUB 1
  275.         JR NC,mzzz1A
  276.         LD (DE),A
  277.         LD (HL),D
  278.         INC HL
  279.         LD (HL),E
  280.         INC HL
  281.         INC C
  282.         SET 2,B
  283.  
  284. mzzz1A  LD A,E
  285.         SUB DX_MAP-1
  286.         LD E,A
  287.         SBC A,E
  288.         ADD A,D
  289.         LD D,A
  290.         LD A,(DE)
  291.         SUB 1
  292.         JR NC,mzzz1B
  293.         LD (DE),A
  294.         LD (HL),D
  295.         INC HL
  296.         LD (HL),E
  297.         INC HL
  298.         INC C
  299.         SET 1,B
  300.  
  301. mzzz1B  LD A,E
  302.         ADD A,DX_MAP+1
  303.         LD E,A
  304.         ADC A,D
  305.         SUB E
  306.         LD D,A
  307.         LD A,(DE)
  308.         SUB 1
  309.         JR NC,mzzz1C
  310.         LD (DE),A
  311.         LD (HL),D
  312.         INC HL
  313.         LD (HL),E
  314.         INC HL
  315.         INC C
  316.         SET 0,B
  317.  
  318. mzzz1C  LD A,E
  319.         ADD A,DX_MAP-1
  320.         LD E,A
  321.         ADC A,D
  322.         SUB E
  323.         LD D,A
  324.         LD A,(DE)
  325.         SUB 1
  326.         JR NC,mzzz1D
  327.         LD (DE),A
  328.         LD (HL),D
  329.         INC HL
  330.         LD (HL),E
  331.         INC HL
  332.         INC C
  333.         SET 3,B
  334.  
  335. mzzz1D  DEC DE
  336.         LD A,B
  337.         AND %1100
  338.         JR NZ,mzzz1E
  339.         LD A,(DE)
  340.         SUB 1
  341.         JR NC,mzzz1E
  342.         LD (DE),A
  343.         LD (HL),D
  344.         INC HL
  345.         LD (HL),E
  346.         INC HL
  347.         INC C
  348.  
  349. mzzz1E  INC DE
  350.         INC DE
  351.         LD A,B
  352.         AND %1001
  353.         JR NZ,mzzz1F
  354.         LD A,(DE)
  355.         SUB 1
  356.         JR NC,mzzz1F
  357.         LD (DE),A
  358.         LD (HL),D
  359.         INC HL
  360.         LD (HL),E
  361.         INC HL
  362.         INC C
  363.  
  364. mzzz1F  LD A,E
  365.         SUB DX_MAP
  366.         LD E,A
  367.         SBC A,E
  368.         ADD A,D
  369.         LD D,A
  370.         LD A,E
  371.         SUB DX_MAP
  372.         LD E,A
  373.         SBC A,E
  374.         ADD A,D
  375.         LD D,A
  376.         LD A,B
  377.         AND %0011
  378.         JR NZ,mzzz1G
  379.         LD A,(DE)
  380.         SUB 1
  381.         JR NC,mzzz1G
  382.         LD (DE),A
  383.         LD (HL),D
  384.         INC HL
  385.         LD (HL),E
  386.         INC HL
  387.         INC C
  388.  
  389. mzzz1G  DEC DE
  390.         DEC DE
  391.         LD A,B
  392.         AND %0110
  393.         JR NZ,aro_EX
  394.         LD A,(DE)
  395.         SUB 1
  396.         JR NC,aro_EX
  397.         LD (DE),A
  398.         LD (HL),D
  399.         INC HL
  400.         LD (HL),E
  401.         INC HL
  402.         INC C
  403.  
  404. aro_EX  LD (SP_reg),HL
  405.         LD A,C
  406.         LD (WaveLen),A
  407.         RET
  408.  
  409. MAP_ADR
  410. ; !!! ЗАТОЧЕНО ПОД DX_MAP=64
  411. ;d=X, e=Y
  412.         LD L,0
  413.         LD H,E
  414.         LD E,D
  415.         LD D,L;0
  416.         ;AND A
  417.         ;RR H
  418.          srl h
  419.         RR L
  420.         RR H
  421.         RR L
  422.         ADD HL,DE
  423.         LD DE,MASSIVE
  424.         ADD HL,DE
  425.         RET
  426.  
  427. ;       DISPLAY "Длина процедуры",$-SRCH_PATH
  428. ;       DISPLAY "Длина процедуры",$-#F000
  429.