true equ 1 false equ 0 ; Число файлов на колонку files_per_colon equ 25 ; Форматы панелей form_full equ 00000001b ; 0-bit full form_med equ 00000010b ; 1-bit medium form_brief equ 00000100b ; 2-bit brief form_info equ 00001000b ; 3-bit info form_qview equ 00010000b ; 4-bit qview ;form_tree equ 00100000b ; 5-bit tree form_trd equ 01000000b ; 6-bit trd/scl формат ;form_ equ 10000000b ; 7-bit ; Стек уже стоит на @stack call read_ini_file ; прочитать ini-файл (если есть) ; вкл. в #0000 драйверы клавы, мышки, объекты di ld a,(page_module0) out (SLOT0),a ; настроить опц. ячейки, диски и пути панелей call init_option_cells ; берет данные из work_buffer call set_colors ; настроить цвета оболочки ; выкл. вывод часов ld hl,enable_clock ; флаг ld a,(hl) ld (clock__+1),a ; сохр. ld (hl),false ; сбр. ei ;ld a,form_info ;ld (format_mode),a call make_user_menu ; создать Меню Пользователя ; холодный вход (все, кроме дос-команд) cold_entry: ; уст. конфигурацию Sprinter-2 (вкл. аксель) ld c,0F1h rst 08h ; цвет бордюра xor a out (0FEh),a ; уст. внутр. палитру ld a,1 ; номер экрана ld bc,03A6h ; CGA-палитра rst 08h call init_list_types_drives ; иниц. список типов дисков системы call get_total_free_space ; своб. место на 2 дисках панелей ; теплый вход (для дос-команд) warm_entry: ; сохр. полож. курсора сист. экрана ld c,8Eh rst 08h ld (sys_cursor_coords+1),de ; уст. текст. режим экрана ld a,3 ; 80x32x16 цветов ld bc,0150h ; b=1 экран rst 10h ; сохр. сист. экран ld c,0B2h ld a,(page_sys_screen) ; стр. буфера окна call screen__ ld a,0C0h out (89h),a ; закрыть спек. экран ; инит. драйвер клавы xor a rst 20h ; очистить буфер клавы ld a,1 rst 20h ; иниц. обработчик событий call InitEvent ld a,(present_doscmnd) ; признак отработки дос-команд or a jr z,entry1 ; не дос-команда db 3Eh ; ld a,.. number_command: db 0 ; порядк. номер дос-команды cp 14 ; "rename" jr c,entry2 ; 23..14 номера команд, изменяющих список диска entry1: ; Заполнить банки списками файлов акт. панель call save_pos_list ; сохр. прежнее полож. указателя и списка call read_new_folder ; новый список каталога + размер папки call sorting ; раздельный список указателей + сорт. списка call set_newpos_list ; уст. полож. указателя и списка ; пасс. панель call change_panel ; сменить панель call read_new_folder call sorting call change_panel entry2: xor a ld (present_doscmnd),a ; сбр. признак дос-команд ld (number_command),a ; сбр. номер команды ld (this_cd),a ; сбр. признак "cd","chdir" команд call PutComLine ; нач. вывод пути в ком-строке call print_keybar ; начальный вывод key-бара call A20FC ; вывести аст. панель call change_panel ; сменить панель call A20FC ; вывести пасс. панель call change_panel call print_status ; статусная строка панели call show_pointer ; начальный вывод указателя call init_mouse ; иниц. и показать мышку clock__: ld a,false ld (enable_clock),a ; восст. флаг ; главный цикл main_loop: ld hl,main_loop ; точка возврата push hl ; ld hl,what ; поле событий ld a,(hl) ; событие cp evRunComLine ; событие "отработать ком-строку" jp z,parsing_command_line ; launch.asm ; halt ld a,3 ; тест нажатия клавиш rst 20h ld a,b and 11110000b ; Ctrl,Alt,Shift ? jp nz,change_keybar ; сменить вид key-бара и отраб. опцию call dinam_qview_panel ; отраб. при вкл. qview-панели jp nz,change_keybar ; сменить вид key-бара и отраб. опцию call handle_event ; читаем событие ld a,(what) ;+0 список событий cp evNothing ret z cp evMouseFr jp z,buttons_press ; бутоны нажаты cp evKeyboard jp z,normal_char ; обычные клавиши cp evCombKey ret nz ld a,d cp 58h ; курсор вверх jp z,up cp 52h ; курсор вниз jp z,down cp 54h ; курсор влево jp z,left cp 56h ; курсор вправо jp z,right cp 53h ; PageDown jp z,page_down cp 59h ; PageUp jp z,page_up cp 57h ; Home jp z,home_list cp 51h ; End jp z,end_list ld a,d cp 3Bh ; F1 ;jp z, cp 3Ch ; F2 jp z,user_menu cp 3Dh ; F3 jp z,file_viewer cp 3Eh ; F4 ;jp z, cp 3Fh ; F5 jp z,copy cp 40h ; F6 jp z,rename cp 41h ; F7 jp z,make_folder cp 42h ; F8 jp z,delete cp 43h ; F9 jp z,main_menu cp 44h ; F10 jr z,quit ld a,(format_mode) ; формат акт. панели and form_info+form_qview ; info, qview ret nz ld a,d cp 50h ; Ins jp z,mark cp 4Fh ; Del ;jp z, ret quit: db 3Eh ; ld a,.. confirm_quit: db true ; флаг "подтверждение выхода" or a jr z,quit__ ; открыть окно "Quit" ld hl,win_dial_quit ; описатель окна call DialogW cp evCommand ; событие "команда" ret nz ld a,(hl) ;+1 what cp cmOkey ; "Yes" ret nz quit__: ld b,0 ; Ok возвр. код pop hl ; восст. баланс стека jp exit ; выход в ДОС ;----------------------------------------------------------- ; обычные клавиши ;----------------------------------------------------------- normal_char: ld a,e cp 1Bh ; Esc временный просмотр экрана jp z,view_screen cp 9 ; Tab смена акт. панели jp z,tab cp 0Dh ; Enter jp z,Press_Enter cp " " ret c ; ввод символов в ком-строку ld hl,(YXpos+1) ; начало поля ввода ком-строки ld (CursorPos),hl ; полож. курсора на экране ent_to_cline: call ComLineI ; вкл. курсор jp EvComLine1 ; вход в ком-строку ; войти в ком-строку (альт. вход) alt_enter_to_comline: ld hl,what ; список событий ld (hl),evNothing ; не отраб. повторно jr ent_to_cline ;------------------------------------------------- ; Временный просмотр сист. экрана (Esc) ;------------------------------------------------- view_screen: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. db 3Eh ; ld a,.. flag_esc: db true ; флаг врем. просмотра экрана по Esc or a ret z ; выкл. вывод часов ld hl,enable_clock ; восст. флаг ld a,(hl) push af ld (hl),false ; сохр. полный экран менеджера ld c,0B2h ld a,(page_sys_screen) ; страница буфера call screen2__ ; восст. полный системный экран ld c,0B3h ld a,(page_sys_screen) ; страница буфера call screen__ view_scr_loop__: ; ждем нажатия мышки call get_mouse_info ; чтение состояния мышки jr z,view_scr_loop1__ ; кнопки не нажаты call get_fire ; ждем, пока нажаты кнопки jr view_scr__ ; view_scr_loop1__: ; ждем нажатия клавиши ld a,2 rst 20h jr z,view_scr_loop__ ld a,1 ; очистить буфер клавы rst 20h view_scr__: ; восст. полный экран менеджера ld c,0B3h ld a,(page_sys_screen) ; страница буфера call screen2__ pop af ld (enable_clock),a ; восст. флаг ret ; сравнить hl с de cmphlde: ld a,l sub e ld a,h sbc a,d ret ; загрузить de L0020: ld e,(hl) inc hl ld d,(hl) inc hl ret ; (hl) -> (ix) ; b-счетчик A0E90: ld a,(hl) ld (ix+0),a inc hl inc ix djnz $-7 ret ; Копирование строки до нуля. Нуль копируется тоже. ; (hl) -> (de) copy_string: ld a,(hl) ldi or a jr nz,$-4 ret ;------------------------------------------------- ; Сравнение строки с учетом регистра. ; (образец должен заканчиваться нулем) ; вход: de - string1 ; hl - string2 (образец) ; выход: "z" - string1 = string2 ; "c" - string1 < string2 ; иначе - string1 > string2 ;------------------------------------------------- compare_strings:ld a,(de) cp (hl) ret nz inc hl inc de ld a,(hl) or a jr nz,$-7 ; образец не закончен ld a,(de) cp (hl) ret ;------------------------------------------------- ; Умножение BC*DE=HLBC ;------------------------------------------------- mul_bcde: ld hl,0 ld a,17 rr b rr c dec a ret z jr nc,$+3 add hl,de rr h rr l jr $-13 ; Вывод HL в hex-формате ; ix=буфер ; hl=число hex16: ld a,h call hex8 ld a,l ; Вывод "a" в hex-формате ; ix=буфер ; a=число hex8: push af rrca rrca rrca rrca call $+4 pop af and 0Fh add a,90h daa adc a,40h daa ld (ix+0),a inc ix ret ; Тест режима отображения панелей ; ------------------------------- ; out: Z - выкл. панели ; NZ - вкл. панели test_show_panels: db 3Eh ; ld a,.. enable_panels: db true ; флаг отображения панелей or a ret ;----------------------------------- ; курсор влево ;----------------------------------- left: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. -> перемещение в ком-строке ld a,(format_mode) ; формат акт. панели cp form_info ; info ret z cp form_qview ; qview ret z; ;jp z, ; если файл, то навигация по нему ld hl,(all_files) ; число файлов и папок ld a,l or h ret z call dinqview_set_flag ; уст. флаг "отработать dinamqview" ld hl,(cur_pointer) ; тек. позиция указателя ld a,l or h jr nz,A0CE6_ ; указатель не в начале списка ld de,(offset_list) ; смещ. списка adc hl,de ; adc нужен для уст."z" jr nz,_0CEE ; список смещен ret ; стоим в начале списка A0CE6_: ld de,files_per_colon ; 25 файлов на колонку sbc hl,de jp nc,A0E12_ ; обновить полож. указателя ; дошли до левого края списка A0CE8: ld hl,0 ; указатель в начало писка jp A0E12_ ; обновить полож. указателя ;----------------------------------- ; на страницу вверх ;----------------------------------- page_up: call test_show_panels ; тест на режим вкл. панелей jr nz,$+8 call history_begin ; в начало истории jp alt_enter_to_comline ; фокус на ком-строку ; ld a,(format_mode) ; формат акт. панели cp form_info ; info ret z cp form_qview ; qview ret z; ;jp z, ; если файл, то навигация по нему ld hl,(all_files) ; число файлов и папок ld a,l or h ret z ld hl,(cur_pointer) ld bc,(offset_list) ; смещ. списка adc hl,bc ; "adc" нужен для "z" ret z ; указатель в начале списка call dinqview_set_flag ; уст. флаг "отработать dinamqview" ld a,c or b jr z,A0CE8 ; указатель не в начале списка ; список смещен call clear_pointer ld hl,0 ; сбр. полож. указателя ld (cur_pointer),hl ld hl,(offset_list) ; смещ. списка _0CEE: ld de,files_per_colon ; 25/50/75 размер страницы and a sbc hl,de jr nc,$+5 A0CF0: ld hl,0 ld (offset_list),hl jp A0D78 ; обновить весь список панели ;----------------------------------- ; курсор вправо ;----------------------------------- right: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. -> перемещение в ком-строке ld a,(format_mode) ; формат акт. панели cp form_info ; info ret z cp form_qview ; qview ret z; ;jp z, ; если файл, то навигация по нему ld hl,(all_files) ; число файлов и папок ld a,l or h ret z ld hl,(cur_pointer) ; тек. позиция указателя _0D01: ld de,files_per_colon-1 ; размер страницы - 1 call cmphlde ; сравнить hl с de jr z,A0D1D ; указатель в конце списка панели call dinqview_set_flag ; уст. флаг "отработать dinamqview" ; ld de,files_per_colon ; 25 файлов на колонку add hl,de _0D08: ld de,files_per_colon ; 25/50/75 размер страницы call cmphlde ; сравнить hl с de jr c,$+5 ; дошли до правого края списка _0D0D: ld hl,files_per_colon-1 ; размер страницы - 1 inc hl ld de,(all_files) ; файлов и папок call cmphlde ; cp (hl) сравнить hl с de dec hl jp c,A0E12_ ; обновить полож. указателя ex de,hl ; hl=all_files (файлов+папки) dec hl jp A0E12_ ; обновить полож. указателя ;----------------------------------- ; на страницу вниз ;----------------------------------- page_down: call test_show_panels ; тест на режим вкл. панелей jr nz,$+8 call history_last ; в конец истории jp alt_enter_to_comline ; фокус на ком-строку ; ld a,(format_mode) ; формат акт. панели cp form_info ; info ret z cp form_qview ; qview ret z; ;jp z, ; если файл, то навигация по нему ld de,(all_files) ; число файлов и папок ld a,e or d ret z call dinqview_set_flag ; уст. флаг "отработать dinamqview" ld hl,(_0D01+1) ; размер страницы - 1 call cmphlde ; сравнить hl с de jr c,A0D1D ; число файлов меньше, чем ; умещается в списке панели ld hl,(cur_pointer) ; указатель на конец списка панели dec de call cmphlde ; сравнить hl с de ret z ; указатель в конце списка ex de,hl ; hl = all_files-1 jp A0E12_ ; обновить полож. указателя ; A0D1D: ld c,l ld b,h ; тест на конец всего списка ld hl,(cur_pointer) ; тек. позиция указателя ld de,(offset_list) ; смещ. списка inc hl add hl,de ld de,(all_files) call cmphlde ; сравнить hl с de ret z ; конец файлов _0D1F: ld hl,files_per_colon ; 25/50/75 размер страницы ld de,(offset_list) ; смещ. списка add hl,de ld de,(all_files) ; число файлов и папок call cmphlde ; сравнить hl с de ld l,c ld h,b jp z,A0E12_ ; указатель в пределах послед. страницы списка push hl call clear_pointer pop hl ld (cur_pointer),hl ld bc,(all_files) ; число файлов и папок ld hl,(offset_list) ; смещ. списка _0D2C: ld de,files_per_colon ; 25/50/75 размер страницы add hl,de ld (offset_list),hl dec de add hl,de and a sbc hl,bc jp c,A0F09 ; обновить весь список панели ex de,hl ld hl,(offset_list) ; смещ. списка sbc hl,de dec hl ld (offset_list),hl jp A0F09 ; обновить весь список панели ;----------------------------------- ; курсор вверх ;----------------------------------- up: call test_show_panels ; тест на режим вкл. панелей jr nz,$+8 up1: call history_prev ; пред. строка истории jp alt_enter_to_comline ; фокус на ком-строку ld a,(format_mode) ; формат акт. панели bit 3,a ; info ret nz bit 4,a ; qview ret nz; ;jp z, ; если файл, то навигация по нему ld hl,(all_files) ; число файлов и папок ld a,l or h ret z ld hl,(cur_pointer) ; тек. позиция указателя ld de,(offset_list) ; смещ. списка adc hl,de ; adc нужен для "z" ret z ; стоим в начале списка call dinqview_set_flag ; уст. флаг "отработать dinamqview" and a sbc hl,de ; минус offset_list jr nz,A0D94_ ex de,hl ; hl=offset_list dec hl ld (offset_list),hl ; цикл скроллинга всего списка панели A0D78: ld hl,0 call A0E15_ ; вывод указателя в новом полож. A0D7A: ld hl,(cur_pointer) ; тек. позиция указателя inc hl ld (cur_pointer),hl _0D7D: ld de,files_per_colon ; 25/50/75 размер страницы call cmphlde ; сравнить hl с de jr z,A0D80 call A2203 ; вывод строки списка jr A0D7A ; A0D80: ld hl,0 ld (cur_pointer),hl ; новое полож. ret ; A0D94_: ld hl,(cur_pointer) dec hl ; --cur_pointer jp A0E12_ ; обновить полож. указателя ;----------------------------------- ; курсор вниз ;----------------------------------- down: call test_show_panels ; тест на режим вкл. панелей jr nz,$+8 down1: call history_next ; след. строка истории jp alt_enter_to_comline ; фокус на ком-строку ld a,(format_mode) ; формат акт. панели bit 3,a ; info ret nz bit 4,a ; qview ret nz; ;jp nz, ; если файл, то навигация по нему ld hl,(all_files) ; число файлов и папок ld a,l or h ret z call dinqview_set_flag ; уст. флаг "отработать dinamqview" ld hl,(cur_pointer) ; тек. позиция указателя _0EC7: ld de,files_per_colon-1 ; размер страницы - 1 call cmphlde ; сравнить hl с de jp nz,A0E0A ; сместить указатель вниз ; дошли до конца списка панели ld de,(offset_list) ; смещ. списка inc hl add hl,de ld de,(all_files) call cmphlde ; сравнить hl с de ret z ; конец файлов ld hl,(offset_list) ; смещ. списка inc hl ld (offset_list),hl A0F09: ld hl,files_per_colon-1 ; размер страницы - 1 call A0E15_ ; вывод указателя в новом полож. ; цикл скроллинга всего списка панели A0F0A: ld hl,(cur_pointer) ; тек. позиция указателя dec hl ld (cur_pointer),hl inc hl ld a,l or h jr z,A0F0C ; дошли до конца списка файлов call A2203 ; вывод строки списка jr A0F0A ; A0F0C: ld hl,(A0F09+1) ld (cur_pointer),hl ; новое полож. ret ; переместить указатель вниз A0E0A: ld de,(all_files) inc hl ; ++cur_pointer call cmphlde ; сравнить hl с de ret z ; конец файлов A0E12_: push hl call clear_pointer ; стереть указатель pop hl A0E15_: ld (cur_pointer),hl ; новое полож. jp show_pointer ; вывести указатель ;----------------------------------- ; в начало списка ;----------------------------------- home_list: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. -> перемещение в ком-строке ld a,(format_mode) ; формат акт. панели cp form_info ; info ret z cp form_qview ; qview ret z; ;jp z, ; если файл, то навигация по нему ld hl,(all_files) ; число файлов и папок ld a,l or h ret z ld hl,(cur_pointer) ; тек. полож. указателя ld de,(offset_list) ; смещ. списка xor a adc hl,de ; adc нужен для "z" ret z ; стоим в начале списка ld l,a ld h,a ; hl=0 call dinqview_set_flag ; уст. флаг "отработать dinamqview" call cmphlde ; список смещен ? jr z,A0E12_ ; нет, обновить только полож. указателя call clear_pointer jp A0CF0 ;----------------------------------- ; в конец списка ;----------------------------------- end_list: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. -> перемещение в ком-строке ld a,(format_mode) ; формат акт. панели cp form_info ; info ret z cp form_qview ; qview ret z; ;jp z, ; если файл, то навигация по нему ld hl,(all_files) ; число файлов и папок ld a,l or h ret z call dinqview_set_flag ; уст. флаг "отработать dinamqview" ld c,l ; bc=all_files ld b,h ld hl,(cur_pointer) ld de,(offset_list) ; смещ. списка add hl,de inc hl ld a,l sub c ld a,h sbc a,b ret z ; указатель в конце списка ld de,(_0D01+1) ; размер страницы - 1 ld l,c ; hl=all_files ld h,b call cmphlde jr nc,lst4__ ; число файлов меньше списка панели lst3__: dec hl jp A0E12_ ; обновить полож. указателя ; lst4__: ld bc,-1 ; счетчик dec hl ; --all_files inc bc call cmphlde ; hl и "размер страницы - 1" jr nc,$-5 ld hl,(offset_list) ; смещ. списка and a sbc hl,bc jr c,lst6__ ; указатель в пределах послед. страницы списка ex de,hl jr lst3__ ; lst6__: push bc push de call clear_pointer pop de pop bc dec bc ld (offset_list),bc inc de ld (cur_pointer),de jp A0F09 ; обновить список панели ;----------------------------------- ; Ins, отметка файлов ;----------------------------------- mark: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ld hl,(all_files) ; число файлов и папок ld a,l or h ret z call A0E13 ; ставит/снимает отметку файлов ld hl,(cur_pointer) ; тек. позиция указателя _0DA4: ld de,files_per_colon-1 ; размер страницы - 1 call cmphlde ; сравнить hl с de ex af,af' db 3Eh ; ld a,.. enable_down_mark: db true ; флаг "смещать курсор при выделении" or a ret z ex af,af' jp nz,A0E0A ; переместить указатель вниз ; нижняя строка страницы ld de,(offset_list) ; смещ. списка inc hl add hl,de ld de,(all_files) ; число файлов и папок call cmphlde ; сравнить hl с de jp z,show_pointer ; последний файл списка (список больше страницы) A0DB7: ld hl,(offset_list) ; смещ. списка inc hl ld (offset_list),hl A0DE9: ld hl,(cur_pointer) ; тек. позиция указателя dec hl ld a,l or h jr z,_0E04 ld (cur_pointer),hl call A2203 ; для смещ. списка вниз jr A0DE9 ; _0E04: ld hl,files_per_colon-1 ; 25/50/75 размер страницы (после,"размер страницы - 1") jp A0E15_ ; вывод указателя в новом полож. ; Ставит/снимает отметку файлов и выводит ; информ. строку выдел. файлов A0E13: ; уст. режим клавы "вставка" ld hl,D0642 ; флаги клавы set 1,(hl) ; уст. 1-й бит (вставка) ; call get_record ; узнать адрес тек. записи в папке ld a,(format_mode) ; тек. фомат панели and form_trd ; spec jp nz,mark_spec_record ld a,(de) ;+11 смещ. до байта атрибутов and 10h ; папка ? jr z,A0E15 ; нет ld a,(hl) cp "." ; ".." ret z db 3Eh ; ld a,.. mark_folders: db true ; флаг отметки папок or a ret z ; не отмечать A0E15: inc de ld bc,28 ; смещ. до размера файла add hl,bc ld a,(de) ; +12 ячейка маркировки файла xor 80h ; инверт. флаг ld (de),a push hl push af call show_pointer ; вывод указателя pop af pop hl call L0020 ; de <= low-размер файла ld c,(hl) ; bc=ст. разряда размера inc hl ld b,(hl) A0E49: ld hl,(low_size) ; мл. разряд размера выдел. файлов rlca ; a=байт отметки jr nc,A0E77 ; отметка снята, вычесть размер файла add hl,de ; de=мл.разряд размера ld (low_size),hl ; мл.разряд размера выдел. файлов ld hl,(high_size) ; ст.разряд adc hl,bc ld (high_size),hl ld hl,(mark_files) ; число выдел. файлов inc hl ; увел. число выдел. файлов ld (mark_files),hl A0E63: ld hl,(__markline) ; описатель строки "xxx.. bytes in xx files" inc hl inc hl inc hl ld (A0E70_+1),hl ;+3 от начала описателя inc hl inc hl push hl pop ix ;+5 ix=mark_string+1 ; вставить объем файлов ld hl,put_comma ; уст. флаг вывода запятой inc (hl) exx ld hl,(high_size) exx ld hl,(low_size) ld b,0 ; без ведущих пробелов call dec32 ; объем выдел. файлов ld hl,put_comma ; флаг разделения разрядов dec (hl) ; сбр. флаг ; вставить строку " bytes in " ld hl,mark_string1__ ld b,10 ; длина строки call A0E90 ; скопировать строку ; вставить число выдел. файлов ld hl,(mark_files) ; число выдел. файлов ld e,l ld d,h call dec16 ; число без ведущ. пробелов ; вставить строку " files" ld b,5 ; длина строки " files" - 1 and a ld hl,1 sbc hl,de ; de=число mark-файлов jr nc,A0E6D_ inc b A0E6D_: ld hl,mark_string2__ call A0E90 ; скопировать строку push ix pop hl xor a ld (hl)," " ; концевой пробел inc hl ld (hl),a ; конец описателя dec hl ; узнать длину строки A0E70_: ld de,0 ;+3 сохр. mark_string-1 sbc hl,de ld c,l ; центрировать строку srl l ; длина строки / 2 ld a,20 ; половина ширины панели sub l ld (de),a ; X полож. строки ld hl,-3 add hl,de ; hl=начало описателя ld a,(hl) ; старая длина строки ld (hl),c ; новая длина строки inc c cp c ; новая < старой ? push hl call nc,clear_footer_line ; да, очистить строку pop hl ; вывод готовой строки jp draw_text ; позиц. вывод строки ; ; вычесть размер файла A0E77: sbc hl,de ld (low_size),hl ; мл. разряд размера выдел. файлов ld hl,(high_size) sbc hl,bc ld (high_size),hl ; ст. разряд ld hl,(mark_files) ; число выдел. файлов dec hl ld (mark_files),hl ld a,l or h jp nz,A0E63 ; 0 отмеченых файлов, стереть инф. строку clear_footer_line: ld hl,footer_med ld a,(format_mode) ; формат панели bit 1,a ; medium jp nz,draw_text ; позиц. вывод строки ld hl,footer_brief bit 2,a ; brief jp nz,draw_text ld hl,footer_spec bit 6,a ; spec jp nz,draw_text ld hl,footer_full ; full jp draw_text ; Ставит/снимает отметку спек-файлов mark_spec_record: ld a,(hl) ;+0 1-я буква имени xor 80h ld (hl),a ld bc,11 ;+11 add hl,bc ; перейти на размер файла push hl push af call show_pointer ; вывод указателя pop af pop hl call L0020 ; de=мл. разряд размера файла ld bc,0 ; bc=ст. разряд размера файла jp A0E49 ;--------------------------------------------------------------------- ; Вывод всей информации в панели ;--------------------------------------------------------------------- A20FC: ld a,(disk) ; номер диска add a,"A" ld hl,(char_disk) ; адрес буквы диска акт. панели ld (hl),a call width_path ; путь из path-буфера в буфер пути панели call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. call draw_half_frame ; боковые стороны и пред-нижняя линия рамки call A208F ; настр. список панели + middle-линия call A21AA ; вывод пути и суммарной инфы ld a,(format_mode) ; формат панели and form_info+form_qview ret nz ; ld hl,(__title) ; заголовок панели call draw_text ; A2551 позиц. вывод строки call show_sort_letter ; вывод буквы сортировки ld hl,(all_files) ; число файлов и папок ld a,l or h ret z ; вывод списка файлов ld hl,(cur_pointer) ; сохр. тек. позицию указателя push hl ld hl,0 ; начать вывод с начала ld (cur_pointer),hl ; цикл вывода всего списка A2151: call A2203 ; вывод строки списка ld hl,(cur_pointer) ; тек. позиция указателя inc hl ld (cur_pointer),hl _2159: ld de,files_per_colon ; 25/50/75 размер страницы call cmphlde ; сравнить hl с de jr z,A2164 ld de,(all_files) call cmphlde ; дошли до конца файлов ? jr nz,A2151 ; нет A2164: pop hl ld (cur_pointer),hl ; восст. тек. позицию указателя call print_status ; статусная строка внизу панели ; вывод строки "xxx.. bytes in xx files" ld hl,(mark_files) ; число выдел. файлов ld a,l or h ret z ld a,(format_mode) ; формат акт. панели and form_info+form_qview ret nz ; full/med/brief/spec формат ld hl,(__markline) ; строка "xxx.. bytes in xx files" jp draw_text ; позиц. вывод строки ; Настроить список панели и вывести up и middle-строки A208F: call A20E5 ; получить адрес описат. тек. формата (full/medium/brief/..) ld (__title),de ; адрес описателя титла панели A2097_: ld e,(hl) ; полож. верт. линии inc hl ld a,(hl) or a jr z,set_const ; конец, e="файлов на панель" inc hl push hl ld d,a ; de=адрес middle-строки ex de,hl call draw_text ; вывод строки pop hl jr A2097_ ; настроить константы списка панели set_const: ld l,e ; 25/50/75 число файлов на панель ld h,0 ld (_2159+1),hl ld (_0D7D+1),hl ld (_0CEE+1),hl ld (_0D08+1),hl ld (_0D1F+1),hl ld (_0D2C+1),hl dec hl ld (A0F09+1),hl ld (_0EC7+1),hl ld (_0D01+1),hl ld (_0D0D+1),hl ld (_0DA4+1),hl ld (_0E04+1),hl ; было в 1-й половине ret ; получить адрес описателя, согласно текущему ; формату (full/medium/brief + spec) A20E5: ld a,(format_mode) ; тек. формат панели ld e,a ld hl,deskr_right ; описат. форматов вывода правой панели ld a,(cur_panel) ; 0/#80 левая/правая панель rlca jr c,$+5 ; правая ld hl,deskr_left ; описат. форматов вывода левой панели call A15E5 ; получить описатель тек. формата (full/medium/brief) ld e,(hl) ; de=адрес титла панели inc hl ld d,(hl) inc hl ret ; Получить адрес описателя тек. формата ; in: e=тек.формат (full/medium/brief + spec) ; hl=адрес описателя форматов панели ; out: hl=адрес описателя A15E5: ld a,1 bit 1,e ; medium jr nz,A15E9__ inc a bit 2,e ; brief jr nz,A15E9__ inc a bit 3,e ; info jr nz,A15E9__ inc a bit 4,e ; qview jr nz,A15E9__ inc a ; индекс spec-описателя bit 6,e ; trd jr nz,A15E9__ xor a ; индекс full-описателя A15E9__: add a,a add a,l ld l,a jr nc,$+3 inc h ld a,(hl) inc hl ld h,(hl) ld l,a ; hl=адрес описателя ret ;----------------------------------------------------------- ; Вывод пути вверху панели и строки суммарной информации ;----------------------------------------------------------- A21AA: db 3Eh ; ld a,.. A21AB: db false ; флаг работы обмена панелей or a ld a,0 ld (A21AB),a ; сбр. флаг jr nz,A21B0 ; работает обмен панелей ld a,(format_mode) bit 3,a ; info jr z,A21AE call set_info_actpanel jr A21B0 ; A21AE: bit 4,a ; qview jr z,A21B0 call set_qview_actpanel ret c ; был вывод содерж. файла ; A21B0: call print_up_path ; вывод пути ret c ; info, qview форматы ; "╚══ размер_файлов_папки (число_файлов) ══ своб._объем_диска ══╝" show_summary_info: db 3Eh ; ld a,.. flag_summary_info: db false ; флаг вывода строки суммарной инфы or a ret z ; не выводить ld hl,put_comma ; уст. флаг вывода запятой inc (hl) ld ix,summary_string+1 ; " 0,000,000,000 (0000) ═ ... " ; общ. размер файлов списка exx ld hl,(files_size+2) ; ст.разряд exx ld hl,(files_size) ; мл.разряд ld b,0 ; без ведущих пробелов call dec32 ; объем выдел. файлов ld hl,put_comma ; флаг разделения разрядов dec (hl) ; сбр. флаг ld (ix+0)," " inc ix ld (ix+0),"(" inc ix and a ; число файлов в списке ld hl,(all_files) ; число файлов и папок в списке ld bc,(all_folders) ; число папок в списке sbc hl,bc call dec16 ; без ведущ. пробелов ld hl,put_comma ; уст. флаг вывода запятой inc (hl) ld (ix+0),")" inc ix ld (ix+0)," " inc ix ld (ix+0),"═" inc ix ld (ix+0)," " inc ix ; своб. место на диске (уже вычислено) exx ld hl,(free_space_disk+2) ; ст.разряд exx ld hl,(free_space_disk) ; мл.разряд ld b,0 ; без ведущих пробелов call dec32 ; объем выдел. файлов ld hl,put_comma ; флаг разделения разрядов dec (hl) ; сбр. флаг push ix pop hl xor a ld (hl)," " ; концевой пробел inc hl ld (hl),a ; конец описателя dec hl ; узнать длину строки ld de,summary_string-1 ; ячейка X-полож. sbc hl,de ld c,l ; центрировать строку srl l ; длина строки / 2 ld a,20 ; половина ширины панели sub l ld (de),a ; X полож. строки ld hl,deskr_summary ; описатель ld a,(hl) ; старая длина строки ld (hl),c ; новая длина строки inc c cp c ; новая < старой ? call nc,clear_both_line ; да, очистить строку ; вывод готовой строки jp draw_text ; позиц. вывод строки clear_both_line:push hl ld hl,botline ; описатель "╚═══════════════╝" call draw_text ; позиц. вывод строки pop hl ret ;----------------------------------------------------------- ; Вывод пути вверху акт. панели ; выход: CF - для info, qview форматов ;----------------------------------------------------------- print_up_path: ld a,(format_mode) ; формат акт. панели ld h,a and form_info+form_qview ; info, qview форматы jr nz,prn_up_path ; вывести титл ld a,h ; очистить строку пути ld hl,up_med bit 1,a ; medium jr nz,upath_ ld hl,up_brief bit 2,a ; brief jr nz,upath_ ld hl,up_spec bit 6,a ; spec jr nz,upath_ ld hl,up_full ; full upath_: call draw_text ; позиц. вывод строки ; вывод пути prn_up_path: ld hl,format_mode ; формат акт. панели ld a,(D48B1) ; флаг инверсии path-строки акт. панели or a ld a,(color_array+4) ; 30h цвет "Selected title" jr nz,$+5 ld a,(color_array+2) ; 1Bh цвет "Normal text" bit 3,(hl) ; info jr nz,upath2_ bit 4,(hl) ; qview jr nz,upath5_ ; вывод пути ld hl,(__path) ; адрес описателя пути акт. панели inc hl ld (hl),a ; цвет строки dec hl call draw_text ; позиц. вывод строки xor a ; сбр. CF ret ; Вывод заполненного info-описателя upath2_: ld (info_color1__),a ; цвет ld hl,up_info ; описатель "╔══════════╗" call draw_text ld hl,title_info ; info-описатель call draw_text ld a,(format_mode) and form_trd ret z ; вывод доп. описателя для спек-имиджа ld hl,title_info_trd upath4_: call draw_text scf ret ; Вывод qview-описателя upath5_: ld (qview_color1__),a ; цвет ; ld a,(type_title_qview) ; 0/1 флаг типа qview-описателя ; or a ; jr nz,upath7_ call draw_half_frame ; очистить панель ld hl,up_info ; описатель "╔══════════╗" call draw_text ; upath6_: ld hl,qview_folder_panel ; описатель для папок ld a,(type_title_qview) ; 0/1 флаг типа qview-описателя or a jr z,upath4_ ld hl,title_qview ; вывести выдел. титл для файла jr upath4_ ;upath7_: ld hl,title_qview ; вывести выдел. титл для файла ; jr upath4_ ; Вывести указатель show_pointer: call test_show_panels ; тест на режим вкл. панелей ret z ld a,(format_mode) ; формат тек. панели and form_info+form_qview ret nz ld hl,(all_files) ; число файлов и папок ld a,l or h ret z ld (pointer_flag),a ; уст. флаг вывода указателя call A2203 ; вывод строки списка xor a ld (pointer_flag),a ; сбр. флаг jp print_status1 ; статусная строка внизу панели ; Стереть указатель clear_pointer: call test_show_panels ; тест на режим вкл. панелей ret z ld a,(format_mode) ; формат акт. панели and form_info+form_qview ret nz ld hl,(all_files) ; число файлов и папок ld a,l or h ret z jp A2203 ; вывод строки списка ;===================================================================== ; Вывод 32-х битных чисел в буфер, в десятичном формате ;===================================================================== ; in: hl' = ст. разряд ; hl = мл. разряд ; ix = буфер ; c = 30h/20h - ведущ. символ ; b = 1/0 - вставлять/нет ведущий нуль/пробел ;--------------------------------------------------------------------- ; Флаг put_comma = true/false - вставлять/нет разделитель разрядов. ; ; Для формата с "M" - сбросить флаг put_comma и уст. режим "вставлять ; ведущие пробелы". Если флаг put_comma установлен, то более 7 знаков ; будет появляться только для значений от 1,000 M и выше. ;--------------------------------------------------------------------- dec32: ld de,0CA00h exx ld de,3B9Ah ; 1.000.000.000 exx ld a,(put_mega) or a jr z,dec1_ ld (ix+0)," " inc ix dec1_: ld iy,tmp1__ res 7,(iy+0) call GetLenN32 call nz,print_comma ld de,0E100h exx ld de,05F5h ; 100.000.000 exx call GetLenN32 ld de,9680h exx ld de,98h ; 10.000.000 exx call GetLenN32 call nz,mega_postfix ; "M" постфикс числа ; ld a,(put_mega) or a jr z,dec2_ dec ix dec ix dec ix dec ix dec2_: ld de,4240h exx ld de,0Fh ; 1.000.000 exx call GetLenN32 call nz,print_comma ld de,86A0h exx ld de,1 ; 100.000 exx call GetLenN32 dec5: ld de,10000 exx ld de,0 ; 10.000 exx call GetLenN32 dec4: ld de,1000 ; 1.000 call GetLenN16 call nz,print_comma dec3: ld de,100 ; 100 call GetLenN16 dec2: ld de,10 ; 10 call GetLenN16 ld a,l add a,"0" jr GetLenN163 tmp1__: db 0 GetLenN32: ld a,2Fh and a GetLenN321: inc a sbc hl,de exx sbc hl,de exx jp nc,GetLenN321 add hl,de exx adc hl,de exx jr GetLenN160 ; GetLenN16: ld a,2Fh and a GetLenN161: inc a sbc hl,de jp nc,GetLenN161 add hl,de GetLenN160: cp "0" jr z,GetLenN162 set 7,(iy+0) GetLenN162: bit 7,(iy+0) jr nz,GetLenN163 dec b inc b ret z ; без ведущих пробелов/нулей xor a ; уст. "Z" ld a,c ; 20h/30h GetLenN163: ld (ix+0),a ; сохр. в буфере inc ix ret ; "M" постфикс числа mega_postfix: db 3Eh ; ld a,.. put_mega: db 0 ; false/true or a ret z ld de,4240h exx ld de,0Fh ; 1.000.000 exx call GetLenN32 ; вывод мл. разряда ld (ix+0)," " inc ix ld (ix+0),"M" inc ix pop de ; сместить стек ret ; выйти из п/п dec32 print_comma: db 3Eh ; ld a,.. put_comma: db 0 ; false/true or a ret z ld (ix+0),"," inc ix ret ; Вывод чисел 0...65535 без ведущ. нуля ; in: hl=число ; ix=буфер dec16: push de xor a exx ld l,a ; ст. разряд ld h,a exx ld b,a ; не вставлять ведущ. символ ld iy,tmp1__ res 7,(iy+0) call dec5 pop de ret ; Вывод чисел 0...65535 с ведущим пробелом ; in: de=число ; ix=буфер dec16s: push hl xor a exx ld l,a ; ст. разряд ld h,a exx ex de,hl ld bc,0120h ; ведущие пробелы ld iy,tmp1__ res 7,(iy+0) call dec5 pop hl ret ; Вывод чисел 0..999 с ведущ. пробелом ; in: a=число ; ix=буфер dec9: push hl ld l,a ld h,0 ld bc,0120h ; вставлять ведущ. нуль ld iy,tmp1__ res 7,(iy+0) call dec3 pop hl ret ; Вывод чисел 0..99 с ведущ. нулем ; in: a=число ; ix=буфер dec8: push de ld l,a ld h,0 ld bc,0130h ; вставлять ведущ. нуль ld iy,tmp1__ res 7,(iy+0) call dec2 pop de ret ;----------------------------------------------------------- ; Получить адрес тек. записи списка акт. панели ; Не портить рег.BC!. ;----------------------------------------------------------- ; out: hl=начало записи ; de=ячейка атрибутов файла (+11) ; a=атрибут файла get_record: ld hl,(cur_pointer) ; тек. позиция указателя ld de,(offset_list) ; смещ. списка add hl,de get_record1: ld a,(cash_left_dir) ; банка списка акт. панели out (SLOT3),a ld de,(directory) ; начало списка адресов записей add hl,hl ; 1+1=2 add hl,de ; hl=начало записи ld a,(hl) ; разадресация inc hl ld h,(hl) ld l,a ld a,(format_mode) bit 6,a ; спек-формат панели ? jr nz,get_spec_attrib ; да ex de,hl ld hl,11 ; смещ. ячейки атрибутов add hl,de ex de,hl ld a,(de) ;+11 атрибут записи ret ; spec_attrib: db 0 ; get_spec_attrib:ld de,spec_attrib ; ячейка атрибутов ld a,(de) ret ; разделитель колонок separator: db 3Eh ; ld a,.. separ__: db "│" ld (ix+0),a inc ix ret ; вставка пробелов ; in: b=счетчик spaces: ld a," " ld (ix+0),a inc ix djnz $-5 ret ;--------------------------------------------------------------------- ; Выводит строку списка файлов ;--------------------------------------------------------------------- A2203: ld c,19 ; ширина medium-колонки ld a,(format_mode) ld e,a ; сохр. формат панели bit 1,a ; medium jr nz,A2217_ ld c,13 bit 2,a ; brief jr nz,A2217_ ; full,spec ld c,39 ; ширина колонки A2217_: ld a,c dec a ld (string_len),a ; длина строки ld b,1 ; смещ. левой стороны колонки ld a,(cur_pointer) ; тек. позиция указателя A221C_: sub files_per_colon ; 25 файлов на колонку jr c,A2229_ ld d,a ; сохр. "a" ld a,b add a,c ; + ширина колонки ld b,a ; X полож. ld a,d ; восст. "a" jr A221C_ ; A2229_: add a,files_per_colon+2 ; 27 файлов на колонку + 2 ld (string_line),a ; Y полож. курсора ld a,b ; колонка ; коррект. длины указателя в medium-формате bit 1,e ; medium ? jr z,A2230_ cp 20 ; правая половина левой панели ? jr z,A222E_ ; да cp 60 ; правая половина правой панели ? jr nz,A2230_ ; нет A222E_: ld hl,string_len inc (hl) ; ++длина указателя ; A2230_: ld (string_colon),a ; X полож. курсора ld b,e ; сохр. формат панели call get_record ; адрес тек. записи в папке ld (print_status2__),a ;+11 атрибут файла ld (print_status1__),hl ; начало записи bit 6,b ; spec-запись ? jr z,A2235_ ; нет ld e,l ld d,h dec de ; de=адр. 1-й буквы имени - 1 A2235_: push bc push de call fill_string ; заполнить строку по формату pop de pop bc call hilight_types ; вх: b=формат панели ; c=индекс цвета ;jp print_string ;----------------------------------------------------------- ; Вывод строки списка ;----------------------------------------------------------- ; вход: c = индекс цвета, pointer_flag = 00/01 - выводить текст/указатель ; ;print_string: db 21h ; ld hl,.. string_line: db 1 ; номер строки на экране (0..31) db 0 ld de,0301h ; с 0-й строки (для символов) add hl,hl ; 1+1=2 add hl,hl ; 2+2=4 add hl,de ld de,string_of_list ; адрес строки in a,(89h) ld (pnt3__+1),a ; сохр. порт in a,(SLOT0) ld (pnt4__+1),a ; сохр. порт ld a,(panel_left+1) ; начало панели ld b,a di ld a,50h ; видео-страница out (SLOT0),a db 3Eh ; ld a,.. string_colon: db 0 ; номер колонки add a,81h ; +0 (смещ. слева) add a,b ; + начало панели out (89h),a ld (pnt1__+1),a ; вывод текста ld d,d ; уст. размер блока db 3Eh ; ld a,.. string_len: db 1 ; длина строки ld b,b ; выкл. аксель ld l,l ; копировать блок ld a,(de) ld b,b ; выкл. аксель ld a,a ; копирование блока (верт. линии) ld (hl),a ld b,b ; выкл. аксель inc hl ; перейти на атрибут ; вывод атрибута ld iy,color_array ld a,(iy+0) ; цвет указателя ld d,(iy+1) ; цвет выдел. указателя ld b,0 add iy,bc ld b,a ; сохр. цвет норм. указателя ld e,(iy+0) ; ячейка цвета по индексу db 3Eh ; ld a,.. pointer_flag: db 0 ; 0/1 цвет по индексу/указатель or a jr z,pnt__ ; не указатель ld e,d ; цвет выдел. указателя ld a,c cp index_markfile ; 3 индекс ячейки "цвет выдел. файла" jr z,pnt__ ld e,b ; цвет норм. указателя ; pnt__: ld a,(string_len) ; длина строки ld b,a pnt1__: ld c,81h ; сохр. номер колонки pnt2__: ld a,c out (89h),a ld (hl),e ; атрибут inc c djnz pnt2__ pnt3__: ld a,0 out (89h),a ; восст. порт pnt4__: ld a,0 out (SLOT0),a ; восст. порт ei ret ; буфер строки списка панели string_of_list: db " " ; ╔═══════════════╤═══════╤════════╤═════╗ ;db Filenamm Ext 0005940│21.06.04│18:50 ;--------------------------------------------------------------------- ; Структура левой панели (27 байт) ;--------------------------------------------------------------------- panel_left: db 0 ; Y полож. панели db 0 ; X полож. панели cur_panel: db 0 ; 00h признак левой панели ;  идет перекачка disk: db 'A'-'A' ; номер тек. диска (0=A,1=B) format_mode: db form_full ; full/med/brief/spec/info/qview panel_size: db 40 ; ширина панели db 27 ; высота панели - 3 char_disk: dw disk_left ; буква диска __buff: dw buff_left ; буфер пути (абс.путь) __title: dw title_full ; описатель заголовка "Имя Объем Дата Время" __markline: dw markline_left ; описатель строки "xxx.. bytes in xx files" cash_left_dir: db -1 ; номер страницы каталога directory: dw left_pointers ; массив указателей на папки dw left_pointers ; массив указателей на файлы all_folders: dw 0 ; число папок в списке files_size: dw 0 ; мл. разряд общ. размера файлов dw 0 ; ст. разряд all_files: dw 321 ;21 число файлов + папок в тек. папке __path: dw path_left ; описатель path-строки панели __mask: dw mask_left_fname ; "*.*" маска имён файлов левой панели free_space_disk:dw 0 ; мл. разряд своб. места на диске dw 0 ; ст. разряд total_space_disk: dw 0 ; мл. разряд всего места на диске dw 0 ; ст. разряд ; low_size: dw 0 ; мл. разряд размера выдел. файлов high_size: dw 0 ; ст. разряд ; cur_pointer: dw 0 ; тек. позиция указателя в панели offset_list: dw 0 ; смещение списка ; mark_files: dw 0 ; число выдел. файлов sort_type: db "n" ; n/x/d/s/u тип сортировки списка db 0 ; 00/01 / сортировка ; info_: db 0 ; триггер info-панели form_under_info:db form_med ; сохр. формат под info-панели D48B1: db true ; флаг инверсии path-строки ; qview_: db 0 ; триггер qview-панели form_under_qview: db form_med ; сохр. формат под qview-панели len_struct equ $ - panel_left ; размер структуры ;--------------------------------------------------------------------- ; Структура правой панели ;--------------------------------------------------------------------- panel_right: db 0 ; Y полож. панели db 40 ; X полож. панели cur_panel1: db 80h ; 80h признак правой панели disk1: db 'D'-'A' ; номер тек. диска (0=A,1=B) format_mode1: db form_full ; full/med/brief/spec/info/qview db 40 ; ширина панели db 27 ; высота панели - 3 dw disk_right ; буква диска __buff1: dw buff_right ; буфер пути dw title_brief ; описатель заголовка "Имя Имя Имя" dw markline_right ; описатель строки "xxx.. bytes in xx files" cash_right_dir: db -1 ; номер страницы каталога directory1: dw right_pointers ; массив указателей на папки dw right_pointers ; массив указателей на файлы dw 0 ; число папок в списке files_size1: dw 0 ; мл. разряд общ. размера файлов папки dw 0 ; ст. разряд all_files1: dw 21 __path1: dw path_right ; описатель пути пассивной панели __mask1: dw mask_right_fname ; "*.*" маска имён файлов правой панели free_space_disk1: dw 0 ; мл. разряд своб. места на диске dw 0 ; ст. разряд total_space_disk1: dw 0 ; мл. разряд всего места на диске dw 0 ; ст. разряд ; dw 0 ; low_size мл. разряд выдел. файлов dw 0 ; high_size ст. разряд cur_pointer1: dw 0 offset_list1: dw 0 ; dw 0 ; число выдел. файлов sort_type1: db "x" ; n/x/d/s/u тип сортировки списка db 0 ; 00/01 / сортировка ; info1_: db 0 ; триггер info-панели form_under_info1: db form_med ; сохр. формат под info-панели D48B2: db false ; флаг инверсии path-строки qview1_: db 0 ; триггер qview-панели form_under_qview1: db form_med ; сохр. формат под qview-панели index_markfile equ 3 ; смещ. цвета отмеч. файлов ;----------------------------------------------------------- ; Массив цветов ФМ по-умолчанию (значения не изменяются) ; (ячейки местами не менять, исп. смещения к ячейкам!) ;----------------------------------------------------------- default_colors: ; < Panel > part1: db color_pointer ;+0 3Fh Normal cursor db color_markpoint ;+1 3Eh Selected cursor db color_panel ;+2 1Bh Normal text db color_markfile ;+3 1Eh Selected text db color_seltitle ;+4 30h Selected title db color_title ;+5 1Eh Column title db color_markline ;+6 3Eh Selected info db color_highlighted_info ;+7 1Eh Highlighted info (info/qview панели) db color_info_names ;+8 1Fh Info names (info/qview панели) db 0 ;+9 резерв db 0 ;+10 резерв db 0 ;+11 резерв col_lst1 equ $ - part1 ; < Horizontal Menu > part2: db color_hmenu ;+12 30h Normal text db color_hmenu_pointer ;+13 0Fh Highlighted text db color_hmenu_hotkey ;+14 0Eh Hot-key col_lst2 equ $ - part2 ; < Menu > part3: db color_vmenu ;+15 3Fh Normal text db color_vmenu_pointer ;+16 0Fh Highlighted text db color_vmenu_hotkey ;+17 0Eh Hot-key db 0 ;+18 резерв db 0 ;+19 резерв col_lst3 equ $ - part3 ; < Key Bar > (ячейки не разделять) part4: db kb_f ;+20 30h пункты key-бара db kb_b ;+21 0Eh hot-числа key-бара col_lst4 equ $ - part4 ; < Command Line > part5: db color_comline ;+22 07h командная строка db 0 ;+23 резерв col_lst5 equ $ - part5 ; < Dialog > part6: db color_dial_win ;+24 70h Normal text db color_dial_hotkey ;+25 0Eh Hot-keys db color_sel_dial_title ;+26 30h Selected title (объекта) db color_info_win ;+27 1Fh info-окна db color_warn_win ;+28 4Fh warning/errors окна db color_listbox ;+29 17h ListBox db color_list_point ;+30 2Fh указатель ListBox-а db color_list_hpoint ;+31 1Eh после указателя db color_vscrl_bar ;+32 13h скролл-бар ListBox-а db color_inputline ;+33 30h строка ввода db color_selbuttons ;+34 30h Selected buttons db color_selbuttons_err ;+35 70h Sel.buttons Warning/Errors db 0 ;+36 резерв db 0 ;+37 резерв db 0 ;+38 резерв col_lst6 equ $ - part6 ; < Viewer > part7: db color_viewer ;+39 1Bh Normal text db color_viewer_seltext ;+40 30h Selected text db color_viewer_status ;+41 30h Status line db color_viewer_scrl_arrow ;+42 1Eh Scrolling arrows col_lst7 equ $ - part7 ; < Editor > part8: db color_editor ;+43 1Bh Normal text db color_edit_seltext ;+44 30h Selected text db color_edit_status ;+45 30h Status line col_lst8 equ $ - part8 ; < Help > part9: db color_help ;+46 30h Normal text db color_help_seltext ;+47 3Eh Highlighted text db color_help_title ;+48 3Fh Title db color_help_scrl_bar ;+49 30h Scrollbar db 0 ;+50 резерв db 0 ;+51 резерв col_lst9 equ $ - part9 ; < Miscelions > part10: db color_process_line ;+52 30h линейка процесса db color_clock ;+53 30h часов в панелях db 0 ;+54 резерв db 0 ;+55 резерв db 0 ;+56 резерв db 0 ;+57 резерв db 0 ;+58 резерв db 0 ;+59 резерв col_lst10 equ $ - part10 ; < Files Highlighting > db color_folder ;+60 1Fh папки db color_exe ;+61 1Ah exe-шники db color_archive ;+62 1Dh архивы db color_ro ;+63 17h файлы "r/o","system" db color_hidden ;+64 13h скрытые файлы db color_spec ;+65 1Ch спек-файлы (trd,scl) len_color_array equ $ - default_colors ; размер массива ;------------------------------------------------- ; Рабочий массив цветов менеджера ;------------------------------------------------- color_array: ds len_color_array ;------------------------------------------------- ; Установить полный формат акт. панели ;------------------------------------------------- set_format_full:ld c,form_full ; full set_format: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ld hl,format_mode ; тек. формат акт. панели ld a,(hl) and form_trd ; выделить 6-й бит спек-формата or c cp (hl) ; новый = старому ? ret z ; да ld c,a ld a,(format_mode1) ; формат пасс. панели and form_info+form_qview ; info, qview jr nz,set_form1 ; да ld a,c ld (form_under_info),a ; уст. формат панели под "Ctrl+L" ld (form_under_qview),a ; уст. формат панели под "Ctrl+Q" xor a ld (info_),a ; сбр. триггер info-режима ld (qview_),a ; сбр. триггер qview-режима set_form1: ld (hl),c ; format_mode = новый формат ld hl,0 ld (cur_pointer),hl ; тек. полож. указателя ld (offset_list),hl ; смещ. списка call A20FC ; заново вывести список jp enter_done1 ; тест на info/qview форматы др. панели ;------------------------------------------------- ; Установить средний формат акт. панели ;------------------------------------------------- set_format_medium: ld c,form_med jr set_format ;------------------------------------------------- ; Установить краткий формат акт. панели ;------------------------------------------------- set_format_brief: ld c,form_brief jr set_format ;------------------------------------------------- ; Tab переход на другую панель ;------------------------------------------------- tab: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ld hl,D48B1 ; флаг инверсии ld (hl),false ; сбр. инверсию path-строки push hl call clear_pointer ; убрать указатель call prn_up_path ; вывод пути тек. панели без инверсии call change_panel ; сменить акт. панель pop hl ld (hl),true ; инверсия path-строки call prn_up_path ; вывод пути тек. панели с инверсией tab1: call print_compath ; вывод пути в ком-строке jp show_pointer ; вывести указатель ;===== ; ld a,(format_mode) ; формат акт. панели ; and form_qview ; ret z ; не qview-формат ; ld a,(type_title_qview) ; флаг 00/01 - папка/файл ; or a ; ret z ; ; перейти в гляделку ; ld a,(page_viewer) ; стр. вьюера ; out (SLOT1),a ; ; настроить полож. дампа ; ld hl,panel_left ; полож. акт. панели ; ld d,(hl) ; Y полож. панели ; inc hl ; ld e,(hl) ; X полож. панели ; inc d ; inc e ; ld (coord),de ; полож. курсора ; ld (winpos),de ; полож. окна ; ; войти в гляделку ; ld iy,AAF04 ; ld hl,AB317 ; ascii-окно ; ld a,(cur_mode_dump) ; 0/1 флаг тек. окна (ascii/hex) ; or a ; jr z,$+5 ; ld hl,ABB1C ; hex-окно ; ld bc,f8__ ; точка выхода ; push bc ; jp (hl) ;f8__: ld a,(page_module1) ; out (SLOT1),a ; восст. стр. фм ; ret ;------------------------------------------------- ; Ctrl+U обмен панелей ;------------------------------------------------- swap_panels: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ld (A21AB),a ; уст. флаг работы обмена панелей in a,(SLOT3) push af ld hl,enable_clock ; флаг вывода часов ld a,(hl) push af ld (hl),false ; выкл. вывод часов call hidden_clock ; затереть часы di ; сохр. левую панель (до ком. строки) в буфер ld ix,0C000h+1400h ; буфер за экраном менеджера ld de,0000h ; Y/X полож. окна ld hl,1E28h ; высота/ширина экрана ld a,(page_sys_screen) ; стр. буфера ld b,a xor a ; идентиф. глоб. окна ld c,0B2h ; экран в буфер rst 08h ; сохр. правую панель в буфер ld ix,0C000h+1400h+0960h ; буфер ld de,0028h ; Y/X полож. окна ld hl,1E28h ; высота/ширина экрана ld a,(page_sys_screen) ; стр. буфера ld b,a xor a ; идентиф. глоб. окна ld c,0B2h ; экран в буфер rst 08h ; скопир. на левую правую панель ld ix,0C000h+1400h+0960h ; буфер правой панели ld de,0000h ; Y/X полож. окна ld hl,1E28h ; высота/ширина экрана ld a,(page_sys_screen) ; стр. буфера ld b,a xor a ; идентиф. глоб. окна ld c,0B3h ; из буфера на экран rst 08h ; скопир. на правую левую панель ld ix,0C000h+1400h ; буфер левой панели ld de,0028h ; Y/X полож. окна ld hl,1E28h ; высота/ширина экрана ld a,(page_sys_screen) ; стр. буфера ld b,a xor a ; идентиф. глоб. окна ld c,0B3h ; из буфера на экран rst 08h pop af ld (enable_clock),a ; восст. флаг ei ; обменять X полож. панелей ld hl,panel_left+1 ld de,panel_right+1 ld c,(hl) ld a,(de) ld (hl),a ld a,c ld (de),a inc hl inc de ; обменять ячейки "cur_panel" ld c,(hl) ld a,(de) ld (hl),a ld a,c ld (de),a pop af out (SLOT3),a ret ; смена активной панели (обмен служ. ячеек панелей) change_panel: ld hl,panel_left ; обмен (hl) и (de) ld de,panel_right ld b,len_struct ; размер структуры панели ld c,(hl) ld a,(de) ld (hl),a ld a,c ld (de),a inc hl inc de djnz $-7 call A20E5 ; получить адрес описат. тек. формата (full/medium/brief) ld e,(hl) inc hl ld a,(hl) inc hl or a jr nz,$-5 jp set_const ; настроить константы ;-------------------------------------------------------------- ; Установить сист. диск и путь от акт. панели ; выход: CF - при ошибке (a=0FFh - нет диска, a=0 - нет пути) ;-------------------------------------------------------------- set_path_from_activ_panel: ; уст. диск от акт. панели ld a,(disk) ld c,1 rst 10h ld a,-1 ret c ; уст. путь от акт. панели ld hl,(__buff) ld c,1Dh rst 10h ret nc ld a,0 ret ;------------------------------------------------- ; Установить диск и путь для акт. панели ;------------------------------------------------- set_path_to_activ_panel: ; уст. диск для акт. панели ld c,2 rst 10h ret c ld (disk),a ; уст. путь для акт. панели ld hl,(__buff) ld c,1Eh rst 10h ret ;------------------------------------------------- ; Вывод буквы режима сортировки ;------------------------------------------------- show_sort_letter: db 3Eh ; ld a,.. sort_char_flag: db true ; флаг вывода буквы режима сортировки or a ret z ld hl,(sort_type) ld a,"" add a,h ld h,a ; / сортировка ld (sort_char__),hl ld hl,sort_char ; описатель буквы jr draw_text ; позиц. вывод строки ;------------------------------------------------- ; Позиц. вывод текста (в акт. панели) ;------------------------------------------------- ; вход: hl=описатель строки draw_text: ld a,(hl) or a ret z ; стоп-байт ld (tdraw1__),a ; длина строки ex af,af' inc hl ld a,(hl) ld (tdraw3__+1),a ; цвет inc hl ld e,(hl) ; строка inc hl ld d,(hl) ; колонка inc hl ex de,hl ; hl=colon/line, de=адрес строки call draw_txt_print ex de,hl jr draw_text ; ; h=номер колонки ; a'=длина строки ; de=адрес строки ; настроить ячейки tdraw1__, tdraw3__+1 draw_txt_print: ld bc,0301h ; с 0-й строки (для символов) ld a,(panel_left+1) ; начало акт. панели add a,h draw_txt_print1:; ld (tdraw__),a ; колонка ld h,0 add hl,hl ; 1+1=2 add hl,hl ; 2+2=4 add hl,bc in a,(89h) ld (tdraw4__+1),a ; сохр. порт in a,(SLOT0) ld (tdraw5__+1),a ; сохр. порт di ld a,50h ; видео-страница out (SLOT0),a db 3Eh ; ld a,.. tdraw__: db 0 ; колонка (0..79) add a,81h ; +0 (смещ. слева) out (89h),a ld c,a ; вывод текста ld d,d ; уст. размер блока db 3Eh ; ld a,.. tdraw1__: db 1 ; длина строки ld b,b ; выкл. аксель ld l,l ; копировать блок ld a,(de) ld b,b ; выкл. аксель ld a,a ; копирование блока (верт. линии) ld (hl),a ld b,b ; выкл. аксель inc hl ; перейти на атрибут ; вывод атрибута ex af,af' ld b,a ; длина строки ld a,c tdraw2__: out (89h),a tdraw3__: ld (hl),0 ; атрибут inc a inc de djnz tdraw2__ tdraw4__: ld a,0 out (89h),a ; восст. порт tdraw5__: ld a,0 out (SLOT0),a ; восст. порт ei ret ;----------------------------------------------------------- ; Вывод боковых сторон и пред-нижней линии рамки панели ; (с очисткой места) ;----------------------------------------------------------- draw_half_frame:ld hl,0301h+4 ; с 1-й строки ld a,(panel_size+1) ld b,a ; 27 число строк jr $+7 draw_half_frame1: ld hl,0301h+(4*2) ; со 2-й строки ld b,26 ; число строк in a,(89h) ld (fdraw3__+1),a ; сохр. порт in a,(SLOT0) ld (fdraw4__+1),a ; сохр. порт ld a,(color_array+2) ; 1Bh color_panel ld (fdraw1__+1),a ; атрибут ld a,(panel_left+1) ; колонка (начало панели) add a,81h ; +0 (смещ. слева) ld c,a ld a,(format_mode) ; формат панели ; вывод средней части ld de,midline2 ; линия "║ │ ║" medium bit 1,a ; medium jr nz,fdraw__ ld de,midline3 ; линия "║ │ │ ║" brief bit 2,a ; brief jr nz,fdraw__ ld de,midline4 ; линия "║ ║"" bit 3,a ; info jr nz,fdraw__ bit 4,a ; qview jr nz,fdraw__ ld de,midline1 ; линия "║ │ │ │ ║" full bit 6,a ; spec jr z,fdraw__ ld de,midline_spec ; линия "║ │ │ │ │ │ ║" full-spec fdraw__: di ld a,50h ; видео-страница out (SLOT0),a fdraw2__: call fdraw_axel djnz fdraw2__ ; вывод пред-нижней линии ld de,midline4 ; линия "║ ║"" call fdraw_axel fdraw3__: ld a,0 out (89h),a ; восст. порт fdraw4__: ld a,0 out (SLOT0),a ; восст. порт ei ret fdraw_axel: ld a,c out (89h),a ld d,d ; уст. размер блока ld a,40 ; длина строки ld b,b ; выкл. аксель ld l,l ; копировать блок ld a,(de) ld b,b ; выкл. аксель ld a,a ; копирование блока (верт. линии) ld (hl),a ld b,b ; выкл. аксель inc l ; перейти на атрибут ; вывод атрибута push bc ld b,40 ; длина строки ld a,c fdraw0__: out (89h),a fdraw1__: ld (hl),color_panel ; 1Bh атрибут inc a djnz fdraw0__ pop bc inc l inc l inc l ret