;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