Login

Subversion Repositories NedoOS

Rev

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

        ;MAIN "VERA",8

;IM_2 Программа на вторых прерываниях
;       ORG IM2 ;#6666
IMS
       if INT_IM2
        EX (SP),HL
        LD (adr_ret+1),HL
        POP HL
        LD (IM2_SP+1),SP
        PUSH BC     ;процедуры печати спрайтов
                    ;должны оперировать с регистром BC (POP BC)
        LD SP,VARS  ;может быть любым, только с умом!
        PUSH IX,IY,HL,DE,BC,AF
        EX AF,AF' ;'
        EXX
        PUSH HL,DE,BC,AF
       endif

        LD A,(curpgc000) ;ok ;(NUMPAGE)  ;Запоминаем номер текущ. стр.
        LD (RST_PGp1),A
IM2Nm2=$+1
        JP IM2N

IM2N    ;LD A,PG_VIEW
        CALL PAGE_PG_VIEW

       if EGA
       ld a,(im_arroff)
       cp 55
       CALL nz,ARROFF ;стирание курсора на основном (visible) экране (т.е. не там, где сейчас рисуются тайлы)
       else
        CALL ARROFF ;стирание курсора на основном (visible) экране (т.е. не там, где сейчас рисуются тайлы)
       endif

        CALL DAYS ;вывод спрайта дня-ночи

        LD A,(DIALOG+1)
        AND A
        CALL NZ,WKEYS ;кнопка ">>" в диалоге
        CALL Z,FL_MESH

TXT0    LD A,PG_MUZ
        CALL PAGE

TXT     LD HL,ONESYM+1;адрес текущ. символа
        LD A,(HL)
        INC HL
        LD B,(HL)
        EXA
        ;LD A,PG_VIEW
        CALL PAGE_PG_VIEW
        EXA
        LD DE,ONESYM
        LD (DE),A
        CP 5
        JR NZ,TOKN
;Особый скрипт должен выдать в HL адрес диалога
        LD A,B
        CALL SCRIPT
        LD (TXT+1),HL
        JR TXT0

TOKN    CP TOKEN
        JR C,CLT
        LD (TXT+1),HL
TXT1    LD HL,#0A11   ;H-X,L-Y текущ. позиция печати
        CP 13
        JR NZ,TXT3
TXT2    LD H,10
        INC L
        JR TXT4
TXT3    
       if EGA
        ;ld ix,0x3fc9 ;bg color 9 (green), color 7 (white)
        ld ix,0x00c9 ;bg color 9 (green), color 0 (black)
       endif
        CALL PR64    ;посимвольная печать в окне диалога ;TODO только на теневом экране
        ld a,55 ;"scf"
        ld (wasdrawimg),a ;по идее надо до вывода, но мы в прерывании, без разницы
        INC H
TXT4    LD (TXT1+1),HL

CLT     JR PRT
        CALL CLTXT
        LD A,PRT-CLT-2
        LD (CLT+1),A

PRT     JR INV
        LD DE,0     ;адрес строки
        LD HL,#320E ;H-X,L-Y
       if EGA
        ld ix,0x003f ;bg color 7 (white), color 0 (black)
       endif
        CALL PR64 ;TODO только на теневом экране
        LD A,INV-PRT-2
        LD (PRT+1),A
        ld a,55 ;"scf"
        ld (wasdrawimg),a ;по идее надо до вывода, но мы в прерывании, без разницы

;Печать вещей 3*3 в мешке
INV     LD A,1
        DEC A
        JR NZ,DIAL
        LD (INV+1),A

MSTRT   LD IY,MESHOK ;начальный спрайт мешка
        LD L,(IY)
        LD H,A;=0    ;HL=спрайту из мешка

        ld a,55 ;"scf"
        ld (wasdrawimg),a

        CALL HL72    ;HL=адресу спрайта
       if EGA
        ld de,iconsscraddr
       else
        LD DE,#C099  ;DE=адрес в экране
       endif
        CALL BLOCK33

        LD L,(IY+1)
        LD H,0
       if EGA
        ld de,iconsscraddr+3
       else
        LD DE,#C09C
       endif
        CALL HL72
        CALL BLOCK33

        LD L,(IY+2)
        LD H,0
       if EGA
        ld de,iconsscraddr+(40*24)
       else
        LD DE,#C0F9
       endif
        CALL HL72
        CALL BLOCK33

        LD L,(IY+3)
        LD H,0
       if EGA
        ld de,iconsscraddr+(40*24)+3
       else
        LD DE,#C0FC
       endif
        CALL HL72
        CALL BLOCK33

        LD L,(IY+4)
        LD H,0
       if EGA
        ld de,iconsscraddr+(40*48)
       else
        LD DE,#C859
       endif
        CALL HL72
        CALL BLOCK33

        LD L,(IY+5)
        LD H,0
       if EGA
        ld de,iconsscraddr+(40*48)+3
       else
        LD DE,#C85C
       endif
        CALL HL72
        CALL BLOCK33

