diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index e37d201..f922407 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -11,10 +11,12 @@ ; + 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 @@ -27,6 +29,9 @@ DRIVE: _mSYSID DI + ; ;!TEST 26/03/2024 + ; LD SP,#C000 + ; ; LD (DRIVE),A ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого XOR A @@ -171,18 +176,15 @@ FATMSG: DB "FAT" GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 - LD BC,2*256 + BIOS.DRV_READ ;!HARDCODE дозагрузка ещё двух секторов загрузчика + LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика LD A,(DRIVE) RST ToBIOS_18 JP C,FAIL.NULL ; ; CONTINUE - ;!TEST 26/03/2024 - ;LD SP,#C000 - ; LD HL,0 - LD (DISKL),HL - LD (DISKH),HL + LD (PARTITION_START_L),HL + LD (PARTITION_START_H),HL ; LD BC,1*256 + BIOS.GetMem RST ToBIOS_18 ;GET PAGE FOR DOS @@ -210,7 +212,10 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE OR A PUSH AF ; загрузка - LD HL,(FCLUSTR) + EXX + LD HL,(FCLUSTER_H) + EXX + LD HL,(FCLUSTR_L) LD DE,#C000 CALL LOAD_CORE ; [ ] загрузка system.dos больше #4000 байтов @@ -229,8 +234,12 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов JP NC,INC_SECTOR_NUM - CALL R_F_FAT ; next cluster in chain + ;CALL R_F_FAT ; next cluster in chain + CALL READ_FROM_FAT ; next cluster in chain EX DE,HL + EXX + EX DE,HL + EXX LD DE,#C000 CALL NC,LOAD_CORE .no_big_core: ; @@ -326,7 +335,7 @@ RUN_CORE: DI ; INC_SECTOR_NUM: PUSH DE - CALL NSECTOR + CALL CLUSTER_TO_SECTOR LD DE,#20 ;!HARDCODE количество прочитанных секторов ADD IX,DE JR NC,.no_inc @@ -335,7 +344,10 @@ INC_SECTOR_NUM: PUSH DE POP DE LD BC,RUN_CORE PUSH BC - PUSH HL + PUSH HL ; для баланса + ;EXX + PUSH HL ; для баланса + ;EXX JP LOAD_CORE.subload ; CALL .set_stack @@ -408,20 +420,20 @@ PART_TB: PUSH BC YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,#80 - CP (IX+0) + CP (IX + _sMBR_PARTITION_RECORD.isActive) JR NZ,PART_TB.next LD A,4 ;!HARDCODE счетчик записей партиций в MBR SUB B PUSH AF ; номер загрузочного раздела ; - LD E,(IX+08) - LD D,(IX+09) - LD L,(IX+10) - LD H,(IX+11) + LD E,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3) PUSH DE POP IX - LD (DISKL),IX - LD (DISKH),HL + LD (PARTITION_START_L),IX + LD (PARTITION_START_H),HL LD A,(DRIVE) LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ @@ -438,7 +450,7 @@ YEPDOS: ;[ ] 17.12.2023 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -;/* +/* GET_BPB: LD IX,#0000 LD HL,#0000 LD DE,BOOT_BUFFER @@ -551,8 +563,8 @@ GET_BPB: LD IX,#0000 .BPB_FAT: LD (FatBuffer.FAT_TYPE),A ;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ; - LD IX,(DISKL) - LD HL,(DISKH) + LD IX,(PARTITION_START_L) + LD HL,(PARTITION_START_H) LD DE,(FatBuffer.FAT1_SEC_L) LD BC,#0000 ADD IX,DE @@ -583,7 +595,7 @@ GET_BPB: LD IX,#0000 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* +;/* GET_BPB: LD IX,#0000 LD HL,#0000 LD DE,BOOT_BUFFER @@ -639,7 +651,7 @@ GET_BPB: LD IX,#0000 ; ; ;R08 ; [x] fat32 ; LD HL,BOOT_BUFFER - ; LD DE,CORE_BUFFERS.BootSector + ; LD DE,BootSector ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LDIR ; @@ -647,20 +659,21 @@ GET_BPB: LD IX,#0000 CP #F0 RET C ; - ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - ; LD (FatBuffer.BytesPerSector),HL - ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - ; LD (FatBuffer.SectorsPerCluster),A + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD (FatBuffer.BytesPerSector),HL + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD (FatBuffer.SectorsPerCluster),A ; calc. first sector FAT LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - ;LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ; fat32 XOR A LD B,A LD C,A LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; fat32 - ; LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; fat32 + LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; fat32 + LD (FatBuffer.RootDirFirstSector_H),BC LD (FatBuffer.SectorsPerFAT_H),A ; fat32 ; ; @@ -692,9 +705,8 @@ GET_BPB: LD IX,#0000 JR NZ,.loop1 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - - ;LD BC,(FatBuffer.BytesPerSector) - LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD (FatBuffer.FirstDataSector_H),BC + LD BC,(FatBuffer.BytesPerSector) LD A,B AND A ; @@ -736,10 +748,10 @@ GET_BPB: LD IX,#0000 LD (FatBuffer.FirstDataSector_L),HL ; B = 0 ; - ;LD HL,(FatBuffer.BytesPerSector) - LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - ;LD A,(FatBuffer.SectorsPerCluster) - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD HL,(FatBuffer.BytesPerSector) + ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD A,(FatBuffer.SectorsPerCluster) + ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -774,17 +786,7 @@ GET_BPB: LD IX,#0000 SBC HL,DE ; .HDDBIG: CALL SectorToCluster -; LD A,(FatBuffer.SectorsPerCluster) -; SCF -; .loop7: RRA -; JR C,.loop7_exit -; RR B -; RR C -; RR H -; RR L -; JP .loop7 - ; -.loop7_exit: INC HL + INC HL LD (FatBuffer.MaxClusterLow),HL LD A,L OR H @@ -838,8 +840,8 @@ GET_BPB: LD IX,#0000 POP DE ; Total Sectors low ; HL:DE = DataSec ; - ;LD A,(FatBuffer.SectorsPerCluster) - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD A,(FatBuffer.SectorsPerCluster) + ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток CALL DIV_for_SPC ; выясняем разрядность FAT @@ -906,12 +908,12 @@ GET_BPB: LD IX,#0000 EXX LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD (FatBuffer.RootDirStartCluster_L),HL - LD BC,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (FatBuffer.RootDirStartCluster_H),BC + LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (FatBuffer.RootDirStartCluster_H),DE ; - CALL CLUSTER_TO_SECTOR - LD (FatBuffer.RootDirFirstSector_L),HL - LD (FatBuffer.RootDirFirstSector_H),BC + CALL CLUSTER_TO_SECTOR.no_prepare + LD (FatBuffer.RootDirFirstSector_L),IX + LD (FatBuffer.RootDirFirstSector_H),HL ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD (FatBuffer.FSINFO_Sector),HL @@ -931,89 +933,11 @@ GET_BPB: LD IX,#0000 LD DE,FatBuffer.BPB_LABEL LD BC,11 ;!HARDCODE LDIR - ; - SET_PAGE_X FATPAGE - PUSH AF LD DE,0 CALL READ_FAT_TABLE - POP AF - OUT (SLOT3),A - ; - ; Установить начальный кластер для чтения - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - JR Z,.set_FSinfo - ; - LD HL,#0001 - LD (G_CLUST.low),HL - DEC L - LD (G_CLUST.high),HL - ; - DEC HL - LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL - LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL - XOR A + AND A RET ; -.set_FSinfo: CALL READ_FSinfo - ; !FIXIT проверка на ошибку - ; - ; проверка одной из сотни сраных сигнатур - LD HL,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE) - LD DE,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) - LD BC,#7272 - SBC HL,BC - JR NZ,.error - EX DE,HL - LD DE,#6141 - SBC HL,DE - JR NZ,.error - ; FREE_CLUSTERS_COUNT - LD BC,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) - LD DE,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) - ; CF = 0 - CALL .check_cluster - JR NC,.skip_FFFF - ; - LD B,#FF - LD C,B - LD D,B - LD E,B - ; -.skip_FFFF: LD (FatBuffer.FREE_CLUSTERS_COUNT_L),BC - LD (FatBuffer.FREE_CLUSTERS_COUNT_H),DE - ; - ; FIRST_FREE_CLUSTER - LD BC,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) - LD DE,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) - ; CF = 0 - CALL .check_cluster - JR C,.error - ; - LD (G_CLUST.high),DE - LD (G_CLUST.low),BC - XOR A -.error: LD (FatBuffer.UPD_FSINFO),A - RET Z - ;!TODO FREE_CLUSTERS_COUNT - ;LD HL,#FFFF - ;LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL - ;LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL - ; - XOR A - LD H,A - LD L,2 - LD (G_CLUST.low),HL - LD L,H - LD (G_CLUST.high),HL - RET - ; - ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? -.check_cluster: LD HL,(FatBuffer.MaxClusterLow) - SBC HL,BC - LD HL,(FatBuffer.MaxClusterHigh) - SBC HL,DE - RET ;;;;;;;; ; --> BC:HL - Sector @@ -1022,8 +946,8 @@ SectorToCluster: LD A,B AND #0F LD B,A - ;LD A,(FatBuffer.SectorsPerCluster) - LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD A,(FatBuffer.SectorsPerCluster) + ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) SCF .loop: RRA RET C @@ -1033,15 +957,85 @@ SectorToCluster: RR L JP .loop ; -*/ +; HL:DE / A => DE:BC, H=0, L - остаток +DIV_for_SPC: + LD C,A + DEC A + JR Z,.exit + ; + AND E + LD B,A ; остаток + LD A,C + RRCA + ; +.loop: SRL H + RR L + RR D + RR E + RRCA + JP NC,.loop + LD A,B +.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 +CLUSTER_TO_SECTOR: + EXX + PUSH HL + EXX + POP DE + ; DE:HL - cluster + ; +.no_prepare: PUSH BC + LD BC,-2 + ADD HL,BC + JR C,.no_dec_de + DEC DE +.no_dec_de: ; cluster = cluster - 2 + ; + LD A,(FatBuffer.SectorsPerCluster) + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + ; + RRA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D + LD DE,(FatBuffer.FirstDataSector_L) + ADD IX,DE + LD DE,(FatBuffer.FirstDataSector_H) + ADC HL,DE + ; + POP BC + RET +; +;*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; поиск system.dos GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD IX,(FatBuffer.RootDirFirstSector_L) - LD BC,(DISKL) - LD DE,(DISKH) + LD BC,(PARTITION_START_L) + LD DE,(PARTITION_START_H) + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 LD A,(FatBuffer.DirSizeInSectors) + JR NZ,.NEXTSEC + ; + LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер файлов на FAT32 .NEXTSEC: PUSH AF ADD IX,BC ADC HL,DE @@ -1049,7 +1043,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) PUSH IX PUSH HL LD BC,1*256 + BIOS.DRV_READ - LD DE,DIR + LD DE,DIR_BUFFER LD A,(DRIVE) RST ToBIOS_18 CALL SEARCH @@ -1069,7 +1063,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) ; SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 - LD IX, DIR - FAT_DIRECTORY_RECORD + LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD ADD IX,DE DEC C @@ -1108,12 +1102,27 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 AND A ; на выходе ZF = CF = 0 RET -; ; HL - CLUSTER -; ; DE - ADDRESS -; ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +; HL - CLUSTER +; DE - ADDRESS +; !TODO сделать тут определение размера SYSTEM.DOS +; [ ] и возможность загрузить больше 1 страницы LOAD_CORE: LD (READMEM),DE .loop: PUSH HL - CALL NSECTOR + EXX + PUSH HL + EXX + ; + CALL CLUSTER_TO_SECTOR + ; + ;LD A,(FatBuffer.FAT_TYPE) + ; CP FAT_TYPE.x32 + ; JR NZ,.skip_it + ; + LD DE,(PARTITION_START_L) + ADD IX,DE + LD DE,(PARTITION_START_H) + ADC HL,DE +;.skip_it: ; LD DE,(READMEM) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) .max_sectors+1: CP #20 @@ -1126,6 +1135,10 @@ LOAD_CORE: LD (READMEM),DE EX AF,AF' LD A,(DRIVE) RST ToBIOS_18 + + EXX + POP HL + EXX POP HL ;AND A RET @@ -1141,6 +1154,9 @@ LOAD_CORE: LD (READMEM),DE LD DE,(FatBuffer.BytesPerCluster) ADD HL,DE LD (READMEM),HL + EXX + POP HL + EXX POP HL CCF RET NC @@ -1150,8 +1166,12 @@ LOAD_CORE: LD (READMEM),DE LD (BIG_CORE),A RET Z ; - CALL R_F_FAT + CALL READ_FROM_FAT + ;CALL R_F_FAT RET C + EXX + EX DE,HL + EXX EX DE,HL JP .loop @@ -1240,7 +1260,7 @@ LOAD_CORE: LD (READMEM),DE ; - +/* ; --> HL - CLUSTER ; <-- HL:IX - SECTOR NSECTOR: LD DE,0 @@ -1267,13 +1287,260 @@ NSECTOR: LD DE,0 LD E,A ADC HL,DE ; - LD DE,(DISKL) + LD DE,(PARTITION_START_L) ADD IX,DE - LD DE,(DISKH) + 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: CALL CHECK_CLUSTER_IS_SMALLER + RET C + 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 - чётный/нечётный адрес кластера +GET_FAT12_CELL: LD D,H + LD E,L + SRL H + RR L ; сдвиг вправо через CF + PUSH AF ; сохр. флаг + ADD HL,DE ; CLUSTER * 1.5 + ; + IF FAT_CACHE.Size_12 < #1800 + ;!FIXIT оптимизировать + LD A,H + LD B,H + ; + AND #1F + ;AND FAT_CACHE.Size_Mask_16 + ; + LD H,A + LD A,B + ; + RLCA + RLCA + RLCA + ;DUP FAT_CACHE.Degree_16 + ; RRCA + ;EDUP + AND #07 + ;AND FAT_CACHE.Part_Mask_16 + ; + ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; CP C + LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + CP E + LD E,A + ; + CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а + ENDIF + ; + LD DE,FATPAGE.cache + ADD HL,DE + POP AF + RET + ; +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +GET_FAT16_CELL: LD A,H + LD B,H + ;AND #0F + AND FAT_CACHE.Size_Mask_16 + LD H,A + LD A,B + ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + DUP FAT_CACHE.Degree_16 + RRCA + EDUP + ;AND #0F + AND FAT_CACHE.Part_Mask_16 + ; + ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; CP C + 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 + ; +; [x] fat32 ;!TEST +; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster +; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) +CHECK_CLUSTER_IS_SMALLER: + LD A,(FatBuffer.FAT_TYPE) + XOR FAT_TYPE.x32 + JR NZ,.low ; Z=0 проверяем младшее слово номера кластера + ; проверяем старшее слово номера кластера + EXX + EX DE,HL + LD HL,(FatBuffer.MaxClusterHigh) + ; CF = 0 + SBC HL,DE + EX DE,HL + EXX + LD A,DSS_Error.sys.DISK_FULL + RET C + RET NZ + ; проверяем младшее слово номера кластера +.low: EX DE,HL + LD HL,(FatBuffer.MaxClusterLow) + SBC HL,DE + EX DE,HL + LD A,DSS_Error.sys.DISK_FULL + RET + ; +/* ;----------------- -;!TODO сделать это макросами или инклюдами универсальными. повторяются в досе и ещё где-то ; HL - CLUSTER ; DE - (CLUSTER) R_F_FAT: PUSH HL @@ -1358,8 +1625,11 @@ R_F_FAT: PUSH HL ; POP HL ; RET ; +*/ +; ; +/* RE_FAT: PUSH HL LD L,A LD H,0 @@ -1374,10 +1644,10 @@ RE_FAT: PUSH HL EX DE,HL JR NC,.NOINX INC IX -.NOINX: LD HL,(DISKL) +.NOINX: LD HL,(PARTITION_START_L) ADD HL,DE EX DE,HL - LD BC,(DISKH) + LD BC,(PARTITION_START_H) JR NC,.NOINX2 INC IX .NOINX2: ADD IX,BC @@ -1391,18 +1661,123 @@ RE_FAT: PUSH HL RST ToBIOS_18 POP HL RET +*/ ; - - +;RE_FAT: +;RX01 +; Прочитать в кеш ХХ секторов FAT-а +; DE - NEW FAT BLOCK +READ_FAT_TABLE: PUSH HL + ; + EX DE,HL + LD (FatBuffer.CacheBlock),HL + ; + CALL GET_SECTOR_OF_FAT + ; + ; BC:HL - номер лог.сектора + LD DE,(FatBuffer.FAT1_SEC_L) + ADD HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(FatBuffer.FAT1_SEC_H) + ; JR NC,.no_inc + ; INC HL +.no_inc: ADC HL,BC + ; HL:IX - SECTOR FAT FOR READING + ; + LD DE,(PARTITION_START_L) + ADD IX,DE + LD DE,(PARTITION_START_H) + ADC HL,DE + LD DE,FAT_SECTORS_BUFFER + IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A + ; + LD A,(FatBuffer.FAT_TYPE) + XOR FAT_TYPE.x32 + LD BC,FAT_CACHE.Sectors_16*256 + BIOS.DRV_READ + JR NZ,.next + LD B,FAT_CACHE.Sectors_32 +.next: LD A,(DRIVE) + RST ToBIOS_18 + ; + POP AF + OUT (SLOT3),A + POP HL + RET + ; +;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT +; in: HL - Cache block +; out: C:HL - logical number +; B = 0 +GET_SECTOR_OF_FAT: + LD A,(FatBuffer.FAT_TYPE) + LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную + XOR FAT_TYPE.x32 + JR Z,.next + LD B,FAT_CACHE.Degree ;!FIXIT сделать через переменную + XOR A +.next: LD C,A + ; +.loop: ADD HL,HL ;x2 + ADC A,C + DJNZ .loop + ; + LD C,A + RET //////////////////////////////////////////////////////////////////////// ; Area for boot sector [512Bytes] ;BOOT _sBOOT_SECTOR_PARAMS = $ BOOT_BUFFER EQU $ -DIR EQU BOOT_BUFFER+512 -; -FAT_SECTORS_BUFFER EQU DIR+512 -VALUE EQU 3*512+FAT_SECTORS_BUFFER +DIR_BUFFER EQU BOOT_BUFFER+512 ; +;FAT_SECTORS_BUFFER EQU DIR_BUFFER+512 +;VALUE EQU 3*512+FAT_SECTORS_BUFFER +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 @@ -1412,7 +1787,13 @@ FatBuffer EQU VALUE .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 @@ -1427,20 +1808,19 @@ FatBuffer EQU VALUE -HANDBUF EQU VALUE+16 -FCLUSTER32 EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H -; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME -; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE -FCLUSTR EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L -FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE -FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 - -DISKH EQU VALUE+48 -DISKL EQU VALUE+50 -READMEM EQU VALUE+52 -;SHEL_FM EQU VALUE+54 -BIG_CORE EQU VALUE+54 -BANKDOS EQU VALUE+55 +HANDBUF EQU VALUE + _sysFatBuffer +FCLUSTER_H EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H +; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME +; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE +FCLUSTR_L EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L +FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE +FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 +PARTITION_START_H EQU FSIZE1+2 +PARTITION_START_L EQU PARTITION_START_H+2 +READMEM EQU PARTITION_START_L+2 +BIG_CORE EQU READMEM+2 +BANKDOS EQU BIG_CORE+1 +;SHEL_FM EQU VALUE+54 ; EQU VALUE+56 ;----------------- @@ -1454,6 +1834,11 @@ BANKDOS EQU VALUE+55 ;STACK EQU (($/256)+2)*256 + DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER + DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER + DISPLAY "FatBuffer ",/H,FatBuffer + ENT + ENDMODULE OUTEND ;[]-----------------------------------------------------------[] diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 2849694..6dc232d 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -18,12 +18,52 @@ ; дискета для создания из нее загрузочной. ; ; + 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 +.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 ; количество секторов на цилиндре + ENDS + include 'shared_includes/constants/sp2000.inc' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/macros.z80' include 'shared_includes/structures/FileSystem.inc' + ;include 'DSS/structures.inc' include '../DSS/defines.inc' DEFINE EXEinfoMACRO 0 @@ -42,18 +82,19 @@ ; версия программы -major_version equ 1 ; ст. номер версии -minor_version equ 5 ; мл. номер +major_version equ 2 ; ст. номер версии +minor_version equ 0 ; мл. номер ;; +SECTORS_OF_LOADER EQU 4 -org_addr EQU #8000 + CLP_Buffer -code_addr EQU BEGIN -program_start EQU BEGIN -stack_point EQU #BFFE -Loader_length EQU 0 +org_addr EQU #8000 + CLP_Buffer +code_addr EQU BEGIN +program_start EQU BEGIN +stack_point EQU #BFFE +Loader_length EQU 0 ; -page_buffer equ #C000 ; буфер файлов +page_buffer equ #C000 ; буфер файлов ;; include 'Shared_Includes/constants/EXE_Header.z80' @@ -108,40 +149,40 @@ version_ok: xor a ; ld hl,root_path ; "X:\" корень диска add a,'A' ld (hl),a - ld c,1Dh ; смена каталога + ld c,Dss.ChDir ; смена каталога RST ToDSS ;-------------------------------------------- ; Чтение файла system.exe ;-------------------------------------------- ld hl,name2 ; имя файла call read_file ; вся работа по загрузке файла в страницы - jr nc,read_file1_ok + ;jr nc,read_file1_ok ; освоб. блок памяти -read_file_err: ld a,(id_blck) ; идентиф. блока памяти - ld c,3Eh - RST ToDSS - ld a,-1 ; код ошибки - jp exit - +;read_file_err: ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти +; ld c,Dss.FreeMem +; RST ToDSS + ;ld a,DSS_Error.sys.DISK_FULL ; код ошибки + jp c,exit ; сохр. раб. ячейки файла system.exe -read_file1_ok: ld hl,file_handle ; откуда - ld de,hFile1 ; куда - ld bc,6 +read_file1_ok: ld hl,FILE1_PARAMS ; откуда + ld de,FILE2_PARAMS ; куда + ld bc,FILE2_PARAMS.dataSize ldir ;-------------------------------------------- ; Чтение файла system.dos ;-------------------------------------------- ld hl,name1 ; имя файла call read_file ; вся работа по загрузке файла в страницы - jr nc,read_file2_ok + ;jr c,read_file_err + ;ld a,DSS_Error.sys.DISK_FULL; код ошибки + jp c,exit + ;jr nc,read_file2_ok ; освоб. блок памяти system.exe -file_err1: ld a,(id_mem) ; идентиф. блока памяти - ld c,3Eh - RST ToDSS - jr read_file_err ; освоб. блок памяти system.dos - -read_file2_ok: -confirm_flag+*: ld a,0 +; file_err1: ld a,(FILE2_PARAMS.id_blck); идентиф. блока памяти +; ld c,Dss.FreeMem +; RST ToDSS + ;jr read_file_err ; освоб. блок памяти system.dos +confirm_flag+1: ld a,0 or a jr z,no_confirm ld a,(boot_disk) ; сист. диск @@ -153,7 +194,7 @@ confirm_flag+*: ld a,0 ld (messages.lett2),a ld a,5 ; индекс строки "Insert destination disk..." call print_string - ld bc,3035h ; ждем нажатия клавиши + ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS no_confirm: ld a,2 ; индекс строки "Installing boot loader..." call print_string @@ -162,7 +203,7 @@ no_confirm: ld a,2 ; ld hl,root_path ; "X:\" строка пути add a,'A' ld (hl),a - ld c,1Dh ; смена тек. каталога + ld c,Dss.ChDir ; смена тек. каталога RST ToDSS ;-------------------------------------------- ; Записать boot-загрузчик @@ -174,29 +215,29 @@ no_confirm: ld a,2 ; ; Запись файла system.dos ld hl,name1 ; имя файла call write_file - jr nc,ok_write1 - jr file_err1 - ; + jr c,write_error ok_write1: ; освободить память - ld a,(id_blck) ; блок system.dos - ld c,3Eh - RST ToDSS + ; ld a,(FILE1_PARAMS.id_blck) ; блок system.dos + ; ld c,Dss.FreeMem + ; RST ToDSS ; ; загр. раб. ячейки - ld hl,hFile1 ; откуда - ld de,file_handle ; куда - ld bc,6 + ld hl,FILE2_PARAMS ; откуда + ld de,FILE1_PARAMS ; куда + ld bc,FILE1_PARAMS.dataSize ldir ; Запись файла system.exe ld hl,name2 ; имя файла call write_file ; освободить память - push af - ld a,(id_blck) ; блок system.exe - ld c,3Eh - RST ToDSS - pop af - jr c,exit ; ошибка + ; push af + ; ld a,(FILE1_PARAMS.id_blck) ; блок system.exe + ; ld c,Dss.FreeMem + ; RST ToDSS + ; pop af + ; + jr c,write_error + ;jr c,exit ; ошибка ; ld a,(disk) ; заданный номер диска add a,'A' @@ -209,25 +250,24 @@ ok_write1: ; ; запросить системный диск ld a,(boot_disk) ; сист. диск cp 2 - jr nc,exit-1 ; не дисководы + jr nc,.not_fdd ; не дисководы add a,'A' ld (messages.lett3),a ld a,6 ; индекс строки "Insert system disk..." call print_string - ld bc,3035h ; ждем нажатия клавиши + ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши RST ToDSS - xor a ; код "Ok" +.not_fdd: xor a ; код "Ok" exit: push af call restore_path ; восст. тек. диск и путь port: ld a,-1 ; сохр. порт out (SLOT3),a pop af - ld c,41h ; выход в ДОС + ld c,Dss.Exit ; выход в ДОС ld b,a RST ToDSS jr $ - - + ; help: ld a,8 ; индекс строки "Invalid drive specification" call print_string ld a,4 ; индекс строки хэлпа @@ -255,8 +295,8 @@ name2: db "SYSTEM.EXE",0 ;------------------------------------------------- write_boot_loader: ld a,(disk) ; заданный номер диска - ld c,1 ; open device - rst 18h + ld c,Dss.DRV.Open ; open device + rst ToDSS.DRV ret c ld hl,close_device ; точка выхода push hl @@ -264,10 +304,10 @@ write_boot_loader: ld hl,0 ; ст. разряд лог. сектора ld ix,0 ; мл. разряд ld de,buffer ; куда - ld bc,0105h ; прочитать 1 сектор (boot) - rst 18h + ld bc,1*256 + Dss.DRV.Read ; прочитать 1 сектор (boot) + rst ToDSS.DRV ret c ; ошибка чтения - ld a,(buffer+21) ; байт формата + ld a,(buffer + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) cp #F0 ; 1.44Mb ret c ; незнакомый формат jr z,write_to_floppy @@ -285,8 +325,8 @@ write_boot_loader: ; закрыть девайс close_device: push af ; сохр. флаг ld a,(disk) ; заданный номер диска - ld c,2 ; close device - rst 18h + ld c,Dss.DRV.Close ; close device + rst ToDSS.DRV pop af ret @@ -298,38 +338,45 @@ close_device: push af ; ; выход: CF - при ошибке записи ;------------------------------------------------- write_to_floppy: - ld a,(buffer+16) ; число копий FAT-ов + ld a,(buffer + BOOT_SECTOR.Number_of_FATs) ; число копий FAT-ов or a scf - ret z ; ошибка - dec a ; --число копий - jr z,overwrite_floppy ; загрузчик уже записан, перезаписать его + ret z ; ошибка + dec a ; --число копий + jr z,overwrite_floppy ; загрузчик уже записан, перезаписать его ; настроить ячейки boot-сектора - ld (buffer+16),a ; число копий FAT-ов - ld hl,(buffer+14) ; зарезерв. секторов - ld bc,(buffer+22) ; секторов на FAT - ld a,b - or c - scf - ret z ; 0 секторов на FAT + 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+14),hl ; зарезерв. секторов + ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; зарезерв. секторов + ex hl,de + ld hl,SECTORS_OF_LOADER-1 + and a + sbc hl,de + ccf + ret c overwrite_floppy: ; записать boot-сектор назад - ld a,(disk) ; заданный номер диска - ld hl,0 ; ст. разряд лог. сектора - ld ix,0 ; мл. разряд - ld de,buffer ; откуда - ld bc,0106h ; записать 1 сектор - rst 18h - ret c ; ошибка записи + ld a,(disk) ; заданный номер диска + ld hl,0 ; ст. разряд лог. сектора + ld ix,0 ; мл. разряд + ld de,buffer ; откуда + ld bc,1*256 + Dss.DRV.Write ; записать 1 сектор + rst ToDSS.DRV + ret c ; ошибка записи ; записать загрузчик - ld a,(disk) ; заданный номер диска - ld hl,0 ; ст. разряд лог. сектора - ld ix,1 ; мл. разряд - ld de,code_loader ; откуда (код загрузчика) - ld bc,0306h ; записать 3 сектора (размер загр.) - rst 18h + ld a,(disk) ; заданный номер диска + ld hl,0 ; ст. разряд лог. сектора + ld ix,1 ; мл. разряд + ld de,code_loader ; откуда (код загрузчика) + ld bc,SECTORS_OF_LOADER*256 + Dss.DRV.Write ; записать 3 сектора (размер загр.) + rst ToDSS.DRV ret @@ -340,20 +387,20 @@ overwrite_floppy: ; выход: CF-ошибка записи ;------------------------------------------------- write_to_ram_disk: -write_to_: ld a,(disk) ; номер заданного диска +write_to_: ld a,(disk) ; номер заданного диска ld de,#55AA - ld bc,0 * 256 + 8 - rst #18 + ld bc,Dss.DRV.GenIOCTL.GetParams + rst ToDSS.DRV ex af,af' ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ld b,a inc c scf - ret z ; !TODO загрузка с расширенного раздела не поддерживается + ret z ; !TODO загрузка с расширенного раздела не поддерживается dec c - CP #80 ;!HARDCODE тип драйва - HDD + CP #80 ;!HARDCODE тип драйва - HDD JR NC,.skip_FAT_check - push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR ; [x] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) LD HL,0 LD IX,0 @@ -362,7 +409,7 @@ write_to_: ld a,(disk) ; RST ToBIOS POP BC LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) - LD DE,04 ;!HARDCODE минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) + LD DE,SECTORS_OF_LOADER + 1 ; минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) AND A SBC HL,DE RET C @@ -370,10 +417,10 @@ write_to_: ld a,(disk) ; .skip_FAT_check:; push bc ld a,b - ld hl,0 ; ст. разряд лог. сектора - ld ix,1 ; мл. разряд - ld de,code_loader ; откуда (код загрузчика) - ld bc,3*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) + 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 @@ -396,7 +443,7 @@ write_to_hard_disk: LD BC,1*256 + BIOS.DRV_READ RST ToBIOS ; check signature - LD HL,(buffer+510) ;!HARDCODE Signature word + LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 AND A SBC HL,DE @@ -406,9 +453,9 @@ write_to_hard_disk: PUSH BC ; set active in buffer INC C - LD HL,buffer + #01BE + #30 ;!HARDCODE MBR: Offset of last record of partition table in the MBR - LD DE,#10 ; размер одной записи MBR - LD B,4 ;!HARDCODE MBR: Number of entries in the partition table + LD HL,buffer + _sBOOT_SECTOR.PARTITION_TABLE.Record_4 + LD DE,_sMBR_PARTITION_RECORD ; размер одной записи MBR + LD B,_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD; MBR: Number of entries in the partition table .loop: XOR A LD (HL),A ; @@ -434,6 +481,10 @@ write_to_hard_disk: JR Z,.next CP PartitionSysTypes.FAT16_LBA JR Z,.next + CP PartitionSysTypes.FAT32 + JR Z,.next + CP PartitionSysTypes.FAT32_LBA + JR Z,.next ; NOT SUPPORTED FS POP BC SCF @@ -448,8 +499,9 @@ write_to_hard_disk: ld hl,0 ; ст. разряд лог. сектора ld ix,0 ; мл. разряд ld de,buffer ; откуда (код загрузчика) - ld bc,1*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) - JP ToBIOS + ld bc,1*256 + BIOS.DRV_WRITE ; записать 1 сектор + RST ToBIOS + RET ; ;------------------------------------------------- ; Выделить заданный диск из ком-строки @@ -461,7 +513,7 @@ write_to_hard_disk: get_drive_letter: inc hl ; буфер строки ld de,buffer ; буфер для выдел. параметра - ld c,43h ; выделить параметр ком. строки + ld c,Dss.GSwitch ; выделить параметр ком. строки RST ToDSS ld de,buffer ld a,(de) @@ -480,7 +532,7 @@ get_drive_letter: jr c,get_drive_err cp 'z'+1 jr nc,get_drive_err - res 5,a + and %1101'1111 sub 'A' or a ret @@ -495,11 +547,11 @@ get_drive_err: scf ; ;---------------------------------------------------- ; сохр. тек. системный диск и путь ;---------------------------------------------------- -save_path: ld c,2 ; узнать диск +save_path: ld c,Dss.CurDisk ; узнать диск RST ToDSS ld (sys_disk),a ld hl,sys_path - ld c,1Eh ; узнать путь + ld c,Dss.CurDir ; узнать путь RST ToDSS ret @@ -508,38 +560,40 @@ save_path: ld c,2 ; узн ; восст. тек. системный диск и путь ;---------------------------------------------------- restore_path: ld a,(sys_disk) - ld c,1 ; смена диска + ld c,Dss.ChDisk ; смена диска RST ToDSS ld hl,sys_path - ld c,1Dh ; смена пути + ld c,Dss.ChDir ; смена пути RST ToDSS ret +; - - - - +; disk: db 0 ; номер заданного диска boot_disk: db 0 ; номер boot-диска системы - - ; раб. ячейки тек. файла ; ; чтение: system.exe, далее system.dos ; запись: system.dos, далее system.exe -file_handle: db -1 ; дескриптор файла -id_blck: db -1 ; идентиф. выдел. блока памяти +FILE1_PARAMS: +.handle: db -1 ; дескриптор файла +.id_blck: db -1 ; идентиф. выдел. блока памяти ; -lsize: dw 0 ; мл.разряд размера файла -hsize: dw 0 ; ст.разряд +.sizeLow: dw 0 ; мл.разряд размера файла +.sizeHigh: dw 0 ; ст.разряд +.dataSize EQU $-FILE1_PARAMS ; сохр. данные system.exe -hFile1: db -1 ; дескр. файла -id_mem: db -1 ; идентиф. блока +FILE2_PARAMS: +.handle: db -1 ; дескриптор файла +.id_blck: db -1 ; идентиф. выдел. блока памяти ; - dw 0 ; мл.разряд - dw 0 ; ст.разряд +.sizeLow: dw 0 ; мл.разряд размера файла +.sizeHigh: dw 0 ; ст.разряд +.dataSize EQU $-FILE2_PARAMS + + ASSERT FILE1_PARAMS.dataSize = FILE2_PARAMS.dataSize, "Erorr! FILE1_PARAMS != FILE2_PARAMS" ; ; ; @@ -550,8 +604,8 @@ messages: db 0 db "\r\nBoot and System files Installer v" ;0 db major_version + '0','.' db (minor_version / 10) + '0',(minor_version % 10) + '0','.' - db "\r\n\nCopyright (c) 2006-2022 Vasil Ivanov." - db "\r\n\nCopyright (c) 2023 Sprinter Team." + db "\r\n\nCopyright (c) 2006 Vasil Ivanov." + db "\r\n\nCopyright (c) 2023-2024 Sprinter Team." db "\r\n\n",0 ; db "System successfully installed on disk " ;1 @@ -586,7 +640,7 @@ messages: db 0 ; Вывести строку по индексу ; вход: a=индекс строки print_string: call get_string ; поиск строки по ее индексу в 'a' - ld c,5Ch ; вывод строки + ld c,Dss.PChars ; вывод строки RST ToDSS ret @@ -616,33 +670,43 @@ get_loop: ex af,af' ; вход: hl=имя файла ; выход: CF-при ошибке ;==================================================== -read_file: ld a,1 ; на чтение - ld c,11h ; открыть файл +read_file: ld a,Dss.Open.R ; на чтение + ld c,Dss.Open ; открыть файл RST ToDSS - jr nc,ok ; без ошибок + jr nc,.ok ; без ошибок + ; + push af ld a,9 ; индекс "Can't open file" call print_string - scf - ret -ok: ld (file_handle),a ; дескр. файла - ld hl,0 - ld ix,0 - ld bc,0215h ; указатель на конец файла - RST ToDSS - ld (hsize),hl ; ст.разряд размера файла - ld (lsize),ix ; мл.разряд - call get_memory ; расч. и выдел. страницы под файл - jr c,not_enough ; не хватает памяти - call file_to_bank ; загр. файл в страницы -close_file: ld a,(file_handle) ; дескр. файла - ld c,12h ; закрыть файл - RST ToDSS + pop af ret ; -not_enough: call close_file +.ok: ld (FILE1_PARAMS.handle),a ; дескр. файла + ld hl,0 + ld ix,0 + ld bc,Dss.Move_FP.FrEnd ; указатель на конец файла + RST ToDSS + ld (FILE1_PARAMS.sizeHigh),hl ; ст.разряд размера файла + ld (FILE1_PARAMS.sizeLow),ix ; мл.разряд + call get_memory ; расч. и выдел. страницы под файл + jr c,.not_enough ; не хватает памяти + call file_to_bank ; загр. файл в страницы +.close_file: push af + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld c,Dss.Close ; закрыть файл + RST ToDSS + pop af + ret + ; +.not_enough: push af + call .close_file ld a,10 ; индекс "Can't allocate memory" call print_string + pop af + or a scf + ret nz + ld a,DSS_Error.sys.NOT_ENOUGH_MEMORY ret @@ -652,9 +716,9 @@ not_enough: call close_file ; число страниц и выделить их. ; Выход: CF - при нехватке памяти ;---------------------------------------------------- -get_memory: ld hl,(hsize) ; ст.разряд размера файла - ld bc,(lsize) ; мл.разряд - ld de,4000h ; делитель (размер страницы) +get_memory: ld hl,(FILE1_PARAMS.sizeHigh) ; ст.разряд размера файла + ld bc,(FILE1_PARAMS.sizeLow) ; мл.разряд + ld de,#4000 ; делитель (размер страницы) xor a scf malloc1: rr d @@ -669,7 +733,7 @@ malloc1: rr d jr malloc1 ; malloc2: or a - jr z,$+3 + jr z,$+3 ;!FIXIT $ inc bc xor a cp b @@ -677,9 +741,9 @@ malloc2: or a ret nz ; выделить блок памяти ld b,c ; b=число страниц - ld c,3Dh + ld c,Dss.GetMem RST ToDSS - ld (id_blck),a ; идентиф. блока + ld (FILE1_PARAMS.id_blck),a ; идентиф. блока ret @@ -688,39 +752,38 @@ malloc2: or a ;---------------------------------------------------- file_to_bank: ld hl,0 ld ix,0 - ld a,(file_handle) ; дескр. файла - ld bc,0015h ; указатель на начало файла + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld bc,Dss.Move_FP.FrStart ; указатель на начало файла RST ToDSS - ld a,(id_blck) ; идентиф. блока памяти - ld b,0 ; лог. номер страницы в блоке - ld c,0C4h ; получить физ. номер страницы в блоке - rst 08h + ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти + ;ld b,0 ; лог. номер страницы в блоке + ld bc,0*256 + BIOS.GetMemPage; получить физ. номер страницы в блоке + rst ToBIOS ret c -loop_to_bank: push af +.loop: push af out (SLOT3),a ld hl,page_buffer ; #C000 куда - ld de,4000h ; сколько - ld a,(file_handle) ; дескр. файла - ld c,13h ; читать файл + ld de,#4000 ; сколько + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld c,Dss.Read ; читать файл RST ToDSS pop bc - jr nc,ok_to_bank - ld a,12 ; индекс "Reading error" + jr c,.error + ; ok + cp -1 ; прочитано меньшее число байт ? + ret z ; да + ld a,b ; a=физич. страница + ld c,BIOS.GetMemPageNext ; получить номер след. физ. страницы блока + rst ToBIOS + ret c + cp #FF + jr nz,.loop ; не последняя страница + ret + ; error +.error: ld a,12 ; индекс "Reading error" call print_string scf ret - ; -ok_to_bank: cp -1 ; прочитано меньшее число байт ? - ret z ; да - ld a,b ; a=физич. страница - ld c,0C7h ; получить номер след. физ. страницы блока - rst 08h - ret c - cp 255 - jr nz,loop_to_bank ; не последняя страница - ret - - ;==================================================== @@ -728,72 +791,76 @@ ok_to_bank: cp -1 ; ; вход: hl=имя файла ; выход: CF-при ошибке ;==================================================== -write_file: ld a,20h ; атрибут "архивный" - ld c,0Ah ; создать файл +write_file: ld a,FAT_ATTR.ARCHIVE ; атрибут "архивный" + ld c,Dss.Create ; создать файл RST ToDSS - jr nc,create_ok ; без ошибок + jr nc,.create_ok ; без ошибок + push af ld a,13 ; индекс "Can't create file" call print_string - scf + pop af ret ; -create_ok: ld (file_handle),a ; дескр. файла - ld hl,close_file ; закр. файл +.create_ok: ld (FILE1_PARAMS.handle),a ; дескр. файла + ld hl,read_file.close_file ; закр. файл push hl ; точка выхода ; ; чтение файла из банок и запись на диск - ld a,(id_blck) ; идентиф. блока памяти - ld b,0 ; лог. номер страницы в блоке - ld c,0C4h ; получить физ. номер страницы в блоке - rst 08h + ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти + ;ld b,0 ; лог. номер страницы в блоке + ld bc,BIOS.GetMemPage ; получить физ. номер страницы в блоке + rst ToBIOS ret c -write_loop: push af +.loop: push af out (SLOT3),a - ld hl,(lsize) ; мл.разряд размера файла - ld de,(hsize) ; ст.разряд - ld bc,4000h + ld hl,(FILE1_PARAMS.sizeLow) ; мл.разряд размера файла + ld de,(FILE1_PARAMS.sizeHigh) ; ст.разряд + ld bc,#4000 xor a sbc hl,bc ld b,a ex de,hl sbc hl,bc ex de,hl - jr c,write_end ; записать остаток - ld (lsize),hl - ld (hsize),de + jr c,.write_end ; записать остаток + ld (FILE1_PARAMS.sizeLow),hl + ld (FILE1_PARAMS.sizeHigh),de ; ld hl,page_buffer ; #C000 откуда - ld de,4000h ; сколько - ld a,(file_handle) ; дескр. файла - ld c,14h ; запись файла + ld de,#4000 ; сколько + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld c,Dss.Write ; запись файла RST ToDSS pop bc - jr nc,write_ok - ld a,14 ; индекс "Writing error" - call print_string - scf - ret + jr c,.error ; -write_ok: cp -1 ; записано меньшее число байт ? +.write_ok: cp -1 ; записано меньшее число байт ? + ld a,DSS_Error.sys.DISK_FULL scf - ret z ; да, на диске нет места + jr nz,.error ; да, на диске нет места ld a,b ; a=физич. страница - ld c,0C7h ; получить номер след. физ. страницы блока - rst 08h + ld c,BIOS.GetMemPageNext ; получить номер след. физ. страницы блока + rst ToBIOS ret c - cp 255 - jr nz,write_loop ; не последняя страница + cp #FF + jr nz,.loop ; не последняя страница ret ; -write_end: pop af ; баланс стека - ld de,(lsize) ; сколько +.write_end: pop af ; баланс стека + ld de,(FILE1_PARAMS.sizeLow) ; сколько ld a,e or d ret z ; 0 байтов ld hl,page_buffer ; #C000 откуда - ld a,(file_handle) ; дескр. файла - ld c,14h ; запись файла + ld a,(FILE1_PARAMS.handle) ; дескр. файла + ld c,Dss.Write ; запись файла RST ToDSS + ret nc + ; +.error: push af + ld a,14 ; индекс "Writing error" + call print_string + pop af ret @@ -807,6 +874,6 @@ code_loader.size EQU $-code_loader ; 512 байт, буфер boot-сектора buffer equ $ -sys_disk equ buffer+513 ; диск системы +sys_disk equ buffer+512 ; диск системы sys_path equ sys_disk+1 ; путь системы diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 2060854..a29a028 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -544,23 +544,24 @@ EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ; LEAVE: LD A,B LD (ErrorLevel),A CALL FREE_PROCESS_MEMORY - LD SP,(EXSTACK) ;[x] 10/12/23 close EXE FMs CALL FREE_PROCESS_FMs - ; - _mDECTASK - ; - POP AF - POP HL - OUT (SLOT1),A - LD A,L - OUT (SLOT2),A - LD A,H - OUT (SLOT3),A - POP DE - POP HL - LD (EXSTACK),SP - LD SP,HL + ; + _mDECTASK + LD SP,(EXSTACK) + ; тут стек в нулевой странице! + POP AF + POP HL + OUT (SLOT1),A + LD A,L + OUT (SLOT2),A + LD A,H + OUT (SLOT3),A + POP DE + POP HL + LD (EXSTACK),SP + LD SP,HL + ; EX DE,HL LD A,(ErrorLevel) ;R12 @@ -572,6 +573,9 @@ LEAVE: LD A,B JP (HL) ; .norm_exit: AND A + ;!TEST + EI + ; JP (HL) ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 219ac33..7981773 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -81,15 +81,15 @@ DISKINF: LD C,B LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; - ;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL - CALL GET_LABEL - LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL - CALL .mCOPY_LOOP ; fat32 EXX PUSH DE PUSH HL EXX + ;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL + CALL GET_LABEL + LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL + CALL .mCOPY_LOOP PUSH DE LD A,XH LD DE,Dss.DRV.GenIOCTL.Enter diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index fcb278b..851fa33 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -722,8 +722,9 @@ RD_BPB: ; LD C,SLOT3 LD C,A LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 - ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 + ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables ; ; LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) @@ -754,7 +755,8 @@ RD_BPB: ; LD C,SLOT3 JR NZ,.loop1 ; LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC + ; LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,B AND A @@ -979,18 +981,17 @@ RD_BPB: ; LD C,SLOT3 LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL ; -.mirrored_FATs: ; - LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL +.mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL ; EXX LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE ; - CALL CLUSTER_TO_SECTOR - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL - LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC + CALL CLUSTER_TO_SECTOR.no_prepare + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL ; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 45561f1..baefe86 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -968,17 +968,17 @@ GET_FAT12_CELL: ;[x] fat32 ;!TEST -;NSECTOR: +;CLUSTER_TO_SECTOR: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR CLUSTER_TO_SECTOR: - PUSH BC EXX PUSH HL EXX POP DE ; DE:HL - cluster ; +.no_prepare: PUSH BC LD BC,-2 ADD HL,BC JR C,.no_dec_de diff --git a/DSS/Structures.inc b/DSS/Structures.inc index a28b23a..fbaee5d 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -100,14 +100,14 @@ .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 +.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 не используются некоторые значения, но задумка неплохая))) diff --git a/DSS/build.txt b/DSS/build.txt index 0272c1e..a88135e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -987 \ No newline at end of file +988 \ No newline at end of file