From 8448dbef48e76a446a68c9c4b68bb5613f31b36d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 7 Apr 2024 05:28:29 +1000 Subject: [PATCH] 82% --- DSS/API/diskINF.asm | 294 ++++++++++++++++++++++++------------------- DSS/FS/FAT/FAT.asm | 30 +++-- DSS/FS/FAT/FAT_X.asm | 2 +- 3 files changed, 183 insertions(+), 143 deletions(-) diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 1967ee6..d710756 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -5,8 +5,9 @@ ; ; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий) ; При A bit7 = 1: -; HL - буфер (256 байтов) для расширенных данных: -; B != 0 - считать свободное место +; A and #7F - номер диска +; HL - буфер (256 байтов) для расширенных данных: +; B != 0 - считать свободное место ; ; ; размер поля - 1 байт ; Файловая система @@ -23,134 +24,167 @@ ; размер поля - 1 байт ; зарезервировано ; ; - -; A and #7F - номер диска -; -; выход: A - размер кластера в секторах, если CF=0 -; HL - общее кол-во кластеров -; DE - свободных кластеров -; BC - размер сектора в байтах -; A - код ошибки, если CF=1 +; выход: CF=0: +; A - размер кластера в секторах +; HL':HL - общее кол-во кластеров +; DE':DE - свободных кластеров +; BC - размер сектора в байтах +; CF=1: +; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// -DISKINF:; [ ] 22/11/23 подфункция с доп.инфой - LD C,B - LD B,1 - ; - CP #80 - JR C,.CustomDisk - CP #FF - JR Z,.CurrentDisk - ; more info - LD B,C - AND %0111'1111 - PUSH HL - PUSH AF - CALL .CustomDisk - POP IX - JR C,.error - ; - EX (SP),HL - PUSH DE - PUSH AF - PUSH BC - ;;;; - ; - EX DE,HL - LD HL,CORE_BUFFERS.BootSector.ID_FAT - LD A,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length - CALL .mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER - LD A,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER - CALL .mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_LABEL - LD A,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL - CALL .mCOPY_LOOP - ; - PUSH DE - LD A,XH - LD DE,Dss.DRV.GenIOCTL.Enter - LD BC,Dss.DRV.GenIOCTL.GetParams - RST ToDSS.DRV - POP DE - JR C,.error_drv - LD A,2 ;!HARDCODE длина поля №4 2 байта: физ номер диска, номер раздела диска - LD (DE),A - INC DE - EX AF,AF' - LD (DE),A ;физ номер диска - INC DE - LD A,C - LD (DE),A ;номер раздела диска - INC DE - ; -.error_drv: - XOR A - LD (DE),A - ;;;; - POP BC - POP AF - POP DE -.error: POP HL - RET - ; - - ;CP #FF ; !FIXIT WorkDirectory - ;!TEST Current Dir - ;JR Z,CURRDS ;R06 -.CurrentDisk: - LD A,(CurrentPath) - SUB 'A' - LD HL,FatBuffer.DRIVE - CP (HL) - JR Z,.CheckFreeSpace - ; -.CustomDisk: - PUSH BC - CALL CHNDISK ;R06 - POP BC - RET C - ; +DISKINF: LD C,B + LD B,1 + ; + CP #80 + JR C,.CustomDisk + CP #FF + JR Z,.CurrentDisk + ; more info + LD B,C + AND %0111'1111 + PUSH HL + PUSH AF + CALL .CustomDisk + POP IX + JR C,.error + ; + EX (SP),HL + PUSH DE + PUSH AF + PUSH BC + ;;;; + ; + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + ; + EX DE,HL + LD HL,CORE_BUFFERS.BootSector.ID_FAT + JR NZ,1F + LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.ID_FAT +1: LD C,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + CALL .mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER + JR NZ,1F + LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_SERIAL_NUMBER +1: LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER + CALL .mCOPY_LOOP + ; + LD HL,CORE_BUFFERS.BootSector.BPB_LABEL + JR NZ,1F + LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_LABEL +1: LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL + CALL .mCOPY_LOOP + ; fat32 + EXX + PUSH DE + PUSH HL + EXX + PUSH DE + LD A,XH + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + POP DE + ; fat32 + EXX + POP HL + POP DE + EXX + JR C,.error_drv + LD A,2 ;!HARDCODE длина поля №4 2 байта: физ номер диска, номер раздела диска + LD (DE),A + INC DE + EX AF,AF' + LD (DE),A ;физ номер диска + INC DE + LD A,C + LD (DE),A ;номер раздела диска + INC DE + ; +.error_drv: XOR A + LD (DE),A + ;;;; + POP BC + POP AF + POP DE +.error: POP HL + RET + ; + CP #FF ; !FIXIT WorkDirectory + ;!TEST Current Dir + ;JR Z,CURRDS ;R06 +.CurrentDisk: LD A,(CurrentPath) + SUB 'A' + LD HL,FatBuffer.DRIVE + CP (HL) + JR Z,.CheckFreeSpace + ; +.CustomDisk: PUSH BC + CALL CHNDISK ;R06 + POP BC + RET C + ; .CheckFreeSpace: - XOR A - OR B - CALL NZ,.CURRDS - ; - ;.FRESP2: - LD D,B - LD E,C - LD HL,(FatBuffer.MaxClusterLow) - DEC HL - LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - AND A - RET - ; -.CURRDS: - LD HL,2 - LD BC,0 -.FRESP: PUSH BC - ; [ ] fat32 - CALL READ_FROM_FAT - POP BC - CP DSS_Error.sys.DISK_FULL - RET Z - - LD A,E - OR D - JR NZ,.skip - INC BC -.skip: INC HL - JP .FRESP - ; - ; [ ] 22/11/23 подфункция с доп.инфой -.mCOPY_LOOP: - LD C,A - LD B,0 - LD (DE),A - INC DE - LDIR - RET - ; + XOR A + OR B + CALL NZ,.GetFreeSpace + ; + ;.FRESP2: + LD D,B + LD E,C + LD HL,(FatBuffer.MaxClusterLow) + DEC HL + ; fat 32 + EXX + LD HL,(FatBuffer.MaxClusterHigh) + DEC HL + EXX + LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + AND A + RET + ; +.GetFreeSpace: XOR A + LD HL,2 ; [ ] fat32 ? номер кластера от которого считать + ; fat32 + EXX + LD H,A + LD L,A + EXX + LD B,A + LD C,A +.loop_free_space: + PUSH BC + CALL READ_FROM_FAT + POP BC + CP DSS_Error.sys.DISK_FULL + RET Z + ; fat 32 + EXX + LD A,E + OR D + EXX + OR E + OR D + JR NZ,.skip + INC BC + LD A,B + OR C + JR NZ,.skip + EXX + INC BC + EXX +.skip: INC HL + JR .loop_free_space + ; + ; [ ] 22/11/23 подфункция с доп.инфой +.mCOPY_LOOP: LD B,0 + EX DE,HL + LD (HL),C + EX DE,HL + INC DE + LDIR + RET + ; ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 8370fe9..56dd5cc 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -690,7 +690,9 @@ RD_BPB: LD C,SLOT3 LD C,A LD B,0 ; BC - File handels in sectors ;;;; - LD (FatBuffer.FilesPerSector),A + IF COMPILE_UNUSED_CODE + LD (FatBuffer.FilesPerSector),A + ENDIF ; EX DE,HL LD HL,(CORE_BUFFERS.BootSector.FilesInRootDIR) ; 0 for fat32 @@ -723,15 +725,17 @@ RD_BPB: LD C,SLOT3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - EX DE,HL - LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize - XOR A + IF COMPILE_UNUSED_CODE + EX DE,HL + LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize + XOR A ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -.loop4: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,DE - JR NC,.loop4 - LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) +.loop4: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,DE + JR NC,.loop4 + LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) + ENDIF ; ;!TODO detect fat type by clusters! ;[ ] fat32 reset fat32 variables @@ -873,7 +877,6 @@ FatBuffer: .CacheBlock: DW #00 .CacheUpdated: DB #00 ;.SectorsPerBank: DB #00 -.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? .RootDirStartCluster_L: DW #0000 .RootDirStartCluster_H: DW #0000 ; [ ] fat32 .FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) @@ -884,15 +887,18 @@ FatBuffer: .SectorsPerFAT_H DB #00 .RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR -.FilesPerSector: DB #00 ; число файловых записей в секторе .DirSizeInSectors: DB #00 ; DIR_SEC_SIZE .FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low -.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ; [ ] fat32 +.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига .BytesPerCluster: DW #0000 ; CLUSTER_LEN .ENDCLUS_LOW: DW #FFFF .ENDCLUS_HIGH: DW #0FFF ; [ ] fat3 .MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) .MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) + IF COMPILE_UNUSED_CODE +.FilesPerSector: DB #00 ; число файловых записей в секторе +.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? + ENDIF ;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? ; diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 8d29b55..cc2fe84 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -1224,7 +1224,7 @@ SaveGotCluster: LD A,C ; Вход: HL - адрес куда писать ; Выход: HL - адрес следующий после записаного WRITE_DATE_TIME_TO_DIRECTORY_RECORD: - ; [ ] fat32 & VFAT date + ; [ ] VFAT date PUSH HL CALL SYSTIME ; узнать тек. дату и время CALL MK_TIME ; закодировать время/дату