;Печатаем лица
DIAL
        LD A,0
        DEC A
        JR NZ,FLOOP
        LD (DIAL+1),A

        ld a,55 ;"scf"
        ld (wasdrawimg),a
       if EGA
        LD HL,0xc000+(38*72*4) ;лицо гл. героя
        ld de,faceiconsscraddr
       else
        LD HL,SPR33+(38*72) ;лицо гл. героя
        LD DE,#D021
       endif
        CALL BLOCK33

WHO     LD HL,0             ;лицо собеседника
        CALL HL72
       if EGA
        ld de,faceiconsscraddr+(40*24)
       else
        LD DE,#D081
       endif
        CALL BLOCK33

;Мигание курсора
FLOOP   LD HL,FLASH+1
        LD A,(DISTV)
        ADD A,A
        LD BC,#0538  ;JR C,CT2
        JR C,$+4
        JR NZ,CTER1
        LD (HL),0    ;A=0
        LD BC,#0418  ;JR CT2-1
CTER1   LD (CTMOD),BC

CTER2   LD A,0
        INC A

SPDFL   CP FR           ;скорость мигания курсора

CTMOD   JR C,CT2        ;JR/JR C
        LD A,(HL)
        XOR 1
        LD (HL),A
        XOR A
CT2     LD (CTER2+1),A

;Идет ли обновление экрана?
BUSY
        LD A,0
       if EGA
;если что-то рисовали в теневом экране, то надо снова прочитать графику под стрелкой на теневом экране и сбросить этот флаг
;[а что если нарисовали и ещё переключили экран? невозможно, т.к. между этими двумя действиями стоит halt]
wasdrawimg=$
        or a ;если рисовали на теневом экране, то scf
        jr nc,IM2nowasdrawimg
        ld hl,(arroffega_scraddr2)
        call setpgsscr40008000_current ;shadow
        ld de,(arroffega_bufaddr2);mouse_buf
        ld bc,0x1008
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
        call getimgega_onescreen
        call setpgsmain40008000
        ld a,55+128 ;"or a"
        ld (wasdrawimg),a
IM2nowasdrawimg

im_swapscr=$
        or a
        jr nc,im_swapscrq
        call swapre
        call setcurscr_change
curscrnum_int=$+1
        ld e,0
        OS_SETSCREEN
        ld a,55+128 ;"or a"
        ld (im_swapscr),a
im_swapscrq

im_arroff=$
        or a
        CALL nc,ARRON      ;рисование курсора на основном экране
       else
        AND A
        PUSH AF
        CALL NZ,ARROFFS ;стирание курсора на теневом экране
        CALL ARRON      ;рисование курсора на основном экране
        POP AF
        CALL NZ,ARRONS  ;рисование курсора на теневом экране
       endif

PRTIME
        LD A,0 ;таймер для стирания надписи через некот. время
        SUB 1
        ADC A,0
        LD (PRTIME+1),A
PRJR    JR TIMER      ;JR/JR NZ #18/#20
        LD A,#18
        LD (CLT+1),A
        LD (PRJR),A

TIMER   LD HL,MAPINGp2
        INC (HL)

CLOCK   LD A,0
        INC A
        CP 50
        JR C,CLK1
        LD A,(TIME+2) ;сек
        INC A
        CP 60
        JR C,CLK2
        LD A,(TIME+1) ;мин
        INC A
        CP 60
        JR C,CLK3
        LD A,(TIME)   ;час
        INC A
        LD (TIME),A
        XOR A
CLK3    LD (TIME+1),A
        XOR A
CLK2    LD (TIME+2),A
        XOR A
CLK1    LD (CLOCK+1),A

        CALL GOTASK ;выполнить задачу

;Для печати спрайта дня/ночи
SPN
        LD HL,1
        DEC HL
        LD A,H
        OR L
        JR NZ,$+8
        LD (DAY_NGT),A
        LD HL,SPD_NGT
        LD (SPN+1),HL

MUS
        LD A,PG_MUZ
        CALL PAGE
MUSONp1=$+1
        LD A,0
        AND A
        CALL Z,PLAY+2

        LD A,PG_MAP
        CALL PAGE
SAMPLE
        LD HL,0
        CALL SOUND

;Обработка мышки, клавиатуры
        LD HL,(mouse_crd)
        LD (OLD_CRD+1),HL

        LD HL,CCURS+1
        LD A,(HL)
        DEC A
        JR NZ,MSE

CNTCUR  LD A,FRM2
        DEC A
        JR NZ,MSE-3
        LD (HL),A
        LD A,FRM2
        LD (CNTCUR+1),A

MSE      CALL mouse
        AND %11110000
        LD E,A
        PUSH DE

        CALL SCANER
        LD (KEYSp1),A
        LD C,A
        CALL UDLR
        LD A,C
        AND %00010000
;       AND %00110000
        POP DE
        OR E
        LD E,A
        RES 4,E
        AND 16

        LD HL,MKEYSp1
