From 031277921780825c6fef84cf29b08a8d4076be26 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 12 Mar 2024 03:50:25 +1000 Subject: [PATCH] Preparing for FAT32 --- BOOT/DSSBOOT.ASM | 22 +- BOOT/boot.asm | 2 +- DSS/API/Attribute.asm | 4 +- DSS/API/Close.asm | 4 +- DSS/API/Create.asm | 34 ++- DSS/API/Delete.asm | 17 +- DSS/API/GetDateTime.asm | 10 +- DSS/API/MkDir.asm | 36 +++- DSS/API/Open.asm | 31 +-- DSS/API/Read.asm | 90 ++++---- DSS/API/RmDir.asm | 54 +++-- DSS/API/ScanDRV.asm | 10 + DSS/API/SetDateTime.asm | 10 +- DSS/API/Write.asm | 74 +++---- DSS/API/diskINF.asm | 14 +- DSS/DOS_FM.ASM | 30 +-- DSS/DOS_Proc.asm | 51 +++-- DSS/DSS-MAIN.ASM | 46 +--- DSS/EXECUTE.ASM | 74 +++---- DSS/FS/FAT/FAT.asm | 253 +++++++++++----------- DSS/FS/FAT/FAT12_16.asm | 370 +++++++++++++++++--------------- DSS/FS/FAT/FAT32.asm | 138 ++++++++++++ DSS/INTMOUSE.ASM | 52 ++--- DSS/KEYINTER.ASM | 26 +-- DSS/Kernel_Panic.asm | 75 +++++++ DSS/Media_drivers/ReScanDRV.ASM | 79 +++---- DSS/Media_drivers/ide-drv.asm | 209 +++++++++--------- DSS/Structures.inc | 76 +++---- DSS/build.txt | 2 +- DSS/defines.inc | 6 +- SHELL/Commands/DIR.ASM | 4 +- Shared_Includes | 2 +- 32 files changed, 1088 insertions(+), 817 deletions(-) create mode 100644 DSS/FS/FAT/FAT32.asm create mode 100644 DSS/Kernel_Panic.asm diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 609748c..5cd2865 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -348,26 +348,26 @@ NX2: LD HL,(BOOT+510) SCF RET NZ LD IY,BOOT ;Analysing Block Parametr BIOS - LD A,(IY+_sBOOT_SEC.ID_FORM) + LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) CP #F0 RET C LD HL,0 ;calc. first sector FAT LD (DIR_FRH),HL - LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - LD D,(IY+_sBOOT_SEC.RESERVE+1) + LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) ADD HL,DE LD (FAT_FRM),HL ;first sector FAT - LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT - LD D,(IY+_sBOOT_SEC.S_P_F+1) + LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ;sectors in FAT + LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) LD A,(BOOT.FAT_NUM) ;amount FATs C_DATA1: ADD HL,DE DEC A JR NZ,C_DATA1 LD (DIR_FRM),HL ;first sector DIR EX DE,HL - LD L,(IY+_sBOOT_SEC.F_P_DIR) ;Number file handel - LD H,(IY+_sBOOT_SEC.F_P_DIR+1) + LD L,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ;Number file handel + LD H,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1) ADD HL,HL ADD HL,HL ADD HL,HL @@ -381,8 +381,8 @@ C_DATA1: ADD HL,DE ADD HL,DE LD (DAT_FRM),HL ;First sector data - LD C,(IY+_sBOOT_SEC.B_P_S) ;Size sector - LD B,(IY+_sBOOT_SEC.B_P_S+1) + LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ;Size sector + LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) LD HL,0 LD A,(BOOT.S_P_C) NEXTAD3: @@ -437,7 +437,7 @@ BPB_FAT XOR A RET -IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) +IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) CP #F0 RET C CP #F8 @@ -724,7 +724,7 @@ MASKARE DB "SYSTEM DOS" FATMSG DB "FAT" ; Area for boot sector [512Bytes] -BOOT _sBOOT_SEC = $ +BOOT _sBOOT_SECTOR_PARAMS = $ ; BOOT EQU $ ; ID_NAME EQU BOOT+#03 ; +03 DOS NAME diff --git a/BOOT/boot.asm b/BOOT/boot.asm index aee1f22..ce9672d 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -357,7 +357,7 @@ write_to_: ld a,(disk) ; LD BC,1*256 + BIOS.DRV_READ RST ToBIOS POP BC - LD HL,(buffer + _sBOOT_SEC.RESERVE) + LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) LD DE,04 ;!HARDCODE минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) AND A SBC HL,DE diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm index 9a9a6e4..2ecbc1b 100644 --- a/DSS/API/Attribute.asm +++ b/DSS/API/Attribute.asm @@ -31,7 +31,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 CALL .OPENATR ;R002 RET C ;!TEST ;[x] 16/11/23 optimize get attribute - LD A,(HANDBUF+_sFM.ATTRIBUT) + LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT) ;PUSH BC ;CALL CLOSE @@ -56,7 +56,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23 RET C SET 7,(IY+_sFM.ACCESS_MODE) RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit - LD (IY+_sFM.ATTRIBUT),B + LD (IY+_sFM.FS_REC.ATTRIBUT),B PUSH BC CALL CLOSE_FN .error: POP BC diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 256e18e..fe945ee 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -31,8 +31,8 @@ CLOSE_FN: LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER+1),D ; [x] 15/11/2023 -bug with bad clusters ;!TEST - LD (IY+_sFM.ST_CLUSTER),E - LD (IY+_sFM.ST_CLUSTER+1),D + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D ; CALL LOADDIR .TMP+1: LD A,0 diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 4e234b9..1b23edc 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -13,13 +13,22 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 POP BC POP HL RET C - LD A,C + LD A,C ; ; CALL .Prepare RET C CALL SEARCH.File - CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT - JR .DO + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT + CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT + CP DSS_Error.sys.FILE_NOT_FOUND + JR Z,.DO + SCF + RET +.FILE_EXISTS_DEL: + CALL DEL_FN.DELETE + LD A,DSS_Error.sys.FILE_NOT_FOUND + RET ; .NEW_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID @@ -36,10 +45,17 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 CALL .Prepare RET C CALL SEARCH.File - LD A,DSS_Error.sys.FILE_EXISTS - CCF - RET C + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.FILE_EXISTS + ; CCF + ; RET C + JR NC,.FILE_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ ; + ; + ;no_file_found .DO: LD HL,MASKARE LD DE,HANDBUF LD BC,11 @@ -89,6 +105,12 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ; LD HL,TMPNAME ; LD DE,MASKARE JP MASK + ; +; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 +.FILE_EXISTS: + LD A,DSS_Error.sys.FILE_EXISTS + CCF + RET ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; OUTPUT: A - FM CREAT_N EQU CREATE.NEW_FN diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 4cfb9d2..a749150 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -26,26 +26,27 @@ DEL_FN: ;!TEST CALL LOADDIR CALL SEARCH.File RET C - ;JP .DELETE ; пометить запись как "удаленная" -.DELETE: SET_PAGE_X DIRPAGE - LD (IX+_sFM.NAME),#E5 ; признак удаления файла - LD E,(IX+_sFM.ST_CLUSTER) ; № первого кластера - LD D,(IX+_sFM.ST_CLUSTER+1) +.DELETE: + SET_PAGE_X DIRPAGE + LD (IX + _sFAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла + ; [ ] fat32 + LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера + LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) ; OUT (SLOT3),A LD A,E OR D JP Z,SAVEDIR ; сбросить кеш каталога на диск .loop: EX DE,HL ; hl=номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера PUSH DE ; номер след. кластера PUSH AF LD DE,#0000 ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера POP AF POP DE JP NC,.loop - CALL WR_FAT ;!FIXIT может не нужна тут? Там дальше будет + CALL WRITE_FAT_TABLE ;!FIXIT может не нужна тут? Там дальше будет JP SAVEDIR ; сбросить кеш каталога на диск ; \ No newline at end of file diff --git a/DSS/API/GetDateTime.asm b/DSS/API/GetDateTime.asm index ed8ba32..6cdec69 100644 --- a/DSS/API/GetDateTime.asm +++ b/DSS/API/GetDateTime.asm @@ -14,11 +14,11 @@ GET_D_T: CALL SET_FM RET C ; время/дату из структуры дескр. - LD E,(IY+_sFM.TIME) ; время - LD D,(IY+_sFM.TIME+1) ; - LD C,(IY+_sFM.DATE) ; дата - LD B,(IY+_sFM.DATE+1) ; - CALL RMKTIME ; раскодировать время/дату + LD E,(IY+_sFM.FS_REC.TIME) ; время + LD D,(IY+_sFM.FS_REC.TIME+1) ; + LD C,(IY+_sFM.FS_REC.DATE) ; дата + LD B,(IY+_sFM.FS_REC.DATE+1) ; + CALL RMKTIME ; раскодировать время/дату AND A RET ; \ No newline at end of file diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 7173502..bfde2c5 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -6,6 +6,13 @@ ; ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 //////////////////////////////////////////////////////////////////////// +;error +MKDIR.DIR_EXISTS: + LD A,DSS_Error.sys.DIR_EXISTS + CCF + RET + + MKDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL CALL DIR_PATH_CHECK @@ -28,16 +35,22 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ;CALL LOADDIR ; прочитать список каталога ; CALL SEARCH.Dir ; поиск записи каталога в списке диска - LD A,DSS_Error.sys.DIR_EXISTS - CCF - RET C ; каталог найден + ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024 + ; LD A,DSS_Error.sys.DIR_EXISTS + ; CCF + ; RET C ; каталог найден + JR NC,.DIR_EXISTS + CP DSS_Error.sys.FILE_NOT_FOUND + SCF + RET NZ ; CALL G_CLUST RET C PUSH HL - LD DE,(FatBuffer.ENDCLUS) ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ; [ ] fat32 + LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск LD HL,MASKARE LD DE,HANDBUF LD BC,11 @@ -80,7 +93,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ;CALL SAVEDIR ; и сбросить кеш каталога на диск LD HL,CORE_BUFFERS.SECBUF ; буфер LD (HL),"." ; запись тек. каталога - LD BC,10*256 + ' ' ; b=счетчик, c=пробел + LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел ; .loop3: INC HL LD (HL),C @@ -110,11 +123,12 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 JP Z,.MKD04 LD IX,HANDBUF XOR A - LD (IX+_sFM.ST_CLUSTER),A - LD (IX+_sFM.ST_CLUSTER+1),A - LD DE,HANDBUF+11 ; ячейка атрибутов файла + ; [ ] fat32 + LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A + LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A + LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла .MKD04: EX DE,HL - LD BC,HANDBUF.SIZE-11 + LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT LDIR POP AF OUT (SLOT3),A diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index cb344cd..d290ad3 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -6,6 +6,8 @@ ; A=0 чтение/запись ; A=1 чтение ; A=2 запись +; ;!TODO A=3 запись без лишних сохранений кэша FAT +; ;!TODO A=4 записать кэш FAT ; выход: CF=0, A - дескриптор файла. ; CF=1, A - код ошибки. //////////////////////////////////////////////////////////////////////// @@ -18,23 +20,26 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 ;JR .start ;!FIXIT сделать как в mkdir или rmdir? ;R008 ; -;OPEN: ; - ;LD (.TMP),A ; enter point from CREATE .start: CALL GETWORD RET C - CALL MASK ; enter point from OPEN_FN + CALL MASK RET C -.FILE: CALL SEARCH.File ; enter point from EXEC +.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE RET C + ;!TEST указатель на запись в каталоге FS + PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH) ;R002 ; .FM: CALL GET_FM ; enter point from ATTRIB RET C LD A,C EX AF,AF' - EXX - LD (IY+_sFM.HANDLE),E - LD (IY+_sFM.HANDLE+1),D - EXX + ;!TEST указатель на запись в каталоге FS + POP DE + ; EXX + LD (IY+_sFM.HANDLE),E + LD (IY+_sFM.HANDLE+1),D + ; EXX + ; LD D,YH LD E,YL LD HL,HANDBUF @@ -45,11 +50,11 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD A,(TASK) LD (IY+_sFM.TASK_NUM),A XOR A - ; + ; [ ] fat32 LD (IY+_sFM.KnownCluster_L),A - LD (IY+_sFM.KnownCluster_H),A + LD (IY+_sFM.KnownCluster_L+1),A LD (IY+_sFM.KnownOffset_L),A - LD (IY+_sFM.KnownOffset_H),A + LD (IY+_sFM.KnownOffset_L+1),A ; LD (IY+_sFM.F_POSITION),A LD (IY+_sFM.F_POSITION+1),A @@ -57,10 +62,12 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.F_POSITION+3),A LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A - LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER + ; [ ] fat32 + LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L LD E,(HL) INC HL LD D,(HL) + ; [ ] fat32 LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER+1),D EX AF,AF' diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index c314c4e..5218696 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -16,19 +16,7 @@ READ: LD (.R_POINT),HL CALL OPENDSK JP C,.ERR_1 ;Расчёт смещения в секторах - ; LD C,(IY+_sFM.F_POSITION) - ; LD E,(IY+_sFM.F_POSITION+1) - ; LD A,E - ; AND #01 - ; LD B,A - ; LD D,(IY+_sFM.F_POSITION+2) - ; LD L,(IY+_sFM.F_POSITION+3) - ; LD H,0 - ; OR A - ; RR L - ; RR D - ; RR E - LD H,0 ; + LD H,0 ;!HARDCODE max file size = 8 gb LD L,(IY+_sFM.F_POSITION+3) LD D,(IY+_sFM.F_POSITION+2) LD E,(IY+_sFM.F_POSITION+1) @@ -43,7 +31,6 @@ READ: LD (.R_POINT),HL ;HL:DE FP (in sectors) ;BC FP residue (in bytes) ; - ;LD A,B OR C JP NZ,.ROV1 .ROV4: POP BC @@ -53,7 +40,7 @@ READ: LD (.R_POINT),HL LD (.SECTORH),HL LD (.SECTORL),DE .R_POINT+2: LD IX,0 - CALL BLOK_RD + CALL BLOCK_READ JP C,.ERR_1 LD DE,(.R_POINT) .PointerOnBuffer+1: @@ -84,7 +71,7 @@ READ: LD (.R_POINT),HL PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B @@ -109,7 +96,8 @@ READ: LD (.R_POINT),HL .NOREAD: .COD+1: LD A,0 OR A - RET + RET + ; .ROV1: PUSH BC PUSH HL PUSH DE @@ -119,39 +107,41 @@ READ: LD (.R_POINT),HL PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B POP HL JP C,.ERR_3 + ; inc HL:DE LD BC,1 ADD HL,BC EX DE,HL POP HL LD C,B ADC HL,BC + ; EXX - POP DE - LD HL,512 ;!HARDCODE - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.ROV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? -.ROV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - LDIR - LD (.R_POINT),DE + POP DE + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.ROV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? +.ROV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + LDIR + LD (.R_POINT),DE EXX JP .ROV4 .ERR_3: POP HL @@ -170,24 +160,24 @@ TSTSIZE: ADD HL,DE ; EXX - ;LD DE,0 ;!TEST - LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH - LD H,(IY+_sFM.F_POSITION+3) - ;!TEST - JR NC,.no_inc_hl - INC HL - ;ADC HL,DE - ; + ;LD DE,0 ;!TEST + LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH + LD H,(IY+_sFM.F_POSITION+3) + ;!TEST + JR NC,.no_inc_hl + INC HL + ;ADC HL,DE + ; .no_inc_hl: EXX ;HL':HL - NEW FP ; - LD C,(IY+_sFM.F_SIZE) - LD B,(IY+_sFM.F_SIZE+1) ;SIZE LOW + LD C,(IY+_sFM.FS_REC.F_SIZE) + LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW AND A SBC HL,BC EXX - LD C,(IY+_sFM.F_SIZE+2) ;SIZE HIGH - LD B,(IY+_sFM.F_SIZE+3) + LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH + LD B,(IY+_sFM.FS_REC.F_SIZE+3) SBC HL,BC EXX RET C ;OK READ ALL diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index d3ee43a..09dd1f5 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -37,68 +37,76 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 CALL LOADDIR CALL SEARCH.Dir RET C - LD HL,(HANDBUF+_sFM.ST_CLUSTER) + ; [ ] fat32 + LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) PUSH IX .RMD17: PUSH HL CALL NSECTOR LD A,(CORE_BUFFERS.BootSector.S_P_C) -.RMD12: PUSH AF + ; начинаем вычитывать содержимое каталога посекторно +.read_dir_loop: + PUSH AF 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 A,(FatBuffer.DRIVE) RST ToDSS.DRV - POP AF OUT (SLOT3),A - - LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + ; + ;!HARDCODE 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора + LD B,16 LD HL,CORE_BUFFERS.SECBUF -.RMD10: LD A,(HL) +.check_dir_loop: + LD A,(HL) OR A - JP Z,.RMD15 ;DIR EMPTY + JP Z,.RMD15 ;DIR EMPTY CP "." - JR Z,.RMD14 - CP #E5 ;!HARDCODE байт удаления файла - JR Z,.RMD14 - LD DE,11 ;!HARDCODE смещ. до байта атрибутов + JR Z,.next_record + CP #E5 ;!HARDCODE байт удаления файла + JR Z,.next_record + LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов ADD HL,DE LD A,(HL) SBC HL,DE - ;BIT 3,A - AND %0000'1000 + AND FAT_ATTR.VOLUME_ID JP Z,.error ;DIR NOT EMPTY -.RMD14: LD DE,#0020 +.next_record: + LD DE,#0020 ADD HL,DE - DJNZ .RMD10 - + DJNZ .check_dir_loop + ; POP IX POP HL INC IX LD A,XH OR XL - JR NZ,.RMD11 + JR NZ,.no_inc_hl INC HL -.RMD11: POP AF +.no_inc_hl: + POP AF DEC A - JR NZ,.RMD12 + JR NZ,.read_dir_loop + ; POP HL ; номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера JR NC,.RMD17 ; не конец цепочки -.RMD18: POP IX +.delete: + POP IX JP DEL_FN.DELETE ; пометить запись как "удаленная" .RMD15: POP IX POP HL POP AF POP HL - JR .RMD18 + JR .delete + ; .error: POP IX POP HL POP AF diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index 3f2fca4..39b4371 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -25,6 +25,12 @@ SCANDRV: LD A,Dss.DRV.RescanDRV LD C,Dss.DRV.RescanDRV RST ToDSS.DRV + ; проверка на ошибку boot disk lost + LD HL,.BOOT_DSK_LOST + LD E, +(80-.BOOT_DSK_LOST.size)/2 ; coord X + LD BC,.BOOT_DSK_LOST.size + JP C,KERNEL_PANIC + ; LD (LDRIVE),A ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 4. на всякий случай перечитываем дирректорию @@ -47,6 +53,10 @@ SCANDRV: RET PO EI RET + ; +.BOOT_DSK_LOST: + DZ "Boot drive lost o_O" +.BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ;/////////////////////////////////////////////////////////////////////// ; \ No newline at end of file diff --git a/DSS/API/SetDateTime.asm b/DSS/API/SetDateTime.asm index c95ae82..4da4a74 100644 --- a/DSS/API/SetDateTime.asm +++ b/DSS/API/SetDateTime.asm @@ -20,11 +20,11 @@ PUT_D_T: POP BC POP DE RET C - LD (IY+_sFM.TIME),E - LD (IY+_sFM.TIME+1),D - LD (IY+_sFM.DATE),C - LD (IY+_sFM.DATE+1),B - SET 7,(IY+_sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла + LD (IY + _sFM.FS_REC.TIME),E + LD (IY + _sFM.FS_REC.TIME+1),D + LD (IY + _sFM.FS_REC.DATE),C + LD (IY + _sFM.FS_REC.DATE+1),B + SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла AND A RET ; \ No newline at end of file diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index c8eb8db..05e4434 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -15,12 +15,12 @@ WRITE.RD_ONLY: ; HL - ADDRESS ; DE - SIZE ; A - FM -WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WR_FAT +WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF LD A,(FatCache.Update) OR A - CALL NZ,WR_FAT ; подкл. банку кеша FAT и записать его на диск + CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF RET ; @@ -32,9 +32,9 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] LD A,(IY+_sFM.ACCESS_MODE) AND FAT_ATTR.READ_ONLY JR NZ,.RD_ONLY - SET 7,(IY+_sFM.ACCESS_MODE) - SET 5,(IY+_sFM.ATTRIBUT) - LD A,(IY+_sFM.DRIVE) + SET 7,(IY + _sFM.ACCESS_MODE) + SET 5,(IY + _sFM.FS_REC.ATTRIBUT) + LD A,(IY + _sFM.DRIVE) CALL OPENDSK JR C,.ERR1 ; @@ -96,7 +96,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B @@ -134,14 +134,14 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] POP DE RET NC ; Если размер файла на диске НЕ стал больше, чем был ; Если размер файла на диске стал больше, чем был - LD L,(IY+_sFM.F_POSITION+0) - LD H,(IY+_sFM.F_POSITION+1) - LD C,(IY+_sFM.F_POSITION+2) - LD B,(IY+_sFM.F_POSITION+3) - LD (IY+_sFM.F_SIZE+0),L - LD (IY+_sFM.F_SIZE+1),H - LD (IY+_sFM.F_SIZE+2),C - LD (IY+_sFM.F_SIZE+3),B + LD L,(IY + _sFM.F_POSITION+0) + LD H,(IY + _sFM.F_POSITION+1) + LD C,(IY + _sFM.F_POSITION+2) + LD B,(IY + _sFM.F_POSITION+3) + LD (IY + _sFM.FS_REC.F_SIZE+0),L + LD (IY + _sFM.FS_REC.F_SIZE+1),H + LD (IY + _sFM.FS_REC.F_SIZE+2),C + LD (IY + _sFM.FS_REC.F_SIZE+3),B AND A RET ; @@ -154,35 +154,35 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] PUSH AF IN A,(SLOT0) OUT (SLOT3),A - CALL BLOK_RD + CALL BLOCK_READ POP BC LD C,SLOT3 OUT (C),B POP DE POP HL EXX - POP DE - JP C,.ERR1 - LD HL,512 ;!HARDCODE - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.WOV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 -.WOV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - EX DE,HL - LDIR - LD (.R_POINT),HL + POP DE + JP C,.ERR1 + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.WOV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +.WOV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + EX DE,HL + LDIR + LD (.R_POINT),HL EXX PUSH HL PUSH DE diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index ea36f1c..aa61bc3 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -57,15 +57,15 @@ DISKINF:; [ ] 22/11/23 ; EX DE,HL LD HL,CORE_BUFFERS.BootSector.ID_FAT - LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length + LD A,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER - LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER + LD A,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_LABEL - LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL + LD A,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; PUSH DE @@ -113,16 +113,14 @@ DISKINF:; [ ] 22/11/23 RET C ; .CheckFreeSpace: - ; XOR A OR B CALL NZ,.CURRDS ; - ; -.FRESP2: + ;.FRESP2: LD D,B LD E,C - LD HL,(FAT_Max_Cluster) + LD HL,(FAT_Max_Cluster_L) DEC HL LD BC,(CORE_BUFFERS.BootSector.B_P_S) LD A,(CORE_BUFFERS.BootSector.S_P_C) @@ -133,7 +131,7 @@ DISKINF:; [ ] 22/11/23 LD HL,2 LD BC,0 .FRESP: PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT POP BC CP DSS_Error.sys.DISK_FULL RET Z diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 82d57b4..cc12620 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -43,7 +43,7 @@ FM_BUF: _sFM ; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND - CP FMCOUNT + CP FMCOUNT+1 JR NC,ABS_FM PUSH DE @@ -75,7 +75,7 @@ RES_FM: _mFM_FIND SCF RET Z XOR A - LD (IY+0),A + LD (IY + _sFM.FS_REC.NAME),A RET ; GET_FM: LD B,FMCOUNT @@ -84,7 +84,7 @@ GET_FM: LD B,FMCOUNT LD DE,CORE_BUFFERS.FM_BUF.Size .loop: ADD IY,DE INC C - LD A,(IY+0) + LD A,(IY + _sFM.FS_REC.NAME) OR A RET Z DJNZ .loop @@ -138,10 +138,10 @@ MOVE_FP: LD E,B JP .DO ;from End File -.B_end: LD C,(IY+_sFM.F_SIZE) - LD B,(IY+_sFM.F_SIZE+1) - LD E,(IY+_sFM.F_SIZE+2) - LD D,(IY+_sFM.F_SIZE+3) +.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) + LD B,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.FS_REC.F_SIZE+2) + LD D,(IY + _sFM.FS_REC.F_SIZE+3) JP .DO ;from Current Position .F_current: @@ -164,16 +164,16 @@ MOVE_FP: ; CY - FILE POINTER > SIZE ; NC - FILE POINTER < SIZE MOVE_CP: - LD L,(IY+_sFM.F_SIZE) - LD H,(IY+_sFM.F_SIZE+1) - LD E,(IY+_sFM.F_POSITION) - LD D,(IY+_sFM.F_POSITION+1) + LD L,(IY + _sFM.FS_REC.F_SIZE) + LD H,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.F_POSITION) + LD D,(IY + _sFM.F_POSITION+1) AND A SBC HL,DE - LD L,(IY+_sFM.F_SIZE+2) - LD H,(IY+_sFM.F_SIZE+3) - LD E,(IY+_sFM.F_POSITION+2) - LD D,(IY+_sFM.F_POSITION+3) + LD L,(IY + _sFM.FS_REC.F_SIZE+2) + LD H,(IY + _sFM.FS_REC.F_SIZE+3) + LD E,(IY + _sFM.F_POSITION+2) + LD D,(IY + _sFM.F_POSITION+3) SBC HL,DE RET ; \ No newline at end of file diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index f0620a1..ddabfbe 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -216,24 +216,19 @@ OPENDSK:;!TEST DRV.Open POP BC JP C,.error ;[ ] 29/02/2024 fix "open drive error" - IF TEST_FEATURE LD A,(FatBuffer.DRIVE) LD D,A PUSH DE - ENDIF ; LD A,B LD (FatBuffer.DRIVE),A ; CALL RD_BPB ;[ ] 29/02/2024 fix "open drive error" - IF TEST_FEATURE POP DE LD A,D JR C,.error_disk - ELSE - RET C - ENDIF + ; RET C ; .exit: LD A,(LDRIVE) AND A @@ -244,19 +239,28 @@ OPENDSK:;!TEST DRV.Open LD A,DSS_Error.sys.NOT_READY RET ;[ ] 29/02/2024 fix "open drive error" - IF TEST_FEATURE .error_disk: CALL OPENDSK.force + LD A,(BOOTDSK.NUM) + CALL C,OPENDSK.force + ; проверка на ошибку + LD HL,.NOT_READY + LD E, +(80-.NOT_READY.size)/2 ; coord X + LD BC,.NOT_READY.size + JP C,KERNEL_PANIC + ; LD A,DSS_Error.sys.NOT_READY SCF RET - ENDIF + ; +.NOT_READY: DZ "Boot drive not ready..." +.NOT_READY.size EQU $-.NOT_READY ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; -OPENDIR:;!TEST ;[x] some optimize +OPENDIR:;[x] some optimizations ;XOR A ;CALL SET_FM LD IY,CORE_BUFFERS.FM_BUF @@ -266,11 +270,12 @@ OPENDIR:;!TEST ;[x] some optimize JR NZ,.SUBDIR .REROOT1: LD DE,0 - ;!TEST ;[x] some optimize - ;LD (IY+_sFM.ST_CLUSTER),E - ;LD (IY+_sFM.ST_CLUSTER+1),D + ;[x] some optimizations + ;LD (IY+_sFM.FIRST_CLUSTER_L),E + ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D + ; [ ] fat32 EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL EX DE,HL ; CALL LOADDIR @@ -284,11 +289,12 @@ OPENDIR:;!TEST ;[x] some optimize .SUBDIR: CP "." JR NZ,.SUBDIR2 - ;!TEST ;[x] some optimize - ;LD A,(IY+_sFM.ST_CLUSTER) ;R005 - LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R005 + ;!TEST ;[x] some optimizations + ;LD A,(IY+_sFM.FIRST_CLUSTER_L) ;R005 + ; [ ] fat32 + LD A,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 ; - OR (IY+_sFM.ST_CLUSTER+1) ;R005 + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) ;R005 JR NZ,.SUDI1 ;R005 INC HL ;R005 LD A,(HL) ;R005 @@ -314,16 +320,16 @@ OPENDIR:;!TEST ;[x] some optimize .SUBDIR3: CALL FINDDIR RET C - ;!TEST ;[x] some optimize - ;LD (IY+_sFM.ST_CLUSTER),E - ;LD (IY+_sFM.ST_CLUSTER+1),D + ;!TEST ;[x] some optimizations + ;LD (IY+_sFM.FIRST_CLUSTER_L),E + ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D ;LD DE,#4000 ;!HARDCODE ;LD (IY+_sFM.F_SIZE),E ;LD (IY+_sFM.F_SIZE+1),D EX DE,HL - LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32 LD HL,#4000 ;!HARDCODE - LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL + LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL EX DE,HL ; JP LOADDIR @@ -335,7 +341,6 @@ OPENDIR:;!TEST ;[x] some optimize ;----------------------------------------------------------------------; -; .custom: ; Преобразовать имя 8.3 -> 11 формат ; вход: hl = 8.3 имя ; de = буфер имени 11 симв. формата diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index a0337ac..fdef6fc 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -232,33 +232,9 @@ PORTAL.out_MAIN: ; ; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; ; -/* - STRUCT _sBOOT_SEC -.JMP: BLOCK 3,0 ; +#00 "JMP" -.ID_NAME: TEXT 8,{"DSS_1.7","0"} ; +#03 DOS NAME - DB "DSS_1.70" -; Block Parameters BIOS -.B_P_S: WORD #200 ; +#0B BYTE PER SECTOR -.S_P_C: BYTE 2 ; +#0D SECTORS PER CLUSTER -.RESERVE: WORD 1 ; +#0E RESERVE SECTORS -.FAT_NUM: BYTE 2 ; +#10 AMOUNT FATS -.F_P_DIR: WORD 112 ; +#11 FILES IN DIRECTORY -.S_P_D: WORD 1440 ; +#13 ALL SECTORS ON DISK -.ID_FORM: BYTE #F0 ; +#15 ID FORMAT -.S_P_F: WORD 2 ; +#16 SIZE FAT IN SECTORS -.S_P_T: WORD 9 ; +#18 SECTOR PER TRACK -.HEADS: WORD 2 ; +#1A AMOUNT SIDES -.HIDDEN: DWORD 0 ; +#1C HIDDEN SECTORS -.BPB_BIG_TOTAL_SECTORS: DWORD 0 ; +#20 BIG TOTAL SECTOR -.BPB_PHISICAL_DRIVE_NUMBER: WORD #80 ; +#24 PHISICAL DRIVE NUMBER -.BPB_EXT_BOOT_RECORD_SIGNATURE: BYTE #29 ; +#26 EXTENDED BOOT RECORD SIGNATURE -.BPB_SERIAL_NUMBER: DWORD 0 ; +#27 VOLUME SERIAL NUMBER -.BPB_LABEL: TEXT 11,{"NO NAME"," "} ; +#2B DISK LABEL -.ID_FAT: TEXT 8,{"FAT16"," "} ; +#36 FILE SYSTEM ID ( BPB_FS_ID ) - ENDS -*/ ;R01 ; Area for boot sector BootSector. -;BootSector _sBOOT_SEC ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" } +;BootSector _sBOOT_SECTOR_PARAMS ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" } ; end boot sector ;R01 @@ -451,7 +427,7 @@ ADRST10: ;DS 512 ;,0 INCLUDE "EXECUTE.ASM" INCLUDE "INTMOUSE.ASM" INCLUDE "Procedures.asm" - + INCLUDE "Kernel_Panic.asm" ;!FIXIT к буферам ; Массив лог. номеров банок расширения DSS @@ -486,15 +462,15 @@ WorkDirectory: DB '\' CLEAR_ZONE.start EQU $ MODULE CORE_BUFFERS -BUFFERSplace _sBuffers=$ -FM_BUF _sFM = BUFFERSplace.FileManipulator -.Size EQU _sFM -.FullSize EQU FMCOUNT*FM_BUF.Size -BootSector _sBOOT_SEC = BUFFERSplace.BootSector -EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header -XSTACK EQU BUFFERSplace.Stack.SPoint -BUFFER EQU BUFFERSplace.Buffer -SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER +BUFFERSplace _sBuffers=$ +FM_BUF _sFM = BUFFERSplace.FileManipulator +.Size EQU _sFM +.FullSize EQU FMCOUNT*FM_BUF.Size +BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector +EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header +XSTACK EQU BUFFERSplace.Stack.SPoint +BUFFER EQU BUFFERSplace.Buffer +SECBUF EQU BUFFER ;!TODO отделить SECBUF от BUFFER ENDMODULE CLEAR_ZONE.size EQU _sBuffers diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index 618662b..61320d6 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -151,20 +151,20 @@ PATH_PR EQU 2 ;%00000100 EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 -EX_PATH: EXX - LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер - LD (NM_PATH),HL - LD HL,NM_NAME_A - LD (NM_NAME),HL - LD HL,NM_EXTN_A - LD (NM_EXTN),HL - LD HL,NM_DRIVE_A - LD (NM_DRIVE),HL +EX_PATH: + EXX + LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер + LD (NM_PATH),HL + LD HL,NM_NAME_A + LD (NM_NAME),HL + LD HL,NM_EXTN_A + LD (NM_EXTN),HL + LD HL,NM_DRIVE_A + LD (NM_DRIVE),HL EXX INC B DEC B - ;JR Z,EX_GET_ALL - JR Z,EX_FULL ;0 ; разобрать строку + JR Z,EX_FULL ;0 ; разобрать строку DEC B JR Z,EX_GET_DRIVE ;1 ; выделить имя диска DEC B @@ -222,10 +222,6 @@ EX_GET_TYPE LD (NM_EXTN),DE JR EX_FULL -; Разобрать строку -; EX_GET_ALL -; JR EX_FULL - ; Выделить диск, путь, файл и расш. EX_GET_ALL_EX: EX DE,HL @@ -253,15 +249,15 @@ EX_GET_ALL_EX: ; Разобрать строку EX_FULL: EX AF,AF' EXX - XOR A - LD HL,(NM_PATH) - LD (HL),A - LD HL,(NM_NAME) ; адрес буфера под имя файла - LD (HL),A - LD HL,(NM_EXTN) - LD (HL),A - LD HL,(NM_DRIVE) - LD (HL),A + XOR A + LD HL,(NM_PATH) + LD (HL),A + LD HL,(NM_NAME) ; адрес буфера под имя файла + LD (HL),A + LD HL,(NM_EXTN) + LD (HL),A + LD HL,(NM_DRIVE) + LD (HL),A EXX EX AF,AF' EX_PAT0: LD DE,TMPBUF @@ -1070,21 +1066,21 @@ _TST_PROC: JP C,ERREXE0 LD (EXE_MEM),A EXX - POP DE ;снимаем со стека адрес возврата - LD HL,#0000 - ADD HL,SP - LD SP,(EXSTACK) - PUSH HL - PUSH DE - IN A,(SLOT3) - LD D,A - IN A,(SLOT2) - LD E,A - IN A,(SLOT1) - PUSH DE - PUSH AF - LD (EXSTACK),SP - LD SP,HL + POP DE ;снимаем со стека адрес возврата + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(SLOT3) + LD D,A + IN A,(SLOT2) + LD E,A + IN A,(SLOT1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL EXX ; НЕ СОХРАНЯЕТСЯ DE перед вызовом BIOS, а биос пока его и не портит LD A,(EXE_MEM) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 26dd741..6671bd4 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -11,8 +11,8 @@ ;----------------------------------------------------------------------; ; Поиск записи каталога в списке каталога ; -; вход: a=атрибут записи -; выход: de'=индекс записи в списке каталога +; вход: a = атрибут записи +; выход: de = индекс записи в списке каталога ; (HANDBUF) = file's direcory record ; CF - каталог не найден SEARCH: @@ -63,21 +63,23 @@ SEARCH: INC HL INC DE DJNZ .loop_compare + ; + LD D,XH + LD E,XL ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится вернуть) + EXX ; LD D,XH ; LD E,XL - LD D,XH - LD E,XL - EXX - LD D,XH - LD E,XL + PUSH IX EXX ; LD HL,HANDBUF EX DE,HL LD BC,HANDBUF.SIZE LDIR - ;POP AF + ;[x] 9/11/23 оптимизация для индекса записи в списке каталога (возможно понадобится удалить) + POP DE + ; EX AF,AF' OUT (SLOT3),A EX AF,AF' @@ -174,13 +176,13 @@ FINDDIR: PUSH AF LD IX,DIRPAGE.buffer .big_loop: - LD A,(IX+00) + LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error CP #E5 JR Z,.next_step - LD A,(IX+11) ;!HARDCODE - AND #10 ;!HARDCODE + LD A,(IX + _sFAT_DIRECTORY_RECORD.ATTRIBUT) + AND FAT_ATTR.DIRECTORY JR Z,.next_step LD HL,MASKARE LD D,XH @@ -197,10 +199,10 @@ FINDDIR: INC DE DJNZ .loop ; - LD A,(IX+0) + LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME) CP "." JP NZ,.ADDSPEC - LD A,(IX+1) ;!HARDCODE + LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME + 1) CP "." JP NZ,.IT_DIR LD HL,WorkDirectory @@ -287,9 +289,9 @@ FINDDIR: ; .MM3: LD (HL),0 ; ; JP IT_DIR ; -.IT_DIR: - LD E,(IX+_sFM.ST_CLUSTER) - LD D,(IX+_sFM.ST_CLUSTER+1) +.IT_DIR: ; [ ] fat32 + LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) + LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) POP AF OUT (SLOT3),A AND A @@ -331,25 +333,20 @@ LOADDIR: PUSH AF ;!TEST no ldir ; очистить кеш каталога - ; LD HL,#C000 - ; LD DE,#C001 - ; LD BC,#3FFF - ; LD (HL),L - ; LDIR + ; LD HL,#C000 + ; LD DE,#C001 + ; LD BC,#3FFF + ; LD (HL),L + ; LDIR ; - ; LD A,(FatBuffer.DRIVE) ; номер диска LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор - ; - ;LD D,(IY+_sFM.ST_CLUSTER+1) ; de=номер первого кластера - ;LD E,(IY+_sFM.ST_CLUSTER) - ;LD A,D - ;OR E - ; номер первого кластера - LD A,(IY+_sFM.ST_CLUSTER) - OR (IY+_sFM.ST_CLUSTER+1) - ; + ; номер первого кластера + ; [ ] fat32 + LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) JP Z,.LROTDIR ; root ?? + ; LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько XOR A ; дескриптор @@ -362,17 +359,10 @@ LOADDIR: LD HL,(FatBuffer.DIR_FRH) ; ст. разряд LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора LD A,(FatBuffer.DIR_S_S) - ;!TEST - LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога - CP B - JR NC,.RTD1 - LD B,A ; число секторов - ;LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога - ;SUB B - ;JR NC,.RTD1 - ;ADD A,B - ;LD B,A ; число секторов - ; + LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога + CP B + JR NC,.RTD1 + LD B,A ; число секторов .RTD1: LD A,(FatBuffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов @@ -453,13 +443,15 @@ SAVEDIR: ; LD A,(FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A - LD D,(IY+_sFM.ST_CLUSTER) - LD E,(IY+_sFM.ST_CLUSTER+1) + ;[ ] fat32 + LD D,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + LD E,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,D OR E JP Z,.SROTDIR LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory +;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) .DIRSIZE+1: LD DE,0 XOR A @@ -489,23 +481,21 @@ SAVEDIR: ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ; !FIXIT чёт не используется - IF COMPILE_UNUSED_CODE -TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open - LD A,(FatBuffer.DRIVE) - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - OR A - RET Z - ENDIF + ; не используется +; TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open +; LD A,(FatBuffer.DRIVE) +; LD C,Dss.DRV.MediaCheck +; RST ToDSS.DRV +; OR A +; RET Z + ; рег. D - номер диска RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC - IN A,(SLOT0) OUT (SLOT3),A - LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE + LD A,(FatBuffer.DRIVE) ;R08 ;LD DE,BOOT+#C000 LD DE,CORE_BUFFERS.SECBUF+#C000 @@ -519,7 +509,7 @@ RD_BPB: LD C,SLOT3 //PUSH IY ; пока без индексного, но может пригодиться LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07 + LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 ;R05 AND A SBC HL,DE @@ -527,38 +517,38 @@ RD_BPB: LD C,SLOT3 ;R08 LD HL,CORE_BUFFERS.SECBUF LD DE,CORE_BUFFERS.BootSector - LD BC,_sBOOT_SEC ; size + LD BC,_sBOOT_SECTOR_PARAMS ; size LDIR ; //LD IY,BootSector ; пока без индексного, но может пригодиться - //LD A,(IY+_sBOOT_SEC.ID_FORM) - LD A,(CORE_BUFFERS.BootSector.ID_FORM) + //LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) CP #F0 JP C,DOS_X_Error.UnknownBPB ;!TEST ;LD HL,0 ; calc. first sector FAT - ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - ;LD D,(IY+_sBOOT_SEC.RESERVE+1) + ;LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + ;LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) ;ADD HL,DE - //LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec - //LD H,(IY+_sBOOT_SEC.RESERVE+1) - LD HL,(CORE_BUFFERS.BootSector.RESERVE) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + //LD H,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) + LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS) ; - ; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec - ; LD D,(IY+_sBOOT_SEC.HIDDEN+1) + ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec + ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; ADD HL,DE ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 LD (FatBuffer.FAT2_XX),HL - //LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT - //LD D,(IY+_sBOOT_SEC.S_P_F+1) + //LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ; sectors in FAT + //LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1) LD DE,(CORE_BUFFERS.BootSector.S_P_F) @@ -577,8 +567,8 @@ RD_BPB: LD C,SLOT3 AND A ; CF = 0 - //LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors - //LD B,(IY+_sBOOT_SEC.B_P_S+1) + //LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sectors + //LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) LD BC,(CORE_BUFFERS.BootSector.B_P_S) ; RL C ; RL B @@ -591,19 +581,23 @@ RD_BPB: LD C,SLOT3 ; LD A,C ;;;; LD A,B + ; RL C RLA + ; RL C RLA + ; RL C RLA + ; LD C,A LD B,0 ; BC - File handels in sectors ;;;; LD (FatBuffer.F_P_S),A - //LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel - //LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + //LD E,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ; Number file handel + //LD D,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1) LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) EX DE,HL @@ -628,19 +622,19 @@ RD_BPB: LD C,SLOT3 ;LD H,B ; тут в B ноль должен быть ;LD L,B - ;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector - ;LD B,(IY+_sBOOT_SEC.B_P_S+1) + ;LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector + ;LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) - //LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector - //LD H,(IY+_sBOOT_SEC.B_P_S+1) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector + //LD H,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize + LD A,(CORE_BUFFERS.BootSector.S_P_C) + ;!TODO FATcacheSize ;NEXTAD3 ; .loop3: ADD HL,BC ; calc. cluster size ; DEC A ; JR NZ,.loop3 - ;!TODO проверить правильно ли считает XOR 1 ; calc. cluster size JR Z,.loop3.end RRA @@ -649,7 +643,6 @@ RD_BPB: LD C,SLOT3 JP NC,.loop3 .loop3.end: ; - LD (FatBuffer.CLU_LEN),HL EX DE,HL LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize @@ -663,6 +656,12 @@ RD_BPB: LD C,SLOT3 ;ENDIF //////////////////////////////////////////////////////////////////////// +;!TODO detect fat type by clusters! + ;[ ] fat32 reset fat32 variables + LD HL,0 + LD (FatBuffer.ENDCLUS_HIGH),HL + LD (FAT_Max_Cluster_H),HL + ; LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага LD DE,FatBuffer.MSG LD B,3 @@ -678,10 +677,25 @@ RD_BPB: LD C,SLOT3 INC HL CP ' ' JR Z,.loop6 - + ; CP '1' - JP NZ,DOS_X_Error.UnknownBPB - LD A,(HL) + IF _FAT32_ENABLE + JP Z,.fat1x + ;[ ] fat32 + CP '2' + JP NZ,DOS_X_Error.UnknownBPB + LD A,#46 ; #46-#26 = 32 fat type + LD HL,#0FFF + LD (FatBuffer.ENDCLUS_HIGH),HL + LD (FAT_Max_Cluster_H),HL + LD H,#FF + JR .BPB_FAT + ; + ELSE + JP NZ,DOS_X_Error.UnknownBPB + ENDIF + ; +.fat1x: LD A,(HL) CP '6' ; FAT16 LD HL,#FFFF JR Z,.BPB_FAT @@ -689,8 +703,9 @@ RD_BPB: LD C,SLOT3 JP NZ,DOS_X_Error.UnknownBPB LD HL,#0FFF .BPB_FAT: - LD (FatBuffer.FAT_TYP),A - LD (FatBuffer.ENDCLUS),HL + SUB #26 ; A-#26 = fat type (12, 16, 32) + LD (FatBuffer.FAT_TYPE),A + LD (FatBuffer.ENDCLUS_LOW),HL ;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer //////////////////////////////////////////////////////////////////////// @@ -698,8 +713,8 @@ RD_BPB: LD C,SLOT3 LD HL,0 - //LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track - //LD B,(IY+_sBOOT_SEC.S_P_T+1) + //LD C,(IY+_sBOOT_SECTOR_PARAMS.S_P_T) ; Sector per track + //LD B,(IY+_sBOOT_SECTOR_PARAMS.S_P_T+1) LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!! а если IY используется для переменного BootSector, то будет бага @@ -712,28 +727,27 @@ RD_BPB: LD C,SLOT3 //////////////////////////////////////////////////////////////////////// LD DE,(FatBuffer.DAT_FRL) -; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec -; LD D,(IY+_sBOOT_SEC.HIDDEN+1) +; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec +; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; AND A ; SBC HL,DE ; EX DE,HL - //LD L,(IY+_sBOOT_SEC.S_P_D) - //LD H,(IY+_sBOOT_SEC.S_P_D+1) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.S_P_D) + //LD H,(IY+_sBOOT_SECTOR_PARAMS.S_P_D+1) LD HL,(CORE_BUFFERS.BootSector.S_P_D) LD A,H OR L JP NZ,.HDDSMAL ; - //LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) - //LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) - LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS) - - //LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) - //LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) - LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2) + //LD L,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS) + //LD H,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+1) + LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_L) + //LD C,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+2) + //LD B,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+3) + LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_H) AND A SBC HL,DE JP NC,.HDDBIG @@ -753,45 +767,37 @@ RD_BPB: LD C,SLOT3 RR L JP .S4C01 .S4C02: INC HL - LD (FAT_Max_Cluster),HL + LD (FAT_Max_Cluster_L),HL //POP IY -; LD DE,FAT -; LD HL,0 -; LD IX,(FAT_FRM) -; LD B,3 -; LD A,(DRIVE) -; LD C,Dss.DRV.Read -; RST ToDSS.DRV -; JP C,RDERR1 - LD HL,0 - LD (FatCache),HL + XOR A + LD H,A + LD L,A + LD (FatCache.Block),HL + LD (FatCache.Update),A SET_PAGE_X FATPAGE PUSH AF XOR A - CALL READ_FAT + 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.BootSector.ID_FORM) + LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) CP #F0 JR C,DOS_X_Error.UnknownBPB -;????? надо ли изменить? -// OR 2 -// CP #FA ; ID ram-диска - CP #F8 ; а если не F8? -;????? + ; ID ram-диска - #FA + CP #F8 ; !FIXIT не обязательно если винт, то не FAT12 LD A,'6' LD HL,#FFFF JP Z,.BPB_FAT - + ; LD A,'2' LD HL,#0FFF JP .BPB_FAT @@ -813,7 +819,8 @@ FatBuffer: .MSG: DB 'FAT' .READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) .BLOCK: DB #00 -.DIR_CLU: DW #0000 +.DIR_CLU_L: DW #0000 +.DIR_CLU_H: DW #0000 ; fat32 .DRIVE: DB #FF .FAT_FRM: .FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT @@ -823,15 +830,19 @@ FatBuffer: .F_P_S: DB #00 ; число файловых записей в секторе .DIR_S_S: DB #00 ; DIR_SEC_SIZE .DAT_FRL: DW #0000 ; MSD_DAT_SEC low -;.DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ;!FIXIT не используется .CLU_LEN: .B_P_C: DW #0000 ; CLUSTER_LEN .C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ;!TODO fat32 .S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? -.ENDCLUS: DW #FFFF +.ENDCLUS_LOW: DW #FFFF +.ENDCLUS_HIGH: DW #FFFF ; !TODO for fat32 ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; INCLUDE "FAT12_16.ASM" + IF _FAT32_ENABLE + INCLUDE "FAT32.ASM" + ENDIF ; \ No newline at end of file diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 0443740..e060a3c 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -14,15 +14,26 @@ ;--------------------------------------------------------------- ; Установить начальный кластер для чтения -R_CLUST LD HL,#0001 +; [ ] fat32 +R_CLUST: + LD HL,#0001 LD (G_CLUST.num),HL RET +.FAT32: WORD 0 ; найти первый свободный кластер +; [ ] fat32 G_CLUST: .num+1: LD HL,#0001 .loop: INC HL ; номер кластера - CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера + ; [x] fat32 + IF _FAT32_ENABLE + LD A,(FatBuffer.FAT_TYPE) + XOR 32 + CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER + ENDIF + ; + CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF RET Z ; ошибка ? @@ -30,10 +41,11 @@ G_CLUST: OR E JR NZ,.loop LD (G_CLUST.num),HL - XOR A + ; XOR A RET ; HL - CLUSTER +; [ ] fat32 INC_FAT: PUSH HL CALL G_CLUST @@ -41,22 +53,21 @@ INC_FAT: RET C ; PUSH HL - PUSH HL - EX DE,HL ; hl=номер кластера -.loop: CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера +; PUSH HL +; EX DE,HL ; hl=номер кластера +; .loop: CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера +; EX DE,HL +; JR NC,.loop ; не конец цепочки EX DE,HL - JR NC,.loop ; не конец цепочки - EX DE,HL - POP DE ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера +; POP DE ; номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера ;!FIXIT <нет контроля ошибки> ; - ; POP HL - LD DE,(FatBuffer.ENDCLUS) ; номер кластера - CALL W_T_FAT ; записать в кеш FAT-а номер кластера - ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WR_FAT? - ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера + CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ; AND A RET @@ -65,66 +76,74 @@ INC_FAT: ;----------------------------------------------------------- ; Прочитать из кеша FAT-а номер след. кластера ; вход: hl = номер кластера +; de = СТАРШЕЕ слово номера кластера (только для FAT32) ; выход: hl = номер кластера -; de = номер след. кластера +; de = номер след. кластера (если 0, то кластер hl свободен) ; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb ;----------------------------------------------------------- -R_F_FAT: - EX DE,HL - LD HL,(FAT_Max_Cluster) - AND A +;[ ] fat32 +READ_FROM_FAT: + ;[x] fat32 + PUSH DE + LD A,(FatBuffer.FAT_TYPE) + XOR 32 + JR NZ,.low ; Z=0 проверяем младшее слово номера кластера + LD HL,(FAT_Max_Cluster_H) ; проверяем старшее слово номера кластера + JP .high + ; +.low: EX DE,HL + LD HL,(FAT_Max_Cluster_L) +.high: ; CF = 0 SBC HL,DE EX DE,HL LD A,DSS_Error.sys.DISK_FULL + ;[x] fat32 + POP DE + ; RET C SET_PAGE_X FATPAGE PUSH HL PUSH AF - LD A,(FatBuffer.FAT_TYP) - CP "2" ; fat12 - JR Z,R_F_F12 + LD A,(FatBuffer.FAT_TYPE) + CP 16 ; fat16 + JR C,.FAT12 + JR NZ,.FAT32 ; fat16, просто читать след. номер -R_F_F16: - CALL GET_FAT16_CELL +.FAT16: CALL GET_FAT16_CELL LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) POP AF OUT (SLOT3),A - ;!TODO #FFF7 - кластер с косякчными секторами + ;!TODO #FFF7 - кластер с косячными секторами LD HL,#FFEF ;!HARDCODE XOR A ; DssErr.sys.NO_ERROR SBC HL,DE ; проверка на служ. кластеры POP HL RET ; -R_F_F12: - CALL GET_FAT12_CELL +.FAT12: CALL GET_FAT12_CELL LD E,(HL) INC HL LD D,(HL) - JR C,R_F_F01 + JR C,.Correct_1 LD A,D AND #0F LD D,A - JP R_F_F02 + JR .Correct_2 ; -R_F_F01: +.Correct_1: LD A,E AND #F0 - RR D ; вправо на 4 битa - RRA - RR D - RRA - RR D - RRA - RR D - RRA + DUP 4 ; вправо на 4 битa + RR D + RRA + EDUP LD E,A -R_F_F02: +.Correct_2: POP AF OUT (SLOT3),A LD HL,#0FEF @@ -132,20 +151,21 @@ R_F_F02: SBC HL,DE ; проверка на служ. кластеры POP HL RET - +.FAT32: ; [ ] fat32 + CALL GET_FAT32_CELL + DI + HALT ;----------------------------------------------------------- ; Записать в кеш FAT-а номер кластера -; вход: de = номер кластера -; hl = ? номер первого кластера -; выход: hl = ? номер след. кластера -; de = номер кластера -; in: HL - CLUSTER -; out: DE - (CLUSTER) +; вход: hl = номер кластера в который записать +; de = номер кластера который вписать +; выход: такой же как и вход ;----------------------------------------------------------- -W_T_FAT: +; [ ] fat32 +WRITE_TO_FAT: PUSH DE EX DE,HL - LD HL,(FAT_Max_Cluster) + LD HL,(FAT_Max_Cluster_L) AND A SBC HL,DE EX DE,HL @@ -161,30 +181,12 @@ W_T_FAT: ;LD A,1 ;LD (FatCache.Update),A ; - LD A,(FatBuffer.FAT_TYP) - CP "2" ; fat12 - JR Z,W_T_F12 -W_T_F16: - PUSH DE - ; 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) ;!HARDCODE fat16 - размер записи FAT - ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH - ; CP C - ; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT - ; LD DE,FATPAGE.cache - ; ADD HL,DE ; на ячейку FAT + LD A,(FatBuffer.FAT_TYPE) + CP 16 ; fat16 + JR C,.FAT12 + JR NZ,.FAT32 + ; +.FAT16: PUSH DE CALL GET_FAT16_CELL POP DE LD (HL),E ; сохр. в кеше FAT-а @@ -194,18 +196,17 @@ W_T_F16: POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,1 + XOR A + INC A LD (FatCache.Update),A - ; - XOR A + ; CF = 0 RET ; - ; fat12 -W_T_F12: ;!FIXIT переделать на переменные FAT_CACHE +.FAT12: ;!FIXIT переделать на переменные FAT_CACHE PUSH DE CALL GET_FAT12_CELL POP DE - JR C,W_T_F01 ; номер нечётный + JR C,.Correct_1 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -216,30 +217,19 @@ W_T_F12: ;!FIXIT POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,1 + XOR A + INC A LD (FatCache.Update),A - ; - AND A + ; CF = 0 RET - ; -W_T_F01:; влево на 4 битa - ;SLA E - ;LD A,E - ;RL D - ;RLA - ;RL D - ;RLA - ;RL D - ;RLA - ;RL D - ;LD E,A - ; - ex de,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl - ex de,hl +.Correct_1: + ; влево на 4 битa + EX DE,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL ; LD A,(HL) AND #0F @@ -251,26 +241,34 @@ W_T_F01:; POP HL OUT (SLOT3),A ; [x] 2/12/23 FAT не всегда мог записаться на HDD - LD A,1 + XOR A + INC A LD (FatCache.Update),A - ; - AND A - RET + ; LD A,1 + ; LD (FatCache.Update),A + ; AND A + ; CF = 0 + RET +.FAT32: ; [ ] fat32 + DI + HALT ;RX01 ;RE_FAT: ; Прочитать в кеш 16 секторов FAT-а ; A - NEW FAT BLOCK -READ_FAT: +READ_FAT_TABLE: PUSH HL PUSH AF LD A,(FatCache.Update) OR A - CALL NZ,WR_FAT.Start + CALL NZ,WRITE_FAT_TABLE.Start POP AF LD L,A - LD H,0 - LD (FatCache),HL + XOR A + LD H,A ;!FIXIT fat32 - у фат32 блоков может быть валом + LD (FatCache.Block),HL + LD (FatCache.Update),A ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 @@ -284,7 +282,7 @@ READ_FAT: ;LD IX,0 ;ADD IX,DE ; номер лог. сектора ; - LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32 + LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE @@ -293,15 +291,17 @@ READ_FAT: RET ; Подключить банку кеша FAT и записать его на диск -WR_FAT: SET_PAGE_X FATPAGE +WRITE_FAT_TABLE: + SET_PAGE_X FATPAGE PUSH AF CALL .Start ;!TODO нет контроля ошибок POP AF OUT (SLOT3),A RET - ; Запись кеша (всего?) FAT-а на диск -.Start: LD HL,(FatCache) - LD H,0 + ; Запись кеша FAT-а на диск +.Start: LD HL,(FatCache.Block) + ; + ;LD H,0 ;FAT BLOCK * 16 = SECTOR OF FAT DUP FAT_CACHE.Degree_16 ADD HL,HL ;x2 @@ -348,14 +348,17 @@ WR_FAT: SET_PAGE_X FATPAGE LD DE,(FatBuffer.FAT2_XX) ADD HL,DE EX DE,HL + LD XH,D + LD XL,E ; - LD XH,D - LD XL,E - ;LD IX,0 - ;ADD IX,DE ; номер лог. сектора + LD HL,0 + ; CF = ADD HL,DE + ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? + IF _FAT32_ENABLE + RL L + ENDIF ; LD DE,FATPAGE.cache - LD HL,0 LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write RST ToDSS.DRV @@ -386,9 +389,9 @@ GET_FAT16_CELL: AND FAT_CACHE.Part_Mask_16 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FatCache) ; C - BLOCK FAT IN CASH + LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH CP C - CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET @@ -399,24 +402,21 @@ GET_FAT16_CELL: GET_FAT12_CELL: LD D,H LD E,L - RR H + SRL H RR L ; сдвиг вправо через CF PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; - ;IF COMPILE_UNUSED_CODE + IF FAT_CACHE.Size < #2000 ;!FIXIT оптимизировать LD A,H LD B,H - ; AND #1F ;AND FAT_CACHE.Size_Mask_16 ; - LD H,A LD A,B - ; RLCA RLCA @@ -427,11 +427,10 @@ GET_FAT12_CELL: AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - - LD BC,(FatCache) ; C - BLOCK FAT IN CASH + LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH CP C - CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а - ;ENDIF + CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а + ENDIF ; LD DE,FATPAGE.cache ADD HL,DE @@ -441,8 +440,8 @@ GET_FAT12_CELL: ; in: HL - CLUSTER ; out: HL:IX - SECTOR -NSECTOR: - LD DE,0 ;!FIXIT for FAT32 +NSECTOR:;[x] fat32 + LD DE,(FAT_Max_Cluster_H) DEC HL DEC HL LD A,(CORE_BUFFERS.BootSector.S_P_C) @@ -470,53 +469,58 @@ NSECTOR: RET //////////////////////////////////////////////////////////////////////// +;[ ] fat32 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE MACRO _GetSavedCluster exit_to LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_H) + LD D,(IY+_sFM.KnownCluster_L+1) LD A,D + INC B OR E JR Z,exit_to + DEC B ; PUSH DE PUSH HL PUSH BC LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_H) + LD D,(IY+_sFM.KnownOffset_L+1) LD A,D OR E JR Z,.noOptimization_1 ; POP HL - AND A SBC HL,DE JR C,.noOptimization_2 ; LD C,L LD B,H - POP HL POP DE + POP HL ; - EX DE,HL + INC B JP exit_to .noOptimization_1: POP BC .noOptimization_2: POP HL POP DE + INC B JP exit_to ENDM + ; +;[ ] fat32 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE MACRO _SaveGetedCluster LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_H),H + LD (IY+_sFM.KnownCluster_L+1),H POP BC LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_H),B + LD (IY+_sFM.KnownOffset_L+1),B ENDM ;; -BLOK_RD.ECL2: +BLOCK_READ.ECL2: ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP BC ; @@ -528,38 +532,42 @@ BLOK_RD.ECL2: ;READ SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors -BLOK_RD: PUSH BC +BLOCK_READ: + PUSH BC LD (READ.PointerOnBuffer),IX LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A - LD B,0 ;!FIXIT + LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC - ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb + ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb LD B,XH LD C,XL - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) + PUSH HL ;RESIDUE + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,H OR L ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;JR NZ,BLOKRD2 PUSH BC JR Z,.ECL2 - ;JP ECL2 ;RY01 JR BLOKRD0 + ;JP ECL2 ;RY01 JR BLOKRD0 _GetSavedCluster .enter_loop1 ; .loop1: PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT POP BC - JR C,.ECL2 ;RY01 + JR C,.ECL2 ;RY01 EX DE,HL - DEC BC + ; DEC BC .enter_loop1: - LD A,B ; ВС - смещение внутри файла в кластерах - OR C - JR NZ,.loop1 + ; LD A,B ; ВС - смещение внутри файла в кластерах + ; OR C + ; JR NZ,.loop1 + INC B + DEC BC + DJNZ .loop1 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster ; @@ -619,7 +627,7 @@ BLOK_RD: PUSH BC .BLOKRD7: EX DE,HL PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT POP BC JR C,.ECL1 ;RY01 EX DE,HL @@ -674,12 +682,12 @@ BLOK_WR: LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC + ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb LD B,XH LD C,XL - - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) + PUSH HL ;RESIDUE + LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER + LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,H OR L ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE @@ -690,35 +698,40 @@ BLOK_WR: PUSH BC CALL G_CLUST JP C,.Error - LD (IY+_sFM.ST_CLUSTER),L - LD (IY+_sFM.ST_CLUSTER+1),H - LD DE,(FatBuffer.ENDCLUS) - CALL W_T_FAT + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L + LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H + LD DE,(FatBuffer.ENDCLUS_LOW) + CALL WRITE_TO_FAT PUSH HL - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? - ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WRITE_FAT_TABLE? + ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск ; POP HL POP BC + INC B JP .WR2 ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE .GetSavedCluster: _GetSavedCluster .WR2 ; .loop: PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT JR NC,.WRB PUSH HL CALL INC_FAT POP HL JP C,.Error - CALL R_F_FAT + CALL READ_FROM_FAT .WRB: POP BC EX DE,HL + ; DEC BC +.WR2: + ; LD A,B + ; OR C + ; JR NZ,.loop + INC B DEC BC -.WR2: LD A,B - OR C - JR NZ,.loop + DJNZ .loop ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster @@ -778,13 +791,13 @@ BLOK_WR: RET Z .WR7: EX DE,HL PUSH BC - CALL R_F_FAT + CALL READ_FROM_FAT JR NC,.WR9 PUSH HL CALL INC_FAT POP HL JR C,.ErrorFull - CALL R_F_FAT + CALL READ_FROM_FAT .WR9: POP BC EX DE,HL PUSH HL @@ -825,10 +838,11 @@ BLOK_WR: //////////////////////////////////////////////////////////////////////// -FatCache: WORD #0000 -.Block EQU FatCache -.Update EQU FatCache+1 -FAT_Max_Cluster: WORD #0FF0 ; макс. число кластеров (без служ.) +FatCache: ;WORD #0000 +.Block WORD #0000 ;EQU FatCache +.Update BYTE 0 ;EQU FatCache+1 +FAT_Max_Cluster_L: WORD #0FF0 ; макс. число кластеров (без служ.) +FAT_Max_Cluster_H: WORD #0000 ; макс. число кластеров (без служ.) ;//MODULE: FAT_X ;[END] @@ -838,7 +852,7 @@ FAT_Max_Cluster: WORD #0FF0 ; ;; HL - CLUSTER ;; DE - (CLUSTER) ; - ;R_F_FAT EX DE,HL + ;READ_FROM_FAT EX DE,HL ; LD HL,(FAT_Max_Cluster) ; AND A ; SBC HL,DE @@ -859,7 +873,7 @@ FAT_Max_Cluster: WORD #0FF0 ; ; DEC A ; LD BC,(FatCache) ; A - ELEMENT OF CASH ; CP C - ; CALL NZ,READ_FAT + ; CALL NZ,READ_FAT_TABLE ; LD DE,FAT ; ADD HL,DE ; LD E,(HL) @@ -895,7 +909,7 @@ FAT_Max_Cluster: WORD #0FF0 ; ; ; - ;WR_FAT LD HL,(FatCache) + ;WRITE_FAT_TABLE LD HL,(FatCache) ; LD H,0 ; LD (FatCache),HL ; LD E,L diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm new file mode 100644 index 0000000..fb744b6 --- /dev/null +++ b/DSS/FS/FAT/FAT32.asm @@ -0,0 +1,138 @@ +;!TODO fat32 +;======================================================================= +;BPB + ;LD (FatBuffer.FAT2_XX),HL + ;LD (FatBuffer.DIR_FRL),HL ; first sector DIR +;BPB32 + ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта +;FAT Max Cluster + ;LD (FAT_Max_Cluster_L),HL +;======================================================================= + + +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +; костыли + MODULE SET_FAT32 + +; ВХОД: HL - младшее слово номера кластера после инкремента +; ВЫХОД: HL - как и вход +; DE - старшее слово номера кластера после инкремента +CHECK_INC_HIGH_CLUSTER: + LD DE,(R_CLUST.FAT32) + ; + LD A,H + OR L + RET NZ + ; + INC DE + ; !FIXIT проверять переполнение? + RET + + ENDMODULE +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +;вход: DE:HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +GET_FAT32_CELL: + ;[ ] fat32 + DI + HALT + + 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) + LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH + CP C + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + RET + +/* +; Прочитать в кеш 16 секторов FAT-а +; A - NEW FAT BLOCK +READ_FAT32: + PUSH HL + PUSH AF + LD A,(FatCache.Update) + OR A + CALL NZ,WRITE_FAT_TABLE.Start + POP AF + LD L,A + XOR A + LD H,A ;!FIXIT fat32 + LD (FatCache.Block),HL + LD (FatCache.Update),A + ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT + DUP FAT_CACHE.Degree_16 + ADD HL,HL ;x2 + EDUP + LD DE,(FatBuffer.FAT_FRM) + ADD HL,DE + EX DE,HL + ; + LD XH,D + LD XL,E + ;LD IX,0 + ;ADD IX,DE ; номер лог. сектора + ; + LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32 + LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS + LD A,(FatBuffer.DRIVE) ; номер диска + LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B * FAT_CACHE.Sector_Size = CASH SIZE + RST ToDSS.DRV + POP HL + RET + +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +GET_FAT32_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) + LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + RET + + +R_F_F16: + CALL GET_FAT16_CELL + LD E,(HL) ; прочитать номер кластера + INC HL + LD D,(HL) + POP AF + OUT (SLOT3),A + ;!TODO #FFF7 - кластер с косякчными секторами + LD HL,#FFEF ;!HARDCODE + XOR A ; DssErr.sys.NO_ERROR + SBC HL,DE ; проверка на служ. кластеры + POP HL + RET +*/ +; \ No newline at end of file diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index c53eeb1..7b4978c 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -273,19 +273,19 @@ MS_CURS PUSH BC LD B,0 LD (YHOT_SP),BC EXX - LD A,(M_XSIZE) - LD C,A - LD B,0 - LD A,(M_YSIZE) - LD HL,0 -MSCURS1 ADD HL,BC - DEC A - JR NZ,MSCURS1 - PUSH HL - LD BC,M_IMAGE.Size+1 - AND A - SBC HL,BC - CCF + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSCURS1 ADD HL,BC + DEC A + JR NZ,MSCURS1 + PUSH HL + LD BC,M_IMAGE.Size+1 + AND A + SBC HL,BC + CCF EXX POP BC POP HL @@ -303,19 +303,19 @@ NOLOADM POP HL MS_BCUR PUSH IX EXX - LD A,(M_XSIZE) - LD C,A - LD B,0 - LD A,(M_YSIZE) - LD HL,0 -MSBCUR1 ADD HL,BC - DEC A - JR NZ,MSBCUR1 - PUSH HL - LD BC,M_IMAGE.Size+1 - AND A - SBC HL,BC - CCF + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSBCUR1 ADD HL,BC + DEC A + JR NZ,MSBCUR1 + PUSH HL + LD BC,M_IMAGE.Size+1 + AND A + SBC HL,BC + CCF EXX POP BC POP HL diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index 3b0d263..802e4c8 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -247,14 +247,14 @@ Cursor_Off: ; Вектор обслуживания курсора cursor_interrupt: - LD A,(Cursor_Off.Flag) - OR A - RET Z + LD A,(Cursor_Off.Flag) + OR A + RET Z .timer+1: LD A,1 ; пауза мигания - DEC A - CALL Z,Cursor - LD (.timer),A - RET + DEC A + CALL Z,Cursor + LD (.timer),A + RET ; Настройка знакогенератора курсора черточкой SETUP_CURSORS: @@ -414,9 +414,9 @@ FULL_BF: BIT SF_BUFF,(IX+SOUND_K) JR Z,.FBF EXX - LD DE,230 - LD HL,50 - CALL BEEP + LD DE,230 + LD HL,50 + CALL BEEP EXX .FBF: EX AF,AF' RET @@ -530,9 +530,9 @@ RUS_X BIT X_CTRL,(IX+K_SHIFT) BIT SF_ALT,(IX+SOUND_K) RET Z EXX - LD DE,190 - LD HL,20 - CALL BEEP + LD DE,190 + LD HL,20 + CALL BEEP EXX RET diff --git a/DSS/Kernel_Panic.asm b/DSS/Kernel_Panic.asm new file mode 100644 index 0000000..19535d5 --- /dev/null +++ b/DSS/Kernel_Panic.asm @@ -0,0 +1,75 @@ + MACRO PRINT_LINE_KERNEL_PANIC txtString, txtStringSize, txtColor, coordY + LD HL,txtString + LD DE,#A000 + LD BC,txtStringSize + LD A,C + LDIR + ; + LD DE,coordY*256 + (80-txtStringSize)/2 ;X=0, Y=15 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + LD HL,#A000 + LD DE,0*256 + txtColor + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + ENDM + + +;-----------------------[] +; HL - сообщение +; E - координата X на текстовом экране +; BC - длина сообщения +KERNEL_PANIC: + DI + ; + PUSH DE + PUSH HL + PUSH BC + ; + LD E,1 + LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default + RST ToBIOS + ; + LD HL,#2050 + LD DE,0 + LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN + RST ToBIOS + ; + LD A,1 + OUT (SCREEN_SWITCH),A ; set scr-2 + ; + PRINT_LINE_KERNEL_PANIC .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.RED), 13 + PRINT_LINE_KERNEL_PANIC .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE), 18 + ; + POP BC + POP HL + LD DE,#A000 + LD A,C + LDIR + ; + POP DE + LD D,15 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + LD HL,#A000 + LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE + LD B,A + LD C,BIOS.LP_PRINT_LINE3 + RST ToBIOS + ; +.loop: DI + HALT + JR .loop + +.print_line: + RET + ; +.kernel_panic: DZ "KERNEL PANIC!" +.kernel_panic.size EQU $-.kernel_panic +; +.press_CAD: DZ "Press Ctrl+Alt+Del or RESET." +.press_CAD.size EQU $-.press_CAD +;-----------------------[] \ No newline at end of file diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index df9d2a6..cb278eb 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -112,7 +112,9 @@ ReScanDRV: _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE LD A,(HL) INC A - JP Z,ERROR_BOOTDRV_DIES + SCF + ;JP Z,ERROR_BOOTDRV_DIES + RET Z ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; 6. заменяем новые таблицы на модифицированные старые @@ -127,6 +129,7 @@ ReScanDRV: ;7. выход ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; LD A,(DRV_PAGE.LDRIVE) + AND A RET ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; @@ -274,42 +277,42 @@ Find_Record: ;-----------------------[] ;-----------------------[] -ERROR_BOOTDRV_DIES: - DI - LD E,1 - LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default - RST ToBIOS - ; - LD HL,#2050 - LD DE,0 - LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN - RST ToBIOS - ; - LD A,1 - OUT (SCREEN_SWITCH),A ; set scr-2 - ; - LD HL,.ERROR_MSG - LD DE,#A000 - LD BC,.ERROR_MSG.size - LD A,C - LDIR - ; - LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS - ; - LD HL,#A000 - LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE - LD B,A - LD C,BIOS.LP_PRINT_LINE3 - RST ToBIOS - ; -.loop: DI - HALT - JR .loop - ; -.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." -.ERROR_MSG.size EQU $-.ERROR_MSG +; ERROR_BOOTDRV_DIES: +; DI +; LD E,1 +; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default +; RST ToBIOS +; ; +; LD HL,#2050 +; LD DE,0 +; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN +; RST ToBIOS +; ; +; LD A,1 +; OUT (SCREEN_SWITCH),A ; set scr-2 +; ; +; LD HL,.ERROR_MSG +; LD DE,#A000 +; LD BC,.ERROR_MSG.size +; LD A,C +; LDIR +; ; +; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 +; LD C,BIOS.LP_SET_PLACE +; RST ToBIOS +; ; +; LD HL,#A000 +; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE +; LD B,A +; LD C,BIOS.LP_PRINT_LINE3 +; RST ToBIOS +; ; +; .loop: DI +; HALT +; JR .loop +; ; +; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." +; .ERROR_MSG.size EQU $-.ERROR_MSG ;-----------------------[] @@ -449,7 +452,7 @@ KILL_FM:; CP C JR NZ,.skip XOR A - LD (IY+_sFM.NAME),A ; грохаем манипулятор + LD (IY+_sFM.FS_REC.NAME),A ; грохаем манипулятор .skip: DJNZ .loop_fm ; POP AF diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 7e7e049..b1f5015 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -171,7 +171,7 @@ ; IDE0 EQU #0C1C0 ; IDE1 EQU #0C1C8 -PART EQU #C000 +PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR HDDRIVE INC C DEC C @@ -245,7 +245,7 @@ NX_DVCI: PUSH BC LD C,BIOS.DRV_DETECT RST ToBIOS ;JR C,.NO_DRIVE - CALL NC,PARTIT + CALL NC,DEFINE_PARTITIONS.BEGIN POP BC INC C JR C,NX_DVCI @@ -515,35 +515,39 @@ CHECKH: PUSH IY POP IY RET -;----------------- -EASYDOS: -MEDIDOS: -HIGHDOS: - LD E,(IY+08) - LD D,(IY+09) - LD L,(IY+10) - LD H,(IY+11) - LD IX,(CURSECL) +;------------------------------[ PARTIT ]------------------------------; +DEFINE_PARTITIONS: +.FAT32_DOS: +.EASYDOS: +.MEDIDOS: +.HIGHDOS: + 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) + LD IX,(CURRENT_SECTOR_L) ADD IX,DE - LD DE,(CURSECH) + 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 ;BPB SECTOR - LD (IX+LOGDRV.SECTOR_OFFSET+1),D - LD (IX+LOGDRV.SECTOR_OFFSET+2),L - LD (IX+LOGDRV.SECTOR_OFFSET+3),H - LD E,(IY+12) - LD D,(IY+13) - LD L,(IY+14) - LD H,(IY+15) - LD (IX+LOGDRV.SIZE_IN_SECTORS+0),E ;SIZE DISK - LD (IX+LOGDRV.SIZE_IN_SECTORS+1),D - LD (IX+LOGDRV.SIZE_IN_SECTORS+2),L - LD (IX+LOGDRV.SIZE_IN_SECTORS+3),H + 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 + _sMBR_PARTITION_RECORD.Size_LBA + 0) + LD D,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 1) + LD L,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 2) + LD H,(IY + _sMBR_PARTITION_RECORD.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 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого -ExtendedPartitionFlag+1: +.ExtendedPartitionFlag+1: LD A,0 OR A ; !TODO загрузка с расширенного раздела не поддерживается LD A,#FF @@ -551,10 +555,10 @@ ExtendedPartitionFlag+1: ; POP BC PUSH BC - LD A,4 ;!HARDCODE MBR: Number of entries in the partition table + 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 + LD (IX + LOGDRV.PARTITION_RECORD_NUM),A ; ;!TEST Подстраховка от переполнения таблицы LOGDRV LD A,(DRVCLC.count) @@ -564,66 +568,60 @@ ExtendedPartitionFlag+1: LD (DRVCLC.count),A ; LD A,(DRV_NUM) - LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),A + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE LD (OFFSECT),IX - JP NXTPART -; NXTPART: -; LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry -; ADD IY,DE -; POP BC -; DJNZ DOSAGA -; AND A -; RET - - + JP .NextPartition ; -NOEXTDS: +.NotExtended: CP PartitionSysTypes.FAT16 - JR Z,HIGHDOS + JR Z,.HIGHDOS CP PartitionSysTypes.FAT16_LBA - JR Z,HIGHDOS + JR Z,.HIGHDOS CP PartitionSysTypes.FAT16_32Mb - JR Z,MEDIDOS + JR Z,.MEDIDOS CP PartitionSysTypes.FAT12 - JR Z,EASYDOS + 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,SUBLEV + JR Z,.SubLevel ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - ;OR A ;PartitionSysTypes.Empty + ;OR A ;PartitionSysTypes.Empty ;JR NZ,NXTPART - JR NXTPART ; раздел не поддерживается - ;POP BC ; баланс стека + JR .NextPartition ; раздел не поддерживается + ;POP BC ; баланс стека ;RET ;POP BC ;OR A ;RET Z ;NODEFIN: ;SCF - ;RET + ;RET ; - -PARTIT: IN A,(SLOT3) +.BEGIN: IN A,(SLOT3) PUSH AF LD A,SHARED_PAGE OUT (SLOT3),A - CALL PARTIT1 + CALL .Start POP AF OUT (SLOT3),A RET - -PARTIT1: - LD IX,0 +.Start: LD IX,0 LD DE,0 LD (EXTDOSL),DE ;R01 LD (EXTDOSH),IX ;R01 -PARTIT2: - LD (CURSECL),DE - LD (CURSECH),IX - CALL LOADSEC ; - LD HL,(PART+510) ;!HARDCODE Signature word +.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 @@ -632,59 +630,59 @@ PARTIT2: SCF RET NZ ; - LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR - LD B,4 ;!HARDCODE MBR: Number of entries in the partition table -DOSAGA: PUSH BC - LD A,(IY+4) + 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,NOEXTDS -SUBLEV: PUSH IY - LD DE,(CURSECL) - LD IX,(CURSECH) + JR NZ,.NotExtended +.SubLevel: + PUSH IY + LD DE,(CURRENT_SECTOR_L) + LD IX,(CURRENT_SECTOR_H) PUSH DE PUSH IX ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(ExtendedPartitionFlag) + LD A,(.ExtendedPartitionFlag) INC A - LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается ; - CALL EXTDOS + CALL .ParseExtended ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов - LD A,(ExtendedPartitionFlag) + LD A,(.ExtendedPartitionFlag) DEC A - LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается ; POP IX POP DE - LD (CURSECL),DE - LD (CURSECH),IX - CALL LOADSEC + LD (CURRENT_SECTOR_L),DE + LD (CURRENT_SECTOR_H),IX + CALL .LOAD_SECTOR POP IY -NXTPART: - LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry +.NextPartition: + LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry ADD IY,DE POP BC - DJNZ DOSAGA + DJNZ .DOSAGA AND A RET - ; -EXTDOS: LD HL,(EXTDOSL) +.ParseExtended: + LD HL,(EXTDOSL) LD DE,(EXTDOSH) LD A,L OR H OR E OR D - LD E,(IY+08) - LD D,(IY+09) - LD L,(IY+10) - LD H,(IY+11) - JP NZ,EXTDOS2 + 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) - JP PARTIT2 - ; -EXTDOS2: +.EXTDOS2: LD IX,(EXTDOSL) ADD IX,DE PUSH IX @@ -693,27 +691,28 @@ EXTDOS2: PUSH HL POP IX POP DE - JP PARTIT2 - -LOADSEC: + JP .LOOP + ; +.LOAD_SECTOR: PUSH IY - LD IX,(CURSECL) - LD HL,(CURSECH) - LD DE,PART + 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 +;----------------------------------------------------------------------; +; -DRV_NUM DB #00 ;PHISICAL DRIVE NUMBER. номер девайса (#80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв) - -CURSECL DW #0000 ;CURRENT SECTOR LOADED -CURSECH DW #0000 - -EXTDOSL DW #0000 ;CURRENT PARTITION TABLE -EXTDOSH DW #0000 - -OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD - -;======================================================= \ No newline at end of file +;======================================================================= +; PHISICAL DRIVE NUMBER +; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв +DRV_NUM: DB #00 +CURRENT_SECTOR_L: DW #0000 +CURRENT_SECTOR_H: DW #0000 +EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE +EXTDOSH: DW #0000 +OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD +;======================================================================= \ No newline at end of file diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 2798e6b..403ee1d 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -1,41 +1,43 @@ ; STRUCT _sStack ; 256 bytes -buffer BLOCK 256,0 -SPoint BYTE 0 +.buffer BLOCK 256,0 +.SPoint BYTE 0 ENDS ; ; STRUCT _sEXE_HEADER ; 512 bytes -EXE_EXT TEXT 3,{"EX","E"} -VERSION BYTE 0 -OFFCOD1 WORD 0 -OFFCOD2 WORD 0 -LOADER WORD 0 -RESERVED BLOCK 6,0 -LD_ADDR WORD 0 -PC_REG WORD 0 -SP_REG WORD 0 -RESERVED2 BLOCK 490,0 +.EXE_EXT TEXT 3,{"EX","E"} +.VERSION BYTE 0 +.OFFCOD1 WORD 0 +.OFFCOD2 WORD 0 +.LOADER WORD 0 +.RESERVED BLOCK 6,0 +.LD_ADDR WORD 0 +.PC_REG WORD 0 +.SP_REG WORD 0 +.RESERVED2 BLOCK 490,0 ENDS ; ;File Manipulator (FM) - STRUCT _sFM ; 47 bytes +;[ ] fat32 + STRUCT _sFM ; 51 bytes ; from FAT -.NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME -.EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT -.ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT -.RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED -.RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED -.CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED -.CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED -.RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED -.RESERVED_FAT32_2: WORD #0000 ;+ #14 +20 RESERVED -.TIME: WORD #0000 ;+ #16 +22 TIME -.DATE: WORD #0000 ;+ #18 +24 DATE -.ST_CLUSTER: WORD #0000 ;+ #1A +26 START CLUSTER -.F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE +; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME +; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT +; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT +; .RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED +; .RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED +; .CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED +; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED +; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED +; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED +; .TIME: WORD #0000 ;+ #16 +22 TIME +; .DATE: WORD #0000 ;+ #18 +24 DATE +; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ;!TODO fat32 +; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE +.FS_REC: _sFAT_DIRECTORY_RECORD ; from Core .F_POSITION: DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .DIR_CLUSTER: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER @@ -44,10 +46,10 @@ RESERVED2 BLOCK 490,0 .ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE признак изменения файла .TASK_NUM: BYTE #00 ;+ #2A +42 TASK ;.EMPTY: BYTE #00 ;+ #2B +43 EMPTY -.KnownCluster_L: BYTE 0 ;+ #2B +43 Младший байт номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: BYTE 0 ;+ #2C +44 Старший байт номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: BYTE 0 ;+ #2D +45 Младший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: BYTE 0 ;+ #2E +46 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownCluster_L: WORD #0000 ;+ #2B +43 Младшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: WORD #0000 ;+ #2C +44 Старшее слово номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: WORD #0000 ;+ #2D +45 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: WORD #0000 ;+ #2E +46 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS ; @@ -67,12 +69,12 @@ RESERVED2 BLOCK 490,0 ; STRUCT _sBuffers -FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) -FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; -BootSector _sBOOT_SEC ; 62 bytes ;!TODO перенести в область буферов -EXE_Header _sEXE_HEADER ; 512 bytes -Stack _sStack ; 256 bytes -Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF -MemoryTable BLOCK 256,0 ; 256 bytes +.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) +.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; +.BootSector _sBOOT_SECTOR_PARAMS ; 62 bytes ;!TODO перенести в область буферов +.EXE_Header _sEXE_HEADER ; 512 bytes +.Stack _sStack ; 256 bytes +.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF +.MemoryTable BLOCK 256,0 ; 256 bytes ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index c353035..dcdf7f5 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -943 \ No newline at end of file +942 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f3d2ca2..f0ea1b5 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -1,5 +1,5 @@ ; - DEFINE TEST_FEATURE 1 + DEFINE TEST_FEATURE 0 ; ; @@ -17,6 +17,8 @@ ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе ///////////////////////////////////////////////////////////////////////////////////////////////////////////// + DEFINE _FAT32_ENABLE 1 ;!TODO пока недоделано + define _bit (1