;///////////////////////////////////////////////////////////////////// ; [ ] новая подфункция с битом 7 в рег. А ; Возвращает информацию об общем и свободном пространстве дискового ; устройства. ; ; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий) ; При A bit7 = 1: ; HL - буфер (256 байтов) для расширенных данных: ; B != 0 - считать свободное место ; ; ; размер поля - 1 байт ; Файловая система ; ; ; размер поля - 1 байт ; Серийный номер диска ; ; ; размер поля - 1 байт ; Метка диска ; ; ; размер поля - 1 байт ; физический номер диска, номер раздела ; ; ; размер поля - 1 байт ; зарезервировано ; ; ; A and #7F - номер диска ; ; выход: A - размер кластера в секторах, если CF=0 ; HL - общее кол-во кластеров ; DE - свободных кластеров ; BC - размер сектора в байтах ; 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_SEC.ID_FAT.length CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_LABEL LD A,11 ;!HARDCODE _sBOOT_SEC.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 ; .CheckFreeSpace: ; XOR A OR B CALL NZ,.CURRDS ; ; .FRESP2: LD D,B LD E,C LD HL,(FAT_Max_Cluster) DEC HL LD BC,(CORE_BUFFERS.BootSector.B_P_S) LD A,(CORE_BUFFERS.BootSector.S_P_C) AND A RET ; .CURRDS: LD HL,2 LD BC,0 .FRESP: PUSH BC CALL R_F_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 ; ;