OLDK    LD B,0
        LD ($-1),A
        JR Z,OLDK1    ;если не нажато/отжато

;нажали и держим FIRE
;------
        LD HL,(mouse_crd)
        LD (NEW_CRD),HL
        LD HL,(OLD_CRD+1)
       if FIXMOUSE==0
       LD (mouse_crd),HL
       endif
        LD HL,FMCNT2
        DEC (HL)
        JR NZ,OLDK4
        LD (HL),SCMOD
        LD E,2
        LD HL,CCURS+1 ;меняем спрайт курсора N2/N3
        LD A,(HL)
       if FIXMOUSE==0
       LD (HL),E
       endif
        CP E
        JR NZ,OLDK4
       if FIXMOUSE==0
       INC (HL)
       endif
        JR OLDK4
;------

OLDK1   CP B
        JR Z,OLDK3    ;если не было нажато

;отжали FIRE (щелчок)

        SET 4,E
        LD A,SCMOD    ;восстанавливаем счетчик
        LD (FMCNT2),A

        CALL SCRLMAP  ;Скроллировали ли карту?
        JR NC,OLDK3   ;нет
        LD A,(KARM)
        LD (CCURS+1),A
        LD E,0
OLDK3   LD A,(HL)
        AND %11010000
        JR NZ,$+3     ;еще не обработано
                      ;прошлое нажатие
        LD (HL),E

