diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 22b9e4c..09f0ddc 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -408,7 +408,7 @@ EVALCMD: xor a call EVALSTR ld hl,work_buffer2 ;work_buffer+256 ld de,struct_input_line+5 ; куда - ld bc,255 + ld bc,255 ;!HARDCODE .loop: ld a,(hl) ldi inc b diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 9c5dab7..736914e 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -7,6 +7,7 @@ cmd_dir: push de ;;;; [ ] поддержка параметров ; зануляем все параметры на старте xor a + ld (work_buffer2),a ld (read_disk_info.full),a ld (.key_p),a ; выполняем/настраиваем все найденные параметры в строке @@ -21,10 +22,10 @@ cmd_dir: push de jr z,.skip LD DE,MAIN_MSG.CALCULATING CALL MESSAGE - ; -.skip: ld c,Dss.CurDisk ; узнать тек. диск - RST ToDSS - call read_disk_info ; прочитать метку и серийный номер диска + ;!TEST 23/05/24 +.skip: ;LD C,Dss.CurDisk ; узнать тек. диск + ;RST ToDSS + ;CALL read_disk_info ; прочитать метку и серийный номер диска ; pop de xor a @@ -37,7 +38,7 @@ cmd_dir: push de ld (S_HIGH),a ; ex de,hl - ld de,work_buffer1 ; 80 + ld de,work_buffer1 ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS ;!TODO тут в work_buffer1 лежит путь и/или/либо маска файла @@ -47,19 +48,82 @@ cmd_dir: push de ; ld a,(work_buffer1) or a - jr nz,.skipMask ; задана маска имён + ;jr nz,.SkipMask ; задана маска имён + jr z,.NoSkipMask ; не задана маска имён + ; сохранить текущий путь в work_buffer2 + ; Из буфера DE запомнить маску (первые справа символы после первого справа '\') и убрать её + ; если маски нет и последний в строке '\', то потом добавить маску как в "; добавление маски" + ; сделать CD в директорию из буфера DE + ; make_short_path + ; + ld hl,work_buffer1 + ld bc,Dss.EX_Path.GET_ALL + rst ToDSS ; - ld hl,mask_fname ; "*.*" + and %00001100 ; имя диска и путь + jr z,.SkipMask + ; + ld hl,work_buffer2+2 + ld c,Dss.CurDir + rst ToDSS + ld c,Dss.CurDisk + rst ToDSS + add a,"A" + ld (work_buffer2),a + ld a,":" + ld (work_buffer2+1),a + ; + xor a + ld hl,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,PRM1 + call ncopy_string ; сохраняем маску файла + ; + ld hl,work_buffer1 + ld c,Dss.ChDir + rst ToDSS + ; + ld hl,PRM1 + ld de,work_buffer1 + call ncopy_string ; восстанавливаем маску файла + ; + ld a,(PRM1) + or a + jr nz,.SkipMask + ; + ; добавление маски +.NoSkipMask: ld hl,mask_fname ; "*.*" ld de,work_buffer1 call copy_string - ; [ ] 1/10/23 -.skipMask: ld hl,work_buffer1 ; имя файла - ld de,work_buffer1 ; 80 буфер - ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома) - ld bc,Dss.F_First.FATname ; f_first (формат 11) - RST ToDSS - JR C,.Dir_Empty ;R14 - CALL Print_Header + ; !TEST 23/05/24 +.SkipMask: LD C,Dss.CurDisk ; узнать тек. диск + RST ToDSS + CALL read_disk_info ; прочитать метку и серийный номер диска + ; + CALL Print_Header + ; [ ] 01/10/23 + ld hl,work_buffer1 ; имя файла + ld de,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 @@ -110,9 +174,9 @@ cmd_dir: push de ld (dir_number),hl jr .next ;;R14 -.Dir_Empty: push af - CALL Print_Header - pop af +.Dir_Empty: ;push af + ;CALL Print_Header + ;pop af CALL print_err_message jr .print ;;R14 @@ -156,24 +220,17 @@ cmd_dir: push de ;CALL PRINT_DWORD CALL PRINT_5BYTES ; - ; [ ] вывод количества папок + ; [x] вывод количества папок ; [x] вывод общего количества свободного места ld hl,SIZE_BUFFER.high ; "000 000 000 000" ld de,PRM1; + PRM2 ; размер файлов в каталоге ld bc,SIZE_BUFFER.bytes call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв. ; - ;!TEST - ;ld hl,(dir_number) - ;ld de,PRM3 - ;call hex2dec_ascii_16bit.n10000 - ; Десятичный вывод - ld hl,(dir_number) - ld ix,PRM4 ; кол-во каталогов в каталоге - call PDIGIT - ;xor a - ;ld (de),a - ; + ; Десятичный вывод + ld hl,(dir_number) + ld ix,PRM4 ; кол-во каталогов в каталоге + call PDIGIT ; full capacity ld a,(full_space_high) ld hl,(full_space_medium) ; ст. разряд @@ -184,6 +241,13 @@ cmd_dir: push de ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" CALL MESSAGE ; вывести строку ; + ; [ ] 23/05/2024 + ld hl,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 @@ -200,7 +264,9 @@ cmd_dir: push de ; ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" jp MESSAGE - ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + PRN_DISK_SIZE: call PRINT_5BYTES ld hl,SIZE_BUFFER.high ; "000 000 000 000" ld de,PRM5 ; and PRM6 ; куда @@ -212,7 +278,7 @@ Print_Header: ; %1 ld a,'"' ld (hl),a inc hl - ld a,(screen_path) ; диск + ld a,(screen_path) ; диск ; !TODO вот это заменить на вывод честного диска ld (hl),a inc hl ld a,'"' @@ -224,6 +290,8 @@ Print_Header: ; %1 ld hl,serial_string ; строка серийного номера диска ld de,PRM2 ; куда call ncopy_string ; скопир. строку (с нулем) + ; диск ; !TODO вот это заменить на вывод честного пути + ; пример вывода длинной строки пути есть в print_compath: ; %3 ld hl,screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным ld de,PRM3 ; 16 буфер diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM index 60bfa00..f8e889a 100644 --- a/SHELL/EDLINE.ASM +++ b/SHELL/EDLINE.ASM @@ -66,45 +66,9 @@ input_line: ; Вывод пути в ком-строке на экран + новая ширина поля ввода ;--------------------------------------------------------------- print_compath: - ; узнать длину сист. пути ld hl,system_path ; сист. путь - ld e,l - ld d,h - ld bc,max_len_comline ; 254 - xor a - ld (print_compath_flag),a ; сбр. флаг - cpir - dec hl - push hl ; сохр. конец пути - sbc hl,de - ld a,l ; длина строки - cp max_screen_path+1 ; 33 - jr c,print_compath__ - ; длина пути > 32 - ld a,max_screen_path ; 32 - ld (print_compath_flag),a ; уст. флаг -print_compath__: - ld c,a ; полная длина строки - ld b,0 - ex af,af' ; сохр. длину строки - pop hl ; восст. конец пути - ld de,screen_path+2 ; куда - ; скопировать строку - and a - sbc hl,bc ; hl=начало перекачки - ldir -print_compath_flag+1: - ld a,0 ; флаг переполн. строки - or a - jr z,print_compath1__ - ld hl,screen_path+2 - ld (hl),'\' - inc hl - ld a,"." - ld (hl),a - inc hl - ld (hl),a -print_compath1__: + ld de,screen_path+2 ; буфер для короткого пути + call make_short_path xor a ld (de),a ; зануление строки ex af,af' ; восст. длину строки @@ -164,7 +128,7 @@ print_inpline: push de ld (de),a inc de - djnz $-2 + djnz $-2 ; !FIXIT ld a,(iy+0) sub (iy+3) cp c @@ -203,6 +167,45 @@ print_inpline: prne1__:ld (cursor_position),a ; X полож. курсора на экране ret +; вход: HL - полный путь +; DE - буфер для короткой строки пути +make_short_path:; узнать длину сист. пути + ld (.bufferAddr),de + ld e,l + ld d,h + ld bc,max_len_comline ; 254 + xor a + ld (.flag),a ; сбр. флаг + cpir + dec hl + push hl ; сохр. конец пути + sbc hl,de + ld a,l ; длина строки + cp max_screen_path+1 ; 33 + jr c,.copy + ; длина пути > 32 + ld a,max_screen_path ; 32 + ld (.flag),a ; уст. флаг +.copy: ld c,a ; полная длина строки + ld b,0 + ex af,af' ; сохр. длину строки + pop hl ; восст. конец пути +.bufferAddr+1: ld de,0 ; куда + ; скопировать строку + and a + sbc hl,bc ; hl=начало перекачки + ldir +.flag+1: ld a,0 ; флаг переполн. строки + or a + ret z + ld hl,(.bufferAddr) + ld (hl),'\' + inc hl + ld a,"." + ld (hl),a + inc hl + ld (hl),a + ret ; Вывод строки по счетчику ;print_inpchar: @@ -988,24 +991,24 @@ screen_path: system_path: BLOCK 256,0 ;!HARDCODE -; 7 0 -; Структура строки ввода ~input line~ -struct_input_line: - db max_len_comline ;+0 254 макс. число ввод. символов - db 0 ;+1 флаг ReadyString - db 0 ;+2 X тек. полож. курсора в пределах строки - db 0 ;+3 X смещ. строки за левый край (в символах) - db 0 ;+4 число введенных символов - ds max_len_comline+1 ;+5 строка ввода +; ; 7 0 +; ; Структура строки ввода ~input line~ +; struct_input_line: +; db max_len_comline ;+0 254 макс. число ввод. символов +; db 0 ;+1 флаг ReadyString +; db 0 ;+2 X тек. полож. курсора в пределах строки +; db 0 ;+3 X смещ. строки за левый край (в символах) +; db 0 ;+4 число введенных символов +; BLOCK max_len_comline+1,0 ;+5 строка ввода -; 8 0 -; Буфер истории -history_buff: - BLOCK history_size,0 ; 256 +; ; 8 0 +; ; Буфер истории +; history_buff: +; BLOCK history_size,0 ; 256 -; 9 0 -; Рабочий буфер -work_buffer: - BLOCK 512,0 +; ; 9 0 +; ; Рабочий буфер +; work_buffer: +; BLOCK 512,0 //////////////////////////////////////////////////////////////////////// ; \ No newline at end of file diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 48aa538..440143f 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -71,7 +71,7 @@ COMP: call EVALCMD ; (batch.asm) ld hl,system_path ; буфер сист. пути ld c,Dss.ChDir ; уст. тек. путь RST ToDSS - jp nc,Get_Path ; Ok + jp nc,Get_Path ; Ok ENDIF ; diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index 014d0ee..6092c8a 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -43,6 +43,7 @@ include 'shared_includes/constants/dss_equ.inc' include 'SHELL/version.inc' include 'shared_includes/structures/FileSystem.inc' + include 'SHELL/structures.inc' ; ; Program EQU section ;---------------------------------------------------------------------[] @@ -54,7 +55,7 @@ false EQU 0 Loader_length EQU 0 code_addr EQU shell program_start EQU shell -stack_point EQU #BFFE +stack_point EQU #C000 org_addr EQU #8000 + CLP_Buffer ;---------------------------------------------------------------------[] ; @@ -555,6 +556,33 @@ T8C24: db "OFF",0 include 'Commands/reboot.asm' ; софт ресет ; DISPLAY "Empty space for buffers from ",/H,$ + +CLEAR_ZONE: + +Buffers Struc_Buffers = $ + + + +; 7 0 +; Структура строки ввода ~input line~ +struct_input_line: + db max_len_comline ;+0 254 макс. число ввод. символов + db 0 ;+1 флаг ReadyString + db 0 ;+2 X тек. полож. курсора в пределах строки + db 0 ;+3 X смещ. строки за левый край (в символах) + db 0 ;+4 число введенных символов + BLOCK max_len_comline+1,0 ;+5 строка ввода + +; 8 0 +; Буфер истории +history_buff: + BLOCK history_size,0 ; 256 + +; 9 0 +; Рабочий буфер +work_buffer: + BLOCK 512,0 + work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes -; \ No newline at end of file +; diff --git a/SHELL/build.txt b/SHELL/build.txt index 55f04f2..6c8526a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -365 \ No newline at end of file +370 \ No newline at end of file diff --git a/SHELL/structures.inc b/SHELL/structures.inc new file mode 100644 index 0000000..1427b2d --- /dev/null +++ b/SHELL/structures.inc @@ -0,0 +1,25 @@ + STRUCT Input_Line +.max_Len BYTE 254 ;+0 254 макс. число ввод. символов +.ReadyString BYTE 0 ;+1 флаг ReadyString +.Cur_X BYTE 0 ;+2 X тек. полож. курсора в пределах строки +.Left_Shift BYTE 0 ;+3 X смещ. строки за левый край (в символах) +.Symbols_Num BYTE 0 ;+4 число введенных символов +.Path BLOCK max_len_comline+1,0 ;+5 строка ввода + ENDS + + STRUCT History +.cmds BLOCK history_size,0 ; 256 + ENDS + + STRUCT Work +.work_buffer BLOCK 512,0 +.work_buffer1 BLOCK 128,0 +.work_buffer2 BLOCK 256,0 +.free_buffer BLOCK 3840,0 + ENDS + + STRUCT Struc_Buffers +.input_line Input_Line +.history History +.work Work + ENDS