diff --git a/format/data.z80 b/format/data.z80 index 9b087f1..9a76145 100644 --- a/format/data.z80 +++ b/format/data.z80 @@ -2,6 +2,20 @@ ;████████████████████████████████ DATA █████████████████████████████████ ;███████████████████████████████████████████████████████████████████████ +;----------------------------------------------------------------------- + MODULE CONSTANTS +FAT16 EQU 2 ; заодно и множитель +FAT12 EQU 3 ; заодно и множитель +FAT32 EQU 4 ; заодно и множитель +; +FAT_ReservedSectors: +.FDD EQU 1 +.HDD EQU 8 +.FAT32 EQU 32 + ENDMODULE +;----------------------------------------------------------------------- + + ;----------------------------------------------------------------------- MACRO FAT_TYPES_LINE vol_size, clu_size, fat_type WORD vol_size, clu_size @@ -9,9 +23,6 @@ ENDM MODULE TABLES -FAT12 EQU 3 -FAT16 EQU 2 -FAT32 EQU 4 ; VOL SIZE CLUSTER SIZE FAT TYPE FAT_TYPES: FAT_TYPES_LINE #0800, 32768, FAT32 ; > 32768 FAT_TYPES_LINE #0400, 16384, FAT32 ; 16384..32768 Mb @@ -33,33 +44,57 @@ FAT_TYPES: FAT_TYPES_LINE #0800, 32768, FAT32 ; > 32768 ;----------------------------------------------------------------------- VARIABLES EQU $ -.FAT_TYPE BYTE TABLES.FAT12 ; [x] -.CurrentDrive DB 0 -.VOLUME_SIZE_BYTES BLOCK 5,0 -.FatFDD_ReservedSectors WORD 1 -.FatHDD_ReservedSectors WORD 8 -.Fat32_ReservedSectors WORD 32 -.RootDirSectors WORD 0 +.FAT_TYPE BYTE CONSTANTS.FAT12 ; [x] +.CurrentDrive DB 0 ; [x] +.VOLUME_SIZE_BYTES BLOCK 5,0 ; [ ] +;.FatFDD_ReservedSectors WORD 1 +;.FatHDD_ReservedSectors WORD 8 +;.Fat32_ReservedSectors WORD 32 +.ReservedSectors WORD 0 ; [ ] +.RootDirSectors WORD 0 ; [ ] .NotUsedSpace BYTE 0 ; in sectors -.total_clusters_L: WORD 0 -.total_clusters_H: WORD 0 -.FAT32_RootDirClusters WORD 1 -.FAT.LABEL BYTE 'NO_LABEL ' -.DriveExtendedParameters BYTE 0 +.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 ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- -; Ключ выставлен : Дефолтное значение +; Статус ключа : Ключ : Значение KEYS_PARAMETERS EQU $ -.ONLY_HELP BYTE 0 : BYTE 0 ; [ ] /? ; вывод справки -.FAT_TYPE BYTE 0 : BYTE TABLES.FAT12 ; [ ] /t ; -.BytesPerSector BYTE 0 : WORD #200 ; [ ] /s ; -.SectorsPerCluster: BYTE 0 : BYTE 0 ; [ ] /c ; -.Number_of_FATs: BYTE 0 : BYTE 2 ; [ ] /n ; -.FilesInRootDIR: BYTE 0 : WORD 0 ; [ ] /d ; -.RESERVED_SECTORS: BYTE 0 : WORD 0 ; [ ] /r ; -.LOW_FORMAT BYTE 0 : BYTE 0 ; [ ] /l ; для дискет +.ONLY_HELP BYTE 0 : BYTE '?' : WORD 0 ; [ ] BYTE ; вывод справки +.FAT_TYPE BYTE 0 : BYTE 't' : WORD CONSTANTS.FAT12 ; [ ] BYTE ; +.SectorsPerCluster: BYTE 0 : BYTE 'c' : WORD 0 ; [ ] BYTE ; +.FilesInRootDIR: BYTE 0 : BYTE 'd' : WORD 0 ; [ ] WORD ; +.Number_of_FATs: BYTE 0 : BYTE 'n' : WORD 2 ; [ ] BYTE ; +.RESERVED_SECTORS: BYTE 0 : BYTE 'r' : WORD 0 ; [ ] WORD ; +.LOW_FORMAT BYTE 0 : BYTE 'l' : WORD 0 ; [ ] BYTE ; для дискет +.BytesPerSector BYTE 0 : BYTE 's' : WORD #200 ; [ ] WORD ; +; смещения на данные +.Status EQU 0 +.Key EQU 1 +.Data EQU 2 +; статус +.Status.Off EQU 0 +.Status.On EQU 0 +.Status.Ignored EQU 0 +; Статус ключа: +; 0 - не установлен +; 1 - установлен +; 2 - игнорируется +/* +FilesInRootDIR +Для томов FAT12 и FAT16 это значение всегда должно указывать на +количество, которое при умножении на 32 дает четное число, кратное +BPB_BytsPerSec. Для максимальной совместимости для томов FAT16 следует +использовать значение 512. +*/ ;----------------------------------------------------------------------- @@ -117,10 +152,12 @@ FAT_PARAMETERS: ; SHARED .PART3_SHARED EQU $ ; -.FAT.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ; -.FAT.SERIAL_NUMBER DWORD 0 ; [ ] -.FAT.LABEL DB 'NO_LABEL ' ; [ ] ;!TODO дополнительно писать в корневую директорию -.ID_FAT DB 'FAT32 ' ; +.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 ;----------------------------------------------------------------------- diff --git a/format/format.asm b/format/format.asm index 62e93cb..23b58ca 100755 --- a/format/format.asm +++ b/format/format.asm @@ -69,7 +69,7 @@ main: DI CALL prepare JR NC,.ok_drive ; - CALL FAT32_FORMAT + CALL DSS_DRIVE_FORMAT ; LD A,"\a" ; bell SYS ESTEX_pchar @@ -204,6 +204,7 @@ init_fat: LD HL,buff LD (HL),0xff INC HL LD A,(fat12_flg) + OR A RET NZ LD (HL),0xff ;0xfff8, 0xffff for FAT16 RET diff --git a/format/new_format.asm b/format/new_format.asm index 5afe282..888116e 100644 --- a/format/new_format.asm +++ b/format/new_format.asm @@ -66,27 +66,55 @@ reserved_sectors = ( ((.HIDDEN + min_last_sector) & #0F)>0 ) * #10) - .HIDDEN ; DSS Drive Formatter -FAT32_FORMAT: //////////////////////////////////////////////////////////////////////// - +;----------------------------------------------------------------------- +DSS_DRIVE_FORMAT: +;----------------------------------------------------------------------- + LD A,(KEYS_PARAMETERS.FAT_TYPE + KEYS_PARAMETERS.Status) + LD C,A + ; проверка на затуп + LD A,(KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Status) + AND A + JR Z,.no_zatup + ; + LD A,C + OR A + JR Z,.no_zatup + ; + LD A,(KEYS_PARAMETERS.FAT_TYPE + KEYS_PARAMETERS.Data) + CP CONSTANTS.FAT32 + JR NZ,.no_zatup + ; + LD A,KEYS_PARAMETERS.Status.Ignored + LD (KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.Status),A +.no_zatup: ; проверка на авто-расчёт + LD A,(KEYS_PARAMETERS.SectorsPerCluster + KEYS_PARAMETERS.Status) + OR C + JR Z,MAKE_AUTO + ; + ; !TODO + ; MAKE_AUTO: LD (STOP_ERROR.Save_SP),SP ;!FIXIT LD A,(FMTDISK) LD (VARIABLES.CurrentDrive),A ; + CALL CALCULATE_FAT CALL FORMAT_DRIVE + CALL MAKE_LABEL_IN_DIR ;!FIXIT ;CALL MAKE_ROOT_DIR_LABEL ; первая запись в root dir - метка, потом нули RET ;----------------------------------------------------------------------- -; Определение параметров носителя и выбор FAT +; Автоматическое пределение параметров носителя и выбор FAT CALCULATE_FAT: CALL .STEP1 ; эта должна быть общей для заполнения геометрии диска ; Автоматический выбор FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster CALL .STEP2 ; дальше устанавливаем геометрию. Уже должен быть выбран тип FAT CALL .STEP3 + CALL MAKE_SERIAL RET ;--------------; @@ -141,7 +169,7 @@ CALCULATE_FAT: CALL .STEP1 ; LD (FAT_PARAMETERS.BytesPerSector),BC ; размер диска в байтах EDLHA CALL MUL32_POWER2 - LD (VARIABLES.VOLUME_SIZE_BYTES),DE + LD (VARIABLES.VOLUME_SIZE_BYTES),DE ; !FIXIT байт из E не используется LD (VARIABLES.VOLUME_SIZE_BYTES + 2),HL LD (VARIABLES.VOLUME_SIZE_BYTES + 4),A RET @@ -155,15 +183,15 @@ CALCULATE_FAT: CALL .STEP1 ; ; LD A,C LD (VARIABLES.FAT_TYPE),A - CP TABLES.FAT32 - LD HL,(VARIABLES.Fat32_ReservedSectors) - JR Z,.set_reserved_s + ;CP CONSTANTS.FAT32 + ;LD HL,CONSTANTS.FAT_ReservedSectors.FAT32 + ;JR Z,.set_reserved_s ; ;!FIXIT проверка FDD/HDD - LD HL,(VARIABLES.FatHDD_ReservedSectors) + ;LD HL,CONSTANTS.FAT_ReservedSectors.HDD ; .set_reserved_s: - LD (FAT_PARAMETERS.RESERVED_SECTORS),HL + ;LD (FAT_PARAMETERS.RESERVED_SECTORS),HL LD HL,(FAT_PARAMETERS.BytesPerSector) DEC HL SBC HL,DE @@ -176,7 +204,57 @@ 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 + ;--------------; @@ -213,7 +291,7 @@ CALCULATE_FAT: CALL .STEP1 ; CALL CALC_TOTAL_CLUSTERS LD HL,(CALC_TOTAL_CLUSTERS.fat_size_l) LD A,(VARIABLES.FAT_TYPE) - CP TABLES.FAT32 + CP CONSTANTS.FAT32 JR Z,.it_is_fat32 ; LD (FAT_PARAMETERS.SectorsPerFAT16),HL @@ -246,6 +324,13 @@ STOP_ERROR: ; (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, + .t_sec_h+1: LD DE,0 .t_sec_l+1: LD HL,0 ; data_sectors @@ -288,7 +373,8 @@ CALC_TOTAL_CLUSTERS: SBC HL,BC JR C,STOP_ERROR ; data_sectors = HL:DE - ; + LD (VARIABLES.DataSectors_L),DE + LD (VARIABLES.DataSectors_H),HL ; total_clusters LD A,(FAT_PARAMETERS.SectorsPerCluster) CALL HLDE_Div_A @@ -309,7 +395,7 @@ CALC_TOTAL_CLUSTERS: ; LD BC,(FAT_PARAMETERS.BytesPerSector) LD A,(VARIABLES.FAT_TYPE) - CP TABLES.FAT12 + CP CONSTANTS.FAT12 JR NZ,.no_sla ; SLA C @@ -409,6 +495,31 @@ AUTO_CHOOSE_FAT_PARAMS: ;----------------------------------------------------------------------- +;----------------------------------------------------------------------- +MAKE_SERIAL: LD C,Dss.SysTime + RST ToDSS + ; + EX DE,HL + ADD IX,DE + LD (FAT_PARAMETERS.SERIAL_NUMBER_2),IX + ; + LD A,D + LD D,B + XOR C +.loop: RRA + DJNZ .loop + ; + LD E,H + LD H,L + LD L,E + ; + LD E,A + ADD HL,DE + LD (FAT_PARAMETERS.SERIAL_NUMBER_1),HL + RET +;----------------------------------------------------------------------- + + ;----------------------------------------------------------------------- FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER ; @@ -418,7 +529,7 @@ FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER LDIR ; LD A,(VARIABLES.FAT_TYPE) - CP TABLES.FAT32 + CP CONSTANTS.FAT32 ;!FIXIT JP NZ,STOP_ERROR ; @@ -426,7 +537,7 @@ FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER CALL CLEAN_SECTOR_BUFFER ; clean all fat tables at drive LD A,(VARIABLES.FAT_TYPE) - CP TABLES.FAT32 + CP CONSTANTS.FAT32 LD BC,(FAT_PARAMETERS.SectorsPerFAT32) LD DE,(FAT_PARAMETERS.SectorsPerFAT32 + 2) JR Z,.its_fat32 @@ -477,28 +588,55 @@ FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER OR E JR NZ,.write_loop EXX + ; HL:IX - rootdir's first sector + ; + LD (VARIABLES.RootDirFirstSector_L),IX + LD (VARIABLES.RootDirFirstSector_H),HL + ; ; make fat table - LD HL,(FAT_PARAMETERS.DRIVE_TYPE) - LD H,#FF - LD (SECTOR_BUFFER),HL - LD L,H - LD (SECTOR_BUFFER + 2),HL + LD HL,SECTOR_BUFFER + LD A,(FAT_PARAMETERS.DRIVE_TYPE) + LD (HL),A + INC HL + LD (HL),#FF + INC HL + LD (HL),#FF LD A,(VARIABLES.FAT_TYPE) - CP TABLES.FAT12 - JR NZ,.not_fat12 - ; fat12 - XOR A - LD (SECTOR_BUFFER + 3),A - JR .write_fat + CP CONSTANTS.FAT12 + JR Z,.write_fat ; fat12 ; -.not_fat12 CP TABLES.FAT16 - JR Z,.write_fat - ;fat32 + INC HL + LD (HL),#FF + JR C,.write_fat ; fat16 + ; + ; LD HL,(FAT_PARAMETERS.DRIVE_TYPE) + ; LD H,#FF + ; LD (SECTOR_BUFFER),HL + ; LD L,H + ; LD (SECTOR_BUFFER + 2),HL + ; LD A,(VARIABLES.FAT_TYPE) + ; CP TABLES.FAT12 + ; JR C,.write_fat ; fat16 + ; JR NZ,.fat32 + ; ; fat12 + ; XOR A + ; LD (SECTOR_BUFFER + 3),A + ; JR .write_fat ; - LD HL,.Fat32Data - LD DE,SECTOR_BUFFER + 3 - LD BC,.Fat32Data.Size - LDIR +.fat32: ; fat32 + LD DE,#0FFF + LD B,7 + LD (HL),D +.loop32: INC HL + LD (HL),E + DJNZ .loop32 + INC Hl + LD (HL),D + ; EX DE,HL + ; ;LD DE,SECTOR_BUFFER + 3 + ; LD HL,.Fat32Data + ; LD BC,.Fat32Data.Size + ; LDIR ; .write_fat: LD A,(FAT_PARAMETERS.Number_of_FATs) LD HL,0 @@ -526,8 +664,8 @@ FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER JR NZ,.write_tbl_fat RET ; -.Fat32Data: DB #0F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#0F -.Fat32Data.Size EQU $-.Fat32Data +;.Fat32Data: DB #0F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#0F +;.Fat32Data.Size EQU $-.Fat32Data ;----------------------------------------------------------------------- @@ -548,7 +686,7 @@ MAKE_SYS_SECTORS: CALL WRITE_SECTOR_BUFFER ; LD A,(VARIABLES.FAT_TYPE) - CP TABLES.FAT32 + CP CONSTANTS.FAT32 RET NZ ; CALL CLEAN_SECTOR_BUFFER @@ -638,6 +776,38 @@ WRITE_SECTOR_BUFFER: ;----------------------------------------------------------------------- +;----------------------------------------------------------------------- +; IN: HL:IX - rootdir's first sector +MAKE_LABEL_IN_DIR: + CALL CLEAN_SECTOR_BUFFER ;!FIXIT скорее всего, не нужно чистить + ; make directory record + LD HL,FAT_PARAMETERS.LABEL + LD DE,SECTOR_BUFFER + LD BC,FAT_PARAMETERS.LABEL.Size + LDIR + ; + EX DE,HL + LD (HL),#08 + LD HL,#0233 + LD (SECTOR_BUFFER+22),HL + LD HL,#5C85 + LD (SECTOR_BUFFER+24),HL + ; LD HL,.RootLabel + ; LD BC,.RootLabel.Size + ; LDIR + ; write sector + LD HL,(VARIABLES.RootDirFirstSector_H) + LD IX,(VARIABLES.RootDirFirstSector_L) + JR WRITE_SECTOR_BUFFER + ; +; root dir entry for label and 0 for "end of catalog" without label +; .RootLabel: ;BYTE 'NO_LABEL ' +; BYTE #08,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +; BYTE #33,#02,#85,#5C,#00,#00,#00,#00,#00,#00,#00 +; .RootLabel.Size EQU $-.RootLabel +;----------------------------------------------------------------------- + + //////////////////////////////////////////////////////////////////////// include 'math.asm' ////////////////////////////////////////////////////////////////////////