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 H,A
;LD L,A ;LD L,A
;LD (FatBuffer.CacheBlock),HL ;LD (FatBuffer.CacheBlock),HL
; A = 0 ; A = 0
LD DE,(FatBuffer.SectorsPerFAT_H) ; LD DE,(FatBuffer.SectorsPerFAT_H)
LD D,A ; 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) 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 A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs)
LD B,A
DEC 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 ; .Number_of_FATs * .SectorsPerFAT
.loop_mul: ADD HL,HL ; .loop_mul: ADD HL,HL
EX DE,HL ; EX DE,HL
ADC HL,HL ; ADC HL,HL
EX DE,HL ; EX DE,HL
DJNZ .loop_mul ; DJNZ .loop_mul
.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT .loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD B,0 LD B,0
LD A,(FatBuffer.DirSizeInSectors) LD A,(FatBuffer.DirSizeInSectors)
@ -669,15 +697,18 @@ GET_BPB: XOR A
LD HL,(FatBuffer.FAT1_SEC_L) LD HL,(FatBuffer.FAT1_SEC_L)
LD DE,(FatBuffer.SectorsPerFAT_L) LD DE,(FatBuffer.SectorsPerFAT_L)
AND #0F AND #0F
JR Z,.first_FAT_active ; 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 LD B,A
; CALL NZ,ALL_SECTORS_PER_FATs
.fat_calc_loop: ADD HL,DE ;
EXX
ADC HL,DE
EXX
DJNZ .fat_calc_loop
;
.first_FAT_active: .first_FAT_active:
LD (FatBuffer.FAT1_SEC_L),HL LD (FatBuffer.FAT1_SEC_L),HL
EXX EXX
@ -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: ;NSECTOR:
; in: HL':HL - CLUSTER ; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR ; out: HL:IX - SECTOR

View File

@ -96,7 +96,7 @@
; ¢¥àá¨ï ¯à®£à ¬¬ë ; ¢¥àá¨ï ¯à®£à ¬¬ë
major_version equ 3 ; áâ. ­®¬¥à ¢¥àᨨ major_version equ 3 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 0 ; ¬«. ­®¬¥à minor_version equ 1 ; ¬«. ­®¬¥à
;; ;;
SECTORS_OF_LOADER EQU 4 ; ᥪâ®à®¢ § £àã§ç¨ª  SECTORS_OF_LOADER EQU 4 ; ᥪâ®à®¢ § £àã§ç¨ª 
.IN_BPB EQU 1 .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) FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
CP #F0 CP #F0
JP C,RD_BPB.UnknownBPB JP C,RD_BPB.UnknownBPB
; ; PREPARE
XOR A XOR A
LD (.UsesVarsFAT32),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 HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector)
LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) 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.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 LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL ; low word first sector FAT #2
;[ ] fat32 ;[ ] 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.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.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),BC 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 ;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 DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
LD A,E LD A,E
OR D OR D
@ -917,20 +918,32 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
; A = 0 ; A = 0
LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
LD H,A LD H,A
EX DE,HL LD D,H
LD E,L
;EX DE,HL
EXX
LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) 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 A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs)
LD B,A
DEC A DEC A
JR Z,.loop_mul_end LD B,A
; .Number_of_FATs * .SectorsPerFAT ; JR Z,.loop_mul_end
.loop_mul: ADD HL,HL ; ; .Number_of_FATs * .SectorsPerFAT
EX DE,HL ; .loop_mul: ADD HL,HL
ADC HL,HL ; EX DE,HL
EX DE,HL ; ADC HL,HL
DJNZ .loop_mul ; 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 .loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD B,0 LD B,0
LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors) LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
@ -1005,21 +1018,25 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H) LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
LD D,0 LD D,0
EXX EXX
LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
AND #0F AND #0F
JR Z,.first_FAT_active
LD B,A
; ;
.fat_calc_loop: ADD HL,DE ; JR Z,.first_FAT_active
EXX ; LD B,A
ADC HL,DE ; ;
EXX ; .fat_calc_loop: ADD HL,DE
DJNZ .fat_calc_loop ; EXX
; ADC HL,DE
; EXX
; DJNZ .fat_calc_loop
; ;
LD B,A
CALL NZ,ALL_SECTORS_PER_FATs
;
.first_FAT_active: .first_FAT_active:
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL
EXX EXX
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),HL LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),HL
LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL
@ -1158,6 +1175,17 @@ SectorToCluster:
JP .loop 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: ; DOS_X_Error:
; .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT ; .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT
; SCF ; SCF

View File

@ -1 +1 @@
1 2

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