;/////////////////////////////////////////////////// ; ; DIR. Вывод списка файлов и папок ;/////////////////////////////////////////////////// cmd_dir: push de ;;;; [ ] поддержка параметров ; зануляем все параметры на старте xor a ld (Buffers.work.buffer2),a ld (read_disk_info.full),a ld (.key_p),a ; выполняем/настраиваем все найденные параметры в строке LD C,256-3 ;!HARDCODE длина строки с командой .parse: ld hl,cmd_dir_options call RUN_OPTION jr nc,.end_opt jp (hl) .end_opt: ; выводим строку о расчёте свободного места так, чтоб она затёрлась ld a,(read_disk_info.full) and a jr z,.skip LD DE,MAIN_MSG.CALCULATING CALL ECHO_MESSAGE ; 23/05/24 .skip: ;LD C,Dss.CurDisk ; узнать тек. диск ;RST ToDSS ;CALL read_disk_info ; прочитать метку и серийный номер диска ; pop de xor a ld h,a ld l,a ld (FILES),hl ld (dir_number),hl ld (S_LOW),hl ld (S_MED),hl ld (S_HIGH),a ; ex de,hl ld de,Buffers.work.buffer1 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ; ld a,(Buffers.work.buffer1) or a ;jr nz,.SkipMask ; задана маска имён jr z,.NoSkipMask ; не задана маска имён ld hl,Buffers.work.buffer1 ld bc,Dss.EX_Path.GET_ALL rst ToDSS ; and %00001100 ; имя диска и путь jr z,.SkipMask ; ld hl,Buffers.work.buffer2+2 ld c,Dss.CurDir rst ToDSS ld c,Dss.CurDisk rst ToDSS add a,"A" ld (Buffers.work.buffer2),a ld a,":" ld (Buffers.work.buffer2+1),a ; xor a ld hl,Buffers.work.buffer1 ld bc,256 cpir ;!FIXIT проверка на ошибку по флагу P/V dec hl ex de,hl ld hl,256-1 and a sbc hl,bc ld b,h ld c,l ld a,'\' ; ex de,hl cpdr ;!FIXIT проверка на ошибку по флагу P/V inc hl ld (hl),0 inc hl ld de,Buffers.bat_params.PRM1 call ncopy_string ; сохраняем маску файла ; ld hl,Buffers.work.buffer1 ld c,Dss.ChDir rst ToDSS jr nc,.no_error ; cp DSS_Error.sys.MEDIA_CHANGED jp nz,print_err_message call print_err_message ; ld hl,Buffers.work.buffer1 ld c,Dss.ChDir rst ToDSS jp c,print_err_message .no_error: ; ld hl,Buffers.bat_params.PRM1 ld de,Buffers.work.free call ncopy_string ; восстанавливаем маску файла ; ld a,(Buffers.bat_params.PRM1) or a jr nz,.SkipMask ; ; добавление маски .NoSkipMask: ld hl,mask_fname ; "*.*" ld de,Buffers.work.free call copy_string ; 23/05/24 .SkipMask: LD C,Dss.CurDisk ; узнать тек. диск RST ToDSS CALL read_disk_info ; прочитать метку и серийный номер диска JR NC,.NeXt ; CALL print_err_message SCF RET ; .NeXt: CALL Print_Header ; [ ] 01/10/23 ld hl,Buffers.work.free ; имя файла ld de,Buffers.work.buffer1 ; 80 буфер ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) ld bc,Dss.F_First.FATname ; f_first (формат 11) RST ToDSS JR C,.Dir_Empty ;R14 ; LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE PUSH AF ; цикл вывода списка файлов/папок .loop: POP AF .key_p+1: and #ff dec a jr nz,.skip_wait ld de,MAIN_MSG.DIRPAUSE call ECHO_MESSAGE ; вывести строку ld c,Dss.WaitKey rst ToDSS PUSH DE ld de,MAIN_MSG.CLSLINE call ECHO_MESSAGE POP DE dec d ld de,MAIN_MSG.DIR_ESCAPE jp z,ECHO_MESSAGE ; закончить по ESC ;jr nz,.skip_esc ;xor a ;ld (.key_p),a ; отменяем ESC .skip_esc: ld a,32-1 .skip_wait: PUSH AF ld hl,Buffers.work.buffer1+33 ; 80 ;push af ;ld de,33 ;add hl,de call PRNNAME ; ld ix,Buffers.work.buffer1 ; 80 ld a,(ix+32) ; атрибут тек. записи and FAT_ATTR.DIRECTORY ; папка ? jr z,.Calc_Size ; нет ; считаем папки ; не считаем папкой служебные "." и ".." ld d,(ix+33) ld e,(ix+34) ld hl,-('..') add hl,de ld a,h or l jr z,.next ld hl,-('. ') add hl,de ld a,h or l jr z,.next ; увеличиваем счётчик папок ld hl,(dir_number) inc hl ld (dir_number),hl jr .next ;;R14 .Dir_Empty: ;push af ;CALL Print_Header ;pop af CALL print_err_message jr .print ;;R14 ; прибавить размер тек. файла .Calc_Size: ld hl,(FILES) inc hl ld (FILES),hl ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3) ld hl,(S_MED) ld a,(S_HIGH) exx ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE) ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1) ld hl,(S_LOW) add hl,de ld (S_LOW),hl exx adc hl,de ld (S_MED),hl ;exx adc a,0 ld (S_HIGH),a ;exx .next: ld de,Buffers.work.buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS jp nc,.loop ; назад в цикл, если не конец списка pop af ; баланс стека ; Десятичный вывод .print: ld hl,(FILES) ld ix,Buffers.bat_params.PRM3; количество файлов call PDIGIT ; ld a,(S_HIGH) ld hl,(S_MED) ; ст. разряд exx ld hl,(S_LOW) ; мл. разряд ;exx ; ;CALL PRINT_DWORD CALL PRINT_5BYTES ; ; [x] вывод количества папок ; [x] вывод общего количества свободного места ld hl,SIZE_BUFFER.high ; "000 000 000 000" ld de,Buffers.bat_params.PRM1; + PRM2. размер файлов в каталоге ld bc,SIZE_BUFFER.bytes call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. ; ; Десятичный вывод ld hl,(dir_number) ld ix,Buffers.bat_params.PRM4; кол-во каталогов в каталоге call PDIGIT ; full capacity ld a,(full_space_high) ld hl,(full_space_medium) ; ст. разряд exx ld hl,(full_space_low) ; мл. разряд CALL PRN_DISK_SIZE ; ; ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" CALL ECHO_MESSAGE ; вывести строку ; ; [ ] 23/05/2024 ld hl,Buffers.work.buffer2 ld c,Dss.ChDir ld a,(hl) or a call nz,ToDSS ; ld a,(read_disk_info.full) and a ;ld de,MAIN_MSG.CRLF ;jp z,ECHO_MESSAGE RET Z ; ; free space ld a,(free_space_high) ld hl,(free_space_medium) ; ст. разряд exx ld hl,(free_space_low) ; мл. разряд ; CALL PRN_DISK_SIZE ; ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" jp ECHO_MESSAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRN_DISK_SIZE: call PRINT_5BYTES ld hl,SIZE_BUFFER.high ; "000 000 000 000" ld de,Buffers.bat_params.PRM5; and PRM6. куда ld bc,SIZE_BUFFER.bytes jp ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. ; Print_Header: ; %1 ld hl,Buffers.bat_params.PRM1 ld a,'"' ld (hl),a inc hl push hl ; ld c,Dss.CurDisk rst ToDSS add a,"A" ; pop hl ld (hl),a inc hl ld a,'"' ld (hl),a inc hl ;ld (hl),":" ld (hl),0 ; %2 ld hl,serial_string ; строка серийного номера диска ld de,Buffers.bat_params.PRM2; куда call ncopy_string ; скопир. строку (с нулем) ; %3..5 ;push hl ld hl,Buffers.work.free + 256 + 128 ; 128 - на всякий случай ld c,Dss.CurDir rst ToDSS ld hl,Buffers.bat_params.PRM3 ld a,(Buffers.bat_params.PRM1 + 1) ld (hl),a inc hl ld (hl),':' ; ld hl,Buffers.bat_params.PRM3 +2 ld de,Buffers.bat_params.PRM3 +2 + 1 ld (hl),0 ld bc,16+16+16-1-2 ldir ; ld hl,Buffers.work.free + 256 + 128; сист. путь ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 байтов буфер call make_short_path ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." JP ECHO_MESSAGE ; вывести строку ; ; Подготовить строку списка файлов/папок PRNNAME: dec hl ld a,(hl) and FAT_ATTR.DIRECTORY call z,.set_small inc hl ; ld bc,8 ld de,Buffers.bat_params.PRM1 ldir xor a ld (de),a ld de,Buffers.bat_params.PRM2; куда ldi ldi ldi ld (de),a ld ix,Buffers.work.buffer1 call PRNSIZE ; вывести в буфер имя файла и его размер (у папки