From 165efe603c2ee95536b71c9ce46241050618c9c6 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 28 Oct 2025 16:51:01 +1000 Subject: [PATCH] =?UTF-8?q?Not=20so=20HotFix=202.=20-bug:=20=D0=A3=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D0=B2=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D1=87=D0=B8=D0=BA=D0=B5=20=D0=B8=20?= =?UTF-8?q?=D1=8F=D0=B4=D1=80=D0=B5=20=D1=81=20=D0=B4=D0=B5=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=BC=20FAT32/16=20=D0=B2=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D1=85=20=D1=81=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D1=8F=D1=85.=20-bug:=20OPEN=5FFN=20-=20=D1=83?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=BD=20=D1=83=D0=BB=D1=91=D1=82=20=D0=B2=20?= =?UTF-8?q?=D0=BB=D0=B5=D0=B2=D1=8B=D0=B9=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81?= =?UTF-8?q?=20=D1=81=D0=BE=20=D1=81=D1=82=D0=B5=D0=BA=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D1=80=D1=8B=D1=82=D1=8C=20=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2,=20=D1=87?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=20-bug:=20GetBPB=20in=20fdd-drv.asm=20-=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20MBR=20SIGNATURE=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F=20BPB?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B5=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=83=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B2=D0=B0=20Sectors=20Per=20Track=20-bug:?= =?UTF-8?q?=20GenIOCTL.GetParams=20-=20=D0=B2=D1=8B=D0=B4=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D0=BD=D0=B5=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B2=D0=BE=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20FDD=20fdd-drv.asm:=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=BF=D0=BE=D0=B4=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=B1=D0=B8=D0=BE=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 51 ++++++++++++++--------- BOOT/boot.asm | 4 +- DSS/API/Open.asm | 3 +- DSS/FS/FAT.asm | 60 +++++++++++++++------------ DSS/build.txt | 2 +- DSS/drivers/media/fdd-drv.asm | 76 ++++++++++++++++++++++++++--------- SHELL/version.inc | 12 +++++- Shared_Includes | 2 +- 8 files changed, 142 insertions(+), 68 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 1a71a5a..56e14fb 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -577,21 +577,28 @@ GET_BPB: XOR A ;LD L,A ;LD (FatBuffer.CacheBlock),HL ; A = 0 - LD DE,(FatBuffer.SectorsPerFAT_H) - LD D,A + 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_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT LD B,0 LD A,(FatBuffer.DirSizeInSectors) @@ -669,15 +676,9 @@ 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 - ; -.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 +701,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..891274c 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -89,14 +89,14 @@ BYTE ' Anatoliy ' BYTE ' Belyanskiy. ' BYTE ' Sprinter Team, ' - BYTE ' 2025 ' + BYTE ' 2026 ' ENDIF ENDM ; версия программы 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/API/Open.asm b/DSS/API/Open.asm index 02bac41..0199f15 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -32,11 +32,12 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 .FM: PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) ; CALL GET_FM ; enter point from ATTRIB + POP DE RET C LD A,C EX AF,AF' ;!TEST 9/11/23 record index указатель на запись в каталоге FS - POP DE + ;POP DE ; EXX LD (IY+_sFM.HANDLE),E LD (IY+_sFM.HANDLE+1),D diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index cba5fe8..f021bad 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -931,20 +931,23 @@ 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 + 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 + 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) @@ -1019,21 +1022,15 @@ 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 - ; -.fat_calc_loop: ADD HL,DE - EXX - ADC HL,DE - EXX - DJNZ .fat_calc_loop - ; + LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) + AND #0F + 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 @@ -1172,6 +1169,19 @@ 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 fc9afb4..b2412e3 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -59 \ No newline at end of file +62 \ No newline at end of file diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm index db7cb0a..ac025f2 100644 --- a/DSS/drivers/media/fdd-drv.asm +++ b/DSS/drivers/media/fdd-drv.asm @@ -178,11 +178,12 @@ Init: LD A,2 ; ; ; ; ; -Open: PUSH AF +Open: PUSH IY + PUSH AF LD C,BIOS.DRV_RESET RST ToBIOS POP BC - RET C + JR C,.error ; LD A,B LD C,BIOS.DRV_GET_PAR @@ -193,7 +194,8 @@ Open: PUSH AF OR A ; убираем ZF, если есть ; ADD IX,DE ; если размер сектора больше, то облом - RET +.error: POP IY + RET ; ; ; ; @@ -216,7 +218,19 @@ MediaCheck: CALL Open ;DE - ADDRESS -GetBPB: LD IX,0 +GetBPB: PUSH IY + CALL .Start + POP IY + RET + ; +.Start: LD IX,0 + ; fix bug 14/01/2026. если нет MBR, то никаких муток + LD H,D + LD L,E + LD BC,BOOT_SECTOR.MBR_SIGNATURE + ADD HL,BC + LD (HL),C + ; LD HL,0 PUSH DE PUSH AF @@ -225,18 +239,30 @@ GetBPB: LD IX,0 POP DE POP HL RET C + ; LD BC,BOOT_SECTOR.SectorsPerTrack ADD HL,BC LD E,(HL) - PUSH DE + ; fix bug 14/01/2026. если нет MBR, то никаких муток + LD BC,BOOT_SECTOR.MBR_SIGNATURE - BOOT_SECTOR.SectorsPerTrack + ADD HL,BC + LD C,(HL) + INC HL + LD B,(HL) + LD HL,#AA55 + SBC HL,BC + LD A,DSS_Error.drv.UNKNOWN_FORMAT + SCF + RET NZ + ; + PUSH DE ; D - drive, E - Sectors Per Track LD A,D LD C,BIOS.DRV_GET_PAR RST ToBIOS - LD A,H - POP HL - PUSH HL - LD H,A - POP AF + LD C,H ; C heads + POP HL ; H - drive, L - Sectors Per Track + LD A,H ; A - drive + LD H,C ; H - heads, L - Sectors Per Track LD C,BIOS.DRV_SET_PAR RST ToBIOS XOR A @@ -250,14 +276,18 @@ GetBPB: LD IX,0 ; ; ; -Read: LD C,BIOS.DRV_READ +Read: PUSH IY + LD C,BIOS.DRV_READ RST ToBIOS + POP IY RET ; ; ; -Write: LD C,BIOS.DRV_WRITE +Write: PUSH IY + LD C,BIOS.DRV_WRITE RST ToBIOS + POP IY RET ; ; ; @@ -324,19 +354,23 @@ GenIOCTL: BIT 7,B RET ; .next: PUSH AF + PUSH IY LD C,BIOS.DRV_GET_PAR RST ToBIOS + POP IY JR C,.NONE_FDD + ; PUSH HL PUSH DE LD A,H - LD H,0 - ; -.mull_loop1: ADD HL,HL + LD C,L + LD HL,0 + LD B,H +.mull_loop1: ADD HL,BC DEC A JR NZ,.mull_loop1 ; - ; HL - SECTOR PER CYLLINDER + ; HL - SECTORS PER CYLINDER ; A=0 ZF=0 CF=0 LD B,H LD C,L @@ -393,7 +427,12 @@ GenIOCTL: BIT 7,B ; D5 - "1" RESERVED ; D6 - ADDRESSING MODE LBA/CHS ; D7 - "1" RESERVED -.SetParams: PUSH AF +.SetParams: PUSH IY + CALL .Start + POP IY + RET + ; +.Start: PUSH AF EXX EX DE,HL LD H,L @@ -410,7 +449,8 @@ GenIOCTL: BIT 7,B JR C,.NONE_FDD POP AF LD C,BIOS.DRV_SET_PAR - JP ToBIOS + RST ToBIOS + RET ; ; ; diff --git a/SHELL/version.inc b/SHELL/version.inc index d78a3bc..d1b40cf 100644 --- a/SHELL/version.inc +++ b/SHELL/version.inc @@ -1,6 +1,16 @@ + IFNDEF INCREASE_BUILD + DEFINE INCREASE_BUILD 0 + ELSE + DEFINE+ INCREASE_BUILD 1 + ENDIF ;------------------[ Достаём текущую дату и BUILD++ ]-----------------[] LUA PASS1 - Console_build = increase_build("./SHELL/build.txt") + if sj.get_define("INCREASE_BUILD") > "0" then + Console_build = increase_build("./SHELL/build.txt") + else + Console_build = get_build("./SHELL/build.txt") + end + if Console_build > 999 then Console_build = 999 print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a") diff --git a/Shared_Includes b/Shared_Includes index a0e68ce..4672651 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a0e68ce3a19bd47537585e49bfbf5e45fab197a1 +Subproject commit 467265101452bce67322e4b77cc0878044859eaa