; Обработчики Гориз. меню, Pull-меню, Меню выбора дисков. ; Также содержит п/программу настройки меток "√" пунктов меню. ; ; Номера пунктов ; Left cmLBrief equ 0 cmLMed equ cmLBrief+1 cmLFull equ cmLMed+1 cmLInfo equ cmLFull+1 cmLQview equ cmLInfo+1 cmLName equ cmLQview+1 cmLExt equ cmLName+1 cmLDate equ cmLExt+1 cmLSize equ cmLDate+1 cmLUnsort equ cmLSize+1 cmLFilter equ cmLUnsort+1 cmLChangeDrv equ cmLFilter+1 ; Files cmHelp equ cmLChangeDrv+1 cmUsrMenu equ cmHelp+1 cmView equ cmUsrMenu+1 cmEdit equ cmView+1 cmCopy equ cmEdit+1 cmRename equ cmCopy+1 cmMkFolder equ cmRename+1 cmDelete equ cmMkFolder+1 cmAttrib equ cmDelete+1 cmSelGroup equ cmAttrib+1 cmUSelGroup equ cmSelGroup+1 cmQuit equ cmUSelGroup+1 ; Commands cmFind equ cmQuit+1 cmVolume equ cmFind+1 cmSwap equ cmVolume+1 cmPanelsOn equ cmSwap+1 cmNullTRD equ cmPanelsOn+1 ; создать пустой TRD image cmCopyTRD equ cmNullTRD+1 ; TRD image -> Disk cmSaveTRD equ cmCopyTRD+1 ; Disk -> TRD image ; Options cmInterface equ cmSaveTRD+1 cmConfirm equ cmInterface+1 cmColors equ cmConfirm+1 cmHighlight equ cmColors+1 cmViewSet equ cmHighlight+1 cmEditSet equ cmViewSet+1 cmSaveSetup equ cmEditSet+1 ; Right cmRBrief equ cmSaveSetup+1 cmRMed equ cmRBrief+1 cmRFull equ cmRMed+1 cmRInfo equ cmRFull+1 cmRQview equ cmRInfo+1 cmRName equ cmRQview+1 cmRExt equ cmRName+1 cmRDate equ cmRExt+1 cmRSize equ cmRDate+1 cmRUnsort equ cmRSize+1 cmRFilter equ cmRUnsort+1 cmRChangeDrv equ cmRFilter+1 ; флаги маркеров пунктов меню CTnodef equ 0 ; "по-умолчанию" не выделено CTdef equ 1 ; "по-умолчанию" выделено "√" LC000 equ 0C000h ; адрес буфера окна ; рабочая таблица верт. меню BoxData: CurBox: dw 0 ;+0,+1 Xo: db 0 Xi: db 0 Ypos: db 0 ; полож. Xlen: db 0 ; ширина CurMenu:db 0 ; тек. полож. указателя гориз. меню CurMBox:db 0 ; Current mark MenuBox BarFlag:db 0 ; Flag barinvert (0=нет, 1=да) ;----------------------------------------------------------- ; Таблица горизонтального Меню ; формат: +0 - Xo coord ; +1 - Xi coord ; +2 - код hot-клавиши ; +3,4 - адрес описателя верт. меню ;----------------------------------------------------------- BarTabl:ds 5*5 ; блок пункта * число пунктов гор. меню db 80h ; конец таблицы ;----------------------------------------------------------- ; Таблица вертикальных меню ; формат: Положение окна меню: ; +0 - Xo coord ; +1 - Xi coord ; +2 - Yo coord ; +3 - Yi coord ; +4 - Положение пункта меню: ; +0 - Xo coord ; +1 - Xi coords ; +2 - Y coords ; +3 - номер команды ; +4 - hot-клавиша ; +5 - номер контекста ;----------------------------------------------------------- BoxTabl:ds 4 ; +0..+3 ds 6*26 ; блок пункта * макс. число пунктов db 0 ; конец таблицы ;/////////////////////////////////////////////////////////// ; Вызов Горизонтального Меню ;/////////////////////////////////////////////////////////// main_menu: in a,(SLOT3) push af ld a,(page_sys_screen) ; стр. буфера окна диалога out (SLOT3),a ; сохр. экран под строкой гориз. меню ld ix,WinHMenuBuff ; address Box buffers ld hl,0150h ld de,0000h ld a,(page_sys_screen) ; page buffer ld c,0B2h ; копир. из окна в буфер call scrn4__ call init_hmenu ; подготовка меню call menu_exec ; работа в меню call get_fire ; защита от "залипания" мышки ; восст. экран под строкой гориз. меню ld ix,WinHMenuBuff ; address Box buffers ld hl,0150h ld de,0000h ld a,(page_sys_screen) ; page buffer ld c,0B3h ; копир. из буфера в окно call scrn4__ pop af out (SLOT3),a ; на выполн. пунктов pull-меню jp pull_commands ; pullcmnd.asm ;----------------------------------------------------------- ; Инициализация строки гориз. меню и таблицы мышки ;----------------------------------------------------------- init_hmenu: ; корректно настроить панеле-зависимые ячейки ld a,(cur_panel) ; 0=левая, 80h=правая or a push af call nz,change_panel call prep_default_puncts ; уст. "√" метки пунктов pop af call nz,change_panel ; call InitEvent ; иниц. обработчика событий xor a ld (CurMBox),a ld (BarFlag),a inc a ld (CurMenu),a ; нач. полож. указателя гориз. меню ; подгот. строку меню во временном буфере ld ix,BarTabl ; таблица гориз. меню ld hl,work_buffer ; врем. буфер ld de,MenuTab ; описатель гориз. Меню ld b,1 ; начало X координат ld a,(color_array+12) ; цвет гориз. меню ld c,a ld (hl)," " ; начальный пробел inc hl ld (hl),c inc hl ; цикл вывода всех пунктов InBarL1__: ld (hl)," " ; раздел. пунктов inc hl ld (hl),c inc hl ld (ix+0),b ;+0 left X coords inc ix inc b ld a,(de) ; Get name submenu ; цикл вывода пункта InBarL2__: inc de cp "&" call z,Bhotkey__ ; уст. цвет для hot-буквы ld (hl),a inc hl ld (hl),c inc hl inc b ld a,(de) or a jr nz,InBarL2__ ld (hl)," " ; концовка пункта inc hl ld (hl),c inc hl inc b ld (ix+0),b ;+1 Right X coords inc ix inc de ld a,(de) ; код hot-клавиши ld (ix+0),a ;+2 inc ix inc de ld a,(de) ld (ix+0),a ;+3,+4 - адрес описателя верт. меню inc ix inc de ld a,(de) ld (ix+0),a ;+4 inc ix inc de ld a,(de) or a jr nz,InBarL1__ ; конец пунктов гориз. меню ld (ix+0),80h ; конец Mouse Table ld a,80 ; ширина экрана sub b jr z,InBarEx__ ; заполнить остаток строки до конца экрана ld b,a ld (hl)," " inc hl ld (hl),c inc hl djnz $-5 ; вывести готовую строку гориз. меню на экран InBarEx__: ld ix,work_buffer ; буфер строки ld hl,0150h ; Y/X размер окна ld de,0000h ; полож. окна (строки) in a,(SLOT3) ld c,0B3h ; копир. из буфера на экран call scrn4__ jp SetMBar ; вывести выдел. указатель ;------------------------------------------------- ; Установить цвет hot-буквы гориз. меню ;------------------------------------------------- Bhotkey__: ld a,(de) ld (hl),a ; hot-букву в буфер inc hl inc de push de ld a,(color_array+14) ; цвет hot-буквы гориз. меню and 0Fh ld e,a ld a,(color_array+12) ; цвет гориз. меню and 0F0h or e ld (hl),a ; атрибут pop de inc hl ld a,(de) inc de inc b ret ;------------------------------------------------- ; Установить выдел. указатель в гориз. Меню ;------------------------------------------------- SetBarI:ld a,(BarFlag) or a ret nz inc a ld (BarFlag),a ld hl,BarTabl ; рабочая таблица гориз. меню ld a,(CurMenu) ; тек. полож. указателя гориз. меню dec a ld c,a ; *5 add a,a add a,a add a,c add a,l ld l,a jr nc,$+3 inc h ld e,(hl) ; Xo inc hl ld d,0 ; Y = 0 ld a,(hl) sub e ; Xi - Xo = ширина ld l,a ld h,1 ; высота ld (RBrIlen+1),hl ld (RBrIpos+1),de push af ; сохр. ширину ld ix,work_buffer in a,(SLOT3) ld c,0B2h ; копир. с окна в буфер call scrn4__ ld a,(color_array+13) ; цвет указателя гориз. меню ld c,a ld a,(color_array+14) ; цвет hot-буквы гориз. меню and 0Fh ld b,a pop af ;Reset LenX ; подготовить в буфере выдел. указатель ld hl,work_buffer ; буфер SetInvB__: ex af,af' inc hl ld a,(hl) and 0Fh cp b ; hot-буква? ld a,c jr nz,$+5 and 0F0h or b ld (hl),a inc hl ex af,af' dec a jr nz,SetInvB__ ; вывести на экран выдел. пункт (указатель) ld ix,work_buffer ; буфер ld hl,(RBrIlen+1) ; Y/X размер окна ld de,(RBrIpos+1) ; полож. окна in a,(SLOT3) ld c,0B3h ; копир. из буфера на экран jp scrn4__ ;------------------------------------------------- ; Сбросить выдел. указатель в гориз. Меню ;------------------------------------------------- ResBarI:ld a,(BarFlag) or a ret z xor a ld (BarFlag),a ; скопир. указатель с экрана в буфер ld ix,work_buffer RBrIlen:ld hl,0 ; сохр. ширина указателя RBrIpos:ld de,0 ; сохр. полож. указателя ld a,l push af in a,(SLOT3) ; порт ld c,0B2h ; копир. с экрана в буфер call scrn4__ ld a,(color_array+12) ; цвет гориз. меню ld c,a ld a,(color_array+14) ; цвет hot-буквы гориз. меню and 0Fh ld b,a pop af ;Reset LenX ; сбросить выдел. указатель в буфере ld hl,work_buffer ; буфер ResInvB__: ex af,af' inc hl ld a,(hl) and 0Fh cp b ; hot-буква? ld a,c jr nz,$+5 and 0F0h or b ld (hl),a inc hl ex af,af' dec a jr nz,ResInvB__ ; вывести сброшенный пункт на экран ld ix,work_buffer ld hl,(RBrIlen+1) ; размеры окна (указателя) ld de,(RBrIpos+1) ; Y/X полож. in a,(SLOT3) ld c,0B3h ; копир. из буфера на экран jp scrn4__ ;------------------------------------------------- ; Установить цвет hot-буквы верт. меню ;------------------------------------------------- Bhotkey1__: ld a,(de) ld (hl),a ; hot-букву в буфер inc hl inc de push de ld a,(color_array+17) ; цвет hot-буквы меню and 0Fh ld e,a ld a,(color_array+15) ; цвет верт. меню and 0F0h or e ld (hl),a ; атрибут pop de inc hl ld a,(de) inc de inc b ret ;----------------------------------------------------------- ; Установить выдел. указатель верт. меню ;----------------------------------------------------------- SetBoxI:ld a,(CurMBox) dec a ;*6 add a,a ;1+1=2 ld c,a ;2 SetBoxI1: add a,a ;2+2=4 add a,c ;4+2=6 ld hl,BoxTabl+4 ; рабочая таблица верт. меню + 4 add a,l ld l,a jr nc,$+3 inc h ld e,(hl) inc hl ld a,(hl) inc hl ld d,(hl) sub e ; Xi - Xo = LenX ld l,a ld h,1 ; высота ld (RBxIlen+1),hl ld (RBxIpos+1),de ; push af ld ix,work_buffer in a,(SLOT3) ld c,0B2h call scrn4__ ld a,(color_array+16) ; цвет указателя верт. меню ld c,a ld a,(color_array+17) ; цвет hot-буквы верт. меню and 0Fh ld b,a pop af ; LenX ; подготовить в буфере выдел. указатель ld hl,work_buffer ; буфер SetInvX__: ex af,af' inc hl ld a,(hl) and 0Fh cp b ; hot-буква? ld a,c jr nz,$+5 and 0F0h or b ld (hl),a inc hl ex af,af' dec a jr nz,SetInvX__ ; вывести на экран выдел. пункт меню ld ix,work_buffer ; буфер ld hl,(RBxIlen+1) ld de,(RBxIpos+1) in a,(SLOT3) ld c,0B3h jp scrn4__ ;----------------------------------------------------------- ; Сбросить выдел. указатель верт. меню ;----------------------------------------------------------- ResBoxI:ld ix,work_buffer RBxIlen:ld hl,0 RBxIpos:ld de,0 ld a,l push af in a,(SLOT3) ld c,0B2h call scrn4__ ld a,(color_array+15) ; цвет верт. меню ld c,a ld a,(color_array+17) ; цвет hot-буквы верт. меню and 0Fh ld b,a pop af ; сбросить указатель в буфере ld hl,work_buffer ; буфер ResInvX__: ex af,af' inc hl ld a,(hl) and 0Fh cp b ; цвет hot-буквы? ld a,c jr nz,$+5 and 0F0h or b ld (hl),a inc hl ex af,af' dec a jr nz,ResInvX__ ; вывести сброшенный пункт на экран ld ix,work_buffer ld hl,(RBxIlen+1) ld de,(RBxIpos+1) in a,(SLOT3) ld c,0B3h jp scrn4__ ;----------------------------------------------------------- ; Главный цикл гориз. Меню ;----------------------------------------------------------- menu_exec: call handle_event ; читаем событие ld hl,what ld de,menu_exec push de ld a,(hl) ;+0 узнать событие inc hl cp evMouseFr ; нажаты бутоны мышки jp z,MBmouse cp evKeyboard ; нажаты обычные клавиши jr z,MBkeys cp evCombKey ; нажаты курс. клавиши и служ. jr z,MBcbkey ret ; выйти, если меню закрыто MenuExt:ld a,(CurMBox) ; box open or a jp nz,CloseBx ; закрыть верт. меню ; выйти из гориз. меню MenuExit: pop de ; восст. баланс стека ld hl,what ld (hl),evNothing ; уст. "нет событий" ret ;------------------------------------------------- ; Обычные клавиши (для верт. меню) ;------------------------------------------------- MBkeys: ld a,(hl) ;+1 код клавиши cp 1Bh ; Esc jr z,MenuExt cp 0Dh ; Enter jr nz,MBkeysN ld a,(CurMBox) ; if not box then open or a jp z,OpenBox ; открыть окно верт. меню ld b,a ld ix,BoxTabl-2 ; поиск пункта верт. меню ld de,6 add ix,de djnz $-2 jp BxEnter ; MBkeysN:ld a,(CurMBox) or a ret z ; верт. меню не открыто inc hl ld a,(hl) ;+2 скен-код клавиши ld ix,BoxTabl-2 ; рабочая таблица верт. меню - 2 ld bc,6 ld h,b MBkeys1__: inc h add ix,bc bit 7,(ix+0) ; конец описателя меню ? ret nz ; да, hot-клавиша не найдена cp (ix+4) ; скен-код hot-клавиши jr nz,MBkeys1__ jp BxHotEx ;----------------------------------------------------------- ; Клавиши управл. курсором и комбинации с hot-буквами ;----------------------------------------------------------- MBcbkey:inc hl ld a,(hl) ;+2 what cp 58h ; вверх jp z,MBup cp 52h ; вниз jp z,MBdown cp 54h ; влево jp z,MBleft cp 56h ; вправо jp z,MBright cp 57h ; Home jp z,MBhome cp 51h ; End jp z,MBend cp 44h ; F10 jr z,MenuExt ; тест на скен-коды букв. клавиш ld ix,BarTabl-5 ; рабочая таблица гориз. меню ld bc,5 ld h,b MBcbLp: inc h ; поиск hot-клавиши add ix,bc bit 7,(ix+0) ; 80h конец описателя меню ? ret nz ; не выходить из гориз. меню по не той комб. клавиш cp (ix+2) ; hot-клавиша ? jr nz,MBcbLp ; нет ld a,(CurMenu) ; тек. полож. указателя гориз. меню cp h jr nz,MBcbnxt ld a,(CurMBox) or a ret nz ; окно меню открыто MBcbnxt:ld a,h ld (CurMenu),a ; тек. полож. указателя гориз. меню call SetMBar call ResBarI ; сбросить выдел. указатель call SetBarI ; вывести выдел. указатель call ClosBox jp OpenBox ; Курсор вверх MBup: ld a,(CurMBox) or a call z,OpenBox ; открыть меню ld a,(CurMBox) dec a jr nz,MBupNxt ld ix,BoxTabl-2 ; рабочая таблица верт. меню - 2 ld bc,6 ld a,b dec a MBupLp: inc a ; поиск последнего элемента add ix,bc bit 7,(ix+0) jr z,MBupLp MBupNxt:ld (CurMBox),a ld b,a ld ix,BoxTabl-2 ; рабочая таблица верт. меню - 2 ld de,6 add ix,de djnz $-2 push ix call ResBoxI call SetBoxI pop ix ret ; Курсор вниз MBdown: ld a,(CurMBox) or a jp z,OpenBox inc a ld ix,BoxTabl-2 ; рабочая таблица верт. меню - 2 ld bc,6 ld h,b ; тест на последний элемент MBdnLp: inc h add ix,bc bit 7,(ix+0) jr z,MBdnLp cp h jr nz,$+4 ld a,1 jr MBupNxt ; Курсор влево MBleft: ld a,(CurMenu) ; тек. полож. указателя гориз. меню dec a jr nz,MBlfNxt ld ix,BarTabl-5 ; рабочая таблица гориз. меню ld bc,5 ld a,b dec a MBlfLp: inc a ; поиск последнего пункта add ix,bc bit 7,(ix+0) jr z,MBlfLp MBlfNxt:ld (CurMenu),a ; тек. полож. указателя гориз. меню call ResBarI ; сбросить выдел. указатель call SetBarI ; вывести выдел. указатель ld a,(CurMBox) or a ret z call ClosBox jp OpenBox ; Курсор вправо MBright:ld a,(CurMenu) ; тек. полож. указателя гориз. меню inc a ld ix,BarTabl-5 ; рабочая таблица гориз. меню ld bc,5 ld h,b MBrgLp: inc h ; проверка на последний пункт add ix,bc bit 7,(ix+0) jr z,MBrgLp cp h jr nz,$+4 ld a,1 jr MBlfNxt ; Home MBhome: ld a,(CurMBox) or a ret z dec a ret z ld a,1 jp MBupNxt ; End MBend: ld a,(CurMBox) or a ret z ld h,a ld ix,BoxTabl-2 ; рабочая таблица верт. меню - 2 ld bc,6 ld a,b dec a MBendLp:inc a ; поиск последнего элемента add ix,bc bit 7,(ix+0) jr z,MBendLp cp h ret z jp MBupNxt ;------------------------------------------------- ; События мышки ;------------------------------------------------- MBmouse:ld e,(hl) ;+1 X coord inc hl ld d,(hl) ;+2 Y coord ld a,d or a jr nz,MBmousB ; Y<>0 then test on Box Open ld ix,BarTabl-5 ; рабочая таблица гориз. меню ld bc,5 ld h,b ld a,e ; поиск пункта гориз. меню MBmous1:inc h add ix,bc bit 7,(ix+0) ; конец описателя меню ? jp nz,CloseBx ; да, закрыть popup-меню cp (ix+0) jr c,MBmous1 ; < Xo cp (ix+1) jr nc,MBmous1 ; > Xi ld a,(CurMenu) ; тек. полож. указателя гориз. меню cp h jr nz,MBopenB ld a,(CurMBox) ; Test on current open menu or a jp nz,SetMBar MBopenB:ld a,h ; пункт найден ld (CurMenu),a ; тек. полож. указателя гориз. меню call SetMBar call ClosBox call ResBarI ; сбросить выдел. указатель call SetBarI ; вывести выдел. указатель jp OpenBox ; Проверка на координаты мышки и окна верт. меню MBmousB:ld a,(CurMBox) or a jp z,MenuExit ; нет откр. popup-меню, выйти в менеджер ld ix,BoxTabl ; рабочая таблица верт. меню ld a,e cp (ix+0) jr c,MBoxExt ; < Xo cp (ix+1) jr nc,MBoxExt ; > Xi ld a,d cp (ix+2) jr c,MBoxExt ; < Yo cp (ix+3) jr nc,MBoxExt ; > Yi dec ix dec ix ld bc,6 ld h,b MBloopB:inc h add ix,bc bit 7,(ix+0) ; конец описателя меню ? ret nz ; да ld a,d cp (ix+2) jr nz,MBloopB ld a,e ; поиск пункта меню cp (ix+0) jr c,MBloopB ; < Xo cp (ix+1) jr nc,MBloopB ; > Xi BxHotEx:ld a,(CurMBox) cp h jr z,BxEnter ; уст. пункт меню ld a,h ld (CurMBox),a push ix call ResBoxI call SetBoxI pop ix halt halt halt halt ; выполн. пункта Pop-меню по или мышке BxEnter:ld hl,what ld (hl),evCommand ; уст. событие "команда" inc hl ld a,(ix+3) ld (hl),a ;+1 номер команды call CloseBx ; закрыть верт. меню pop de ret ; выйти из гориз. меню MBoxExt:call ClosBox ; закрыть верт. меню jp MenuExit ; выйти в менеджер ; CloseBx:call ClosBox ; закрыть верт. меню jp get_fire SetMBar:ld a,(BarFlag) or a ret nz ;call ResCurs jp SetBarI ResMBar:ld a,(BarFlag) or a ret z jp ResBarI ;----------------------------------------------------------- ; Открыть окно вертикального Меню ; ; вход. параметры: (CurMenu) - Number MenuBox ;----------------------------------------------------------- OpenBox:ld a,1 ld (CurMBox),a ; номер пункта верт. меню ld b,a ; нач. верхняя строка окна ld hl,BarTabl ; табл. гориз. меню (поиск начала меню) ld a,(CurMenu) dec a ld c,a ; *5 add a,a add a,a add a,c add a,l ld l,a jr nc,$+3 inc h ; PutMenu:push iy ld iy,BoxTabl ; Generes MenuBox mouse table ld ix,BoxData ld a,(hl) dec a inc hl ld (iy+0),a ; Xo position MenuBox inc a ld (ix+2),a ; Xo for element box ld (iy+2),b ; Yo position MenuBox ld (ix+4),b ; Temp Y posit for element box inc hl inc hl ld a,(hl) ; адрес описателя тек. меню ld (ix+0),a ; сохр. адрес описателя inc hl ld h,(hl) ld (ix+1),h ld l,a call GetLenB ; get in DE len Y,X MenuBox ld a,e ; Xi position MenuBox sub 2 ld (ix+5),a ; ширина окна без рамки ld a,e add a,(iy+0) ld (iy+1),a dec a ld (ix+3),a ; Xi for element box ld a,d add a,(iy+2) ; Yi position MenuBox ld (iy+3),a call SaveBox ; сохр. экран под будущим окном ; in a,(SLOT3) push af ld a,(page_dial_screen) ; Page buffer out (SLOT3),a ; начало вставки окна с тенью в буфер ld hl,LC000+MaxDialWin ld bc,4 add iy,bc ; адрес описателя верт. меню exx ld hl,LC000 ld a,(ix+5) ; ширина окна inc a inc a add a,a ld e,a ld d,0 add hl,de exx ld a,(color_array+15) ; цвет верт. меню ld c,a ; рамка окна ld (hl),"┌" ; левый верх. угол inc hl ld (hl),c ; цвет inc hl ld b,(ix+5) ; ширина окна ld a,"─" ld (hl),a inc hl ld (hl),c inc hl djnz $-4 ld (hl),"┐" ; правый верх. угол inc hl ld (hl),c inc hl ld b,3 call copy_cell exx ld a,(hl) inc hl add hl,de exx ld (hl),a inc hl ld e,(ix+0) ld d,(ix+1) ; Цикл вывода пунктов меню MainPutBox: inc (ix+4) ; увеличить Y-полож. пункта меню ld a,(de) inc de cp -2 ; разделитель ? jr nz,PutBln2 ; вставить разделитель пунктов ld (hl),"├" inc hl ld (hl),c inc hl ld b,(ix+5) ld a,"─" ld (hl),a inc hl ld (hl),c inc hl djnz $-4 ld (hl),"┤" jr PutBln51 ; PutBln2:cp -1 ; конец описателя ? jp z,BoxExit ; да ld b,a ld a,(ix+2) ld (iy+0),a inc iy ld a,(ix+3) ld (iy+0),a inc iy ld a,(ix+4) ld (iy+0),a inc iy ld a,b ld (iy+0),a inc iy ld (hl),"│" inc hl ld (hl),c inc hl ld (PutBln4+1),hl ; адрес места под метку "√" ld b,2 ; 2 пробела в начале пункта ld (hl)," " inc hl ld (hl),c inc hl djnz $-5 inc b ; b=1 ld a,(de) PutBln3:inc de cp "&" call z,Bhotkey1__ ; вставить hot-букву ld (hl),a ; Put name element inc hl ld (hl),c inc hl inc b ld a,(de) or a ; конец имени ? jr nz,PutBln3 inc de ld a,(de) ; ячейка скен-кода пункта ld (iy+0),a ; скен-код hot-клавишы в таблицу inc iy inc de ld a,(de) ; ячейка контекста inc de ld (iy+0),a ; вставить код контекста ; вставить метку пункта "√" (если надо) push hl PutBln4:ld hl,0 or a jr z,PutBln5 ld (hl),"√" ; пункт "по-умолчанию" PutBln5:pop hl inc iy ld a,(ix+5) ; ширина тек. пункта dec a sub b ld b,a ld (hl)," " ; заполнить остаток пункта inc hl ld (hl),c inc hl djnz $-5 ld (hl),"│" PutBln51: inc hl ld (hl),c inc hl exx ld a,(hl) inc hl inc hl exx ld (hl),a inc hl ld (hl),color_shadow ; цвет тени inc hl exx ld a,(hl) inc hl inc hl add hl,de exx ld (hl),a inc hl ld (hl),color_shadow ; цвет тени inc hl jp MainPutBox ; назад в цикл BoxExit:ld (iy+0),80h ; конец таблицы ld (hl),"└" inc hl ld (hl),c inc hl ld b,(ix+5) ld a,"─" ld (hl),a inc hl ld (hl),c inc hl djnz $-4 ld (hl),"┘" BoxExit__: inc hl ld (hl),c inc hl ; вставить 2 тени угла "┘" ld b,2 call print_shadow ; вставить нижнюю тень ld b,4 call copy_cell ; скопир. ячейки ld b,(ix+5) ; Full Len box inc b inc b call print_shadow pop af out (SLOT3),a call PutBox pop iy jp SetBoxI ; Set box invert ; скопировать ячейки (b=счетчик) copy_cell: exx ld a,(hl) inc hl exx ld (hl),a inc hl djnz copy_cell ret ; вставить тень print_shadow: exx ld a,(hl) inc hl inc hl exx ld (hl),a inc hl ld (hl),color_shadow ; цвет тени inc hl djnz print_shadow ret ;----------------------------------------------------------- ; Вычислить ширину текущего окна верт. меню ; ; вход: hl=описатель меню ; выход: de=высота/ширина окна ; (доработан к "ширина+2" для дополн. крайних пробелов) ;---------------------------------------------------------- GetLenB:ld de,0206h ld b,e dec b GetLnL1:ld a,(hl) inc hl cp -1 ; конец описателя ? ret z cp -2 ; разделитель пунктов ? jr z,AddLine GetLnL2:inc b GetLnL3:ld a,(hl) inc hl cp "&" ; кавычка hot-буквы ? jr z,GetLnL3 or a ; конец названия пункта ? jr nz,GetLnL2 ; нет inc hl inc hl ; пройти скен-код ld a,b cp e jr c,AddLine ld e,b AddLine:inc d ld b,5 jr GetLnL1 ;------------------------------------------------- ; Сохранить экран под будущим окном ;------------------------------------------------- SaveBox:push ix inc e ; с тенью inc e inc d ld l,(iy+0) ; позиция окна ld h,(iy+2) ld a,l add a,e cp 80+2 ; за пределом экрана ? jr c,GetBnxt sub 80+2 ld l,a ld a,(ix+2) sub l ld (ix+2),a ld a,(ix+3) sub l ld (ix+3),a ld a,(iy+0) sub l ld (iy+0),a ld a,(iy+1) sub l ld (iy+1),a ld a,80+2 sub e ld l,a GetBnxt:ld ix,LC000 ; Address Box buffers ex de,hl ld (BoxLen+1),hl ld (BoxPos+1),de ld a,(page_dial_screen) ; стр. буфера ld c,0B2h call scrn4__ pop ix ret ;------------------------------------------------- ; Вывести окно меню на экран ;------------------------------------------------- PutBox: push ix ld ix,LC000+MaxDialWin ; address Box buffers BoxLen: ld hl,0 ; len box BoxPos: ld de,0 ; pos box ld a,(page_dial_screen) ; стр. буфера ld c,0B3h call scrn4__ pop ix ret ;------------------------------------------------- ; Закрыть окно меню и восст. экран ;------------------------------------------------- ClosBox:ld a,(CurMBox) or a ret z ld ix,LC000 ; Address Box buffers ld hl,(BoxLen+1) ; len box ld de,(BoxPos+1) ; pos box ld a,(page_dial_screen) ; Page buffer ld c,0B3h call scrn4__ xor a ld (CurMBox),a ret ; Функция вывода Меню выбора. Обработчик событий Меню выбора. ;----------------------------------------------------------- ; Отрисовка меню выбора ; ; вход: hl=таблица меню ; a=полож. пункта меню ;----------------------------------------------------------- put_menu_select: ld (CurMBox),a ; номер пункта меню push iy ld iy,BoxTabl ; Generes MenuBox mouse table ld ix,BoxData ld a,(hl) dec a inc hl ld b,(hl) inc hl ld (iy+0),a ; Xo position MenuBox inc a ld (ix+2),a ; Xo for element box ld (iy+2),b ; Yo position MenuBox ld (ix+4),b ; Temp Y posit for element box ld e,(hl) inc hl ld d,(hl) inc hl ld (selmenu_title+1),de ; адрес заголовка окна ld a,(hl) ; адрес описателя тек. меню ld (ix+0),a ; сохр. адрес описателя inc hl ld h,(hl) ld (ix+1),h ld l,a call GetLenB ; get in DE len Y,X MenuBox inc e; ; сделать по-шире ld a,e ; Xi position MenuBox sub 2 ld (ix+5),a ; ширина окна без рамки ld a,e add a,(iy+0) ld (iy+1),a dec a ld (ix+3),a ; Xi for element box ld a,d add a,(iy+2) ; Yi position MenuBox ld (iy+3),a call SaveBox ; сохр. экран под будущим окном in a,(SLOT3) push af ld a,(page_dial_screen) ; Page buffer out (SLOT3),a ; начало вставки окна с тенью в буфер ld hl,LC000+MaxDialWin ld bc,4 add iy,bc ; адрес описателя верт. меню exx ld hl,LC000 ld a,(ix+5) ; ширина окна inc a inc a add a,a ld e,a ld d,0 add hl,de exx ld a,(color_array+15) ; цвет верт. меню ld c,a ; центровка заголовка push hl ld de,(selmenu_title+1) ; адрес заголовка окна ld a,(de) ; длина заголовка ld b,a ld a,(ix+5) ; ширина окна sub b srl a ; /2 add a,a ; учесть атрибуты (результат всегда четный) ld e,a ld d,0 add hl,de ld (selmenu_addr+1),hl ; адрес вставки pop hl ; рамка окна ld (hl),"╔" ; левый верх. угол inc hl ld (hl),c ; цвет inc hl ld b,(ix+5) ; ширина окна ld a,"═" ld (hl),a inc hl ld (hl),c inc hl djnz $-4 ld (hl),"╗" ; правый верх. угол inc hl ld (hl),c inc hl ; push hl selmenu_title: ld de,0 ; адрес титла окна selmenu_addr: ld hl,0 ; адрес вставки ld a,(de) ld b,a ; длина строки inc de ld (hl)," " inc hl inc hl ld a,(de) ld (hl),a inc hl inc hl ; атрибут inc de djnz $-5 ld (hl)," " pop hl ; ld b,3 call copy_cell exx ld a,(hl) inc hl add hl,de exx ld (hl),a inc hl ld e,(ix+0) ld d,(ix+1) ; цикл вывода пунктов меню selmenu_loop: inc (ix+4) ; увеличить Y-полож. пункта меню ld a,(de) inc de cp -2 ; разделитель jr nz,selmenu1__ ; вставить разделитель пунктов ld (hl),"╟" inc hl ld (hl),c inc hl ld b,(ix+5) ; ширина пункта ld a,"─" ld (hl),a inc hl ld (hl),c inc hl djnz $-4 ld (hl),"╢" jr selmenu3__ selmenu1__: cp -1 ; конец описателя ? jp z,selmenu4__ ; да ld b,a ld a,(ix+2) ld (iy+0),a inc iy ld a,(ix+3) ld (iy+0),a inc iy ld a,(ix+4) ld (iy+0),a inc iy ld a,b ld (iy+0),a inc iy ld (hl),"║" inc hl ld (hl),c inc hl ld b,2 ; 2 пробела в начале пункта ld (hl)," " inc hl ld (hl),c inc hl djnz $-5 inc b ; b=1 ld a,(de) selmenu2__: inc de cp "&" call z,Bhotkey1__ ; вставить hot-букву ld (hl),a ; Put name element inc hl ld (hl),c inc hl inc b ld a,(de) or a ; конец имени ? jr nz,selmenu2__ inc de ld a,(de) ; ячейка скен-кода пункта ld (iy+0),a ; скен-код hot-клавишы в таблицу inc iy inc de inc de ; не исп. ячейку контекста inc iy ; ld a,(ix+5) ; ширина тек. пункта dec a sub b ld b,a ld (hl)," " ; заполнить остаток пункта inc hl ld (hl),c inc hl djnz $-5 ld (hl),"║" selmenu3__: inc hl ld (hl),c inc hl exx ld a,(hl) inc hl inc hl exx ld (hl),a inc hl ld (hl),color_shadow ; цвет тени inc hl exx ld a,(hl) inc hl inc hl add hl,de exx ld (hl),a inc hl ld (hl),color_shadow ; цвет тени inc hl jp selmenu_loop ; назад в цикл ; selmenu4__: ld (iy+0),80h ; конец таблицы ld (hl),"╚" inc hl ld (hl),c inc hl ld b,(ix+5) ld a,"═" ld (hl),a inc hl ld (hl),c inc hl djnz $-4 ld (hl),"╝" jp BoxExit__ ;----------------------------------------------------------- ; ; Обработчик событий Меню выбора ; ;----------------------------------------------------------- event_menu_select: call handle_event ; читаем событие ld hl,what ld de,event_menu_select push de ld a,(hl) ;+0 узнать событие inc hl cp evMouseFr ; нажаты бутоны мышки jp z,sel_menu_mouse cp evKeyboard ; нажаты обычные клавиши jr z,sel_menu_keys cp evCombKey ; нажаты курс. клавиши и служ. jr z,sel_menu_ckeys ret ; sel_menu_exit: call CloseBx ; закрыть меню pop de ; восст. баланс стека ld hl,what ld (hl),evNothing ; "нет событий" ret ;------------------------------------------------- ; Обычные клавиши ;------------------------------------------------- sel_menu_keys: ld a,(hl) ;+1 код клавиши cp 1Bh ; Esc jr z,sel_menu_exit cp 0Dh ; Enter jr nz,sel_menu_keys1 ld a,(CurMBox) ; if not box then open ld b,a ld ix,BoxTabl-2 ; поиск пункта верт. меню ld de,6 add ix,de djnz $-2 jp BxEnter ; sel_menu_keys1: inc hl ld a,(hl) ;+2 скен-код клавиши ld ix,BoxTabl-2 ; рабочая таблица верт. меню - 2 ld bc,6 ld h,b sel_menu_keys2: inc h add ix,bc bit 7,(ix+0) ; конец описателя меню ? ret nz ; да, hot-клавиша не найдена cp (ix+4) ; скен-код hot-клавиши jr nz,sel_menu_keys2 jp BxHotEx ;------------------------------------------------- ; Клавиши управл. курсором и F10 ;------------------------------------------------- sel_menu_ckeys: inc hl ld a,(hl) ;+2 what cp 44h ; F10 jr z,sel_menu_exit cp 58h ; вверх jp z,MBup cp 52h ; вниз jp z,MBdown cp 54h ; влево jp z,MBup cp 56h ; вправо jp z,MBdown cp 57h ; Home jp z,MBhome cp 51h ; End jp z,MBend ret ;------------------------------------------------- ; События мышки ;------------------------------------------------- sel_menu_mouse: ld e,(hl) ;+1 X coord inc hl ld d,(hl) ;+2 Y coord ; проверка на коорд. мышки и окна ld ix,BoxTabl ; рабочая таблица ld a,e cp (ix+0) jp c,sel_menu_exit ; < Xo cp (ix+1) jp nc,sel_menu_exit ; > Xi ld a,d cp (ix+2) jp c,sel_menu_exit ; < Yo cp (ix+3) jp nc,sel_menu_exit ; > Yi dec ix dec ix ld bc,6 ld h,b selmenu_mouse_loop: inc h add ix,bc bit 7,(ix+0) ; конец описателя меню ? ret nz ; да ld a,d cp (ix+2) jr nz,selmenu_mouse_loop ld a,e ; поиск пункта меню cp (ix+0) jr c,selmenu_mouse_loop ; < Xo cp (ix+1) jr nc,selmenu_mouse_loop ; > Xi jp BxHotEx ;------------------------------------------------- ; Настройка "√" меток пунктов меню ;------------------------------------------------- prep_default_puncts: ld c,CTdef ; "√" по-умолчанию выделено ld a,CTnodef ; " " по-умолчанию не выделено ; Сбросить пункты ; Left-меню ld (LBrief),a ld (LMed),a ld (LFull),a ld (LInfo),a ld (LQview),a ; сортировка ld (LName),a ld (LExt),a ld (LDate),a ld (LSize),a ld (LUnsort),a ; Right-меню ld (RBrief),a ld (RMed),a ld (RFull),a ld (RInfo),a ld (RQview),a ; сортировка ld (RName),a ld (RExt),a ld (RDate),a ld (RSize),a ld (RUnsort),a ; Настроить пункты ld hl,LFull ld a,(format_mode) ; формат акт. панели bit 0,a ; full jr nz,prep_default1__ ld hl,LMed bit 1,a ; medium jr nz,prep_default1__ ld hl,LBrief bit 2,a ; brief jr nz,prep_default1__ ld hl,LInfo bit 3,a ; info jr nz,prep_default1__ ld hl,LQview ; qview prep_default1__: ld (hl),c ; сортировка ld hl,LName ld a,(sort_type) ; сорт. акт. панели cp "n" jr z,prep_default2__ ld hl,LExt cp "x" jr z,prep_default2__ ld hl,LDate cp "d" jr z,prep_default2__ ld hl,LSize cp "s" jr z,prep_default2__ ld hl,LUnsort prep_default2__: ld (hl),c ; Right-меню ld hl,RFull ld a,(format_mode1) ; формат пасс. панели bit 0,a ; full jr nz,prep_default3__ ld hl,RMed bit 1,a ; medium jr nz,prep_default3__ ld hl,RBrief bit 2,a ; brief jr nz,prep_default3__ ld hl,RInfo bit 3,a ; info jr nz,prep_default3__ ld hl,RQview ; qview prep_default3__: ld (hl),c ; сортировка ld hl,RName ld a,(sort_type1) ; сорт. пасс. панели cp "n" jr z,prep_default4__ ld hl,RExt cp "x" jr z,prep_default4__ ld hl,RDate cp "d" jr z,prep_default4__ ld hl,RSize cp "s" jr z,prep_default4__ ld hl,RUnsort prep_default4__: ld (hl),c ret