;LAST UPDATE: 06.03.2011 savelij
SELECTOR XOR A
OUT (PEVO_CONF),A
CALL DETECTMOUSE
EI
LD A,(FLAGS)
AND 2 ;ПРОВЕРКА НАЛИЧИЯ МЫШИ
JR Z,_RULNMO
;FIX КОЛЕСО МЫШИ
MKEYPR EI
HALT
LD A,0XFA
IN A,(0XDF)
CPL
AND 7
JR NZ,MKEYPR
_RULNMO CALL SAVE2X2 ;ЕСЛИ МЕНЮ НАПЕЧАТАЛИ ПОВЕРХ СТРЕЛКИ
CALL SET_ADR_ATR ;УСТАНОВКА НОВОГО АДРЕСА ДЛЯ ЦВЕТНОЙ ПОЛОСКИ
LD HL,FLAGS_KEY
RES 5,(HL) ;НА КЛАВИАТУРЕ НИЧЕГО НЕ НАЖАТО
JR MAINLOP
;НАЖАТА СТРЕЛКА ВВЕРХ
UP CALL CURSOR_UP ;СМЕНИЛИ ТЕКУЩИЙ ПУНКТ НА -1
JR SET_POS1
;НАЖАТА СТРЕЛКА ВПРАВО
RIGHT BIT 1,(IX+6) ;ПРОВЕРКА ПРОСТО МЕНЮ ИЛИ ФАЙЛОВОЕ
PUSH AF ;СОХРАНИЛИ РЕЗУЛЬТАТ ПРОВЕРКИ
CALL NZ,PAGEDN ;ЕСЛИ ФАЙЛОВОЕ, ТО ЛИСТАНИЕ СТРАНИЧНОЕ
POP AF ;ВОССТАНОВИЛИ РЕЗУЛЬТАТ ПРОВЕРКИ
JR NZ,SET_POS1 ;ЕСЛИ ФАЙЛОВОЕ ПРОДОЛЖАЕМ
LD A,(IX+0X0A)
AND A
JR Z,SET_POS
DEC A ;ИНАЧЕ ПЕРЕХОД КУРСОРА НА ПОСЛЕДНИЙ ПУНКТ
JR SET_POS ;ИЗМЕНЯЕМ ПОЛОЖЕНИЕ КУРСОРА И ПРОДОЛЖАЕМ
;НАЖАТА СТРЕЛКА ВНИЗ
DOWN CALL CURSOR_DOWN ;СМЕНИЛИ ТЕКУЩИЙ ПУНКТ НА +1
JR SET_POS1
;НАЖАТА СТРЕЛКА ВЛЕВО
LEFT BIT 1,(IX+6) ;ПРОВЕРКА ПРОСТО МЕНЮ ИЛИ ФАЙЛОВОЕ
PUSH AF ;СОХРАНИЛИ РЕЗУЛЬТАТ ПРОВЕРКИ
CALL NZ,PAGEUP ;ЕСЛИ ФАЙЛОВОЕ, ТО ЛИСТАНИЕ СТРАНИЧНОЕ
POP AF ;ВОССТАНОВИЛИ РЕЗУЛЬТАТ ПРОВЕРКИ
JR NZ,SET_POS1 ;ЕСЛИ ФАЙЛОВОЕ ПРОДОЛЖАЕМ
XOR A ;ИНАЧЕ ПЕРЕХОД КУРСОРА НА ПЕРВЫЙ ПУНКТ
SET_POS BIT 7,(IX+7)
JR Z,SET_POS3
LD L,(IX+8)
LD H,(IX+9)
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),0
JR SET_POS1
SET_POS3 LD (IX+7),A ;ИЗМЕНИЛИ ПОЗИЦИЮ КУРСОРА
LD (IX+8),A
LD (IX+9),0 ;ИЗМЕНИЛИ НОМЕР ВЫБРАННОГО ПУНКТА
SET_POS1 CALL COLOR_CURSOR ;ПЕРЕРИСОВКА ЦВЕТНОЙ ПОЛОСКИ МЕНЮ
SET_POS2 CALL GLUDIN ;БУМКНУЛИ В AY
MAINLOP LD HL,FLAGS_KEY
RES 5,(HL) ;СБРОС НАЖАТЫХ КНОПОК
LD A,(FLAGS)
AND 2 ;ПРОВЕРКА НАЛИЧИЯ МЫШИ
JP Z,MAINNMO
LD HL,(ARXY) ;СТАРАЯ КООРДИНАТА МЫШИ
PUSH HL
CALL MOUSE ;ОПРОС ПОРТОВ МЫШИ
POP BC
AND A
SBC HL,BC
JR Z,NO_SELECT ;НЕ БЫЛО ДВИЖЕНИЯ МЫШИ
CALL RESTORE_KOSHAK ;БЫЛО ДВИЖЕНИЕ МЫШИ, СБРОС СЧЕТЧИКОВ КОШАКА
CALL MOUOPT ;ПРОВЕРКА НАВЕДЕНИЯ МЫШИ НА ЗАДАННОЕ ОКНО
NO_SELECT LD BC,0XFADF
IN A,(C) ;ОПРОС НАЖАТИЯ КНОПОК МЫШИ
AND 7
CP 6
JR Z,PRESS_MOUSE ;ЕСЛИ НАЖАТА ЛЕВАЯ КНОПКА МЫШИ
CP 5
JP Z,RESTART ;ЕСЛИ НАЖАТА ПРАВАЯ КНОПКА МЫШИ
CALL PRINTTIME ;ОБНОВИЛИ ВРЕМЯ ЕСЛИ ИЗМЕНИЛОСЬ
EI
HALT
CALL REST2X2 ;ВОССТАНОВИЛИ КУСОК ЭКРАНА ПОД МЫШЬЮ
CALL DRAW_MOUSE ;НАРИСОВАЛИ КУРСОР МЫШИ
JR MAINQMO ;ПРОДОЛЖЕНИЕ ОПРОСА
PRESS_MOUSE CALL OPMSPL
AND A
JR Z,CP_MOUSE4
LD (LAST_K),A
CALL TIMELP
JR SELECT_KEY
CP_MOUSE4 CALL MOUOPT ;ПРОВЕРКА ПОПАДАНИЯ МЫШИ В ПРЕДЕЛЫ ТЕКУЩЕГО ОКНА
JR C,MAINNMO ;НЕ ПОПАЛИ И ЕДЕМ ДАЛЕЕ
LD E,(IX+7) ;ВЗЯЛИ НОМЕР ПУНКТА КУДА ПОПАЛИ МЫШЬЮ
BIT 7,E
JR Z,CP_MOUSE5
LD L,(IX+8)
LD H,(IX+9)
LD E,(HL)
CP_MOUSE5 LD D,0
LD HL,(PRESSEDKEY) ;АДРЕС СПИСКА ХОТКЕЕВ ТЕКУЩЕГО ОКНА
ADD HL,DE ;АДРЕС ХОТКЕЯ ВЫБРАННОГО ПУНКТА
LD DE,LAST_K
LDI ;ЭМИТАЦИЯ НАЖАТИЯ ЗАДАННОЙ КНОПКИ
JR ENTER
MAINNMO CALL PRINTTIME ;ОБНОВЛЕНИЕ ВРЕМЕНИ, ЕСЛИ В ОНО ОБНОВИЛОСЬ
EI
HALT
MAINQMO LD A,(FLAGS_KEY)
BIT 5,A ;ПРОВЕРКА НАЖАТИЯ КНОПОК КЛАВИАТУРЫ
CALL Z,CP_TIME_KOSHAK ;ЕСЛИ НЕ НАЖАТО НИЧЕГО, ПРОВЕРЯЕМ СЧЕТЧИК КОШАКА
JP Z,MAINLOP ;ПРОДОЛЖАЕМ ОПРОС УПРАВЛЕНИЯ
CALL BREAK_KEY ;ПРОВЕРКА НА BREAK
JR C,SELECT_KEY ;ЕСЛИ BREAK НАЖАТ ПЕРЕЗАПУСКАЕМСЯ
RESTART LD A,1
OUT (PEVO_CONF),A
RET
SELECT_KEY CALL RESTORE_KOSHAK ;НАЖАТО НЕЧТО НА КЛАВЕ, СБРОС СЧЕТЧИКА КОШАКА
LD HL,LAST_K
LD A,(HL) ;ВЗЯЛИ НАЖАТУЮ КЛАВИШУ
LD B,0
LD HL,MAIN_KEYS
LD C,(HL) ;КОЛИЧЕСТВО ДОСТУПНЫХ КНОПОК
LD D,C
INC HL
CPIR
JR NZ,NOMAINKEYS ;НИЧЕГО НЕ НАШЛИ, ДАЛЕЕ СМОТРИМ КНОПКИ ТЕКУЩЕГО ОКНА
;НАЖАТО ЧТО-ТО ИЗ ГЛАВНЫХ КНОПОК, ДОСТУПНЫХ ВСЕГДА
LD HL,ADREXEKEYS
LD A,D ;КОЛИЧЕСТВО КНОПОК В ТАБЛИЦЕ -1
SUB C ;ПОЛУЧИЛИ ВЫБРАННЫЙ НОМЕР
DEC A
ADD A,A
ADD A,L
LD L,A
ADC A,H
SUB L
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP (HL)
;ПРОВЕРКА ХОТКЕЕВ В ТЕКУЩЕМ ОКНЕ
NOMAINKEYS LD HL,(PRESSEDKEY) ;АДРЕС СПИСКА НАЖАТЫХ КНОПОК ТЕКУЩЕГО ОКНА
LD C,A
LD A,H
OR L
JP Z,MAINLOP ;ЕСЛИ СПИСКА НЕТ, ПРОДОЛЖАЕМ ОПРОС
LD A,C
LD C,(IX+2)
LD E,(HL)
INC HL
DEC C ;КОЛИЧЕСТВО КНОПОК
DEC C ;ВЫСОТА ОКНА -2
LD D,C
LD B,0
CPIR ;СКАНИРОВАНИЕ СПИСКА ЗАДАННЫХ КЛАВИШ
JR NZ,OSTAT_KEYS
LD A,D ;ВЫСОТА ОКНА
SUB C
DEC A ;ПОЛУЧИЛИ НОМЕР НАЖАТОЙ КНОПКИ И -1
BIT 7,(IX+7)
JR Z,ENTER1
LD L,(IX+8)
LD H,(IX+9)
LD (HL),A
INC HL
LD (HL),A
JR ENTER
ENTER1 LD (IX+7),A ;НОМЕР ПУНКТА В ОКНЕ
LD (IX+8),A ;НОМЕР НАЖАТОЙ КЛАВИШИ ПО УКАЗАННОМУ СПИСКУ
ENTER LD A,(FLAGS)
AND 2
CALL NZ,TIMELP ;ОБНОВЛЕНИЕ ВРЕМЕНИ ЕСЛИ ОНО ИЗМЕНИЛОСЬ
CALL REST2X2 ;СТЕРЛИ КУРСОР МЫШИ
CALL GLUDIN ;БУМКНУЛИ В AY
LD A,(IX+7) ;НОМЕР ИЗ СПИСКА КОТОРЫЙ ВЫЗВАТЬ
BIT 7,A
JR Z,JUMP2HL1
LD L,(IX+8)
LD H,(IX+9)
LD A,(HL)
JUMP2HL1 LD L,(IX+0X0E)
LD H,(IX+0X0F) ;ВЗЯЛИ СПИСОК АДРЕСОВ 1 ИЗ КОТОРЫХ БУДЕМ ВЫЗЫВАТЬ
JUMP2HL ADD A,A
ADD A,L
LD L,A
ADC A,H
SUB L
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
LD A,1
OUT (PEVO_CONF),A
JP (HL)
OSTAT_KEYS EX AF,AF'
LD A,E
SUB D
JP Z,MAINLOP
LD C,A
EX AF,AF'
CPIR
JP NZ,MAINLOP
LD A,E
SUB C
DEC A
JR JUMP2HL1
TIMELP CALL PRINTTIME
LD A,0XFA
IN A,(0XDF) ;КНОПКИ МЫШИ
CPL
AND 7
JR NZ,TIMELP ;ПОКА НЕ ОТПУСТЯТ
RET
GLUDIN LD HL,DIN+0X0D
LD A,0X0D
GLUDIN1 LD BC,0XFFFD
OUT (C),A
LD B,0XBF
OUTD
SUB 1
JR NC,GLUDIN1
RET
KOSHAK BINCLUDE kot_anim.bin,9