;------------------------------------------------- ; Заполнение строки списка по формату панели ;------------------------------------------------- ; вход: b=формат панели ; hl=начало записи каталога ; de=ячейка атрибутов файла fill_string: ld ix,string_of_list ; буфер строки bit 1,b ; Medium jp nz,fill_med bit 2,b ; Brief jp nz,fill_brief ; Full bit 6,b jp nz,fill_full_spec ; full-spec ; ms-dos ld a,(de) ; байт атрибутов bit 4,a ; папка ? jp nz,dir_name_full ; да, вывод имени ; формат "file ext" ld b,8 call L22BD ; имя файла ld b,4 ; число пробелов call spaces ; вставить пробелы ld b,3 call L22BD ; расш. файла fill_string1__: call separator ; "│" (или " ") разделитель колонок ; 2 колонка (размер файла) push hl ld de,17 ; смещ. на размер файла add hl,de call L0020 ; de = размер файла ld c,(hl) inc hl ld b,(hl) push bc exx pop hl exx ex de,hl ld a,1 ld (put_mega),a ; уст. флаг ld bc,0120h ; ведущие пробелы call dec32 ; вывод размера файла (в панели) ld hl,put_mega ld (hl),0 ; сбр. флаг pop hl A2290: call separator ; "│" (или " ") разделитель колонок ; 3 колонка (дата) ld de,13 add hl,de ;+24 перейти на дату ex de,hl ld a,(de) and 1Fh call dec8 ; вывод дня ld (ix+0),"." ; разделитель "день.месяц" inc ix ld a,(de) and 0E0h ld b,a inc de ld a,(de) and 1 or b rlca rlca rlca call dec8 ; вывод месяца ld (ix+0),"." ; разделитель "месяц.год" inc ix ld a,(de) and 0FEh rrca add a,80 cp 100 jr c,$+4 sub 100 call dec8 ; вывод года call separator ; "│" (или " ") разделитель колонок ; 4 колонка (время) dec de dec de ld a,(de) ;+22 ячейка времени and 0F8h rrca rrca rrca call dec8 ; вывод часов ld (ix+0),":" ; разделитель "часы:минуты" inc ix ld a,(de) ;+22 and 7 ld b,a dec de ld a,(de) ;+21 and 0E0h or b rlca rlca rlca jp dec8 ; вывод минут ; ; вывод имени папки ; in: hl=адрес имени dir_name_full: ld a,(hl) push af call dir_name ; вставить имя папки ld b,3 ; число пробелов call spaces ; вставить пробелы call separator ; "│" (или " ") разделитель колонок pop af ; 2 колонка ld de,folder_string ; "Folder " cp "." ; родит. папка ? jr nz,A2304_ ld de,up_string ; " Up " A2304_: ex de,hl ld b,7 ; длина строки A2307_: ld a,(hl) ld (ix+0),a ; символ в строку inc hl inc ix djnz A2307_ ex de,hl jp A2290 ; вывод даты и времени ;------------------------------------------------- ; вывод имени папки ;------------------------------------------------- ; in: hl=начало записи каталога ; ix=буфер dir_name: ; формат "dir.ext" (всегда выводит 12 символов) call directory1__ dec e inc e ret z ld b,e jp spaces ; добавить концевые пробелы ; directory1__: ld e,1 ; счетчик дополн. пробелов ld b,8 ; имя папки call directory3__ ld a,(hl) cp " " jr z,directory2__ dec e ld (ix+0),"." ; символ в строку inc ix directory2__: ld b,3 ; расш. папки directory3__: ld a,(hl) cp " " jr z,directory4__ ; вывод символа ld (ix+0),a ; символ в строку inc ix inc hl djnz directory3__ ret directory4__: inc hl inc e djnz directory4__ ret ;------------------------------------------------- ; Medium ;------------------------------------------------- fill_med: bit 6,b jp nz,fill_med_spec ; med-spec ; ms-dos ld a,(de) ;+11 смещ. до байта атрибутов bit 4,a ; папка ? jp nz,dir_name_med ; да, вывод имени ; формат "file.ext" (всегда выводит 15 символов) ld d,0 ; маленькие буквы fill_med1: call fill_med1__ fill_med__: ld a,(string_len) sub 15 ; 15=длина строки имени ld b,a jp spaces ; fill_med1__: call fill_med2__ fill_med11__: ld b,e jp spaces ; добавить концевые пробелы ; fill_med2__: ld b,8 ; имя файла ld e,1+3 ; счетчик дополн. пробелов call fill_med4__ ld a,(hl) cp " " jr z,fill_med3__ dec e ld (ix+0),"." ; символ в строку inc ix fill_med3__: ld b,3 ; расш. fill_med4__: ld a,(hl) cp " "+1 jr c,fill_med7__ ; вывод символа bit 0,d jr nz,fill_med6__ ; не менять регистр букв cp "_" jr z,fill_med6__ set 5,a cp "Ё" ; 240 jr nz,fill_med6__ inc a ; 241 = "ё" fill_med6__: ld (ix+0),a ; символ в строку inc ix inc hl djnz fill_med4__ ret fill_med7__: inc hl inc e djnz fill_med7__ ret ; dir_name_med: call dir_name ; вставить имя папки ld a,(string_len) sub 12 ; длина имени папки ld b,a ; число пробелов jp spaces ; вставить пробелы ; вставить спек-имя "file.ext" формата ;-------------------------------------- fill_med_spec: call fill_med_spec_name jr fill_med__ ; fill_med_spec_name: ld b,8-1 ; имя файла ld e,1+3 ; счетчик дополн. пробелов call fill_med_spec2 ld a,(hl) cp " " jr z,fill_med_spec1 dec e ld (ix+0),"." ; символ в строку inc ix fill_med_spec1: call fill_spec_ext1 ; скопир. расш. jr fill_med11__ ; добавить конц. пробелы ; fill_med_spec2: ld a,(hl) and 7Fh ; сбр.7-й бит (марк.файла) ld (ix+0),a inc ix inc hl fill_med_spec3: ld a,(hl) cp " " jr nz,fill_med_spec4 inc hl ld a,(hl) dec hl cp " " jr z,fill_med_spec5 ld a,b dec a jr z,fill_med_spec5 ld a,"_" ;" " ; символ внутри имени fill_med_spec4: ld (ix+0),a inc ix inc hl djnz fill_med_spec3 ret ; fill_med_spec5: inc hl inc e djnz fill_med_spec5 ret ;------------------------------------------------- ; Brief ;------------------------------------------------- fill_brief: bit 6,b jr nz,fill_brief_spec ; brief-spec ; ms-dos ld a,(de) ;+11 смещ. до байта атрибутов bit 4,a ; папка ? jp nz,dir_name ; да, вывод имени ; формат "filename ext" ld b,8 call L22BD ; имя файла ld (ix+0)," " inc ix ld b,3 jp L22BD ; расш. файла ; ; формат "filename ext" fill_brief_spec: ld b,1 ; число пробелов между "Filename" и "Ext" jp fill_spec_name ;------------------------------------------------- ; Full-Spec ;------------------------------------------------- ;║ Name │ Size│Start│SSz│Trk│Sec║ ;║Filename Ext│00000│00000│000│000│000║ ; fill_full_spec: ld b,3 ; число пробелов между "Filename" и "Ext" call fill_spec_name ; вывод "Filename Ext" fill_full_spec1: inc hl ; на старт. адрес файла (2-я буква расш.) push hl ; колонка "Size" inc hl inc hl call L0020 ; в de размер файла в байтах call dec16s ; 16-bit число с вед. пробелами call separator ; "│" pop hl ; колонка "Start" call L0020 ; в de старт. адрес call dec16s call separator inc hl inc hl ; колонка "SSz" ld a,(hl) ; размер файла в секторах inc hl call dec9 ; 0..999 число с вед. пробелами call separator db 3Eh ; ld a,.. trd_records: db true ; флаг trd-списка файлов or a jr z,fill_spec_scl ; колонка "Trk" (номер дорожки файла) inc hl ld a,(hl) call dec9 call separator dec hl ; колонка "Sec" (номер первого сектора файла) ld a,(hl) jp dec9 ; ; SCL-список файлов fill_spec_scl: ld b,3 call spaces ; очистить колонку "Trk" call separator ld b,3 jp spaces ; очистить колонку "Sec" ; Имя спек-файла формата "Filename Ext" ; вход: b=число пробелов между "Filename" и "Ext" fill_spec_name: push bc ld a,(hl) and 7Fh ; сбр.7-й бит (марк.файла) ld (ix+0),a inc ix inc hl ld b,7 call A0E90 ; скопир. имя файла pop bc call spaces push hl call fill_spec_ext1 ; скопир. расш. call separator ; "│" pop hl ret ; ; Копирование спек-расширения файла fill_spec_ext1: ; запрещены в ms-dos ; " + , . / : ; < = > [ \ ] | ; 22 2B 2C 2E 2F 3A 3B 3C 3D 3E 5B 5C 5D 7C ; ld bc,0320h ; расш./пробел ld a,(hl) cp "B" ; (B)asic-файл jr nz,fill_spec_ext__+1 ld (ix+0),a ; символ в строку inc ix inc hl dec b jr fill_spec_ext2__ fill_spec_ext__: ld a,(hl) cp " "+1 jr c,fill_spec_ext2__ ; нет расш. cp "z"+1 jr nc,fill_spec_ext2__ cp '"' jr z,fill_spec_ext2__ cp "-" jr z,fill_spec_ext1__ cp "," ; 2Ch jr c,fill_spec_ext1__ cp "/"+1 ; 2Fh+1 jr c,fill_spec_ext2__ cp ":" ; 3Ah jr c,fill_spec_ext1__ cp ">" ; 3Eh jr c,fill_spec_ext2__ cp "[" jr c,fill_spec_ext1__ cp "_"+1 jr c,fill_spec_ext2__ cp "`" jr z,fill_spec_ext2__ fill_spec_ext1__: ld (ix+0),a ; символ в строку inc ix inc hl djnz fill_spec_ext__ ret ; fill_spec_ext2__: ld (ix+0),c ; символ в строку inc ix inc hl djnz fill_spec_ext2__ ret ;------------------------------------------------- ; Вставка строки в буфер (маленькими буквами) ;------------------------------------------------- ; in: hl=строка ; ix=буфер ; b=длина вход. строки ; L22BD: ld a,(hl) inc hl cp "_" jr z,A22D0_ set 5,a cp "Ё" ; 240 jr nz,A22D0_ inc a ; 241 = "ё" A22D0_: ld (ix+0),a ; символ в строку inc ix djnz L22BD ret ;----------------------------------------------------------- ; Вывод информ. строки внизу панели ;----------------------------------------------------------- print_status: call test_show_panels ; тест на режим вкл. панелей ret z ; выкл. ld a,(format_mode) and form_info+form_qview ret nz call get_record ; адрес тек. записи в папке ld b,a ;+11 атрибут файла jr print_status6__ ; print_status1: db 21h ; ld hl,.. print_status1__: dw 0 ; сохр. начало записи (из каталога) db 6 ; ld b,.. print_status2__: db 0 ; атрибут файла print_status6__: ; очистить стат. строку di ld (print_stat_stack),sp ; сохр. стек ld de,2020h ; пробелы ld sp,status_string+42 ; конец строки - 1 ld a,19 ; 38/2 print_stat_loop: push de dec a jr nz,print_stat_loop db 31h ; ld sp,.. print_stat_stack: dw 0 ei ld ix,status_string+4 ; буфер строки ld a," " ld (separ__),a ld a,(format_mode) ; формат акт. панели bit 6,a ; spec jr nz,print_status_spec bit 4,b ; папка ? jr z,print_status4__ ; нет bit 0,a ; full jr z,print_status3__ ; нет call dir_name ; вставить только имя папки jr print_status5__ ; print_status3__: call dir_name_full ; вставить имя+дата+время папки jr print_status5__ ; ; имя файла print_status4__: ld d,1 ; не менять регистр букв call fill_med1__ ; формат "file.ext" (выводит 15 симв.) ld a,(format_mode) ; формат акт. панели bit 0,a ; full call z,fill_string1__ ; вставить размер+дата+время print_status5__: ld a,"│" ld (separ__),a ; восст. разделитель ld (ix+0),0 ; конец описателя ; вывод готовой строки ld hl,status_string ; описатель строки jp draw_text ; позиц. вывод строки ; ; ; заполнение спек-строки print_status_spec: ; формат "file.ext" push hl call fill_med_spec_name ; вставить спек. имя pop hl ld bc,8 ; смещ. на 1-ю букву расш. add hl,bc ; для п/п fill_full_spec1 ld a,(format_mode) ; формат акт. панели bit 0,a ; full call z,fill_full_spec1 ; вставить "Size-Start-SSz-Trk-Sec" jr print_status5__ ; вывод готовой строки