diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index e87c9dd..3e45047 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -49,12 +49,12 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 SCF RET .RATTRIB: - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute ;XOR A ; CALL .OPENATR ;R02 RET C - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute LD A,(HANDBUF+_sFM.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT) ;PUSH BC @@ -67,11 +67,11 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 .WATTRIB: PUSH AF XOR A - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute LD (OPEN.TMP),A ; CALL .OPENATR ;R02 - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute CALL NC,OPEN.FM ; POP BC @@ -87,7 +87,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET ;R02 .OPENATR: - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) ; CALL GETWORD ; тест на допуст. имя и настр. на диск @@ -95,7 +95,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 CALL MASK RET C LD A,FAT_ATTR.NoVolID - ;!TEST ;[ ] 16/11/23 optimize get attribute + ;!TEST ;[x] 16/11/23 optimize get attribute JP SEARCH.Custom ;CALL SEARCH.Custom ;RET C ; запись не найдена @@ -199,20 +199,18 @@ DEL_FN: ;!TEST ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C ; - ; LD DE,MASKARE - ; CALL MASK - ; RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z CALL LOADDIR CALL SEARCH.File @@ -264,12 +262,15 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 CALL MASK.name POP DE RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z PUSH DE CALL LOADDIR ; прочитать список каталога @@ -281,12 +282,15 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 ;LD DE,MASKARE CALL MASK.name RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z PUSH IX LD A,FAT_ATTR.NoSYSnoVolID @@ -397,7 +401,7 @@ CLOSE: LD (.TMP),A LD E,(IY+_sFM.DIR_CLUSTER) LD D,(IY+_sFM.DIR_CLUSTER+1) PUSH DE - ; [ ] 15/11/2023 -bug with bad clusters ;!TEST + ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD A,(IY+_sFM.DRIVE) CALL OPENDSK ; @@ -406,7 +410,7 @@ CLOSE: LD (.TMP),A POP DE LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER+1),D - ; [ ] 15/11/2023 -bug with bad clusters ;!TEST + ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD (IY+_sFM.ST_CLUSTER),E LD (IY+_sFM.ST_CLUSTER+1),D ; @@ -452,6 +456,7 @@ CLOSE: LD (.TMP),A ; C - #19 ; HL - указатель на файловую спецификацию ; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт +; ;!!!!! на самом деле сейчас если B=1, рабочий буфер 46 байт ; A - атрибуты, используемые при поиске ; B = 0 - имя найденного файла в формате 11 байт "FilenameExt" ; B = 1 - имя найденного файла в формате DOS "filename.ext",0 @@ -478,13 +483,12 @@ F_FIRST: PUSH HL ;!TEST Current Dir ;[x] 15/10/23 CALL DIR_PATH_CHECK + RET C ; CALL LOADDIR POP HL CALL GETWORD RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C LD A,(.TMP) @@ -556,10 +560,8 @@ F_NEXT: JP F_FIRST.FIND_S .NSEARCH: EX AF,AF' - SET_PAGE_X DIRPAGE - PUSH AF - + ;PUSH AF EX AF,AF' CPL LD C,A @@ -907,14 +909,10 @@ CHDIR: CALL GETWORD ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// MKDIR: ;!TEST Current Dir ;[x] 15/10/23 - LD C,A PUSH HL - PUSH BC CALL DIR_PATH_CHECK - POP BC POP HL RET C - LD A,C CALL .START PUSH AF LD HL,CurrentDirectory @@ -1080,14 +1078,10 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// RMDIR: ;!TEST Current Dir ;[x] 15/10/23 - LD C,A PUSH HL - PUSH BC CALL DIR_PATH_CHECK - POP BC POP HL RET C - LD A,C CALL .START PUSH AF LD HL,CurrentDirectory @@ -1098,16 +1092,17 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 ; .START: CALL GETWORD RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C - LD HL,MASKARE - LD BC,11 - LD A,"?" - CPIR - LD A,DSS_Error.sys.INVALID_NAME - SCF + ;!TEST optimization + ;LD HL,MASKARE + ;LD BC,11 + ;LD A,"?" + ;CPIR + ;LD A,DSS_Error.sys.INVALID_NAME + ;SCF + CALL CHECK_NAME + ; RET Z CALL LOADDIR CALL SEARCH.Dir @@ -1372,7 +1367,6 @@ RMKTIME: ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 -;!FIXIT некорректно работает ; GETNAME: ; LD BC,#08FF ; .GETN1: LD A,(HL) @@ -1460,7 +1454,7 @@ SEARCH: .File: LD A,FAT_ATTR.NoDIRnoVolID .Custom: EX AF,AF' ; A = 76ADLSHR SET_PAGE_X DIRPAGE - PUSH AF + ;PUSH AF EX AF,AF' ; CPL @@ -1508,8 +1502,10 @@ SEARCH: EX DE,HL LD BC,HANDBUF.SIZE LDIR - POP AF + ;POP AF + EX AF,AF' OUT (SLOT3),A + EX AF,AF' AND A RET .next_record: @@ -1522,14 +1518,16 @@ SEARCH: ADD IX,DE JR NC,.loop .error_too_many_files: - POP AF + ;POP AF + EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR SCF RET ; .error_file_not_found: - POP AF + ;POP AF + EX AF,AF' OUT (SLOT3),A LD A,DSS_Error.sys.FILE_NOT_FOUND SCF @@ -1559,10 +1557,8 @@ GETWORD: INC HL INC HL PUSH HL - ;!TEST CHNDISK OPENDSK - CALL CHNDISK - ;CALL OPENDSK - ; + CALL CHNDISK + ;CALL OPENDSK POP HL RET C LD A,(HL) @@ -1663,7 +1659,7 @@ OPENDSK: ;----------------------------------------------------------------------; -OPENDIR:;!TEST ;[ ] some optimize +OPENDIR:;!TEST ;[x] some optimize ;XOR A ;CALL SET_FM LD IY,CORE_BUFFERS.FM_BUF @@ -1673,7 +1669,7 @@ OPENDIR:;!TEST ;[ ] some optimize JR NZ,.SUBDIR .REROOT1: LD DE,0 - ;!TEST ;[ ] some optimize + ;!TEST ;[x] some optimize ;LD (IY+_sFM.ST_CLUSTER),E ;LD (IY+_sFM.ST_CLUSTER+1),D EX DE,HL @@ -1691,7 +1687,7 @@ OPENDIR:;!TEST ;[ ] some optimize .SUBDIR: CP "." JR NZ,.SUBDIR2 - ;!TEST ;[ ] some optimize + ;!TEST ;[x] some optimize ;LD A,(IY+_sFM.ST_CLUSTER) ;R05 LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R05 ; @@ -1721,7 +1717,7 @@ OPENDIR:;!TEST ;[ ] some optimize .SUBDIR3: CALL FINDDIR RET C - ;!TEST ;[ ] some optimize + ;!TEST ;[x] some optimize ;LD (IY+_sFM.ST_CLUSTER),E ;LD (IY+_sFM.ST_CLUSTER+1),D ;LD DE,#4000 ;!HARDCODE @@ -1783,7 +1779,8 @@ FINDDIR: INC HL LD BC,WorkDirectory.DEPTH XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 + CPIR + JP PO,.error ;[x] 20/11/23 проверка на выход за границы DEC HL ;R09 DEC HL LD BC,WorkDirectory.DEPTH @@ -1813,52 +1810,53 @@ FINDDIR: LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 CALL .CHECK_SLASH + JR C,.error ;R11 LD A,B AND A JR NZ,.nxt LD A,C CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение - JR C,FINDDIR.error + JR C,.error .nxt: ; LD E,XL LD D,XH - ; [ ] оптимизация по размеру + ; [x] оптимизация по размеру EX DE,HL CALL GETNAME EX DE,HL ; -/* - LD BC,256*8 + ' ' ;!HARDCODE -.MM1: LD A,(DE) - INC DE - CP C - JR Z,.MM2 - LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём - INC HL -.MM2 DJNZ .MM1 ;x42-40 50-55 - LD A,(DE) - INC DE - CP C - JR Z,.MM3 - LD (HL),"." - INC HL - LD (HL),A - INC HL - LD A,(DE) - INC DE - CP C - JR Z,.MM3 - LD (HL),A - INC HL - LD A,(DE) - CP C - JR Z,.MM3 - LD (HL),A -.MM2_5: INC HL -.MM3: LD (HL),0 -; JP IT_DIR -*/ + +; LD BC,256*8 + ' ' ;!HARDCODE +; .MM1: LD A,(DE) +; INC DE +; CP C +; JR Z,.MM2 +; LD (HL),A +; INC HL +; .MM2 DJNZ .MM1 ;x42-40 50-55 +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),"." +; INC HL +; LD (HL),A +; INC HL +; LD A,(DE) +; INC DE +; CP C +; JR Z,.MM3 +; LD (HL),A +; INC HL +; LD A,(DE) +; CP C +; JR Z,.MM3 +; LD (HL),A +; .MM2_5: INC HL +; .MM3: LD (HL),0 +; ; JP IT_DIR + .IT_DIR: LD E,(IX+_sFM.ST_CLUSTER) LD D,(IX+_sFM.ST_CLUSTER+1) @@ -1868,7 +1866,11 @@ FINDDIR: RET .CHECK_SLASH: XOR A - CPIR ;!FIXIT нет проверки на завершение по BC=0 + CPIR + ;[x] 20/11/23 проверка на выход за границы + SCF + RET PO + ; DEC HL DEC HL LD A,'\' ; #5C @@ -2254,11 +2256,25 @@ DIR_PATH_CHECK: LD A,(HL) CP (HL) RET .gotoPath: CALL FINDDIR.CHECK_SLASH + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET C LD HL,CurrentPath JP GETWORD ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +CHECK_NAME: + LD HL,MASKARE +.custom: LD BC,11 ;!HARDCODE + LD A,"?" + CPIR + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET +;----------------------------------------------------------------------; + + ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE diff --git a/DSS/build.txt b/DSS/build.txt index e250839..a9ba125 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -618 \ No newline at end of file +607 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b69773d..1826974 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b69773d50cb2c0e1da44f7f20c7daa32871f2308 +Subproject commit 18269745815d90e76686f5693e0cb45f8f31741c