;███████████████████████████████████████████████████████████████████████ ;████████████████████████████████ DATA █████████████████████████████████ ;███████████████████████████████████████████████████████████████████████ ;----------------------------------------------------------------------- MODULE CONSTANTS FAT16 EQU 2 ; заодно и множитель FAT12 EQU 3 ; заодно и множитель FAT32 EQU 4 ; заодно и множитель ; FilesInRootDIR: .FDD_DD EQU 112 .FDD_HD EQU 224 .HDD EQU 512 ; FAT_ReservedSectors: .FAT EQU 1 .FAT32 EQU 32 ENDMODULE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- MACRO FAT_TYPES_LINE vol_size, clu_size, fat_type WORD vol_size, clu_size BYTE fat_type ENDM MODULE TABLES ; VOL SIZE CLUSTER SIZE FAT TYPE FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768 FAT_TYPES_LINE #0400, 16384, CONSTANTS.FAT32 ; 16384..32768 Mb FAT_TYPES_LINE #0200, 8192, CONSTANTS.FAT32 ; 8192..16384 Mb FAT_TYPES_LINE #0100, 4096, CONSTANTS.FAT32 ; 4096..8192 Mb FAT_TYPES_LINE #0080, 32768, CONSTANTS.FAT16 ; 2048..4096 Mb FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..2048 Mb FAT_TYPES_LINE #0020, 8192, CONSTANTS.FAT16 ; 511..1023 Mb FAT_TYPES_LINE #0010, 4096, CONSTANTS.FAT16 ; 256..511 Mb FAT_TYPES_LINE #0008, 2048, CONSTANTS.FAT16 ; 128..256 Mb FAT_TYPES_LINE #0004, 1024, CONSTANTS.FAT16 ; 64..128 Mb FAT_TYPES_LINE #0002, 512, CONSTANTS.FAT16 ; 32..64 Mb ; если меньше, то FAT12 .LineSize EQU 5 .Records EQU ($ - FAT_TYPES)/.LineSize ENDMODULE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- VARIABLES EQU $ .FAT_TYPE BYTE CONSTANTS.FAT12 ; [x] .CurrentDrive DB #FF ; [x] .VOLUME_SIZE_BYTES BLOCK 5,0 ; [ ] ;.FatFDD_ReservedSectors WORD 1 ;.FatHDD_ReservedSectors WORD 8 ;.Fat32_ReservedSectors WORD 32 .ReservedSectors WORD 0 ; [ ] .RootDirSectors D24 0 ; [ ] .NotUsedSpace BYTE 0 ; in sectors .total_clusters_L: WORD 0 ; [x] .total_clusters_H: WORD 0 ; [x] .FAT32_RootDirClusters WORD 1 ; [ ] .FAT.LABEL BYTE 'NO_LABEL ' ; [ ] .DriveExtendedParameters BYTE 0 ; [ ] .DataSectors_L WORD 0 ; [ ] .DataSectors_H WORD 0 ; [ ] .RootDirFirstSector_L WORD 0 ; [x] вычисляется в FORMAT_DRIVE .RootDirFirstSector_H WORD 0 ; [x] вычисляется в FORMAT_DRIVE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- MODULE KEYS_PARAMETERS STRUCT KEYS_STR .Status BYTE 0 ; Статус ключа .Key BYTE 0 ; Ключ .Data WORD 0 ; Данные .Procedure WORD 0 ; обработчик ENDS MACRO KEY_DATA key?, proc? ; BYTE 0 ; Статус ключа ; BYTE key? ; Ключ ; WORD 0 ; Данные ; WORD proc? ; обработчик KEYS_STR 0, key?, 0, proc? ENDM ;-----------------------; TABLE: EQU $ ; ONLY_HELP KEY_DATA '?', SHOW_HELP ; [ ] BYTE ; вывод справки LABEL KEY_DATA 'l', SET_LABEL ; [ ] WORD ; ссылка на процедуру инита метки FAT_TYPE KEY_DATA 't', GET_KEY_FAT ; [ ] BYTE ; SectorsPerCluster: KEY_DATA 'c', STRING_TO_WORD ; [ ] BYTE ; FilesInRootDIR: KEY_DATA 'd', STRING_TO_WORD ; [ ] WORD ; Number_of_FATs: KEY_DATA 'n', STRING_TO_WORD ; [ ] BYTE ; RESERVED_SECTORS: KEY_DATA 'r', STRING_TO_WORD ; [ ] WORD ; LOW_FORMAT KEY_DATA 'u', 0 ; [ ] BYTE ; для дискет BytesPerSector KEY_DATA 's', STRING_TO_WORD ; [ ] WORD ; ; TABLE.Size EQU $-TABLE TABLE.Elements EQU TABLE.Size / KEYS_STR ;-----------------------; ; ; статус Status.Off EQU 0 Status.On EQU 1 Status.Ignored EQU 2 ; Статус ключа: ; 0 - не установлен ; 1 - установлен ; 2 - игнорируется /* FilesInRootDIR Для томов FAT12 и FAT16 это значение всегда должно указывать на количество, которое при умножении на 32 дает четное число, кратное BPB_BytsPerSec. Для максимальной совместимости для томов FAT16 следует использовать значение 512. */ ENDMODULE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ; root_dir_sectors = ((root_dir_entries * 32) + (bytes_per_sector - 1)) / bytes_per_sector FAT_PARAMETERS: .PART1 EQU $ ; .JMP: BYTE #EB,#FE,#00 ; [x] opcode jmp $ .ID_NAME BYTE "DDF " ; DSS Drive Formatter .ID_NAME_VER BYTE "0." .ID_NAME_MOD BYTE "00" .BytesPerSector: WORD #200 ; predefined ; [x] .SectorsPerCluster: BYTE 0 ; [x] .RESERVED_SECTORS: WORD 0 ; [x] .Number_of_FATs: BYTE 2 ; predefined ; [x] .FilesInRootDIR: WORD 0 ; FAT32 constant ; [x] .SectorsPerDrive: WORD 0 ; FAT32 constant ; [x] +- .DRIVE_TYPE: BYTE 0 ; ; [x] +- .SectorsPerFAT16: WORD 0 ; FAT32 constant ; [x] .SectorsPerTrack WORD 9 ; BPB_SecPerTrk ; [x] .HEADS WORD 2 ; [x] .HIDDEN DWORD 0 ; от начала MBR, extMBR ; [x] .BPB_BIG_TOTAL_SECTORS_L WORD 0 ; [x] +- .BPB_BIG_TOTAL_SECTORS_H WORD 0 ; [x] +- .PART1_SIZE EQU $ - .PART1 ; FAT 12, FAT 16 .PART2_FAT12_16 EQU $ ; .BPB_PHISICAL_DRIVE_NUMBER BYTE #80 ; [x] .reserved_1 BYTE 0 ; predefined ; ; .FAT.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ; ; .FAT.SERIAL_NUMBER DWORD 0 ; ; .FAT.LABEL DB 'NO_LABEL ' ; ; .ID_FAT DB 'FAT16 ' ; .PART2_FAT12_16_SIZE EQU $ ; FAT32 .PART2_FAT32 EQU $ ; .SectorsPerFAT32 DWORD 0 ; [x] ;!TODO error если старший байт !=0 .MainFATnumber WORD 0 ; BPB_ExtFlags ; .Version WORD 0 ; constant ; .RootDirStartCluster DWORD 2 ; FIXED! используется в формуле .FSINFO_Sector WORD 1 ; constant ; .CopyBootSector WORD 6 ; constant ; .reserved_block: BLOCK 12 ; constant ; .FDD_Number BYTE 0 ; [x] .reserved_2: BYTE 0 ; constant ; ; .FAT32.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ; ; .FAT32.SERIAL_NUMBER DWORD 0 ; ; .FAT32.LABEL DB 'NO_LABEL ' ; ; .ID_FAT32 DB 'FAT32 ' ; .PART2_FAT32_SIZE EQU $ - .PART2_FAT32 ; SHARED .PART3_SHARED EQU $ ; .EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ; .SERIAL_NUMBER_1 WORD 0 ; [x] .SERIAL_NUMBER_2 WORD 0 ; [x] .LABEL DB 'NO_LABEL ' ; [x] .LABEL.Size EQU $-.LABEL .ID_FAT DB 'FAT32 ' ; [ ] .PART3_SHARED_SIZE EQU $ - .PART3_SHARED ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ;-----------------------------------------------------------------------