diff --git a/format/data.z80 b/format/data.z80 index 9a76145..a3fd1f9 100644 --- a/format/data.z80 +++ b/format/data.z80 @@ -8,6 +8,11 @@ FAT16 EQU 2 ; FAT12 EQU 3 ; заодно и множитель FAT32 EQU 4 ; заодно и множитель ; +FilesInRootDIR: +.FDD_DD EQU 112 +.FDD_HD EQU 224 +.HDD EQU 512 +; FAT_ReservedSectors: .FDD EQU 1 .HDD EQU 8 @@ -24,17 +29,17 @@ FAT_ReservedSectors: MODULE TABLES ; VOL SIZE CLUSTER SIZE FAT TYPE -FAT_TYPES: FAT_TYPES_LINE #0800, 32768, FAT32 ; > 32768 - FAT_TYPES_LINE #0400, 16384, FAT32 ; 16384..32768 Mb - FAT_TYPES_LINE #0200, 8192, FAT32 ; 8192..16384 Mb - FAT_TYPES_LINE #0100, 4096, FAT32 ; 4096..8192 Mb - FAT_TYPES_LINE #0080, 32768, FAT16 ; 2048..4096 Mb - FAT_TYPES_LINE #0040, 16384, FAT16 ; 1023..2048 Mb - FAT_TYPES_LINE #0020, 8192, FAT16 ; 511..1023 Mb - FAT_TYPES_LINE #0010, 4096, FAT16 ; 256..511 Mb - FAT_TYPES_LINE #0008, 2048, FAT16 ; 128..256 Mb - FAT_TYPES_LINE #0004, 1024, FAT16 ; 64..128 Mb - FAT_TYPES_LINE #0002, 512, FAT16 ; 32..64 Mb +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 @@ -51,7 +56,7 @@ VARIABLES EQU $ ;.FatHDD_ReservedSectors WORD 8 ;.Fat32_ReservedSectors WORD 32 .ReservedSectors WORD 0 ; [ ] -.RootDirSectors WORD 0 ; [ ] +.RootDirSectors D24 0 ; [ ] .NotUsedSpace BYTE 0 ; in sectors .total_clusters_L: WORD 0 ; [x] .total_clusters_H: WORD 0 ; [x] @@ -111,7 +116,7 @@ FAT_PARAMETERS: .SectorsPerCluster: BYTE 0 ; [x] .RESERVED_SECTORS: WORD 0 ; [x] .Number_of_FATs: BYTE 2 ; predefined ; [x] -.FilesInRootDIR: WORD 0 ; FAT32 constant ; [ ] FAT ; [x] FAT32 +.FilesInRootDIR: WORD 0 ; FAT32 constant ; [x] .SectorsPerDrive: WORD 0 ; FAT32 constant ; [x] +- .DRIVE_TYPE: BYTE 0 ; ; [x] +- .SectorsPerFAT16: WORD 0 ; FAT32 constant ; [x] diff --git a/format/math.asm b/format/math.asm index 4aed939..fdb72ab 100644 --- a/format/math.asm +++ b/format/math.asm @@ -52,6 +52,27 @@ DEBCxA: LD HL,0 ;----------------------------------------------------------------------- +;----------------------------------------------------------------------- +AHL_RL_B: SLA L + RL H + RLA + JP C,STOP_ERROR + DJNZ AHL_RL_B + RET +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +AHL_RR_B: AND A +.loop: RRA + RR H + RR L + JP C,STOP_ERROR + DJNZ .loop + RET +;----------------------------------------------------------------------- + + ;----------------------------------------------------------------------- ;HLIX/BC -> HLIX remainder DE HLIX_div_BC: EX DE,HL diff --git a/format/new_format.asm b/format/new_format.asm index 888116e..4d08253 100644 --- a/format/new_format.asm +++ b/format/new_format.asm @@ -112,7 +112,7 @@ MAKE_AUTO: LD (STOP_ERROR.Save_SP),SP CALCULATE_FAT: CALL .STEP1 ; эта должна быть общей для заполнения геометрии диска ; Автоматический выбор FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster CALL .STEP2 - ; дальше устанавливаем геометрию. Уже должен быть выбран тип FAT + ; RESERVED_SECTORS, RootDir, дальше устанавливаем геометрию. Уже должен быть выбран тип FAT CALL .STEP3 CALL MAKE_SERIAL RET @@ -177,7 +177,7 @@ CALCULATE_FAT: CALL .STEP1 ; ;--------------; -; Автоматический выбор FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster +; Автоматический выбор FAT_TYPE, SectorsPerCluster .STEP2: CALL AUTO_CHOOSE_FAT_PARAMS JR C,STOP_ERROR ; @@ -204,57 +204,7 @@ CALCULATE_FAT: CALL .STEP1 ; JR C,STOP_ERROR ; LD (FAT_PARAMETERS.SectorsPerCluster),A - - - - - - - TODO - - - - - - LD A,(VARIABLES.FAT_TYPE) - CP CONSTANTS.FAT32 - LD HL,CONSTANTS.FAT_ReservedSectors.FAT32 - JR Z,.set_RS - ; - LD A,(KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Status) - AND A - LD HL,(KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Data) - JR NZ,.set_RS - ; - LD A,(FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER) - SRL A - LD HL,CONSTANTS.FAT_ReservedSectors.FDD - JR Z,.set_RS - LD HL,CONSTANTS.FAT_ReservedSectors.HDD - - - - - LD HL,CONSTANTS.FAT_ReservedSectors.HDD - JR Z,.next_RS - LD HL,CONSTANTS.FAT_ReservedSectors.HDD - - ; - ; - LD HL,CONSTANTS.FAT_ReservedSectors.HDD - - - - - -.set_RS: LD (VARIABLES.ReservedSectors),HL - LD (FAT_PARAMETERS.RESERVED_SECTORS),HL - - RET - ; -.choose_RS: LD HL,CONSTANTS.FAT_ReservedSectors.FDD - ;--------------; @@ -274,11 +224,16 @@ CALCULATE_FAT: CALL .STEP1 ; ; FAT_PARAMETERS.DRIVE_TYPE ; FAT_PARAMETERS.SectorsPerFAT16 ; FAT_PARAMETERS.SectorsPerFAT32 +; FAT_PARAMETERS.RESERVED_SECTORS +; FAT_PARAMETERS.FilesInRootDIR .STEP3: CALL GET_DRIVE_TYPE JR C,STOP_ERROR ; LD A,B LD (FAT_PARAMETERS.DRIVE_TYPE),A + ; + CALL SET_RESERVED_AND_ROOTDIR + ; LD HL,(FAT_PARAMETERS.SectorsPerDrive) LD A,H OR L @@ -292,6 +247,7 @@ CALCULATE_FAT: CALL .STEP1 ; LD HL,(CALC_TOTAL_CLUSTERS.fat_size_l) LD A,(VARIABLES.FAT_TYPE) CP CONSTANTS.FAT32 + LD DE,"32" JR Z,.it_is_fat32 ; LD (FAT_PARAMETERS.SectorsPerFAT16),HL @@ -322,15 +278,45 @@ STOP_ERROR: ; (VARIABLES.total_clusters_H) ; (CALC_TOTAL_CLUSTERS.fat_size_l) ; (CALC_TOTAL_CLUSTERS.fat_size_h) - CALC_TOTAL_CLUSTERS: - ; calc rootdir sectors LD A,(VARIABLES.FAT_TYPE) SUB CONSTANTS.FAT32 - LD B,A - LD C,A - JR Z, - + JR Z,.no_root_dir + ; calc rootdir sectors + LD HL,(FAT_PARAMETERS.FilesInRootDIR) + XOR A + LD B,5 ; AHL<<5 = AHL*32 + CALL AHL_RL_B + ; B=0 + PUSH HL + POP IX + LD H,B + LD L,A + LD BC,(FAT_PARAMETERS.BytesPerSector) +;HLIX/BC -> HLIX remainder DE + CALL HLIX_div_BC + LD A,D + OR E + JR Z,.no_plus_one + ; + LD BC,1 + ADD IX,BC + DEC C + ADC HL,BC +.no_plus_one: ; HL:IX - rootdir sectors + LD (VARIABLES.RootDirSectors),IX + LD A,L + LD (VARIABLES.RootDirSectors + 2),A + ; корректируем значение FilesInRootDIR + LD BC,(FAT_PARAMETERS.BytesPerSector) + LD DE,(VARIABLES.RootDirSectors) + CALL MUL32_POWER2 + LD A,L + EX DE,HL + LD B,5 ; AHL>>5 = AHL/32 + CALL AHL_RR_B + LD (FAT_PARAMETERS.FilesInRootDIR),HL +.no_root_dir: ; .t_sec_h+1: LD DE,0 .t_sec_l+1: LD HL,0 ; data_sectors @@ -343,7 +329,7 @@ CALC_TOTAL_CLUSTERS: AND A DEC DE .skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors - PUSH DE +.push_regs: PUSH DE PUSH HL ;num_fats * fat_sz32; fat_sz32 в кластерах .fat_size_l+1: LD BC,0 @@ -357,13 +343,14 @@ CALC_TOTAL_CLUSTERS: POP DE ;num_fats * fat_sz32 = BCDE ; - LD HL,(VARIABLES.RootDirSectors) ; !FIXIT написать процедуру вычисления RootDirSectors до вызова этой + LD HL,(VARIABLES.RootDirSectors) ADD HL,DE - JR NC,.skip_inc - ; - AND A - INC BC -.skip_inc: EX DE,HL + EX DE,HL + LD HL,(VARIABLES.RootDirSectors + 2) + LD H,0 + ADC HL,BC + LD B,H + LD C,L ;num_fats * fat_sz32 + root_dir_sectors = BC:DE ; POP HL @@ -439,13 +426,83 @@ CALC_TOTAL_CLUSTERS: ;----------------------------------------------------------------------- -;!TODO доделать для дискет +SET_RESERVED_AND_ROOTDIR: + LD A,(VARIABLES.FAT_TYPE) + CP CONSTANTS.FAT32 + JR Z,.for_fat32 + ; FAT12_16 + ; Ставим дефолтные значения + LD A,(FAT_PARAMETERS.DRIVE_TYPE) + CP BOOT_SECTOR.Hard_Drive + LD HL,CONSTANTS.FAT_ReservedSectors.HDD + LD DE,CONSTANTS.FilesInRootDIR.HDD + JR Z,.set_vars + ; #F0 + CP BOOT_SECTOR.Floppy_3x5_1x44 + LD HL,CONSTANTS.FAT_ReservedSectors.FDD + LD DE,CONSTANTS.FilesInRootDIR.FDD_HD + JR Z,.set_vars + ; #F9 + LD A,(VARIABLES.DriveExtendedParameters) + RLA + JR C,.set_vars ; 5.25 / 1200 + ; 720 + LD DE,CONSTANTS.FilesInRootDIR.FDD_DD +.set_vars: CALL .ChooseReserved + EX DE,HL + CALL .ChooseFilesInRootDIR + RET + ; +.for_fat32: LD A,(KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Status) + DEC A + JR NZ,.set_for_fat32 + ; + LD A,KEYS_PARAMETERS.Status.Ignored + LD (KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Status),A +.set_for_fat32: LD HL,CONSTANTS.FAT_ReservedSectors.FAT32 + LD DE,CONSTANTS.FilesInRootDIR.HDD + JR .set_vars + ; + ; +.ChooseFilesInRootDIR: + LD A,(KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Status) + DEC A + JR NZ,.noChangeRootDir + ; + LD HL,(KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Data) +.noChangeRootDir: + LD (FAT_PARAMETERS.FilesInRootDIR),HL + RET + ; + ; +.ChooseReserved: + LD A,(KEYS_PARAMETERS.RESERVED_SECTORS + KEYS_PARAMETERS.Status) + DEC A + JR NZ,.noChangeReserved + ; + LD HL,(KEYS_PARAMETERS.RESERVED_SECTORS + KEYS_PARAMETERS.Data) +.noChangeReserved: + LD (FAT_PARAMETERS.RESERVED_SECTORS),HL + RET +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- GET_DRIVE_TYPE: LD A,(FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER) - CP DRIVE_CODES.SPRINTER.ATA + AND A ; DRIVE_CODES.SPRINTER.FDD LD B,BOOT_SECTOR.Hard_Drive + RET NZ + ; FDD + LD A,(VARIABLES.DriveExtendedParameters) + RLA + LD B,BOOT_SECTOR.Floppy_3x5_720 + RET NC + ; + AND %0000'1000 + LD B,BOOT_SECTOR.Floppy_3x5_1x44 RET Z - ; дискеты и когда-нибудь ATAPI - SCF + ; + LD B,BOOT_SECTOR.Floppy_8_1x20 RET ;----------------------------------------------------------------------- @@ -630,7 +687,7 @@ FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER .loop32: INC HL LD (HL),E DJNZ .loop32 - INC Hl + INC HL LD (HL),D ; EX DE,HL ; ;LD DE,SECTOR_BUFFER + 3