This commit is contained in:
Tolik 2026-04-06 01:46:22 +10:00
parent ee38a525f0
commit 3d8f5ff222
3 changed files with 166 additions and 83 deletions

View File

@ -8,6 +8,11 @@ FAT16 EQU 2 ;
FAT12 EQU 3 ; § ®¤­® ¨ ¬­®¦¨â¥«ì FAT12 EQU 3 ; § ®¤­® ¨ ¬­®¦¨â¥«ì
FAT32 EQU 4 ; § ®¤­® ¨ ¬­®¦¨â¥«ì FAT32 EQU 4 ; § ®¤­® ¨ ¬­®¦¨â¥«ì
; ;
FilesInRootDIR:
.FDD_DD EQU 112
.FDD_HD EQU 224
.HDD EQU 512
;
FAT_ReservedSectors: FAT_ReservedSectors:
.FDD EQU 1 .FDD EQU 1
.HDD EQU 8 .HDD EQU 8
@ -24,17 +29,17 @@ FAT_ReservedSectors:
MODULE TABLES MODULE TABLES
; VOL SIZE CLUSTER SIZE FAT TYPE ; VOL SIZE CLUSTER SIZE FAT TYPE
FAT_TYPES: FAT_TYPES_LINE #0800, 32768, FAT32 ; > 32768 FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768
FAT_TYPES_LINE #0400, 16384, FAT32 ; 16384..32768 Mb FAT_TYPES_LINE #0400, 16384, CONSTANTS.FAT32 ; 16384..32768 Mb
FAT_TYPES_LINE #0200, 8192, FAT32 ; 8192..16384 Mb FAT_TYPES_LINE #0200, 8192, CONSTANTS.FAT32 ; 8192..16384 Mb
FAT_TYPES_LINE #0100, 4096, FAT32 ; 4096..8192 Mb FAT_TYPES_LINE #0100, 4096, CONSTANTS.FAT32 ; 4096..8192 Mb
FAT_TYPES_LINE #0080, 32768, FAT16 ; 2048..4096 Mb FAT_TYPES_LINE #0080, 32768, CONSTANTS.FAT16 ; 2048..4096 Mb
FAT_TYPES_LINE #0040, 16384, FAT16 ; 1023..2048 Mb FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..2048 Mb
FAT_TYPES_LINE #0020, 8192, FAT16 ; 511..1023 Mb FAT_TYPES_LINE #0020, 8192, CONSTANTS.FAT16 ; 511..1023 Mb
FAT_TYPES_LINE #0010, 4096, FAT16 ; 256..511 Mb FAT_TYPES_LINE #0010, 4096, CONSTANTS.FAT16 ; 256..511 Mb
FAT_TYPES_LINE #0008, 2048, FAT16 ; 128..256 Mb FAT_TYPES_LINE #0008, 2048, CONSTANTS.FAT16 ; 128..256 Mb
FAT_TYPES_LINE #0004, 1024, FAT16 ; 64..128 Mb FAT_TYPES_LINE #0004, 1024, CONSTANTS.FAT16 ; 64..128 Mb
FAT_TYPES_LINE #0002, 512, FAT16 ; 32..64 Mb FAT_TYPES_LINE #0002, 512, CONSTANTS.FAT16 ; 32..64 Mb
; ¥á«¨ ¬¥­ìè¥, â® FAT12 ; ¥á«¨ ¬¥­ìè¥, â® FAT12
.LineSize EQU 5 .LineSize EQU 5
.Records EQU ($ - FAT_TYPES)/.LineSize .Records EQU ($ - FAT_TYPES)/.LineSize
@ -51,7 +56,7 @@ VARIABLES EQU $
;.FatHDD_ReservedSectors WORD 8 ;.FatHDD_ReservedSectors WORD 8
;.Fat32_ReservedSectors WORD 32 ;.Fat32_ReservedSectors WORD 32
.ReservedSectors WORD 0 ; [ ] .ReservedSectors WORD 0 ; [ ]
.RootDirSectors WORD 0 ; [ ] .RootDirSectors D24 0 ; [ ]
.NotUsedSpace BYTE 0 ; in sectors .NotUsedSpace BYTE 0 ; in sectors
.total_clusters_L: WORD 0 ; [x] .total_clusters_L: WORD 0 ; [x]
.total_clusters_H: WORD 0 ; [x] .total_clusters_H: WORD 0 ; [x]
@ -111,7 +116,7 @@ FAT_PARAMETERS:
.SectorsPerCluster: BYTE 0 ; [x] .SectorsPerCluster: BYTE 0 ; [x]
.RESERVED_SECTORS: WORD 0 ; [x] .RESERVED_SECTORS: WORD 0 ; [x]
.Number_of_FATs: BYTE 2 ; predefined ; [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] +- .SectorsPerDrive: WORD 0 ; FAT32 constant ; [x] +-
.DRIVE_TYPE: BYTE 0 ; ; [x] +- .DRIVE_TYPE: BYTE 0 ; ; [x] +-
.SectorsPerFAT16: WORD 0 ; FAT32 constant ; [x] .SectorsPerFAT16: WORD 0 ; FAT32 constant ; [x]

View File

@ -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/BC -> HLIX remainder DE
HLIX_div_BC: EX DE,HL HLIX_div_BC: EX DE,HL

View File

@ -112,7 +112,7 @@ MAKE_AUTO: LD (STOP_ERROR.Save_SP),SP
CALCULATE_FAT: CALL .STEP1 ; íâ  ¤®«¦­  ¡ëâì ®¡é¥© ¤«ï § ¯®«­¥­¨ï £¥®¬¥âਨ ¤¨áª  CALCULATE_FAT: CALL .STEP1 ; íâ  ¤®«¦­  ¡ëâì ®¡é¥© ¤«ï § ¯®«­¥­¨ï £¥®¬¥âਨ ¤¨áª 
; €¢â®¬ â¨ç¥áª¨© ¢ë¡®à FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster ; €¢â®¬ â¨ç¥áª¨© ¢ë¡®à FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster
CALL .STEP2 CALL .STEP2
; ¤ «ìè¥ ãáâ ­ ¢«¨¢ ¥¬ £¥®¬¥âà¨î. “¦¥ ¤®«¦¥­ ¡ëâì ¢ë¡à ­ ⨯ FAT ; RESERVED_SECTORS, RootDir, ¤ «ìè¥ ãáâ ­ ¢«¨¢ ¥¬ £¥®¬¥âà¨î. “¦¥ ¤®«¦¥­ ¡ëâì ¢ë¡à ­ ⨯ FAT
CALL .STEP3 CALL .STEP3
CALL MAKE_SERIAL CALL MAKE_SERIAL
RET RET
@ -177,7 +177,7 @@ CALCULATE_FAT: CALL .STEP1 ;
;--------------; ;--------------;
; €¢â®¬ â¨ç¥áª¨© ¢ë¡®à FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster ; €¢â®¬ â¨ç¥áª¨© ¢ë¡®à FAT_TYPE, SectorsPerCluster
.STEP2: CALL AUTO_CHOOSE_FAT_PARAMS .STEP2: CALL AUTO_CHOOSE_FAT_PARAMS
JR C,STOP_ERROR JR C,STOP_ERROR
; ;
@ -204,57 +204,7 @@ CALCULATE_FAT: CALL .STEP1 ;
JR C,STOP_ERROR JR C,STOP_ERROR
; ;
LD (FAT_PARAMETERS.SectorsPerCluster),A 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 RET
;
.choose_RS: LD HL,CONSTANTS.FAT_ReservedSectors.FDD
;--------------; ;--------------;
@ -274,11 +224,16 @@ CALCULATE_FAT: CALL .STEP1 ;
; FAT_PARAMETERS.DRIVE_TYPE ; FAT_PARAMETERS.DRIVE_TYPE
; FAT_PARAMETERS.SectorsPerFAT16 ; FAT_PARAMETERS.SectorsPerFAT16
; FAT_PARAMETERS.SectorsPerFAT32 ; FAT_PARAMETERS.SectorsPerFAT32
; FAT_PARAMETERS.RESERVED_SECTORS
; FAT_PARAMETERS.FilesInRootDIR
.STEP3: CALL GET_DRIVE_TYPE .STEP3: CALL GET_DRIVE_TYPE
JR C,STOP_ERROR JR C,STOP_ERROR
; ;
LD A,B LD A,B
LD (FAT_PARAMETERS.DRIVE_TYPE),A LD (FAT_PARAMETERS.DRIVE_TYPE),A
;
CALL SET_RESERVED_AND_ROOTDIR
;
LD HL,(FAT_PARAMETERS.SectorsPerDrive) LD HL,(FAT_PARAMETERS.SectorsPerDrive)
LD A,H LD A,H
OR L OR L
@ -292,6 +247,7 @@ CALCULATE_FAT: CALL .STEP1 ;
LD HL,(CALC_TOTAL_CLUSTERS.fat_size_l) LD HL,(CALC_TOTAL_CLUSTERS.fat_size_l)
LD A,(VARIABLES.FAT_TYPE) LD A,(VARIABLES.FAT_TYPE)
CP CONSTANTS.FAT32 CP CONSTANTS.FAT32
LD DE,"32"
JR Z,.it_is_fat32 JR Z,.it_is_fat32
; ;
LD (FAT_PARAMETERS.SectorsPerFAT16),HL LD (FAT_PARAMETERS.SectorsPerFAT16),HL
@ -322,15 +278,45 @@ STOP_ERROR:
; (VARIABLES.total_clusters_H) ; (VARIABLES.total_clusters_H)
; (CALC_TOTAL_CLUSTERS.fat_size_l) ; (CALC_TOTAL_CLUSTERS.fat_size_l)
; (CALC_TOTAL_CLUSTERS.fat_size_h) ; (CALC_TOTAL_CLUSTERS.fat_size_h)
CALC_TOTAL_CLUSTERS: CALC_TOTAL_CLUSTERS:
; calc rootdir sectors
LD A,(VARIABLES.FAT_TYPE) LD A,(VARIABLES.FAT_TYPE)
SUB CONSTANTS.FAT32 SUB CONSTANTS.FAT32
LD B,A JR Z,.no_root_dir
LD C,A ; calc rootdir sectors
JR Z, 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_h+1: LD DE,0
.t_sec_l+1: LD HL,0 .t_sec_l+1: LD HL,0
; data_sectors ; data_sectors
@ -343,7 +329,7 @@ CALC_TOTAL_CLUSTERS:
AND A AND A
DEC DE DEC DE
.skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors .skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors
PUSH DE .push_regs: PUSH DE
PUSH HL PUSH HL
;num_fats * fat_sz32; fat_sz32 ¢ ª« áâ¥à å ;num_fats * fat_sz32; fat_sz32 ¢ ª« áâ¥à å
.fat_size_l+1: LD BC,0 .fat_size_l+1: LD BC,0
@ -357,13 +343,14 @@ CALC_TOTAL_CLUSTERS:
POP DE POP DE
;num_fats * fat_sz32 = BCDE ;num_fats * fat_sz32 = BCDE
; ;
LD HL,(VARIABLES.RootDirSectors) ; !FIXIT ­ ¯¨á âì ¯à®æ¥¤ãàã ¢ëç¨á«¥­¨ï RootDirSectors ¤® ¢ë§®¢  í⮩ LD HL,(VARIABLES.RootDirSectors)
ADD HL,DE ADD HL,DE
JR NC,.skip_inc EX DE,HL
; LD HL,(VARIABLES.RootDirSectors + 2)
AND A LD H,0
INC BC ADC HL,BC
.skip_inc: EX DE,HL LD B,H
LD C,L
;num_fats * fat_sz32 + root_dir_sectors = BC:DE ;num_fats * fat_sz32 + root_dir_sectors = BC:DE
; ;
POP HL 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) 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 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 RET Z
; ¤¨áª¥âë ¨ ª®£¤ -­¨¡ã¤ì ATAPI ;
SCF LD B,BOOT_SECTOR.Floppy_8_1x20
RET RET
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
@ -630,7 +687,7 @@ FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER
.loop32: INC HL .loop32: INC HL
LD (HL),E LD (HL),E
DJNZ .loop32 DJNZ .loop32
INC Hl INC HL
LD (HL),D LD (HL),D
; EX DE,HL ; EX DE,HL
; ;LD DE,SECTOR_BUFFER + 3 ; ;LD DE,SECTOR_BUFFER + 3