From f13fdf4eab7cd98506e45e3c09c9714f20dc32c8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 20 Mar 2024 22:08:52 +1000 Subject: [PATCH] -bug in GETWORD: fixed "cd x:" incorrect behavior --- BOOT/DSSBOOT.ASM | 26 ++--- DSS/API/ChDir.asm | 4 +- DSS/API/Create.asm | 16 +-- DSS/API/MkDir.asm | 2 +- DSS/API/RmDir.asm | 4 +- DSS/API/diskINF.asm | 4 +- DSS/DOS_Proc.asm | 15 ++- DSS/DSS-MAIN.ASM | 4 +- DSS/FS/FAT/FAT.asm | 252 ++++++++++++++-------------------------- DSS/FS/FAT/FAT12_16.asm | 70 ++++++----- DSS/FS/FAT/FAT32.asm | 9 +- DSS/INTMOUSE.ASM | 10 +- DSS/build.txt | 2 +- 13 files changed, 174 insertions(+), 244 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 5cd2865..535b497 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -310,7 +310,7 @@ SET_PRM: PUSH BC LD A,B LD C,BIOS.DRV_GET_PAR RST ToBIOS_18 - LD A,(BOOT.S_P_T) + LD A,(BOOT.SectorsPerTrack) LD L,A POP AF PUSH AF @@ -358,16 +358,16 @@ NX2: LD HL,(BOOT+510) LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) ADD HL,DE LD (FAT_FRM),HL ;first sector FAT - 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 + LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT + LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) + LD A,(BOOT.Number_of_FATs) ;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_SECTOR_PARAMS.F_P_DIR) ;Number file handel - LD H,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1) + LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel + LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) ADD HL,HL ADD HL,HL ADD HL,HL @@ -381,10 +381,10 @@ C_DATA1: ADD HL,DE ADD HL,DE LD (DAT_FRM),HL ;First sector data - LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ;Size sector - LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1) + LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector + LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) LD HL,0 - LD A,(BOOT.S_P_C) + LD A,(BOOT.SectorsPerCluster) NEXTAD3: ADD HL,BC ;calc. cluster size DEC A @@ -518,7 +518,7 @@ FLOAD: LD (READMEM),DE LD_FILE: PUSH HL CALL NSECTOR LD DE,(READMEM) - LD A,(BOOT.S_P_C) + LD A,(BOOT.SectorsPerCluster) CP #20 JR C,SMALL_CLUSTER LD BC,#20*256 + BIOS.DRV_READ_LONG @@ -554,7 +554,7 @@ SMALL_CLUSTER: ; DEC HL ; DEC HL ; EX DE,HL -; LD A,(BOOT.S_P_C) +; LD A,(BOOT.SectorsPerCluster) ; LD B,A ; LD HL,0 ; LD IX,0 @@ -578,7 +578,7 @@ NSECTOR: LD DE,0 DEC HL DEC HL - LD A,(BOOT.S_P_C) + LD A,(BOOT.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -643,7 +643,7 @@ R_F_F12 LD D,H RR L PUSH AF EX DE,HL - LD HL,(BOOT.B_P_S) + LD HL,(BOOT.BytesPerSector) LD B,H LD C,L ADD HL,HL diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm index 2f82fa0..9b20e37 100644 --- a/DSS/API/ChDir.asm +++ b/DSS/API/ChDir.asm @@ -30,6 +30,6 @@ CHDIR: CALL GETWORD ; LD HL,TMPNAME LD A,(HL) OR A - CALL NZ,OPENDIR - RET + RET Z + JP OPENDIR ; \ No newline at end of file diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm index 1b23edc..2bdefac 100644 --- a/DSS/API/Create.asm +++ b/DSS/API/Create.asm @@ -3,8 +3,6 @@ ; A - File attribute ; OUTPUT: A - FM //////////////////////////////////////////////////////////////////////// -CREATE_FN: - AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID CREATE: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL LD C,A @@ -13,7 +11,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 POP BC POP HL RET C - LD A,C ; + LD A,C ; CALL .Prepare RET C @@ -30,8 +28,8 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 LD A,DSS_Error.sys.FILE_NOT_FOUND RET ; -.NEW_FN: - AND FAT_ATTR.NoVolID ; [x] 2/12/23 временный фикс для volume ID + ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 + ; OUTPUT: A - FM .NEW: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL LD C,A @@ -69,7 +67,7 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 .loop1: LD (HL),C INC HL DJNZ .loop1 - ; + ;AaRR PUSH HL CALL SYSTIME CALL MK_TIME @@ -97,7 +95,8 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 LD (OPEN_FN.TMP),A JP OPEN_FN.FILE ;R008 .Prepare: - AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE + ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE + AND FAT_ATTR.NoDIRnoVolID LD (.TMP),A LD (.PATH0),HL CALL GETWORD @@ -111,7 +110,4 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 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 ; \ No newline at end of file diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index bfde2c5..227c22f 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -143,7 +143,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 ; POP HL CALL NSECTOR - LD A,(CORE_BUFFERS.BootSector.S_P_C) ; секторов на кластер + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 09dd1f5..4463af8 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -42,7 +42,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH IX .RMD17: PUSH HL CALL NSECTOR - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; начинаем вычитывать содержимое каталога посекторно .read_dir_loop: PUSH AF @@ -93,7 +93,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 POP AF DEC A JR NZ,.read_dir_loop - ; + ; [ ] fat32 POP HL ; номер кластера CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL ; hl=номер след. кластера diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index aa61bc3..aa511ab 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -122,8 +122,8 @@ DISKINF:; [ ] 22/11/23 LD E,C LD HL,(FAT_Max_Cluster_L) DEC HL - LD BC,(CORE_BUFFERS.BootSector.B_P_S) - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) AND A RET ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index ddabfbe..9830796 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -116,7 +116,7 @@ GETWORD: LD A,(HL) CP 'a' JR C,.next - CP '{' + CP 'z'+1 JR NC,.next SUB #20 .next: SUB 'A' @@ -129,13 +129,13 @@ GETWORD: RET C LD A,(HL) OR A - RET Z + JR Z,.done CP ' ' ; - RET Z + JR Z,.done CP '\' ; SCF LD A,DSS_Error.sys.PATH_NOT_FOUND - RET NZ + RET NZ INC HL ; .dir_loop: @@ -158,7 +158,11 @@ GETWORD: DJNZ .loop LD A,DSS_Error.sys.INVALID_NAME SCF - RET + RET + ; +.done: XOR A + LD (TMPNAME),A + RET ; .DIR_NAME: XOR A @@ -260,6 +264,7 @@ OPENDSK:;!TEST DRV.Open ;----------------------------------------------------------------------; +; вход: HL - имя директории OPENDIR:;[x] some optimizations ;XOR A ;CALL SET_FM diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 19841df..92ba73d 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -358,7 +358,7 @@ ADRST10: ;DS 512 ;,0 ;...............................................[LOW ADDRESS ]: ; 0 1 2 3 4 5 6 7 8 9 DEC HEX DB low F_START, low CHNDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09 - DB low CREATE_FN, low CREAT_N, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 + DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13 DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR_FN ; 2 14..1D DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27 DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31 @@ -385,7 +385,7 @@ ADRST10: ;DS 512 ;,0 ENDIF ;...............................................[HIGH ADDRESS]: DB high F_START, high CHNDISK_FN,high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK - DB high CREATE_FN, high CREAT_N, high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ + DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR_FN DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index ac6e380..e882438 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -16,7 +16,8 @@ ; (HANDBUF) = file's direcory record ; CF - каталог не найден SEARCH: -.Dir: LD A,FAT_ATTR.DIRECTORY +.Dir: ;LD A,FAT_ATTR.DIRECTORY + LD A,FAT_ATTR.HiddenSysDir CALL SEARCH.Custom RET NC CP DSS_Error.sys.PATH_NOT_FOUND + 1 @@ -40,12 +41,12 @@ SEARCH: ; LD DE,0 ; EXX ; -.loop: LD A,(IX+00) +.loop: LD A,(IX+_sFAT_DIRECTORY_RECORD.NAME) OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены JR Z,.next_record - LD A,(IX+11) + LD A,(IX+_sFAT_DIRECTORY_RECORD.ATTRIBUT) AND C JR NZ,.next_record LD HL,MASKARE @@ -345,7 +346,7 @@ LOADDIR: ; [ ] fat32 LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - JP Z,.LROTDIR ; root ?? + JP Z,.LoadRootDir ; LD HL,DIRPAGE.buffer ; куда LD DE,#4000 ; сколько @@ -355,11 +356,11 @@ LOADDIR: POP AF OUT (SLOT3),A RET -.LROTDIR: - LD HL,(FatBuffer.DIR_FRH) ; ст. разряд - LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора - LD A,(FatBuffer.DIR_S_S) - LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога +.LoadRootDir: + LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд + LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(FatBuffer.DirSizeInSectros) + LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 LD B,A ; число секторов @@ -420,7 +421,7 @@ WRT_HND: SET_PAGE_X DIRPAGE SBC HL,DE JR NC,SAVEDIR LD HL,(SAVEDIR.DIRSIZE) - LD BC,(FatBuffer.B_P_C) + LD BC,(FatBuffer.BytesPerCluster) ADD HL,BC LD (SAVEDIR.DIRSIZE),HL AND A @@ -448,7 +449,7 @@ SAVEDIR: LD E,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,D OR E - JP Z,.SROTDIR + JP Z,.SaveRootDir LD HL,DIRPAGE.buffer ; размер списка каталога size_cash_directory ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок) @@ -460,11 +461,11 @@ SAVEDIR: OUT (SLOT3),A AND A RET -.SROTDIR: - LD HL,(FatBuffer.DIR_FRH) - LD IX,(FatBuffer.DIR_FRL) - LD A,(FatBuffer.DIR_S_S) - LD B,32 ;!HARDCODE +.SaveRootDir: + LD HL,(FatBuffer.RootDirFirstSector_H) + LD IX,(FatBuffer.RootDirFirstSector_L) + LD A,(FatBuffer.DirSizeInSectros) + LD B,32 ;!HARDCODE sector size 512 SUB B JR NC,.RTD1S ADD A,B @@ -496,18 +497,13 @@ RD_BPB: LD C,SLOT3 IN A,(SLOT0) OUT (SLOT3),A LD A,(FatBuffer.DRIVE) - ;R08 - ;LD DE,BOOT+#C000 - LD DE,CORE_BUFFERS.SECBUF+#C000 - ;R08 + LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD C,Dss.DRV.GetBPB RST ToDSS.DRV POP BC OUT (C),B JP C,DOS_X_Error.Not_ready - //PUSH IY ; пока без индексного, но может пригодиться - LD DE,#AA55 ; сигнатура ;R05 LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 ;R05 @@ -520,39 +516,21 @@ RD_BPB: LD C,SLOT3 LD BC,_sBOOT_SECTOR_PARAMS ; size LDIR ; - - //LD IY,BootSector ; пока без индексного, но может пригодиться - //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_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec - ;LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) - ;ADD HL,DE - - //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) + ; calc. first sector FAT + LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS) ; - ; 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_SEC_L),HL ; first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL - - //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) - - - LD A,(CORE_BUFFERS.BootSector.FAT_NUM) ; amount FATs + ; + LD (FatBuffer.FAT1_SEC_L),HL ; first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL ; first sector FAT #2 + ; + LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) + LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs CP 1 JR Z,.loop1 DEC A @@ -562,80 +540,47 @@ RD_BPB: LD C,SLOT3 .loop1: ADD HL,DE DEC A JR NZ,.loop1 - LD (FatBuffer.DIR_FRL),HL ; first sector DIR - ; CF = ? мало ли - AND A - ; CF = 0 - - //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 - ; RL C - ; RL B - ; RL C - ; RL B - ; LD C,B - ; LD B,0 ; BC - File handels in sectors - ; LD A,C - ;;;; + ; + LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) LD A,B + AND A ; 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_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) - + LD (FatBuffer.FilesPerSector),A + ; EX DE,HL - DEC HL + LD HL,(CORE_BUFFERS.BootSector.FilesInRootDIR) ; 0 for fat32 + DEC HL ; [ ]fat32 XOR A ;NEXTAD2 .loop2: INC A JP Z,DOS_X_Error.UnknownBPB SBC HL,BC JR NC,.loop2 - + ; EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (FatBuffer.DIR_S_S),A + LD (FatBuffer.DirSizeInSectros),A ADD HL,BC ; Start DATA area - LD (FatBuffer.DAT_FRL),HL -;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer -//////////////////////////////////////////////////////////////////////// - ;IF COMPILE_UNUSED_CODE - ;LD HL,0 - - ;LD H,B ; тут в B ноль должен быть - ;LD L,B - ;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_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) + LD (FatBuffer.FirstDataSector_L),HL + ; B = 0 + ; + LD HL,(CORE_BUFFERS.BootSector.BytesPerSector) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;!TODO FATcacheSize -;NEXTAD3 -; .loop3: ADD HL,BC ; calc. cluster size -; DEC A -; JR NZ,.loop3 - XOR 1 ; calc. cluster size + ; calc. cluster size + XOR 1 JR Z,.loop3.end RRA .loop3: ADD HL,HL @@ -643,7 +588,7 @@ RD_BPB: LD C,SLOT3 JP NC,.loop3 .loop3.end: ; - LD (FatBuffer.CLU_LEN),HL + LD (FatBuffer.BytesPerCluster),HL EX DE,HL LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize XOR A @@ -652,11 +597,9 @@ RD_BPB: LD C,SLOT3 JP Z,DOS_X_Error.UnknownBPB SBC HL,DE JR NC,.loop4 - LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) - ;ENDIF -//////////////////////////////////////////////////////////////////////// - -;!TODO detect fat type by clusters! + LD (FatBuffer.ClusterPerBank),A ; A - Clusters per bank (16k) + ; + ;!TODO detect fat type by clusters! ;[ ] fat32 reset fat32 variables LD HL,0 LD (FatBuffer.ENDCLUS_HIGH),HL @@ -707,57 +650,36 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.FAT_TYPE),A LD (FatBuffer.ENDCLUS_LOW),HL -;!TODO не используются значения вычисляемые и сохраняемые в FatBuffer +;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// - ;IF COMPILE_UNUSED_CODE - - LD HL,0 - - //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, то будет бага -.BPB_L1: ; calc. sector per cylinder - ADD HL,BC - DEC A - JR NZ,.BPB_L1 - LD (FatBuffer.S_X_H),HL - ;ENDIF +; LD HL,0 +; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.BootSector.HEADS) +; .BPB_L1:; calc. sector per cylinder +; ADD HL,BC +; DEC A +; JR NZ,.BPB_L1 +; LD (FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// - - LD DE,(FatBuffer.DAT_FRL) -; 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_SECTOR_PARAMS.S_P_D) - //LD H,(IY+_sBOOT_SECTOR_PARAMS.S_P_D+1) - LD HL,(CORE_BUFFERS.BootSector.S_P_D) - + ; [ ] fat32 + LD HL,(CORE_BUFFERS.BootSector.SectorsPerDrive) + LD DE,(FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; - //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 DEC BC JP .HDDBIG -.HDDSMAL: - ;AND A ;тут CF полюбас сброшен должен быть + ; +.HDDSMAL:; CF = 0 SBC HL,DE LD BC,0 -.HDDBIG: LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!!!!! а если IY используется для переменного BootSector, то будет бага +.HDDBIG: LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) SCF .S4C01: RRA JR C,.S4C02 @@ -768,9 +690,7 @@ RD_BPB: LD C,SLOT3 JP .S4C01 .S4C02: INC HL LD (FAT_Max_Cluster_L),HL - - //POP IY - + ; XOR A LD H,A LD L,A @@ -808,7 +728,6 @@ RD_BPB: LD C,SLOT3 ; DOS_X_Error: .UnknownBPB: - //POP IY LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF RET @@ -820,29 +739,28 @@ DOS_X_Error: ; ;!TODO к буферам! FatBuffer: -.MSG: DB 'FAT' -.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) -.BLOCK: DB #00 -.DIR_CLU_L: DW #0000 -.DIR_CLU_H: DW #0000 ; [ ] fat32 -.DRIVE: DB #FF -.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) -.FAT1_SEC_H: DW #0000 ; [ ] fat32 -.FAT2_SEC_L: DW #0000 -.FAT2_SEC_H: DW #0000 ; [ ] fat32 -.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется -.DIR_FRL: DW #0000 ; MSD_CAT_SEC first sector DIR -.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 не используется -.CLU_LEN: -.B_P_C: DW #0000 ; CLUSTER_LEN -.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? -.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 -.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? -.ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 +.MSG: DB 'FAT' +.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +.BLOCK: DB #00 +.RootDirStartCluster_L: DW #0000 +.RootDirStartCluster_H: DW #0000 ; [ ] fat32 +.DRIVE: DB #FF +.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) +.FAT1_SEC_H: DW #0000 ; [ ] fat32 +.FAT2_SEC_L: DW #0000 +.FAT2_SEC_H: DW #0000 ; [ ] fat32 +.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR +.FilesPerSector: DB #00 ; число файловых записей в секторе +.DirSizeInSectros: DB #00 ; DIR_SEC_SIZE +.FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low +.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; !TODO ограничение в 32 Гига ; [ ] fat32 +.BytesPerCluster: DW #0000 ; CLUSTER_LEN +.ClusterPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? +.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 +.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? +.ENDCLUS_LOW: DW #FFFF +.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32 ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index fd418c6..3865e2f 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -327,7 +327,7 @@ WRITE_FAT_TABLE: LD DE,FAT_CACHE.Sectors ADD HL,DE ;+ SIZE CASH (16 SECTORS) LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш - LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT + LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT AND A SBC HL,DE JR C,.WALLFAT @@ -520,13 +520,13 @@ GET_FAT12_CELL: RET -; in: HL - CLUSTER +; in: DE:HL - CLUSTER ; out: HL:IX - SECTOR -NSECTOR:;[x] fat32 - LD DE,(FAT_Max_Cluster_H) +NSECTOR:;[ ] fat32 + LD DE,(FAT_Max_Cluster_H) ; [ ] fat32 - заменить другой переменной DEC HL DEC HL - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -541,11 +541,16 @@ NSECTOR:;[x] fat32 .skip: EX DE,HL LD XL,E LD XH,D - LD DE,(FatBuffer.DAT_FRL) ;first data sector - XOR A + LD DE,(FatBuffer.FirstDataSector_L) + ; [x] fat32 + ;XOR A + ; ADD IX,DE - LD D,A - LD E,A + ; [x] fat32 + LD DE,(FatBuffer.FirstDataSector_H) + ;LD D,A + ;LD E,A + ; ADC HL,DE ;!TODO а надо ли проверять переполнение HL:IX? RET @@ -603,9 +608,8 @@ NSECTOR:;[x] fat32 ;; BLOCK_READ.ECL2: - ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE - POP BC - ; + ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) + POP BC ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE POP BC POP DE AND A @@ -614,25 +618,30 @@ BLOCK_READ.ECL2: ;READ SECTORS OF FILE ;HL:DE - FP (in sectors) ; B - Amount sectors +; IX - buffer in RAM +; 225 937 408 / 512 = 0x6BBC4 / 4 = 0x1AEF1 BLOCK_READ: PUSH BC LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK CALL DIV_for_SPC - ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb + ; [ ] fat32. далее заточка на то, что в DE всегда 0 - файл не больше 2Gb. Использовать DE LD B,XH LD C,XL - PUSH HL ;RESIDUE + PUSH HL ; остаток DIV_for_SPC + 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 + LD A,L + OR H + ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;JR NZ,BLOKRD2 PUSH BC + ;PUSH DE ; [ ] старшее слово номера кластера (раньше игнорировалось) JR Z,.ECL2 ;JP ECL2 ;RY01 JR BLOKRD0 _GetSavedCluster .enter_loop1 @@ -650,12 +659,13 @@ BLOCK_READ: INC B DEC BC DJNZ .loop1 + ;POP DE ; [ ] старшее слово номера кластера (раньше игнорировалось) ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE _SaveGetedCluster ; - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) + POP DE ; остаток DIV_for_SPC + POP BC ; HL:DE - FP (in sectors) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) SUB E LD C,A ;\ CP B ; \ @@ -680,7 +690,7 @@ BLOCK_READ: JR C,.Error POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) ;!TEST LD A,B LD B,C @@ -695,7 +705,7 @@ BLOCK_READ: RET Z LD B,A ; -.loop4: LD HL,CORE_BUFFERS.BootSector.S_P_C +.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -724,7 +734,7 @@ BLOCK_READ: JR C,.Error POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -759,7 +769,7 @@ BLOCK_READ: BLOK_WR: PUSH BC LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A LD B,0 ;HL:DE / BC => DE:IX HL-OSTATOK @@ -820,7 +830,7 @@ BLOK_WR: ; POP DE POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) + LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) SUB E LD C,A CP B @@ -846,7 +856,7 @@ BLOK_WR: JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) ; .loop2: ADD HL,DE DEC C @@ -860,7 +870,7 @@ BLOK_WR: RET Z ; .big_loop: - LD HL,CORE_BUFFERS.BootSector.S_P_C + LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -894,7 +904,7 @@ BLOK_WR: JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) + LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -1050,7 +1060,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ; NSECTOR: DEC HL ; DEC HL ; EX DE,HL -; LD A,(CORE_BUFFERS.BootSector.S_P_C) +; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; LD B,A ; LD HL,0 ; LD IX,0 @@ -1058,7 +1068,7 @@ FAT_Max_Cluster_H: WORD #0000 ; ; JR NC,ADD_DE2 ; INC HL ; ADD_DE2: DJNZ ADD_DE1 -; LD DE,(FatBuffer.DAT_FRL) ;first data sector +; LD DE,(FatBuffer.FirstDataSector_L) ;first data sector ; ADD IX,DE ; LD DE,#0000 ; ADC HL,DE diff --git a/DSS/FS/FAT/FAT32.asm b/DSS/FS/FAT/FAT32.asm index fa44220..054fcbd 100644 --- a/DSS/FS/FAT/FAT32.asm +++ b/DSS/FS/FAT/FAT32.asm @@ -2,7 +2,7 @@ ;======================================================================= ;BPB ;LD (FatBuffer.FAT2_SEC_L),HL - ;LD (FatBuffer.DIR_FRL),HL ; first sector DIR + ;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR ;BPB32 ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта ;FAT Max Cluster @@ -31,7 +31,7 @@ CHECK_INC_HIGH_CLUSTER: ENDMODULE ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - +;----------------------------------------------------------------------- ;вход: DE:HL - номер кластера ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT32_CELL: @@ -54,8 +54,7 @@ GET_FAT32_CELL: 0xEAB1022 - block 0x1D562 D E H 0xEAB10 >>> 0x1D562 -*/ - + [ ] fat32 доделать тут LD A,H LD B,H AND #0F @@ -79,6 +78,8 @@ GET_FAT32_CELL: LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT RET +*/ +;----------------------------------------------------------------------- /* ; Прочитать в кеш 16 секторов FAT-а diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 017c9a0..59575af 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -161,6 +161,11 @@ EMOUSE: RES 7,C ;!TODO на биос. MS_INIT: DI + ; скорость порта - второй множитель + LD A,#55 + OUT (Z84.CTC.Ch_0),A + LD A,MOUSE_BAUD.multiplier_2 + OUT (Z84.CTC.Ch_0),A ; reg 0 XOR A OUT (PORT_MOUSE.Ctrl),A @@ -199,11 +204,6 @@ MS_INIT: XOR A OUT (PORT_MOUSE.Ctrl),A ENDIF - ; скорость порта - второй множитель - LD A,#55 - OUT (Z84.CTC.Ch_0),A - LD A,MOUSE_BAUD.multiplier_2 - OUT (Z84.CTC.Ch_0),A ; EI XOR A diff --git a/DSS/build.txt b/DSS/build.txt index 972fd77..cebfe35 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -958 \ No newline at end of file +946 \ No newline at end of file