; LAST UPDATE: 16.02.2025 savelij
ITSELECTOR LD HL,SYSFLAGS
RES SYSFLAGS.B_MOUSE_PRESENT,(HL); принудительное отключение мыши для текстмода
SET SYSFLAGS.B_VIDEO_MODE,(HL) ; меню текстового видеорежима
LD HL,KEYBOARDS
LD (ADR_INT),HL ; по прерываниям будет опрос клавиатуры
LD (OLD_STACK),SP
JR SELECTOR
ISELECTOR LD HL,SYSFLAGS
RES SYSFLAGS.B_VIDEO_MODE,(HL)
CALL DETECTMOUSE
LD (OLD_STACK),SP
SELECTOR EI
LD A,(SYSFLAGS)
AND SYSFLAGS.M_MOUSE_PRESENT ; проверка наличия мыши
JR Z,_RULNMO
; FIX колесо мыши
MKEYPR EI
LD A,HIGH (MOUSE_KEYS)
IN A,(LOW (MOUSE_KEYS))
CPL
AND %00000111
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+_FLAGS) ; проверка просто меню или файловое
PUSH AF ; сохранили результат проверки
CALL NZ,PAGEDN ; если файловое, то листание страничное
POP AF ; восстановили результат проверки
JR NZ,SET_POS1 ; если файловое продолжаем
LD A,(IX+_NUM_KOL_L)
AND A
JR Z,SET_POS
DEC A ; иначе переход курсора на последний пункт
JR SET_POS ; изменяем положение курсора и продолжаем
; нажата стрелка вниз
DOWN CALL CURSOR_DOWN ; сменили текущий пункт на +1
JR SET_POS1
; нажата стрелка влево
LEFT BIT 1,(IX+_FLAGS) ; проверка просто меню или файловое
PUSH AF ; сохранили результат проверки
CALL NZ,PAGEUP ; если файловое, то листание страничное
POP AF ; восстановили результат проверки
JR NZ,SET_POS1 ; если файловое продолжаем
XOR A ; иначе переход курсора на первый пункт
SET_POS BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,SET_POS3
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),0
JR SET_POS1
SET_POS3 LD (IX+_NUM_PKT),A ; изменили позицию курсора
LD (IX+_TEK_PKT_L),A
LD (IX+_TEK_PKT_H),0 ; изменили номер выбранного пункта
SET_POS1 CALL COLOR_CURSOR ; перерисовка цветной полоски меню
MAINLOP LD HL,FLAGS_KEY
RES 5,(HL) ; сброс нажатых кнопок
LD A,(SYSFLAGS)
AND SYSFLAGS.M_MOUSE_PRESENT ; проверка наличия мыши
JP Z,MAINNMO
LD HL,(ARXY) ; старая координата мыши
PUSH HL
CALL MOUSE ; опрос портов мыши
POP BC
AND A
SBC HL,BC
JR Z,NO_SELECT ; не было движения мыши
CALL MOUOPT ; проверка наведения мыши на заданное окно
NO_SELECT LD BC,MOUSE_KEYS
IN A,(C) ; опрос нажатия кнопок мыши
AND 7
CP 6
JR Z,PRESS_MOUSE ; если нажата левая кнопка мыши
CP 5
JP Z,RESTART ; если нажата правая кнопка мыши
CALL PRINTTIME ; обновили время если изменилось
EI
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+_NUM_PKT) ; взяли номер пункта куда попали мышью
BIT B_ADR_PUNKT,E
JR Z,CP_MOUSE5
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
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 ; проверка нажатия кнопок клавиатуры
JP Z,MAINLOP ; продолжаем опрос управления
ROMCALL BREAK_KEY,ROM_RST82 ; проверка на BREAK
JR C,SELECT_KEY ; если BREAK не нажат продолжаем
RESTART DI
CALL RESTORE_FATVARS ; восстановление FAT переменных
CALL TRESTORE_CLINE ; восстановление цвета в меню
LD A,1
RET
SELECT_KEY DI
LD HL,SET_POS1
PUSH HL
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 L,(IX+_ADR_HOTKEY_L)
LD H,(IX+_ADR_HOTKEY_H) ; адрес списка нажатых кнопок текущего окна
LD C,A
LD A,H
OR L
JP Z,MAINLOP ; если списка нет, продолжаем опрос
LD A,C
LD C,(IX+_V_SIZE)
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 B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,ENTER1
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
LD (HL),A
INC HL
LD (HL),A
JR ENTER
ENTER1 LD (IX+_NUM_PKT),A ; номер пункта в окне
LD (IX+_TEK_PKT_L),A ; номер нажатой клавиши по указанному списку
ENTER LD A,(SYSFLAGS)
AND SYSFLAGS.M_MOUSE_PRESENT
CALL NZ,TIMELP ; обновление времени если оно изменилось
CALL REST2X2 ; стерли курсор мыши
LD A,(IX+_NUM_PKT) ; номер из списка который вызвать
BIT B_ADR_PUNKT,A
JR Z,JUMP2HL1
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
LD A,(HL)
JUMP2HL1 LD L,(IX+_ADR_PRG_L)
LD H,(IX+_ADR_PRG_H) ; взяли список адресов 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
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,HIGH (MOUSE_KEYS)
IN A,(LOW (MOUSE_KEYS)) ; кнопки мыши
CPL
AND 7
JR NZ,TIMELP ; пока не отпустят
RET
CURSOR_UP LD C,(IX+_TEK_PKT_L)
LD B,(IX+_TEK_PKT_H)
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,CURSOR_UP3
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
CURSOR_UP3 LD A,B
OR C
RET Z
DEC BC
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,CURSOR_UP2
LD (HL),B
DEC HL
LD (HL),C
DEC HL
LD A,(HL)
AND A
JR Z,CURSOR_UP1
DEC (HL)
RET
CURSOR_UP2 LD (IX+_TEK_PKT_L),C
LD (IX+_TEK_PKT_H),B
LD A,(IX+_NUM_PKT)
AND A
JR Z,CURSOR_UP1
DEC (IX+_NUM_PKT)
RET
CURSOR_UP1 CALL REST2X2
CALL RESTORE_CLINE
CALL SCRDN
LD E,(IX+_Y_COORD)
INC E
DOWN1 LD D,(IX+_X_COORD)
INC D
INC D
EVOPORT WIN_P3,RAM_SORTFILES
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,DOWN3
DEC D
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
DOWN3 LD BC,CPU3
ADD HL,HL
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
PUSH DE
ROMCALL POSTF06,ROM_RST83
ROMCALL READ_DIR,ROM_RST83
LD DE,FILES_EXT
ROMCALL CP_EXT,ROM_RST83
EX AF,AF'
LD BC,_DIR_Attr
ADD HL,BC
LD A,(HL)
SBC HL,BC
AND M_DIR_Directory
LD A,BLUE << 3 + WHITE + BR_INK ; если директория то цвет белый
JR NZ,DOWN7
; раскраска по заданной таблице
EX AF,AF'
LD HL,COLOR_EXT
ADD A,L
LD L,A
ADC A,H
SUB L
LD H,A
LD A,(HL)
ADD A,BLUE << 3 + BR_INK
DOWN7 LD (OUT_NAME_FILE+1),A ; установка цвета раскраски
LD HL,BUF_MOVE256
ROMCALL GET_LONGNAME,ROM_RST83
POP DE
CALL FILENAME8_3
JP SET_ADR_ATR
CURSOR_DOWN LD L,(IX+_NUM_KOL_L)
LD H,(IX+_NUM_KOL_H) ; количество пунктов
BIT B_ADR_NUMS_PUNKT,(IX+_NUM_PKT)
JR Z,CURSOR_DOWN6
LD L,(IX+_TEK_PKT_L) ; получение количества пунктов
LD H,(IX+_TEK_PKT_H) ; из указанного адреса
INC HL
INC HL
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A ; количество пунктов в этом меню
CURSOR_DOWN6 LD A,H
OR L
RET Z
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,CURSOR_DOWN2
LD E,(IX+_TEK_PKT_L)
LD D,(IX+_TEK_PKT_H) ; текущий номер
EX DE,HL
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
JR CURSOR_DOWN3
CURSOR_DOWN2 LD C,(IX+_TEK_PKT_L)
LD B,(IX+_TEK_PKT_H)
CURSOR_DOWN3 SCF
SBC HL,BC
RET Z
INC BC
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,CURSOR_DOWN4
EX DE,HL
LD (HL),B
DEC HL
LD (HL),C
DEC HL
LD A,(IX+_V_SIZE)
SUB 3
CP (HL)
JR Z,CURSOR_DOWN1
INC (HL)
RET
CURSOR_DOWN4 LD (IX+_TEK_PKT_L),C
LD (IX+_TEK_PKT_H),B
LD A,(IX+_V_SIZE)
SUB 3
CP (IX+_NUM_PKT)
JR Z,CURSOR_DOWN1
INC (IX+_NUM_PKT)
RET
CURSOR_DOWN1 CALL REST2X2
CALL RESTORE_CLINE
CALL SCRUP
LD A,(IX+_Y_COORD)
ADD A,(IX+_V_SIZE)
SUB 2
LD E,A
JP DOWN1
GET_XY LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H) ; текущий номер
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,GETXY1
; получение номера текущего пункта из указателя
INC HL
LD E,(HL)
INC HL
LD D,(HL) ; текущий номер из указанного адреса
EX DE,HL
BIT B_ADR_NUMS_PUNKT,(IX+_NUM_PKT)
JR Z,GETXY1
; получение количества пунктов из укказателя
EX DE,HL
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A ; количество пунктов из указанного адреса
EX DE,HL
JR GETXY2
GETXY1 LD E,(IX+_NUM_KOL_L)
LD D,(IX+_NUM_KOL_H) ; кол-во пунктов
GETXY2 LD A,(IX+_V_SIZE)
SUB 3
LD C,A ; количество пунктов в высоте окна
LD B,0
LD A,D
OR E
LD A,C
RET
; перемещение на страницу вверх
PAGEUP CALL GET_XY
RET Z
XOR A
SBC HL,BC
EX DE,HL
JR NC,PDUN0
PDU0 LD D,A
LD E,A
JR PDUN0
; перемещение на страницу вниз
PAGEDN CALL GET_XY
RET Z
EX DE,HL
AND A
SBC HL,BC
ADD HL,BC
EX DE,HL
JR NC,PDN00
DEC DE
LD A,E
JR PDUN0
PDN00 ADD HL,BC
EX DE,HL
SBC HL,DE
ADD HL,DE
JR Z,PDUN1
JR NC,PDUN0
PDUN1 EX DE,HL
DEC DE
PDUN0 BIT B_ADR_PUNKT,(IX+_NUM_PKT)
JR Z,PDUN2
LD L,(IX+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
LD (HL),A
INC HL
LD (HL),E
INC HL
LD (HL),D
JR PDUN3
PDUN2 LD (IX+_NUM_PKT),A
LD (IX+_TEK_PKT_L),E
LD (IX+_TEK_PKT_H),D
PDUN3 CALL RESTORE_CLINE
JP OUT_CURR_DIR
PRINTTIME DI
LD H,CMOS.REG_C
CALL READCMOS
AND CMOSREG.M_C_RO_UF
RET Z ; если время еще не обновилось, выходим ничего не выводя
LD BC,TXT_TIME ; чтение и преобразование времени
LD H,CMOS.HOUR
CALL READCMOS ; прочитали часы
CALL BYTE2TXT ; сконвертили часы с укладкой в буфер
LD A,(BC)
XOR ':'-' ' ; конверсия мигающего двоеточия
LD (BC),A
INC BC
LD H,CMOS.MINUTE
CALL READCMOS ; прочитали минуты
CALL BYTE2TXT ; сконвертили часы с укладкой в буфер
LD A,(BC)
XOR ':'-' ' ; конверсия мигающего двоеточия
LD (BC),A
INC BC
LD H,CMOS.SECOND
CALL READCMOS ; прочитали секунды
CALL BYTE2TXT
LD BC,TXT_DATA ; далее чтение и преобразование даты
LD H,CMOS.DAY_MONTH
CALL READCMOS
CALL BYTE2TXT
INC BC
LD H,CMOS.MONTH
CALL READCMOS
CALL BYTE2TXT
INC BC
LD H,CMOS.YEAR
CALL READCMOS
CALL BYTE2TXT
LD HL,BUFF_TIME ; печатаем время из буфера
JP ITPRINT_MESSAGE
; перевод "A" в десятичку и в текст
A2TXT PUSH HL
LD L,A
LD H,0
LD DE,10
XOR A
DEC A
.L1 INC A
SBC HL,DE
JR NC,.L1
ADD HL,DE
ADD A,'0'
LD D,A
LD A,L
ADD A,'0'
POP HL
LD (HL),D
INC HL
LD (HL),A
INC HL
RET
BYTE2TXT LD L,A
LD H,'0'
RRCA
RRCA
RRCA
RRCA
AND 0x0F
ADD A,H
LD (BC),A
INC BC
LD A,L
AND 0x0F
ADD A,H
LD (BC),A
INC BC
RET
; выход из MAGIC
CONTINUE_PROG DI
LD SP,(OLD_STACK)
XOR A
RET
; перезапуск MAGIC меню с полной перерисовкой экрана
RESTART_MAIN DI
LD SP,(OLD_STACK)
LD A,1
RET
; выход из отладчика
TRACER_DBG DI
LD SP,(OLD_STACK)
LD A,2
RET
SETUP LD IX,SETUP_MENU
CALL INT_TXT_WINDOW
JP SET_ADR_ATR
; перебор TURBO режимов с записью в CMOS и изменением после выхода из NMI
; 0-7MHZ 1-3,5MHZ 2-14,0MHZ
SET_TURBO DI
LD H,CMOS.BYTE_01
CALL READCMOS
LD E,L ; турбо режим и режим памяти
LD H,CMOS.BYTE_00
CALL READCMOS
LD D,L ; TURBO 14.0
RLCA
LD C,A
LD A,E
RLCA
LD A,C
RLA
AND 3
INC A ; сменили TURBO режим
CP 3
JR C,SETTURBO1
XOR A ; если перешли через 0, то выставили режим 14.0
SETTURBO1 LD C,A
PUSH BC
AND A
RES 7,E ; TURBO 7 0
RES 7,D ; TURBO 14=7MHZ 0
JR Z,SETTURBO3
DEC A
SET 7,E ; TURBO 7 1
RES 7,D ; TURBO 14=3,5 0
JR Z,SETTURBO3
RES 7,E ; TURBO 7 0
SET 7,D ; TURBO 14=14 1
SETTURBO3 LD H,CMOS.BYTE_00
LD L,D
PUSH DE
CALL IWRITECMOS
POP DE
LD H,CMOS.BYTE_01
LD L,E
CALL IWRITECMOS
POP BC
LD A,C
AND A
LD DE,%0000000000000000 ; 7MHZ
JR Z,SETTURBO4
DEC A
LD DE,%0001000000000000 ; 3,5MHZ
JR Z,SETTURBO4
LD DE,%0000000000001000 ; 14MHZ
SETTURBO4 LD A,(B_PORT77)
AND %11110111
OR E
LD (B_PORT77),A
LD A,(N_EFF7)
AND %11101111
OR D
LD (N_EFF7),A
SETANDPRINT CALL SETUP4SEL
LD HL,SETUP_MENU.TXT_SETUPMENU
JP ITPRINT_MESSAGE
; перебор режимов памяти с записью в CMOS и изменением после выхода из NMI
SET_MEMORY DI
LD H,CMOS.BYTE_01
CALL READCMOS
AND 3
INC A
CP 3
JR C,SETMEMORY1
XOR A
SETMEMORY1 LD C,A
LD A,L
AND %11111100
OR C
LD L,A
CALL IWRITECMOS
JR SETANDPRINT
; включение/выключение резидента HONEY COMANDER
SET_REZIDENT DI
LD H,CMOS.BYTE_01
CALL READCMOS
XOR CMOS_EC.M_REZIDENT
LD L,A
CALL IWRITECMOS
JR SETANDPRINT
KILL_REZID DI
LD H,CMOS.BYTE_03
CALL READCMOS
XOR CMOS_E9.M_KILL_REZIDENT
LD L,A
CALL IWRITECMOS
JR SETANDPRINT
; изменение текста в меню
SETUP4SEL DI
LD H,CMOS.BYTE_01
CALL READCMOS
LD E,L ; турбо режим и режим памяти
LD H,CMOS.BYTE_00
CALL READCMOS
LD D,L ; TURBO 14.0
RLCA
LD C,A
LD A,E
RLCA
LD A,C
RLA
AND 3
CP 3
JR C,SETUP4SEL1
DEC A
SETUP4SEL1 ADD A,A
ADD A,A
LD HL,TXT_TURBO
LD C,A
LD B,0
ADD HL,BC
PUSH DE
LD DE,TXT_TURBO_MODE
LDI
LDI
LDI
LDI
EX DE,HL
LD (HL),2
POP DE
PUSH DE
LD A,E
AND 3
LD C,A
LD B,0
LD HL,TXT_MEMORY
ADD HL,BC
ADD HL,BC
ADD HL,BC
LD DE,TXT_MEMORY_MODE
LDI
LDI
LDI
EX DE,HL
LD (HL),2
POP DE
; для резидента HONEY COMANDER
LD A,E
AND CMOS_EC.M_REZIDENT
LD HL,TXT_ONOFF
JR NZ,.ON
LD HL,TXT_ONOFF+3
.ON LD DE,TXT_REZIDENT_MODE
LDI
LDI
LDI
EX DE,HL
LD (HL),2
LD H,CMOS.BYTE_03
CALL READCMOS
AND CMOS_E9.M_KILL_REZIDENT
LD HL,TXT_ONOFF
JR NZ,.ON1
LD HL,TXT_ONOFF+3
.ON1 LD DE,TXT_KILLREZID
LDI
LDI
LDI
EX DE,HL
LD (HL),2
RET
; ожидание нажатия и отпускания любой клавиши
ANY_KEYS XOR A
IN A,(0xFE)
CPL
AND 0x1F
JR Z,ANY_KEYS
ANYKEYS1 XOR A
IN A,(0xFE)
CPL
AND 0x1F
JR NZ,ANYKEYS1
RET