boot.asm, dssboot.asm - поддержка записи/чтения части загрузчика в/из нулевого сектора

This commit is contained in:
Anatoliy Belyanskiy 2024-06-09 04:22:07 +10:00
parent fda917aed8
commit f2eb4e47e3
3 changed files with 379 additions and 768 deletions

View File

@ -1,6 +1,6 @@
;---------------------------------------------------------------
;------------------------------------------------------------------------------
;Rev Date Name Decription
;---------------------------------------------------------------
;------------------------------------------------------------------------------
;R04 25-03-2023 BAO ; !FIXIT
;R03 23-01-2000 DNS OPTIMIZE NEW BOOTING PROCEDURE
;R02 08-01-2000 DNS NEW BOOTING PROCEDURE
@ -11,14 +11,24 @@
; + System Bootstrap +
; + Initial revision 09 Nov 1998 +
; +------------------------------+
MODULE DSS_Boot_Loader
; BIOS 3.06 § £à㦠¥â ®¤¨­ ᥪâ®à § £àã§ç¨ª  ¨ ¯¥à¥¤ ñâ ¥¬ã ã¯à ¢«¥­¨¥.
DEFINE ORIGINAL_DSS 0
DEFINE UNIVERSAL_BOOT 1
LOAD_SECTORS EQU SECTORS_OF_LOADER-1
DISP #8000
; 0 - ®à¨£¨­ «ì­ë© ¢ à¨ ­â § ¯ã᪠ DSS, 1 - ¢ à¨ ­â ‘ ©¬ ­ 
DEFINE ORIGINAL_DSS 0
; 1 - ¡ã¤¥â £à㧨âì ¢¥àá¨î ‘ ©¬ ­  ¨ ®á­®¢­ãî. 0 - ⮫쪮 ®á­®¢­ãî.
DEFINE UNIVERSAL_BOOT 1
;------------------------------------------------------------------------------
ORG_ADDRESS EQU #8000
LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB
LOADER_IN_BPB:
.MAX_SIZE EQU 300
;------------------------------------------------------------------------------
DISP ORG_ADDRESS
OUTPUT 'build/DSSloader.bin'
@ -301,9 +311,10 @@ PART_TB: PUSH BC
LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD)
;
LD HL,YEPDOS
;
PUSH HL
.part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID)
; …‘‹ˆ ¤®¡ ¢¨âáï ¯®¤¤¥à¦ª  ¥éñ ®¤­®£® ⨯  ”‘, â® ¯®¬¥­ïâì 1 ­  2
; …‘‹ˆ ¤®¡ ¢¨âáï ¯®¤¤¥à¦ª  ¥éñ ­¥áª®«ìª¨å ⨯®¢ ”‘, â® ¯®¬¥­ïâì 1fs ­  2fs
; 1
CP PartitionSysTypes.FAT16_LBA
RET Z ;JR Z,YEPDOS
@ -318,13 +329,13 @@ PART_TB: PUSH BC
CP PartitionSysTypes.FAT32_LBA
RET Z ;JR Z,YEPDOS
;
; 2
; 2fs
; EXX
; LD HL,SUPPORTED_PARTITIONS
; LD BC,SUPPORTED_PARTITIONS.Size
; CPIR
; EXX
;JR Z,YEPDOS
; RET Z ;JR Z,YEPDOS
;
.next: LD DE,_sMBR_PARTITION_RECORD
ADD IX,DE
@ -332,7 +343,7 @@ PART_TB: PUSH BC
;
LD HL,MESSAGES.ERRPART
JP FAIL
; 2
; 2fs
; SUPPORTED_PARTITIONS:
; ;.Empty DB #00
; .FAT12 DB #01
@ -380,161 +391,14 @@ YEPDOS: ;[ ] 17.12.2023
RET
;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
GET_BPB: LD IX,#0000
LD HL,#0000
LD DE,BOOT_BUFFER
LD BC,1*256 + BIOS.DRV_READ
LD A,(DRIVE)
RST ToBIOS_18
RET C
LD A,(DRIVE)
LD B,A
AND #F0
LD C,A
CP #80
JR NZ,.NX1
CALL PART_TB ;HDD
RET C
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD (DRIVE+1),HL
;
.NX1: CP #00
JR NZ,.NX2
;
; SET_PRM if FDD
PUSH BC
LD A,B
LD C,BIOS.DRV_GET_PAR
RST ToBIOS_18
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack)
LD L,A
POP AF
;PUSH AF
LD C,BIOS.DRV_SET_PAR
RST ToBIOS_18
;POP BC
;LD A,C ; ­ å¥à ?
;RET
.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55
AND A
SBC HL,DE
SCF
RET NZ
;
LD IY,BOOT_BUFFER ;Analysing Block Parametr BIOS
LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0
RET C
LD HL,0 ;calc. first sector FAT
LD (FatBuffer.RootDirFirstSector_H),HL
;
LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec
LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1)
ADD HL,DE
LD (FatBuffer.FAT1_SEC_L),HL ;first sector FAT
LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT
LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1)
LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ;amount FATs
.C_DATA1: ADD HL,DE
DEC A
JR NZ,.C_DATA1
LD (FatBuffer.RootDirFirstSector_L),HL ;first sector DIR
EX DE,HL
LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel
LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,H
SRL A
LD (FatBuffer.DirSizeInSectors),A ;Sectors per dir
LD L,A
LD H,0
ADD HL,DE
LD (FatBuffer.FirstDataSector_L),HL ;First sector data
;
LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector
LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1)
LD HL,0
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
.NEXTAD3: ADD HL,BC ;calc. cluster size
DEC A
JR NZ,.NEXTAD3
LD (FatBuffer.BytesPerCluster),HL
LD HL,BOOT_BUFFER + BOOT_SECTOR.ID_FAT
LD DE,FATMSG
LD B,3
.R_BPBL1: LD A,(DE)
CP (HL)
JP NZ,.IBMDOS_
INC HL
INC DE
DJNZ .R_BPBL1
.FID: LD A,(HL)
INC HL
CP " "
JR Z,.FID
CP "1"
SCF
RET NZ
LD A,(HL)
CP "6" ; FAT16
;LD HL,#FFFF
JR Z,.BPB_FAT
CP "2" ; FAT12
SCF
RET NZ
;LD HL,#0FFF
.BPB_FAT: LD (FatBuffer.FAT_TYPE),A
;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL
;
LD IX,(PARTITION_START_L)
LD HL,(PARTITION_START_H)
LD DE,(FatBuffer.FAT1_SEC_L)
LD BC,#0000
ADD IX,DE
ADC HL,BC
;HL:IX
LD DE,FAT_SECTORS_BUFFER
LD BC,3*256 + BIOS.DRV_READ
LD A,(DRIVE)
RST ToBIOS_18
RET C
LD HL,0
LD (FatBuffer.CacheBlock),HL
XOR A
RET
;
.IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0
RET C
CP #F8
LD A,"6"
LD HL,#FFFF
JR Z,.BPB_FAT
LD A,"2"
LD HL,#0FFF
JR .BPB_FAT
;*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;/*
GET_BPB: LD HL,#0000
;
LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 ; fat32
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 ; fat32
LD (FatBuffer.SectorsPerFAT_H),A
;
PUSH HL
POP IX
@ -545,6 +409,12 @@ GET_BPB: LD HL,#0000
LD A,(DRIVE)
RST ToBIOS_18
RET C
; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¨§ 0 ᥪâ®à 
LD HL,BOOT_BUFFER + (_sBOOT_SECTOR.PARTITION_TABLE - ZERO_SECTOR_OF_BPB.Size)
LD DE,ZERO_SECTOR_OF_BPB
LD BC,ZERO_SECTOR_OF_BPB.Size
LDIR
;
LD A,(DRIVE)
LD B,A
AND #F0
@ -632,14 +502,12 @@ GET_BPB: LD HL,#0000
;
EX DE,HL
LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32
; fat32
LD A,H
OR L
JR Z,.skip_loop2
;
DEC HL
XOR A
;NEXTAD2
.loop2: INC A
RET C
SBC HL,BC
@ -799,33 +667,8 @@ GET_BPB: LD HL,#0000
AND A
RET
;
;;;;;;;;
;
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
; DIV_for_SPC:
; LD C,A
; DEC A
; JR Z,.DIV_exit
; ;
; AND E
; LD B,A ; ®áâ â®ª
; LD A,C
; RRCA
; ;
; .DIV_loop: SRL H
; RR L
; RR D
; RR E
; RRCA
; JP NC,.DIV_loop
; LD A,B
; .DIV_exit: LD B,D
; LD C,E
; EX DE,HL
; LD H,0
; LD L,A
; RET
;
;NSECTOR:
; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR
@ -866,8 +709,7 @@ CLUSTER_TO_SECTOR:
POP BC
RET
;
;*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ¯®¨áª system.dos
GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
@ -879,7 +721,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
LD A,(FatBuffer.DirSizeInSectors)
JR NZ,.NEXTSEC
;
LD A,(FatBuffer.SectorsPerCluster);!FIXIT ¯à®çâñâ ⮫쪮 ¯¥à¢ë© ª« áâ¥à ä ©«®¢ ­  FAT32
LD A,(FatBuffer.SectorsPerCluster);!FIXIT ¯à®çâñâ ⮫쪮 ¯¥à¢ë© ª« áâ¥à ª â «®£  ­  FAT32
.NEXTSEC: PUSH AF
ADD IX,BC
JR NC,.skip_inc
@ -1018,232 +860,9 @@ LOAD_CORE: LD (READMEM),DE
EXX
EX DE,HL
JP .loop
; HL - CLUSTER
; DE - ADDRESS
;!TODO ᤥ« âì âãâ ®¯à¥¤¥«¥­¨¥ à §¬¥à  SYSTEM.DOS ¨ ¢®§¬®¦­®áâì § £à㧨âì ¡®«ìè¥ 1 áâà ­¨æë
; FLOAD: LD (READMEM),DE
; .LD_FILE: PUSH HL ; system.dos first cluster
; CALL NSECTOR ; Cluster to Sector
; LD DE,(READMEM)
; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
; CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
; LD C,BIOS.DRV_READ_LONG
; JR C,.SMALL_CLUSTER
; LD A,(BANKDOS)
; EX AF,AF'
; ;LD BC,#20*256 + BIOS.DRV_READ_LONG
; LD B,#20 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
; .set_drv: LD A,(DRIVE)
; RST ToBIOS_18
; JP C,GOOD_DRIVE.NoShell
; POP HL
; ; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
; ;AND A
; ;RET
; LD A,(BIG_SHELL)
; OR A
; RET Z
; ;
; XOR A
; LD (BIG_SHELL),A
; PUSH HL
; CALL NSECTOR
; LD DE,#20 ; !HARDCODE ª®«-¢® ¯à®ç¨â ­­ëå ᥪâ®à®¢
; AND A
; ADD IX,DE
; JR NC,.no_inc_hl
; INC HL
; .no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE ª®«-¢® „ާ £à㦠¥¬ëå ᥪâ®à®¢
; LD DE,#4000
; JR .set_drv
; ;
; .SMALL_CLUSTER: LD B,A
; LD A,(BANKDOS)
; EX AF,AF'
; LD A,(DRIVE)
; RST ToBIOS_18
; JP C,GOOD_DRIVE.NoShell
; ;
; LD HL,(READMEM)
; LD DE,(CLU_LEN)
; ADD HL,DE
; LD (READMEM),HL
; ; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
; ;POP HL
; ;RET C
; CALL C,.more_than_1
; POP HL
; RET C
; ;
; CALL R_F_FAT ; next cluster in chain
; RET C
; EX DE,HL
; JP .LD_FILE
; ; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
; .more_than_1: LD A,(BIG_SHELL)
; OR A
; SCF
; RET Z
; IN A,(SLOT1)
; LD HL,BANKDOS
; CP (HL)
; CCF
; RET Z
; LD (BANKDOS),A
; LD HL,#C000
; LD (READMEM),HL
; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
; SUB SUBLOAD_SIZE + 1
; CCF
; RET NC
; LD A,SUBLOAD_SIZE
; LD (BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster),A
; AND A
; RET
;
;
/*
; --> HL - CLUSTER
; <-- HL:IX - SECTOR
NSECTOR: LD DE,0
DEC HL
DEC HL
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
XOR 1
JR Z,.skip
;
RRA
.loop: ADD HL,HL
RL E
RL D
RRA
JP NC,.loop
;
.skip: EX DE,HL
PUSH DE
POP IX
LD DE,(FatBuffer.FirstDataSector_L) ;first data sector
XOR A
ADD IX,DE
LD D,A
LD E,A
ADC HL,DE
;
LD DE,(PARTITION_START_L)
ADD IX,DE
LD DE,(PARTITION_START_H)
ADC HL,DE
RET
*/
;------------------------------------------------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; ¢ë室: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®)
; de - ­®¬¥à á«¥¤. ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; de' - ­®¬¥à á«¥¤. ª« áâ¥à  (áâ à襥 á«®¢®)
; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥­
; CF - ª®­¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------
READ_FROM_FAT: PUSH HL
;
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à
.FAT16: CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
;
LD HL,SERVICE_SECTORS.FAT16
.exit: POP AF
OUT (SLOT3),A
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
SBC HL,DE
POP HL
;!FIXIT fat32 ¯¥à¥áâà å®¢ª 
EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
RET
;
;
.FAT12: CALL GET_FAT12_CELL
LD E,(HL)
INC HL
LD D,(HL)
LD HL,SERVICE_SECTORS.FAT12
JR NC,.Correct_2
.Correct_1: LD A,E
AND #F0
DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RR D
RRA
EDUP
LD E,A
JR .exit
;
.Correct_2: LD A,D
AND #0F
LD D,A
JR .exit
;
.FAT32: EXX
PUSH HL
EXX
;
CALL GET_FAT32_CELL
; ¯à®ç¨â âì ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD E,(HL)
INC HL
LD D,(HL)
INC HL
; ¯à®ç¨â âì áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD A,(HL)
INC HL
EX AF,AF'
LD A,(HL)
EXX
AND #0F
LD D,A
EX AF,AF'
LD E,A
EXX
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë ¬« ¤è¥£® á«®¢  ª« áâ¥à 
LD HL,SERVICE_SECTORS.FAT32.Low
SBC HL,DE
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë áâ à襣® á«®¢  ª« áâ¥à 
EXX
LD HL,SERVICE_SECTORS.FAT32.High
SBC HL,DE
POP HL
EXX
POP BC
LD A,B
OUT (SLOT3),A
POP HL
LD A,0
RET
;
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
@ -1302,7 +921,6 @@ GET_FAT16_CELL: LD A,H
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
; [x] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
@ -1312,167 +930,6 @@ GET_FAT16_CELL: LD A,H
ADD HL,DE ; ­  ï祩ªã FAT
RET
;
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A,H
EXX
LD C,A
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
LD A,C
;
LD B,FAT_CACHE.Degree ; 4 ᤢ¨£ 
.loop_block: RLCA ; << H
RL L ; << L'
RL H ; << H'
DJNZ .loop_block
EXX
; ¨â®£¥ âãâ ¢ HL' ­®¬¥à ¡«®ª  FAT
;
; HL - FAT32 OFFSET (FROM CASH)
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
ADD HL,HL
ADD HL,HL
PUSH HL ; [ç] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX
EX DE,HL
LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;
/*
;-----------------
; HL - CLUSTER
; DE - (CLUSTER)
R_F_FAT: PUSH HL
LD A,(FatBuffer.FAT_TYPE)
CP "2"
JP Z,.R_F_F12
;
.R_F_F16: LD DE,768 ; DE - CLUSTERS IN CASH
XOR A
.R_F_00H: INC A ; HL - CLUSTER ; [ ] fat32 âãâ áçñâ稪 ¢ 32 ¡¨â  ­ã¦¥­ ¨«¨ 16, ¥á«¨ áâà ­¨æã FF ¨á¯®«ì§®¢ âì
SBC HL,DE
JP NC,.R_F_00H
ADD HL,DE
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
DEC A
LD BC,(FatBuffer.CacheBlock) ; A - ELEMENT OF CASH
CP C
CALL NZ,RE_FAT
LD DE,FAT_SECTORS_BUFFER
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD HL,#FFEF
;
.exit: XOR A
SBC HL,DE
POP HL
RET
;
.R_F_F12 LD D,H
LD E,L
ADD HL,HL
ADD HL,DE
RR H
RR L
PUSH AF
EX DE,HL
LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
LD B,H
LD C,L
ADD HL,HL
ADD HL,BC
EX DE,HL
XOR A ; DE - SIZE SECTOR * 3
.R_F_00: INC A ; HL - FAT OFFSET
SBC HL,DE
JP NC,.R_F_00
ADD HL,DE
DEC A
LD BC,(FatBuffer.CacheBlock)
CP C
CALL NZ,RE_FAT
LD DE,FAT_SECTORS_BUFFER
ADD HL,DE
POP AF
LD E,(HL)
INC HL
LD D,(HL)
JP C,.R_F_F01
LD A,D
AND #0F
LD D,A
JR .R_F_F02
;
.R_F_F01: LD A,E
AND #F0
RR D ; ¢¯à ¢® ­  4 ¡¨âa
RRA
RR D
RRA
RR D
RRA
RR D
RRA
LD E,A
;
.R_F_F02: LD HL,#0FEF
JR .exit
; XOR A
; SBC HL,DE
; POP HL
; RET
;
*/
;
;
/*
RE_FAT: PUSH HL
LD L,A
LD H,0
LD (FatBuffer.CacheBlock),HL
LD E,L
LD D,H
ADD HL,HL
ADD HL,DE
LD IX,0
LD DE,(FatBuffer.FAT1_SEC_L)
ADD HL,DE
EX DE,HL
JR NC,.NOINX
INC IX
.NOINX: LD HL,(PARTITION_START_L)
ADD HL,DE
EX DE,HL
LD BC,(PARTITION_START_H)
JR NC,.NOINX2
INC IX
.NOINX2: ADD IX,BC
PUSH IX
PUSH DE
POP IX
POP HL
LD DE,FAT_SECTORS_BUFFER
LD BC,3*256 + BIOS.DRV_READ
LD A,(DRIVE)
RST ToBIOS_18
POP HL
RET
*/
;
;RE_FAT:
;RX01
@ -1542,6 +999,198 @@ GET_SECTOR_OF_FAT:
;
LD C,A
RET
;
;
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
; DIV_for_SPC:
; LD C,A
; DEC A
; JR Z,.DIV_exit
; ;
; AND E
; LD B,A ; ®áâ â®ª
; LD A,C
; RRCA
; ;
; .DIV_loop: SRL H
; RR L
; RR D
; RR E
; RRCA
; JP NC,.DIV_loop
; LD A,B
; .DIV_exit: LD B,D
; LD C,E
; EX DE,HL
; LD H,0
; LD L,A
; RET
//// //// //// //// //// //// //// //// ////
//// //// //// //// //// //// //// //// ////
DISPLAY "SECTORS 1..3 DATA ENDS: ",/H,$,". Size: ",/D,$-ORG_ADDRESS," b. Free: ",/D,512*3-($-ORG_ADDRESS)," b."
ZERO_SECTOR_OF_BPB:
.physical EQU $$$
//// //// //// //// //// //// //// //// ////
//// //// //// //// //// //// //// //// ////
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A,H
EXX
LD C,A
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
LD A,C
;
LD B,FAT_CACHE.Degree ; 4 ᤢ¨£ 
.loop_block: RLCA ; << H
RL L ; << L'
RL H ; << H'
DJNZ .loop_block
EXX
; ¨â®£¥ âãâ ¢ HL' ­®¬¥à ¡«®ª  FAT
;
; HL - FAT32 OFFSET (FROM CASH)
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
ADD HL,HL
ADD HL,HL
PUSH HL
AND A
;
EXX
EX DE,HL
LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;
;------------------------------------------------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; ¢ë室: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®)
; de - ­®¬¥à á«¥¤. ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; de' - ­®¬¥à á«¥¤. ª« áâ¥à  (áâ à襥 á«®¢®)
; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥­
; CF - ª®­¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------
READ_FROM_FAT: PUSH HL
;
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à
.FAT16: CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
;
LD HL,SERVICE_SECTORS.FAT16
.exit: POP AF
OUT (SLOT3),A
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
SBC HL,DE
POP HL
EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
RET
;
;
.FAT12: CALL GET_FAT12_CELL
LD E,(HL)
INC HL
LD D,(HL)
LD HL,SERVICE_SECTORS.FAT12
JR NC,.Correct_2
.Correct_1: LD A,E
AND #F0
DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RR D
RRA
EDUP
LD E,A
JR .exit
;
.Correct_2: LD A,D
AND #0F
LD D,A
JR .exit
;
.FAT32: EXX
PUSH HL
EXX
;
CALL GET_FAT32_CELL
; ¯à®ç¨â âì ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD E,(HL)
INC HL
LD D,(HL)
INC HL
; ¯à®ç¨â âì áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD A,(HL)
INC HL
EX AF,AF'
LD A,(HL)
EXX
AND #0F
LD D,A
EX AF,AF'
LD E,A
EXX
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë ¬« ¤è¥£® á«®¢  ª« áâ¥à 
LD HL,SERVICE_SECTORS.FAT32.Low
SBC HL,DE
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë áâ à襣® á«®¢  ª« áâ¥à 
EXX
LD HL,SERVICE_SECTORS.FAT32.High
SBC HL,DE
POP HL
EXX
POP BC
LD A,B
OUT (SLOT3),A
POP HL
LD A,0
RET
;
//// //// //// //// //// //// //// //// ////
//// //// //// //// //// //// //// //// ////
DISPLAY "SECTORS 0 DATA ENDS:\t\t",/H,$,". Size: ",/D,$-ZERO_SECTOR_OF_BPB," b. Free: ",/D,LOADER_IN_BPB.MAX_SIZE-($-ZERO_SECTOR_OF_BPB)," b."
DISPLAY "_sBOOT_SECTOR.BOOT_CODE ", /H, _sBOOT_SECTOR.BOOT_CODE
DISPLAY "_sBOOT_SECTOR.PARTITION_TABLE ", /H, _sBOOT_SECTOR.PARTITION_TABLE
DISPLAY "_sBOOT_SECTOR.MBR_SIGNATURE ", /H, _sBOOT_SECTOR.MBR_SIGNATURE
ZERO_SECTOR_OF_BPB_END:
ZERO_SECTOR_OF_BPB.Size EQU ZERO_SECTOR_OF_BPB_END - ZERO_SECTOR_OF_BPB
//// //// //// //// //// //// //// //// ////
//// //// //// //// //// //// //// //// ////
;
;
////////////////////////////////////////////////////////////////////////
; Area for boot sector [512Bytes]
;BOOT _sBOOT_SECTOR_PARAMS = $
@ -1554,72 +1203,6 @@ FAT_SECTORS_BUFFER EQU #C000
VALUE EQU DIR_BUFFER+512
FatBuffer _sysFatBuffer = VALUE
/*
.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
.CacheBlock: WORD #0000
.CacheUpdated: BYTE #00
.RootDirStartCluster_L: WORD #0000
.RootDirStartCluster_H: WORD #0000 ; fat32
.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
.FAT1_SEC_H: WORD #0000 ; fat32
.FAT2_SEC_L: WORD #0000
.FAT2_SEC_H: WORD #0000 ; fat32
.Number_Of_FATs BYTE #02
.SectorsPerFAT_L WORD #0000
.SectorsPerFAT_H BYTE #00
.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF
.END_CHAIN_CLUSTER_H: WORD #0FFF
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.BytesPerSector: WORD #0000
.SectorsPerCluster: BYTE #00
.FSINFO_Sector: WORD #01
.BPB_SERIAL_NUMBER: DWORD #00000000
.BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
.UPD_FSINFO: BYTE 0
.FREE_CLUSTERS_COUNT_L: WORD #FFFF
.FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
FatBuffer EQU VALUE
.CacheBlock EQU FatBuffer+0 ; FatCache
.FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT
.RootDirFirstSector_H EQU FatBuffer+4 ; DIR_FRH MSD_CAT_SEC first sector DIR
.RootDirFirstSector_L EQU FatBuffer+6 ; DIR_FRL MSD_CAT_SEC first sector DIR
.DirSizeInSectors EQU FatBuffer+8 ; DIR_S_S DIR_SEC_SIZE
.FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC
.FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit)
.BytesPerCluster EQU FatBuffer+12; CLU_LEN
.FAT1_SEC_H EQU FatBuffer+14 ;
.SectorsPerFAT_L EQU FatBuffer+16
.SectorsPerFAT_H EQU FatBuffer+18
.FAT2_SEC_L EQU FatBuffer+20
.FAT2_SEC_H EQU FatBuffer+22
;.END_CHAIN_CLUSTER_L EQU FatBuffer+14; ENDCLUS
*/
; FatCache EQU VALUE+0 ; .CacheBlock
; FAT_FRM EQU FatCache+2 ; .FAT1_SEC_L MSD_FAT_SEC first sector FAT
; DIR_FRH EQU FatCache+4 ; .RootDirFirstSector_H MSD_CAT_SEC first sector DIR
; DIR_FRL EQU FatCache+6 ; .RootDirFirstSector_L MSD_CAT_SEC first sector DIR
; DIR_S_S EQU FatCache+8 ; .DirSizeInSectors DIR_SEC_SIZE
; DAT_FRM EQU FatCache+9 ; .FirstDataSector_L MSD_DAT_SEC
; FAT_TYP EQU FatCache+11; .FAT_TYPE ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit)
; CLU_LEN EQU FatCache+12; .BytesPerCluster
; ENDCLUS EQU FatCache+14; .END_CHAIN_CLUSTER_L
HANDBUF EQU VALUE + _sysFatBuffer

