Not so HotFix 2.

-bug: Убран баг в загрузчике и ядре с детектом FAT32/16 в некоторых случаях.
-bug: OPEN_FN - убран улёт в левый адрес со стека при попытке открыть больше файлов, чем положено
-bug: GetBPB in fdd-drv.asm - проверка MBR SIGNATURE после чтения BPB для исключения неправильной установки количества Sectors Per Track
-bug: GenIOCTL.GetParams - выдавала неправильное количество секторов для FDD
fdd-drv.asm: подредактирован под новый биос
This commit is contained in:
Tolik 2025-10-28 16:51:01 +10:00
parent 12c028744a
commit 165efe603c
8 changed files with 142 additions and 68 deletions

View File

@ -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,14 +676,8 @@ 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
@ -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

View File

@ -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

View File

@ -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

View File

@ -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)
@ -1022,14 +1025,8 @@ 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
CALL NZ,ALL_SECTORS_PER_FATs
;
.first_FAT_active:
LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),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

View File

@ -1 +1 @@
59
62

View File

@ -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,6 +194,7 @@ Open: PUSH AF
OR A ; 㡨ࠥ¬ ZF, ¥á«¨ ¥áâì
;
ADD IX,DE ; ¥á«¨ à §¬¥à ᥪâ®à  ¡®«ìè¥, â® ®¡«®¬
.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
; ; ;

View File

@ -1,6 +1,16 @@
IFNDEF INCREASE_BUILD
DEFINE INCREASE_BUILD 0
ELSE
DEFINE+ INCREASE_BUILD 1
ENDIF
;------------------[ „®áâ ñ¬ ⥪ãéãî ¤ âã ¨ BUILD++ ]-----------------[]
LUA PASS1
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")

@ -1 +1 @@
Subproject commit a0e68ce3a19bd47537585e49bfbf5e45fab197a1
Subproject commit 467265101452bce67322e4b77cc0878044859eaa