?login_element?

Subversion Repositories NedoOS

Rev

Rev 971 | Blame | Compare with Previous | Last modification | View Log | Download

  1.         ;MAIN "VERA",8
  2.  
  3. DV32    LD A,(MENLP-1) ;кол-во пунктов
  4.         SUB B          ;не больше ли?
  5.         LD A,C
  6.         RET NC
  7.         JR SETCUR
  8. DIV3
  9.         JR C,SETCUR
  10.         LD C,A
  11.         LD B,1
  12. DV31    SUB 3
  13.         JR Z,DV32
  14.         INC B
  15.         JR NC,DV31
  16.  
  17. ;установить текущий пункт меню
  18. SETCUR
  19. SETCURp1=$+1
  20.         LD A,1      ;текущ. пункт
  21.         LD B,A
  22.         ADD A,A     ;A*3
  23.         ADD A,B
  24.         SCF
  25.         RET
  26.  
  27. ;Готовы ли к скроллу? (мигает курсор)
  28. ;флаг C - да
  29. SCRLMAP
  30.         LD A,(CCURS+1)
  31.         LD B,A
  32.         SUB 2
  33.         CP 2
  34.         LD A,B
  35.         RET
  36.  
  37. ;Проверка на анимацию предметов
  38. ;by axor, 27.04.2004
  39. ;Изменен формат анимированных спрайтов
  40. ;11.05.2004
  41. ;И снова сменен формат. Уже давно, но работаю только сейчас
  42. ;4.07.05, 7.09.05
  43. ;OUT: флаг C=1 значит спрайт анимированный и его нужно печатать
  44. ;          C=0 не анимация
  45. ANIM
  46.         srl a ;RRA    ;Это анимация?
  47.         RET NC ;Нет!
  48.         ;jr $
  49.         PUSH DE
  50.         LD C,A        ;A=номеру группы
  51.         LD B,0
  52.         ADD A,A       ;A=A*2
  53.         LD E,A
  54.         LD D,B
  55.         LD A,H        ;Номер спрайта в группе*2
  56.         EX AF,AF' ;'
  57.         LD HL,AdrGrps
  58.         ADD HL,DE
  59.         LD E,(HL)
  60.         INC HL
  61.         LD D,(HL)     ;Высчитали адрес заголовка группы
  62.  
  63.         LD HL,AnimGrps
  64.         ADD HL,BC
  65.         LD A,(HL)
  66.         AND A
  67.         JR Z,ANM_FRS  ;была ли группа на экране?
  68.  
  69. ;Группа уже на экране, значит просто берем
  70. ;текущую фазу спрайта
  71.         EX DE,HL
  72.         INC HL
  73.         JR AN_CUR
  74.  
  75. ;Группа печатается впервые
  76. ANM_FRS INC (HL)      ;Установим флаг появления групп на экране
  77.         EX DE,HL      ;HL-адрес заголовка группы
  78.  
  79.         LD E,(HL)     ;Восстан. для счетчика
  80.         INC HL
  81.         DEC (HL)
  82.         JR NZ,AN_CUR  ;уменьшаем счетчик (скорость)
  83.  
  84. ;Если значение счетчика нулевое, то меняем фазу анимации
  85.         LD (HL),E     ;восстановили счетчик
  86.         INC HL
  87.         LD C,(HL)     ;Тип анимации
  88.  
  89.         INC HL
  90.         LD A,(HL)     ;кол-во фаз в группе
  91.         AND A
  92.         JR Z,AN_CUR+2 ;Если кол-во фаз=0, то это заморож. анимац
  93.         INC HL
  94.         INC (HL)      ;Меняем фазу
  95.         LD E,(HL)
  96.         CP E
  97.         JR NC,AN_NXT
  98.  
  99.         DEC E
  100.         LD (HL),E
  101.         DEC C
  102.         JR Z,NO_FADE  ;Зацикл. аним.
  103.         DEC C
  104.         JR NZ,NO_FADE ;Реверсивная
  105.  
  106. ;FADE
  107. ;Затух. аним.
  108. ;Меняет значение спрайтов на карте
  109. ;Это дает возможность перейти к другой аним. группе
  110. ;или оставить спрайт навсегда на карте
  111.         INC HL
  112.         EX AF,AF' ;'
  113.         LD C,A
  114.         ADD HL,BC
  115.         LD C,(HL)
  116.         INC HL
  117.         LD H,(HL)
  118.         LD L,C
  119.         LD D,B  ;B=0
  120.         SLA E
  121.         ADD HL,DE     ;HL=ссылке на фазу спрайта с учетом смещ.
  122.         LD A,(HL)
  123.         INC HL
  124.         LD C,(HL)
  125. MLB2    LD HL,0       ;Ставим на карту последний спрайт группы,
  126.         LD (HL),A     ;тем самым убирая анимацию вообще или
  127.         INC HL        ;переходя на новую анимацию
  128.         LD (HL),C
  129.         LD L,A
  130.         LD H,C
  131.         POP DE
  132.         SCF
  133.         RET
  134.  
  135. NO_FADE LD E,C
  136.         LD (HL),E
  137.         JR AN_NXT
  138.  
  139. AN_CUR  INC HL
  140.         INC HL
  141.         INC HL
  142.         LD E,(HL)     ;смещение от начала фазы
  143. AN_NXT  INC HL
  144.         EX AF,AF' ;'
  145.         LD C,A
  146.         ADD HL,BC
  147.         LD C,(HL)
  148.         INC HL
  149.         LD H,(HL)
  150.         LD L,C
  151.         SLA E
  152.         LD D,B  ;B=0
  153.         ADD HL,DE     ;HL=ссылке на фазу спрайта с учетом смещ.
  154.         LD A,(HL)     ;берем номер спрайта
  155.         INC HL
  156.         LD H,(HL)
  157.         LD L,A
  158.         POP DE
  159.         SCF
  160.         RET
  161.  
  162. ;Печать видимой части карты
  163. PRMAP
  164.         LD HL,A_TILE
  165.         LD (ADRTL+1),HL
  166.         XOR A
  167.         LD (TILED+1),A
  168.  
  169.         LD DE,0
  170.         LD BC,(DispMapX) ;B-Y, C-X ;смещение карты
  171.         LD HL,(HEROCRD)  ;H-Y, L-X ;коорд. героя на карте
  172.         LD A,H
  173.         SUB B
  174.         JR NC,PM0
  175.         NEG
  176.         CP 2
  177.         JR NC,PM2
  178. PM0     CP SCRHG
  179.         JR NC,PM2
  180.         ADD A,A
  181.         ADD A,SHADSCR/256
  182.         LD H,A
  183.         LD A,L
  184.         SUB C
  185.         JR NC,PM1
  186.         NEG
  187.         CP 2
  188.         JR NC,PM2
  189. PM1     CP SCRWD
  190.         JR NC,PM2
  191.         ADD A,A
  192.         LD L,A
  193.         EX DE,HL
  194. PM2     EX DE,HL
  195.         LD (WHERE+1),HL
  196.  
  197.         CALL CalcMap  ;Высчитываем смещение в карте
  198. HMAP    LD C,SCRHG/2  ;Высота
  199.         LD DE,SHADSCR ;D-Y, E-X
  200.  
  201.        if !EGA
  202. ;Искусственно делаем значение SP, которое будет на выходе
  203.         PUSH HL,HL,HL   ;,HL-если будет CALL BLOCK22
  204.         LD (BL22SP+1),SP
  205.         POP HL,HL,HL    ;,HL
  206.        endif
  207.  
  208. PRMLP0  LD B,SCRWD/2 ;Ширина
  209. PRMLP1  PUSH DE
  210.         PUSH BC
  211.  
  212.         LD A,PG_MAP
  213.         ;LD (NUMPAGE),A
  214.         ;OR 16+8
  215.         ;LD BC,#7FFD
  216.         ;OUT (C),A
  217.         call PAGE
  218.  
  219.         LD A,(HL)
  220.         LD (MLB2+1),HL
  221.         INC L
  222.         PUSH HL
  223.         LD H,(HL)
  224.         LD L,A
  225.         CALL ANIM    ;Проверка на анимацию (A bit0) и т.п.
  226.  
  227. ;Флаг полного обновления экрана, если=0, 1-не обновлять
  228. MAPFLAG LD A,0
  229.        if PRFULLMAP
  230.         xor a
  231.        endif
  232.        if EGA
  233.         dec a
  234.         jr nz,PRBLKm3 ;точно печатаем тайл
  235.        else
  236.         DEC A
  237.         JR NZ,PRBLKm3 ;точно печатаем тайл
  238.        endif
  239.         JR C,ADRTL   ;[спрайт]тайл нужно напечатать, т.к. это анимация
  240.  
  241. ;Проверка попадает ли текущий [спрайт]тайл под героя
  242. WHERE   LD BC,0 ;коорд. героя на экране
  243.         LD A,C   ;X
  244.         SUB E
  245.         JR NC,W1
  246.         NEG
  247. W1      CP 3
  248. ;       JR NC,PRBLK+3
  249.         JP NC,NOPRBLK
  250.         LD A,B   ;Y
  251.         SUB D
  252.         JR NC,W2
  253.         NEG
  254.         INC A
  255. W2      CP 5
  256. ;       JR NC,PRBLK+3
  257.         JP NC,NOPRBLK
  258.  
  259. ADRTL   LD BC,A_TILE
  260.         LD A,E
  261.         LD (BC),A
  262.         INC BC
  263.         LD A,D
  264.         LD (BC),A
  265.         INC BC
  266.         LD (ADRTL+1),BC
  267.         LD A,1
  268. PRBLKm3
  269.         LD (TILED+1),A
  270.        
  271.        if EGA
  272.         call prtileega
  273.        else
  274. ;PRBLK
  275.         ;CALL BLOCK22 ;Печать блока
  276. ;Основная идея (формат спрайта) Д.Быстрова (Alone Coder)
  277. ;Реализация (axor)
  278. ;Печать идет через стек, но без запрета прерываний
  279. ;Печать спрайта 2*2 знакоместа в теневом экране
  280. ;DE-адрес в теневом экране
  281. ;HL-адрес спрайта
  282. ;BLOCK22
  283. ;       LD A,PG_SPR ;=0
  284.         XOR A
  285.         ;LD (NUMPAGE),A
  286.         ;OR 16+8
  287.         ;LD BC,#7FFD
  288.         ;OUT (C),A
  289.         call PAGE
  290.  
  291.         LD C,(HL)    ;Делаем именно так, чтобы прерывание
  292.                      ;не испортило спрайт
  293.         INC L        ;поэтому в BC у нас
  294.                      ;уже есть первые 2 байта спрайта
  295.         LD B,(HL)
  296.         INC L
  297.         LD SP,HL     ;Теперь стек указывает на начало спрайта
  298.  
  299.         EX DE,HL     ;HL-адрес в теневом экране
  300.         LD DE,#FF20
  301. ;Непосредственно сам вывод спрайта
  302.         LD (HL),C
  303.         INC L
  304.         LD (HL),B
  305.         INC H
  306.         POP BC
  307.         LD (HL),B
  308.         DEC L
  309.         LD (HL),C
  310.         ADD HL,DE
  311.  
  312.         DUP 6
  313.         POP BC
  314.         LD (HL),C
  315.         INC L
  316.         LD (HL),B
  317.         INC H
  318.         POP BC
  319.         LD (HL),B
  320.         DEC L
  321.         LD (HL),C
  322.         ADD HL,DE
  323.         EDUP
  324.  
  325.         POP BC
  326.         LD (HL),C
  327.         INC L
  328.         LD (HL),B
  329.         INC H
  330.         POP BC
  331.         LD (HL),B
  332.         DEC L
  333.         LD (HL),C
  334. BL22SP  LD SP,0
  335. ;       RET
  336.        endif
  337.  
  338. NOPRBLK POP HL
  339.         POP BC
  340.         POP DE
  341.         INC HL
  342.         INC E        ;X=X+2
  343.         INC E
  344.         DEC B
  345.         JP NZ,PRMLP1
  346.         LD E,B       ;X=0
  347.         INC D        ;Y=Y+2
  348.         INC D
  349.         LD A,C
  350.         LD C,128-(SCRWD)
  351.         ADD HL,BC
  352.         DEC A
  353.         LD C,A
  354.         JP NZ,PRMLP0
  355.        if EGA
  356.         ld a,(MAPFLAG+1)
  357.         dec a
  358.         jr z,$+5
  359.         LD (MAPFLAG+1),A
  360.        else
  361.         INC A
  362.         LD (MAPFLAG+1),A
  363.        endif
  364.         LD HL,(ADRTL+1)
  365.         LD (HL),255
  366.  
  367. ;После печати карты обнуляем видимость анимационных групп,
  368. ;т.к. они в любой момент могут "уйти"
  369. ;за счет скроллирования игрового поля игроком
  370.         LD B,QGRPS
  371.         LD HL,AnimGrps
  372. ANG     LD (HL),C   ;C=0
  373.         INC HL
  374.         DJNZ ANG
  375. ;       CALL STONE ;отображает непрох. клетки
  376.         RET
  377.  
  378.        if !EGA
  379. ;Печать блока 3*3 знакоместа на основном экране (реально 0xc000+)
  380. ;HL-адрес спрайта
  381. ;DE-адрес в экране (а не координаты в обычных знакоместах D-X, E-Y)
  382. ;1223 такта
  383. BLOCK33
  384.         ;CALL SCR_ADR ;эта процедура занимает
  385.                      ;67 тактов включая RET
  386.         LD (BL33SP+1),SP ;20
  387.         LD C,(HL)        ;7
  388.         INC HL           ;6
  389.         LD B,(HL)        ;7
  390.         INC HL           ;6
  391.         LD SP,HL         ;6
  392.         EX DE,HL         ;4
  393.         LD DE,#2008      ;10 =66
  394.          DUP 4
  395.         LD (HL),C ;1     ;7
  396.         INC L            ;4
  397.         LD (HL),B ;2     ;7
  398.         INC L            ;4
  399.         POP BC           ;10
  400.         LD (HL),C ;3     ;7
  401.         INC H            ;4
  402.         LD (HL),B ;4     ;7
  403.         DEC L            ;4
  404.         POP BC           ;10
  405.         LD (HL),C ;5     ;7
  406.         DEC L            ;4
  407.         LD (HL),B ;6     ;7
  408.         INC H            ;4
  409.         POP BC           ;10
  410.          EDUP
  411.  
  412.         ORG $-1
  413.  
  414.         LD A,L           ;4
  415.         ADD A,D          ;4
  416.         LD L,A           ;4
  417.         JR C,$+5         ;12
  418.         LD A,H           ;4
  419.         SUB E            ;4
  420.         LD H,A           ;4
  421.  
  422.          DUP 4
  423.         POP BC
  424.         LD (HL),C ;1
  425.         INC L
  426.         LD (HL),B ;2
  427.         INC L
  428.         POP BC
  429.         LD (HL),C ;3
  430.         INC H
  431.         LD (HL),B ;4
  432.         DEC L
  433.         POP BC
  434.         LD (HL),C ;5
  435.         DEC L
  436.         LD (HL),B ;6
  437.         INC H
  438.          EDUP
  439.  
  440.         LD A,L
  441.         ADD A,D
  442.         LD L,A
  443.         JR C,$+5
  444.         LD A,H
  445.         SUB E
  446.         LD H,A
  447.  
  448.          DUP 4
  449.         POP BC
  450.         LD (HL),C ;1
  451.         INC L
  452.         LD (HL),B ;2
  453.         INC L
  454.         POP BC
  455.         LD (HL),C ;3
  456.         INC H
  457.         LD (HL),B ;4
  458.         DEC L
  459.         POP BC
  460.         LD (HL),C ;5
  461.         DEC L
  462.         LD (HL),B ;6
  463.         INC H
  464.          EDUP
  465.         ORG $-1
  466. BL33SP  LD SP,0
  467.         RET
  468.        endif
  469.  
  470. ;Герой вышел за пределы экрана
  471. NOPRNT  POP DE,HL
  472.         RET
  473.  
  474. ;Мигание героя
  475. HERO2
  476. HERO2p1=$+1
  477.         LD A,0
  478.         DEC A
  479.         LD (HERO2p1),A
  480.         JR NZ,H2
  481.         LD HL,HERO
  482.         LD (CLR_MAPm2),HL
  483. H2      BIT 1,A
  484.         RET Z
  485.        
  486. ;Печать героя на теневом экране
  487. ;Процедура очень похожа на печать
  488. ;курсора на теневом экране
  489. ;IN:  HL-адрес спрайта
  490. ;     DE-координаты в пикселях на экране
  491. ;     D-Y,E-X
  492. ;[OUT: HL-адрес следующего спрайта???]
  493. HERO
  494.         PUSH HL,DE
  495.         LD HL,(DispMapX) ;H-Y, L-X ;смещение карты
  496.         LD DE,(HEROCRD)  ;D-Y, E-X ;коорд. героя на карте
  497.         LD A,D
  498.         INC A
  499.         SUB H
  500.         JR C,NOPRNT  ;Ушел вверх
  501.         CP SCRHG/2+3
  502.         JR NC,NOPRNT ;Ушел вниз
  503.         LD A,E
  504.         INC A
  505.         SUB L
  506.         JR C,NOPRNT  ;Ушел влево
  507.         CP SCRWD/2+2
  508.         JR NC,NOPRNT ;Ушел вправо
  509.  
  510.         POP DE,HL
  511.  
  512.        if EGA
  513.         ld a,55 ;"scf"
  514.         ld (wasdrawimg),a
  515.        ;di ;не помогает
  516. ;IN:  HL-адрес спрайта (N*128)
  517. ;     DE-координаты в пикселях на экране
  518. ;     D-Y,E-X
  519.         add hl,hl
  520.         add hl,hl ;N*512
  521. ;hl=адрес спрайта
  522.         ld a,h
  523.         sub 24*2 ;24 спрайта в странице
  524.         ld c,PGSPRITES0
  525.         jr c,HERO_pg0
  526.         ld h,a ;pg1
  527.         inc c ;ld c,PGSPRITES1
  528. HERO_pg0
  529.        ld a,(NEV1)
  530.        or a
  531.        jr nz,$+4
  532.        inc c
  533.        inc c ;PGSPRTRAN0/1
  534.         ld a,c
  535.         call setpg
  536.        ;push ix
  537.        ;push iy
  538.         ld a,h
  539.         ;add a,a ;N*4
  540.         ;add a,4
  541.         ;ld ly,a
  542.         ;ld a,h
  543.         ;add a,0xc0
  544.         ;ld hy,a
  545.         ld ($+5),a
  546.         ld iy,(0xc000)
  547.         call setpgsscr40008000_current ;shadow
  548.  
  549.        ld a,(HMOVEp1) ;высота видимой части карты/8
  550.        add a,a
  551.        add a,a
  552.        add a,a
  553.        ld (prspr_curscrhgt),a
  554.        inc a
  555.        ld (prspr_curscrhgtplus1),a
  556.        add a,sprmaxhgt-2
  557.        ld (hero_curmaxy),a
  558.  
  559.         ld a,e
  560.        add a,16 ;если спрайт за левой границей
  561.         srl a
  562.         add a,sprmaxwid-1 -8
  563.         cp 96-8+1+sprmaxwid-1 ;scrwid-1+sprmaxwid ;чтобы не давать выходить за правую границу активной зоны (TODO менять окно клипирования)
  564.         jr nc,hero_drawspr_skip
  565.         ld e,a
  566.         ld a,d
  567.         add a,sprmaxhgt-1
  568. hero_curmaxy=$+1
  569.         cp scrhgt-1+sprmaxhgt
  570.         jr nc,hero_drawspr_skip
  571.         sub sprmaxhgt-1
  572.         ld c,a
  573.  
  574. ;в 4000,8000 уже включен экран (setpgsscr40008000)
  575. ;iy=sprite data+2 = spraddr+4
  576. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  577. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  578. ;(iy-3)=sprhgt
  579. ;(iy-4)=sprwid
  580.         call prspr
  581. hero_drawspr_skip
  582.        ld a,192
  583.        ld (prspr_curscrhgt),a
  584.        inc a
  585.        ld (prspr_curscrhgtplus1),a
  586.        ;pop iy
  587.        ;pop ix
  588.         jp setpgsmain40008000
  589.        ;ei
  590.        else
  591.  
  592.         LD A,32      ;высота героя в пикс.
  593.         LD B,A
  594.         LD (hero1-1),A
  595.         LD A,D
  596.         CP 223
  597.         JR C,hero0
  598.         NEG
  599.         LD C,A
  600.         LD A,B
  601.         SUB C
  602.         RET Z   ;Герой вышел за пределы экрана
  603.         LD (hero1-1),A  ;Уменьшаем высоту спрайта, т.к. голова
  604.                         ;вышла за пределы
  605.         LD A,C
  606.         ADD A,A
  607.         ADD A,A
  608.         LD B,0
  609.         LD C,A
  610.         ADD HL,BC       ;Делаем смещение от начала спрайта
  611.         LD D,B    ;Y=0
  612.  
  613. hero0   LD A,PG_HERO
  614.         CALL PAGE
  615.         LD A,E
  616.         AND 7
  617.  
  618.         DUP 3
  619.         SRL D
  620.         RR E
  621.         EDUP
  622.  
  623.         PUSH HL
  624.  
  625.         LD HL,SHADSCR
  626.         ADD HL,DE
  627.  
  628.         INC A
  629.         LD B,A
  630.         LD A,-1
  631.         ADD A,A
  632.         DJNZ $-1
  633.  
  634.         LD (hero2-1),A
  635.  
  636.         EX DE,HL ;DE-адрес на экране для печати
  637.         POP HL   ;HL-адрес спрайта
  638.  
  639. ;Проверка на выход за нижнюю границу теневого экрана
  640.         LD A,D
  641.         CP SCRHG+(SHADSCR/256)
  642.         RET NC
  643.  
  644.         LD B,32  ;Высота спрайта героя в пикселях
  645. hero1   PUSH BC
  646.         LD C,(HL)
  647.         INC HL
  648.         LD B,(HL)
  649.         INC HL
  650.         LD A,(HL)
  651.         INC HL
  652.         PUSH HL
  653.         LD H,(HL)
  654.         LD L,A
  655.         PUSH DE
  656.         LD A,(DE)
  657.         LD E,A
  658.         SCF
  659.         SBC A,A
  660.         LD D,0
  661. hero2   RL C
  662.         RL B
  663.         RLA
  664.         ADD HL,HL
  665.         RL D
  666.         JR C,hero2
  667.         AND E
  668. NEV1    XOR D   ;для видимости/"невидимости" героя
  669.         POP DE
  670.  
  671.         EX AF,AF' ;'
  672.         LD A,E
  673.         AND 31
  674.         CP SCRWD
  675.         JR NC,hero3
  676.  
  677.         EX AF,AF' ;'
  678.         LD (DE),A
  679.  
  680. hero3   INC DE
  681.         LD A,E
  682.         AND 31
  683.         CP SCRWD
  684.         JR NC,hero4
  685.  
  686.         LD A,(DE)
  687.         AND B
  688. NEV2    XOR H
  689.         LD (DE),A
  690.  
  691. ;Проверка на выход за правую границу теневого экрана
  692. hero4   INC DE
  693.         LD A,E
  694.         AND 31
  695.         CP SCRWD
  696.         JR NC,hero5
  697.  
  698.         LD A,(DE)
  699.         AND C
  700. NEV3    XOR L
  701.         LD (DE),A
  702. hero5   DEC DE
  703.         DEC DE
  704.         LD HL,32
  705.         ADD HL,DE
  706.         EX DE,HL
  707.         POP HL
  708.         POP BC
  709.         INC HL
  710.  
  711. ;Проверка на выход за нижнюю границу теневого экрана
  712.         LD A,D
  713.         CP SCRHG+(SHADSCR/256)
  714.         RET NC
  715.         DJNZ hero1
  716.         RET
  717.        endif
  718.  
  719.        if EGA
  720. ;Печать строки (конец печати - 0, перевод строки - 13)
  721. ;HL-координаты
  722. ;H-X (0-63), L-Y (0-23)
  723. ;DE-адрес текста
  724. PR64
  725.         ld a,(egaon)
  726.         or a
  727.         jp z,PR64_6912
  728.         push de
  729.         push hl
  730.         call PAGE_PG_VIEW
  731.         call setpgsscr40008000_current
  732.         call PR64_onescreen
  733.         pop hl
  734.         pop de
  735.         call setpgsscr40008000
  736. PR64_onescreen
  737.         PUSH HL
  738.         ld a,h ;x
  739.         ld h,0
  740.         ld b,h
  741.         ld c,l
  742.         add hl,hl
  743.         add hl,hl
  744.         add hl,bc ;*5
  745.         add hl,hl
  746.         add hl,hl
  747.         add hl,hl ;*40
  748.         add hl,hl
  749.         add hl,hl
  750.         add hl,hl ;*40*8
  751.         ld b,0x40
  752.         rra
  753.         ;jr nc,$+4
  754.         ;ld b,0x60
  755.         ld c,a
  756.         rla
  757.         dup scrbase&0xff
  758.         inc c
  759.         edup
  760.         add hl,bc
  761.         ld b,a ;x
  762.  
  763. PR64LP  LD A,(DE)
  764.         AND A  ;Конец текста?
  765.         jr z,PR64q
  766.         CP #0D ;13
  767.         JR NZ,PR64LP2
  768.         POP HL
  769.         INC L
  770.         INC DE
  771.         JR PR64
  772. PR64q
  773.         POP HL
  774.         jp setpgsmain40008000
  775. PR64LP2
  776.         PUSH HL
  777.         PUSH DE
  778.         LD E,A
  779.         LD D,FNT/256
  780. ;Расчет половинки байта
  781. ;Все зависит от четной или
  782. ;нечетной текущей координаты X
  783.         inc b
  784.         LD A,B
  785.         EX AF,AF' ;'
  786.  
  787.         push hl
  788.         ;push ix
  789.         push iy
  790.        
  791.         bit 0,b
  792.         jr nz,$+4
  793.         set 5,h
  794.        
  795.         ld hy,8
  796.         ;ld ix,0x3fc9
  797. ;lx=background color %33210210
  798. ;hx=color %33210210
  799. ;de=font char
  800. ;hl=screen
  801. prchar48ega_hxoncolor0
  802.         ld b,hx
  803.         ld a,(de)
  804.         ld c,a
  805.         ld a,lx
  806.         rl c
  807.         jr nc,$+2+4
  808.          xor b
  809.          and 0xb8;%10111000
  810.          xor b
  811.         rl c
  812.         jr nc,$+2+4
  813.          xor b
  814.          and 0x47;%01000111
  815.          xor b
  816.         ld (hl),a
  817.         ld a,h
  818.         add a,0x40
  819.         ld h,a
  820.         ld a,lx
  821.         rl c
  822.         jr nc,$+2+4
  823.          xor b
  824.          and 0xb8;%10111000
  825.          xor b
  826.         rl c
  827.         jr nc,$+2+4
  828.          xor b
  829.          and 0x47;%01000111
  830.          xor b
  831.         ld (hl),a
  832.         inc d
  833.         ld bc,+(40-0x4000)
  834.         add hl,bc
  835.         dec hy
  836.         jp nz,prchar48ega_hxoncolor0
  837.         pop iy
  838.         ;pop ix
  839.         pop hl
  840.  
  841.         POP DE
  842.         POP HL
  843.         INC DE
  844.  
  845.         EX AF,AF' ;'
  846.         LD B,A
  847.         rra
  848.         JP C,PR64LP
  849.         INC L
  850.         JP PR64LP
  851.         ret
  852.        endif
  853. ;6912
  854. ;Печать строки (конец печати - 0, перевод строки - 13)
  855. ;HL-координаты
  856. ;H-X (0-63), L-Y (0-23)
  857. ;DE-адрес текста
  858. PR64_6912
  859.         PUSH HL
  860.         LD A,L ;расчет адреса в экране
  861.         LD B,H
  862.  
  863.         AND 7
  864.         RRCA
  865.         RRCA
  866.         RRCA
  867.  
  868.         SRL H
  869.         ADD A,H
  870.         LD H,A
  871.  
  872.         LD A,L
  873.         AND #18
  874.         ;OR SCR/256 ;#C0
  875.        or 0x40
  876.         LD L,H
  877.         LD H,A
  878.  
  879. PR64LP_  LD A,(DE)
  880.         AND A  ;Конец текста?
  881.         JR NZ,$+4
  882.         POP HL
  883.         RET
  884.         CP #0D ;13
  885.         JR NZ,PR64LP2_
  886.         POP HL
  887.         INC L
  888.         INC DE
  889.         JR PR64_6912
  890.  
  891. PR64LP2_ PUSH HL
  892.         PUSH DE
  893.         LD E,A
  894.         LD D,FNT/256
  895.  
  896. ;Расчет из какой половинки байта брать
  897. ;спрайт буквы. Все зависит от четной или
  898. ;нечетной текущей координаты X
  899.         LD A,B
  900.         INC B
  901.         RRA
  902.         SBC A,A
  903.         XOR %11110000
  904.         LD C,A
  905.  
  906.         LD A,B
  907.  
  908.         EX AF,AF' ;'
  909.  
  910.         LD B,8
  911. PR64LOP_ LD A,(DE)
  912.         XOR (HL)
  913.         AND C
  914.         XOR (HL)
  915.         LD (HL),A
  916.         INC H
  917.         INC D
  918.         DJNZ PR64LOP_
  919.  
  920.         POP DE
  921.         POP HL
  922.         INC DE
  923.  
  924.         EX AF,AF' ;'
  925.         LD B,A
  926.         JP M,PR64LP_
  927.         INC L
  928.         JP PR64LP_
  929.  
  930. ;MATH
  931. HL72
  932.         DUP 3
  933.         ADD HL,HL
  934.         EDUP
  935.         LD B,H
  936.         LD C,L
  937.         DUP 3
  938.         ADD HL,HL
  939.         EDUP
  940.         ADD HL,BC    ;HL=HL*72
  941.        if EGA
  942.         add hl,hl
  943.         add hl,hl
  944.         ld bc,0xc000
  945.         add hl,bc
  946.        else
  947.         LD BC,SPR33
  948.         ADD HL,BC
  949.        endif
  950.         RET
  951.  
  952. ;b=A/24
  953. DIV24   LD BC,#0018
  954. DIV24_0
  955.         SUB C
  956.         RET C
  957.         INC B
  958.         JR DIV24_0
  959.  
  960. ;На выходе в А ПСЧ
  961. RND     LD A,0
  962.         LD B,A
  963.         ADD A,A
  964.         ADD A,A
  965.         ADD A,B
  966.         INC A
  967.         LD (RND+1),A
  968.         RET
  969.  
  970. ;На выходе в А ПСЧ
  971. RND2    PUSH HL
  972. RND1    LD HL,0
  973.         INC HL
  974.         LD A,H
  975.         AND #3F
  976.         LD H,A
  977.         LD (RND1+1),HL
  978.         LD A,R
  979.         XOR (HL)
  980.         POP HL
  981.         RET
  982.  
  983. ;Из координат адрес в атрибутах
  984. ;H-X, L-Y
  985. ATRADR LD A,H
  986.         ADD HL,HL
  987.         ADD HL,HL
  988.         ADD HL,HL
  989.         LD H,#36 ;если экран с #C000
  990.                  ;#16, если с #4000
  991.         ADD HL,HL
  992.         ADD HL,HL
  993.         ADD A,L
  994.         LD L,A
  995.         RET
  996.  
  997. ;IN:   A-номер вещи
  998. ;OUT: BC-адрес свойств вещи
  999. SVOYST
  1000.         LD HL,VSVOY
  1001.         ADD A,A
  1002.         LD C,A
  1003.         LD B,0
  1004.         ADD HL,BC
  1005.         LD C,(HL)
  1006.         INC HL
  1007.         LD B,(HL)
  1008.         RET
  1009.  
  1010. ;Расчет по смещению от начала карты
  1011. ;(лев. верх. угол) адреса элементов из которых состоит карта
  1012. ;Карта - двумерный массив 64*64 двубайтных элементов
  1013. ;IN:  None
  1014. ;OUT: HL-адрес элемента в массиве карты
  1015. CalcMap
  1016.          LD HL,#3400 ;H-Y, L-X
  1017. DispMapX EQU CalcMap+1 ;Смещ. от начала карты по X
  1018. DispMapY EQU CalcMap+2 ;Смещ. от начала карты по Y
  1019.          LD E,L
  1020.          LD D,0
  1021.          LD L,H
  1022.          LD H,D
  1023.  
  1024. ;Уместный в данном контексте метод
  1025.          XOR A  ;4
  1026.          SRL L  ;8
  1027.          LD H,L ;4
  1028.          RRA    ;4
  1029.          LD L,A ;4 24 такта
  1030.  
  1031.          ADD HL,DE
  1032.          ADD HL,DE
  1033.          LD DE,MAP ;Начало карты
  1034.          ADD HL,DE
  1035.          RET
  1036.  
  1037. CALC0
  1038.         XOR A
  1039.         LD H,A
  1040.         LD L,A
  1041.         LD (PERSON),HL
  1042.         LD (DISTV),HL
  1043.         LD (UNDER+1),A  ;Код вещи под курсором
  1044.         INC A
  1045.         LD (ONHERO),A
  1046. CL0     LD A,(F3+1)
  1047.         AND A
  1048.         JP Z,VNE2       ;стир. назв. вещи
  1049.         RET
  1050.  
  1051. ;Расчет по положен. курсора разных параметров
  1052. CALC
  1053.         CALL SCRLMAP
  1054.         RET C       ;скролим карту
  1055.  
  1056.         CALL DIV16
  1057. CALC1   LD A,(VUS+1)     ;Герой что-то ложит
  1058.         AND A
  1059.         RET NZ
  1060.  
  1061.         LD A,H
  1062.         CP (SCRWD/2)
  1063.         JR NC,CALC0
  1064.  
  1065.         LD E,H
  1066.         LD D,L
  1067.         LD HL,(DispMapX) ;берем смещение от начала карты
  1068.                          ;складываем его с коорд. курсора
  1069.         ADD HL,DE        ;HL=коорд. курсора на игровом поле
  1070.  
  1071.         LD (CURSCRD+1),HL
  1072.         LD A,PG_MAP
  1073.         CALL PAGE
  1074.         PUSH HL
  1075.         PUSH HL
  1076.  
  1077.         RLC L,L
  1078.         SRL H
  1079.         RR L
  1080.         SRL H
  1081.         RR L
  1082.         LD A,MASSIVE/256
  1083.         ADD A,H
  1084.         LD H,A
  1085.  
  1086.         LD A,(HL)    ;элемент под курсором
  1087.         AND A
  1088.         EX AF,AF' ;'
  1089.         LD (ADRELM),HL
  1090.         POP HL
  1091.         CALL CalcMap+3
  1092.         LD (ADRSPRT),HL
  1093.         LD A,(HL)
  1094.         INC HL
  1095.         LD H,(HL)
  1096.         LD L,A
  1097.         LD (SPRCURS+1),HL
  1098.  
  1099.         AND A
  1100.         LD DE,SPR+(151*32)
  1101.         SBC HL,DE
  1102.         JR C,CLC01
  1103.         LD DE,38*32
  1104.         EX DE,HL
  1105.         SBC HL,DE
  1106.         JR C,CLC01
  1107.  
  1108.         EX DE,HL
  1109.         ADD HL,HL         ;A=HL/32
  1110.         ADD HL,HL         ;by Sam Style
  1111.         ADD HL,HL
  1112.         LD A,H
  1113.  
  1114.         INC A
  1115.         CP 39
  1116.         JR C,CLC01+1
  1117. CLC01   XOR A
  1118.         LD (UNDER+1),A  ;Код вещи под курсором
  1119.  
  1120.         LD HL,(HEROCRD) ;H-Y,L-X героя
  1121.         POP DE          ;D-Y,E-X курсора
  1122.         PUSH HL
  1123.  
  1124.         XOR A
  1125.         SBC HL,DE
  1126.         JR Z,CLC10
  1127.         LD A,H
  1128.         DEC A
  1129.         OR L
  1130. CLC10   LD (ONHERO),A   ;Если=0, то курсор на герое
  1131.         POP HL
  1132.         LD BC,#0100
  1133.         LD A,H
  1134.         SUB D
  1135.         LD H,DSTV+2
  1136.         JR NC,CLC1
  1137.         NEG
  1138.         DEC H
  1139. CLC1    CP H;на сколько близко должен наход. курсор к герою
  1140.         JR NC,CLC2
  1141.         INC C
  1142.         CP DSTV+1
  1143.         JR C,CLC2
  1144.         LD D,A
  1145.         LD A,H
  1146.         CP DSTV+2
  1147.         JR NZ,CLC2-1
  1148.         LD C,64 ;можно прим. взять, но не положить
  1149.         LD A,D
  1150. CLC2    CP DSTP+1;персонаж
  1151.         JR C,CLC2_
  1152.         DEC B
  1153. CLC2_   LD A,L
  1154.         SUB E
  1155.         JR NC,CLC3
  1156.         NEG
  1157. CLC3    CP DSTV+1;вещь
  1158.         JR C,CLC4
  1159.         LD C,0
  1160. CLC4    CP DSTP+1
  1161.         JR C,CLC4_
  1162.         LD B,0
  1163.  
  1164. ;Под курсором вещь?
  1165. CLC4_   LD HL,UNDER+1
  1166.         LD A,(HL)
  1167.         AND A
  1168.         JR Z,SPRCURS-1
  1169.         DEC C
  1170.         INC C
  1171.         JR Z,SPRCURS-1
  1172.         SET 7,(HL)
  1173.         XOR A
  1174.  
  1175. SPRCURS LD HL,0  ;код спр. под курсором
  1176.         PUSH HL
  1177.         LD A,L
  1178.         RRA           ;Анимация?
  1179.         JR NC,CLC40   ;Нет
  1180.         AND A
  1181.         JR Z,CLC400   ;это провидец!
  1182.         CP 9
  1183.         JR NC,CLC41   ;эти ан. группы не участв.
  1184.         LD H,A
  1185.         LD L,0
  1186.         JR CLC42_
  1187.  
  1188. CLC40
  1189. ;CY=0!!!
  1190.         LD DE,SPR+(215*32)
  1191.         SBC HL,DE
  1192.         JR C,CLC41
  1193.  
  1194.         LD A,L          ;A=HL/64
  1195.         RLCA
  1196.         RLCA
  1197.         AND 3
  1198.         SLA H
  1199.         SLA H
  1200.         OR H
  1201.  
  1202.         INC A
  1203. CLC400  INC A
  1204.         CP PERS+1       ;кол-во перс.
  1205.         JR C,CLC41+1
  1206. CLC41   XOR A
  1207.         LD L,A
  1208.         LD H,0
  1209.  
  1210. CLC42_  POP DE
  1211.         EX DE,HL
  1212.         LD A,D
  1213.         OR E
  1214.         JR NZ,CLC42     ;предм. уже обнаружен
  1215.  
  1216.         PUSH BC
  1217.         LD BC,SPR+(454*32)
  1218.         SBC HL,BC
  1219.         POP BC
  1220.         JR C,CLC42
  1221.  
  1222.         ADD HL,HL         ;A=HL/32
  1223.         ADD HL,HL
  1224.         ADD HL,HL
  1225.         LD A,H
  1226.  
  1227. ;D=0
  1228.         CP 44
  1229.         JR NC,CLC42
  1230.         INC D
  1231.         CP 36
  1232.         JR NC,CLC41_ ;хмель
  1233.         INC D
  1234.         CP 24
  1235.         JR NC,CLC41_ ;пшеница
  1236.         INC D
  1237.         CP 18
  1238.         JR NC,CLC41_ ;улей
  1239.         INC D
  1240.         CP 16
  1241.         JR NC,CLC41_ ;колодец
  1242.         INC D
  1243.         CP 3
  1244.         JR NC,CLC41_ ;Храм
  1245.         INC D
  1246.         CP 2
  1247.         JR NC,CLC41_ ;Козленок
  1248.         INC D        ;Колодец с живой водой
  1249.  
  1250. CLC41_  LD A,8
  1251.         ADD A,D
  1252.         LD D,A
  1253.  
  1254. CLC42   LD A,(KARM)
  1255.         LD H,A
  1256.         AND A
  1257.         JR Z,CLC45      ;в кармане пусто
  1258.  
  1259.         LD A,(ONHERO)
  1260.         AND A
  1261.         LD A,C
  1262.         JR Z,CLC45+1    ;курсор на герое
  1263.         AND A
  1264.         JR Z,CLC45+1    ;Далеко от героя
  1265.         LD A,E
  1266.         OR D
  1267.         JR NZ,CLC45+1   ;можно выложить/отдать
  1268.         EX AF,AF' ;'       ;элемент 0/1
  1269.         SET 7,C
  1270.         JR Z,CLC45+1    ;только выложить рядом
  1271.         XOR A
  1272. CLC45   LD C,A
  1273.         AND A
  1274.         LD L,B
  1275.         LD B,0
  1276.         JR NZ,CLC48     ;работаем только с вещью
  1277.         LD A,E
  1278.         AND A
  1279.         JR Z,CLC48      ;под курсором не персонаж
  1280.         DEC H           ;в кармане есть
  1281.         INC H
  1282.         JR NZ,CLC48
  1283.         INC B           ;B=1
  1284.                         ;допустимое рассотяние для разговора
  1285.         DEC L           ;L=1?
  1286.         JR Z,CLC48
  1287.         INC B           ;B=2 с этим персонажем можно говорить
  1288.  
  1289. ;C=0 если нет вещи или вещь применять нельзя
  1290. ;C=1 можно выложить/примен./отдать вещь (мигает курсор)
  1291. ;B=0 герой не говорит с персонажем
  1292. ;B=1 герой может говорить с перс.
  1293. ;B=2 факт разговора (персонаж далеко от героя)
  1294.  
  1295. ;E=0 под курсором не персонаж
  1296. ;E=1-PERS+1 код персонажа
  1297. ;D=0 неучаствующий в игр. процессе предмет
  1298. ;D>1 код предмета участвующего в игр. процессе
  1299.  
  1300. CLC48   LD (PERSON),DE
  1301.         LD (DISTV),BC
  1302. CLC48_  NOP
  1303.         LD HL,0
  1304.         LD A,D
  1305.         AND A
  1306.         JR Z,CLC49
  1307.         LD H,PERS
  1308. CLC49   OR E
  1309.         JR Z,UNDER
  1310.         LD L,38     ;смещ. от начала названий вещей
  1311. UNDER   LD A,0      ;код вещи под курсором
  1312.         AND %01111111
  1313.         ADD A,E
  1314.         ADD A,D
  1315.         JP Z,CL0    ;стир. назв. вещи
  1316.         ADD A,L
  1317.         ADD A,H
  1318.         LD B,A
  1319.         JP PRVESH   ;печ. назв. вещи/персонажа
  1320.  
  1321. ;Проверка на манипуляции с вещами/разговорами
  1322. ;OUT:B=0 ничего не делаем
  1323. ;      1 применяем на героя
  1324. ;      2 отдаем персонажу
  1325. ;      3 разговариваем
  1326. ;      4 применяем на объект
  1327. ;      5 выкладываем рядом с героем
  1328. ;      6 берем вещь
  1329. MANAGE
  1330.         LD HL,(DISTV);H-персон. L-предметы
  1331.         LD A,H
  1332.         CP 2
  1333.         LD B,0
  1334.         RET Z
  1335.  
  1336.         INC B   ;1 на героя
  1337.         LD E,-1
  1338.         LD A,(KARM)
  1339.         LD C,A
  1340.         LD A,(ONHERO)
  1341.         ADD A,E
  1342.         SBC A,A
  1343.         INC A
  1344.         ADD A,E
  1345.         SBC A,A
  1346.         AND C
  1347.         JR Z,MAN1
  1348.  
  1349.         LD DE,(PERSON)
  1350.         LD A,(UNDER+1)
  1351.         OR D
  1352.         OR E
  1353.         LD E,-1
  1354.         RET Z
  1355.  
  1356. MAN1    INC B   ;2 отдаем
  1357.         LD A,(PERSON)
  1358.         ADD A,E
  1359.         SBC A,A
  1360.         AND L
  1361.         RET NZ
  1362.  
  1363.         INC B   ;3 говорим
  1364.         LD A,H
  1365.         AND A
  1366.         RET NZ
  1367.  
  1368.         INC B   ;4 примен.
  1369.         LD A,(ITEM)
  1370.         ADD A,E
  1371.         SBC A,A
  1372.         AND L
  1373.         RET NZ
  1374.  
  1375.         INC B   ;5 выклад.
  1376.         LD A,L
  1377.         AND %00111111
  1378.         ADD A,E
  1379.         SBC A,A
  1380.         AND C
  1381.         RET NZ
  1382.  
  1383.         LD B,A
  1384.         LD A,(UNDER+1)
  1385.         RLA ;7-й бит значит, что вещь рядом с героем
  1386.         RET NC
  1387.         DEC C
  1388.         INC C
  1389.         RET NZ
  1390.         LD B,6  ;6 берем
  1391.         RET
  1392.  
  1393. ;Установка цвета фона игрового экрана
  1394. FONE
  1395.        if EGA
  1396. ;FNLP
  1397.         ;jr $
  1398.        ex af,af' ;'
  1399.        push af
  1400.         ld a,(COLOUR)
  1401.         ld b,a
  1402.         ld de,verapalevening ;if 0
  1403.         djnz $+5
  1404.         ld de,verapalnight ;if 1
  1405.         djnz $+5
  1406.         ld de,verapaldawn ;if 2
  1407.         djnz $+5
  1408.         ld de,verapalday ;if 3
  1409.         OS_SETPAL
  1410.        pop af
  1411.        ex af,af' ;'
  1412.         ret
  1413. FNLPm1=$+1
  1414.         LD E,SCRHG ;высота
  1415. FNLPp1=$+1
  1416.         LD C,8
  1417. FNLPp3=$+1
  1418.         LD B,SCRWD ;ширина
  1419.        else
  1420.         LD A,(COLOUR)
  1421.         LD HL,#5800+#8000
  1422. FNLPm1=$+1
  1423.         LD E,SCRHG ;высота
  1424. FNLP
  1425. FNLPp1=$+1
  1426.         LD C,8
  1427. FNLPp2
  1428. FNLPp3=$+1
  1429.         LD B,SCRWD ;ширина
  1430.         LD (HL),A
  1431.         INC L
  1432.         DJNZ $-2
  1433.         ADD HL,BC
  1434.         DEC E
  1435.         JR NZ,FNLPp2
  1436.         RET
  1437.        endif
  1438.        
  1439. ;4.12.2004
  1440. ;Скроллирование спрайта дня и ночи
  1441. N_WGHT  EQU 19 ;ширина спрайта
  1442.  
  1443. DAY_NGT
  1444.         RET ;patch
  1445.         LD A,201
  1446.         LD (DAY_NGT),A
  1447.        if EGA
  1448.         call prsprhud
  1449.        else
  1450. ;      LD A,PG_VIEW
  1451.         CALL PAGE_PG_VIEW
  1452.         LD HL,NG+N_WGHT-1
  1453.         LD DE,N_WGHT
  1454.         LD C,32       ;высота в пикселях
  1455. NG_SCR2 LD B,N_WGHT
  1456.         AND A
  1457.         PUSH HL
  1458. NG_SCRL LD A,(HL)
  1459.         ADC A,A
  1460.         LD (HL),A
  1461.         DEC HL
  1462.         DJNZ NG_SCRL
  1463.         POP HL
  1464.         LD A,B
  1465.         ADC A,A
  1466.         OR (HL)
  1467.         LD (HL),A
  1468.         ADD HL,DE
  1469.         DEC C
  1470.         JR NZ,NG_SCR2
  1471.  
  1472. ;Накладывание маски на спрайт дня и ночи
  1473.         LD IX,REZULT  ;где создать результат
  1474.         LD DE,NG      ;спрайт дня
  1475.         LD HL,NG_MASK ;маска
  1476.  
  1477.         LD C,N_WGHT-6
  1478.         LD A,32
  1479. NGHT_LP EX AF,AF' ;'
  1480.         LD B,6
  1481. NGLP    LD A,(DE)
  1482.         AND (HL)
  1483.         INC HL
  1484.         OR (HL)
  1485.         INC HL,DE
  1486.         LD (IX),A
  1487.         INC IX
  1488.         DJNZ NGLP
  1489.         EX DE,HL
  1490.         ADD HL,BC
  1491.         EX DE,HL
  1492.         EX AF,AF' ;'
  1493.         DEC A
  1494.         JR NZ,NGHT_LP
  1495.        endif
  1496.  
  1497. ;B-атрибут
  1498.         LD A,(SUTKI)
  1499.         INC A
  1500.        if EGA
  1501.         ld b,0
  1502.        else
  1503.         LD B,5*8 ;  вечер, цвет фона
  1504.        endif
  1505.         CP 38    ;четверть суток
  1506.         JR Z,SUT1
  1507.        if EGA
  1508.         inc b
  1509.        else
  1510.         LD B,8+64   ;ночь
  1511.        endif
  1512.         CP 38*2
  1513.         JR Z,SUT1
  1514.        if EGA
  1515.         inc b
  1516.        else
  1517.         LD B,6*8    ;утро
  1518.        endif
  1519.         CP 38*3
  1520.         JR Z,SUT1
  1521.        if EGA
  1522.         inc b
  1523.        else
  1524.         LD B,7*8+64 ;день
  1525.        endif
  1526.         CP 38*4
  1527.         JR NZ,SUT2
  1528.         XOR A
  1529.         LD (MUSNUM),A
  1530. SUT1    EX AF,AF' ;'
  1531.         CALL MUSNXT2
  1532.         LD A,B
  1533.         LD (COLOUR),A
  1534.         CALL FONE
  1535.         EX AF,AF' ;'
  1536. SUT2    LD (SUTKI),A
  1537.         XOR A
  1538.         JP setDAYS_a;D_SP+5
  1539.  
  1540.        if EGA
  1541. prsprhud
  1542. ;TODO печатать всегда теневой экран! и вызывать независимо (т.е. будет два вызова на соседних кадрах)
  1543.        ;halt
  1544.        display "prsprhud=",prsprhud
  1545.        ;di
  1546.        ld a,55
  1547.        ld (im_arroff),a
  1548.        call ARROFF
  1549.         ld a,(daynightphase)
  1550.         inc a
  1551.         cp 152
  1552.         jr nz,$+3
  1553.         xor a
  1554.         ld (daynightphase),a
  1555.         call setpgsscr40008000 ;visible
  1556.         call prsprhud_onescreen
  1557.        call ARRON
  1558.        ld a,55+128 ;"or a"
  1559.        ld (im_arroff),a
  1560.        ;ei
  1561.         call setpgsscr40008000_current ;shadow
  1562.         ld a,55 ;"scf"
  1563.         ld (wasdrawimg),a
  1564.         call prsprhud_onescreen
  1565.         jp setpgsmain40008000
  1566. prsprhud_onescreen
  1567.         ld a,PGDAYNIGHT
  1568.         call setpg
  1569.         ld hl,(daynightphase)
  1570.         srl l
  1571.         ld de,0xc000
  1572.         jr c,$+5
  1573.         ld de,0xc000+(200*32/2)
  1574.         ld h,0
  1575.         add hl,hl
  1576.         add hl,hl
  1577.         add hl,hl
  1578.         add hl,hl
  1579.         add hl,hl ;*32
  1580.         add hl,de
  1581.         ex de,hl
  1582.         ld hl,scrbase+(40*136)+(200/8)
  1583.         ld bc,0x2018
  1584. ;b=hgt,c=wid (/2)
  1585. ;de=gfx
  1586. ;hl=scr
  1587.         call primgega0
  1588.         ld a,PGHUD
  1589.         call setpg
  1590.         ld iy,hudspr
  1591.         ld e,200/2+sprmaxwid-1
  1592.         ld c,136
  1593. ;в 4000,8000 уже включен экран (setpgsscr40008000)
  1594. ;iy=sprite data+2 = spraddr+4
  1595. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1596. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1597. ;(iy-3)=sprhgt
  1598. ;(iy-4)=sprwid
  1599.         jp prspr
  1600.        endif
  1601.  
  1602. ;Восстанавливаем карту после заливки
  1603. CLMAP
  1604.         LD (CLR_MAPp1),A
  1605.         LD A,PG_MAP
  1606.         CALL PAGE
  1607.         LD HL,MASSIVE ;должен быть ровным адресом
  1608.         LD BC,#1000 ;длина карты
  1609. wav_1   LD A,(HL)
  1610.         DEC A
  1611.         JR Z,wav_2
  1612.         LD (HL),C
  1613. wav_2   INC L
  1614.         JR NZ,wav_1
  1615.         INC H
  1616.         DJNZ wav_1
  1617.         RET
  1618.  
  1619. NEW_CRD DW 0
  1620.  
  1621. ;Перекидываем теневой экран на основной
  1622. ;Теневым у нас является стандарный экран #4000
  1623. ;Основным - второй экран в 7-й стр.
  1624. ;Формат теневого экрана линейный, но не совсем
  1625. ;Его размер определяется по формуле:
  1626. ;SCRHG*32*8, не смотря на то,
  1627. ;что активная часть задается переменной SCRWD (ширина)
  1628. ;Это сделано для более простых расчетов
  1629. MOVE
  1630.  
  1631.        if EGA
  1632. ;TODO swapscr
  1633.         ret
  1634.        endif
  1635.  
  1636.  
  1637. ;       LD A,PG_VIEW
  1638.         CALL PAGE_PG_VIEW
  1639.  
  1640. OLD_CRD LD DE,0   ;Предыдущие координаты курсора.
  1641.                   ;Запоминаются во вторых прерываниях
  1642.         CALL ARRONS+4
  1643.         LD HL,BUSY+1
  1644.         PUSH HL
  1645.         INC (HL)
  1646.         LD HL,SHADSCR ;теневой экран
  1647.         LD DE,SCR     ;основной экран
  1648.  
  1649. ;0-обновлять весь экран или 1-только отдельные тайлы
  1650. TILED   LD A,0
  1651.         DEC A
  1652.         JP Z,MOVE2
  1653.         INC A
  1654.         JR Z,MVEND
  1655.  
  1656. HMOVEp1=$+1
  1657.         LD C,SCRHG    ;высота видимой части карты/8
  1658. PRSHAD0 LD B,4
  1659. PRSHAD1 PUSH BC
  1660.  
  1661.         DUP SCRWD-1   ;ширина видимой части карты
  1662.         LDI
  1663.         EDUP
  1664.  
  1665.         LD A,(HL)
  1666.         LD (DE),A
  1667.         INC D
  1668.         SET 5,L
  1669.  
  1670.         DUP SCRWD-1
  1671.         LDD
  1672.         EDUP
  1673.  
  1674.         LD A,(HL)
  1675.         LD (DE),A
  1676.         INC D
  1677.  
  1678.         LD BC,32
  1679.         ADD HL,BC
  1680.         POP BC
  1681.         DJNZ PRSHAD1
  1682.  
  1683.         LD A,E
  1684.         ADD A,32
  1685.         LD E,A
  1686.         JR C,$+6
  1687.         LD A,D
  1688.         SUB 8
  1689.         LD D,A
  1690.         DEC C
  1691.         JR NZ,PRSHAD0
  1692. MVEND   POP HL
  1693.         LD (HL),0
  1694.         JP ARROFFS
  1695.  
  1696. ;Вывод только тех тайлов,
  1697. ;которые изменились на теневом экране
  1698. MOVE2
  1699.        if EGA
  1700.         ret ;TODO swapscr
  1701.        endif
  1702.         LD HL,A_TILE ;список изм. тайлов (адреса)
  1703.         LD BC,#FF21
  1704.  
  1705. MV2     LD E,(HL)
  1706.         INC E
  1707.         JR Z,MVEND
  1708.  
  1709.         DEC E
  1710.         INC HL
  1711.         LD D,(HL)
  1712.         INC HL
  1713.         PUSH HL
  1714.  
  1715.         LD H,E
  1716.         LD A,D
  1717.         SUB #40
  1718.         LD L,A
  1719.  
  1720. ;Коорд. в знак. преобразуем в адрес экрана
  1721. ;H-X L-Y
  1722.         LD A,L
  1723.         AND 7
  1724.         RRCA
  1725.         RRCA
  1726.         RRCA
  1727.         ADD A,H
  1728.         LD H,L
  1729.         LD L,A
  1730.         LD A,H
  1731.         AND #18
  1732.         OR SCR/256
  1733.         LD H,A
  1734.  
  1735.         EX DE,HL
  1736.  
  1737.        DUP 8
  1738.         LDI
  1739.         LD A,(HL)
  1740.         LD (DE),A
  1741.         INC H
  1742.         LD A,E
  1743.         ADD A,C
  1744.         LD E,A
  1745.         LDD
  1746.         INC C
  1747.         LD A,(HL)
  1748.         LD (DE),A
  1749.         ADD HL,BC
  1750.         LD A,E
  1751.         SUB C
  1752.         LD E,A
  1753.         INC D
  1754.         INC C
  1755.        EDUP
  1756.  
  1757.         POP HL
  1758.         JP MV2
  1759.  
  1760. ;IN  A-направление
  1761. ;OUT BC-приращение координат в завис. от направления
  1762. NAPR    LD HL,DIR_TAB
  1763.         ADD A,A
  1764.         ADD A,L
  1765.         LD L,A
  1766.         ADC A,H
  1767.         SUB L
  1768.         LD H,A
  1769.         LD C,(HL)
  1770.         INC HL
  1771.         LD B,(HL)
  1772.         RET
  1773.  
  1774. ;Таблица направлений героя
  1775. DIR_TAB DW #FFFF ; 0 вправо-вниз
  1776.         DW #00FF ; 1 вправо
  1777.         DW #01FF ; 2 вправо-вверх
  1778.         DW #FF00 ; 3 вниз
  1779.         DW #0100 ; 4 вверх
  1780.         DW #FF01 ; 5 влево-вниз
  1781.         DW #0001 ; 6 влево
  1782.         DW #0101 ; 7 влево-вверх
  1783.  
  1784. ;Вывод кнопки ">" окна диалога
  1785. WKEYS
  1786.         LD HL,FMCNT
  1787.         DEC (HL)
  1788.         RET NZ
  1789.         LD (HL),FRM/2
  1790.        if EGA
  1791.         push af
  1792. ;рисуем на двух экранах, как PR64
  1793. curhudarrnext=$+1
  1794.         ld de,hudarrnext0
  1795.         ld hl,0xffff&(hudarrnext0+hudarrnext1)
  1796.         or a
  1797.         sbc hl,de
  1798.         ld (curhudarrnext),hl
  1799.         ex de,hl
  1800.         ld hl,scrbase+(136*40)+22
  1801.         ld a,PGHUD
  1802.         call setpg
  1803.         ld bc,0x0804
  1804. ;b=hgt,c=wid (/2)
  1805. ;de=gfx
  1806. ;hl=scr
  1807.         ;ld a,55 ;"scf"
  1808.         ;ld (wasdrawimg),a ;не надо, т.к. мы в прерывании
  1809.         call primgega
  1810.         pop af
  1811.         ret
  1812.        else
  1813.         EXA
  1814.         LD HL,WIN_SPR+480
  1815.         LD A,8
  1816.         XOR 8
  1817.         LD ($-1),A
  1818.         ADD A,L
  1819.         LD L,A
  1820.         LD DE,#5036+#8000
  1821.         DUP 7
  1822.         LD A,(HL)
  1823.         LD (DE),A
  1824.         INC HL
  1825.         INC D
  1826.         EDUP
  1827.         LD A,(HL)
  1828.         LD (DE),A
  1829.         EXA
  1830.         RET
  1831.        endif        
  1832.  
  1833. ;Спрайты героя
  1834. ;48 спрайтов по 128 б
  1835. Vr1     EQU hero;#C000
  1836. Vr2     EQU Vr1+#0080
  1837. Vr3     EQU Vr1+#0100
  1838. Vl1     EQU Vr1+#0180
  1839. Vl2     EQU Vr1+#0200
  1840. Vl3     EQU Vr1+#0280
  1841. Vu1     EQU Vr1+#0300
  1842. Vu2     EQU Vr1+#0380
  1843. Vu3     EQU Vr1+#0400
  1844. Vd1     EQU Vr1+#0480
  1845. Vd2     EQU Vr1+#0500
  1846. Vd3     EQU Vr1+#0580
  1847. Vru1    EQU Vr1+#0600
  1848. Vru2    EQU Vr1+#0680
  1849. Vru3    EQU Vr1+#0700
  1850. Vrd1    EQU Vr1+#0780
  1851. Vrd2    EQU Vr1+#0800
  1852. Vrd3    EQU Vr1+#0880
  1853. Vlu1    EQU Vr1+#0900
  1854. Vlu2    EQU Vr1+#0980
  1855. Vlu3    EQU Vr1+#0A00
  1856. Vld1    EQU Vr1+#0A80
  1857. Vld2    EQU Vr1+#0B00
  1858. Vld3    EQU Vr1+#0B80
  1859. VTr1    EQU Vr1+#0C00
  1860. VTr2    EQU Vr1+#0C80
  1861. VTr3    EQU Vr1+#0D00
  1862. VTl1    EQU Vr1+#0D80
  1863. VTl2    EQU Vr1+#0E00
  1864. VTl3    EQU Vr1+#0E80
  1865. VTu1    EQU Vr1+#0F00
  1866. VTu2    EQU Vr1+#0F80
  1867. VTu3    EQU Vr1+#1000
  1868. VTd1    EQU Vr1+#1080
  1869. VTd2    EQU Vr1+#1100
  1870. VTd3    EQU Vr1+#1180
  1871. VTru1   EQU Vr1+#1200
  1872. VTru2   EQU Vr1+#1280
  1873. VTru3   EQU Vr1+#1300
  1874. VTrd1   EQU Vr1+#1380
  1875. VTrd2   EQU Vr1+#1400
  1876. VTrd3   EQU Vr1+#1480
  1877. VTlu1   EQU Vr1+#1500
  1878. VTlu2   EQU Vr1+#1580
  1879. VTlu3   EQU Vr1+#1600
  1880. VTld1   EQU Vr1+#1680
  1881. VTld2   EQU Vr1+#1700
  1882. VTld3   EQU Vr1+#1780
  1883.  
  1884. ;Ссылки на спрайты
  1885. ;Очередность спрайтов зависит от направления
  1886. ;героя и процедуры расчета группы спрайтов по этому направлению
  1887.  
  1888. ;Перемещение героя (очередность спрайтов)
  1889. VeraTab
  1890. R_down  DB 3
  1891.         DW Vrd1,Vrd2,Vrd1,Vrd3
  1892. Right   DB 2
  1893.         DW Vr1,Vr2,Vr1,Vr3
  1894. R_up    DB 1
  1895.         DW Vru3,Vru1,Vru2,Vru1
  1896. Down    DB 4
  1897.         DW Vd2,Vd1,Vd3,Vd1
  1898. Up      DB 0
  1899.         DW Vu2,Vu1,Vu3,Vu1
  1900. L_down  DB 5
  1901.         DW Vld1,Vld2,Vld1,Vld3
  1902. Left    DB 6
  1903.         DW Vl1,Vl2,Vl1,Vl3
  1904. L_up    DB 7
  1905.         DW Vlu1,Vlu2,Vlu1,Vlu3
  1906.  
  1907. ;Взятие предмета
  1908. VeraTab2
  1909. TUp     DW VTu1,VTu2,VTu3,VTu2,VTu1,Vu1
  1910. TR_up   DW VTru1,VTru2,VTru3,VTru2,VTru1,Vru1
  1911. TRight  DW VTr1,VTr2,VTr3,VTr2,VTr1,Vr1
  1912. TR_down DW VTrd1,VTrd2,VTrd3,VTrd2,VTrd1,Vrd1
  1913. TDown   DW VTd1,VTd2,VTd3,VTd2,VTd1,Vd1
  1914. TL_down DW VTld1,VTld2,VTld3,VTld2,VTld1,Vld1
  1915. TLeft   DW VTl1,VTl2,VTl3,VTl2,VTl1,Vl1
  1916. TL_up   DW VTlu1,VTlu2,VTlu3,VTlu2,VTlu1,Vlu1
  1917.  
  1918. RotTabl DW Vu1,Vru1,Vr1,Vrd1,Vd1,Vld1,Vl1,Vlu1
  1919.