From 2ac8d1308a5ded5b64bbb3de50c79dda430f387c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 3 Jul 2024 00:15:25 +1000 Subject: [PATCH] core: fixed a bug for FAT32 with an unusually large FAT size and added another bug --- BOOT/DSSBOOT.ASM | 59 ++++++++++++++++++++++++----------- DSS/API/ChnDisk.asm | 39 +++++++++++------------ DSS/DOS_Proc.asm | 14 ++++----- DSS/FS/FAT/FAT.asm | 57 ++++++++++++++++++++++++--------- DSS/build.txt | 2 +- DSS/drivers/media/fdd-drv.asm | 11 +++---- SHELL/Commands/INFO.ASM | 4 ++- SHELL/build.txt | 2 +- 8 files changed, 119 insertions(+), 69 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 00892ce..60c13f0 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -392,18 +392,15 @@ YEPDOS: ;[ ] 17.12.2023 ; ; -GET_BPB: LD HL,#0000 - ; +GET_BPB: XOR A + LD H,A + LD L,A LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 LD (FatBuffer.RootDirFirstSector_H),HL - ;LD (FatBuffer.CacheBlock),HL - XOR A LD (FatBuffer.SectorsPerFAT_H),A ; PUSH HL POP IX - ; LD IX,#0000 - ; LD HL,#0000 LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) @@ -458,34 +455,59 @@ GET_BPB: LD HL,#0000 LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 ; - LD BC,0 + XOR A + LD B,A + LD C,A + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX + ; + ;LD BC,0 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - LD A,C + EXX + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,E + EXX + ;LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + ;LD A,C LD (FatBuffer.SectorsPerFAT_H),A LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) + ; .skip_high: LD (FatBuffer.SectorsPerFAT_L),DE LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT DEC A ADD HL,DE - JR NC,.no_inc_BC - INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.no_inc_BC + ;INC BC .no_inc_BC: ; .one_FAT: ; .loop1: ADD HL,DE - JR NC,.loop1_1 - INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.loop1_1 + ;INC BC .loop1_1: DEC A JR NZ,.loop1 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD (FatBuffer.FirstDataSector_H),BC + EXX + ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. + LD (FatBuffer.FirstDataSector_H),HL + EXX + ;LD (FatBuffer.FirstDataSector_H),BC LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD A,B AND A @@ -534,11 +556,10 @@ GET_BPB: LD HL,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - ; LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO - ; AND A - ; SBC HL,DE - ; CCF - ; RET C ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) + ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ; ..... + ; +//////////////////////////////////////////////////////////////////////// ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD BC,0 diff --git a/DSS/API/ChnDisk.asm b/DSS/API/ChnDisk.asm index 9a8cc87..119846c 100644 --- a/DSS/API/ChnDisk.asm +++ b/DSS/API/ChnDisk.asm @@ -2,24 +2,23 @@ ; ; //////////////////////////////////////////////////////////////////////// -CHNDISK_FN: - CALL CHNDISK - RET C - PUSH AF - CALL DIR_PATH_CHANGE.FullCurrent - POP AF - RET -CHNDISK:;[x] более корректная смена диска - CALL OPENDSK - ; - ;R010 - RET C - LD HL,CORE_BUFFERS.WorkDirectory - LD (HL),0 - PUSH AF - CALL OPENDIR - POP BC - RET C - LD A,B - RET +CHNDISK_FN: CALL CHNDISK + RET C + PUSH AF + CALL DIR_PATH_CHANGE.FullCurrent + POP AF + RET +CHNDISK: ;[x] более корректная смена диска + CALL OPENDSK + ; + ;R010 + RET C + LD HL,CORE_BUFFERS.WorkDirectory + LD (HL),0 + PUSH AF + CALL OPENDIR + POP BC + RET C + LD A,B + RET ; \ No newline at end of file diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 108e827..0ff063e 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -184,13 +184,13 @@ OPENDSK: ;!TEST DRV.Open LD C,A LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP C - IF CHECK_DRIVE_CHANGE - JR NZ,.open - PUSH BC - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - POP BC - ENDIF + IF CHECK_DRIVE_CHANGE + JR NZ,.open + PUSH BC + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + POP BC + ENDIF JR Z,.exit .open: LD A,C diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 57399db..1c2fc22 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -534,7 +534,7 @@ LOADDIR: ;!TODO optimize RET ; .LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 - LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B @@ -727,15 +727,25 @@ RD_BPB: ; LD C,SLOT3 ;LD (CORE_BUFFERS.FatBuffer.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 JR NZ,.skip_high ; - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - LD A,C + EXX + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,E + EXX + ; LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) + ; .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs LD (CORE_BUFFERS.FatBuffer.Number_Of_FATs),A @@ -744,18 +754,29 @@ RD_BPB: ; LD C,SLOT3 DEC A ADD HL,DE LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL - JR NC,.no_inc_BC - INC BC -.no_inc_BC: LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC -.one_FAT: ;C_DATA1 + EXX + ADC HL,DE + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL + EXX + ;JR NC,.no_inc_BC + ;INC BC +.no_inc_BC:;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC +.one_FAT: ; .loop1: ADD HL,DE - JR NC,.loop1_1 - INC BC + ;JR NC,.loop1_1 + ;INC BC + EXX + ADC HL,DE + EXX .loop1_1: DEC A JR NZ,.loop1 ; LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC + EXX + ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),HL + EXX + ;LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC ; LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,B @@ -838,19 +859,27 @@ RD_BPB: ; LD C,SLOT3 //////////////////////////////////////////////////////////////////////// ; [ ] fat32 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) - LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) + EXX + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) + EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low AND A SBC HL,DE - JP NC,.HDDBIG - DEC BC + EXX + SBC HL,DE + PUSH HL + EXX + POP BC + ;JP NC,.HDDBIG + ;DEC BC JP .HDDBIG ; .HDDSMAL: ; CF = 0 diff --git a/DSS/build.txt b/DSS/build.txt index b92b677..d8292c2 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -995 \ No newline at end of file +996 \ No newline at end of file diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index d07437e..e196213 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -210,7 +210,7 @@ GetBPB: LD IX,0 POP DE POP HL RET C - LD BC,#0018 + LD BC,BOOT_SECTOR.SectorsPerTrack ADD HL,BC LD E,(HL) PUSH DE @@ -293,7 +293,7 @@ GenIOCTL: BIT 7,B ; BC' - SECTORS PER TRACK ON PHISICAL DISK ; A' - PHISICAL DRIVE NUMBER ; A - EXTENDED INFORMATION -; D0...D3 - "0" RESERVED (MAY BE OTHER) +; D1..D3 - "0" RESERVED (MAY BE OTHER) ; D4 - DEVICE MASTER/SLAVE ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS @@ -340,25 +340,24 @@ GenIOCTL: BIT 7,B OR E JR NZ,.mull_loop2 ; - ; A=0 ZF=0 CF=0 + ; A=0 DE=0 ZF=0 CF=0 EX AF,AF' LD E,A EX DE,HL + ; H=0 + LD C,H ;[x] 17.12.2023 загрузка с активного раздела, а не с первого EXX POP DE POP HL POP AF EX AF,AF' ; A=0 ZF=0 CF=0 - LD A,B LD B,0 LD C,L LD L,H LD H,B EX DE,HL EXX - ; A=0 ZF=0 CF=0 - LD C,0 ;[x] 17.12.2023 загрузка с активного раздела, а не с первого AND A RET ; diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index 4e4a9d8..ec82682 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -83,11 +83,13 @@ cmd_info: CALL Get_Path POP BC PUSH BC LD A,C + CP "C" + JR C,.ItIsFDD LD DE,Dss.DRV.GenIOCTL.Enter LD BC,Dss.DRV.GenIOCTL.GetParams RST ToDSS.DRV ; !FIXIT не возвращает размер сектора, поэтому хардкор по 512 JR NC,.calc_size - ; +.ItIsFDD: ; LD HL,.Unknown_str LD DE,Buffers.bat_params.PRM5 ; Drive size CALL ncopy_string diff --git a/SHELL/build.txt b/SHELL/build.txt index 1fde752..5a40cf6 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -434 \ No newline at end of file +435 \ No newline at end of file