?login_element?

Subversion Repositories NedoOS

Rev

Rev 917 | Rev 971 | Go to most recent revision | 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.         push de
  726.         push hl
  727.         call PAGE_PG_VIEW
  728.         call setpgsscr40008000_current
  729.         call PR64_onescreen
  730.         pop hl
  731.         pop de
  732.         call setpgsscr40008000
  733. PR64_onescreen
  734.         PUSH HL
  735.         ld a,h ;x
  736.         ld h,0
  737.         ld b,h
  738.         ld c,l
  739.         add hl,hl
  740.         add hl,hl
  741.         add hl,bc ;*5
  742.         add hl,hl
  743.         add hl,hl
  744.         add hl,hl ;*40
  745.         add hl,hl
  746.         add hl,hl
  747.         add hl,hl ;*40*8
  748.         ld b,0x40
  749.         rra
  750.         ;jr nc,$+4
  751.         ;ld b,0x60
  752.         ld c,a
  753.         rla
  754.         dup scrbase&0xff
  755.         inc c
  756.         edup
  757.         add hl,bc
  758.         ld b,a ;x
  759.  
  760. PR64LP  LD A,(DE)
  761.         AND A  ;Конец текста?
  762.         jr z,PR64q
  763.         CP #0D ;13
  764.         JR NZ,PR64LP2
  765.         POP HL
  766.         INC L
  767.         INC DE
  768.         JR PR64
  769. PR64q
  770.         POP HL
  771.         jp setpgsmain40008000
  772. PR64LP2
  773.         PUSH HL
  774.         PUSH DE
  775.         LD E,A
  776.         LD D,FNT/256
  777. ;Расчет половинки байта
  778. ;Все зависит от четной или
  779. ;нечетной текущей координаты X
  780.         inc b
  781.         LD A,B
  782.         EX AF,AF' ;'
  783.  
  784.         push hl
  785.         ;push ix
  786.         push iy
  787.        
  788.         bit 0,b
  789.         jr nz,$+4
  790.         set 5,h
  791.        
  792.         ld hy,8
  793.         ;ld ix,0x3fc9
  794. ;lx=background color %33210210
  795. ;hx=color %33210210
  796. ;de=font char
  797. ;hl=screen
  798. prchar48ega_hxoncolor0
  799.         ld b,hx
  800.         ld a,(de)
  801.         ld c,a
  802.         ld a,lx
  803.         rl c
  804.         jr nc,$+2+4
  805.          xor b
  806.          and 0xb8;%10111000
  807.          xor b
  808.         rl c
  809.         jr nc,$+2+4
  810.          xor b
  811.          and 0x47;%01000111
  812.          xor b
  813.         ld (hl),a
  814.         ld a,h
  815.         add a,0x40
  816.         ld h,a
  817.         ld a,lx
  818.         rl c
  819.         jr nc,$+2+4
  820.          xor b
  821.          and 0xb8;%10111000
  822.          xor b
  823.         rl c
  824.         jr nc,$+2+4
  825.          xor b
  826.          and 0x47;%01000111
  827.          xor b
  828.         ld (hl),a
  829.         inc d
  830.         ld bc,+(40-0x4000)
  831.         add hl,bc
  832.         dec hy
  833.         jp nz,prchar48ega_hxoncolor0
  834.         pop iy
  835.         ;pop ix
  836.         pop hl
  837.  
  838.         POP DE
  839.         POP HL
  840.         INC DE
  841.  
  842.         EX AF,AF' ;'
  843.         LD B,A
  844.         rra
  845.         JP C,PR64LP
  846.         INC L
  847.         JP PR64LP
  848.         ret
  849.        else
  850. ;6912
  851. ;Печать строки (конец печати - 0, перевод строки - 13)
  852. ;HL-координаты
  853. ;H-X (0-63), L-Y (0-23)
  854. ;DE-адрес текста
  855. PR64
  856.         PUSH HL
  857.         LD A,L ;расчет адреса в экране
  858.         LD B,H
  859.  
  860.         AND 7
  861.         RRCA
  862.         RRCA
  863.         RRCA
  864.  
  865.         SRL H
  866.         ADD A,H
  867.         LD H,A
  868.  
  869.         LD A,L
  870.         AND #18
  871.         OR SCR/256 ;#C0
  872.         LD L,H
  873.         LD H,A
  874.  
  875. PR64LP  LD A,(DE)
  876.         AND A  ;Конец текста?
  877.         JR NZ,$+4
  878.         POP HL
  879.         RET
  880.         CP #0D ;13
  881.         JR NZ,PR64LP2
  882.         POP HL
  883.         INC L
  884.         INC DE
  885.         JR PR64
  886.  
  887. PR64LP2 PUSH HL
  888.         PUSH DE
  889.         LD E,A
  890.         LD D,FNT/256
  891.  
  892. ;Расчет из какой половинки байта брать
  893. ;спрайт буквы. Все зависит от четной или
  894. ;нечетной текущей координаты X
  895.         LD A,B
  896.         INC B
  897.         RRA
  898.         SBC A,A
  899.         XOR %11110000
  900.         LD C,A
  901.  
  902.         LD A,B
  903.  
  904.         EX AF,AF' ;'
  905.  
  906.         LD B,8
  907. PR64LOP LD A,(DE)
  908.         XOR (HL)
  909.         AND C
  910.         XOR (HL)
  911.         LD (HL),A
  912.         INC H
  913.         INC D
  914.         DJNZ PR64LOP
  915.  
  916.         POP DE
  917.         POP HL
  918.         INC DE
  919.  
  920.         EX AF,AF' ;'
  921.         LD B,A
  922.         JP M,PR64LP
  923.         INC L
  924.         JP PR64LP
  925.        endif
  926.  
  927. ;MATH
  928. HL72
  929.         DUP 3
  930.         ADD HL,HL
  931.         EDUP
  932.         LD B,H
  933.         LD C,L
  934.         DUP 3
  935.         ADD HL,HL
  936.         EDUP
  937.         ADD HL,BC    ;HL=HL*72
  938.        if EGA
  939.         add hl,hl
  940.         add hl,hl
  941.         ld bc,0xc000
  942.         add hl,bc
  943.        else
  944.         LD BC,SPR33
  945.         ADD HL,BC
  946.        endif
  947.         RET
  948.  
  949. ;b=A/24
  950. DIV24   LD BC,#0018
  951. DIV24_0
  952.         SUB C
  953.         RET C
  954.         INC B
  955.         JR DIV24_0
  956.  
  957. ;На выходе в А ПСЧ
  958. RND     LD A,0
  959.         LD B,A
  960.         ADD A,A
  961.         ADD A,A
  962.         ADD A,B
  963.         INC A
  964.         LD (RND+1),A
  965.         RET
  966.  
  967. ;На выходе в А ПСЧ
  968. RND2    PUSH HL
  969. RND1    LD HL,0
  970.         INC HL
  971.         LD A,H
  972.         AND #3F
  973.         LD H,A
  974.         LD (RND1+1),HL
  975.         LD A,R
  976.         XOR (HL)
  977.         POP HL
  978.         RET
  979.  
  980. ;Из координат адрес в атрибутах
  981. ;H-X, L-Y
  982. ATRADR LD A,H
  983.         ADD HL,HL
  984.         ADD HL,HL
  985.         ADD HL,HL
  986.         LD H,#36 ;если экран с #C000
  987.                  ;#16, если с #4000
  988.         ADD HL,HL
  989.         ADD HL,HL
  990.         ADD A,L
  991.         LD L,A
  992.         RET
  993.  
  994. ;IN:   A-номер вещи
  995. ;OUT: BC-адрес свойств вещи
  996. SVOYST
  997.         LD HL,VSVOY
  998.         ADD A,A
  999.         LD C,A
  1000.         LD B,0
  1001.         ADD HL,BC
  1002.         LD C,(HL)
  1003.         INC HL
  1004.         LD B,(HL)
  1005.         RET
  1006.  
  1007. ;Расчет по смещению от начала карты
  1008. ;(лев. верх. угол) адреса элементов из которых состоит карта
  1009. ;Карта - двумерный массив 64*64 двубайтных элементов
  1010. ;IN:  None
  1011. ;OUT: HL-адрес элемента в массиве карты
  1012. CalcMap
  1013.          LD HL,#3400 ;H-Y, L-X
  1014. DispMapX EQU CalcMap+1 ;Смещ. от начала карты по X
  1015. DispMapY EQU CalcMap+2 ;Смещ. от начала карты по Y
  1016.          LD E,L
  1017.          LD D,0
  1018.          LD L,H
  1019.          LD H,D
  1020.  
  1021. ;Уместный в данном контексте метод
  1022.          XOR A  ;4
  1023.          SRL L  ;8
  1024.          LD H,L ;4
  1025.          RRA    ;4
  1026.          LD L,A ;4 24 такта
  1027.  
  1028.          ADD HL,DE
  1029.          ADD HL,DE
  1030.          LD DE,MAP ;Начало карты
  1031.          ADD HL,DE
  1032.          RET
  1033.  
  1034. CALC0
  1035.         XOR A
  1036.         LD H,A
  1037.         LD L,A
  1038.         LD (PERSON),HL
  1039.         LD (DISTV),HL
  1040.         LD (UNDER+1),A  ;Код вещи под курсором
  1041.         INC A
  1042.         LD (ONHERO),A
  1043. CL0     LD A,(F3+1)
  1044.         AND A
  1045.         JP Z,VNE2       ;стир. назв. вещи
  1046.         RET
  1047.  
  1048. ;Расчет по положен. курсора разных параметров
  1049. CALC
  1050.         CALL SCRLMAP
  1051.         RET C       ;скролим карту
  1052.  
  1053.         CALL DIV16
  1054. CALC1   LD A,(VUS+1)     ;Герой что-то ложит
  1055.         AND A
  1056.         RET NZ
  1057.  
  1058.         LD A,H
  1059.         CP (SCRWD/2)
  1060.         JR NC,CALC0
  1061.  
  1062.         LD E,H
  1063.         LD D,L
  1064.         LD HL,(DispMapX) ;берем смещение от начала карты
  1065.                          ;складываем его с коорд. курсора
  1066.         ADD HL,DE        ;HL=коорд. курсора на игровом поле
  1067.  
  1068.         LD (CURSCRD+1),HL
  1069.         LD A,PG_MAP
  1070.         CALL PAGE
  1071.         PUSH HL
  1072.         PUSH HL
  1073.  
  1074.         RLC L,L
  1075.         SRL H
  1076.         RR L
  1077.         SRL H
  1078.         RR L
  1079.         LD A,MASSIVE/256
  1080.         ADD A,H
  1081.         LD H,A
  1082.  
  1083.         LD A,(HL)    ;элемент под курсором
  1084.         AND A
  1085.         EX AF,AF' ;'
  1086.         LD (ADRELM),HL
  1087.         POP HL
  1088.         CALL CalcMap+3
  1089.         LD (ADRSPRT),HL
  1090.         LD A,(HL)
  1091.         INC HL
  1092.         LD H,(HL)
  1093.         LD L,A
  1094.         LD (SPRCURS+1),HL
  1095.  
  1096.         AND A
  1097.         LD DE,SPR+(151*32)
  1098.         SBC HL,DE
  1099.         JR C,CLC01
  1100.         LD DE,38*32
  1101.         EX DE,HL
  1102.         SBC HL,DE
  1103.         JR C,CLC01
  1104.  
  1105.         EX DE,HL
  1106.         ADD HL,HL         ;A=HL/32
  1107.         ADD HL,HL         ;by Sam Style
  1108.         ADD HL,HL
  1109.         LD A,H
  1110.  
  1111.         INC A
  1112.         CP 39
  1113.         JR C,CLC01+1
  1114. CLC01   XOR A
  1115.         LD (UNDER+1),A  ;Код вещи под курсором
  1116.  
  1117.         LD HL,(HEROCRD) ;H-Y,L-X героя
  1118.         POP DE          ;D-Y,E-X курсора
  1119.         PUSH HL
  1120.  
  1121.         XOR A
  1122.         SBC HL,DE
  1123.         JR Z,CLC10
  1124.         LD A,H
  1125.         DEC A
  1126.         OR L
  1127. CLC10   LD (ONHERO),A   ;Если=0, то курсор на герое
  1128.         POP HL
  1129.         LD BC,#0100
  1130.         LD A,H
  1131.         SUB D
  1132.         LD H,DSTV+2
  1133.         JR NC,CLC1
  1134.         NEG
  1135.         DEC H
  1136. CLC1    CP H;на сколько близко должен наход. курсор к герою
  1137.         JR NC,CLC2
  1138.         INC C
  1139.         CP DSTV+1
  1140.         JR C,CLC2
  1141.         LD D,A
  1142.         LD A,H
  1143.         CP DSTV+2
  1144.         JR NZ,CLC2-1
  1145.         LD C,64 ;можно прим. взять, но не положить
  1146.         LD A,D
  1147. CLC2    CP DSTP+1;персонаж
  1148.         JR C,CLC2_
  1149.         DEC B
  1150. CLC2_   LD A,L
  1151.         SUB E
  1152.         JR NC,CLC3
  1153.         NEG
  1154. CLC3    CP DSTV+1;вещь
  1155.         JR C,CLC4
  1156.         LD C,0
  1157. CLC4    CP DSTP+1
  1158.         JR C,CLC4_
  1159.         LD B,0
  1160.  
  1161. ;Под курсором вещь?
  1162. CLC4_   LD HL,UNDER+1
  1163.         LD A,(HL)
  1164.         AND A
  1165.         JR Z,SPRCURS-1
  1166.         DEC C
  1167.         INC C
  1168.         JR Z,SPRCURS-1
  1169.         SET 7,(HL)
  1170.         XOR A
  1171.  
  1172. SPRCURS LD HL,0  ;код спр. под курсором
  1173.         PUSH HL
  1174.         LD A,L
  1175.         RRA           ;Анимация?
  1176.         JR NC,CLC40   ;Нет
  1177.         AND A
  1178.         JR Z,CLC400   ;это провидец!
  1179.         CP 9
  1180.         JR NC,CLC41   ;эти ан. группы не участв.
  1181.         LD H,A
  1182.         LD L,0
  1183.         JR CLC42_
  1184.  
  1185. CLC40
  1186. ;CY=0!!!
  1187.         LD DE,SPR+(215*32)
  1188.         SBC HL,DE
  1189.         JR C,CLC41
  1190.  
  1191.         LD A,L          ;A=HL/64
  1192.         RLCA
  1193.         RLCA
  1194.         AND 3
  1195.         SLA H
  1196.         SLA H
  1197.         OR H
  1198.  
  1199.         INC A
  1200. CLC400  INC A
  1201.         CP PERS+1       ;кол-во перс.
  1202.         JR C,CLC41+1
  1203. CLC41   XOR A
  1204.         LD L,A
  1205.         LD H,0
  1206.  
  1207. CLC42_  POP DE
  1208.         EX DE,HL
  1209.         LD A,D
  1210.         OR E
  1211.         JR NZ,CLC42     ;предм. уже обнаружен
  1212.  
  1213.         PUSH BC
  1214.         LD BC,SPR+(454*32)
  1215.         SBC HL,BC
  1216.         POP BC
  1217.         JR C,CLC42
  1218.  
  1219.         ADD HL,HL         ;A=HL/32
  1220.         ADD HL,HL
  1221.         ADD HL,HL
  1222.         LD A,H
  1223.  
  1224. ;D=0
  1225.         CP 44
  1226.         JR NC,CLC42
  1227.         INC D
  1228.         CP 36
  1229.         JR NC,CLC41_ ;хмель
  1230.         INC D
  1231.         CP 24
  1232.         JR NC,CLC41_ ;пшеница
  1233.         INC D
  1234.         CP 18
  1235.         JR NC,CLC41_ ;улей
  1236.         INC D
  1237.         CP 16
  1238.         JR NC,CLC41_ ;колодец
  1239.         INC D
  1240.         CP 3
  1241.         JR NC,CLC41_ ;Храм
  1242.         INC D
  1243.         CP 2
  1244.         JR NC,CLC41_ ;Козленок
  1245.         INC D        ;Колодец с живой водой
  1246.  
  1247. CLC41_  LD A,8
  1248.         ADD A,D
  1249.         LD D,A
  1250.  
  1251. CLC42   LD A,(KARM)
  1252.         LD H,A
  1253.         AND A
  1254.         JR Z,CLC45      ;в кармане пусто
  1255.  
  1256.         LD A,(ONHERO)
  1257.         AND A
  1258.         LD A,C
  1259.         JR Z,CLC45+1    ;курсор на герое
  1260.         AND A
  1261.         JR Z,CLC45+1    ;Далеко от героя
  1262.         LD A,E
  1263.         OR D
  1264.         JR NZ,CLC45+1   ;можно выложить/отдать
  1265.         EX AF,AF' ;'       ;элемент 0/1
  1266.         SET 7,C
  1267.         JR Z,CLC45+1    ;только выложить рядом
  1268.         XOR A
  1269. CLC45   LD C,A
  1270.         AND A
  1271.         LD L,B
  1272.         LD B,0
  1273.         JR NZ,CLC48     ;работаем только с вещью
  1274.         LD A,E
  1275.         AND A
  1276.         JR Z,CLC48      ;под курсором не персонаж
  1277.         DEC H           ;в кармане есть
  1278.         INC H
  1279.         JR NZ,CLC48
  1280.         INC B           ;B=1
  1281.                         ;допустимое рассотяние для разговора
  1282.         DEC L           ;L=1?
  1283.         JR Z,CLC48
  1284.         INC B           ;B=2 с этим персонажем можно говорить
  1285.  
  1286. ;C=0 если нет вещи или вещь применять нельзя
  1287. ;C=1 можно выложить/примен./отдать вещь (мигает курсор)
  1288. ;B=0 герой не говорит с персонажем
  1289. ;B=1 герой может говорить с перс.
  1290. ;B=2 факт разговора (персонаж далеко от героя)
  1291.  
  1292. ;E=0 под курсором не персонаж
  1293. ;E=1-PERS+1 код персонажа
  1294. ;D=0 неучаствующий в игр. процессе предмет
  1295. ;D>1 код предмета участвующего в игр. процессе
  1296.  
  1297. CLC48   LD (PERSON),DE
  1298.         LD (DISTV),BC
  1299. CLC48_  NOP
  1300.         LD HL,0
  1301.         LD A,D
  1302.         AND A
  1303.         JR Z,CLC49
  1304.         LD H,PERS
  1305. CLC49   OR E
  1306.         JR Z,UNDER
  1307.         LD L,38     ;смещ. от начала названий вещей
  1308. UNDER   LD A,0      ;код вещи под курсором
  1309.         AND %01111111
  1310.         ADD A,E
  1311.         ADD A,D
  1312.         JP Z,CL0    ;стир. назв. вещи
  1313.         ADD A,L
  1314.         ADD A,H
  1315.         LD B,A
  1316.         JP PRVESH   ;печ. назв. вещи/персонажа
  1317.  
  1318. ;Проверка на манипуляции с вещами/разговорами
  1319. ;OUT:B=0 ничего не делаем
  1320. ;      1 применяем на героя
  1321. ;      2 отдаем персонажу
  1322. ;      3 разговариваем
  1323. ;      4 применяем на объект
  1324. ;      5 выкладываем рядом с героем
  1325. ;      6 берем вещь
  1326. MANAGE
  1327.         LD HL,(DISTV);H-персон. L-предметы
  1328.         LD A,H
  1329.         CP 2
  1330.         LD B,0
  1331.         RET Z
  1332.  
  1333.         INC B   ;1 на героя
  1334.         LD E,-1
  1335.         LD A,(KARM)
  1336.         LD C,A
  1337.         LD A,(ONHERO)
  1338.         ADD A,E
  1339.         SBC A,A
  1340.         INC A
  1341.         ADD A,E
  1342.         SBC A,A
  1343.         AND C
  1344.         JR Z,MAN1
  1345.  
  1346.         LD DE,(PERSON)
  1347.         LD A,(UNDER+1)
  1348.         OR D
  1349.         OR E
  1350.         LD E,-1
  1351.         RET Z
  1352.  
  1353. MAN1    INC B   ;2 отдаем
  1354.         LD A,(PERSON)
  1355.         ADD A,E
  1356.         SBC A,A
  1357.         AND L
  1358.         RET NZ
  1359.  
  1360.         INC B   ;3 говорим
  1361.         LD A,H
  1362.         AND A
  1363.         RET NZ
  1364.  
  1365.         INC B   ;4 примен.
  1366.         LD A,(ITEM)
  1367.         ADD A,E
  1368.         SBC A,A
  1369.         AND L
  1370.         RET NZ
  1371.  
  1372.         INC B   ;5 выклад.
  1373.         LD A,L
  1374.         AND %00111111
  1375.         ADD A,E
  1376.         SBC A,A
  1377.         AND C
  1378.         RET NZ
  1379.  
  1380.         LD B,A
  1381.         LD A,(UNDER+1)
  1382.         RLA ;7-й бит значит, что вещь рядом с героем
  1383.         RET NC
  1384.         DEC C
  1385.         INC C
  1386.         RET NZ
  1387.         LD B,6  ;6 берем
  1388.         RET
  1389.  
  1390. ;Установка цвета фона игрового экрана
  1391. FONE
  1392.        if EGA
  1393. ;FNLP
  1394.         ;jr $
  1395.        ex af,af' ;'
  1396.        push af
  1397.         ld a,(COLOUR)
  1398.         ld b,a
  1399.         ld de,verapalevening ;if 0
  1400.         djnz $+5
  1401.         ld de,verapalnight ;if 1
  1402.         djnz $+5
  1403.         ld de,verapaldawn ;if 2
  1404.         djnz $+5
  1405.         ld de,verapalday ;if 3
  1406.         OS_SETPAL
  1407.        pop af
  1408.        ex af,af' ;'
  1409.         ret
  1410. FNLPm1=$+1
  1411.         LD E,SCRHG ;высота
  1412. FNLPp1=$+1
  1413.         LD C,8
  1414. FNLPp3=$+1
  1415.         LD B,SCRWD ;ширина
  1416.        else
  1417.         LD A,(COLOUR)
  1418.         LD HL,#5800+#8000
  1419. FNLPm1=$+1
  1420.         LD E,SCRHG ;высота
  1421. FNLP
  1422. FNLPp1=$+1
  1423.         LD C,8
  1424. FNLPp2
  1425. FNLPp3=$+1
  1426.         LD B,SCRWD ;ширина
  1427.         LD (HL),A
  1428.         INC L
  1429.         DJNZ $-2
  1430.         ADD HL,BC
  1431.         DEC E
  1432.         JR NZ,FNLPp2
  1433.         RET
  1434.        endif
  1435.        
  1436. ;4.12.2004
  1437. ;Скроллирование спрайта дня и ночи
  1438. N_WGHT  EQU 19 ;ширина спрайта
  1439.  
  1440. DAY_NGT
  1441.         RET ;patch
  1442.         LD A,201
  1443.         LD (DAY_NGT),A
  1444.        if EGA
  1445.         call prsprhud
  1446.        else
  1447. ;      LD A,PG_VIEW
  1448.         CALL PAGE_PG_VIEW
  1449.         LD HL,NG+N_WGHT-1
  1450.         LD DE,N_WGHT
  1451.         LD C,32       ;высота в пикселях
  1452. NG_SCR2 LD B,N_WGHT
  1453.         AND A
  1454.         PUSH HL
  1455. NG_SCRL LD A,(HL)
  1456.         ADC A,A
  1457.         LD (HL),A
  1458.         DEC HL
  1459.         DJNZ NG_SCRL
  1460.         POP HL
  1461.         LD A,B
  1462.         ADC A,A
  1463.         OR (HL)
  1464.         LD (HL),A
  1465.         ADD HL,DE
  1466.         DEC C
  1467.         JR NZ,NG_SCR2
  1468.  
  1469. ;Накладывание маски на спрайт дня и ночи
  1470.         LD IX,REZULT  ;где создать результат
  1471.         LD DE,NG      ;спрайт дня
  1472.         LD HL,NG_MASK ;маска
  1473.  
  1474.         LD C,N_WGHT-6
  1475.         LD A,32
  1476. NGHT_LP EX AF,AF' ;'
  1477.         LD B,6
  1478. NGLP    LD A,(DE)
  1479.         AND (HL)
  1480.         INC HL
  1481.         OR (HL)
  1482.         INC HL,DE
  1483.         LD (IX),A
  1484.         INC IX
  1485.         DJNZ NGLP
  1486.         EX DE,HL
  1487.         ADD HL,BC
  1488.         EX DE,HL
  1489.         EX AF,AF' ;'
  1490.         DEC A
  1491.         JR NZ,NGHT_LP
  1492.        endif
  1493.  
  1494. ;B-атрибут
  1495.         LD A,(SUTKI)
  1496.         INC A
  1497.        if EGA
  1498.         ld b,0
  1499.        else
  1500.         LD B,5*8 ;  вечер, цвет фона
  1501.        endif
  1502.         CP 38    ;четверть суток
  1503.         JR Z,SUT1
  1504.        if EGA
  1505.         inc b
  1506.        else
  1507.         LD B,8+64   ;ночь
  1508.        endif
  1509.         CP 38*2
  1510.         JR Z,SUT1
  1511.        if EGA
  1512.         inc b
  1513.        else
  1514.         LD B,6*8    ;утро
  1515.        endif
  1516.         CP 38*3
  1517.         JR Z,SUT1
  1518.        if EGA
  1519.         inc b
  1520.        else
  1521.         LD B,7*8+64 ;день
  1522.        endif
  1523.         CP 38*4
  1524.         JR NZ,SUT2
  1525.         XOR A
  1526.         LD (MUSNUM),A
  1527. SUT1    EX AF,AF' ;'
  1528.         CALL MUSNXT2
  1529.         LD A,B
  1530.         LD (COLOUR),A
  1531.         CALL FONE
  1532.         EX AF,AF' ;'
  1533. SUT2    LD (SUTKI),A
  1534.         XOR A
  1535.         JP setDAYS_a;D_SP+5
  1536.  
  1537.        if EGA
  1538. prsprhud
  1539. ;TODO печатать всегда теневой экран! и вызывать независимо (т.е. будет два вызова на соседних кадрах)
  1540.        ;halt
  1541.        display "prsprhud=",prsprhud
  1542.        ;di
  1543.        ld a,55
  1544.        ld (im_arroff),a
  1545.        call ARROFF
  1546.         ld a,(daynightphase)
  1547.         inc a
  1548.         cp 152
  1549.         jr nz,$+3
  1550.         xor a
  1551.         ld (daynightphase),a
  1552.         call setpgsscr40008000 ;visible
  1553.         call prsprhud_onescreen
  1554.        call ARRON
  1555.        ld a,55+128 ;"or a"
  1556.        ld (im_arroff),a
  1557.        ;ei
  1558.         call setpgsscr40008000_current ;shadow
  1559.         ld a,55 ;"scf"
  1560.         ld (wasdrawimg),a
  1561.         call prsprhud_onescreen
  1562.         jp setpgsmain40008000
  1563. prsprhud_onescreen
  1564.         ld a,PGDAYNIGHT
  1565.         call setpg
  1566.         ld hl,(daynightphase)
  1567.         srl l
  1568.         ld de,0xc000
  1569.         jr c,$+5
  1570.         ld de,0xc000+(200*32/2)
  1571.         ld h,0
  1572.         add hl,hl
  1573.         add hl,hl
  1574.         add hl,hl
  1575.         add hl,hl
  1576.         add hl,hl ;*32
  1577.         add hl,de
  1578.         ex de,hl
  1579.         ld hl,scrbase+(40*136)+(200/8)
  1580.         ld bc,0x2018
  1581. ;b=hgt,c=wid (/2)
  1582. ;de=gfx
  1583. ;hl=scr
  1584.         call primgega0
  1585.         ld a,PGHUD
  1586.         call setpg
  1587.         ld iy,hudspr
  1588.         ld e,200/2+sprmaxwid-1
  1589.         ld c,136
  1590. ;в 4000,8000 уже включен экран (setpgsscr40008000)
  1591. ;iy=sprite data+2 = spraddr+4
  1592. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1593. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1594. ;(iy-3)=sprhgt
  1595. ;(iy-4)=sprwid
  1596.         jp prspr
  1597.        endif
  1598.  
  1599. ;Восстанавливаем карту после заливки
  1600. CLMAP
  1601.         LD (CLR_MAPp1),A
  1602.         LD A,PG_MAP
  1603.         CALL PAGE
  1604.         LD HL,MASSIVE ;должен быть ровным адресом
  1605.         LD BC,#1000 ;длина карты
  1606. wav_1   LD A,(HL)
  1607.         DEC A
  1608.         JR Z,wav_2
  1609.         LD (HL),C
  1610. wav_2   INC L
  1611.         JR NZ,wav_1
  1612.         INC H
  1613.         DJNZ wav_1
  1614.         RET
  1615.  
  1616. NEW_CRD DW 0
  1617.  
  1618. ;Перекидываем теневой экран на основной
  1619. ;Теневым у нас является стандарный экран #4000
  1620. ;Основным - второй экран в 7-й стр.
  1621. ;Формат теневого экрана линейный, но не совсем
  1622. ;Его размер определяется по формуле:
  1623. ;SCRHG*32*8, не смотря на то,
  1624. ;что активная часть задается переменной SCRWD (ширина)
  1625. ;Это сделано для более простых расчетов
  1626. MOVE
  1627.  
  1628.        if EGA
  1629. ;TODO swapscr
  1630.         ret
  1631.        endif
  1632.  
  1633.  
  1634. ;       LD A,PG_VIEW
  1635.         CALL PAGE_PG_VIEW
  1636.  
  1637. OLD_CRD LD DE,0   ;Предыдущие координаты курсора.
  1638.                   ;Запоминаются во вторых прерываниях
  1639.         CALL ARRONS+4
  1640.         LD HL,BUSY+1
  1641.         PUSH HL
  1642.         INC (HL)
  1643.         LD HL,SHADSCR ;теневой экран
  1644.         LD DE,SCR     ;основной экран
  1645.  
  1646. ;0-обновлять весь экран или 1-только отдельные тайлы
  1647. TILED   LD A,0
  1648.         DEC A
  1649.         JP Z,MOVE2
  1650.         INC A
  1651.         JR Z,MVEND
  1652.  
  1653. HMOVEp1=$+1
  1654.         LD C,SCRHG    ;высота видимой части карты/8
  1655. PRSHAD0 LD B,4
  1656. PRSHAD1 PUSH BC
  1657.  
  1658.         DUP SCRWD-1   ;ширина видимой части карты
  1659.         LDI
  1660.         EDUP
  1661.  
  1662.         LD A,(HL)
  1663.         LD (DE),A
  1664.         INC D
  1665.         SET 5,L
  1666.  
  1667.         DUP SCRWD-1
  1668.         LDD
  1669.         EDUP
  1670.  
  1671.         LD A,(HL)
  1672.         LD (DE),A
  1673.         INC D
  1674.  
  1675.         LD BC,32
  1676.         ADD HL,BC
  1677.         POP BC
  1678.         DJNZ PRSHAD1
  1679.  
  1680.         LD A,E
  1681.         ADD A,32
  1682.         LD E,A
  1683.         JR C,$+6
  1684.         LD A,D
  1685.         SUB 8
  1686.         LD D,A
  1687.         DEC C
  1688.         JR NZ,PRSHAD0
  1689. MVEND   POP HL
  1690.         LD (HL),0
  1691.         JP ARROFFS
  1692.  
  1693. ;Вывод только тех тайлов,
  1694. ;которые изменились на теневом экране
  1695. MOVE2
  1696.        if EGA
  1697.         ret ;TODO swapscr
  1698.        endif
  1699.         LD HL,A_TILE ;список изм. тайлов (адреса)
  1700.         LD BC,#FF21
  1701.  
  1702. MV2     LD E,(HL)
  1703.         INC E
  1704.         JR Z,MVEND
  1705.  
  1706.         DEC E
  1707.         INC HL
  1708.         LD D,(HL)
  1709.         INC HL
  1710.         PUSH HL
  1711.  
  1712.         LD H,E
  1713.         LD A,D
  1714.         SUB #40
  1715.         LD L,A
  1716.  
  1717. ;Коорд. в знак. преобразуем в адрес экрана
  1718. ;H-X L-Y
  1719.         LD A,L
  1720.         AND 7
  1721.         RRCA
  1722.         RRCA
  1723.         RRCA
  1724.         ADD A,H
  1725.         LD H,L
  1726.         LD L,A
  1727.         LD A,H
  1728.         AND #18
  1729.         OR SCR/256
  1730.         LD H,A
  1731.  
  1732.         EX DE,HL
  1733.  
  1734.        DUP 8
  1735.         LDI
  1736.         LD A,(HL)
  1737.         LD (DE),A
  1738.         INC H
  1739.         LD A,E
  1740.         ADD A,C
  1741.         LD E,A
  1742.         LDD
  1743.         INC C
  1744.         LD A,(HL)
  1745.         LD (DE),A
  1746.         ADD HL,BC
  1747.         LD A,E
  1748.         SUB C
  1749.         LD E,A
  1750.         INC D
  1751.         INC C
  1752.        EDUP
  1753.  
  1754.         POP HL
  1755.         JP MV2
  1756.  
  1757. ;IN  A-направление
  1758. ;OUT BC-приращение координат в завис. от направления
  1759. NAPR    LD HL,DIR_TAB
  1760.         ADD A,A
  1761.         ADD A,L
  1762.         LD L,A
  1763.         ADC A,H
  1764.         SUB L
  1765.         LD H,A
  1766.         LD C,(HL)
  1767.         INC HL
  1768.         LD B,(HL)
  1769.         RET
  1770.  
  1771. ;Таблица направлений героя
  1772. DIR_TAB DW #FFFF ; 0 вправо-вниз
  1773.         DW #00FF ; 1 вправо
  1774.         DW #01FF ; 2 вправо-вверх
  1775.         DW #FF00 ; 3 вниз
  1776.         DW #0100 ; 4 вверх
  1777.         DW #FF01 ; 5 влево-вниз
  1778.         DW #0001 ; 6 влево
  1779.         DW #0101 ; 7 влево-вверх
  1780.  
  1781. ;Вывод кнопки ">" окна диалога
  1782. WKEYS
  1783.         LD HL,FMCNT
  1784.         DEC (HL)
  1785.         RET NZ
  1786.         LD (HL),FRM/2
  1787.         EXA
  1788.         LD HL,WIN_SPR+480
  1789.         LD A,8
  1790.         XOR 8
  1791.         LD ($-1),A
  1792.         ADD A,L
  1793.         LD L,A
  1794.         LD DE,#5036+#8000
  1795.         DUP 7
  1796.         LD A,(HL)
  1797.         LD (DE),A
  1798.         INC HL
  1799.         INC D
  1800.         EDUP
  1801.         LD A,(HL)
  1802.         LD (DE),A
  1803.         EXA
  1804.         RET
  1805.  
  1806. ;Спрайты героя
  1807. ;48 спрайтов по 128 б
  1808. Vr1     EQU hero;#C000
  1809. Vr2     EQU Vr1+#0080
  1810. Vr3     EQU Vr1+#0100
  1811. Vl1     EQU Vr1+#0180
  1812. Vl2     EQU Vr1+#0200
  1813. Vl3     EQU Vr1+#0280
  1814. Vu1     EQU Vr1+#0300
  1815. Vu2     EQU Vr1+#0380
  1816. Vu3     EQU Vr1+#0400
  1817. Vd1     EQU Vr1+#0480
  1818. Vd2     EQU Vr1+#0500
  1819. Vd3     EQU Vr1+#0580
  1820. Vru1    EQU Vr1+#0600
  1821. Vru2    EQU Vr1+#0680
  1822. Vru3    EQU Vr1+#0700
  1823. Vrd1    EQU Vr1+#0780
  1824. Vrd2    EQU Vr1+#0800
  1825. Vrd3    EQU Vr1+#0880
  1826. Vlu1    EQU Vr1+#0900
  1827. Vlu2    EQU Vr1+#0980
  1828. Vlu3    EQU Vr1+#0A00
  1829. Vld1    EQU Vr1+#0A80
  1830. Vld2    EQU Vr1+#0B00
  1831. Vld3    EQU Vr1+#0B80
  1832. VTr1    EQU Vr1+#0C00
  1833. VTr2    EQU Vr1+#0C80
  1834. VTr3    EQU Vr1+#0D00
  1835. VTl1    EQU Vr1+#0D80
  1836. VTl2    EQU Vr1+#0E00
  1837. VTl3    EQU Vr1+#0E80
  1838. VTu1    EQU Vr1+#0F00
  1839. VTu2    EQU Vr1+#0F80
  1840. VTu3    EQU Vr1+#1000
  1841. VTd1    EQU Vr1+#1080
  1842. VTd2    EQU Vr1+#1100
  1843. VTd3    EQU Vr1+#1180
  1844. VTru1   EQU Vr1+#1200
  1845. VTru2   EQU Vr1+#1280
  1846. VTru3   EQU Vr1+#1300
  1847. VTrd1   EQU Vr1+#1380
  1848. VTrd2   EQU Vr1+#1400
  1849. VTrd3   EQU Vr1+#1480
  1850. VTlu1   EQU Vr1+#1500
  1851. VTlu2   EQU Vr1+#1580
  1852. VTlu3   EQU Vr1+#1600
  1853. VTld1   EQU Vr1+#1680
  1854. VTld2   EQU Vr1+#1700
  1855. VTld3   EQU Vr1+#1780
  1856.  
  1857. ;Ссылки на спрайты
  1858. ;Очередность спрайтов зависит от направления
  1859. ;героя и процедуры расчета группы спрайтов по этому направлению
  1860.  
  1861. ;Перемещение героя (очередность спрайтов)
  1862. VeraTab
  1863. R_down  DB 3
  1864.         DW Vrd1,Vrd2,Vrd1,Vrd3
  1865. Right   DB 2
  1866.         DW Vr1,Vr2,Vr1,Vr3
  1867. R_up    DB 1
  1868.         DW Vru3,Vru1,Vru2,Vru1
  1869. Down    DB 4
  1870.         DW Vd2,Vd1,Vd3,Vd1
  1871. Up      DB 0
  1872.         DW Vu2,Vu1,Vu3,Vu1
  1873. L_down  DB 5
  1874.         DW Vld1,Vld2,Vld1,Vld3
  1875. Left    DB 6
  1876.         DW Vl1,Vl2,Vl1,Vl3
  1877. L_up    DB 7
  1878.         DW Vlu1,Vlu2,Vlu1,Vlu3
  1879.  
  1880. ;Взятие предмета
  1881. VeraTab2
  1882. TUp     DW VTu1,VTu2,VTu3,VTu2,VTu1,Vu1
  1883. TR_up   DW VTru1,VTru2,VTru3,VTru2,VTru1,Vru1
  1884. TRight  DW VTr1,VTr2,VTr3,VTr2,VTr1,Vr1
  1885. TR_down DW VTrd1,VTrd2,VTrd3,VTrd2,VTrd1,Vrd1
  1886. TDown   DW VTd1,VTd2,VTd3,VTd2,VTd1,Vd1
  1887. TL_down DW VTld1,VTld2,VTld3,VTld2,VTld1,Vld1
  1888. TLeft   DW VTl1,VTl2,VTl3,VTl2,VTl1,Vl1
  1889. TL_up   DW VTlu1,VTlu2,VTlu3,VTlu2,VTlu1,Vlu1
  1890.  
  1891. RotTabl DW Vu1,Vru1,Vr1,Vrd1,Vd1,Vld1,Vl1,Vlu1
  1892.