From beb5dd8196bd1aff441b3d8d430c0e5442524e19 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 19 Apr 2024 03:39:02 +1000 Subject: [PATCH] many bugfixes --- BOOT/boot.asm | 28 ++- DSS/API/Execute.ASM | 12 +- DSS/API/GetMem.asm | 3 +- DSS/API/MkDir.asm | 33 +-- DSS/API/RetMem.asm | 6 +- DSS/API/RmDir.asm | 31 +-- DSS/API/SetMem.asm | 3 +- DSS/DSS-MAIN.ASM | 45 ++-- DSS/FS/FAT/FAT.asm | 393 +++++++++++++++++++--------------- DSS/FS/FAT/FAT_X.asm | 52 +++-- DSS/Media_drivers/ide-drv.asm | 369 ++++++++++++++++--------------- DSS/Structures.inc | 16 +- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- Shared_Includes | 2 +- 15 files changed, 553 insertions(+), 444 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index dce1683..e26b06a 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -380,12 +380,16 @@ write_to_: ld a,(disk) ; ; ret write_to_hard_disk: - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого CALL write_to_ RET C + ; проверка на РАМ-диск + LD A,B + CP #80-1 ;!HARDCODE HDD number + CCF + RET NC ; PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR - LD A,B LD HL,0 LD IX,0 LD DE,buffer @@ -414,6 +418,26 @@ write_to_hard_disk: ; LD A,#80 LD (HL),A + ;!FIXIT fat32 not supported + PUSH HL + INC HL + INC HL + INC HL + INC HL + LD A,(HL) + POP HL + CP PartitionSysTypes.FAT12 + JR Z,.next + CP PartitionSysTypes.FAT16_32Mb + JR Z,.next + CP PartitionSysTypes.FAT16 + JR Z,.next + CP PartitionSysTypes.FAT16_LBA + JR Z,.next + ; NOT SUPPORTED FS + POP BC + SCF + RET ; .next: AND A SBC HL,DE diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 8cc11c1..38712ce 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -355,11 +355,11 @@ _TST_PROC: CALL GETMEM ; ; LD HL,(CMDLINE) - LD DE,CORE_BUFFERS.SECBUF+1 + LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 CALL SCOPYS LD A,#80 ;!HARDCODE cmd line size SUB B - LD (CORE_BUFFERS.SECBUF),A + LD (CORE_BUFFERS.SECTOR_BUFFER),A ;R02 LD SP,CORE_BUFFERS.EXEBUFF+510 ;Вставляется в SHARED_PAGE ; @@ -441,7 +441,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) EX DE,HL LD XH,D LD XL,E - LD HL,CORE_BUFFERS.SECBUF + LD HL,CORE_BUFFERS.SECTOR_BUFFER LD C,(HL) INC C LDIR @@ -588,7 +588,8 @@ WAIT: LD A,(ErrorLevel) ;----------------------------------------------------------------------- FREE_PROCESS_MEMORY: - LD HL,MEMTAB + ;LD HL,MEMTAB + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц LD BC,256 ;!HARDCODE размер блока страниц ОЗУ .loop: LD A,(TASK) CPIR @@ -597,7 +598,8 @@ FREE_PROCESS_MEMORY: PUSH BC DEC HL AND A - LD DE,MEMTAB + ;LD DE,MEMTAB + LD DE,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц SBC HL,DE LD A,L CALL RETMEM ; освоб. блок памяти diff --git a/DSS/API/GetMem.asm b/DSS/API/GetMem.asm index 5052ee7..9d30112 100644 --- a/DSS/API/GetMem.asm +++ b/DSS/API/GetMem.asm @@ -11,7 +11,8 @@ GETMEM: LD C,BIOS.GetMem LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY RET C LD D,#00 - LD HL,MEMTAB ; массив списка выдел. страниц + ;LD HL,MEMTAB ; массив списка выдел. страниц + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц ADD HL,DE LD A,(TASK) ; уровень текущей программы LD (HL),A diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 9735f72..3ea0859 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -53,7 +53,7 @@ MKDIR: EXX ; CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера - CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 @@ -99,7 +99,7 @@ MKDIR: ; ; создаём служебные каталоги "." и ".." в созданном каталоге ; КАТАЛОГ "." - LD HL,CORE_BUFFERS.SECBUF ; буфер + LD HL,CORE_BUFFERS.SECTOR_BUFFER ; буфер LD (HL),"." ; запись тек. каталога LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел ; @@ -162,26 +162,29 @@ MKDIR: .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A ; - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 - LD BC,1*256 + Dss.DRV.Write - RST ToDSS.DRV + ; IN A,(SLOT3) + ; PUSH AF + ; IN A,(SLOT0) + ; OUT (SLOT3),A + ; ; + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 + ; LD BC,1*256 + Dss.DRV.Write + ; RST ToDSS.DRV + ; ; + ; POP AF + ; OUT (SLOT3),A + CALL WRITE_SECTOR + ; !FIXIT нет проверки на ошибку ; - POP AF - OUT (SLOT3),A - ; - LD HL,CORE_BUFFERS.SECBUF + LD HL,CORE_BUFFERS.SECTOR_BUFFER ; [x] optimization LD A,(HL) OR A JR Z,.skip_clean ; - LD DE,CORE_BUFFERS.SECBUF+1 + LD DE,CORE_BUFFERS.SECTOR_BUFFER+1 LD BC,511 ;!HARDCODE sector size LD (HL),0 LDIR diff --git a/DSS/API/RetMem.asm b/DSS/API/RetMem.asm index fb5aab4..4258bf2 100644 --- a/DSS/API/RetMem.asm +++ b/DSS/API/RetMem.asm @@ -6,7 +6,8 @@ ////////////////////////////////////////////////////////////////////// RETMEM: LD E,A LD D,#00 - LD HL,MEMTAB ; массив списка выдел. страниц + ;LD HL,MEMTAB ; массив списка выдел. страниц + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц ADD HL,DE LD A,(TASK) ; уровень текущей программы CP (HL) @@ -20,7 +21,8 @@ RETMEM: LD E,A ;POP DE LD A,DSS_Error.sys.INVALID_MEMORY_HND RET C - LD HL,MEMTAB + ;LD HL,MEMTAB + LD HL,CORE_BUFFERS.MemoryTable ADD HL,DE XOR A LD (HL),A diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 9823609..95f45f5 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -53,32 +53,33 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 CALL CLUSTER_TO_SECTOR LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD B,A - LD C,Dss.DRV.Read ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: ;PUSH AF PUSH BC PUSH HL PUSH IX ; - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - LD DE,CORE_BUFFERS.SECBUF+#C000 - ;LD BC,1*256 + Dss.DRV.Read - LD B,1 - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - RST ToDSS.DRV - POP AF - OUT (SLOT3),A + ; IN A,(SLOT3) + ; PUSH AF + ; IN A,(SLOT0) + ; OUT (SLOT3),A + ; ; + ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 + ; LD BC,1*256 + Dss.DRV.Read + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; RST ToDSS.DRV + ; POP AF + ; OUT (SLOT3),A + CALL READ_SECTOR + ; !FIXIT нет проверки на ошибку ; ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора LD B,16 - LD HL,CORE_BUFFERS.SECBUF + LD HL,CORE_BUFFERS.SECTOR_BUFFER .check_dir_loop: LD A,(HL) OR A - JP Z,.RMD15 ;DIR EMPTY + JP Z,.dir_empty CP "." JR Z,.next_record CP #E5 ;!HARDCODE байт удаления файла @@ -120,7 +121,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 .delete: POP IX JP DEL_FN.DELETE ; пометить запись как "удаленная" ; -.RMD15: POP HL +.dir_empty: POP HL POP HL POP HL POP HL diff --git a/DSS/API/SetMem.asm b/DSS/API/SetMem.asm index edde33a..92beb2f 100644 --- a/DSS/API/SetMem.asm +++ b/DSS/API/SetMem.asm @@ -7,7 +7,8 @@ ////////////////////////////////////////////////////////////////////// SETMEM: LD E,A LD D,#00 - LD HL,MEMTAB + ;LD HL,MEMTAB + LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц ADD HL,DE LD A,(TASK) CP (HL) diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index a7dd2b7..2d8b51f 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -290,7 +290,7 @@ CLEAR_BUFFER_AND_INIT_PROC: ; DS $/256+1*256-$,0 c:\bin\menu ;----------------------------------------------------------------------; -MEMTAB: BLOCK 256,0 +;MEMTAB: BLOCK 256,0 ;----------------------------------------------------------------------; _mInfoALIGN 256,0 @@ -415,17 +415,32 @@ FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer -SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER +SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER +MemoryTable EQU BUFFERSplace.MemoryTable ENDMODULE CLEAR_ZONE.size EQU _sBuffers ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "BUFFERSplace ", /H, CORE_BUFFERS.BUFFERSplace - DISPLAY "FatBuffer ", /H, CORE_BUFFERS.FatBuffer - DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer - DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF - DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF + DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start + DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size + DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "Consist: " + DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF + DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size + DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize + DISPLAY " FatBuffer ", /H, CORE_BUFFERS.FatBuffer + DISPLAY " FatBuffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer + DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF + DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF + DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK + DISPLAY " Size ", /H, CORE_BUFFERS.BUFFER - CORE_BUFFERS.XSTACK + DISPLAY " BUFFER ", /H, CORE_BUFFERS.BUFFER + DISPLAY " Size ", /H, CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFER + DISPLAY " MemoryTable ", /H, CORE_BUFFERS.MemoryTable + DISPLAY " Size ", /H, _sBuffers - (CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFERSplace) + DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size DISPLAY "--- --- --- --- --- --- --- ---" EXPORT CORE_BUFFERS.BUFFERSplace @@ -434,8 +449,8 @@ CLEAR_ZONE.size EQU _sBuffers EXPORT CORE_BUFFERS.EXEBUFF EXPORT CORE_BUFFERS.XSTACK EXPORT CORE_BUFFERS.BUFFER - EXPORT CORE_BUFFERS.SECBUF - + EXPORT CORE_BUFFERS.SECTOR_BUFFER + EXPORT CORE_BUFFERS.MemoryTable /* ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FM_BUF _sFM=$ @@ -464,16 +479,10 @@ EXEBUFF _sEXE_HEADER=$+FM_BUF.FullSize XSTACK EQU EXEBUFF+_sEXE_HEADER+255 BUFFER EQU XSTACK+1 -SECBUF EQU BUFFER +SECTOR_BUFFER EQU BUFFER ;R11 //////////////////////////////// */ - DISPLAY "FM_BUF addr: ",/H,CORE_BUFFERS.FM_BUF - DISPLAY "FM_BUF.Size: ",/H,CORE_BUFFERS.FM_BUF.Size - DISPLAY "FM_BUF.FullSize: ",/H,CORE_BUFFERS.FM_BUF.FullSize - DISPLAY "EXEBUFF: ",/H,CORE_BUFFERS.EXEBUFF - DISPLAY "XSTACK: ",/H,CORE_BUFFERS.XSTACK - DISPLAY "BUFFER: ",/H,CORE_BUFFERS.BUFFER -; + ; ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < ; @@ -634,7 +643,7 @@ BIN_END_ADDRESS EQU $ ;R06 ;R06 BUFFER -;R06 SECBUF DB ". ",#10 +;R06 SECTOR_BUFFER DB ". ",#10 ;R06 DW 0,0,0,0,0 ;R06 DW #0000 ;R06 DW #0000 diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 6b3894d..ada06b3 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -10,10 +10,65 @@ ;--------------------------------------------------------------- ;----------------------------------------------------------------------; +; сбрасывает значения свободных и первого свободного секторов на "неопределено" +RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO) + OR A + RET Z + ; + CALL READ_FSinfo + ; + LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + LD B,8 ; 2 x DWORD + LD A,#FF + ; +.fsinfo_loop: LD (HL),A + INC HL + DJNZ .fsinfo_loop + ; + XOR A + LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + JR WRITE_FSinfo +; ; +; Прочитать BPB в SECTOR_BUFFER +READ_BPB: LD C,Dss.DRV.GetBPB + JR RW_SECTOR + ; +; Записать FSinfo из SECTOR_BUFFER +WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) + LD HL,0 +; Записать сектор из SECTOR_BUFFER +; Вход: HL:IX = Logical Block (sector) +WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write + JR RW_SECTOR + ; +; Прочитать FSinfo в SECTOR_BUFFER +READ_FSinfo: + LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector) + LD HL,0 +; Прочитать сектор в SECTOR_BUFFER +; Вход: HL:IX = Logical Block (sector) +READ_SECTOR: LD BC,1*256 + Dss.DRV.Read + ; +RW_SECTOR: IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + ; + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 + RST ToDSS.DRV + EX AF,AF' + ; + POP AF + OUT (SLOT3),A + EX AF,AF' + RET +; + ; [ ] удаление записи LFN ; -; вход: IX = текущая запись в странице с каталогом FAT -; для которой надо удалить записи LFS +; вход: IX = текущая запись в странице с каталогом FAT для которой +; надо удалить записи LFS DELETE_LFN_RECORDS: PUSH IX LD A,XH @@ -40,7 +95,6 @@ DELETE_LFN_RECORDS: .beyond_boundaries: ; !TODO подгрузка другой части каталога. пока заглушка POP IX RET - ;----------------------------------------------------------------------; @@ -360,10 +414,10 @@ FINDDIR: CHECK_ROOT_CLUSTER: EX DE,HL - LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005 LD A,L OR H - LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H) + LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H) OR L OR H EX DE,HL @@ -372,22 +426,14 @@ CHECK_ROOT_CLUSTER: ;----------------------------------------------------------------------; ; вход: HL - имя директории ; [x] fat32 ;!TEST -; !FIXIT ловится двойное обращение при открытии корня диска, например OPENDIR: LD IY,CORE_BUFFERS.FM_BUF LD A,(HL) OR A JR NZ,.SUBDIR -.REROOT: ; fat32 - ; EX DE,HL - ; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - ; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL - ; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - ; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL - ; EX DE,HL - LD DE,0 - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),DE - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),DE - + ; +.REROOT: LD DE,0 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE CALL LOADDIR ; CF=0 LD HL,WorkDirectory @@ -430,13 +476,12 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF .SUBDIR3: CALL FINDDIR RET C EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; fat32 - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; fat32 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32 + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32 LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL - ;EX DE,HL - ;JP LOADDIR -;--------------; + LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL +;-------------; EX DE,HL +; JP LOADDIR ; Прочитать список каталога ; [x] fat32 ;!TEST LOADDIR: ;!TODO optimize @@ -449,14 +494,9 @@ LOADDIR: ;!TODO optimize JR NZ,.LoadRootDir ; fat32 LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL - ; CALL .read_dir - ; LD HL,0 - ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL - ; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL - ; RET + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL ; .read_dir: LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько @@ -467,7 +507,7 @@ LOADDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ; ст. разряд +.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога @@ -522,9 +562,9 @@ SAVEDIR: ;!TODO optimize JR NZ,.SaveRootDir ; fat32 LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) - LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL + LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL ; .save_dir: LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory @@ -537,7 +577,7 @@ SAVEDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) +.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0 LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors @@ -611,60 +651,44 @@ WRT_HND: SET_PAGE_X DIRPAGE ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ; не используется -; TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open -; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) -; LD C,Dss.DRV.MediaCheck -; RST ToDSS.DRV -; OR A -; RET Z - - -; рег. A - номер диска -; [ ] fat32 -RD_BPB: LD C,SLOT3 - IN B,(C) - PUSH BC - IN A,(SLOT0) - OUT (SLOT3),A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 - LD C,Dss.DRV.GetBPB - RST ToDSS.DRV - POP BC - OUT (C),B +; [x] fat32 ;!TEST +RD_BPB: ; LD C,SLOT3 + ; IN B,(C) + ; PUSH BC + ; IN A,(SLOT0) + ; OUT (SLOT3),A + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08 + ; LD C,Dss.DRV.GetBPB + ; RST ToDSS.DRV + ; POP BC + ; OUT (C),B + CALL READ_BPB JP C,DOS_X_Error.Not_ready ; LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 ;R05 AND A SBC HL,DE JP NZ,DOS_X_Error.UnknownBPB ; ; ;R08 ; [x] fat32 - ; LD HL,CORE_BUFFERS.SECBUF + ; LD HL,CORE_BUFFERS.SECTOR_BUFFER ; LD DE,CORE_BUFFERS.BootSector ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LDIR ; - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE) + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE) CP #F0 JP C,DOS_X_Error.UnknownBPB ; - ;!TODO проверить по метке раздела, что это FAT, потом определять какой FAT - ; - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BytesPerSector) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector) LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerCluster) + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A ; calc. first sector FAT - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) - ; - ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec - ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) - ; ADD HL,DE - ; + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) ;!FIXIT для fat32 втыкать сюда сектора активной таблицы LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 @@ -675,22 +699,21 @@ RD_BPB: LD C,SLOT3 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.MaxClusterHigh),BC ; [ ] fat32 reset variables LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 ; ; - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT16) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) LD A,C LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE ; - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) ; amount FATs + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT DEC A @@ -727,7 +750,7 @@ RD_BPB: LD C,SLOT3 ENDIF ; EX DE,HL - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 ; [ ]fat32 ;!TEST LD A,H OR L @@ -762,79 +785,36 @@ RD_BPB: LD C,SLOT3 JP NC,.loop3 .loop3.end: ; LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL - ; - IF COMPILE_UNUSED_CODE - EX DE,HL - LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize - XOR A - ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -.loop4: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,DE - JR NC,.loop4 - LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) - ENDIF - - //////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////// -; LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага -; LD DE,FAT_STRING -; LD B,3 -; ;R_BPBL1 -; .loop5: LD A,(DE) -; CP (HL) -; JP NZ,.IBM_DOS -; INC HL -; INC DE -; DJNZ .loop5 - ;FID -; .loop6: LD A,(HL) -; INC HL -; CP ' ' -; JR Z,.loop6 -; ; -; CP '1' -; JP Z,.fat1x -; CP '3' -; JP NZ,DOS_X_Error.UnknownBPB -; LD A,#52 ; #52-#20 = #32 fat type -; LD HL,#0FFF -; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL -; LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT -; LD H,L -; JR .BPB_FAT -; ; -; .fat1x: LD A,(HL) -; CP '2' ; FAT16 -; LD HL,#0FFF -; JR Z,.BPB_FAT -; CP '6' ; FAT12 -; JP NZ,DOS_X_Error.UnknownBPB -; LD H,L -; .BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) -; LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A -; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL -;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// +;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer +; EX DE,HL +; LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize +; XOR A +; ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится +;.loop4: INC A +; JP Z,DOS_X_Error.UnknownBPB +; SBC HL,DE +; JR NC,.loop4 +; LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) +; ; LD HL,0 -; LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track -; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.HEADS) -; .BPB_L1: ; calc. sector per cylinder +; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.HEADS) +;.BPB_L1: ; calc. sector per cylinder ; ADD HL,BC ; DEC A ; JR NZ,.BPB_L1 ; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// ; [ ] fat32 - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerDrive) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low AND A @@ -862,7 +842,11 @@ RD_BPB: LD C,SLOT3 ; .loop7_exit: INC HL LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL - LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC + LD A,L + OR H + JR NZ,.no_inc_bc + INC BC +.no_inc_bc: LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; XOR A LD H,A @@ -876,7 +860,7 @@ RD_BPB: LD C,SLOT3 LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) ; DE:HL = SectorsPerFAT ; - LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) + LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) LD B,A DEC A JR Z,.loop_mul_end @@ -894,7 +878,7 @@ RD_BPB: LD C,SLOT3 JR NC,.no_inc_DE INC DE .no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) ADD HL,BC JR NC,.no_inc_de INC DE @@ -926,43 +910,48 @@ RD_BPB: LD C,SLOT3 SBC HL,BC JR C,.its_FAT32 ; - ; It's FAT16 + ; It's FAT16 LD HL,#FFFF LD A,FAT_TYPE.x16 -.Set_SN: EXX +.set_vars: EXX LD HL,0 LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.LABEL + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),HL + LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL EXX - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER) - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) - JR .BPB_FAT + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) + JR .SET_VARS ; .its_FAT12: LD HL,#0FFF LD A,FAT_TYPE.x12 - JR .Set_SN + JR .set_vars ; .its_FAT32: EXX - LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.LABEL + LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL EXX ; - LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster+2) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC + CALL ClusterToSector LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC ; + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) + LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL + ; LD A,FAT_TYPE.x32 LD HL,#0FFF LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL LD H,L - LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER) - LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) + LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) ; -.BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A +.SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC @@ -970,32 +959,98 @@ RD_BPB: LD C,SLOT3 LD DE,CORE_BUFFERS.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 - CALL R_CLUST - XOR A - RET - ;!TODO detect fat type by clusters! -.IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE) - CP #F0 - JR C,DOS_X_Error.UnknownBPB - ; ID ram-диска - #FA - CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 - LD A,'2' - LD HL,#0FFF - JP NZ,.BPB_FAT ; - LD A,'6' - LD H,L - JP .BPB_FAT -; + ; Установить начальный кластер для чтения + LD A,(CORE_BUFFERS.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 + XOR A + RET + ; +.set_FSinfo: ; + IFN USE_FSINFO_FAT32 + CALL READ_FSinfo + ; !FIXIT проверка на ошибку + ; + LD A,#FF + ; проверка одной из сотни сраных сигнатур + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) + LD BC,#7272 + SBC HL,BC + JR NZ,.error_sig + EX DE,HL + LD DE,#6141 + SBC HL,DE + JR NZ,.error_sig + ; + LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + LD B,8 ; 2 x DWORD + LD A,#FF + ; +.fsinfo_loop: AND (HL) + INC HL + DJNZ .fsinfo_loop + ; +.error_sig: XOR #FF + LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A + ; + XOR A + LD H,A + LD L,2 + LD (G_CLUST.low),HL + LD L,H + LD (G_CLUST.high),HL + RET + ELSE + CALL READ_FSinfo + ; !FIXIT проверка на ошибку + ; + ; проверка одной из сотни сраных сигнатур + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE) + LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) + LD BC,#7272 + SBC HL,BC + JR NZ,.error_sig + EX DE,HL + LD DE,#6141 + SBC HL,DE + JR NZ,.error_sig + ; !FIXIT сделать проверку кластеров на валидность (не больше максимального для раздела) + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) + LD (G_CLUST.low),HL + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) + LD (G_CLUST.high),HL + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL + XOR A + RET +.error_sig: LD HL,#FFFF + LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (CORE_BUFFERS.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 + ENDIF +;;;;;;;; ; --> BC:HL - Cluster ; <-- BC:HL - Sector diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 14a208f..e77f6fe 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -13,15 +13,6 @@ ;RX01 10-02-1999 DNS UPGRADE FAT CASH ;--------------------------------------------------------------- -; [x] fat32 ;!TEST -; Установить начальный кластер для чтения -R_CLUST: LD HL,#0001 - LD (G_CLUST.low),HL - DEC L - LD (G_CLUST.high),HL - RET - - ; ; [x] fat32 ;!TEST ; найти первый свободный кластер ;!TODO проверить перебор кластеров @@ -29,14 +20,16 @@ R_CLUST: LD HL,#0001 ; HL' - старший номер свободного кластера G_CLUST: ; .low+1: LD HL,#0001 + EXX +.high+1: LD HL,#0000 + EXX .loop: INC HL ; номер кластера LD A,L OR H ; [x] fat32 EXX -.high+1: LD HL,#0000 - JR NZ,.no_inc - INC HL + JR NZ,.no_inc + INC HL .no_inc: EXX ; CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера @@ -125,12 +118,11 @@ CHECK_CLUSTER_IS_SMALLER: EX DE,HL EXX LD A,DSS_Error.sys.DISK_FULL - ;RET C - RET NZ ; если CORE_BUFFERS.FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный + RET C + RET NZ ; проверяем младше слово номера кластера .low: EX DE,HL LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) - ; CF = 0 SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL @@ -246,6 +238,24 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; ; [x] fat32 ;!TEST +; +; !TODO optimize +; при записи в кэш значения отмечать через OR в ячейке FatBuffer.SectorOfCacheBlock +; бит соответствующий куску в странице кэша, который был изменён и потом скидывать на диск +; только те куски, которые были изменены. +; |--------------------| +; | bit | adresses | +; |-----|--------------| +; | 0 | #0000..#07FF | +; | 1 | #0800..#0FFF | +; | 2 | #1000..#17FF | +; | 3 | #1800..#1FFF | +; | 4 | #2000..#27FF | +; | 5 | #2800..#2FFF | +; | 6 | #3000..#37FF | +; | 7 | #3800..#3FFF | +; |--------------------| +; ;------------------------------------------------------------------------------------------------ ; Записать в кеш FAT-а номер кластера ; вход: hl = младшее слово номера кластера в который записать @@ -447,7 +457,10 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) +.Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + CALL Z,RESET_FSInfo + LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока @@ -465,10 +478,9 @@ WRITE_FAT_TABLE: .next: ADD HL,DE ;+ SIZE CASH (16 SECTORS) JR NC,.no_inc INC C +.no_inc: ; C:HL смещение в секторах внутри таблицы FAT на конец блока ; - ; C:HL смещение в секторах внутри таблицы FAT на конец блока - ; -.no_inc: ; конец блока выходит за пределы таблицы? + ; конец блока выходит за пределы таблицы? LD B,E ; MAX число секторов для чтения в кэш LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) LD (.sub_A),A @@ -569,7 +581,7 @@ GET_FAT32_CELL: LD H,A LD A,C ; - LD B,FAT_CACHE.Degree_32 ; 4 сдвига + LD B,FAT_CACHE.Degree ; 4 сдвига .loop_block: RLCA ; << H RL L ; << L' diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 82fcd6b..08efad2 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -281,7 +281,6 @@ DRVCLC: ; INC A ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV - ;!TODO заменить PUSH на EXX? SELHDD: PUSH DE PUSH BC PUSH HL @@ -519,192 +518,190 @@ CHECKH: PUSH IY ;------------------------------[ PARTIT ]------------------------------; DEFINE_PARTITIONS: -.FAT32_DOS: -.EASYDOS: -.MEDIDOS: -.HIGHDOS: - LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) - LD IX,(CURRENT_SECTOR_L) - ADD IX,DE - LD DE,(CURRENT_SECTOR_H) - ADC HL,DE - LD D,XH - LD E,XL - ;BPB SECTOR - LD IX,(OFFSECT) - LD (IX + LOGDRV.SECTOR_OFFSET + 0),E - LD (IX + LOGDRV.SECTOR_OFFSET + 1),D - LD (IX + LOGDRV.SECTOR_OFFSET + 2),L - LD (IX + LOGDRV.SECTOR_OFFSET + 3),H - LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) - LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) - LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) - LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) - ;SIZE DISK - LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E - LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D - LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L - LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H - ;[x] 17.12.2023 загрузка с активного раздела, а не с первого +.FAT32_DOS: ; +.EASYDOS: ; +.MEDIDOS: ; +.HIGHDOS: ; + LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) + LD IX,(CURRENT_SECTOR_L) + ADD IX,DE + LD DE,(CURRENT_SECTOR_H) + ADC HL,DE + LD D,XH + LD E,XL + ;BPB SECTOR + LD IX,(OFFSECT) + LD (IX + LOGDRV.SECTOR_OFFSET + 0),E + LD (IX + LOGDRV.SECTOR_OFFSET + 1),D + LD (IX + LOGDRV.SECTOR_OFFSET + 2),L + LD (IX + LOGDRV.SECTOR_OFFSET + 3),H + LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) + LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) + LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) + LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) + ;SIZE DISK + LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E + LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D + LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L + LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H + ;[x] 17.12.2023 загрузка с активного раздела, а не с первого .ExtendedPartitionFlag+1: - LD A,0 - OR A ; !TODO загрузка с расширенного раздела не поддерживается - LD A,#FF - JR NZ,.not_supported ; если расширенный раздел, то облом - ; - POP BC - PUSH BC - LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table - SUB B -.not_supported: - LD (IX + LOGDRV.PARTITION_RECORD_NUM),A - ; - ;!TEST Подстраховка от переполнения таблицы LOGDRV - LD A,(DRVCLC.count) - INC A - CP DSS_MAX_DRIVES_AMOUNT+1 - RET NC - LD (DRVCLC.count),A - ; - LD A,(DRV_NUM) - LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A - LD DE,LOGDRV.TBL_Entry ;DSKITEM - ADD IX,DE - LD (OFFSECT),IX - JP .NextPartition - ; -.NotExtended: - CP PartitionSysTypes.FAT16 - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_LBA - JR Z,.HIGHDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,.MEDIDOS - CP PartitionSysTypes.FAT12 - JR Z,.EASYDOS - ;[ ] fat32 - CP PartitionSysTypes.FAT32 - JP Z,.FAT32_DOS - CP PartitionSysTypes.FAT32_LBA - JP Z,.FAT32_DOS - ; - CP PartitionSysTypes.Win_Ext_LBA - JR Z,.SubLevel - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - ;OR A ;PartitionSysTypes.Empty - ;JR NZ,NXTPART - JR .NextPartition ; раздел не поддерживается - ;POP BC ; баланс стека - ;RET - ;POP BC - ;OR A - ;RET Z -;NODEFIN: - ;SCF - ;RET - ; -.BEGIN: IN A,(SLOT3) - PUSH AF - LD A,SHARED_PAGE - OUT (SLOT3),A - CALL .Start - POP AF - OUT (SLOT3),A - RET -.Start: LD IX,0 - LD DE,0 - LD (EXTDOSL),DE ;R01 - LD (EXTDOSH),IX ;R01 - ; -.LOOP: LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - ; - LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) - LD DE,#AA55 - AND A - SBC HL,DE - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - ;JR NZ,NODEFIN - SCF - RET NZ - ; - LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR - LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table -.DOSAGA: - PUSH BC - LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) - CP PartitionSysTypes.Extended - JR NZ,.NotExtended -.SubLevel: - PUSH IY - LD DE,(CURRENT_SECTOR_L) - LD IX,(CURRENT_SECTOR_H) - PUSH DE - PUSH IX - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - INC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - CALL .ParseExtended - ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(.ExtendedPartitionFlag) - DEC A - LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается - ; - POP IX - POP DE - LD (CURRENT_SECTOR_L),DE - LD (CURRENT_SECTOR_H),IX - CALL .LOAD_SECTOR - POP IY -.NextPartition: - LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry - ADD IY,DE - POP BC - DJNZ .DOSAGA - AND A - RET -.ParseExtended: - LD HL,(EXTDOSL) - LD DE,(EXTDOSH) - LD A,L - OR H - OR E - OR D - LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) - LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) - LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) - JP NZ,.EXTDOS2 - LD (EXTDOSL),DE - LD (EXTDOSH),HL - LD IX,(EXTDOSH) -.EXTDOS2: - LD IX,(EXTDOSL) - ADD IX,DE - PUSH IX - LD DE,(EXTDOSH) - ADC HL,DE - PUSH HL - POP IX - POP DE - JP .LOOP - ; -.LOAD_SECTOR: - PUSH IY - LD IX,(CURRENT_SECTOR_L) - LD HL,(CURRENT_SECTOR_H) - LD DE,PARTITION_BUFFER - LD A,(DRV_NUM) - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS - POP IY - RET + LD A,0 + OR A ; !TODO загрузка с расширенного раздела не поддерживается + LD A,#FF + JR NZ,.not_supported ; если расширенный раздел, то облом + ; + POP BC + PUSH BC + LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table + SUB B +.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A + ; + ;!TEST Подстраховка от переполнения таблицы LOGDRV + LD A,(DRVCLC.count) + INC A + CP DSS_MAX_DRIVES_AMOUNT+1 + RET NC + LD (DRVCLC.count),A + ; + LD A,(DRV_NUM) + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A + LD DE,LOGDRV.TBL_Entry ;DSKITEM + ADD IX,DE + LD (OFFSECT),IX + JP .NextPartition + ; +.NotExtended: CP PartitionSysTypes.FAT16 + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_LBA + JR Z,.HIGHDOS + CP PartitionSysTypes.FAT16_32Mb + JR Z,.MEDIDOS + CP PartitionSysTypes.FAT12 + JR Z,.EASYDOS + ;[ ] fat32 + CP PartitionSysTypes.FAT32 + JP Z,.FAT32_DOS + CP PartitionSysTypes.FAT32_LBA + JP Z,.FAT32_DOS + ; + CP PartitionSysTypes.Win_Ext_LBA + JR Z,.SubLevel + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта + ;OR A ;PartitionSysTypes.Empty + ;JR NZ,NXTPART + JR .NextPartition ; раздел не поддерживается + ;POP BC ; баланс стека + ;RET + ;POP BC + ;OR A + ;RET Z + ;NODEFIN: + ;SCF + ;RET + ; +.BEGIN: IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A + CALL .Start + POP AF + OUT (SLOT3),A + RET +.Start: LD IX,0 + LD DE,0 + LD (EXTDOSL),DE ;R01 + LD (EXTDOSH),IX ;R01 + ; +.LOOP: LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + ; + LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) + LD DE,#AA55 + AND A + SBC HL,DE + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + ;JR NZ,NODEFIN + SCF + RET NZ + ; + LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR + LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table +.DOSAGA: PUSH BC + LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) + CP PartitionSysTypes.Extended + JR Z,.SubLevel + CP PartitionSysTypes.Win_Ext_LBA + JR NZ,.NotExtended + ; +.SubLevel: PUSH IY + LD DE,(CURRENT_SECTOR_L) + LD IX,(CURRENT_SECTOR_H) + PUSH DE + PUSH IX + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + INC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + CALL .ParseExtended + ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(.ExtendedPartitionFlag) + DEC A + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; + POP IX + POP DE + LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR + POP IY +.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry + ADD IY,DE + POP BC + DJNZ .DOSAGA + AND A + RET + ; +.ParseExtended: LD HL,(EXTDOSL) + LD DE,(EXTDOSH) + LD A,L + OR H + OR E + OR D + LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) + JP NZ,.ext_in_ext + LD (EXTDOSL),DE + LD (EXTDOSH),HL + PUSH DE + JR .set_regs + ; +.ext_in_ext: LD IX,(EXTDOSL) + ADD IX,DE + LD DE,(EXTDOSH) + ADC HL,DE + PUSH IX +.set_regs: PUSH HL + POP IX + POP DE + JP .LOOP + ; +.LOAD_SECTOR: PUSH IY + LD IX,(CURRENT_SECTOR_L) + LD HL,(CURRENT_SECTOR_H) + LD DE,PARTITION_BUFFER + LD A,(DRV_NUM) + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP IY + RET ;----------------------------------------------------------------------; ; diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ce82e8c..0758840 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -75,7 +75,6 @@ ; STRUCT _sFatBuffer -;.MSG: BYTE 'FAT' .DRIVE: BYTE #FF .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .CacheBlock: WORD #0000 @@ -99,15 +98,18 @@ .END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3 .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 -; IF COMPILE_UNUSED_CODE -; .FilesPerSector: BYTE #00 ; число файловых записей в секторе -; .ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) -; ENDIF +.RESET_FSINFO BYTE 0 +; IF USE_FSINFO_FAT32 +;.FREE_CLUSTERS_COUNT_L WORD #FFFF +;.FREE_CLUSTERS_COUNT_H WORD #FFFF +; ENDIF +;.FilesPerSector: BYTE #00 ; число файловых записей в секторе +;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DWORD #0000 ; количество секторов на цилиндре ENDS @@ -121,7 +123,7 @@ ;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .EXE_Header _sEXE_HEADER ; 512 bytes .Stack _sStack ; 256 bytes -.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF +.Buffer BLOCK 512,0 ; FOR BUFFER & SECTOR_BUFFER .MemoryTable BLOCK 256,0 ; 256 bytes ENDS ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 9f02e1c..71ed48c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -952 \ No newline at end of file +954 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 0e35f90..972f2cd 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -27,7 +27,7 @@ ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// - DEFINE _FAT32_ENABLE 1 ;!TODO пока недоделано + DEFINE USE_FSINFO_FAT32 0 ; недоделано. А нужно ли? SERVICE_SECTORS: .FAT12 EQU #0FEF diff --git a/Shared_Includes b/Shared_Includes index 73f764c..62170ee 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 73f764ccd1ab8de8dea7eef3b4f5cd27e2ea8dab +Subproject commit 62170ee7bc7dabe6fd55b94e89826ca510a60097