From f93e0ad5b2f212f7cf3ed13a9a8b1d6451c6aee5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 17 Nov 2023 02:11:03 +1000 Subject: [PATCH] bug fixing --- DSS/CHANGES.LOG | 3 +- DSS/DOS5.ASM | 294 ++++++++++++++++++++++++++++-------------------- DSS/DOS_FM.ASM | 8 +- DSS/EXECUTE.ASM | 1 - DSS/build.txt | 2 +- 5 files changed, 177 insertions(+), 131 deletions(-) diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index 0b235c9..a87e1be 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -1,6 +1,7 @@ !FIXIT -[ ] D:\>copy dss\system.dos c:\system.dos +[ ] D:\>copy dss\system.dos c:\system.dos (bp 812d, 8136) Can't open source file + [ ] E:\BIN\MENU>c:\dss что-то про заполненность директории [ ] C:\????? или ????? diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 46573d5..e87c9dd 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -39,7 +39,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET C LD A,C ; - + ; INC B DEC B JP Z,.RATTRIB @@ -49,21 +49,31 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 SCF RET .RATTRIB: - XOR A + ;!TEST ;[ ] 16/11/23 optimize get attribute + ;XOR A + ; CALL .OPENATR ;R02 RET C - LD B,(IY+_sFM.ATTRIBUT) - PUSH BC - CALL CLOSE - POP BC - RET C - LD A,B - ;AND A + ;!TEST ;[ ] 16/11/23 optimize get attribute + LD A,(HANDBUF+_sFM.ATTRIBUT) + ;LD B,(IY+_sFM.ATTRIBUT) + ;PUSH BC + ;CALL CLOSE + ;POP BC + ;RET C + ;LD A,B + ; RET .WATTRIB: PUSH AF XOR A + ;!TEST ;[ ] 16/11/23 optimize get attribute + LD (OPEN.TMP),A + ; CALL .OPENATR ;R02 + ;!TEST ;[ ] 16/11/23 optimize get attribute + CALL NC,OPEN.FM + ; POP BC RET C SET 7,(IY+_sFM.ACCESS_MODE) @@ -71,27 +81,27 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.ATTRIBUT),B PUSH BC CALL CLOSE - POP BC +.error: POP BC RET C LD A,B - ;AND A RET ;R02 .OPENATR: - LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) + ;!TEST ;[ ] 16/11/23 optimize get attribute + ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи) + ; CALL GETWORD ; тест на допуст. имя и настр. на диск RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE CALL MASK RET C LD A,FAT_ATTR.NoVolID - CALL SEARCH.Custom - ; JR NC,OPENAT ; на поиск своб. дескриптора - ; ; запись не найдена - ; RET - RET C ; запись не найдена - JP OPEN.FM ; на поиск своб. дескриптора + ;!TEST ;[ ] 16/11/23 optimize get attribute + JP SEARCH.Custom + ;CALL SEARCH.Custom + ;RET C ; запись не найдена + ;JP OPEN.FM ; на поиск своб. дескриптора + ; + ; ;R02 //////////////////////////////////////////////////////////////////////// @@ -308,28 +318,24 @@ RENAME: ;!TEST Current Dir ;[x] 15/10/23 ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 - LD C,A + LD (OPEN.TMP),A PUSH HL - PUSH BC CALL DIR_PATH_CHECK.forceCheck - POP BC POP HL RET C - LD A,C + JR OPEN.start ;!FIXIT сделать как в mkdir или rmdir? ; ;R08 -OPEN: LD (.TMP),A ; enter point for CREATE - CALL GETWORD +OPEN: LD (.TMP),A ; enter point from CREATE +.start: CALL GETWORD RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE - CALL MASK + CALL MASK ; enter point from OPEN_FN RET C -.FILE: CALL SEARCH.File ; enter point for EXEC +.FILE: CALL SEARCH.File ; enter point from EXEC RET C ;R02 -.FM: CALL GET_FM ; enter point for ATTRIB +.FM: CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' @@ -581,17 +587,17 @@ CHNDISK_FN: POP AF RET CHNDISK:;[x] более корректная смена диска - CALL OPENDSK + CALL OPENDSK ; - ;R10 + ;R10 RET C LD HL,WorkDirectory - LD (HL),0 - PUSH AF - CALL OPENDIR - POP BC - RET C - LD A,B + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B RET //////////////////////////////////////////////////////////////////////// @@ -1204,8 +1210,6 @@ DOSNAME: - - ;----------------------------------------------------------------------; ; Чтение регистров CMOS ; вход: d=номер регистра @@ -1368,32 +1372,69 @@ RMKTIME: ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 +;!FIXIT некорректно работает +; GETNAME: +; LD BC,#08FF +; .GETN1: LD A,(HL) +; CP " " +; JR NZ,.GETN3 +; .GETN2: INC HL +; DJNZ .GETN2 +; JR .GETN4 +; .GETN3: LDI +; DJNZ .GETN1 +; ; +; .GETN4: LD A,(HL) +; CP " " +; LD A,"." +; JR NZ,.GETN5 +; LD A,#00 +; .GETN5: LD (DE),A +; INC DE +; RET Z +; LD B,#03 +; .GETN6: LD A,(HL) +; CP " " +; RET Z +; LDI +; XOR A +; LD (DE),A +; DJNZ .GETN6 +; RET +;---------------;---------------;--------------- GETNAME: LD BC,#08FF -.GETN1: LD A,(HL) - CP " " - JR NZ,.GETN3 -.GETN2: INC HL - DJNZ .GETN2 - JR .GETN4 -.GETN3: LDI - DJNZ .GETN1 -.GETN4: LD A,(HL) - CP " " - LD A,"." - JR NZ,.GETN5 - LD A,#00 -.GETN5: LD (DE),A - INC DE - RET Z - LD B,#03 -.GETN6: LD A,(HL) - CP " " - RET Z + LD A,' ' +.loop: CP (HL) + JR Z,.skip LDI + DJNZ .loop + ;;;; + JP .extension + ;;;; +.skip: LD C,B + LD B,0 + ; CF=0 + ADC HL,BC + ;;;; +.extension: + CP (HL) + LD A,"." + JR NZ,.copy_extension XOR A +.copy_extension: + LD (DE),A + INC DE + RET Z ;no copy extension + ; copy extension + LD BC,#03FF ;!HARDCODE длина расширения + счётчик + LD A,' ' +.loop2: CP (HL) + JR Z,.exit + LDI + DJNZ .loop2 +.exit: XOR A LD (DE),A - DJNZ .GETN6 RET ;----------------------------------------------------------------------; @@ -1401,8 +1442,9 @@ GETNAME: ;----------------------------------------------------------------------; ; Поиск записи каталога в списке каталога ; -; вход: a=атрибут записи +; вход: a=атрибут записи ; выход: de'=индекс записи в списке каталога +; (HANDBUF) = file's direcory record ; CF - каталог не найден SEARCH: .Dir: LD A,FAT_ATTR.DIRECTORY @@ -1497,7 +1539,8 @@ SEARCH: ;----------------------------------------------------------------------; ; Тест на допустимое имя и настроиться на диск. -; вход: hl=строка имени +; вход: hl=строка имени +; выход: (TMPNAME) GETWORD: ; !TEST INC HL @@ -1517,11 +1560,21 @@ GETWORD: INC HL PUSH HL ;!TEST CHNDISK OPENDSK - ;CALL OPENDSK CALL CHNDISK + ;CALL OPENDSK ; POP HL RET C + LD A,(HL) + OR A + RET Z + CP ' ' ; + RET Z + CP '\' ; + SCF + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET NZ + INC HL ; .dir_loop: LD DE,TMPNAME @@ -1529,7 +1582,7 @@ GETWORD: ; .loop: LD A,(HL) INC HL - CP '\' + CP '\' ; JR Z,.DIR_NAME ; AND A ; JR Z,.DIR_NAME @@ -1544,6 +1597,7 @@ GETWORD: LD A,DSS_Error.sys.INVALID_NAME SCF RET + ; .DIR_NAME: XOR A LD (DE),A @@ -1631,7 +1685,8 @@ OPENDIR:;!TEST ;[ ] some optimize LD (HL),'\' INC HL LD (HL),#00 - AND A + ; CF=0 + ;AND A RET .SUBDIR: CP "." @@ -1679,7 +1734,8 @@ OPENDIR:;!TEST ;[ ] some optimize EX DE,HL ; CALL LOADDIR - AND A + ; CF=0 + ;AND A RET ;----------------------------------------------------------------------; @@ -1691,97 +1747,96 @@ FINDDIR: ; PUSH AF LD IX,DIRPAGE.buffer -.F_01: LD A,(IX+00) +.big_loop: + LD A,(IX+00) OR A JR Z,.error CP #E5 - JR Z,.F_03 - LD A,(IX+11) - AND #10 - JR Z,.F_03 + JR Z,.next_step + LD A,(IX+11) ;!HARDCODE + AND #10 ;!HARDCODE + JR Z,.next_step LD HL,MASKARE LD D,XH LD E,XL EX DE,HL - LD B,11 + LD B,11 ;!HARDCODE .loop: LD A,(DE) CP "?" - JR Z,.F_05 + JR Z,.compared CP (HL) - JR NZ,.F_03 -.F_05: INC HL + JR NZ,.next_step +.compared: + INC HL INC DE DJNZ .loop + ; LD A,(IX+0) CP "." JP NZ,.ADDSPEC - LD A,(IX+1) + LD A,(IX+1) ;!HARDCODE CP "." JP NZ,.IT_DIR - ;LD HL,CurrentDirectory LD HL,WorkDirectory LD D,H LD E,L INC HL - ;LD BC,CurrentDirectory.DEPTH LD BC,WorkDirectory.DEPTH XOR A CPIR ;!FIXIT нет проверки на завершение по BC=0 - DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога + DEC HL ;R09 DEC HL - ;LD BC,CurrentDirectory.DEPTH LD BC,WorkDirectory.DEPTH LD A,'\' CPDR INC HL - ;AND A - ; CF = 0 EX DE,HL + ; CF = 0 SBC HL,DE EX DE,HL JR NZ,.MM3 - JP .MM2_5 -.F_03: LD BC,#0020 + INC HL +.MM3: LD (HL),0 + JP .IT_DIR + ; +.next_step: + LD BC,#0020 ;!HARDCODE ADD IX,BC - JR NC,.F_01 + JR NC,.big_loop + ; .error: POP AF OUT (SLOT3),A LD A,DSS_Error.sys.PATH_NOT_FOUND SCF RET .ADDSPEC: - LD E,XL - LD D,XH LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 -; XOR A -; CPIR ;!FIXIT нет проверки на завершение по BC=0 -; DEC HL -; DEC HL -; LD A,'\' ; #5C -; CP (HL) -; INC HL -; JR Z,.ADDSPE0 -; LD (HL),A -; INC HL -; .ADDSPE0: CALL .CHECK_SLASH - ;R11 - LD A,B - AND A - JR NZ,.MM1 - LD A,C - CP 8 - JR C,FINDDIR.error - ;R11 - LD BC,#0820 + ;R11 + LD A,B + AND A + JR NZ,.nxt + LD A,C + CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение + JR C,FINDDIR.error +.nxt: ; + LD E,XL + LD D,XH + ; [ ] оптимизация по размеру + 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 +.MM2 DJNZ .MM1 ;x42-40 50-55 LD A,(DE) INC DE CP C @@ -1803,6 +1858,7 @@ FINDDIR: .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) @@ -2138,24 +2194,14 @@ DIR_PATH_CHANGE: ADD 'A' LD (CurrentPath),A ; -.Current: ;LD HL,WorkDirectory - ;LD DE,CurrentDirectory - ;LD BC,DIRECTORY_PATH_LENGTH - ;LDIR - ;RET - LD HL,CurrentDirectory +.Current: LD HL,CurrentDirectory JP CURRDIR ; .FullWork: LD A,(CurrentPath) SUB 'A' LD (FatBuffer.DRIVE),A ; -.Work: ;LD HL,CurrentDirectory - ;LD DE,WorkDirectory - ;LD BC,DIRECTORY_PATH_LENGTH - ;LDIR - ;RET - LD HL,WorkDirectory +.Work: LD HL,WorkDirectory JP CURRDIR_FN ; @@ -2196,11 +2242,10 @@ DIR_PATH_CHECK: LD A,(HL) INC HL INC DE JR Z,.loop + JP .gotoPath ; - JR .ReDir .end: CP (HL) RET Z -.ReDir: LD HL,CurrentPath JR .gotoPath ; .checkDrive: LD HL,CurrentPath @@ -2209,6 +2254,7 @@ DIR_PATH_CHECK: LD A,(HL) CP (HL) RET .gotoPath: CALL FINDDIR.CHECK_SLASH + LD HL,CurrentPath JP GETWORD ;----------------------------------------------------------------------; diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index c454f1c..44ced0c 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -590,10 +590,10 @@ READ: LD (.R_POINT),HL CALL SET_FM RET C CALL TSTSIZE - ;!FIXIT можно перенести в начало процедуры - LD A,D - OR E - JP Z,.NOREAD + ; + LD A,D + OR E + JP Z,.NOREAD ; PUSH DE LD A,(IY+_sFM.DRIVE) diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 4210567..4312538 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -707,7 +707,6 @@ FINDPATH: CALL NZ,CHDIR JR C,.BADPATH LD HL,CORE_BUFFERS.EXEBUFF - ;LD DE,MASKARE CALL MASK.name JR C,.BADPATH CALL TST_EXT diff --git a/DSS/build.txt b/DSS/build.txt index 6001de1..e250839 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -595 \ No newline at end of file +618 \ No newline at end of file