?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         ;MAIN "VERA",8
  2.  
  3. ;IM_2 Программа на вторых прерываниях
  4. ;       ORG IM2 ;#6666
  5. IMS
  6.        if INT_IM2
  7.         EX (SP),HL
  8.         LD (adr_ret+1),HL
  9.         POP HL
  10.         LD (IM2_SP+1),SP
  11.         PUSH BC     ;процедуры печати спрайтов
  12.                     ;должны оперировать с регистром BC (POP BC)
  13.         LD SP,VARS  ;может быть любым, только с умом!
  14.         PUSH IX,IY,HL,DE,BC,AF
  15.         EX AF,AF' ;'
  16.         EXX
  17.         PUSH HL,DE,BC,AF
  18.        endif
  19.  
  20.         LD A,(curpgc000) ;ok ;(NUMPAGE)  ;Запоминаем номер текущ. стр.
  21.         LD (RST_PGp1),A
  22. IM2Nm2=$+1
  23.         JP IM2N
  24.  
  25. IM2N    ;LD A,PG_VIEW
  26.         CALL PAGE_PG_VIEW
  27.  
  28.        if EGA
  29.        ld a,(im_arroff)
  30.        cp 55
  31.        CALL nz,ARROFF ;стирание курсора на основном (visible) экране (т.е. не там, где сейчас рисуются тайлы)
  32.        else
  33.         CALL ARROFF ;стирание курсора на основном (visible) экране (т.е. не там, где сейчас рисуются тайлы)
  34.        endif
  35.  
  36.         CALL DAYS ;вывод спрайта дня-ночи
  37.  
  38.         LD A,(DIALOG+1)
  39.         AND A
  40.         CALL NZ,WKEYS ;кнопка ">>" в диалоге
  41.         CALL Z,FL_MESH
  42.  
  43. TXT0    LD A,PG_MUZ
  44.         CALL PAGE
  45.  
  46. TXT     LD HL,ONESYM+1;адрес текущ. символа
  47.         LD A,(HL)
  48.         INC HL
  49.         LD B,(HL)
  50.         EXA
  51.         ;LD A,PG_VIEW
  52.         CALL PAGE_PG_VIEW
  53.         EXA
  54.         LD DE,ONESYM
  55.         LD (DE),A
  56.         CP 5
  57.         JR NZ,TOKN
  58. ;Особый скрипт должен выдать в HL адрес диалога
  59.         LD A,B
  60.         CALL SCRIPT
  61.         LD (TXT+1),HL
  62.         JR TXT0
  63.  
  64. TOKN    CP TOKEN
  65.         JR C,CLT
  66.         LD (TXT+1),HL
  67. TXT1    LD HL,#0A11   ;H-X,L-Y текущ. позиция печати
  68.         CP 13
  69.         JR NZ,TXT3
  70. TXT2    LD H,10
  71.         INC L
  72.         JR TXT4
  73. TXT3    
  74.        if EGA
  75.         ;ld ix,0x3fc9 ;bg color 9 (green), color 7 (white)
  76.         ld ix,0x00c9 ;bg color 9 (green), color 0 (black)
  77.        endif
  78.         CALL PR64    ;посимвольная печать в окне диалога ;TODO только на теневом экране
  79.         ld a,55 ;"scf"
  80.         ld (wasdrawimg),a ;по идее надо до вывода, но мы в прерывании, без разницы
  81.         INC H
  82. TXT4    LD (TXT1+1),HL
  83.  
  84. CLT     JR PRT
  85.         CALL CLTXT
  86.         LD A,PRT-CLT-2
  87.         LD (CLT+1),A
  88.  
  89. PRT     JR INV
  90.         LD DE,0     ;адрес строки
  91.         LD HL,#320E ;H-X,L-Y
  92.        if EGA
  93.         ld ix,0x003f ;bg color 7 (white), color 0 (black)
  94.        endif
  95.         CALL PR64 ;TODO только на теневом экране
  96.         LD A,INV-PRT-2
  97.         LD (PRT+1),A
  98.         ld a,55 ;"scf"
  99.         ld (wasdrawimg),a ;по идее надо до вывода, но мы в прерывании, без разницы
  100.  
  101. ;Печать вещей 3*3 в мешке
  102. INV     LD A,1
  103.         DEC A
  104.         JR NZ,DIAL
  105.         LD (INV+1),A
  106.  
  107. MSTRT   LD IY,MESHOK ;начальный спрайт мешка
  108.         LD L,(IY)
  109.         LD H,A;=0    ;HL=спрайту из мешка
  110.  
  111.         ld a,55 ;"scf"
  112.         ld (wasdrawimg),a
  113.  
  114.         CALL HL72    ;HL=адресу спрайта
  115.        if EGA
  116.         ld de,iconsscraddr
  117.        else
  118.         LD DE,#C099  ;DE=адрес в экране
  119.        endif
  120.         CALL BLOCK33
  121.  
  122.         LD L,(IY+1)
  123.         LD H,0
  124.        if EGA
  125.         ld de,iconsscraddr+3
  126.        else
  127.         LD DE,#C09C
  128.        endif
  129.         CALL HL72
  130.         CALL BLOCK33
  131.  
  132.         LD L,(IY+2)
  133.         LD H,0
  134.        if EGA
  135.         ld de,iconsscraddr+(40*24)
  136.        else
  137.         LD DE,#C0F9
  138.        endif
  139.         CALL HL72
  140.         CALL BLOCK33
  141.  
  142.         LD L,(IY+3)
  143.         LD H,0
  144.        if EGA
  145.         ld de,iconsscraddr+(40*24)+3
  146.        else
  147.         LD DE,#C0FC
  148.        endif
  149.         CALL HL72
  150.         CALL BLOCK33
  151.  
  152.         LD L,(IY+4)
  153.         LD H,0
  154.        if EGA
  155.         ld de,iconsscraddr+(40*48)
  156.        else
  157.         LD DE,#C859
  158.        endif
  159.         CALL HL72
  160.         CALL BLOCK33
  161.  
  162.         LD L,(IY+5)
  163.         LD H,0
  164.        if EGA
  165.         ld de,iconsscraddr+(40*48)+3
  166.        else
  167.         LD DE,#C85C
  168.        endif
  169.         CALL HL72
  170.         CALL BLOCK33
  171.  
  172. ;Печатаем лица
  173. DIAL
  174.         LD A,0
  175.         DEC A
  176.         JR NZ,FLOOP
  177.         LD (DIAL+1),A
  178.  
  179.         ld a,55 ;"scf"
  180.         ld (wasdrawimg),a
  181.        if EGA
  182.         LD HL,0xc000+(38*72*4) ;лицо гл. героя
  183.         ld de,faceiconsscraddr
  184.        else
  185.         LD HL,SPR33+(38*72) ;лицо гл. героя
  186.         LD DE,#D021
  187.        endif
  188.         CALL BLOCK33
  189.  
  190. WHO     LD HL,0             ;лицо собеседника
  191.         CALL HL72
  192.        if EGA
  193.         ld de,faceiconsscraddr+(40*24)
  194.        else
  195.         LD DE,#D081
  196.        endif
  197.         CALL BLOCK33
  198.  
  199. ;Мигание курсора
  200. FLOOP   LD HL,FLASH+1
  201.         LD A,(DISTV)
  202.         ADD A,A
  203.         LD BC,#0538  ;JR C,CT2
  204.         JR C,$+4
  205.         JR NZ,CTER1
  206.         LD (HL),0    ;A=0
  207.         LD BC,#0418  ;JR CT2-1
  208. CTER1   LD (CTMOD),BC
  209.  
  210. CTER2   LD A,0
  211.         INC A
  212.  
  213. SPDFL   CP FR           ;скорость мигания курсора
  214.  
  215. CTMOD   JR C,CT2        ;JR/JR C
  216.         LD A,(HL)
  217.         XOR 1
  218.         LD (HL),A
  219.         XOR A
  220. CT2     LD (CTER2+1),A
  221.  
  222. ;Идет ли обновление экрана?
  223. BUSY
  224.         LD A,0
  225.        if EGA
  226. ;если что-то рисовали в теневом экране, то надо снова прочитать графику под стрелкой на теневом экране и сбросить этот флаг
  227. ;[а что если нарисовали и ещё переключили экран? невозможно, т.к. между этими двумя действиями стоит halt]
  228. wasdrawimg=$
  229.         or a ;если рисовали на теневом экране, то scf
  230.         jr nc,IM2nowasdrawimg
  231.         ld hl,(arroffega_scraddr2)
  232.         call setpgsscr40008000_current ;shadow
  233.         ld de,(arroffega_bufaddr2);mouse_buf
  234.         ld bc,0x1008
  235. ;b=hgt,c=wid (/2)
  236. ;de=gfx
  237. ;hl=scr
  238.         call getimgega_onescreen
  239.         call setpgsmain40008000
  240.         ld a,55+128 ;"or a"
  241.         ld (wasdrawimg),a
  242. IM2nowasdrawimg
  243.  
  244. im_swapscr=$
  245.         or a
  246.         jr nc,im_swapscrq
  247.         call swapre
  248.         call setcurscr_change
  249. curscrnum_int=$+1
  250.         ld e,0
  251.         OS_SETSCREEN
  252.         ld a,55+128 ;"or a"
  253.         ld (im_swapscr),a
  254. im_swapscrq
  255.  
  256. im_arroff=$
  257.         or a
  258.         CALL nc,ARRON      ;рисование курсора на основном экране
  259.        else
  260.         AND A
  261.         PUSH AF
  262.         CALL NZ,ARROFFS ;стирание курсора на теневом экране
  263.         CALL ARRON      ;рисование курсора на основном экране
  264.         POP AF
  265.         CALL NZ,ARRONS  ;рисование курсора на теневом экране
  266.        endif
  267.  
  268. PRTIME
  269.         LD A,0 ;таймер для стирания надписи через некот. время
  270.         SUB 1
  271.         ADC A,0
  272.         LD (PRTIME+1),A
  273. PRJR    JR TIMER      ;JR/JR NZ #18/#20
  274.         LD A,#18
  275.         LD (CLT+1),A
  276.         LD (PRJR),A
  277.  
  278. TIMER   LD HL,MAPINGp2
  279.         INC (HL)
  280.  
  281. CLOCK   LD A,0
  282.         INC A
  283.         CP 50
  284.         JR C,CLK1
  285.         LD A,(TIME+2) ;сек
  286.         INC A
  287.         CP 60
  288.         JR C,CLK2
  289.         LD A,(TIME+1) ;мин
  290.         INC A
  291.         CP 60
  292.         JR C,CLK3
  293.         LD A,(TIME)   ;час
  294.         INC A
  295.         LD (TIME),A
  296.         XOR A
  297. CLK3    LD (TIME+1),A
  298.         XOR A
  299. CLK2    LD (TIME+2),A
  300.         XOR A
  301. CLK1    LD (CLOCK+1),A
  302.  
  303.         CALL GOTASK ;выполнить задачу
  304.  
  305. ;Для печати спрайта дня/ночи
  306. SPN
  307.         LD HL,1
  308.         DEC HL
  309.         LD A,H
  310.         OR L
  311.         JR NZ,$+8
  312.         LD (DAY_NGT),A
  313.         LD HL,SPD_NGT
  314.         LD (SPN+1),HL
  315.  
  316. MUS
  317.         LD A,PG_MUZ
  318.         CALL PAGE
  319. MUSONp1=$+1
  320.         LD A,0
  321.         AND A
  322.         CALL Z,PLAY+2
  323.  
  324.         LD A,PG_MAP
  325.         CALL PAGE
  326. SAMPLE
  327.         LD HL,0
  328.         CALL SOUND
  329.  
  330. ;Обработка мышки, клавиатуры
  331.         LD HL,(mouse_crd)
  332.         LD (OLD_CRD+1),HL
  333.  
  334.         LD HL,CCURS+1
  335.         LD A,(HL)
  336.         DEC A
  337.         JR NZ,MSE
  338.  
  339. CNTCUR  LD A,FRM2
  340.         DEC A
  341.         JR NZ,MSE-3
  342.         LD (HL),A
  343.         LD A,FRM2
  344.         LD (CNTCUR+1),A
  345.  
  346. MSE      CALL mouse
  347.         AND %11110000
  348.         LD E,A
  349.         PUSH DE
  350.  
  351.         CALL SCANER
  352.         LD (KEYSp1),A
  353.         LD C,A
  354.         CALL UDLR
  355.         LD A,C
  356.         AND %00010000
  357. ;       AND %00110000
  358.         POP DE
  359.         OR E
  360.         LD E,A
  361.         RES 4,E
  362.         AND 16
  363.  
  364.         LD HL,MKEYSp1
  365. OLDK    LD B,0
  366.         LD ($-1),A
  367.         JR Z,OLDK1    ;если не нажато/отжато
  368.  
  369. ;нажали и держим FIRE
  370. ;------
  371.         LD HL,(mouse_crd)
  372.         LD (NEW_CRD),HL
  373.         LD HL,(OLD_CRD+1)
  374.        if FIXMOUSE==0
  375.        LD (mouse_crd),HL
  376.        endif
  377.         LD HL,FMCNT2
  378.         DEC (HL)
  379.         JR NZ,OLDK4
  380.         LD (HL),SCMOD
  381.         LD E,2
  382.         LD HL,CCURS+1 ;меняем спрайт курсора N2/N3
  383.         LD A,(HL)
  384.        if FIXMOUSE==0
  385.        LD (HL),E
  386.        endif
  387.         CP E
  388.         JR NZ,OLDK4
  389.        if FIXMOUSE==0
  390.        INC (HL)
  391.        endif
  392.         JR OLDK4
  393. ;------
  394.  
  395. OLDK1   CP B
  396.         JR Z,OLDK3    ;если не было нажато
  397.  
  398. ;отжали FIRE (щелчок)
  399.  
  400.         SET 4,E
  401.         LD A,SCMOD    ;восстанавливаем счетчик
  402.         LD (FMCNT2),A
  403.  
  404.         CALL SCRLMAP  ;Скроллировали ли карту?
  405.         JR NC,OLDK3   ;нет
  406.         LD A,(KARM)
  407.         LD (CCURS+1),A
  408.         LD E,0
  409. OLDK3   LD A,(HL)
  410.         AND %11010000
  411.         JR NZ,$+3     ;еще не обработано
  412.                       ;прошлое нажатие
  413.         LD (HL),E
  414.  
  415. OLDK4   LD A,#F7   ;"1-5"
  416.         IN A,(#FE)
  417.         AND 31
  418.         LD (DIGKp1),A
  419. ;--------
  420.  
  421. RST_PGp1=$+1
  422.         LD A,0
  423.         SETPGC000;CALL PAGE
  424.  
  425. IM2EX
  426.        if INT_IM2
  427. ;Выход из вторых прерываний
  428.         POP AF,BC,DE,HL
  429.         EX AF,AF' ;'
  430.         EXX
  431.         POP AF,BC,DE,HL,IY,IX
  432. IM2_SP  LD SP,0
  433.         EI
  434. adr_ret JP 0
  435.        else
  436.         ret
  437.        endif
  438.  
  439. END_IM2
  440.  
  441. ;Инициализ. мышки
  442. INIMOUS LD BC,#FBDF
  443.         IN A,(C)
  444.         LD (ms1+1),A
  445.         LD B,#FF
  446.         IN A,(C)
  447.         LD (ms5+1),A
  448.         JR m_keys
  449.  
  450. M_SP    CP 6
  451.         RET C
  452. MSPEED  LD B,-4  ;Скорость мыши [-4...+4], 0-без ускорения!
  453.         ADD A,B
  454.         CP 18
  455.         RET C
  456.         ADD A,B
  457.         RET
  458.  
  459. ;OUT: A-BIT 4-лев. клав.
  460. ;           5-прав. клав.
  461. ;           6-колесо вверх
  462. ;           7-колесо вниз
  463. ;     B-кол-во строк скролла колеса
  464. mouse
  465.         LD A,255
  466.         AND A
  467.         RET Z
  468.  
  469.         LD BC,#FBDF
  470. ms1     LD DE,MAX_X*256
  471.         LD HL,mouse_crd+1  ; lef/right
  472.         IN A,(C)
  473.         LD (ms1+1),A
  474.         SUB E
  475.         JR Z,ms4
  476.         JP P,ms2
  477.         NEG
  478.         CALL M_SP     ;Скорость мыши
  479.         NEG
  480.         ADD A,(HL)
  481.         JR C,ms3+1
  482.         XOR A
  483.         JR ms3+1
  484. ms2     CALL M_SP     ;Скорость мыши
  485.         ADD A,(HL)
  486.         JR C,ms3
  487.         CP D
  488.         JR C,ms3+1
  489. ms3     LD A,D
  490.         LD (HL),A
  491. ms4     DEC HL
  492.         LD B,#FF
  493. ms5     LD DE,MAX_Y*256
  494.         IN A,(C)
  495.         LD (ms5+1),A
  496.         SUB E
  497.         JR Z,m_keys
  498.         JP M,ms6
  499.         CALL M_SP     ;Скорость мыши
  500.         NEG
  501.         ADD A,(HL)
  502.         JR C,ms7+1
  503.         XOR A
  504.         JR ms7+1
  505. ms6     NEG
  506.         CALL M_SP     ;Скорость мыши
  507.         ADD A,(HL)
  508.         JR C,ms7
  509.         CP D
  510.         JR C,ms7+1
  511. ms7     LD A,D
  512.         LD (HL),A
  513.  
  514. ;Проверяем кнопки,
  515. ;если не ноль, то что-то нажато!
  516. m_keys
  517.         LD B,#FA
  518.         IN A,(C)
  519.         CPL
  520.         RLCA
  521.         RLCA
  522.         RLCA
  523.         RLCA
  524.         LD D,A
  525.         AND %00110000
  526.         LD E,A
  527. ROLL    NOP ;вкл/откл. работу с колесом
  528.  
  529. ;Опрос колеса
  530. ;       BIT 6,D ;ср. кнопка
  531.  
  532.         LD A,D
  533.         AND 15
  534. ROLD    LD B,0
  535.         LD (ROLD+1),A
  536.         SUB B
  537.         JR NZ,ROLB
  538.         LD B,A
  539.         LD A,E
  540.         RET
  541. ROLB    JR C,SCR_DW
  542.  
  543. ;Прокрутить текст вверх на B строчек
  544. SCR_UP  SET 6,D
  545.         LD B,A
  546.         LD A,D
  547.         RET
  548.  
  549. ;Прокрутить текст вниз на B строчек
  550. SCR_DW  SET 7,D
  551.         NEG
  552.         LD B,A
  553.         LD A,D
  554.         RET
  555.  
  556. ;Вверх/вниз/влево/вправо
  557. UDLR
  558.         LD B,0
  559.         LD ($-1),A
  560.         LD C,A
  561.         CALL KEYSPD
  562.         LD A,C
  563. STEP    LD E,1            ;Шаг приращения координат
  564.         LD D,MAX_X        ;Влево/вправо
  565.         LD HL,mouse_crd+1
  566.         RRA
  567.         CALL C,PL
  568.         RRA
  569.         CALL C,MIN
  570.  
  571.         LD D,MAX_Y        ;Вверх/вниз
  572.         DEC HL
  573.         RRA
  574.         CALL C,PL
  575.         RRA
  576.         CALL C,MIN
  577.         RET
  578.  
  579. KEYSPD  LD HL,STEP+1
  580.         AND A
  581.         JR Z,KSP2  ;курсор не движется
  582.         CP B
  583.         JR NZ,KSP2 ;появилось новое направление
  584.  
  585.         LD A,(MSPEED+1)
  586.         NEG
  587.         ADD A,10   ;переменная зависит от скорости курсора
  588.                    ;через это кол-во итераций происходит
  589.                    ;увеличение шага приращения
  590.         LD B,A
  591.  
  592. KSP0    LD A,0
  593.         INC A
  594.         CP B
  595.         JR C,KSP1
  596.         XOR A
  597.         INC (HL)
  598. KSP1    LD (KSP0+1),A
  599.         RET
  600. KSP2    LD (HL),1
  601.         RET
  602.  
  603. PL      EX AF,AF' ;'
  604.         LD A,(HL)
  605.         ADD A,E
  606.         JR C,ENDD-1
  607.         CP D
  608.         JR C,ENDD
  609.         LD A,D
  610. ENDD    LD (HL),A
  611.         EX AF,AF' ;'
  612.         RET
  613.  
  614. MIN     EX AF,AF' ;'
  615.         LD A,(HL)
  616.         SUB E
  617.         JR NC,ENDD
  618.         XOR A
  619.         JR ENDD
  620.  
  621. ;-------Сканирование управления---------
  622. ;первые биты (0-3) движение:
  623. ;0-RGHT,1-LEFT,2-DWN,3-UP
  624. ;4-й - огонь
  625. ;5-й бит - курсор вверх, 6-й - вниз
  626. ;7-й - Enter
  627. ;в режиме игры 5-й бит - нажатие CS или SS
  628.  
  629. SCANER
  630.         LD A,#BF    ;Enter
  631.         IN A,(#FE)
  632.         CPL
  633.         RRCA
  634.         AND 128
  635.         LD B,A
  636.  
  637. SCANMOD LD A,0      ;режим 0-в игре, 1-в меню
  638.         AND A
  639.         JR Z,SGAME
  640.  
  641.         LD A,#FE    ;CS
  642.         IN A,(#FE)
  643.         BIT 0,A
  644.         JR Z,CURSOR
  645.         JR SCANTYP
  646.  
  647. ;в режиме игры совмещаем состояние клавиш CS и SS
  648. ;и проверяем как одну
  649. SGAME   LD A,#FE    ;CS
  650.         IN A,(#FE)
  651.         LD C,A
  652.         LD A,#7F    ;SS
  653.         IN A,(#FE)
  654.         RRCA
  655.         AND C
  656.         CPL
  657.         RRCA
  658.         RRCA
  659.         RRCA
  660.         AND %00100000
  661.         OR B
  662.         LD B,A
  663.  
  664. SCANTYP LD A,0      ;тип управления
  665.         AND A
  666.         JP Z,QAOP
  667.  
  668. SINCL   LD A,#EF    ;SINCLAIR_RIGHT
  669.         IN A,(#FE)
  670.         RRCA
  671.         RL C
  672.         RRCA
  673.         RL C
  674.         RRCA
  675.         RL C
  676.         RRCA
  677.         RRCA
  678.         RL C
  679.         RLCA
  680.         RLCA
  681.         RL C
  682.         LD A,C
  683.         CPL
  684.         OR B
  685.         RET
  686.  
  687. QAOP    LD A,#7F    ;SP
  688.         IN A,(#FE)
  689.         RRCA
  690.         RL C
  691.         LD A,#FB    ;Q
  692.         IN A,(#FE)
  693.         RRCA
  694.         RL C
  695.         LD A,#FD    ;A
  696.         IN A,(#FE)
  697.         RRCA
  698.         RL C
  699.         LD A,#DF    ;O,P
  700.         IN A,(#FE)
  701.         RRCA
  702.         RRCA
  703.         RL C
  704.         RLCA
  705.         RLCA
  706.         RL C
  707.         LD A,C
  708.         CPL
  709.         AND 31
  710.         OR B
  711.         RET
  712.  
  713. CURSOR  LD A,#EF    ;"6"/"7"
  714.         IN A,(#FE)
  715.         RLA
  716.         RLA
  717.         CPL
  718.         AND 64+32
  719.         OR B
  720.         RET
  721.  
  722. ;Распаковщик
  723. LC5
  724.        LD DE,7;SKIP "LCMP5" & LENGTH
  725.        ADD HL,DE
  726.  
  727.        LD A,(HL)
  728.        INC HL
  729.        LD E,A
  730.        ADD HL,DE
  731.  
  732.        LD A,(HL)
  733.        LD E,A;pазpыв
  734.  
  735.        AND 3
  736.        RLCA
  737.        RLCA
  738.        RLCA
  739.        OR #C000/256
  740.  
  741.        EXX
  742.        LD D,A;начало
  743.        LD E,0
  744.        EXX
  745.  
  746.        LD A,(HL)
  747.        INC HL
  748.        XOR #C000/256+#18
  749.        AND #FC
  750.        LD HX,A;конец ч/б.
  751.  
  752. DLC1   LD A,(HL)
  753.        INC HL
  754.        LD LX,#FF
  755. DLC2   EXX
  756.        JR NZ,DLC10
  757.        LD B,1
  758.  
  759. DLC3   EXA
  760.        SLA D
  761.        JR NZ,$+6
  762.        LD D,(HL)
  763.        INC HL
  764.        SLI D
  765.        DJNZ DLC7
  766.        JR C,DLC1
  767.        INC B
  768. DLC4   LD C,%01010110
  769.        LD A,#FE
  770. DLC5   SLA D
  771.        JR NZ,$+6
  772.        LD D,(HL)
  773.        INC HL
  774.        RL D
  775.        RLA
  776.        SLA C
  777.        JR Z,DLC6
  778.        JR C,DLC5
  779.        RRCA
  780.        JR NC,DLC5
  781.        SUB 8
  782. DLC6   ADD A,9
  783.        DJNZ DLC3
  784.  
  785.        CP 0-8+1
  786.        JR NZ,$+4
  787.        LD A,(HL)
  788.        INC HL
  789.  
  790.        ADC A,#FF
  791.        LD LX,A
  792.        JR C,DLC4
  793. ;      DI
  794. ;      LD A,16+8+7  ;Вкл. видимым 2-й экран
  795. ;      LD (page),A
  796. ;      LD BC,#7FFD
  797. ;      OUT (C),A
  798. ;      EI
  799.        RET
  800. DLC7   LD A,(HL)
  801.        INC HL
  802.  
  803.        EXX
  804.        LD L,A
  805.        EXA
  806.        LD H,A
  807.        ADD HL,DE
  808.  
  809.        CP #FF-2
  810.        JR NC,DLC8
  811.        DEC LX
  812. DLC8   LD A,H
  813.        CP HX
  814.        JR NC,DLC13
  815.        XOR L
  816.        AND #F8
  817.        XOR L
  818.        LD B,A
  819.        XOR L
  820.        XOR H
  821.        RLCA
  822.        RLCA
  823.        LD C,A
  824.  
  825. DLC9   EXA
  826.        LD A,(BC)
  827. DLC10  EXA
  828.        LD A,D
  829.        CP HX
  830.        JR NC,DLC14
  831.        XOR E
  832.        AND #F8
  833.        XOR E
  834.        LD B,A
  835.        XOR E
  836.        XOR D
  837.        RLCA
  838.        RLCA
  839.        LD C,A
  840.  
  841. DLC11  EXA
  842.        LD (BC),A
  843.  
  844.        INC DE
  845.        JR NC,$+4
  846.        DEC HL
  847.        DEC HL
  848.        INC HL
  849.        EXA
  850.        INC LX
  851.        JR NZ,DLC8
  852.        JP DLC2
  853.  
  854. DLC13  SCF
  855. DLC14  PUSH AF
  856.        EXX
  857.        ADD A,E
  858.        EXX
  859.        LD B,A
  860.        POP AF
  861.        LD C,E
  862.        JR NC,DLC11
  863.        LD C,L
  864.        JR DLC9
  865.  
  866. DEHRUST
  867. ;HL - FROM, DE - TO
  868.         INC HL
  869.         INC HL
  870.         INC HL ;SKIP "HR2"
  871.         LD A,(HL)
  872.         INC HL
  873.         PUSH DE
  874.         LD C,(HL)
  875.         INC HL
  876.         LD B,(HL)
  877.         INC HL
  878.         DEC BC
  879.  
  880.         EX DE,HL
  881.         ADD HL,BC
  882.         EX DE,HL
  883.  
  884.         LD C,(HL)
  885.         INC HL
  886.         LD B,(HL)
  887.         ADD HL,BC
  888.  
  889.         SBC HL,DE
  890.         ADD HL,DE
  891.         JR C,$+4
  892.         LD D,H
  893.         LD E,L
  894.         PUSH BC
  895.         LDDR
  896.         POP BC
  897.  
  898.         EX DE,HL
  899.         RLA
  900.         JR NC,DPCYES
  901.         POP DE
  902.         INC HL
  903.         LDIR
  904.         RET
  905.  
  906. DPCYES  LD DE,7
  907.         ADD HL,DE
  908.  
  909.         PUSH HL
  910.         EXX
  911.         POP HL
  912.         POP DE
  913.  
  914.         LD B,6
  915.         DEC HL
  916.         LD A,(HL)
  917.         PUSH AF
  918.         INC SP
  919.         DJNZ $-4
  920.  
  921.         EXX
  922.         LD DE,#1003
  923.         LD C,#80
  924.  
  925. DPC1    LD A,(HL)
  926.         INC HL
  927.         EXX
  928.         LD (DE),A
  929.         INC DE
  930. DPC0    EXX
  931. DPC0A   CALL SLAC
  932.         JR C,DPC1
  933.  
  934.         LD B,#01
  935. DPC4    LD A,%01000000
  936. DPC2    CALL SLAC
  937.         RLA
  938.         JR NC,DPC2
  939.  
  940.         CP E ;3
  941.         JR C,DPC3
  942.         ADD A,B
  943.         LD B,A
  944.         XOR D ;#10
  945.         JR NZ,DPC4
  946. DPC3    ADD A,B
  947.         CP 4
  948.         JR Z,DPC5 ;B<>1;B=4
  949.         ADC A,#FF
  950. DPC8A   CP 2
  951. DPC8    EXX
  952.         LD C,A
  953.         LD H,#FF
  954.         EXX
  955.         JR C,DPC9 ;B=1
  956.  
  957.         JR Z,DPC12
  958.  
  959.         CALL SLAC
  960.         JR C,DPC12
  961.  
  962.         ;B>=4
  963.         LD A,%01111111
  964.         LD B,E ;3
  965.         DJNZ DPC9A1 ;JR...B=2
  966. DPC9A2  DJNZ DPC5A2
  967.         LD B,A
  968.         SBC A,A
  969.  
  970. DPC9B   CALL SLAC
  971.         RLA
  972.         DEC A
  973.         INC B
  974.         JR NZ,DPC9B
  975.         CP #FF-30
  976.         JR NZ,$+4
  977.         LD A,(HL)
  978.         INC HL
  979.  
  980.         EXX
  981.         LD H,A
  982.         EXX
  983.  
  984. DPC12   LD A,(HL)
  985.         INC HL
  986. DPC11   EXX
  987.         LD L,A
  988.         ADD HL,DE
  989.         LDIR
  990.         JR DPC0
  991.  
  992. DPC5A2  ADD A,6
  993.         RLA
  994.         LD B,A
  995. DPC5C   LD A,(HL)
  996.         INC HL
  997.         EXX
  998.         LD (DE),A
  999.         INC DE
  1000.         EXX
  1001.         DJNZ DPC5C
  1002.         JR DPC0A
  1003.  
  1004. DPC5    ;B=4
  1005.         CALL SLAC
  1006.         LD A,D ;%00010000
  1007.         JR NC,DPC5A1
  1008.  
  1009.         LD A,(HL)
  1010.         INC HL
  1011.         CP D ;16
  1012.         JR NC,DPC8A
  1013.         OR A
  1014.         JR Z,DPC6
  1015.  
  1016.         EXX
  1017.         LD B,A
  1018.         EXX
  1019.         LD A,(HL)
  1020.         INC HL
  1021.         JR DPC8
  1022.  
  1023. DPC9    ;B=1
  1024.         LD A,%00111111
  1025. DPC5A1  ;B=4
  1026. DPC9A1  ;B=2
  1027. DPC10   CALL SLAC
  1028.         RLA
  1029.         JR NC,DPC10
  1030.         DJNZ DPC9A2
  1031.         JR DPC11
  1032.  
  1033. SLAC    SLA C
  1034.         RET NZ
  1035.         LD C,(HL)
  1036.         INC HL
  1037.         RL C
  1038.         RET
  1039.  
  1040. DPC6    EXX
  1041.         LD B,6
  1042.         DEC SP
  1043.         POP AF
  1044.         LD (DE),A
  1045.         INC DE
  1046.         DJNZ $-4
  1047.         RET
  1048.  
  1049. ;Изображение под стрелкой кидаем в буфер
  1050. ;и рисуем саму стрелку
  1051. ;Формат спрайта стрелки хитрый:
  1052. ;сначала слово маски (младший, затем старший байт),
  1053. ;потом идет слово спрайта (мл., старший байты)
  1054. ;(c) Основной алгоритм Alone Coder
  1055. ;(c) Небольшая переработка Саша Ксор
  1056. ;6.02.2003
  1057. ARRON
  1058.         LD IX,mouse_buf ;буфер под курсором (48 байт)
  1059. mouse_crd EQU $+1
  1060.         LD DE,#8232; Координаты стрелки D-X,E-Y
  1061.  
  1062. FLASH   LD A,0  ;Мигание курсора
  1063.         AND A
  1064.         RET NZ
  1065.  
  1066. ARON    LD A,D
  1067.         AND 7
  1068.         LD B,A
  1069.         INC B
  1070.         LD A,-1
  1071.         ADD A,A
  1072.         DJNZ $-1
  1073.         LD (arrow2-1),A
  1074.  
  1075.        if EGA
  1076.         ld a,(egaon)
  1077.         or a
  1078.         jp z,ARON_6912
  1079. ;d=x,e=y
  1080.        push de ;xy
  1081.         ld b,0
  1082.        ld a,e ;y
  1083.        cp 0xc0-16
  1084.        jr c,$+4
  1085.        ld a,0xc0-16
  1086.         ld l,a ;y
  1087.         ld c,a
  1088.        ld a,d ;x
  1089.        ;cp 0xf0
  1090.        ;jr c,$+4
  1091.        ;ld a,0xf0
  1092.         srl a
  1093.         srl a ;x bit 0
  1094.          ld h,b;0
  1095.          rl h
  1096.          inc h ;0x40/32/2 или 0x80/32/2
  1097.         srl a ;x bit 1
  1098.          rl h
  1099.         add hl,hl
  1100.         add hl,hl
  1101.         add hl,bc
  1102.         add hl,hl
  1103.         add hl,hl
  1104.         add hl,hl ;y*40+scrbase
  1105.          if scrbase&0xff
  1106.          add a,scrbase&0xff
  1107.          endif
  1108. ;a=x/4
  1109.         add a,l
  1110.         ld l,a
  1111.         adc a,h
  1112.         sub l
  1113.         ld h,a ;hl=scr ;не может быть переполнения при отрицательных x? maxhl = 199*40 + 127 = 8087
  1114.        ld (arroffega_scraddr),hl
  1115.         call setpgsscr40008000 ;visible
  1116.         ld de,(arroffega_bufaddr);mouse_buf
  1117.         ld bc,0x1008
  1118. ;b=hgt,c=wid (/2)
  1119. ;de=gfx
  1120. ;hl=scr
  1121.         call getimgega_onescreen
  1122.         call setpgsmain40008000
  1123.        pop de ;xy
  1124.        
  1125.         ld a,(curarrowtype)
  1126.          cp 45;255
  1127.          ret nc;z ;нет стрелки
  1128.          ;ld a,1
  1129.         ld l,a
  1130.         ld h,0
  1131.         ld c,l
  1132.         ld b,h
  1133.         add hl,hl
  1134.         add hl,hl
  1135.         add hl,hl
  1136.         add hl,hl ;*0x10
  1137.         add hl,bc ;*0x11
  1138.         add hl,hl
  1139.         add hl,hl ;*0x44
  1140.         add hl,bc ;*0x45
  1141.         add hl,hl
  1142.         add hl,hl ;*0x114
  1143.         ld bc,0xc000+4
  1144.         add hl,bc
  1145.         push hl
  1146.         pop iy
  1147.         ld a,PG_SPR
  1148.         call setpg
  1149.         call setpgsscr40008000 ;visible
  1150.         ld c,e ;y
  1151.         ld a,d ;x
  1152.         srl a
  1153.         add a,sprmaxwid-1
  1154.         ld e,a ;x
  1155. ;в 4000,8000 уже включен экран (setpgsscr40008000)
  1156. ;iy=sprite data+2 = spraddr+4
  1157. ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  1158. ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  1159. ;(iy-3)=sprhgt
  1160. ;(iy-4)=sprwid
  1161.        ;push ix
  1162. ;сохраняем переменные prspr (т.к. мы в прерывании, могли прервать prspr)
  1163.        ld a,(prspr_curscrhgt)
  1164.        push af
  1165.        ld (prspr_curscrhgtplus1),a
  1166.        ld hl,(prsprNspraddpatch)
  1167.        ld a,(prsprNpatch)
  1168.        ld h,a
  1169.        push hl
  1170.        ld a,(prsprcolumnpatch)
  1171.        push af
  1172.        ld hl,(prsprmaybeqrightsp)
  1173.        push hl
  1174.        ld hl,(prsprqsp)
  1175.        push hl
  1176.        ld a,192
  1177.        ld (prspr_curscrhgt),a
  1178.        inc a
  1179.        ld (prspr_curscrhgtplus1),a
  1180.         call prspr
  1181.        pop hl
  1182.        ld (prsprqsp),hl
  1183.        pop hl
  1184.        ld (prsprmaybeqrightsp),hl
  1185.        pop af
  1186.        ld (prsprcolumnpatch),a
  1187.        ld (prsprcolumnpatch2),a
  1188.        pop hl
  1189.        ld a,l
  1190.        ld (prsprNspraddpatch),a
  1191.        ld a,h
  1192.        ld (prsprNpatch),a
  1193.        pop af
  1194.        ld (prspr_curscrhgt),a
  1195.        inc a
  1196.        ld (prspr_curscrhgtplus1),a
  1197.        ;pop ix
  1198.         jp setpgsmain40008000
  1199. ARON_6912
  1200.        endif
  1201.  
  1202.         LD A,E
  1203.         RRA
  1204.         SCF
  1205.         RRA
  1206.         SCF      ;*
  1207.         RRA
  1208.         AND #DF  ;#5F
  1209.         LD H,A
  1210.         XOR D
  1211.         AND 7
  1212.         XOR D
  1213.         RRCA
  1214.         RRCA
  1215.         RRCA
  1216.         LD L,A
  1217.         LD A,E
  1218.         XOR H
  1219.         AND 7
  1220.         XOR H
  1221.         LD H,A
  1222.  
  1223. ;HL=адресу на экране
  1224.         LD (ARRTO+1),HL ;Адрес для восстан.
  1225.                         ;изображения под стрелочкой
  1226.         EX DE,HL
  1227.  
  1228.         LD HL,ARROW ;Адрес курсора
  1229.  
  1230.         LD B,16
  1231. arrow1  PUSH BC
  1232.         LD C,(HL)
  1233.         INC HL
  1234.         LD B,(HL)
  1235.         INC HL
  1236.         LD A,(HL)
  1237.         INC HL
  1238.         PUSH HL
  1239.         LD H,(HL)
  1240.         LD L,A
  1241.         PUSH DE
  1242.         LD A,(DE)
  1243.         LD (IX),A
  1244.         LD E,A
  1245.         SCF
  1246.         SBC A,A
  1247.         LD D,0
  1248. arrow2  RL C
  1249.         RL B
  1250.         RLA
  1251.         ADD HL,HL
  1252.         RL D
  1253.         JR C,arrow2
  1254.         AND E
  1255.         XOR D
  1256.         POP DE
  1257.         LD (DE),A
  1258.         INC E
  1259.         LD A,E
  1260.         AND 31
  1261.         LD A,(DE)
  1262.         LD (IX+16),A
  1263.         JR Z,arrow3
  1264.         AND B
  1265.         XOR H
  1266.         LD (DE),A
  1267.         INC E
  1268.         LD A,E
  1269.         AND 31
  1270.         JR Z,arrow3-1
  1271.         LD A,(DE)
  1272.         LD (IX+32),A
  1273.         AND C
  1274.         XOR L
  1275.         LD (DE),A
  1276.         DEC E
  1277. arrow3  DEC E
  1278. ;
  1279. ;Переход на пиксельную строку ниже (новым методом)
  1280.         INC  D
  1281.         LD   A,D
  1282.         AND  #07
  1283.         JR   NZ,arrow4
  1284.         LD   A,E
  1285.         SUB  #E0
  1286.         LD   E,A
  1287.         SBC  A,A
  1288.         AND  #F8
  1289.         ADD  A,D
  1290.         LD   D,A
  1291. ;
  1292. arrow4  POP HL
  1293.         POP BC
  1294.         LD A,D
  1295.         ;CP 88  ;если экран #4000
  1296.         CP #D8  ;если экран #C000
  1297.         RET NC
  1298.         INC IX
  1299.         INC HL
  1300.         DJNZ arrow1
  1301.         RET
  1302.  
  1303. ;Восстановление фона под курсором
  1304. ;Основной алгоритм Alone Coder
  1305. ARROFF
  1306.         LD IX,mouse_buf
  1307. ARRTO   LD HL,0
  1308.  
  1309.         LD A,(FLASH+1)
  1310.         AND A
  1311.         RET NZ
  1312.  
  1313.        if EGA
  1314.         ld a,(egaon)
  1315.         or a
  1316.         jr z,arroff_6912
  1317. arroffega_scraddr=$+1
  1318.         ld hl,0
  1319.        ld a,h
  1320.        or a
  1321.        ret z
  1322. arroffega_bufaddr=$+1
  1323.         LD de,mouse_buf
  1324.        call setpgsscr40008000;_current ;visible
  1325.         ld bc,0x1008
  1326. ;b=hgt,c=wid (/2)
  1327. ;de=gfx
  1328. ;hl=scr
  1329.         jp primgega_onescreen_setpgsmain40008000
  1330. arroff_6912
  1331.        endif
  1332.  
  1333.         LD BC,#101F
  1334. arroff1 LD A,(IX)
  1335.         LD (HL),A
  1336.         INC L
  1337.         LD A,L
  1338.         AND C
  1339.         JR Z,arroff2+1
  1340.         LD A,(IX+16)
  1341.         LD (HL),A
  1342.         INC L
  1343.         LD A,L
  1344.         AND C
  1345.         JR Z,arroff2
  1346.         LD A,(IX+32)
  1347.         LD (HL),A
  1348. arroff2 DEC L
  1349.         DEC L
  1350.         INC IX
  1351.         CALL LINE_HL
  1352.         LD A,H
  1353.         CP #D8   ;#C000+6144/256
  1354.         RET Z
  1355.         DJNZ arroff1
  1356.         RET
  1357.  
  1358. ;Восстановление фона под курсором на теневом экране
  1359. ;Основной алгоритм Alone Coder
  1360. ARROFFS LD HL,0
  1361.  
  1362.         LD A,(FLASH+1)
  1363.         AND A
  1364.         RET NZ
  1365.  
  1366.        if EGA
  1367.         ld a,(egaon)
  1368.         or a
  1369.         ret nz ;TODO rearrow_shadowscr
  1370.        endif
  1371.  
  1372.         LD IX,mouse_buf
  1373.         LD BC,SCRWD+(#10*256) ;#101F
  1374.         LD DE,31
  1375.  
  1376. ;Проверка на выход за нижнюю границу теневого экрана
  1377.         LD A,H
  1378. ARS     CP SCRHG+(SHADSCR/256)
  1379.         RET NC
  1380.  
  1381. ;Проверка на выход за правую границу теневого экрана
  1382.         LD A,L
  1383.         AND E
  1384.         CP C
  1385.         RET NC
  1386.  
  1387. arrOFF1 LD A,(IX)
  1388.         LD (HL),A
  1389.         INC HL
  1390.  
  1391. ;Проверка на выход за правую границу теневого экрана
  1392.         LD A,L
  1393.         AND E
  1394.         CP C
  1395.         JR NC,arrOFF2+1
  1396.         LD A,(IX+16)
  1397.         LD (HL),A
  1398.         INC HL
  1399.  
  1400. ;Проверка на выход за правую границу теневого экрана
  1401.         LD A,L
  1402.         AND E
  1403.         CP C
  1404.         JR NC,arrOFF2
  1405.         LD A,(IX+32)
  1406.         LD (HL),A
  1407. arrOFF2 DEC HL
  1408.         ADD HL,DE
  1409.         INC IX
  1410.  
  1411. ;Проверка на выход за нижнюю границу теневого экрана
  1412.         LD A,H
  1413. ARS2    CP SCRHG+(SHADSCR/256)
  1414.         RET NC
  1415.         DJNZ arrOFF1
  1416.         RET
  1417.  
  1418. ;Печать курсора на теневом экране
  1419. ;Формат теневого экрана линейный
  1420. ARRONS  LD DE,(mouse_crd); Координаты стрелки D-X,E-Y
  1421.  
  1422.         LD A,(FLASH+1)
  1423.         AND A
  1424.         RET NZ
  1425.  
  1426.        if EGA
  1427.         ld a,(egaon)
  1428.         or a
  1429.         ret nz ;TODO arrow_shadowscr
  1430.        endif
  1431.  
  1432.         LD A,D
  1433.         LD D,E
  1434.         LD E,A
  1435.  
  1436.         AND 7
  1437.  
  1438.         DUP 3
  1439.         SRL D
  1440.         RR E
  1441.         EDUP
  1442.  
  1443.         LD HL,SHADSCR
  1444.         ADD HL,DE
  1445.         INC A
  1446.         LD B,A
  1447.         LD A,-1
  1448.         ADD A,A
  1449.         DJNZ $-1
  1450.  
  1451.         LD (arrow22-1),A
  1452.         LD (ARROFFS+1),HL ;Адрес для вспом. изобр. под стрелкой
  1453.         ;HL=адресу на теневом экране
  1454.  
  1455. ;Проверка на выход за правую границу теневого экрана
  1456.         LD A,L
  1457.         AND 31
  1458.         CP SCRWD
  1459.         RET NC
  1460.  
  1461. ;Проверка на выход за нижнюю границу теневого экрана
  1462.         LD A,H
  1463. ARO     CP SCRHG+(SHADSCR/256)
  1464.         RET NC
  1465.  
  1466.         EX DE,HL
  1467.  
  1468.         LD HL,ARROW ;Адрес курсора
  1469.         LD IX,mouse_buf  ;буфер изобр. под курсором (48 байт)
  1470.         LD B,16
  1471. arrow12 PUSH BC
  1472.         LD C,(HL)
  1473.         INC HL
  1474.         LD B,(HL)
  1475.         INC HL
  1476.         LD A,(HL)
  1477.         INC HL
  1478.         PUSH HL
  1479.         LD H,(HL)
  1480.         LD L,A
  1481.         PUSH DE
  1482.         LD A,(DE)
  1483.         LD (IX),A
  1484.         LD E,A
  1485.         SCF
  1486.         SBC A,A
  1487.         LD D,0
  1488. arrow22 RL C
  1489.         RL B
  1490.         RLA
  1491.         ADD HL,HL
  1492.         RL D
  1493.         JR C,arrow22
  1494.         AND E
  1495.         XOR D
  1496.         POP DE
  1497.         LD (DE),A
  1498.  
  1499. ;Проверка на выход за правую границу теневого экрана
  1500.         INC DE
  1501.         LD A,E
  1502.         AND 31
  1503.         CP SCRWD
  1504.         JR NC,arrow32+1
  1505.         LD A,(DE)
  1506.         LD (IX+16),A
  1507.         AND B
  1508.         XOR H
  1509.         LD (DE),A
  1510.  
  1511. ;Проверка на выход за правую границу теневого экрана
  1512.         INC DE
  1513.         LD A,E
  1514.         AND 31
  1515.         CP SCRWD
  1516.         JR NC,arrow32
  1517.         LD A,(DE)
  1518.  
  1519.         LD (IX+32),A
  1520.         AND C
  1521.         XOR L
  1522.         LD (DE),A
  1523. arrow32 DEC DE
  1524.         DEC DE
  1525.         LD HL,32
  1526.         ADD HL,DE
  1527.         EX DE,HL
  1528. arrow42 POP HL
  1529.         POP BC
  1530.  
  1531. ;Проверка на выход за нижнюю границу теневого экрана
  1532.         LD A,D
  1533. ARO2    CP SCRHG+(SHADSCR/256)
  1534.         RET NC
  1535.         INC IX
  1536.         INC HL
  1537.         DJNZ arrow12
  1538.         RET
  1539.  
  1540. ;Создание маски у спрайта 2*2 знакоместа
  1541. ;16.05.2004, by A.Xor
  1542. ;25.11.2004 Изменения
  1543. MASK
  1544. ;A-номер спрайта
  1545. ;1 Сдвиг вправо, влево
  1546. curarrowtype=$+1
  1547.         LD B,255
  1548.         LD (curarrowtype),A
  1549.         CP B
  1550.         RET Z
  1551.        if EGA
  1552.         ld a,(egaon)
  1553.         or a
  1554.         ;jr z,MASK6912
  1555.         ret nz
  1556. ;MASK6912
  1557.        endif
  1558.         HALT
  1559.         ADD A,A
  1560.         ADD A,A
  1561. MSK     LD H,0
  1562.         LD L,A
  1563.         ADD HL,HL   ;HL*32
  1564.         ADD HL,HL
  1565.         ADD HL,HL
  1566.         LD DE,ARROWS
  1567.         ADD HL,DE
  1568.         LD (MSKMIX+1),HL
  1569.         LD (MSKMIX2+1),HL
  1570.         LD IX,ARROW
  1571.        
  1572.          ;ld a,PG_VIEW
  1573.          ;call PAGE ;почему не было???
  1574.  
  1575.         LD A,16
  1576. MSKLP2  EX AF,AF' ;'
  1577.         LD D,(HL)
  1578.         INC HL
  1579.         LD E,(HL)
  1580.         INC HL
  1581.         EX DE,HL
  1582.         LD B,H
  1583.         LD C,L
  1584.         ADD HL,HL
  1585.         LD A,L
  1586.         OR C
  1587.         LD L,A
  1588.         LD A,H
  1589.         OR B
  1590.         LD H,A
  1591.         LD A,C
  1592.         SRL B
  1593.         RRA
  1594.         OR L
  1595.         LD (IX),A
  1596.         LD A,H
  1597.         OR B
  1598.         LD (IX+1),A
  1599.         EX DE,HL
  1600.         INC IX
  1601.         INC IX
  1602.         INC IX
  1603.         INC IX
  1604.         EX AF,AF' ;'
  1605.         DEC A
  1606.         JR NZ,MSKLP2
  1607.  
  1608. ;2 Сдвиг вверх
  1609.         LD DE,ARROW+4
  1610.         LD HL,ARROW
  1611.         LD B,15
  1612. MSKLP3  LD A,(DE)
  1613.         OR (HL)
  1614.         LD (HL),A
  1615.         INC HL
  1616.         INC DE
  1617.         LD A,(DE)
  1618.         OR (HL)
  1619.         LD (HL),A
  1620.         INC HL,HL,HL
  1621.         INC DE,DE,DE
  1622.         DJNZ MSKLP3
  1623.  
  1624. ;3 Сдвиг вниз
  1625.         LD DE,ARROW+57
  1626.         LD HL,ARROW+61
  1627.         LD B,15
  1628. MSKLP4  LD A,(DE)
  1629.         OR (HL)
  1630.         LD (HL),A
  1631.         DEC HL,DE
  1632.         LD A,(DE)
  1633.         OR (HL)
  1634.         LD (HL),A
  1635.         DEC HL,HL,HL
  1636.         DEC DE,DE,DE
  1637.         DJNZ MSKLP4
  1638.  
  1639. MSKMOD  LD A,0
  1640.         AND A
  1641.         JR NZ,MSKMIX2-3
  1642.  
  1643. ;4 Микшируем спрайт и маску
  1644.         LD HL,ARROW
  1645. MSKMIX  LD DE,ARROWS
  1646.         LD B,16
  1647. MSKLP5  LD A,(HL)
  1648.         CPL
  1649.         LD (HL),A
  1650.         INC HL
  1651.         LD A,(HL)
  1652.         CPL
  1653.         LD (HL),A
  1654.         INC HL
  1655.         INC HL
  1656.         LD A,(DE)
  1657.         INC DE
  1658.         LD (HL),A
  1659.         LD A,(DE)
  1660.         INC DE
  1661.         DEC HL
  1662.         LD (HL),A
  1663.         INC HL
  1664.         INC HL
  1665.         DJNZ MSKLP5
  1666.         RET
  1667.  
  1668. ;5 Микшируем спрайт и маску
  1669. ;для не активных вещей на поле (спрайты инвертированы)
  1670.         LD DE,ARROW
  1671. MSKMIX2 LD HL,ARROWS
  1672.         LD B,16
  1673. MSKLP6  LD A,(DE)
  1674.         LD C,A
  1675.         CPL
  1676.         LD (DE),A
  1677.         INC DE
  1678.         LD A,(DE)
  1679.         CPL
  1680.         LD (DE),A
  1681.         INC DE
  1682.         INC DE
  1683.         CPL
  1684.         XOR (HL)
  1685.         INC HL
  1686.         LD (DE),A
  1687.         LD A,C
  1688.         XOR (HL)
  1689.         INC HL
  1690.         DEC DE
  1691.         LD (DE),A
  1692.         INC DE
  1693.         INC DE
  1694.         DJNZ MSKLP6
  1695.         RET
  1696.  
  1697. ;Сюда кидается видео-поток
  1698. ;Нужно следить, чтобы не наехал на код!
  1699.  
  1700. VIDEOS  EQU #C000-12288
  1701.  
  1702. ;Обмен данных
  1703. EXCH
  1704.         LD A,PG_EXCH;PG_MAP
  1705.         CALL PAGE
  1706.         LD HL,VIDEOS
  1707.         LD DE,MAP
  1708.         LD BC,12288
  1709.         LD A,(DE)
  1710.         LDI
  1711.         DEC HL
  1712.         LD (HL),A
  1713.         INC HL
  1714.         JP PE,$-6
  1715.         RET
  1716.