;///////////////////////////////////////////////////////////////////// ; Вывод данных акт. панели -> в пасс. панель (вызывается из файлера) ; <триггерная фитча> ;///////////////////////////////////////////////////////////////////// alt_qview_panel: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ; тест наличия qview-формата на акт. панели ld a,(format_mode) ; формат акт. панели and form_qview jr nz,set_norm_actpanel ; вывести норм. активную панель ld hl,qview1_ ; триггер пасс. панели ld a,(hl) or a jr nz,set_norm_noactpanel ; вывести норм. пассивную панель jr set_qview_noactpanel ; qview-панель в пасс. панели (акт. данные) ;-------------------------------------------------- ; Вывести нормальной акт. панель ;-------------------------------------------------- set_norm_actpanel: ld hl,qview_ ; триггер акт. панели ld (hl),0 ; сбр. триггер inc hl ld a,(hl) ; ячейка form_under_qview ld (format_mode),a ; формат акт. панели jp A20FC ; вывести панель ;-------------------------------------------------- ; Вывести нормальной пасс. панель ;-------------------------------------------------- set_norm_noactpanel: call change_panel call set_norm_actpanel jp change_panel ;---------------------------------------------------- ; Вывести qview-панель в акт. панели (пасс. данные) ; (вызывается из Меню) ;---------------------------------------------------- set_qview_actpanel: ; заполнить данными титл-описатель + уст. его тип call change_panel call get_qview_data ; пасс. данные ; push af call change_panel jr set_qview_actpanel1 ; pop af ; ret nc ; папка ; вывод содерж. файла ; call draw_half_frame ; очистить панель ;set_qview_file: ; ld hl,up_info ; описатель "╔══════════╗" ; call draw_text ; ld hl,title_qview ; описатель одного титла ; call draw_text ; db 3Eh;- ;set_qview_fl: ; db false ; флаг ; or a ; ld a,0 ; ld (set_qview_fl),a ; сбр. флаг ; jr nz,$+11;- ; call change_panel ; call alt_file_viewer ; вывести содерж. файла ; call change_panel ; scf ; ret ; настр. формат set_qview_actpanel1: call dinqview_res_flag ; "dinamqview" уже отработал ld de,format_mode ; формат акт. панели ld a,(de) bit 4,a ; qview ret nz ; не отраб. повторно bit 3,a ; info jr z,$+5 ld a,(form_under_info) ; формат под info-панелью ld hl,qview_ ; триггер акт. панели ld (hl),1 ; уст. триггер inc hl ld (hl),a ; form_under_qview and form_trd ; учесть 6-й бит спек-формата or form_qview ld (de),a ; уст. qview-формат xor a ld (info_),a ; сбр. info-триггер ret ;---------------------------------------------------- ; Вывести qview-панель в пасс. панели (акт. данные) ;---------------------------------------------------- set_qview_noactpanel: ; заполнить данными титл-описатель + уст. его тип call get_qview_data ; push af xor a ld (D48B1),a ; сбр. инверсию титла call change_panel call set_qview_actpanel1 ; настр. формат call draw_half_frame ; очистить панель ; pop af ; jr c,set_qview_noactp2 ; файл call prn_up_path ; вывести заполн. описатель папки ;set_qview_noactp1: call change_panel ld a,true ld (D48B1),a ; уст. инверсию титла ret ; настроить цвет qview-титла ;set_qview_noactp2: ; 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" ; ld (qview_color1__),a ; цвет ; call set_qview_file ; jr set_qview_noactp1 type_title_qview: db 0 ; флаг 00/01 - папка/файл ;----------------------------------------------------------- ; Заполнить титл-описатель данными диска акт. панели ; и установить тип выводимого титла-описателя. ;----------------------------------------------------------- get_qview_data: ; вставить имя тек. папки или путь + сканирование call print_qview_name ret c ; указатель на файле ; число папок exx ld hl,0 ; ст.разряд exx ld hl,(count_dirs) ; число папок ld iy,tmp2__ res 7,(iy+0) ld ix,qview_total_folders ; "00,000" call decimal16 ; число файлов exx ld hl,0 ; ст.разряд exx ld hl,(count_files) ; число файлов в папке ld iy,tmp2__ res 7,(iy+0) ld ix,qview_total_files ; "00,000" call decimal16 ; общ. размер файлов exx ld hl,(size_files+2) ; ст.разряд exx ld hl,(size_files) ; мл.разряд ld ix,qview_total_bytes ; "0,000,000,000" jp decimal32 qview_max_name equ 29 ; макс. длина строки пути для ".." ;------------------------------------------------------------------------ ; Вывод имени папки (или пути ".." папки) и вычисление ее параметров. ; Если указатель на ".." папке, то вычисляются ее параметры. ; Если указатель на имени файла, то выйти. ; ; выход: CF - указатель на файле ;------------------------------------------------------------------------ print_qview_name: ; очистить прежнее имя папки ld hl,qview_name_folder ; буфер имени ld b,qview_max_name ; 29 счетчик ld a," " ld (hl),a inc hl djnz $-2 ; call get_record ld a,(de) ;+11 атрибут файла and 10h ; папка ? ld a,true ; файл ld (type_title_qview),a ; флаг типа qview-описателя scf ret z xor a ; папка ld (type_title_qview),a ; флаг типа qview-описателя call qview_scan_folder ; вычислить размер папки ld a,(hl) ; начало имени папки cp "." jr z,qview_parent_name ; ".." папка ld ix,qview_name_folder ; буфер имени jp dir_name ; вставить имя папки ;----------------------------------------------------------- ; Вставить путь для ".." папки. Длинный путь обрезается ; ;вход: de=куда копировать ;----------------------------------------------------------- qview_parent_name: ld de,qview_name_folder ; куда ld hl,(__path) ; описателя пути акт. панели ld a,(hl) ; длина строки sub 2 ; минус пробелы начала-конца строки ld bc,5 ; смещ. до буквы диска add hl,bc ; hl=начало буквы диска строки ld bc,qview_max_name ; 29 макс. длина пути cp qview_max_name+1 jr c,qview_parent_loop ; обрезать длинную строку ldi ; скопировать "X:\" ldi ldi sub (qview_max_name-5)+3 ; длина остатка пути + длина "X:\" ld c,a add hl,bc ; на начало макс. длинной строки ld a,"." ; .. ld (de),a inc de ld (de),a inc de ld bc,qview_max_name-5 ; минус длину строки "X:\.." qview_parent_loop: ld a,(hl) ldi ret po ; весь путь скопирован or a jr nz,qview_parent_loop push de pop ix ; буфер ld b,c jp spaces ; дописать хвостовые пробелы ;--------------------------------------------------------------------- ; Вывод 32-х битных чисел в буфер, в десятичном формате с ; разделением разрядов запятой и ведущими пробелами ;--------------------------------------------------------------------- ; in: hl' = ст. разряд ; hl = мл. разряд ; ix = буфер ;--------------------------------------------------------------------- decimal32: ld de,0CA00h exx ld de,3B9Ah ; 1.000.000.000 exx ld iy,tmp2__ res 7,(iy+0) call GetN32 call print_comma1 ld de,0E100h exx ld de,05F5h ; 100.000.000 exx call GetN32 ld de,9680h exx ld de,98h ; 10.000.000 exx call GetN32 decimal24: ld de,4240h exx ld de,0Fh ; 1.000.000 exx call GetN32 call print_comma1 ld de,86A0h exx ld de,1 ; 100.000 exx call GetN32 decimal16: ld de,10000 exx ld de,0 ; 10.000 exx call GetN32 ld de,1000 ; 1.000 call GetN16 call print_comma1 ld de,100 ; 100 call GetN16 ld de,10 ; 10 call GetN16 ld a,l add a,"0" jr GetN163 tmp2__: db 0 GetN32: ld a,2Fh and a GetN321:inc a sbc hl,de exx sbc hl,de exx jp nc,GetN321 add hl,de exx adc hl,de exx jr GetN160 ; GetN16: ld a,2Fh and a GetN161:inc a sbc hl,de jp nc,GetN161 add hl,de GetN160:cp "0" jr z,GetN162 set 7,(iy+0) GetN162:bit 7,(iy+0) jr nz,GetN163 ld a," " ; ведущий пробел GetN163:ld (ix+0),a ; сохр. в буфере inc ix ret ; разделитель разрядов print_comma1: ld a,"," jr nz,prn_com__ ld a," " prn_com__: ld (ix+0),a inc ix ret ;----------------------------------------------------------- ; Динамический вывод акт. панели в пассивной ; выход: NZ - сменить сост. key-бара ;----------------------------------------------------------- dinam_qview_panel: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ld a,(format_mode1) ; формат пасс. панели and form_qview ret z ; режим выкл. ; задержка перед отработкой ld b,60 ; 0,6 сек. dinqview_loop: push bc call get_mouse_info ; чтение состояния мышки pop bc jr z,dinqview_next ; кнопки не нажаты ld a,h cp 28 ; Y коорд. мышки jr nc,dinqview_res_flag jr dinqview_set_flag dinqview_next: push bc ld a,3 ; опрос клавы rst 20h ex af,af' ld a,b pop bc and 11110000b ; нажаты Ctrl,Alt,Shift ? ret nz ; да ex af,af' jr nz,dinqview_exit ; есть символ halt djnz dinqview_loop db 3Eh ; ld a,.. dinqview_flag: db true ; флаг необх. отработки "dinam_qview_panel" or a ret z ; не отрабатывать call get_qview_data ; заполнить описатель ; jr c,dinqview_file ; указатель на файле call change_panel call draw_half_frame ; очистить панель call upath6_ ; вывести заполн. описатель call change_panel dinqview_res_flag: xor a ; false jr $+4 dinqview_set_flag: ld a,true ld (dinqview_flag),a dinqview_exit: xor a ; Z-флаг ret ; Вывести содержимое файла в пасс. панели ;dinqview_file: ; call change_panel ; call draw_half_frame ; очистить панель ; ld hl,title_qview ; описатель одного титла ; call draw_text ; call change_panel ; call alt_file_viewer ; вывести содерж. файла ; jr dinqview_res_flag ; сбр. флаг отработки "dinqview" ;------------------------------------------------- ; Подсчитать размер папки ; вход: hl=начало записи ;------------------------------------------------- qview_scan_folder: push hl push hl ld hl,win_scan_folder ; описатель "Scanning the folder..." call WinSimple ; открыть окно pop hl call scan_folder ; сканир. папку call CloseWinSimple ; закрыть окно ld a,1 ; очистить буфер клавы rst 20h pop hl ret ;------------------------------------------------- ; Сканирование папки акт. панели ; вход: hl=начало записи ;------------------------------------------------- scan_folder: xor a ; режим "простое сканир. папки" scan_folder_alt: ld (scan_mode),a ; режим работы процедуры ; скопир. путь панели во врем. буфер push hl ld hl,(__buff) ; откуда, адрес пути акт. панели ld de,work_buffer ; куда ld a,(disk) ; диск панели add a,"A" ld (de),a inc de ld a,":" ld (de),a inc de call copy_string ; (hl) -> (de) до нуля pop hl ld a,(hl) cp "." ; ".." ? jr z,scan_fold1 ; только путь родит. папки ; создать новый путь push hl ex de,hl dec hl dec hl ld a,'\' cp (hl) jr z,$+3 inc hl ld (hl),a inc hl ex de,hl ; de=куда pop hl ; откуда ld bc,0044h ; 11 -> 8.3 rst 10h scan_fold1: ld hl,work_buffer ld c,1Dh ; уст. путь rst 10h jp ScanTree ; сканир. папку