diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 1a71a5a..b28a211 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -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,15 +697,18 @@ GET_BPB: XOR A LD HL,(FatBuffer.FAT1_SEC_L) LD DE,(FatBuffer.SectorsPerFAT_L) 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 - ; -.fat_calc_loop: ADD HL,DE - EXX - ADC HL,DE - EXX - DJNZ .fat_calc_loop - ; + CALL NZ,ALL_SECTORS_PER_FATs + ; .first_FAT_active: LD (FatBuffer.FAT1_SEC_L),HL 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: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 78c107b..9e4ff3b 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -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 diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index b8dbe6b..4b6a5b3 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -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) @@ -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 D,0 EXX - 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 + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) + AND #0F ; -.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 - LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL + LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL EXX LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),HL LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),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 diff --git a/DSS/build.txt b/DSS/build.txt index 56a6051..d8263ee 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -1 \ No newline at end of file +2 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 1dabd78..4da18d5 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 1dabd783c85be491b704d038f9efabbaf8fe697e +Subproject commit 4da18d54c12e0f2ff4183be7a1cbf5882da1bd4f