diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 2ecbc1b..2ae2501 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -6,41 +6,41 @@ ; B = #01 SET ATTRIB ; OUTPUT: A - ATTRIB //////////////////////////////////////////////////////////////////////// -ATTRIB: ;!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 - ; - ; - INC B - DEC B - JP Z,.READ - DEC B - JP Z,.WRITE_FN - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -.READ: ;!TEST ;[x] 16/11/23 optimize get attribute - ;XOR A - ; - CALL .OPENATR ;R002 - RET C - ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) - ;LD B,(IY+_sFM.ATTRIBUT) - ;PUSH BC - ;CALL CLOSE - ;POP BC - ;RET C - ;LD A,B - ; - RET - ; +ATTRIB: ;!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 + ; + ; + INC B + DJNZ .B_1 + ; B = 0 +.READ: ;!TEST ;[x] 16/11/23 optimize get attribute + ;XOR A + ; + CALL .OPENATR ;R002 + RET C + ;!TEST ;[x] 16/11/23 optimize get attribute + LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + ;LD B,(IY+_sFM.ATTRIBUT) + ;PUSH BC + ;CALL CLOSE + ;POP BC + ;RET C + ;LD A,B + ; + RET + ; +.error_fn: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET + ; +.B_1: DJNZ .error_fn .WRITE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID .WRITE: PUSH AF diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 38843d0..a881cb1 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ;Входные значения: ; C - #12 @@ -18,18 +19,30 @@ CLOSE_FN: RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) JR Z,.NOTMODF - LD E,(IY+_sFM.DIR_CLUSTER) - LD D,(IY+_sFM.DIR_CLUSTER+1) + LD E,(IY+_sFM.DIR_CLUSTER_L) + LD D,(IY+_sFM.DIR_CLUSTER_L+1) PUSH DE + ; [x] fat32 + LD E,(IY+_sFM.DIR_CLUSTER_H) + LD D,(IY+_sFM.DIR_CLUSTER_H+1) + PUSH DE + ; ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD A,(IY+_sFM.DRIVE) CALL OPENDSK ; XOR A CALL SET_FM + ; [x] fat32 POP DE - LD (IY+_sFM.DIR_CLUSTER),E - LD (IY+_sFM.DIR_CLUSTER+1),D + LD (IY+_sFM.DIR_CLUSTER_H),E + LD (IY+_sFM.DIR_CLUSTER_H+1),D + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D + ; + POP DE + LD (IY+_sFM.DIR_CLUSTER_L),E + LD (IY+_sFM.DIR_CLUSTER_L+1),D ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 2bdefac..c4b1b21 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -3,111 +3,99 @@ ; A - File attribute ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - LD C,A - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - CALL .Prepare - RET C - CALL SEARCH.File - ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 - ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT - CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT - CP DSS_Error.sys.FILE_NOT_FOUND - JR Z,.DO - SCF - RET +CREATE: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + LD C,A + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL .Prepare + RET C + CALL SEARCH.File + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT + CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT + CP DSS_Error.sys.FILE_NOT_FOUND + JR Z,.DO + SCF + RET .FILE_EXISTS_DEL: - CALL DEL_FN.DELETE - LD A,DSS_Error.sys.FILE_NOT_FOUND - RET - ; - ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 - ; OUTPUT: A - FM -.NEW: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - LD C,A - PUSH BC - CALL DIR_PATH_CHECK - POP BC - POP HL - RET C - LD A,C - ; - CALL .Prepare - RET C - CALL SEARCH.File - ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 - ; LD A,DSS_Error.sys.FILE_EXISTS - ; CCF - ; RET C - JR NC,.FILE_EXISTS - CP DSS_Error.sys.FILE_NOT_FOUND - SCF - RET NZ - ; - ; - ;no_file_found -.DO: LD HL,MASKARE - LD DE,HANDBUF - LD BC,11 - LDIR - EX DE,HL -.TMP+1: LD A,0 - LD (HL),A - INC HL - LD BC,#0A00 ;!HARDCODE - ; -.loop1: LD (HL),C - INC HL - DJNZ .loop1 - ;AaRR - PUSH HL - CALL SYSTIME - CALL MK_TIME - POP HL - LD (HL),E - INC HL - LD (HL),D - INC HL - LD (HL),C - INC HL - LD (HL),B - INC HL - LD BC,#0600 - ; -.loop2: LD (HL),C - INC HL - DJNZ .loop2 - ; - CALL WRT_HND - RET C - ;CALL SAVEDIR -.PATH0+1: - LD HL,0 - XOR A - LD (OPEN_FN.TMP),A - JP OPEN_FN.FILE ;R008 -.Prepare: - ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE - AND FAT_ATTR.NoDIRnoVolID - LD (.TMP),A - LD (.PATH0),HL - CALL GETWORD - RET C - ; LD HL,TMPNAME - ; LD DE,MASKARE - JP MASK - ; + CALL DEL_FN.DELETE + LD A,DSS_Error.sys.FILE_NOT_FOUND + RET + ; + ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 + ; OUTPUT: A - FM +.NEW: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + LD C,A + PUSH BC + CALL DIR_PATH_CHECK + POP BC + POP HL + RET C + LD A,C + ; + CALL .Prepare + RET C + CALL SEARCH.File + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.FILE_EXISTS + ; CCF + ; RET C + JR NC,.FILE_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ + ; + ; + ;no_file_found +.DO: LD HL,MASKARE + LD DE,HANDBUF + LD BC,11 + LDIR + EX DE,HL +.TMP+1: LD A,0 + LD (HL),A + INC HL + LD BC,#0A00 ;!HARDCODE + ; +.loop1: LD (HL),C + INC HL + DJNZ .loop1 + ;AaRR + CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD + ; + LD BC,#0600 + ; +.loop2: LD (HL),C + INC HL + DJNZ .loop2 + ; + CALL WRT_HND + RET C + ;CALL SAVEDIR +.PATH0+1: LD HL,0 + XOR A + LD (OPEN_FN.TMP),A + JP OPEN_FN.FILE ;R008 + ; +.Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE + AND FAT_ATTR.NoDIRnoVolID + LD (.TMP),A + LD (.PATH0),HL + CALL GETWORD + RET C + ; LD HL,TMPNAME + ; LD DE,MASKARE + JP MASK + ; ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 -.FILE_EXISTS: - LD A,DSS_Error.sys.FILE_EXISTS - CCF - RET +.FILE_EXISTS: LD A,DSS_Error.sys.FILE_EXISTS + CCF + RET ; \ No newline at end of file diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index cb8c85d..13aaefe 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ? //////////////////////////////////////////////////////////////////////// @@ -27,26 +28,46 @@ DEL_FN: ;!TEST CALL SEARCH.File RET C ; пометить запись как "удаленная" +;!TODO record index. возможно, что может сломаться, если больше страницы .DELETE: SET_PAGE_X DIRPAGE + EX AF,AF' LD (IX + _sFAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла - ; [ ] fat32 - LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера - LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) - ; - OUT (SLOT3),A + ; fat32 + LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера + LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD A,E OR D - JP Z,SAVEDIR ; сбросить кеш каталога на диск + EXX + LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + OR D + OR E + ; + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + JP Z,SAVEDIR ; сбросить кеш каталога на диск + ; если размер файла не ноль .loop: EX DE,HL ; hl=номер кластера + EXX + EX DE,HL + EXX CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера - PUSH DE ; номер след. кластера - PUSH AF + EXX + PUSH DE ; номер след. кластера + PUSH AF + LD DE,#0000 ; номер кластера + EXX + PUSH DE LD DE,#0000 ; номер кластера CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера POP AF POP DE + EXX + POP DE + EXX JP NC,.loop - CALL WRITE_FAT_TABLE ;!FIXIT может не нужна тут? Там дальше будет + CALL WRITE_FAT_TABLE JP SAVEDIR ; сбросить кеш каталога на диск ; \ No newline at end of file diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index fa52f6e..8cc11c1 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -266,13 +266,13 @@ ERREXE: PUSH AF _mDECTASK POP AF RET - ; + ;!TODO сравнить с EXEC02 PRELOAD: EX DE,HL LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) LD A,D AND #3F LD D,A - ADC HL,DE + ADD HL,DE XOR A SLA H RLA diff --git a/DSS/API/Lib_Sub.asm b/DSS/API/Lib_Sub.asm index faaeac5..48bb066 100644 --- a/DSS/API/Lib_Sub.asm +++ b/DSS/API/Lib_Sub.asm @@ -3,11 +3,11 @@ ; B = 1 Вызов функции SETUP_CURSORS для восстановления системных шрифтов DSS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LIB_SUB: - DJNZ 1F + DJNZ .B_2 ; func B = 1 JP SETUP_CURSORS ; -1: ; func B > 1 or 0 +.B_2: ; func B > 1 or 0 SCF RET ; diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index fe08e0d..6f55c51 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; @@ -6,196 +7,206 @@ ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// +MKDIR: ;error -MKDIR.DIR_EXISTS: - LD A,DSS_Error.sys.DIR_EXISTS - CCF - RET - - -MKDIR: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL .START - PUSH AF - LD HL,CurrentDirectory - CALL CHDIR - POP AF - RET - ; -.START: CALL GETWORD ; тест на допуст. имя и настр. на диск - RET C - ;LD HL,TMPNAME ; 8.3 имя - ;LD DE,MASKARE ; буфер имени 11 симв. формата - CALL MASK ; преобр. имя 8.3 -> 11 формат - RET C - ;!TEST optimization ранее GETWORD уже загрузил директорию - ;CALL LOADDIR ; прочитать список каталога - ; - CALL SEARCH.Dir ; поиск записи каталога в списке диска - ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 - ; LD A,DSS_Error.sys.DIR_EXISTS - ; CCF - ; RET C ; каталог найден - JR NC,.DIR_EXISTS - CP DSS_Error.sys.FILE_NOT_FOUND - SCF - RET NZ - ; - CALL G_CLUST - RET C - ; [x] fat32 - PUSH HL ; младший номер сектора - EXX - PUSH HL ; старший номер сектора - EXX - ; - CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - LD HL,MASKARE - LD DE,HANDBUF - LD BC,11 - LDIR - EX DE,HL - LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога - ; _sFAT_DIRECTORY_RECORD.ATTRIBUT - LD (HL),A - INC HL - LD BC,#0800 ; b=счетчик - ; -.loop1: LD (HL),C - INC HL - DJNZ .loop1 - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H - ; [x] fat32 запись старшего номера кластера .FIRST_CLUSTER_H - POP DE - PUSH DE ; старший номер сектора - LD (HL),E - INC HL - LD (HL),D - INC HL - ; [ ] fat32 & VFAT - PUSH HL - CALL SYSTIME ; узнать тек. дату и время - CALL MK_TIME ; закодировать время/дату - POP HL - ; _sFAT_DIRECTORY_RECORD.TIME - LD (HL),E ; de=время - INC HL - LD (HL),D - INC HL - ; _sFAT_DIRECTORY_RECORD.DATE - LD (HL),C ; день - INC HL - LD (HL),B ; месяц - INC HL - ; запись младшего номера кластера .FIRST_CLUSTER_L - POP BC ; старший номер сектора - POP DE ; младший номер сектора - PUSH DE - PUSH BC - ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L - LD (HL),E - INC HL - LD (HL),D - INC HL - ; _sFAT_DIRECTORY_RECORD.F_SIZE - LD BC,#0400 ; b=счетчик -.loop2: LD (HL),C - INC HL - DJNZ .loop2 - ; - CALL WRT_HND ; скопир. новую запись в список диска (каталога) - ;CALL SAVEDIR ; и сбросить кеш каталога на диск - LD HL,CORE_BUFFERS.SECBUF ; буфер - LD (HL),"." ; запись тек. каталога - LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел - ; -.loop3: INC HL - LD (HL),C - DJNZ .loop3 - ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD - INC HL - LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла - EX DE,HL - LD BC,21 - LDIR - EX DE,HL - LD (HL),"." ; запись родит. каталога - INC HL - LD (HL),"." - LD BC,9*256 + ' ' ; b=счетчик, c=пробел -.MKD03: INC HL - LD (HL),C - DJNZ .MKD03 - ; - INC HL - SET_PAGE_X DIRPAGE - PUSH AF - ; - LD A,(DIRPAGE.buffer) - CP "." - LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи - JP Z,.MKD04 - LD IX,HANDBUF - XOR A - ; [ ] fat32 разобраться - LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A - LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A - LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла -.MKD04: EX DE,HL - LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 - LDIR - POP AF - OUT (SLOT3),A - ; - EX DE,HL - LD D,H - LD E,L - INC DE - LD (HL),0 - LD BC,512-65 ;!HARDCODE - LDIR - ; - POP HL ; старший номер сектора - EXX - POP HL ; младший номер сектора - CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер -.MKD12: PUSH AF - PUSH HL ; ст. разряд - PUSH IX ; номер лог. сектора - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - ; - LD A,(FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Write - RST ToDSS.DRV - ; - POP AF - OUT (SLOT3),A - ; - LD HL,CORE_BUFFERS.SECBUF - LD DE,CORE_BUFFERS.SECBUF+1 - LD BC,511 - LD (HL),0 - LDIR - ; - POP IX - POP HL - INC IX - LD A,XH - OR XL - JR NZ,.MKD11 - INC HL -.MKD11 POP AF - DEC A - JR NZ,.MKD12 - AND A - RET +.DIR_EXISTS: LD A,DSS_Error.sys.DIR_EXISTS + CCF + RET + ; +; Entry point ;!TEST Current Dir ;[x] 15/10/23 +.B: PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + POP AF + RET + ; +.START: CALL GETWORD ; тест на допуст. имя и настр. на диск + RET C + ;LD HL,TMPNAME ; 8.3 имя + ;LD DE,MASKARE ; буфер имени 11 симв. формата + CALL MASK ; преобр. имя 8.3 -> 11 формат + RET C + ;!TEST optimization ранее GETWORD уже загрузил директорию + ;CALL LOADDIR ; прочитать список каталога + ; + CALL SEARCH.Dir ; поиск записи каталога в списке диска + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.DIR_EXISTS + ; CCF + ; RET C ; каталог найден + JR NC,.DIR_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ + ; + CALL G_CLUST + RET C + ; fat32 + PUSH HL ; младший номер сектора + EXX + PUSH HL ; старший номер сектора + EXX + ; + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + LD HL,MASKARE + LD DE,HANDBUF + LD BC,11 + LDIR + EX DE,HL + LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога + ; _sFAT_DIRECTORY_RECORD.ATTRIBUT + LD (HL),A + INC HL + LD BC,#0800 ; b=счетчик + ; +.loop1: LD (HL),C + INC HL + DJNZ .loop1 + ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H + ; fat32 запись старшего номера кластера .FIRST_CLUSTER_H + POP DE + PUSH DE ; старший номер сектора + LD (HL),E + INC HL + LD (HL),D + INC HL + ; + CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD + ; запись младшего номера кластера .FIRST_CLUSTER_L + POP BC ; старший номер сектора + POP DE ; младший номер сектора + PUSH DE + PUSH BC + ; _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L + LD (HL),E + INC HL + LD (HL),D + INC HL + ; _sFAT_DIRECTORY_RECORD.F_SIZE + LD BC,#0400 ; b=счетчик +.loop2: LD (HL),C + INC HL + DJNZ .loop2 + ; + CALL WRT_HND ; скопир. новую запись в список диска (каталога) + ;CALL SAVEDIR ; и сбросить кеш каталога на диск + ; + ; создаём служебные каталоги "." и ".." в созданном каталоге + ; КАТАЛОГ "." + LD HL,CORE_BUFFERS.SECBUF ; буфер + LD (HL),"." ; запись тек. каталога + LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел + ; +.loop3: INC HL + LD (HL),C + DJNZ .loop3 + ; скопировать байты 11..31 _sFAT_DIRECTORY_RECORD + INC HL + LD DE,HANDBUF+_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла + EX DE,HL + LD BC,21 ; !HARDCODE + LDIR + ; КАТАЛОГ ".." + EX DE,HL + LD (HL),"." ; запись родит. каталога + INC HL + LD (HL),"." + LD BC,9*256 + ' ' ; b=счетчик, c=пробел +.loop4: INC HL + LD (HL),C + DJNZ .loop4 + ; + INC HL + SET_PAGE_X DIRPAGE + PUSH AF + ; + LD DE,DIRPAGE.buffer + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи + ; + LD A,(DIRPAGE.buffer) + CP "." + JR Z,.copy_dir_record + ; fat32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR NZ,.fat16_root_dir + ; fat 32 + EX DE,HL + LD HL,(FatBuffer.RootDirStartCluster_L) + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL + LD HL,(FatBuffer.RootDirStartCluster_H) + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL + EX DE,HL + JR .set_rec + ; +.fat16_root_dir:; fat 12/16 + ;LD IX,HANDBUF + XOR A + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A + LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A +.set_rec: LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла +.copy_dir_record: + EX DE,HL + LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT ; 21 + LDIR + POP AF + OUT (SLOT3),A + ; + EX DE,HL + LD D,H + LD E,L + INC DE + LD (HL),0 + LD BC,512-65 ;!HARDCODE + LDIR + ; + POP HL ; старший номер сектора + EXX + POP HL ; младший номер сектора + CALL CLUSTER_TO_SECTOR + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер +.MKD12: PUSH AF + PUSH HL ; ст. разряд + PUSH IX ; номер лог. сектора + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + ; + LD A,(FatBuffer.DRIVE) + LD DE,CORE_BUFFERS.SECBUF+#C000 + LD BC,1*256 + Dss.DRV.Write + RST ToDSS.DRV + ; + POP AF + OUT (SLOT3),A + ; + LD HL,CORE_BUFFERS.SECBUF + ; [x] optimization + LD A,(HL) + OR A + JR Z,.skip_clean + ; + LD DE,CORE_BUFFERS.SECBUF+1 + LD BC,511 ;!HARDCODE + LD (HL),0 + LDIR +.skip_clean: ; + POP IX + POP HL + INC IX + LD A,XH + OR XL + JR NZ,.MKD11 + INC HL +.MKD11 POP AF + DEC A + JR NZ,.MKD12 + AND A + RET ; \ No newline at end of file diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index e69b6df..40864dc 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; @@ -11,71 +12,79 @@ ; выход: CF=0, A - дескриптор файла. ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// -OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 - LD (.TMP),A - PUSH HL - CALL DIR_PATH_CHECK.forceCheck - POP HL - RET C - ;JR .start - ;!FIXIT сделать как в mkdir или rmdir? -;R008 ; -.start: CALL GETWORD - RET C - CALL MASK - RET C -.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE - RET C - ;!TEST 9/11/23 record index - PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) -;R002 ; -.FM: CALL GET_FM ; enter point from ATTRIB - RET C - LD A,C - EX AF,AF' - ;!TEST 9/11/23 record index указатель на запись в каталоге FS - POP DE - ; EXX - LD (IY+_sFM.HANDLE),E - LD (IY+_sFM.HANDLE+1),D - ; EXX - ; - LD D,YH - LD E,YL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR -.TMP+1: LD A,0 - LD (IY+_sFM.ACCESS_MODE),A - LD A,(TASK) - LD (IY+_sFM.TASK_NUM),A - XOR A - LD (IY+_sFM.KnownCluster_L),A - LD (IY+_sFM.KnownCluster_L+1),A - LD (IY+_sFM.KnownOffset_L),A - LD (IY+_sFM.KnownOffset_L+1),A - LD (IY+_sFM.OptimizedClusters),A - ; [x] fat32 - LD (IY+_sFM.KnownCluster_H),A - LD (IY+_sFM.KnownCluster_H+1),A - LD (IY+_sFM.KnownOffset_H),A - LD (IY+_sFM.KnownOffset_H+1),A - ; - LD (IY+_sFM.F_POSITION),A - LD (IY+_sFM.F_POSITION+1),A - LD (IY+_sFM.F_POSITION+2),A - LD (IY+_sFM.F_POSITION+3),A - LD A,(FatBuffer.DRIVE) - LD (IY+_sFM.DRIVE),A - ; [ ] fat32 - LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L - LD E,(HL) - INC HL - LD D,(HL) - ; [ ] fat32 - LD (IY+_sFM.DIR_CLUSTER),E - LD (IY+_sFM.DIR_CLUSTER+1),D - EX AF,AF' - AND A - RET +OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 + ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO + LD (.TMP),A + PUSH HL + CALL DIR_PATH_CHECK.forceCheck + POP HL + RET C + ;JR .start + ;!FIXIT сделать как в mkdir или rmdir? +;R008 ; +.start: CALL GETWORD + RET C + CALL MASK + RET C +.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE + RET C + ;!TEST 9/11/23 record index + PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) +;R002 ; +.FM: CALL GET_FM ; enter point from ATTRIB + RET C + LD A,C + EX AF,AF' + ;!TEST 9/11/23 record index указатель на запись в каталоге FS + POP DE + ; EXX + LD (IY+_sFM.HANDLE),E + LD (IY+_sFM.HANDLE+1),D + ; EXX + ; + LD D,YH + LD E,YL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR +.TMP+1: LD A,0 + LD (IY+_sFM.ACCESS_MODE),A + LD A,(TASK) + LD (IY+_sFM.TASK_NUM),A + XOR A + LD (IY+_sFM.OptimizedClusters),A + LD (IY+_sFM.KnownCluster_L),A + LD (IY+_sFM.KnownCluster_L+1),A + LD (IY+_sFM.KnownOffset_L),A + LD (IY+_sFM.KnownOffset_L+1),A + ; fat32 + LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownCluster_H+1),A + LD (IY+_sFM.KnownOffset_H),A + LD (IY+_sFM.KnownOffset_H+1),A + ; + LD (IY+_sFM.F_POSITION),A + LD (IY+_sFM.F_POSITION+1),A + LD (IY+_sFM.F_POSITION+2),A + LD (IY+_sFM.F_POSITION+3),A + LD A,(FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + ; fat32 + LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+_sFM.DIR_CLUSTER_H),E + LD (IY+_sFM.DIR_CLUSTER_H+1),D + ; + LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM + LD E,(HL) + INC HL + LD D,(HL) + LD (IY+_sFM.DIR_CLUSTER_L),E + LD (IY+_sFM.DIR_CLUSTER_L+1),D + ; + EX AF,AF' + AND A + RET ; \ No newline at end of file diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index 8fe813b..77cd97b 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -15,22 +15,23 @@ READ: LD (.R_POINT),HL LD A,(IY+_sFM.DRIVE) CALL OPENDSK JP C,.ERR_1 - ;Расчёт смещения в секторах ;!HARDCODE sectro size - LD H,0 ;!HARDCODE max file size = 8 gb - LD E,(IY+_sFM.F_POSITION+1) - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD A,E - AND #01 - LD B,A - LD C,(IY+_sFM.F_POSITION) - RR L - RR D - RR E - ;HL:DE FP (in sectors) - ;BC FP residue (in bytes) - ; - OR C + CALL GET_OFFSET_IN_SECTORS + ; ;Расчёт смещения в секторах ;!HARDCODE sector size + ; LD H,0 ;!HARDCODE max file size = 8 gb + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD C,(IY+_sFM.F_POSITION) + ; RR L + ; RR D + ; RR E + ; ;HL:DE FP (in sectors) + ; ;BC FP residue (in bytes) + ; ; + ; OR C JP NZ,.ROV1 .ROV4: POP BC PUSH BC @@ -145,9 +146,9 @@ READ: LD (.R_POINT),HL JP .ROV4 ; .ERR_3: POP HL -.ERR_2: POP HL + POP HL .ERR_1: POP BC - SCF + ;SCF RET ; .TEST_SIZE: XOR A diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index e91ad9e..3bcacfa 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -1,3 +1,4 @@ +; [x] fat32 ;!TEST //////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. @@ -7,112 +8,132 @@ ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// -RMDIR: ;!TEST Current Dir ;[x] 15/10/23 - PUSH HL - CALL DIR_PATH_CHECK - POP HL - RET C - CALL .START - PUSH AF - LD HL,CurrentDirectory - CALL CHDIR - CALL DIR_PATH_CHANGE.Current - POP AF - RET - ; -.START: CALL GETWORD - RET C - CALL MASK - RET C - ;!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 - RET C - ; [ ] fat32 - LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) - PUSH IX -.RMD17: PUSH HL - CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - ; начинаем вычитывать содержимое каталога посекторно -.read_dir_loop: - PUSH AF - PUSH HL - PUSH IX - ; - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Read - LD A,(FatBuffer.DRIVE) - RST ToDSS.DRV - POP AF - OUT (SLOT3),A - ; - ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора - LD B,16 - LD HL,CORE_BUFFERS.SECBUF +RMDIR: ;!TEST Current Dir ;[x] 15/10/23 + PUSH HL + CALL DIR_PATH_CHECK + POP HL + RET C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + CALL DIR_PATH_CHANGE.Current + POP AF + RET + ; +.START: CALL GETWORD + RET C + CALL MASK + RET C + ;!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 + RET C + ; fat32 + LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) + EXX + LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы + ; + ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах +.read_dir_big_loop: + PUSH HL + EXX + PUSH HL + EXX + CALL CLUSTER_TO_SECTOR + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD B,A + LD C,Dss.DRV.Read + ; начинаем вычитывать содержимое каталога посекторно +.read_dir_loop: ;PUSH AF + PUSH BC + PUSH HL + PUSH IX + ; + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + LD DE,CORE_BUFFERS.SECBUF+#C000 + ;LD BC,1*256 + Dss.DRV.Read + LD B,1 + LD A,(FatBuffer.DRIVE) + RST ToDSS.DRV + POP AF + OUT (SLOT3),A + ; + ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + LD B,16 + LD HL,CORE_BUFFERS.SECBUF .check_dir_loop: - LD A,(HL) - OR A - JP Z,.RMD15 ;DIR EMPTY - CP "." - JR Z,.next_record - CP #E5 ;!HARDCODE байт удаления файла - JR Z,.next_record - LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов - ADD HL,DE - LD A,(HL) - SBC HL,DE - AND FAT_ATTR.VOLUME_ID - JP Z,.error ;DIR NOT EMPTY -.next_record: - LD DE,#0020 - ADD HL,DE - DJNZ .check_dir_loop - ; - POP IX - POP HL - INC IX - LD A,XH - OR XL - JR NZ,.no_inc_hl - INC HL -.no_inc_hl: - POP AF - DEC A - JR NZ,.read_dir_loop - ; [ ] fat32 - POP HL ; номер кластера - CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера - EX DE,HL ; hl=номер след. кластера - JR NC,.RMD17 ; не конец цепочки -.delete: - POP IX - JP DEL_FN.DELETE ; пометить запись как "удаленная" -.RMD15: POP IX - POP HL - POP AF - POP HL - JR .delete - ; -.error: POP IX - POP HL - POP AF - POP HL - POP IX - LD A,DSS_Error.sys.DIR_NOT_EMPTY - SCF - RET + LD A,(HL) + OR A + JP Z,.RMD15 ;DIR EMPTY + CP "." + JR Z,.next_record + CP #E5 ;!HARDCODE байт удаления файла + JR Z,.next_record + LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов + ADD HL,DE + LD A,(HL) + SBC HL,DE + AND FAT_ATTR.VOLUME_ID + JP Z,.error ;DIR NOT EMPTY +.next_record: LD DE,#0020 + ADD HL,DE + DJNZ .check_dir_loop + ; + POP IX + POP HL + INC IX + LD A,XH + OR XL + JR NZ,.no_inc_hl + INC HL +.no_inc_hl: ; POP AF + ; DEC A + ; JR NZ,.read_dir_loop + POP BC + DJNZ .read_dir_loop + ; fat32 + EXX + POP HL ; номер кластера + EXX + POP HL ; номер кластера + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера + EX DE,HL ; hl=номер след. кластера + EXX + EX DE,HL ; hl=номер след. кластера + EXX + JR NC,.read_dir_big_loop ; не конец цепочки + ; +.delete: POP IX + JP DEL_FN.DELETE ; пометить запись как "удаленная" + ; +.RMD15: POP HL + POP HL + POP HL + POP HL + POP HL + JR .delete + ; +.error: POP HL + POP HL + POP HL + POP HL + POP HL + POP HL + LD A,DSS_Error.sys.DIR_NOT_EMPTY + SCF + RET ; \ No newline at end of file diff --git a/DSS/API/SetDateTime.asm b/DSS/API/SetDateTime.asm index 4da4a74..38aab39 100644 --- a/DSS/API/SetDateTime.asm +++ b/DSS/API/SetDateTime.asm @@ -20,6 +20,7 @@ PUT_D_T: POP BC POP DE RET C + ; [ ] VFAT LD (IY + _sFM.FS_REC.TIME),E LD (IY + _sFM.FS_REC.TIME+1),D LD (IY + _sFM.FS_REC.DATE),C diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index fcc9d91..9a886b3 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -15,194 +15,194 @@ WRITE.RD_ONLY: ; HL - ADDRESS ; DE - SIZE ; A - FM -WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE - CALL .Start - PUSH AF - LD A,(FatBuffer.CacheUpdated) - OR A - CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск - POP AF - RET - ; -.Start: LD (.R_POINT),HL - LD (.S_POINT),HL - PUSH DE - CALL SET_FM - JR C,.ERR1 - LD A,(IY+_sFM.ACCESS_MODE) - AND FAT_ATTR.READ_ONLY - JR NZ,.RD_ONLY - SET 7,(IY + _sFM.ACCESS_MODE) - SET 5,(IY + _sFM.FS_REC.ATTRIBUT) - LD A,(IY + _sFM.DRIVE) - CALL OPENDSK - JR C,.ERR1 - ; - LD C,(IY+_sFM.F_POSITION) - LD A,(IY+_sFM.F_POSITION+1) - LD E,A - AND #01 - LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A - RR L - RR D - RR E - ; HL:DE - FP (in sectors) - ; BC - FP residue (in bytes) - LD A,B - OR C - JP NZ,.WOV1 -.WOV4: POP BC - PUSH BC - SRL B - JR Z,.WOV2 - PUSH HL - PUSH DE - PUSH BC -.R_POINT+2: - LD IX,0 - CALL BLOK_WRITE - POP BC - JR C,.ERR3 - LD C,B - LD HL,(.R_POINT) - LD DE,#0200 ;!HARDCODE -.WOV5: ADD HL,DE - DJNZ .WOV5 - ; B=0 - LD (.R_POINT),HL - ;LD B,0 - POP HL - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC -.WOV2: POP BC - LD A,B - AND #01 - LD B,A - OR C - JR Z,.WOV6 - PUSH HL - PUSH DE - PUSH BC - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - LD DE,CORE_BUFFERS.BUFFER - LD HL,(.R_POINT) - POP BC - JP C,.ERR2 - LDIR - LD (.R_POINT),HL - POP DE - POP HL - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_WRITE - POP BC - LD C,SLOT3 - OUT (C),B - RET C -.WOV6: LD HL,(.R_POINT) -.S_POINT+1: LD DE,0 - ; CF=0 - ;AND A - SBC HL,DE - PUSH HL - EX DE,HL - LD XH,D - LD XL,E - LD HL,0 - CALL MOVE_FP.F_current - CALL MOVE_CP - POP DE - RET NC ; Если размер файла на диске НЕ стал больше, чем был - ; Если размер файла на диске стал больше, чем был - LD L,(IY + _sFM.F_POSITION+0) - LD H,(IY + _sFM.F_POSITION+1) - LD C,(IY + _sFM.F_POSITION+2) - LD B,(IY + _sFM.F_POSITION+3) - LD (IY + _sFM.FS_REC.F_SIZE+0),L - LD (IY + _sFM.FS_REC.F_SIZE+1),H - LD (IY + _sFM.FS_REC.F_SIZE+2),C - LD (IY + _sFM.FS_REC.F_SIZE+3),B - AND A - RET - ; -.WOV1: PUSH BC - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - POP DE - POP HL - EXX - POP DE - JP C,.ERR1 - LD HL,512 ;!HARDCODE sector size! - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.WOV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 -.WOV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - EX DE,HL - LDIR - LD (.R_POINT),HL - EXX - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_WRITE - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,.ERR2 - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - JP .WOV4 +WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE + CALL .Start + PUSH AF + LD A,(FatBuffer.CacheUpdated) + OR A + CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + POP AF + RET + ; +.Start: LD (.R_POINT),HL + LD (.S_POINT),HL + PUSH DE + CALL SET_FM + JR C,.ERR1 + LD A,(IY+_sFM.ACCESS_MODE) + AND Dss.Open.R + JR NZ,.RD_ONLY + SET 7,(IY + _sFM.ACCESS_MODE) + SET 5,(IY + _sFM.FS_REC.ATTRIBUT) + LD A,(IY + _sFM.DRIVE) + CALL OPENDSK + JR C,.ERR1 + CALL GET_OFFSET_IN_SECTORS + ; ;Расчёт смещения в секторах ;!HARDCODE sector size + ; LD H,0 ;!HARDCODE max file size = 8 gb + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD C,(IY+_sFM.F_POSITION) + ; RR L + ; RR D + ; RR E + ; ;HL:DE FP (in sectors) + ; ;BC FP residue (in bytes) + ; ; + ; OR C + JP NZ,.WOV1 + ; +.WOV4: POP BC + PUSH BC + SRL B + JR Z,.WOV2 + PUSH HL + PUSH DE + PUSH BC +.R_POINT+2: LD IX,0 + CALL BLOK_WRITE + POP BC + JR C,.ERR3 + LD C,B + LD HL,(.R_POINT) + LD DE,#0200 ;!HARDCODE +.WOV5: ADD HL,DE + DJNZ .WOV5 + ; B=0 + LD (.R_POINT),HL + ;LD B,0 + POP HL + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC +.WOV2: POP BC + LD A,B + AND #01 + LD B,A + OR C + JR Z,.WOV6 + PUSH HL + PUSH DE + PUSH BC + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + LD DE,CORE_BUFFERS.BUFFER + LD HL,(.R_POINT) + POP BC + JP C,.ERR2 + LDIR + LD (.R_POINT),HL + POP DE + POP HL + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WRITE + POP BC + LD C,SLOT3 + OUT (C),B + RET C +.WOV6: LD HL,(.R_POINT) +.S_POINT+1: LD DE,0 + ; CF=0 + ;AND A + SBC HL,DE + PUSH HL + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + CALL MOVE_CP + POP DE + RET NC ; Если размер файла на диске НЕ стал больше, чем был + ; Если размер файла на диске стал больше, чем был + LD L,(IY + _sFM.F_POSITION+0) + LD H,(IY + _sFM.F_POSITION+1) + LD C,(IY + _sFM.F_POSITION+2) + LD B,(IY + _sFM.F_POSITION+3) + LD (IY + _sFM.FS_REC.F_SIZE+0),L + LD (IY + _sFM.FS_REC.F_SIZE+1),H + LD (IY + _sFM.FS_REC.F_SIZE+2),C + LD (IY + _sFM.FS_REC.F_SIZE+3),B + AND A + RET + ; +.WOV1: PUSH BC + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + POP DE + POP HL + EXX + POP DE + JP C,.ERR1 + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.WOV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +.WOV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + EX DE,HL + LDIR + LD (.R_POINT),HL + EXX + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WRITE + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR2 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + JP .WOV4 ; \ No newline at end of file diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 05ebab6..1967ee6 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -131,6 +131,7 @@ DISKINF:; [ ] 22/11/23 LD HL,2 LD BC,0 .FRESP: PUSH BC + ; [ ] fat32 CALL READ_FROM_FAT POP BC CP DSS_Error.sys.DISK_FULL diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 3585f13..693bf5e 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -94,7 +94,6 @@ SET_FM: CALL FM_FIND XOR A ;LD A,DSS_Error.sys.NO_ERROR ; CF = 0 RET - RES_FM: CALL FM_FIND diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 71eb2a6..db4128c 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -446,6 +446,3 @@ CHECK_NAME: SCF RET ;----------------------------------------------------------------------; - - - diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 9c2a42f..417f7ba 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -297,7 +297,7 @@ ADRST10: ;DS 512 ;,0 ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 - DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D + DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B @@ -324,7 +324,7 @@ ADRST10: ;DS 512 ;,0 ;...............................................[HIGH ADDRESS]: DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ - DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN + DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 0e758b9..8370fe9 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -170,7 +170,7 @@ SEARCH: ;----------------------------------------------------------------------; ; FIND "MASKAREA" IN DIRECTORY -; [ ] fat32 +; [x] fat32 ;!TEST ; выход: IY:DE - cluster number FINDDIR: SET_PAGE_X DIRPAGE @@ -292,7 +292,7 @@ FINDDIR: ; .MM3: LD (HL),0 ; ; JP IT_DIR ; -.IT_DIR: ; [ ] fat32 +.IT_DIR:; fat32 LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1) LD YH,D @@ -338,7 +338,7 @@ CHECK_ZERO_CLUSTER: ;----------------------------------------------------------------------; ; вход: HL - имя директории -; [x] fat32 +; [x] fat32 ;!TEST OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD A,(HL) OR A @@ -392,8 +392,8 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF .SUBDIR3: CALL FINDDIR RET C EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32 - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; [ ] fat32 + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; fat32 + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; fat32 LD HL,#4000 ;!HARDCODE LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL ;EX DE,HL diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index e0665fb..8d29b55 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -610,7 +610,7 @@ GET_FAT16_CELL: AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH @@ -1220,6 +1220,50 @@ SaveGotCluster: LD A,C RET //////////////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------; +; Вход: HL - адрес куда писать +; Выход: HL - адрес следующий после записаного +WRITE_DATE_TIME_TO_DIRECTORY_RECORD: + ; [ ] fat32 & VFAT date + PUSH HL + CALL SYSTIME ; узнать тек. дату и время + CALL MK_TIME ; закодировать время/дату + POP HL + ; _sFAT_DIRECTORY_RECORD.TIME + LD (HL),E ; de=время + INC HL + LD (HL),D + INC HL + ; _sFAT_DIRECTORY_RECORD.DATE + LD (HL),C ; день + INC HL + LD (HL),B ; месяц + INC HL + RET +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; +;Расчёт смещения в секторах ;!HARDCODE sector size +GET_OFFSET_IN_SECTORS: + LD H,0 ;!HARDCODE max file size = 8 gb + LD E,(IY+_sFM.F_POSITION+1) + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD A,E + AND #01 + LD B,A + LD C,(IY+_sFM.F_POSITION) + RR L + RR D + RR E + ;HL:DE FP (in sectors) + ;BC FP residue (in bytes) + ; + OR C + RET +;----------------------------------------------------------------------; + ;!TODO fat32 ;======================================================================= diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 3934e8c..ca9cbe3 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -35,22 +35,28 @@ ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED ; .TIME: WORD #0000 ;+ #16 +22 TIME ; .DATE: WORD #0000 ;+ #18 +24 DATE -; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ;!TODO fat32 +; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE .FS_REC: _sFAT_DIRECTORY_RECORD ; from Core .F_POSITION: DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) -.DIR_CLUSTER: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER -.HANDLE: WORD #0000 ;+ #26 +38 HANDLE NUMBER -.DRIVE: BYTE #00 ;+ #28 +40 DRIVE OR CURRENT -.ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE признак изменения файла -.TASK_NUM: BYTE #00 ;+ #2A +42 TASK -.OptimizedClusters BYTE #00 ;+ #2B +43 -.KnownCluster_L: WORD #0000 ;+ #2C +44 Младшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: WORD #0000 ;+ #2E +46 Старшее слово номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: WORD #0000 ;+ #30 +48 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: WORD #0000 ;+ #32 +50 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.DIR_CLUSTER_L: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW +.DIR_CLUSTER_H: WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32 +.HANDLE: WORD #0000 ;+ #28 +40 HANDLE NUMBER +.DRIVE: BYTE #00 ;+ #2A +42 DRIVE OR CURRENT +.ACCESS_MODE: BYTE #00 ;+ #2B +43 ACCESS MODE +.TASK_NUM: BYTE #00 ;+ #2C +44 TASK +.OptimizedClusters BYTE #00 ;+ #2D +45 +.KnownCluster_L: WORD #0000 ;+ #2E +46 Младшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: WORD #0000 ;+ #30 +48 Старшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS +;ACCESS MODE: A=0 чтение/запись +; A=1 чтение +; A=2 запись +; ;!TODO A=3 запись без лишних сохранений кэша FAT +; ;!TODO A=4 записать кэш FAT ; ; diff --git a/DSS/build.txt b/DSS/build.txt index 1307450..397787a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -956 \ No newline at end of file +949 \ No newline at end of file