OLDK4   LD A,#F7   ;"1-5"
        IN A,(#FE)
        AND 31
        LD (DIGKp1),A
;--------

RST_PGp1=$+1
        LD A,0
        SETPGC000;CALL PAGE

IM2EX
       if INT_IM2
;Выход из вторых прерываний
        POP AF,BC,DE,HL
        EX AF,AF' ;'
        EXX
        POP AF,BC,DE,HL,IY,IX
IM2_SP  LD SP,0
        EI
adr_ret JP 0
       else
        ret
       endif

END_IM2

;Инициализ. мышки
INIMOUS LD BC,#FBDF
        IN A,(C)
        LD (ms1+1),A
        LD B,#FF
        IN A,(C)
        LD (ms5+1),A
        JR m_keys

M_SP    CP 6
        RET C
MSPEED  LD B,-4  ;Скорость мыши [-4...+4], 0-без ускорения!
        ADD A,B
        CP 18
        RET C
        ADD A,B
        RET

;OUT: A-BIT 4-лев. клав.
;           5-прав. клав.
;           6-колесо вверх
;           7-колесо вниз
;     B-кол-во строк скролла колеса
mouse
        LD A,255
        AND A
        RET Z

        LD BC,#FBDF
ms1     LD DE,MAX_X*256
        LD HL,mouse_crd+1  ; lef/right
        IN A,(C)
        LD (ms1+1),A
        SUB E
        JR Z,ms4
        JP P,ms2
        NEG
        CALL M_SP     ;Скорость мыши
        NEG
        ADD A,(HL)
        JR C,ms3+1
        XOR A
        JR ms3+1
ms2     CALL M_SP     ;Скорость мыши
        ADD A,(HL)
        JR C,ms3
        CP D
        JR C,ms3+1
ms3     LD A,D
        LD (HL),A
ms4     DEC HL
        LD B,#FF
ms5     LD DE,MAX_Y*256
        IN A,(C)
        LD (ms5+1),A
        SUB E
        JR Z,m_keys
        JP M,ms6
        CALL M_SP     ;Скорость мыши
        NEG
        ADD A,(HL)
        JR C,ms7+1
        XOR A
        JR ms7+1
ms6     NEG
        CALL M_SP     ;Скорость мыши
        ADD A,(HL)
        JR C,ms7
        CP D
        JR C,ms7+1
ms7     LD A,D
        LD (HL),A

;Проверяем кнопки,
;если не ноль, то что-то нажато!
m_keys
        LD B,#FA
        IN A,(C)
        CPL
        RLCA
        RLCA
        RLCA
        RLCA
        LD D,A
        AND %00110000
        LD E,A
ROLL    NOP ;вкл/откл. работу с колесом

;Опрос колеса
;       BIT 6,D ;ср. кнопка

        LD A,D
        AND 15
ROLD    LD B,0
        LD (ROLD+1),A
        SUB B
        JR NZ,ROLB
        LD B,A
        LD A,E
        RET
ROLB    JR C,SCR_DW

;Прокрутить текст вверх на B строчек
SCR_UP  SET 6,D
        LD B,A
        LD A,D
        RET

;Прокрутить текст вниз на B строчек
SCR_DW  SET 7,D
        NEG
        LD B,A
        LD A,D
        RET

;Вверх/вниз/влево/вправо
UDLR
        LD B,0
        LD ($-1),A
        LD C,A
        CALL KEYSPD
        LD A,C
STEP    LD E,1            ;Шаг приращения координат
        LD D,MAX_X        ;Влево/вправо
        LD HL,mouse_crd+1
        RRA
        CALL C,PL
        RRA
        CALL C,MIN

        LD D,MAX_Y        ;Вверх/вниз
        DEC HL
        RRA
        CALL C,PL
        RRA
        CALL C,MIN
        RET

KEYSPD  LD HL,STEP+1
        AND A
        JR Z,KSP2  ;курсор не движется
        CP B
        JR NZ,KSP2 ;появилось новое направление

        LD A,(MSPEED+1)
        NEG
        ADD A,10   ;переменная зависит от скорости курсора
                   ;через это кол-во итераций происходит
                   ;увеличение шага приращения
        LD B,A

KSP0    LD A,0
        INC A
        CP B
        JR C,KSP1
        XOR A
        INC (HL)
KSP1    LD (KSP0+1),A
        RET
KSP2    LD (HL),1
        RET

PL      EX AF,AF' ;'
        LD A,(HL)
        ADD A,E
        JR C,ENDD-1
        CP D
        JR C,ENDD
        LD A,D
ENDD    LD (HL),A
        EX AF,AF' ;'
        RET

MIN     EX AF,AF' ;'
        LD A,(HL)
        SUB E
        JR NC,ENDD
        XOR A
        JR ENDD

;-------Сканирование управления---------
;первые биты (0-3) движение:
;0-RGHT,1-LEFT,2-DWN,3-UP
;4-й - огонь
;5-й бит - курсор вверх, 6-й - вниз
;7-й - Enter
;в режиме игры 5-й бит - нажатие CS или SS

SCANER
        LD A,#BF    ;Enter
        IN A,(#FE)
        CPL
        RRCA
        AND 128
        LD B,A

SCANMOD LD A,0      ;режим 0-в игре, 1-в меню
        AND A
        JR Z,SGAME

        LD A,#FE    ;CS
        IN A,(#FE)
        BIT 0,A
        JR Z,CURSOR
        JR SCANTYP

;в режиме игры совмещаем состояние клавиш CS и SS
;и проверяем как одну
SGAME   LD A,#FE    ;CS
        IN A,(#FE)
        LD C,A
        LD A,#7F    ;SS
        IN A,(#FE)
        RRCA
        AND C
        CPL
        RRCA
        RRCA
        RRCA
        AND %00100000
        OR B
        LD B,A

SCANTYP LD A,0      ;тип управления
        AND A
        JP Z,QAOP

SINCL   LD A,#EF    ;SINCLAIR_RIGHT
        IN A,(#FE)
        RRCA
        RL C
        RRCA
        RL C
        RRCA
        RL C
        RRCA
        RRCA
        RL C
        RLCA
        RLCA
        RL C
        LD A,C
        CPL
        OR B
        RET

QAOP    LD A,#7F    ;SP
        IN A,(#FE)
        RRCA
        RL C
        LD A,#FB    ;Q
        IN A,(#FE)
        RRCA
        RL C
        LD A,#FD    ;A
        IN A,(#FE)
        RRCA
        RL C
        LD A,#DF    ;O,P
        IN A,(#FE)
        RRCA
        RRCA
        RL C
        RLCA
        RLCA
        RL C
        LD A,C
        CPL
        AND 31
        OR B
        RET

CURSOR  LD A,#EF    ;"6"/"7"
        IN A,(#FE)
        RLA
        RLA
        CPL
        AND 64+32
        OR B
        RET

;Распаковщик
LC5
       LD DE,7;SKIP "LCMP5" & LENGTH
       ADD HL,DE

       LD A,(HL)
       INC HL
       LD E,A
       ADD HL,DE

       LD A,(HL)
       LD E,A;pазpыв

       AND 3
       RLCA
       RLCA
       RLCA
       OR #C000/256

       EXX
       LD D,A;начало
       LD E,0
       EXX

       LD A,(HL)
       INC HL
       XOR #C000/256+#18
       AND #FC
       LD HX,A;конец ч/б.

DLC1   LD A,(HL)
       INC HL
       LD LX,#FF
DLC2   EXX
       JR NZ,DLC10
       LD B,1

DLC3   EXA
       SLA D
       JR NZ,$+6
       LD D,(HL)
       INC HL
       SLI D
       DJNZ DLC7
       JR C,DLC1
       INC B
DLC4   LD C,%01010110
       LD A,#FE
DLC5   SLA D
       JR NZ,$+6
       LD D,(HL)
       INC HL
       RL D
       RLA
       SLA C
       JR Z,DLC6
       JR C,DLC5
       RRCA
       JR NC,DLC5
       SUB 8
DLC6   ADD A,9
       DJNZ DLC3

       CP 0-8+1
       JR NZ,$+4
       LD A,(HL)
       INC HL

       ADC A,#FF
       LD LX,A
       JR C,DLC4
;      DI
;      LD A,16+8+7  ;Вкл. видимым 2-й экран
;      LD (page),A
;      LD BC,#7FFD
;      OUT (C),A
;      EI
       RET
DLC7   LD A,(HL)
       INC HL

       EXX
       LD L,A
       EXA
       LD H,A
       ADD HL,DE

       CP #FF-2
       JR NC,DLC8
       DEC LX
DLC8   LD A,H
       CP HX
       JR NC,DLC13
       XOR L
       AND #F8
       XOR L
       LD B,A
       XOR L
       XOR H
       RLCA
       RLCA
       LD C,A

DLC9   EXA
       LD A,(BC)
DLC10  EXA
       LD A,D
       CP HX
       JR NC,DLC14
       XOR E
       AND #F8
       XOR E
       LD B,A
       XOR E
       XOR D
       RLCA
       RLCA
       LD C,A

DLC11  EXA
       LD (BC),A

       INC DE
       JR NC,$+4
       DEC HL
       DEC HL
       INC HL
       EXA
       INC LX
       JR NZ,DLC8
       JP DLC2

DLC13  SCF
DLC14  PUSH AF
       EXX
       ADD A,E
       EXX
       LD B,A
       POP AF
       LD C,E
       JR NC,DLC11
       LD C,L
       JR DLC9

DEHRUST
;HL - FROM, DE - TO
        INC HL
        INC HL
        INC HL ;SKIP "HR2"
        LD A,(HL)
        INC HL
        PUSH DE
        LD C,(HL)
        INC HL
        LD B,(HL)
        INC HL
        DEC BC

        EX DE,HL
        ADD HL,BC
        EX DE,HL

        LD C,(HL)
        INC HL
        LD B,(HL)
        ADD HL,BC

        SBC HL,DE
        ADD HL,DE
        JR C,$+4
        LD D,H
        LD E,L
        PUSH BC
        LDDR
        POP BC

        EX DE,HL
        RLA
        JR NC,DPCYES
        POP DE
        INC HL
        LDIR
        RET

DPCYES  LD DE,7
        ADD HL,DE

        PUSH HL
        EXX
        POP HL
        POP DE

        LD B,6
        DEC HL
        LD A,(HL)
        PUSH AF
        INC SP
        DJNZ $-4

        EXX
        LD DE,#1003
        LD C,#80

DPC1    LD A,(HL)
        INC HL
        EXX
        LD (DE),A
        INC DE
DPC0    EXX
DPC0A   CALL SLAC
        JR C,DPC1

        LD B,#01
DPC4    LD A,%01000000
DPC2    CALL SLAC
        RLA
        JR NC,DPC2

        CP E ;3
        JR C,DPC3
        ADD A,B
        LD B,A
        XOR D ;#10
        JR NZ,DPC4
DPC3    ADD A,B
        CP 4
        JR Z,DPC5 ;B<>1;B=4
        ADC A,#FF
DPC8A   CP 2
DPC8    EXX
        LD C,A
        LD H,#FF
        EXX
        JR C,DPC9 ;B=1

        JR Z,DPC12

        CALL SLAC
        JR C,DPC12

        ;B>=4
        LD A,%01111111
        LD B,E ;3
        DJNZ DPC9A1 ;JR...B=2
DPC9A2  DJNZ DPC5A2
        LD B,A
        SBC A,A

DPC9B   CALL SLAC
        RLA
        DEC A
        INC B
        JR NZ,DPC9B
        CP #FF-30
        JR NZ,$+4
        LD A,(HL)
        INC HL

        EXX
        LD H,A
        EXX

DPC12   LD A,(HL)
        INC HL
DPC11   EXX
        LD L,A
        ADD HL,DE
        LDIR
        JR DPC0

DPC5A2  ADD A,6
        RLA
        LD B,A
DPC5C   LD A,(HL)
        INC HL
        EXX
        LD (DE),A
        INC DE
        EXX
        DJNZ DPC5C
        JR DPC0A

DPC5    ;B=4
        CALL SLAC
        LD A,D ;%00010000
        JR NC,DPC5A1

        LD A,(HL)
        INC HL
        CP D ;16
        JR NC,DPC8A
        OR A
        JR Z,DPC6

        EXX
        LD B,A
        EXX
        LD A,(HL)
        INC HL
        JR DPC8

DPC9    ;B=1
        LD A,%00111111
DPC5A1  ;B=4
DPC9A1  ;B=2
DPC10   CALL SLAC
        RLA
        JR NC,DPC10
        DJNZ DPC9A2
        JR DPC11

SLAC    SLA C
        RET NZ
        LD C,(HL)
        INC HL
        RL C
        RET

DPC6    EXX
        LD B,6
        DEC SP
        POP AF
        LD (DE),A
        INC DE
        DJNZ $-4
        RET

;Изображение под стрелкой кидаем в буфер
;и рисуем саму стрелку
;Формат спрайта стрелки хитрый:
;сначала слово маски (младший, затем старший байт),
;потом идет слово спрайта (мл., старший байты)
;(c) Основной алгоритм Alone Coder
;(c) Небольшая переработка Саша Ксор
;6.02.2003
ARRON
        LD IX,mouse_buf ;буфер под курсором (48 байт)
mouse_crd EQU $+1
        LD DE,#8232; Координаты стрелки D-X,E-Y

FLASH   LD A,0  ;Мигание курсора
        AND A
        RET NZ

ARON    LD A,D
        AND 7
        LD B,A
        INC B
        LD A,-1
        ADD A,A
        DJNZ $-1
        LD (arrow2-1),A

       if EGA
        ld a,(egaon)
        or a
        jp z,ARON_6912
;d=x,e=y
       push de ;xy
        ld b,0
       ld a,e ;y
       cp 0xc0-16
       jr c,$+4
       ld a,0xc0-16
        ld l,a ;y
        ld c,a
       ld a,d ;x
       ;cp 0xf0
       ;jr c,$+4
       ;ld a,0xf0
        srl a
        srl a ;x bit 0
         ld h,b;0
         rl h
         inc h ;0x40/32/2 или 0x80/32/2
        srl a ;x bit 1
         rl h
        add hl,hl
        add hl,hl
        add hl,bc
        add hl,hl
        add hl,hl
        add hl,hl ;y*40+scrbase
         if scrbase&0xff
         add a,scrbase&0xff
         endif
;a=x/4
        add a,l
        ld l,a
        adc a,h
        sub l
        ld h,a ;hl=scr ;не может быть переполнения при отрицательных x? maxhl = 199*40 + 127 = 8087
       ld (arroffega_scraddr),hl
        call setpgsscr40008000 ;visible
        ld de,(arroffega_bufaddr);mouse_buf
        ld bc,0x1008
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
        call getimgega_onescreen
        call setpgsmain40008000
       pop de ;xy
       
        ld a,(curarrowtype)
         cp 45;255
         ret nc;z ;нет стрелки
         ;ld a,1
        ld l,a
        ld h,0
        ld c,l
        ld b,h
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl ;*0x10
        add hl,bc ;*0x11
        add hl,hl
        add hl,hl ;*0x44
        add hl,bc ;*0x45
        add hl,hl
        add hl,hl ;*0x114
        ld bc,0xc000+4
        add hl,bc
        push hl
        pop iy
        ld a,PG_SPR
        call setpg
        call setpgsscr40008000 ;visible
        ld c,e ;y
        ld a,d ;x
        srl a
        add a,sprmaxwid-1
        ld e,a ;x
;в 4000,8000 уже включен экран (setpgsscr40008000)
;iy=sprite data+2 = spraddr+4
;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
;(iy-3)=sprhgt
;(iy-4)=sprwid
       ;push ix
;сохраняем переменные prspr (т.к. мы в прерывании, могли прервать prspr)
       ld a,(prspr_curscrhgt)
       push af
       ld (prspr_curscrhgtplus1),a
       ld hl,(prsprNspraddpatch)
       ld a,(prsprNpatch)
       ld h,a
       push hl
       ld a,(prsprcolumnpatch)
       push af
       ld hl,(prsprmaybeqrightsp)
       push hl
       ld hl,(prsprqsp)
       push hl
       ld a,192
       ld (prspr_curscrhgt),a
       inc a
       ld (prspr_curscrhgtplus1),a
        call prspr
       pop hl
       ld (prsprqsp),hl
       pop hl
       ld (prsprmaybeqrightsp),hl
       pop af
       ld (prsprcolumnpatch),a
       ld (prsprcolumnpatch2),a
       pop hl
       ld a,l
       ld (prsprNspraddpatch),a
       ld a,h
       ld (prsprNpatch),a
       pop af
       ld (prspr_curscrhgt),a
       inc a
       ld (prspr_curscrhgtplus1),a
       ;pop ix
        jp setpgsmain40008000
ARON_6912
       endif

        LD A,E
        RRA
        SCF
        RRA
        SCF      ;*
        RRA
        AND #DF  ;#5F
        LD H,A
        XOR D
        AND 7
        XOR D
        RRCA
        RRCA
        RRCA
        LD L,A
        LD A,E
        XOR H
        AND 7
        XOR H
        LD H,A

;HL=адресу на экране
        LD (ARRTO+1),HL ;Адрес для восстан.
                        ;изображения под стрелочкой
        EX DE,HL

        LD HL,ARROW ;Адрес курсора

        LD B,16
arrow1  PUSH BC
        LD C,(HL)
        INC HL
        LD B,(HL)
        INC HL
        LD A,(HL)
        INC HL
        PUSH HL
        LD H,(HL)
        LD L,A
        PUSH DE
        LD A,(DE)
        LD (IX),A
        LD E,A
        SCF
        SBC A,A
        LD D,0
arrow2  RL C
        RL B
        RLA
        ADD HL,HL
        RL D
        JR C,arrow2
        AND E
        XOR D
        POP DE
        LD (DE),A
        INC E
        LD A,E
        AND 31
        LD A,(DE)
        LD (IX+16),A
        JR Z,arrow3
        AND B
        XOR H
        LD (DE),A
        INC E
        LD A,E
        AND 31
        JR Z,arrow3-1
        LD A,(DE)
        LD (IX+32),A
        AND C
        XOR L
        LD (DE),A
        DEC E
arrow3  DEC E
;
;Переход на пиксельную строку ниже (новым методом)
        INC  D
        LD   A,D
        AND  #07
        JR   NZ,arrow4
        LD   A,E
        SUB  #E0
        LD   E,A
        SBC  A,A
        AND  #F8
        ADD  A,D
        LD   D,A
;
arrow4  POP HL
        POP BC
        LD A,D
        ;CP 88  ;если экран #4000
        CP #D8  ;если экран #C000
        RET NC
        INC IX
        INC HL
        DJNZ arrow1
        RET

;Восстановление фона под курсором
;Основной алгоритм Alone Coder
ARROFF
        LD IX,mouse_buf
ARRTO   LD HL,0

        LD A,(FLASH+1)
        AND A
        RET NZ

       if EGA
        ld a,(egaon)
        or a
        jr z,arroff_6912
arroffega_scraddr=$+1
        ld hl,0
       ld a,h
       or a
       ret z
arroffega_bufaddr=$+1
        LD de,mouse_buf
       call setpgsscr40008000;_current ;visible
        ld bc,0x1008
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
        jp primgega_onescreen_setpgsmain40008000
arroff_6912
       endif

        LD BC,#101F
arroff1 LD A,(IX)
        LD (HL),A
        INC L
        LD A,L
        AND C
        JR Z,arroff2+1
        LD A,(IX+16)
        LD (HL),A
        INC L
        LD A,L
        AND C
        JR Z,arroff2
        LD A,(IX+32)
        LD (HL),A
arroff2 DEC L
        DEC L
        INC IX
        CALL LINE_HL
        LD A,H
        CP #D8   ;#C000+6144/256
        RET Z
        DJNZ arroff1
        RET

;Восстановление фона под курсором на теневом экране
;Основной алгоритм Alone Coder
ARROFFS LD HL,0

        LD A,(FLASH+1)
        AND A
        RET NZ

       if EGA
        ld a,(egaon)
        or a
        ret nz ;TODO rearrow_shadowscr
       endif

        LD IX,mouse_buf
        LD BC,SCRWD+(#10*256) ;#101F
        LD DE,31

;Проверка на выход за нижнюю границу теневого экрана
        LD A,H
ARS     CP SCRHG+(SHADSCR/256)
        RET NC

;Проверка на выход за правую границу теневого экрана
        LD A,L
        AND E
        CP C
        RET NC

arrOFF1 LD A,(IX)
        LD (HL),A
        INC HL

;Проверка на выход за правую границу теневого экрана
        LD A,L
        AND E
        CP C
        JR NC,arrOFF2+1
        LD A,(IX+16)
        LD (HL),A
        INC HL

;Проверка на выход за правую границу теневого экрана
        LD A,L
        AND E
        CP C
        JR NC,arrOFF2
        LD A,(IX+32)
        LD (HL),A
arrOFF2 DEC HL
        ADD HL,DE
        INC IX

;Проверка на выход за нижнюю границу теневого экрана
        LD A,H
ARS2    CP SCRHG+(SHADSCR/256)
        RET NC
        DJNZ arrOFF1
        RET

;Печать курсора на теневом экране
;Формат теневого экрана линейный
ARRONS  LD DE,(mouse_crd); Координаты стрелки D-X,E-Y

        LD A,(FLASH+1)
        AND A
        RET NZ

       if EGA
        ld a,(egaon)
        or a
        ret nz ;TODO arrow_shadowscr
       endif

        LD A,D
        LD D,E
        LD E,A

        AND 7

        DUP 3
        SRL D
        RR E
        EDUP

        LD HL,SHADSCR
        ADD HL,DE
        INC A
        LD B,A
        LD A,-1
        ADD A,A
        DJNZ $-1

        LD (arrow22-1),A
        LD (ARROFFS+1),HL ;Адрес для вспом. изобр. под стрелкой
        ;HL=адресу на теневом экране

;Проверка на выход за правую границу теневого экрана
        LD A,L
        AND 31
        CP SCRWD
        RET NC

;Проверка на выход за нижнюю границу теневого экрана
        LD A,H
ARO     CP SCRHG+(SHADSCR/256)
        RET NC

        EX DE,HL

        LD HL,ARROW ;Адрес курсора
        LD IX,mouse_buf  ;буфер изобр. под курсором (48 байт)
        LD B,16
arrow12 PUSH BC
        LD C,(HL)
        INC HL
        LD B,(HL)
        INC HL
        LD A,(HL)
        INC HL
        PUSH HL
        LD H,(HL)
        LD L,A
        PUSH DE
        LD A,(DE)
        LD (IX),A
        LD E,A
        SCF
        SBC A,A
        LD D,0
arrow22 RL C
        RL B
        RLA
        ADD HL,HL
        RL D
        JR C,arrow22
        AND E
        XOR D
        POP DE
        LD (DE),A

;Проверка на выход за правую границу теневого экрана
        INC DE
        LD A,E
        AND 31
        CP SCRWD
        JR NC,arrow32+1
        LD A,(DE)
        LD (IX+16),A
        AND B
        XOR H
        LD (DE),A

;Проверка на выход за правую границу теневого экрана
        INC DE
        LD A,E
        AND 31
        CP SCRWD
        JR NC,arrow32
        LD A,(DE)

        LD (IX+32),A
        AND C
        XOR L
        LD (DE),A
arrow32 DEC DE
        DEC DE
        LD HL,32
        ADD HL,DE
        EX DE,HL
arrow42 POP HL
        POP BC

;Проверка на выход за нижнюю границу теневого экрана
        LD A,D
ARO2    CP SCRHG+(SHADSCR/256)
        RET NC
        INC IX
        INC HL
        DJNZ arrow12
        RET

;Создание маски у спрайта 2*2 знакоместа
;16.05.2004, by A.Xor
;25.11.2004 Изменения
MASK
;A-номер спрайта
;1 Сдвиг вправо, влево
curarrowtype=$+1
        LD B,255
        LD (curarrowtype),A
        CP B
        RET Z
       if EGA
        ld a,(egaon)
        or a
        ;jr z,MASK6912
        ret nz
;MASK6912
       endif
        HALT
        ADD A,A
        ADD A,A
MSK     LD H,0
        LD L,A
        ADD HL,HL   ;HL*32
        ADD HL,HL
        ADD HL,HL
        LD DE,ARROWS
        ADD HL,DE
        LD (MSKMIX+1),HL
        LD (MSKMIX2+1),HL
        LD IX,ARROW
       
         ;ld a,PG_VIEW
         ;call PAGE ;почему не было???

        LD A,16
MSKLP2  EX AF,AF' ;'
        LD D,(HL)
        INC HL
        LD E,(HL)
        INC HL
        EX DE,HL
        LD B,H
        LD C,L
        ADD HL,HL
        LD A,L
        OR C
        LD L,A
        LD A,H
        OR B
        LD H,A
        LD A,C
        SRL B
        RRA
        OR L
        LD (IX),A
        LD A,H
        OR B
        LD (IX+1),A
        EX DE,HL
        INC IX
        INC IX
        INC IX
        INC IX
        EX AF,AF' ;'
        DEC A
        JR NZ,MSKLP2

;2 Сдвиг вверх
        LD DE,ARROW+4
        LD HL,ARROW
        LD B,15
MSKLP3  LD A,(DE)
        OR (HL)
        LD (HL),A
        INC HL
        INC DE
        LD A,(DE)
        OR (HL)
        LD (HL),A
        INC HL,HL,HL
        INC DE,DE,DE
        DJNZ MSKLP3

;3 Сдвиг вниз
        LD DE,ARROW+57
        LD HL,ARROW+61
        LD B,15
MSKLP4  LD A,(DE)
        OR (HL)
        LD (HL),A
        DEC HL,DE
        LD A,(DE)
        OR (HL)
        LD (HL),A
        DEC HL,HL,HL
        DEC DE,DE,DE
        DJNZ MSKLP4

MSKMOD  LD A,0
        AND A
        JR NZ,MSKMIX2-3

;4 Микшируем спрайт и маску
        LD HL,ARROW
MSKMIX  LD DE,ARROWS
        LD B,16
MSKLP5  LD A,(HL)
        CPL
        LD (HL),A
        INC HL
        LD A,(HL)
        CPL
        LD (HL),A
        INC HL
        INC HL
        LD A,(DE)
        INC DE
        LD (HL),A
        LD A,(DE)
        INC DE
        DEC HL
        LD (HL),A
        INC HL
        INC HL
        DJNZ MSKLP5
        RET

;5 Микшируем спрайт и маску
;для не активных вещей на поле (спрайты инвертированы)
        LD DE,ARROW
MSKMIX2 LD HL,ARROWS
        LD B,16
MSKLP6  LD A,(DE)
        LD C,A
        CPL
        LD (DE),A
        INC DE
        LD A,(DE)
        CPL
        LD (DE),A
        INC DE
        INC DE
        CPL
        XOR (HL)
        INC HL
        LD (DE),A
        LD A,C
        XOR (HL)
        INC HL
        DEC DE
        LD (DE),A
        INC DE
        INC DE
        DJNZ MSKLP6
        RET

;Сюда кидается видео-поток
;Нужно следить, чтобы не наехал на код!

VIDEOS  EQU #C000-12288

;Обмен данных
EXCH
        LD A,PG_EXCH;PG_MAP
        CALL PAGE
        LD HL,VIDEOS
        LD DE,MAP
        LD BC,12288
        LD A,(DE)
        LDI
        DEC HL
        LD (HL),A
        INC HL
        JP PE,$-6
        RET