//////////////////////////////////////////////////////////////////////// ; Функция #11. Открытие файла. ; ; вход: HL - указатель на имя файла ; A - режим доступа: ; A=0 чтение/запись ; A=1 чтение ; A=2 запись ; ;!TODO A=3 запись без лишних сохранений кэша FAT ; ;!TODO A=4 записать кэш FAT ; выход: CF=0, A - дескриптор файла. ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// OPEN_FN: ; Current Dir 15/10/23 ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO LD (.TMP),A PUSH HL CALL DIR_PATH_CHECK.forceCheck POP HL RET C ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; ;.start: ; CALL SetPath_GetName RET C CALL MASK RET C .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C ; .FM: ; enter point from ATTRIB ;R002 ;!TEST 9/11/23 record index PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) ; CALL GET_FM ;!TEST 9/11/23 record index указатель на запись в каталоге FS POP DE ; 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,CORE_BUFFERS.HANDBUF LD BC,CORE_BUFFERS.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,(CORE_BUFFERS.FS_Buffer.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 ; PUSH IY POP HL LD DE,_sFM.F_POSITION ADD HL,DE XOR A LD (HL),A ; _sFM.F_POSITION INC HL LD (HL),A ; _sFM.F_POSITION + 1 INC HL LD (HL),A ; _sFM.F_POSITION + 2 INC HL LD (HL),A ; _sFM.F_POSITION + 3 INC HL ; EX DE,HL LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L LDI ; _sFM.DIR_CLUSTER_L LDI ; _sFM.DIR_CLUSTER_L + 1 LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H LDI ; _sFM.DIR_CLUSTER_H LDI ; _sFM.DIR_CLUSTER_H + 1 EX DE,HL ; INC HL INC HL LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD (HL),A ; _sFM.DRIVE INC HL INC HL LD A,(TASK) LD (HL),A ; _sFM.TASK_NUM INC HL ; XOR A LD (HL),A ; _sFM.OptimizedClusters INC HL LD (HL),A ; _sFM.KnownCluster_L INC HL LD (HL),A ; _sFM.KnownCluster_L + 1 INC HL LD (HL),A ; _sFM.KnownCluster_H INC HL LD (HL),A ; _sFM.KnownCluster_H + 1 INC HL LD (HL),A ; _sFM.KnownOffset_L INC HL LD (HL),A ; _sFM.KnownOffset_L + 1 INC HL LD (HL),A ; _sFM.KnownOffset_H INC HL LD (HL),A ; _sFM.KnownOffset_H + 1 ; ; EX AF,AF' AND A RET ;