;=========================================================== ; Выполнение команды на тек. записи ;=========================================================== Press_Enter: ld hl,(all_files) ld a,l or h ret z ; пустая панель call get_record ; hl=начало записи, a=атрибут файла ; скопир. имя файла/папки в буфер push af ld de,work_buffer ; куда ld bc,0044h ; 11 -> 8.3 rst 10h pop af and 10h jp z,Launch_File ; выполнить файл (launch.asm) ;----------------------------------------- ; Навигация по папкам ;----------------------------------------- ld a,true ld (enter_to_folder),a ; уст. флаг "навигация по папкам" ld de,work_buffer ; имя папки "file.ext" формата ld hl,(__buff) ; адрес абс. пути акт. панели ld bc,127;255 ; макс. длина имени ld a,(de) cp "." ; ".." ? jr z,return_to_parent ; назад в родит. папку ; создать новый путь xor a cpir ; на конец пути панели dec hl dec hl ld a,'\' cp (hl) jr z,$+3 inc hl ld (hl),a inc hl ex de,hl call copy_string ; (hl) -> (de) до нуля ; войти в папку call fresh_list_panel ; обновить список панели (space.asm) enter_done: xor a ld l,a ld h,a ld (enter_to_folder),a ; флаг "навигация по папкам" ld (fresh_list_point),hl ; сбр. полож. указателя (space.asm) ld (fresh_list_offset),hl ; сбр. смещ. списка (space.asm) enter_done1: ; <- вызов из "seldrv.asm" call tab1 ; обн. путь ком-строки + вывести указатель ; тест вкл. qview-режима на др. панели ld a,(format_mode1) ; формат пасс. панели bit 3,a ; info jr nz,enter_done3 ret ;bit 4,a ; qview ;ret z ;ld a,true ;ld (dinqview_flag),a ;jp dinam_qview_panel ; обновить qview-панель ; enter_done3: ld a,0 ; флага обновления info-панели or a ret z ; не отраб. при навигации по папкам xor a ld (enter_done3+1),a ; сбр. флаг jp set_info_noactpanel ; обновить info-панель ;------------------------------------------------- ; Назад в родит. папку ;------------------------------------------------- return_to_parent: ; создать новый путь call cut_path_to_prev_dir ; ограничить путь родит. папкой ; войти в родит. папку push af push hl call read_new_folder ; новый список каталога + размер папки call sorting ; раздельный список указателей + сорт. списка pop hl pop af ; скопир. имя родит. папки ld de,work_buffer+127;255 ; куда cp '\' ; корень пути ? jr z,$+4 ld (de),a ; восст. имя дочерней папки inc de inc hl call copy_string ; 8.3 -> 11 формат имени ld hl,work_buffer+127;255 ; откуда ld de,temp_fname ; куда (launch.asm) ld bc,0144h rst 10h ; позиц. указатель на имя папки call calc_index_name ; вычислить индекс имени call set_pointer ; расч. полож. указателя/списка ld (fresh_list_offset),hl ; смещ. списка (space.asm) ld (fresh_list_point),bc ; полож. указателя (space.asm) call fresh_list_pan ; обновить список панели (space.asm) jr enter_done ; обновить путь ком-строки ; Вычислить полож. имени папки в списке панели ; вход: bc=индекс полож. имени папки ; выход: bc=полож. указателя ; hl=смещ. списка set_pointer: ld hl,(all_files) ld de,(_0D01+1) ; размер страницы - 1 call cmphlde jr nc,setpnt2 ; число файлов меньше списка панели setpnt1:ld hl,0 ret ; ; Если индекс имени не умещается на первой странице, ; то имя установить в конец страницы и настроить ; соотв. образом смещ. списка. setpnt2:ld a,c sub e ld a,b sbc a,d jr c,setpnt1 ; указ. в пределах первой страницы списка ; bc=индекс имени ; de=размер страницы-1 ld l,c ld h,b ld bc,-1 ; счетчик смещ. списка dec hl inc bc call cmphlde ; hl и "размер страницы - 1" jr nc,$-5 ld hl,(offset_list) ; смещ. списка ld a,l sub c ; offset_list - счетчик ld a,h sbc a,b jr nc,$+4 ld l,c ; hl=смещ. списка ld h,b ; указатель в пределах послед. страницы списка ld c,e ; bc=полож. указателя ld b,d ret ; Вычислить индекс полож. имени папки в списке ; вход: temp_fname - имя папки ; выход: bc=индекс имени calc_index_name: ld bc,0 ; индекс положения exx ld hl,(all_folders) ; число папок ld a,(sort_type) ; режим сортировки cp "u" ; unsorted jr nz,$+5 ld hl,(all_files) ; число папок+файлов ld a,l or h exx ret z ld hl,(directory) ; массив указателей на папки calc_index__: ld e,(hl) inc hl ld d,(hl) inc hl push hl ex de,hl ; имя списка ld de,temp_fname ; имя пути (launch.asm) call compare_fnames ; сравнить имена pop hl ret z inc bc ; ++индекс положения exx dec hl ld a,l or h exx jp nz,calc_index__ ret ; Сравнить строки ; вход: hl=string1 ; de=string2 ; выход: "z" - совпадают ; "nz" - не совпадают compare_fnames: ld a,11 ; длина сравнения ex af,af' ld a,(de) cp (hl) ret nz inc hl inc de ex af,af' dec a jr nz,$-8 ret ; Ограничить путь предыдущей папкой ; вход: hl=строка пути ; выход: hl=начало имени затертой папки ; a=затертый символ имени папки cut_path_to_prev_dir: ld e,l ld d,h xor a cpir ; на конец строки dec hl ld bc,127;255 ld a,'\' cpdr inc hl ex de,hl sbc hl,de ; корень пути ? ex de,hl jr nz,$+3 ; нет inc hl ld a,(hl) ; сохр. затир. символ ld (hl),0 ; откинуть послед. папку ret