;///////////////////////////////////////////////////////////////////// ; [ ] новая подфункция с битом 7 в рег. А ; Возвращает информацию об общем и свободном пространстве дискового ; устройства. ; ; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий) ; При A bit7 = 1: ; A and #7F - номер диска ; HL - буфер (256 байтов) для расширенных данных: ; B != 0 - считать свободное место ; ; ; размер поля - 1 байт ; Файловая система ; ; ; размер поля - 1 байт ; Серийный номер диска ; ; ; размер поля - 1 байт ; Метка диска ; ; ; размер поля - 1 байт ; физический номер диска, номер раздела ; ; ; размер поля - 1 байт ; зарезервировано ; ; ; выход: CF=0: ; A - размер кластера в секторах ; HL':HL - общее кол-во кластеров ; DE':DE - свободных кластеров ; BC - размер сектора в байтах ; CF=1: ; A - код ошибки, если CF=1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Метка диска проверяется сначала в корневом каталоге и если там ; ; нет, то берётся метка из BPB ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;///////////////////////////////////////////////////////////////////// DISKINF: LD C,B LD B,1 ; CP #80 JP 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,FAT_STRING ;!HARDCODE FAT FS LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.next_prm ; PUSH DE DEC DE LD A,'6' JR Z,.put_char ; fat 32 DEC DE LD A,'3' .put_char: LD (DE),A POP DE ; .next_prm: LD HL,CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; ; fat32 EXX PUSH DE PUSH HL EXX ;LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL PUSH IX CALL GET_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP POP AF 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: EX AF,AF' XOR A LD (DE),A ;;;; POP BC POP AF POP DE EX AF,AF' JR C,.error EX AF,AF' .error: POP HL RET ; .CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath) SUB 'A' LD HL,CORE_BUFFERS.FS_Buffer.DRIVE CP (HL) JR Z,.CheckFreeSpace ; .CustomDisk: PUSH BC CALL CHDISK ;R06 POP BC RET C ; .CheckFreeSpace:; если GetFreeSpace не вызывается XOR A OR B LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L) EXX LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H) EXX CALL NZ,GetFreeSpace ; ;.FRESP2: ; A = 0 if B != 0 before .GetFreeSpace ; LD H,B LD L,C LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL EX DE,HL EXX LD H,B LD L,C LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL EX DE,HL EXX LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow) DEC HL ; fat 32 EXX LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh) JR NC,.skip_dec_hl DEC HL .skip_dec_hl: EXX LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector) LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) AND A RET ; ; [ ] 22/11/23 подфункция с доп.инфой .mCOPY_LOOP: LD B,0 EX DE,HL LD (HL),C EX DE,HL INC DE LDIR RET ; ; GetFreeSpace: LD A,1 LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A LD HL,2 ; fat32 номер кластера от которого считать XOR A ; fat32 EXX LD H,A LD L,A LD B,A LD C,A EXX LD B,A LD C,A .loop_free_space:;!FIXIT PUSH BC EXX PUSH BC EXX CALL READ_FROM_FAT EXX POP BC EXX 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 LD A,L OR H JR NZ,.loop_free_space EXX INC HL EXX JP .loop_free_space ; FAT_STRING: DB 'FAT12' ; ; DE - буфер GET_LABEL: PUSH DE LD HL,.LABEL_MASK ; "\*.*" имя метки LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома LD B,high Dss.F_First.FATname CALL F_FIRST POP DE .from_BPB: LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL RET C ; [ ] 07/03/2025 костыль для атрибута 0. Настоял Савелий)) LD HL,BUFFER_FIND.REC_Attr ADD HL,DE LD A,(HL) OR A SCF JR Z,.from_BPB ; LD HL,BUFFER_FIND.REC_Name ADD HL,DE RET .LABEL_MASK: DB '\*.*',0