diff --git a/DSS/API.asm b/DSS/API.asm index 05e1e45..7c49cd2 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -21,8 +21,6 @@ ;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES ;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT ;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES -;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION -;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;R001 16-12-1999 DNS Y2K fix ;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS ;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index d710756..9914621 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -36,7 +36,7 @@ DISKINF: LD C,B LD B,1 ; CP #80 - JR C,.CustomDisk + JP C,.CustomDisk CP #FF JR Z,.CurrentDisk ; more info @@ -54,26 +54,31 @@ DISKINF: LD C,B PUSH BC ;;;; ; - LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - ; EX DE,HL - LD HL,CORE_BUFFERS.BootSector.ID_FAT - JR NZ,1F - LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.ID_FAT -1: LD C,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + LD HL,FAT_STRING +1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + CALL .mCOPY_LOOP + ; 12, 16 or 32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x16 + JR C,.next_prm + ; + PUSH DE + DEC DE + LD A,'6' + JR Z,.put_char + ; fat 32 + DEC DE + LD A,'3' +.put_char: LD (DE),A + POP DE + ; +.next_prm: LD HL,FatBuffer.BPB_SERIAL_NUMBER + LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; - LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER - JR NZ,1F - LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_SERIAL_NUMBER -1: LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER - CALL .mCOPY_LOOP - ; - LD HL,CORE_BUFFERS.BootSector.BPB_LABEL - JR NZ,1F - LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_LABEL -1: LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL + LD HL,FatBuffer.BPB_LABEL + LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; fat32 EXX @@ -187,4 +192,4 @@ DISKINF: LD C,B LDIR RET ; -; +FAT_STRING: DB 'FAT12' diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index db4128c..a2bb9e3 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -20,17 +20,6 @@ ;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" ;--------------------------------------------------------------- -;[BEGIN] -;//MODULE: FAT_X -;//CREATE: 19-05-1998 AUTHOR: Denis Parinov -;//UPDATE: 24-10-1999 DNS Restore module -;--------------------------------------------------------------- -;Rev Date Name Description -;--------------------------------------------------------------- -;RX01 10-02-1999 DNS UPGRADE FAT CASH -;--------------------------------------------------------------- - - ;----------------------------------------------------------------------; ; HL - 11 bytes filename "FILENAMEEXT" ; DE - DOS filename "FILENAME.EXT",0 diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 417f7ba..fa82eb8 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -405,7 +405,7 @@ BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size -BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector +BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector разной длины EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer @@ -414,12 +414,13 @@ SECBUF EQU BUFFER ;!TODO CLEAR_ZONE.size EQU _sBuffers ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" - ;DISPLAY "--- --- --- --- --- --- --- ---" - ;DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector - ;DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector - ;DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF - ;DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector - ;DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "--- --- --- --- --- --- --- ---" + DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector + DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector + DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF + DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "--- --- --- --- --- --- --- ---" /* diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 56dd5cc..95976eb 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -5,9 +5,9 @@ ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- -;RX01 10-02-1999 DNS UPGRADE FAT CASH +;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION +;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;--------------------------------------------------------------- - ;----------------------------------------------------------------------; ; Поиск записи каталога в списке каталога ; @@ -69,7 +69,7 @@ SEARCH: ; LD D,XH LD E,XL - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index ; EXX ; PUSH DE ; EXX @@ -79,7 +79,7 @@ SEARCH: EX DE,HL LD BC,HANDBUF.SIZE LDIR - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index POP DE ; EX AF,AF' @@ -88,7 +88,7 @@ SEARCH: AND A RET .next_record: - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index ; EXX ; INC DE ; EXX @@ -555,7 +555,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ; ;LD IX,DIRPAGE.buffer LD HL,DIRPAGE.buffer - ;!TEST 9/11/23 record index + ;!TEST 9/11/23 record index ; EXX ; LD DE,0 ; EXX @@ -611,267 +611,278 @@ WRT_HND: SET_PAGE_X DIRPAGE ; RET Z -; рег. D - номер диска +; рег. A - номер диска ; [ ] fat32 -RD_BPB: LD C,SLOT3 - IN B,(C) - PUSH BC - IN A,(SLOT0) - OUT (SLOT3),A - LD A,(FatBuffer.DRIVE) - 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 +RD_BPB: LD C,SLOT3 + IN B,(C) + PUSH BC + IN A,(SLOT0) + OUT (SLOT3),A + LD A,(FatBuffer.DRIVE) + 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 + ; + LD DE,#AA55 ; сигнатура ;R05 + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + ;R05 + AND A + SBC HL,DE + JP NZ,DOS_X_Error.UnknownBPB + ; + ; ;R08 ; [x] fat32 + ; LD HL,CORE_BUFFERS.SECBUF + ; LD DE,CORE_BUFFERS.BootSector + ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size + ; LDIR + ; + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + JP C,DOS_X_Error.UnknownBPB + ; calc. first sector FAT + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) + ; + ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec + ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) + ; ADD HL,DE + ; + ;!FIXIT для fat32 втыкать сюда сектора активной таблицы + LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ;[ ] fat32 + XOR A + LD B,A + LD C,A + LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (FatBuffer.RootDirStartCluster_L),BC ; [ ] fat32 + LD (FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 + LD (FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + LD (FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables + LD (FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 + ; + ; + LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16) + LD A,E + OR D + JR NZ,.skip_high + ; + LD BC,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32+4) + LD (FatBuffer.SectorsPerFAT_H),BC + LD DE,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32) +.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE + ; + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs + CP 1 + JR Z,.one_FAT + DEC A + ADD HL,DE + LD (FatBuffer.FAT2_SEC_L),HL + JR NC,.no_inc_BC + INC BC +.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC +.one_FAT: ;C_DATA1 +.loop1: ADD HL,DE + JR NC,.loop1_1 + INC BC +.loop1_1: DEC A + JR NZ,.loop1 + ; + LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD DE,#AA55 ; сигнатура ;R05 - LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 - ;R05 - AND A - SBC HL,DE - JP NZ,DOS_X_Error.UnknownBPB - ;R08 - LD HL,CORE_BUFFERS.SECBUF - LD DE,CORE_BUFFERS.BootSector - LD BC,_sBOOT_SECTOR_PARAMS ; size - LDIR - ; - LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) - CP #F0 - JP C,DOS_X_Error.UnknownBPB - ; 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.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 - ;[ ] fat32 ;!FIXIT - XOR A - LD D,A - LD E,A - LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 - LD (FatBuffer.RootDirStartCluster_L),DE - LD (FatBuffer.RootDirStartCluster_H),DE - LD (FatBuffer.SectorsPerFAT_H),A - ; - ; - LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) - LD (FatBuffer.SectorsPerFAT_L),DE - ; - LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs - CP 1 - JR Z,.loop1 - DEC A - ADD HL,DE - LD (FatBuffer.FAT2_SEC_L),HL -;C_DATA1 -.loop1: ADD HL,DE - DEC A - JR NZ,.loop1 - ; - 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 BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.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 + ;;;; + IF COMPILE_UNUSED_CODE + LD (FatBuffer.FilesPerSector),A + ENDIF + ; + EX DE,HL + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.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.DirSizeInSectors),A + + ADD HL,BC ; Start DATA area + LD (FatBuffer.FirstDataSector_L),HL + ; B = 0 + ; + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + ;!TODO FATcacheSize + ; calc. cluster size + XOR 1 + JR Z,.loop3.end + RRA +.loop3: ADD HL,HL + RRA + JP NC,.loop3 +.loop3.end: ; + LD (FatBuffer.BytesPerCluster),HL + ; IF COMPILE_UNUSED_CODE - LD (FatBuffer.FilesPerSector),A + EX DE,HL + LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize + XOR A + ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится +.loop4: INC A + JP Z,DOS_X_Error.UnknownBPB + SBC HL,DE + JR NC,.loop4 + LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) ENDIF - ; - EX DE,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.DirSizeInSectors),A - ADD HL,BC ; Start DATA area - LD (FatBuffer.FirstDataSector_L),HL - ; B = 0 - ; - LD HL,(CORE_BUFFERS.BootSector.BytesPerSector) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - ;!TODO FATcacheSize - ; calc. cluster size - XOR 1 - JR Z,.loop3.end - RRA -.loop3: ADD HL,HL - RRA - JP NC,.loop3 -.loop3.end: - ; - LD (FatBuffer.BytesPerCluster),HL - IF COMPILE_UNUSED_CODE - EX DE,HL - LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize - XOR A -;NEXTAD4 ;!FIXIT оптимизировать когда понадобится -.loop4: INC A - JP Z,DOS_X_Error.UnknownBPB - SBC HL,DE - JR NC,.loop4 - LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) - ENDIF - ; - ;!TODO detect fat type by clusters! - ;[ ] fat32 reset fat32 variables - LD HL,0 - LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FatBuffer.MaxClusterHigh),HL - ; - LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага - LD DE,FatBuffer.MSG - LD B,3 -;R_BPBL1 -.loop5: LD A,(DE) - CP (HL) - JP NZ,.IBM_DOS - INC HL - INC DE - DJNZ .loop5 -;FID -.loop6: LD A,(HL) - INC HL - CP ' ' - JR Z,.loop6 - ; - CP '1' - ;[ ] fat32 - JP Z,.fat1x - CP '3' - JP NZ,DOS_X_Error.UnknownBPB - LD A,#46 ; #46-#26 = 32 fat type - LD HL,#0FFF - LD (FatBuffer.ENDCLUS_HIGH),HL - LD (FatBuffer.MaxClusterHigh),HL - LD H,L - JR .BPB_FAT - ; -.fat1x: LD A,(HL) - CP '2' ; FAT16 - LD HL,#0FFF - JR Z,.BPB_FAT - CP '6' ; FAT12 - JP NZ,DOS_X_Error.UnknownBPB - LD H,L -.BPB_FAT: - SUB #26 ; A-#26 = fat type (12, 16, 32) - LD (FatBuffer.FAT_TYPE),A - LD (FatBuffer.ENDCLUS_LOW),HL + ; + ;!TODO detect fat type by clusters! + ; [ ] fat32 + LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FAT16.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага + LD DE,FAT_STRING + LD B,3 + ;R_BPBL1 +.loop5: LD A,(DE) + CP (HL) + JP NZ,.IBM_DOS + INC HL + INC DE + DJNZ .loop5 + ;FID +.loop6: LD A,(HL) + INC HL + CP ' ' + JR Z,.loop6 + ; + CP '1' + ;[ ] fat32 + JP Z,.fat1x + CP '3' + JP NZ,DOS_X_Error.UnknownBPB + LD A,#52 ; #52-#20 = #32 fat type + LD HL,#0FFF + LD (FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT + LD H,L + JR .BPB_FAT + ; +.fat1x: LD A,(HL) + CP '2' ; FAT16 + LD HL,#0FFF + JR Z,.BPB_FAT + CP '6' ; FAT12 + JP NZ,DOS_X_Error.UnknownBPB + LD H,L +.BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) + LD (FatBuffer.FAT_TYPE),A + LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// -; 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 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 //////////////////////////////////////////////////////////////////////// - ; [ ] fat32 - LD HL,(CORE_BUFFERS.BootSector.SectorsPerDrive) - LD DE,(FatBuffer.FirstDataSector_L) - LD A,H - OR L - JP NZ,.HDDSMAL - ; - LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_L) - LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_H) - AND A - SBC HL,DE - JP NC,.HDDBIG - DEC BC - JP .HDDBIG - ; -.HDDSMAL:; CF = 0 - SBC HL,DE - LD BC,0 -.HDDBIG: LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) - SCF -.S4C01: RRA - JR C,.S4C02 - RR B - RR C - RR H - RR L - JP .S4C01 -.S4C02: INC HL - LD (FatBuffer.MaxClusterLow),HL - ; - XOR A - LD H,A - LD L,A - LD (FatBuffer.CacheBlock),HL - LD (FatBuffer.CacheUpdated),A + ; [ ] fat32 + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive) + LD DE,(FatBuffer.FirstDataSector_L) + LD A,H + OR L + JP NZ,.HDDSMAL + ; + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L) + LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H) + AND A + SBC HL,DE + JP NC,.HDDBIG + DEC BC + JP .HDDBIG + ; +.HDDSMAL: ; CF = 0 + SBC HL,DE + LD BC,0 +.HDDBIG: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + SCF +.S4C01: RRA + JR C,.S4C02 + RR B + RR C + RR H + RR L + JP .S4C01 +.S4C02: INC HL + LD (FatBuffer.MaxClusterLow),HL + ; + XOR A + LD H,A + LD L,A + LD (FatBuffer.CacheBlock),HL + LD (FatBuffer.CacheUpdated),A SET_PAGE_X FATPAGE - PUSH AF - ; [ ] fat32 - ; XOR A - ; HL = 0 - EX DE,HL - ; - 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.DRIVE_TYPE) - CP #F0 - JR C,DOS_X_Error.UnknownBPB - ; ID ram-диска - #FA - CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 - LD A,'2' - LD HL,#0FFF - JP NZ,.BPB_FAT - ; - LD A,'6' - LD H,L - JP .BPB_FAT - ; + PUSH AF + ; [ ] fat32 + ; XOR A + ; HL = 0 + EX DE,HL + ; + CALL READ_FAT_TABLE + POP AF + OUT (SLOT3),A + CALL R_CLUST + XOR A + RET + ;!TODO detect fat type by clusters! +.IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + JR C,DOS_X_Error.UnknownBPB + ; ID ram-диска - #FA + CP #F8 ; !FIXIT fat. не обязательно если винт, то не FAT12 + LD A,'2' + LD HL,#0FFF + JP NZ,.BPB_FAT + ; + LD A,'6' + LD H,L + JP .BPB_FAT + ; DOS_X_Error: -.UnknownBPB: - LD A,DSS_Error.sys.UNKNOWN_FORMAT - SCF - RET -.Not_ready: - LD A,DSS_Error.sys.NOT_READY - ; CF = 1 - RET +.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET + ; +.Not_ready: LD A,DSS_Error.sys.NOT_READY + ; CF = 1 + RET ; ; ;!TODO к буферам! FatBuffer: -.MSG: DB 'FAT' +;.MSG: DB 'FAT' .DRIVE: DB #FF .FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .CacheBlock: DW #00 @@ -885,16 +896,21 @@ FatBuffer: .FAT2_SEC_H: DW #0000 ; [ ] fat32 .SectorsPerFAT_L DW #0000 .SectorsPerFAT_H DB #00 -.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR +.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .DirSizeInSectors: DB #00 ; DIR_SEC_SIZE .FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low .FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига .BytesPerCluster: DW #0000 ; CLUSTER_LEN -.ENDCLUS_LOW: DW #FFFF -.ENDCLUS_HIGH: DW #0FFF ; [ ] fat3 +.END_CHAIN_CLUSTER_L: DW #FFFF +.END_CHAIN_CLUSTER_H: DW #0FFF ; [ ] fat3 .MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.) .MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.) +; +.BytesPerSector DW #0000 +.SectorsPerCluster DB #00 +.BPB_SERIAL_NUMBER DW 0,0 +.BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS IF COMPILE_UNUSED_CODE .FilesPerSector: DB #00 ; число файловых записей в секторе .ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index cc2fe84..91db79b 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -255,9 +255,9 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; номер кластера +WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера EXX - LD DE,(FatBuffer.ENDCLUS_HIGH) ; номер кластера + LD DE,(FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера EXX .Custom: PUSH DE EXX diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 9d14672..bdbb111 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -111,6 +111,7 @@ ;Input: C = #08 ; B = Subcommand ; DE = #55AA Magic Number +; A = Drive ; ;Subcommands: #00 - Get Device Parameters ; #01 - Read track diff --git a/DSS/Structures.inc b/DSS/Structures.inc index ca9cbe3..2f72d1f 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -75,12 +75,12 @@ ; STRUCT _sBuffers -.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 +.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) +.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; +.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 +.EXE_Header _sEXE_HEADER ; 512 bytes +.Stack _sStack ; 256 bytes +.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF +.MemoryTable BLOCK 256,0 ; 256 bytes ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index 397787a..9f02e1c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -949 \ No newline at end of file +952 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 1670edb..f380f5c 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -36,9 +36,9 @@ SERVICE_SECTORS: .FAT32.Low EQU #FFEF FAT_TYPE: -.x32 EQU 32 -.x16 EQU 16 -.x12 EQU 12 +.x32 EQU #32 +.x16 EQU #16 +.x12 EQU #12 ; define _bit (1