View File

@ -1,6 +1,9 @@
////////////////////////////////////////////////////////////////////////
; CHANGELOG
; [ ] - ®¯à¥¤¥«¥­¨¥ ¯®¯ë⪨ ᤥ« âì § £àã§®ç­ë¬ ­¥ ¯¥à¢ë© à §¤¥«
; [x] - § £à㧪  á «î¡®£® primary active à §¤¥« 
; [x] - ¯®¤¤¥à¦ª  § £à㧪¨ á FAT32 à §¤¥« 
; [x] - § £à㧪  á RAM ¤¨áª 
; [x] - bug fixes and optimizations)))
////////////////////////////////////////////////////////////////////////
@ -85,7 +88,9 @@
major_version equ 2 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 0 ; ¬«. ­®¬¥à
;;
SECTORS_OF_LOADER EQU 4
SECTORS_OF_LOADER EQU 4 ; ᥪâ®à®¢ § £àã§ç¨ª 
.IN_BPB EQU 1
.AFTER_BPB EQU 3
org_addr EQU #8000 + CLP_Buffer
code_addr EQU BEGIN
@ -110,7 +115,7 @@ BEGIN: in a,(SLOT3)
ld de,#0146 ; 1.70.810 d=¢¥àá¨ï, e=¬®¤¨ä¨ª æ¨ï, bc - ­®¬¥à ᡮન. de = #0146, bc = 810 dos ver 1.70.810
and a
sbc hl,de
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
;jr nc,version_ok
jr z,.check_build ; ¥á«¨ ­®¬¥à ¢¥àᨨ 1.70
jr nc,version_ok ; ¥á«¨ ­®¬¥à ¢¥àᨨ ¡®«ìè¥ 1.70
@ -120,7 +125,7 @@ BEGIN: in a,(SLOT3)
call print_string
ld a,-1
jp exit
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
.check_build: ld hl,810 ; 1.70.810 d=¢¥àá¨ï, e=¬®¤¨ä¨ª æ¨ï, bc - ­®¬¥à ᡮન. de = #0146, bc = 810 dos ver 1.70.810
sbc hl,bc
jr nc,BEGIN.old_ver
@ -315,8 +320,6 @@ write_boot_loader:
jr z,write_to_floppy
cp #FA ; RAM disk
jr z,write_to_ram_disk
; pop hl ; ¢®ááâ. ¡ « ­á á⥪ 
; call close_device
cp #F8 ; ¢¨­â
jp z,write_to_hard_disk
scf ; ­¥§­ ª®¬ë© ä®à¬ â
@ -348,19 +351,20 @@ write_to_floppy:
ld (buffer + BOOT_SECTOR.Number_of_FATs),a ; ç¨á«® ª®¯¨© FAT-®¢
ld hl,(buffer + BOOT_SECTOR.RESERVED_SECTORS) ; § à¥§¥à¢. ᥪâ®à®¢
ld bc,(buffer + BOOT_SECTOR.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT
; ld a,b
; or c
; scf
; ret z ; 0 ᥪâ®à®¢ ­  FAT
; ;
add hl,bc
ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; § à¥§¥à¢. ᥪâ®à®¢
dec hl
ld de,SECTORS_OF_LOADER
ld de,SECTORS_OF_LOADER.AFTER_BPB
and a
sbc hl,de
ret c
overwrite_floppy:
; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¢ 0 ᥪâ®à
LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical
LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size)
LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size
LDIR
;
; § ¯¨á âì boot-ᥪâ®à ­ § ¤
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
@ -374,7 +378,7 @@ overwrite_floppy:
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,SECTORS_OF_LOADER*256 + Dss.DRV.Write ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+Dss.DRV.Write; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst ToDSS.DRV
ret
@ -386,69 +390,27 @@ overwrite_floppy:
; ¢ë室: CF-®è¨¡ª  § ¯¨á¨
;-------------------------------------------------
write_to_ram_disk:
write_to_: ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
ld de,#55AA
ld bc,Dss.DRV.GenIOCTL.GetParams
rst ToDSS.DRV
ex af,af'
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
ld b,a
inc c
scf
ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
dec c
CP #80 ;!HARDCODE ⨯ ¤à ©¢  - HDD
JR NC,.skip_FAT_check
push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â)
LD HL,0
LD IX,0
LD DE,buffer
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
POP BC
LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
LD DE,SECTORS_OF_LOADER + 1 ; ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1)
AND A
SBC HL,DE
CALL write_no_BPB
RET C
; buffer = sector 0
;
.skip_FAT_check:;
push bc
ld a,b
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,SECTORS_OF_LOADER*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst ToBIOS
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
pop bc
;
ret
JR write_to_BPB
write_to_hard_disk:
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
CALL write_to_
CALL write_no_BPB
RET C
; ¯à®¢¥àª  ­  <20>€Œ-¤¨áª
; buffer = sector 0
;
; ¯à®¢¥àª  ­  <20>€Œ-¤¨áª (à §¤¥«ë ­  à ¬¤¨áª¥ ¯®ª  ­¥ ¯®¤¤¥à¦¨¢ îâáï)
LD A,B
CP #80-1 ;!HARDCODE HDD number
CCF
RET NC
JR C,write_to_BPB
;
PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
LD HL,0
LD IX,0
LD DE,buffer
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
; check signature
LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55
AND A
SBC HL,DE
POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
SCF
PUSH BC
CALL Read_MBR
RET NZ
POP BC
PUSH BC
; set active in buffer
INC C
@ -464,7 +426,6 @@ write_to_hard_disk:
;
LD A,#80
LD (HL),A
;!FIXIT fat32 not supported
PUSH HL
INC HL
INC HL
@ -492,9 +453,16 @@ write_to_hard_disk:
.next: AND A
SBC HL,DE
DJNZ .loop
; save buffer to disk
POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
ld a,b
;
JR write_to_BPB.no_push
write_to_BPB: PUSH BC
; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¢ 0 ᥪâ®à
.no_push: LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical
LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size)
LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size
LDIR
; § ¯¨áì ¢ 0 ᥪâ®à ªã᪠ § £àã§ç¨ª 
pop af ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
@ -502,6 +470,64 @@ write_to_hard_disk:
RST ToBIOS
RET
;
;
write_no_BPB: ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
ld de,#55AA
ld bc,Dss.DRV.GenIOCTL.GetParams
rst ToDSS.DRV
ex af,af'
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
ld b,a
inc c
scf
ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
dec c
CP #80 ;!HARDCODE ⨯ ¤à ©¢  - HDD
JR NC,.skip_FAT_check
PUSH BC
; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
; A - PHISICAL DRIVE NUMBER
; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â)
CALL Read_MBR
RET NZ
POP BC
LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
; ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1)
LD DE,SECTORS_OF_LOADER.AFTER_BPB + 1
AND A
SBC HL,DE
RET C
;
.skip_FAT_check:;
push bc
ld a,b
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+BIOS.DRV_WRITE; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst ToBIOS
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
pop bc
;
ret
; in: a - drive
; out CF = 1.
; ZF = 1 - OK,
; ZF = 0 - error
Read_MBR: LD HL,0
LD IX,0
LD DE,buffer
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55
AND A
SBC HL,DE
SCF
RET
;-------------------------------------------------
; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨
;
@ -867,6 +893,8 @@ write_file: ld a,FAT_ATTR.ARCHIVE ;
; „Ž‘-§ £àã§ç¨ª
code_loader: include 'dssboot.asm' ; ã­¨¢¥àá «ì­ë© § £àã§ç¨ª ¤«ï áâ à®£® ¨ ­®¢®£® ¤®á 
code_loader.size EQU $-code_loader
ASSERT SECTORS_OF_LOADER*512 >= (code_loader.size), "incorrect value of the SECTORS_OF_LOADER variable"
DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",/D,(code_loader.size/512 + (code_loader.size mod 512)/(code_loader.size mod 512))

View File

@ -876,7 +876,7 @@ GET_FAT32_CELL:
LD H,A
ADD HL,HL
ADD HL,HL
PUSH HL ; [ç] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
PUSH HL ; [x] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX