////////////////////////////////////////////////////////////////////// ; Функция #45. Разбор командной строки. ; ; вход: HL - указатель командной строки ; DE - указатель на буфер пользователя ; B - номер подфункции: ; 0 - Разобрать строку ; 1 - Выделить имя диска ; 2 - Выделить директорию ; 3 - Выделить имя файла ; 4 - Выделить расширение файла ; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла ; 6 - Зарезервировано ;!TODO преобразовать относительный путь в полный ; [ ] ; 7 - Выделить параметр командной строки ; 8 - Преобразовать из 11 символьного формата в формат ДОС ; 9 - Преобразовать из формата ДОС в 11 символьный формат ; выход: нет ////////////////////////////////////////////////////////////////////// GLOB_PR EQU 7 ;%10000000 DRIV_PR EQU 3 ;%00001000 PATH_PR EQU 2 ;%00000100 EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 EX_PATH: EXX LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер LD (NM_PATH),HL LD HL,NM_NAME_A LD (NM_NAME),HL LD HL,NM_EXTN_A LD (NM_EXTN),HL LD HL,NM_DRIVE_A LD (NM_DRIVE),HL EXX INC B DEC B JR Z,.FULL ;0 ; разобрать строку DEC B JR Z,.GET_DRIVE ;1 ; выделить имя диска DEC B JR Z,.GET_PATH ;2 ; выделить директорию DEC B JR Z,.GET_NAME ;3 ; выделить имя файла DEC B JR Z,.GET_TYPE ;4 ; выделить расширение файла DEC B JR Z,.GET_ALL_EX ;5 ; выделить диск, путь, файл и расш. DEC B JR Z,.EX_RESR ;6 ; зарезервировано DEC B JP Z,GSWITCH ;7 ; выделить параметр ком-строки DEC B JP Z,GetName ;8 ; преобр. имя 11 -> 8.3 формат DEC B JP Z,MASK.custom ;9 ; преобр. имя 8.3 -> 11 формат .EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET ; Выделить имя диска .GET_DRIVE: LD (NM_DRIVE),DE CALL .FULL RET C LD DE,(NM_DRIVE) LD A,(DE) DEC A CP #FF RET Z CP "A"-1 JR C,.GD_error CP "Z" JR NC,.GD_error SUB "A"-1 RET ; .GD_error: LD A,DSS_Error.sys.INVALID_DRIVE SCF RET ; Выделить директорию .GET_PATH: LD (NM_PATH),DE JR .FULL ; Выделить имя файла .GET_NAME: LD (NM_NAME),DE JR .FULL ; Выделить расширение файла .GET_TYPE: LD (NM_EXTN),DE JR .FULL ; Выделить диск, путь, файл и расш. .GET_ALL_EX: EX DE,HL LD C,(HL) INC HL LD B,(HL) INC HL LD (NM_DRIVE),BC LD C,(HL) INC HL LD B,(HL) INC HL LD (NM_PATH),BC LD C,(HL) INC HL LD B,(HL) INC HL LD (NM_NAME),BC LD C,(HL) INC HL LD B,(HL) LD (NM_EXTN),BC EX DE,HL ;JR EX_FULL ; Разобрать строку .FULL: EX AF,AF' EXX XOR A LD HL,(NM_PATH) LD (HL),A LD HL,(NM_NAME) ; адрес буфера под имя файла LD (HL),A LD HL,(NM_EXTN) LD (HL),A LD HL,(NM_DRIVE) LD (HL),A EXX EX AF,AF' .PAT0: LD DE,TMPBUF LD BC,#0D01 ;!HARDCODE счетчики .PAT1: LD A,(HL) CALL UPPER ; a..z -> A..Z LD (DE),A INC HL INC DE INC C ; ++счетчик CP '\' JR Z,.PATH_YEP CP ":" JR Z,.DRIVE_YEP CP "!" JR C,.NAME_YEP CP "?" JR Z,.GLOBP1 CP "*" JR Z,.GLOBP1 .PAT2: DJNZ .PAT1 LD A,DSS_Error.sys.INVALID_NAME SCF RET ; .GLOBP1: EX AF,AF' SET GLOB_PR,A EX AF,AF' JR .PAT2 ; .NAME_YEP: LD A,2 CP C JR Z,.NOFNAME ; PUSH HL LD HL,TMPBUF LD DE,(NM_NAME) ; адрес буфера под имя файла LD B,0 DEC C DEC C LD A,C LDIR LD C,A XOR A LD (DE),A LD HL,(NM_NAME) LD A,"." CPIR JR NZ,.NOEXTN LD C,3 LD DE,(NM_EXTN) .EXTSK0: LD A,(HL) OR A JR NZ,.EXTSK1 LD A,' ' DEC HL .EXTSK1: LD (DE),A INC HL INC DE DEC C JR NZ,.EXTSK0 XOR A LD (DE),A EX AF,AF' SET EXTN_PR,A ; указано расш. файла EX AF,AF' .NOEXTN: EX AF,AF' SET NAM_PR,A ; указано имя файла EX AF,AF' POP HL .NOFNAME: EX AF,AF' AND A RET ; .DRIVE_YEP: XOR A LD (DE),A PUSH HL LD HL,TMPBUF LD DE,(NM_DRIVE) ; A=0 LD B,A LDIR POP HL EX AF,AF' SET DRIV_PR,A ; указано имя диска EX AF,AF' JP .PAT0 ; .PATH_YEP: XOR A LD (DE),A PUSH HL PUSH BC LD HL,(NM_PATH) LD BC,#00FF ; !FIXIT глубина буфера не зависит от CurrentDirectory.DEPTH CPIR DEC HL EX DE,HL LD HL,TMPBUF ; 12 пробелов POP BC ; A=0 LD B,A LDIR POP HL EX AF,AF' SET PATH_PR,A EX AF,AF' JP .PAT0 ;!TODO перенести/заменить на общий TMPBUF: DB " ",#00 ; 12 пробелов NM_DRIVE: DW NM_DRIVE_A NM_NAME: DW NM_NAME_A NM_EXTN: DW NM_EXTN_A NM_PATH: DW NM_PATH_A NM_DRIVE_A: BLOCK 9,0 NM_NAME_A: DB " ",#00 ; 12 пробелов NM_EXTN_A: DB " ",0 NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer