fixed bug in detect fat32

This commit is contained in:
Tolik 2025-10-28 16:48:41 +10:00
parent 7a40f43798
commit 02fb3ddb32
5 changed files with 127 additions and 56 deletions

View File

@ -576,22 +576,50 @@ GET_BPB: XOR A
;LD H,A
;LD L,A
;LD (FatBuffer.CacheBlock),HL
; A = 0
LD DE,(FatBuffer.SectorsPerFAT_H)
LD D,A
; LD DE,(FatBuffer.SectorsPerFAT_H)
; LD D,A
; LD HL,(FatBuffer.SectorsPerFAT_L)
; ; DE:HL = SectorsPerFAT
; ;
; LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs)
; DEC A
; LD B,A
; JR Z,.loop_mul_end
; A = 0
LD HL,(FatBuffer.SectorsPerFAT_H)
LD H,A
LD D,H
LD E,L
;EX DE,HL
EXX
LD HL,(FatBuffer.SectorsPerFAT_L)
; DE:HL = SectorsPerFAT
;
LD D,H
LD E,L
; HL':HL = SectorsPerFAT
; DE':DE = SectorsPerFAT
LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs)
LD B,A
DEC A
JR Z,.loop_mul_end
LD B,A
;
CALL NZ,ALL_SECTORS_PER_FATs
EXX
PUSH HL
EXX
POP DE
; DE:HL - sectors per FATs
; .Number_of_FATs * .SectorsPerFAT
.loop_mul: ADD HL,HL
EX DE,HL
ADC HL,HL
EX DE,HL
DJNZ .loop_mul
; .loop_mul: ADD HL,HL
; EX DE,HL
; ADC HL,HL
; EX DE,HL
; DJNZ .loop_mul
.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD B,0
LD A,(FatBuffer.DirSizeInSectors)
@ -669,14 +697,17 @@ GET_BPB: XOR A
LD HL,(FatBuffer.FAT1_SEC_L)
LD DE,(FatBuffer.SectorsPerFAT_L)
AND #0F
JR Z,.first_FAT_active
LD B,A
; JR Z,.first_FAT_active
; LD B,A
; ;
; .fat_calc_loop: ADD HL,DE
; EXX
; ADC HL,DE
; EXX
; DJNZ .fat_calc_loop
;
.fat_calc_loop: ADD HL,DE
EXX
ADC HL,DE
EXX
DJNZ .fat_calc_loop
LD B,A
CALL NZ,ALL_SECTORS_PER_FATs
;
.first_FAT_active:
LD (FatBuffer.FAT1_SEC_L),HL
@ -700,6 +731,18 @@ GET_BPB: XOR A
;
; HL:HL' - first FAT sector
; DE:DE' - sectors per one FAT
; A - number of FATs (counts from 0)
ALL_SECTORS_PER_FATs:
ADD HL,DE
EXX
ADC HL,DE
EXX
DJNZ ALL_SECTORS_PER_FATs
RET
;NSECTOR:
; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR

View File

@ -96,7 +96,7 @@
; ¢¥àá¨ï ¯à®£à ¬¬ë
major_version equ 3 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 0 ; ¬«. ­®¬¥à
minor_version equ 1 ; ¬«. ­®¬¥à
;;
SECTORS_OF_LOADER EQU 4 ; ᥪâ®à®¢ § £àã§ç¨ª 
.IN_BPB EQU 1

View File

@ -708,10 +708,21 @@ SAVEDIR: ;!TODO optimize
FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
CP #F0
JP C,RD_BPB.UnknownBPB
;
; PREPARE
XOR A
LD (.UsesVarsFAT32),A
;
;EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
;[ ] fat32
LD B,A
LD C,A
LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A ; [ ] fat32
;
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector)
LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster)
@ -721,22 +732,12 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL ; low word first sector FAT #1
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL ; low word first sector FAT #2
;[ ] fat32
XOR A
LD B,A
LD C,A
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),BC
LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A ; [ ] fat32
;LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
;
;
EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
LD A,E
OR D
@ -917,20 +918,32 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
; A = 0
LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
LD H,A
EX DE,HL
LD D,H
LD E,L
;EX DE,HL
EXX
LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
; DE:HL = SectorsPerFAT
;
LD D,H
LD E,L
; HL':HL = SectorsPerFAT
; DE':DE = SectorsPerFAT
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs)
LD B,A
DEC A
JR Z,.loop_mul_end
; .Number_of_FATs * .SectorsPerFAT
.loop_mul: ADD HL,HL
EX DE,HL
ADC HL,HL
EX DE,HL
DJNZ .loop_mul
LD B,A
; JR Z,.loop_mul_end
; ; .Number_of_FATs * .SectorsPerFAT
; .loop_mul: ADD HL,HL
; EX DE,HL
; ADC HL,HL
; EX DE,HL
; DJNZ .loop_mul
;
CALL NZ,ALL_SECTORS_PER_FATs
EXX
PUSH HL
EXX
POP DE
; DE:HL - sectors per FATs
.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD B,0
LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
@ -1008,14 +1021,18 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
AND #0F
JR Z,.first_FAT_active
LD B,A
;
.fat_calc_loop: ADD HL,DE
EXX
ADC HL,DE
EXX
DJNZ .fat_calc_loop
; JR Z,.first_FAT_active
; LD B,A
; ;
; .fat_calc_loop: ADD HL,DE
; EXX
; ADC HL,DE
; EXX
; DJNZ .fat_calc_loop
;
LD B,A
CALL NZ,ALL_SECTORS_PER_FATs
;
.first_FAT_active:
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL
@ -1158,6 +1175,17 @@ SectorToCluster:
JP .loop
;
; HL:HL' - first FAT sector
; DE:DE' - sectors per one FAT
; A - number of FATs (counts from 0)
ALL_SECTORS_PER_FATs:
ADD HL,DE
EXX
ADC HL,DE
EXX
DJNZ ALL_SECTORS_PER_FATs
RET
; DOS_X_Error:
; .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT
; SCF

View File

@ -1 +1 @@
1
2

@ -1 +1 @@
Subproject commit 1dabd783c85be491b704d038f9efabbaf8fe697e
Subproject commit 4da18d54c12e0f2ff4183be7a1cbf5882da1bd4f