From f2eb4e47e332b5b39700c95c22a7953088601999 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 9 Jun 2024 04:22:07 +1000 Subject: [PATCH] =?UTF-8?q?boot.asm,=20dssboot.asm=20-=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B8/=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=B8=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D1=87=D0=B8=D0=BA=D0=B0=20=D0=B2/=D0=B8=D0=B7=20=D0=BD?= =?UTF-8?q?=D1=83=D0=BB=D0=B5=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 903 ++++++++++++------------------------------- BOOT/boot.asm | 242 +++++++----- DSS/FS/FAT/FAT_X.asm | 2 +- 3 files changed, 379 insertions(+), 768 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index d6e8802..06cc957 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -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 - ;EXX - ;LD HL,SUPPORTED_PARTITIONS - ;LD BC,SUPPORTED_PARTITIONS.Size - ;CPIR - ;EXX - ;JR Z,YEPDOS + ; 2fs + ; EXX + ; LD HL,SUPPORTED_PARTITIONS + ; LD BC,SUPPORTED_PARTITIONS.Size + ; CPIR + ; EXX + ; 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 @@ -378,163 +389,16 @@ YEPDOS: ;[ ] 17.12.2023 LD A,C ; 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 + 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 @@ -865,9 +708,8 @@ 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 -*/ - - -;------------------------------------------------------------------------------------------------ -; Прочитать из кеша 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,177 +921,15 @@ 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. Раньше номер блока в рег. A передавался - LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH - CP E - LD E,A - ; - CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache ; начало кеша FAT-а - 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 DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + CP E 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 + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT 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 + ; +;------------------------------------------------------------------------------------------------ +; Прочитать из кеша 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 diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 326d357..73d3e5d 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -1,6 +1,9 @@ //////////////////////////////////////////////////////////////////////// ; CHANGELOG -; [ ] - определение попытки сделать загрузочным не первый раздел +; [x] - загрузка с любого primary active раздела +; [x] - поддержка загрузки с FAT32 раздела +; [x] - загрузка с RAM диска +; [x] - bug fixes and optimizations))) //////////////////////////////////////////////////////////////////////// @@ -20,41 +23,41 @@ ; STRUCT _sysFatBuffer ;.DRIVE: BYTE #FF -.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32 -.CacheBlock: WORD #0000 -;.CacheUpdated: BYTE #00 -;.SectorsPerBank: BYTE #00 +.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32 +.CacheBlock: WORD #0000 +;.CacheUpdated: BYTE #00 +;.SectorsPerBank: 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 +.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 +.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 +;.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 +;.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 ; количество секторов на цилиндре +;.FilesPerSector: BYTE #00 ; число файловых записей в секторе +;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) +;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +;.S_X_H: DWORD #0000 ; количество секторов на цилиндре ENDS include 'shared_includes/constants/sp2000.inc' @@ -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 + 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 - RET C + 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 - ; проверка на РАМ-диск + ; buffer = sector 0 + ; + ; проверка на РАМ-диск (разделы на рамдиске пока не поддерживаются) 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,16 +453,81 @@ 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 - ld hl,0 ; ст. разряд лог. сектора - ld ix,0 ; мл. разряд - ld de,buffer ; откуда (код загрузчика) - ld bc,1*256 + BIOS.DRV_WRITE ; записать 1 сектор - RST ToBIOS - RET ; + 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 ; откуда (код загрузчика) + ld bc,1*256 + BIOS.DRV_WRITE ; записать 1 сектор + 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)) diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index baefe86..b69ab5e 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -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