diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index f922407..d6e8802 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -47,49 +47,28 @@ DRIVE: _mSYSID RET C ; goto FAIL LD A,(DRIVE) BIT 7,A - JP Z,GOOD_DRIVE + JR Z,GOOD_DRIVE EX DE,HL LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка SBC HL,DE LD HL,MESSAGES.INCORR RET C ; goto FAIL - JP GOOD_DRIVE + ; +GOOD_DRIVE: LD DE,#8200 ;!HARDCODE + LD HL,0 + LD IX,2 + LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика + LD A,(DRIVE) + RST ToBIOS_18 + JP NC,CONTINUE + JR FAIL.NULL //////////////////////////////////////////////////////////////////////// FAIL: CALL MESSAGE .NULL: LD HL,MESSAGES.FAILURE CALL MESSAGE - DI - HALT JR $ ; - -; -; DOSMESS: CALL FMESAGE -; LD C,Dss.PChars -; RST ToDSS -; RET -; - -; -; FMESAGE: LD HL,MSG0 -; LD BC,MSGE-MSG0 -; INC A -; EX AF,AF' -; XOR A -; EX AF,AF' -; .NEXTMSG: EX AF,AF' -; CPIR -; RET PO -; RET NZ -; EX AF,AF' -; DEC A -; JR NZ,.NEXTMSG -; RET -; - -; -MESSAGE: ;CALL FMESAGE - ;R01 Start +MESSAGE: ;R01 Start XOR A OUT (SYS_PORT.ON),A .loop: LD A,(HL) ;R01 @@ -124,9 +103,11 @@ PRINTX: CP "\r" ; LD DE,#0020 LD BC,1*256 + BIOS.LP_SCROLL_UD RST ToBIOS_18 + ; LD DE,#1F00 LD C,BIOS.LP_SET_PLACE RST ToBIOS_18 + ; LD A," " LD BC,#50 + BIOS.LP_PRINT_SYM RST ToBIOS_18 @@ -139,56 +120,30 @@ PRINTX: CP "\r" ; RET ;R01 ;R01 End -; FAILURE EQU 0 -; INCORR EQU 1 -; ERRPART EQU 2 -; ERRIBPB EQU 3 -; NO_SYS EQU 4 -; NOSHELL EQU 5 -; STARTDO EQU 6 -;a BIOS version that is incompatible with this version of DOS - MESSAGES:; 0 10 20 30 40 50 60 70 80 .FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0 -.INCORR: DB "\r\nUnsupported BIOS version! Update BIOS to run this version of DSS.\r\n",0 +.INCORR: DB "\r\nOld BIOS version.\r\n",0 .ERRPART: DB "\r\nUnknown partition table.",0 .ERRIBPB: DB "\r\nInvalid BOOT sector.",0 -.NO_SYS: DB "\r\nCan't open file SYSTEM.DOS...",0 -.NOSHELL: DB "\r\nCan't open file SYSTEM.EXE...",0 +.NO_SYS: DB "\r\nCan't open SYSTEM.DOS...",0 +.NOSHELL: DB "\r\nCan't open SYSTEM.EXE...",0 .STARTDO: DB "\r\nStarting DSS... \r\n\n",0 ; SHELL_NAME: DB '\SYSTEM.EXE /P',0 ROOT: DB 'X:\',0 CORE_NAME: DB "SYSTEM DOS" .Size EQU $-CORE_NAME -FATMSG: DB "FAT" -//////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////// ASSERT $<#8200, "Error!!! BIOS LOADING ONLY FIRST #200 BYTES" //////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////// -GOOD_DRIVE: LD DE,#8200 ;!HARDCODE - LD HL,0 - LD IX,2 - LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика - LD A,(DRIVE) - RST ToBIOS_18 - JP C,FAIL.NULL - ; - ; CONTINUE - LD HL,0 +CONTINUE: LD HL,0 LD (PARTITION_START_L),HL LD (PARTITION_START_H),HL ; LD BC,1*256 + BIOS.GetMem RST ToBIOS_18 ;GET PAGE FOR DOS - LD (BANKDOS),A + LD (LOAD_CORE.BANKDOS),A ; OUT (SLOT0),A ; @@ -196,6 +151,7 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,MESSAGES.ERRIBPB RET C ; goto FAIL CALL GETROOT + ; LD HL,MESSAGES.NO_SYS RET C ; goto FAIL ; [ ] загрузка system.dos больше #4000 байтов @@ -208,7 +164,7 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE SBC HL,DE JR NC,.set_no_size .set_size: LD A,#FF -.set_no_size: LD (BIG_CORE),A +.set_no_size: LD (LOAD_CORE.BIG_CORE),A OR A PUSH AF ; загрузка @@ -226,10 +182,10 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE JR C,.no_big_core ; IN A,(SLOT1) - LD (BANKDOS),A + LD (LOAD_CORE.BANKDOS),A LD A,SUBLOAD_SIZE LD (LOAD_CORE.max_sectors),A - LD (BIG_CORE),A ; теперь это счётчик оставшихся секторов + LD (LOAD_CORE.BIG_CORE),A ; теперь это счётчик оставшихся секторов ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов @@ -255,8 +211,6 @@ RUN_CORE: DI LD B,#1F ;1FFD OUT (C),A ; - ; LD A,(BANKDOS) - ; OUT (SLOT0),A ;DOS LOADED ;IF UNIVERSAL_BOOT ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого @@ -319,20 +273,6 @@ RUN_CORE: DI JP NZ,FAIL JP FAIL.NULL -; .NoShell: LD HL,MESSAGES.NOSHELL -; JP C,FAIL -; LD HL,MESSAGES.FAILURE -; JP FAIL - - -; XFAIL: CALL DOSMESS -; .fail: LD HL,MESSAGES.FAILURE -; CALL DOSMESS -; DI -; HALT -; .halt: JR .halt -; - ; INC_SECTOR_NUM: PUSH DE CALL CLUSTER_TO_SECTOR @@ -345,22 +285,14 @@ INC_SECTOR_NUM: PUSH DE LD BC,RUN_CORE PUSH BC PUSH HL ; для баланса - ;EXX PUSH HL ; для баланса - ;EXX JP LOAD_CORE.subload - -; CALL .set_stack -; JP RUN_CORE -; .set_stack: PUSH HL -; JP LOAD_CORE.subload ; ; PART_TB: PUSH BC LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 - ;AND A ; CF = 0 SBC HL,DE SCF @@ -368,21 +300,23 @@ PART_TB: PUSH BC LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; + LD HL,YEPDOS + PUSH HL .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) ; ЕСЛИ добавится поддержка ещё одного типа ФС, то поменять 1 на 2 ; 1 CP PartitionSysTypes.FAT16_LBA - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT16 - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT16_32Mb - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT12 - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT32 - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS CP PartitionSysTypes.FAT32_LBA - JR Z,YEPDOS + RET Z ;JR Z,YEPDOS ; ; 2 ;EXX @@ -416,8 +350,7 @@ PART_TB: PUSH BC ; .Size EQU $-SUPPORTED_PARTITIONS ; - - +; YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,#80 CP (IX + _sMBR_PARTITION_RECORD.isActive) @@ -426,13 +359,13 @@ YEPDOS: ;[ ] 17.12.2023 SUB B PUSH AF ; номер загрузочного раздела ; - LD E,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) - LD D,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) + LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) + LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) + PUSH HL + LD (PARTITION_START_L),HL LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3) - PUSH DE POP IX - LD (PARTITION_START_L),IX LD (PARTITION_START_H),HL LD A,(DRIVE) LD DE,BOOT_BUFFER @@ -443,7 +376,6 @@ YEPDOS: ;[ ] 17.12.2023 POP BC LD L,A ; номер загрузочного раздела LD A,C - ;LD A,C ; RET ; @@ -596,8 +528,18 @@ GET_BPB: LD IX,#0000 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;/* -GET_BPB: LD IX,#0000 - LD HL,#0000 +GET_BPB: LD HL,#0000 + ; + LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 ; fat32 + LD (FatBuffer.RootDirFirstSector_H),HL + ;LD (FatBuffer.CacheBlock),HL + XOR A + LD (FatBuffer.SectorsPerFAT_H),A ; fat32 + ; + PUSH HL + POP IX + ; LD IX,#0000 + ; LD HL,#0000 LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) @@ -625,58 +567,28 @@ GET_BPB: LD IX,#0000 LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) LD L,A POP AF - ;PUSH AF LD C,BIOS.DRV_SET_PAR RST ToBIOS_18 - ;POP BC - ;LD A,C ; нахера? - ;RET - + ; .NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 - AND A + ;AND A SBC HL,DE SCF RET NZ ; -;RD_BPB: ; CALL READ_BPB - ; JP C,DOS_X_Error.Not_ready - ; ; - ; LD DE,#AA55 ; сигнатура ;R05 - ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 - ; ;R05 - ; AND A - ; SBC HL,DE - ; JP NZ,DOS_X_Error.UnknownBPB - ; - ; ;R08 ; [x] fat32 - ; LD HL,BOOT_BUFFER - ; LD DE,BootSector - ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size - ; LDIR - ; LD A,(BOOT_BUFFER + BOOT_SECTOR.DRIVE_TYPE) CP #F0 RET C ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - LD (FatBuffer.BytesPerSector),HL LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD (FatBuffer.SectorsPerCluster),A ; calc. first sector FAT LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 - ; 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.RootDirFirstSector_H),BC - LD (FatBuffer.SectorsPerFAT_H),A ; fat32 - ; ; + LD BC,0 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D @@ -688,16 +600,14 @@ GET_BPB: LD IX,#0000 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) .skip_high: LD (FatBuffer.SectorsPerFAT_L),DE LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs - LD (FatBuffer.Number_Of_FATs),A 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 +.no_inc_BC: ; +.one_FAT: ; .loop1: ADD HL,DE JR NC,.loop1_1 INC BC @@ -706,7 +616,7 @@ GET_BPB: LD IX,#0000 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (FatBuffer.FirstDataSector_H),BC - LD BC,(FatBuffer.BytesPerSector) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD A,B AND A ; @@ -719,10 +629,6 @@ GET_BPB: LD IX,#0000 ; 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,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 @@ -748,10 +654,8 @@ GET_BPB: LD IX,#0000 LD (FatBuffer.FirstDataSector_L),HL ; B = 0 ; - LD HL,(FatBuffer.BytesPerSector) - ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) - LD A,(FatBuffer.SectorsPerCluster) - ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD A,(FatBuffer.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -762,47 +666,24 @@ GET_BPB: LD IX,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL - ; fat32 LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) - LD DE,(FatBuffer.FirstDataSector_L) + LD BC,0 LD A,H OR L JP NZ,.HDDSMAL ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) LD BC,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) +.HDDSMAL: ; PUSH BC ; Total Sectors high PUSH HL ; Total Sectors low - AND A - SBC HL,DE - JP NC,.HDDBIG - DEC BC - JP .HDDBIG - ; -.HDDSMAL: ; CF = 0 - LD BC,0 - PUSH BC ; Total Sectors high - PUSH HL ; Total Sectors low - SBC HL,DE - ; -.HDDBIG: CALL SectorToCluster - INC HL - LD (FatBuffer.MaxClusterLow),HL - LD A,L - OR H - JR NZ,.no_inc_bc - INC BC -.no_inc_bc: LD (FatBuffer.MaxClusterHigh),BC - ; XOR A - LD H,A - LD L,A - LD (FatBuffer.CacheBlock),HL - LD (FatBuffer.CacheUpdated),A + ;LD H,A + ;LD L,A + ;LD (FatBuffer.CacheBlock),HL ; A = 0 - LD HL,(FatBuffer.SectorsPerFAT_H) - LD H,A - EX DE,HL + LD DE,(FatBuffer.SectorsPerFAT_H) + LD D,A LD HL,(FatBuffer.SectorsPerFAT_L) ; DE:HL = SectorsPerFAT ; @@ -840,10 +721,31 @@ GET_BPB: LD IX,#0000 POP DE ; Total Sectors low ; HL:DE = DataSec ; - LD A,(FatBuffer.SectorsPerCluster) - ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + LD A,(FatBuffer.SectorsPerCluster) ; HL:DE / A => DE:BC, H=0, L - остаток - CALL DIV_for_SPC + ;CALL DIV_for_SPC + LD C,A + DEC A + JR Z,.DIV_exit + ; + AND E + LD B,A ; остаток + LD A,C + RRCA + ; +.DIV_loop: SRL H + RR L + RR D + RR E + RRCA + JP NC,.DIV_loop + LD A,B +.DIV_exit: LD B,D + LD C,E + EX DE,HL + LD H,0 + LD L,A + ; ; выясняем разрядность FAT LD A,D OR E @@ -851,29 +753,13 @@ GET_BPB: LD IX,#0000 ; LD HL,4084 SBC HL,BC - JR NC,.its_FAT12 + LD A,FAT_TYPE.x12 + JR NC,.SET_VARS ; LD HL,65525 SBC HL,BC - JR C,.its_FAT32 - ; - ; It's FAT16 - LD HL,#FFFF LD A,FAT_TYPE.x16 -.set_vars: EXX - LD HL,0 - LD (FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (FatBuffer.RootDirStartCluster_L),HL - LD (FatBuffer.RootDirStartCluster_H),HL - LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT.LABEL - EXX - LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) - LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) - JR .SET_VARS - ; -.its_FAT12: LD HL,#0FFF - LD A,FAT_TYPE.x12 - JR .set_vars + JR NC,.SET_VARS ; .its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber) CP #80 @@ -883,104 +769,62 @@ GET_BPB: LD IX,#0000 LD DE,(FatBuffer.SectorsPerFAT_H) LD D,0 EXX - LD HL,(FatBuffer.FAT1_SEC_L) - LD DE,(FatBuffer.SectorsPerFAT_L) - AND #0F - JR Z,.first_FAT_active - LD B,A + LD HL,(FatBuffer.FAT1_SEC_L) + LD DE,(FatBuffer.SectorsPerFAT_L) + AND #0F + JR Z,.first_FAT_active + LD B,A ; -.fat_calc_loop: ADD HL,DE +.fat_calc_loop: ADD HL,DE EXX - ADC HL,DE + ADC HL,DE EXX - DJNZ .fat_calc_loop + DJNZ .fat_calc_loop ; .first_FAT_active: - LD (FatBuffer.FAT1_SEC_L),HL - LD (FatBuffer.FAT2_SEC_L),HL + LD (FatBuffer.FAT1_SEC_L),HL EXX LD (FatBuffer.FAT1_SEC_H),HL - LD (FatBuffer.FAT2_SEC_H),HL - ; .mirrored_FATs: ; - LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT32.LABEL + LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) + LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + CALL CLUSTER_TO_SECTOR.no_prepare + LD (FatBuffer.RootDirFirstSector_L),IX + LD (FatBuffer.RootDirFirstSector_H),HL + LD A,FAT_TYPE.x32 ; - EXX - LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) - LD (FatBuffer.RootDirStartCluster_L),HL - LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) - LD (FatBuffer.RootDirStartCluster_H),DE - ; - CALL CLUSTER_TO_SECTOR.no_prepare - LD (FatBuffer.RootDirFirstSector_L),IX - LD (FatBuffer.RootDirFirstSector_H),HL - ; - LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) - LD (FatBuffer.FSINFO_Sector),HL - ; - LD A,FAT_TYPE.x32 - LD HL,#0FFF - LD (FatBuffer.END_CHAIN_CLUSTER_H),HL - LD H,L - LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) - LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) - ; -.SET_VARS: LD (FatBuffer.FAT_TYPE),A - LD (FatBuffer.END_CHAIN_CLUSTER_L),HL - LD (FatBuffer.BPB_SERIAL_NUMBER),DE - LD (FatBuffer.BPB_SERIAL_NUMBER+2),BC - EXX - LD DE,FatBuffer.BPB_LABEL - LD BC,11 ;!HARDCODE - LDIR +.SET_VARS: LD (FatBuffer.FAT_TYPE),A LD DE,0 CALL READ_FAT_TABLE AND A RET ; ;;;;;;;; - -; --> BC:HL - Sector -; <-- BC:HL - Cluster -SectorToCluster: - LD A,B - AND #0F - LD B,A - LD A,(FatBuffer.SectorsPerCluster) - ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) - SCF -.loop: RRA - RET C - RR B - RR C - RR H - RR L - JP .loop ; ; HL:DE / A => DE:BC, H=0, L - остаток -DIV_for_SPC: - LD C,A - DEC A - JR Z,.exit - ; - AND E - LD B,A ; остаток - LD A,C - RRCA - ; -.loop: SRL H - RR L - RR D - RR E - RRCA - JP NC,.loop - LD A,B -.exit: LD B,D - LD C,E - EX DE,HL - LD H,0 - LD L,A - RET +; DIV_for_SPC: +; LD C,A +; DEC A +; JR Z,.DIV_exit +; ; +; AND E +; LD B,A ; остаток +; LD A,C +; RRCA +; ; +; .DIV_loop: SRL H +; RR L +; RR D +; RR E +; RRCA +; JP NC,.DIV_loop +; LD A,B +; .DIV_exit: LD B,D +; LD C,E +; EX DE,HL +; LD H,0 +; LD L,A +; RET ; ;NSECTOR: ; in: HL':HL - CLUSTER @@ -1009,11 +853,11 @@ CLUSTER_TO_SECTOR: RL D ; RRA - JP NC,.loop + JR NC,.loop ; .skip: EX DE,HL - LD XL,E - LD XH,D + PUSH DE + POP IX LD DE,(FatBuffer.FirstDataSector_L) ADD IX,DE LD DE,(FatBuffer.FirstDataSector_H) @@ -1038,8 +882,10 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер файлов на FAT32 .NEXTSEC: PUSH AF ADD IX,BC - ADC HL,DE - ;HL:IX + JR NC,.skip_inc + INC HL + ;ADC HL,DE +.skip_inc: ;HL:IX PUSH IX PUSH HL LD BC,1*256 + BIOS.DRV_READ @@ -1053,19 +899,17 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) RET C RET NZ LD A,B - LD DE,0 + ;LD DE,0 LD BC,1 DEC A JR NZ,.NEXTSEC SCF RET ; - -; SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD - ADD IX,DE +.SKIPNAM_DE: ADD IX,DE DEC C RET Z ; @@ -1075,11 +919,11 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 RET Z ; CP #E5 - JR Z,.SKIPNAM + JR Z,.SKIPNAM_DE ; LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) AND FAT_ATTR.DIRECTORY - JR NZ,.SKIPNAM + JR NZ,.SKIPNAM_DE ; LD DE,CORE_NAME PUSH IX @@ -1131,7 +975,7 @@ LOAD_CORE: LD (READMEM),DE .subload: LD A,(.max_sectors) LD B,A LD C,BIOS.DRV_READ_LONG - LD A,(BANKDOS) + LD A,(LOAD_CORE.BANKDOS) EX AF,AF' LD A,(DRIVE) RST ToBIOS_18 @@ -1140,12 +984,11 @@ LOAD_CORE: LD (READMEM),DE POP HL EXX POP HL - ;AND A RET ; .SMALL_CLUSTER: LD B,A LD C,BIOS.DRV_READ_LONG - LD A,(BANKDOS) +.BANKDOS+1: LD A,0 EX AF,AF' LD A,(DRIVE) RST ToBIOS_18 @@ -1161,9 +1004,10 @@ LOAD_CORE: LD (READMEM),DE CCF RET NC ; [ ] загрузка system.dos больше #4000 байтов - LD A,(BIG_CORE) + +.BIG_CORE+1: LD A,0 DEC A - LD (BIG_CORE),A + LD (.BIG_CORE),A RET Z ; CALL READ_FROM_FAT @@ -1306,9 +1150,7 @@ NSECTOR: LD DE,0 ; если DE':DE = 0, то кластер HL':HL свободен ; CF - конец цепочки ;------------------------------------------------------------------------------------------------ -READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER - RET C - PUSH HL +READ_FROM_FAT: PUSH HL ; IN A,(SLOT3) PUSH AF @@ -1433,8 +1275,6 @@ GET_FAT12_CELL: LD D,H ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH - ; CP C LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A @@ -1451,7 +1291,6 @@ GET_FAT12_CELL: LD D,H ;выход: HL - адрес нужной ячейки в странице FATPAGE GET_FAT16_CELL: LD A,H LD B,H - ;AND #0F AND FAT_CACHE.Size_Mask_16 LD H,A LD A,B @@ -1464,8 +1303,6 @@ GET_FAT16_CELL: LD A,H ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH - ; CP C LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A @@ -1513,32 +1350,6 @@ GET_FAT32_CELL: ; ADD HL,DE ; на ячейку FAT RET ; -; [x] fat32 ;!TEST -; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster -; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) -CHECK_CLUSTER_IS_SMALLER: - LD A,(FatBuffer.FAT_TYPE) - XOR FAT_TYPE.x32 - JR NZ,.low ; Z=0 проверяем младшее слово номера кластера - ; проверяем старшее слово номера кластера - EXX - EX DE,HL - LD HL,(FatBuffer.MaxClusterHigh) - ; CF = 0 - SBC HL,DE - EX DE,HL - EXX - LD A,DSS_Error.sys.DISK_FULL - RET C - RET NZ - ; проверяем младшее слово номера кластера -.low: EX DE,HL - LD HL,(FatBuffer.MaxClusterLow) - SBC HL,DE - EX DE,HL - LD A,DSS_Error.sys.DISK_FULL - RET - ; /* ;----------------- ; HL - CLUSTER @@ -1677,12 +1488,14 @@ READ_FAT_TABLE: PUSH HL ; BC:HL - номер лог.сектора LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE - EX DE,HL - LD XH,D - LD XL,E + ; + ; EX DE,HL + ; LD XH,D + ; LD XL,E + PUSH HL + POP IX + ; LD HL,(FatBuffer.FAT1_SEC_H) - ; JR NC,.no_inc - ; INC HL .no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING ; @@ -1691,10 +1504,11 @@ READ_FAT_TABLE: PUSH HL LD DE,(PARTITION_START_H) ADC HL,DE LD DE,FAT_SECTORS_BUFFER - IN A,(SLOT3) - PUSH AF - LD A,SHARED_PAGE - OUT (SLOT3),A + ; + IN A,(SLOT3) + PUSH AF + LD A,SHARED_PAGE + OUT (SLOT3),A ; LD A,(FatBuffer.FAT_TYPE) XOR FAT_TYPE.x32 @@ -1704,8 +1518,8 @@ READ_FAT_TABLE: PUSH HL .next: LD A,(DRIVE) RST ToBIOS_18 ; - POP AF - OUT (SLOT3),A + POP AF + OUT (SLOT3),A POP HL RET ; @@ -1810,29 +1624,15 @@ FatBuffer EQU VALUE HANDBUF EQU VALUE + _sysFatBuffer FCLUSTER_H EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H -; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME -; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE FCLUSTR_L EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 PARTITION_START_H EQU FSIZE1+2 PARTITION_START_L EQU PARTITION_START_H+2 READMEM EQU PARTITION_START_L+2 -BIG_CORE EQU READMEM+2 -BANKDOS EQU BIG_CORE+1 -;SHEL_FM EQU VALUE+54 -; EQU VALUE+56 +;BIG_CORE EQU READMEM+2 -;----------------- -; BLOCK #8600-$-3,0 -; DB 'SPT' -; BIGA EQU (($/256)+1)*256 -; BIGA2 EQU BIGA-$-2 -; DS BIGA2 -; DB "dp" -; E______ -;STACK EQU (($/256)+2)*256 DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER diff --git a/BOOT/boot.asm b/BOOT/boot.asm index db16b5a..326d357 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -19,18 +19,18 @@ ; ; STRUCT _sysFatBuffer -.DRIVE: BYTE #FF +;.DRIVE: BYTE #FF .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32 .CacheBlock: WORD #0000 -.CacheUpdated: BYTE #00 +;.CacheUpdated: BYTE #00 ;.SectorsPerBank: BYTE #00 -.RootDirStartCluster_L: WORD #0000 -.RootDirStartCluster_H: WORD #0000 ; fat32 +;.RootDirStartCluster_L: WORD #0000 +;.RootDirStartCluster_H: WORD #0000 ; fat32 .FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) .FAT1_SEC_H: WORD #0000 ; fat32 -.FAT2_SEC_L: WORD #0000 -.FAT2_SEC_H: WORD #0000 ; fat32 -.Number_Of_FATs BYTE #02 +;.FAT2_SEC_L: WORD #0000 +;.FAT2_SEC_H: WORD #0000 ; fat32 +;.Number_Of_FATs BYTE #02 .SectorsPerFAT_L WORD #0000 .SectorsPerFAT_H BYTE #00 .RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR @@ -39,15 +39,15 @@ .FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low .FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high .BytesPerCluster: WORD #0000 ; CLUSTER_LEN -.END_CHAIN_CLUSTER_L: WORD #FFFF -.END_CHAIN_CLUSTER_H: WORD #0FFF -.MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.) -.MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.) -.BytesPerSector: WORD #0000 +;.END_CHAIN_CLUSTER_L: WORD #FFFF +;.END_CHAIN_CLUSTER_H: WORD #0FFF +;.MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.) +;.MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.) +;.BytesPerSector: WORD #0000 .SectorsPerCluster: BYTE #00 -.FSINFO_Sector: WORD #01 -.BPB_SERIAL_NUMBER: DWORD #00000000 -.BPB_LABEL: BLOCK 11,' ' ; 11 для FAT, 31 для CDFS +;.FSINFO_Sector: WORD #01 +;.BPB_SERIAL_NUMBER: DWORD #00000000 +;.BPB_LABEL: BLOCK 11,' ' ; 11 для FAT, 31 для CDFS ;.UPD_FSINFO: BYTE 0 ;.FREE_CLUSTERS_COUNT_L: WORD #FFFF ;.FREE_CLUSTERS_COUNT_H: WORD #FFFF @@ -77,7 +77,7 @@ BYTE ' Anatoliy ' BYTE ' Belyanskiy. ' BYTE ' Sprinter Team, ' - BYTE ' 2023 ' + BYTE ' 2024 ' ENDM diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 64844b3..92f79ab 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -19,6 +19,7 @@ CLOSE_FN: RET NZ BIT 7,(IY+_sFM.ACCESS_MODE) JR Z,.NOTMODF + ; LD E,(IY+_sFM.DIR_CLUSTER_L) LD D,(IY+_sFM.DIR_CLUSTER_L+1) PUSH DE @@ -81,7 +82,5 @@ CLOSE_FN: CALL SAVEDIR .NOTMODF: LD A,(.TMP) - ;CALL RES_FM JP RES_FM - ;RET ; \ No newline at end of file diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 851fa33..3a075e5 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -158,10 +158,10 @@ SEARCH: OR A JR Z,.error_file_not_found CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены - JR Z,.next_record + JR Z,.next_record_DE LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) AND C - JR NZ,.next_record + JR NZ,.next_record_DE LD HL,MASKARE LD D,XH LD E,XL @@ -199,12 +199,13 @@ SEARCH: AND A RET .next_record: + LD DE,FAT_DIRECTORY_RECORD +.next_record_DE: ;!TEST 9/11/23 record index ; EXX ; INC DE ; EXX ; - LD DE,FAT_DIRECTORY_RECORD ADD IX,DE JR NC,.loop .error_too_many_files: diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM index 5ff6b09..3bae86b 100644 --- a/DSS/VIDEO.ASM +++ b/DSS/VIDEO.ASM @@ -98,6 +98,7 @@ PUTCHAR: RET Z DEC E JP LOCATE + ; .LF_: CALL CURSOR LD A,D CP #1F