diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 60c13f0..54c0231 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -683,6 +683,8 @@ GET_BPB: XOR A .mirrored_FATs: ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (FatBuffer.RootDirStartCluster_L),HL + LD (FatBuffer.RootDirStartCluster_H),DE CALL CLUSTER_TO_SECTOR.no_prepare LD (FatBuffer.RootDirFirstSector_L),IX LD (FatBuffer.RootDirFirstSector_H),HL @@ -739,21 +741,49 @@ CLUSTER_TO_SECTOR: ; поиск system.dos -GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) - LD IX,(FatBuffer.RootDirFirstSector_L) - LD BC,(PARTITION_START_L) - LD DE,(PARTITION_START_H) - ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. - ADD IX,BC - ADC HL,DE - ; +GETROOT: LD HL,(FatBuffer.RootDirStartCluster_L) + PUSH HL + LD HL,(FatBuffer.RootDirStartCluster_H) + PUSH HL LD A,(FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 LD A,(FatBuffer.DirSizeInSectors) - JR NZ,.NEXTSEC + JR NZ,.load_and_search ; LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32 -.NEXTSEC: PUSH AF +.load_and_search: + LD HL,(FatBuffer.RootDirFirstSector_H) + LD IX,(FatBuffer.RootDirFirstSector_L) + ;LD BC,(PARTITION_START_L) + ;LD DE,(PARTITION_START_H) + ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. + ;ADD IX,BC + ;ADC HL,DE + ; +.NEXT_CLUSTER: CALL GET_ABSOLUTE_SECTOR + CALL .NEXT_SECTOR + ; + POP HL + EXX + POP HL + RET C + RET NZ + CALL READ_FROM_FAT + RET C + EX DE,HL + PUSH HL + EXX + EX DE,HL + PUSH HL + EXX + ; in: HL':HL - CLUSTER + ; out: HL:IX - SECTOR + CALL CLUSTER_TO_SECTOR + LD A,(FatBuffer.SectorsPerCluster) + JR .NEXT_CLUSTER + ; + ; +.NEXT_SECTOR: PUSH AF ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov. ;ADD IX,BC ;ADC HL,DE @@ -779,10 +809,22 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) DEC HL ; DEC A - JR NZ,.NEXTSEC - SCF + JR NZ,.NEXT_SECTOR + RET + ; +; ; ; + +; вход: HL:IX - относительный сектор +; выход: HL:IX - абсолютный сектор +GET_ABSOLUTE_SECTOR: + LD DE,(PARTITION_START_L) + ADD IX,DE + LD DE,(PARTITION_START_H) + ADC HL,DE RET ; + + SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD @@ -838,11 +880,12 @@ LOAD_CORE: LD (READMEM),DE ;LD A,(FatBuffer.FAT_TYPE) ; CP FAT_TYPE.x32 ; JR NZ,.skip_it - ; - LD DE,(PARTITION_START_L) - ADD IX,DE - LD DE,(PARTITION_START_H) - ADC HL,DE + ; + ;LD DE,(PARTITION_START_L) + ;ADD IX,DE + ;LD DE,(PARTITION_START_H) + ;ADC HL,DE + CALL GET_ABSOLUTE_SECTOR ;.skip_it: ; LD DE,(READMEM) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) @@ -881,7 +924,6 @@ LOAD_CORE: LD (READMEM),DE CCF RET NC ; [ ] загрузка system.dos больше #4000 байтов - .BIG_CORE+1: LD A,0 DEC A LD (.BIG_CORE),A @@ -1049,10 +1091,12 @@ READ_FAT_TABLE: PUSH HL .no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING ; - LD DE,(PARTITION_START_L) - ADD IX,DE - LD DE,(PARTITION_START_H) - ADC HL,DE + ;LD DE,(PARTITION_START_L) + ;ADD IX,DE + ;LD DE,(PARTITION_START_H) + ;ADC HL,DE + CALL GET_ABSOLUTE_SECTOR + ; LD DE,FAT_SECTORS_BUFFER ; IN A,(SLOT3) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 77fc142..12a388e 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -26,8 +26,8 @@ .CacheBlock: WORD #0000 ;.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 diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 16f4265..a33e30c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -493,36 +493,36 @@ EVALSTR: ld a,(hl) ; !! Не делать одну команду > 256 символов)) !! ; ; BAT-команды (не отделять от дос-команд) -BATLIST: DZ 'PAUSE' : DW cmd_pause - DZ 'REM' : DW cmd_rem - DZ 'EXIT' : DW cmd_break +BATLIST: DZ 'PAUSE' : DW cmd_pause + DZ 'REM' : DW cmd_rem + DZ 'EXIT' : DW cmd_break ; - ; DSS-команды -CMDLIST: DZ 'CD' : DW cmd_chdir - DZ 'DIR' : DW cmd_dir - DZ 'ECHO' : DW cmd_echo - DZ 'ECHO.' : DW cmd_echoLN - DZ 'PATH' : DW cmd_path - DZ 'MD' : DW cmd_mkdir - DZ 'REN' : DW cmd_rename - DZ 'DEL' : DW cmd_del - DZ 'RD' : DW cmd_rmdir - DZ 'INFO' : DW cmd_info - DZ 'SET' : DW cmd_set - DZ 'TIME' : DW cmd_time - DZ 'DATE' : DW cmd_date - DZ 'VER' : DW cmd_version - DZ 'CLS' : DW cmd_cls - DZ 'CHDIR' : DW cmd_chdir - DZ 'MKDIR' : DW cmd_mkdir - DZ 'RENAME' : DW cmd_rename - DZ 'ERASE' : DW cmd_del - DZ 'RMDIR' : DW cmd_rmdir - DZ 'HELP' : DW cmd_help - DZ 'VERSION' : DW cmd_version - DZ 'EXIT' : DW cmd_exit - DZ 'REBOOT' : DW cmd_reboot - DB #00 + ; DSS-команды +CMDLIST: DZ 'CD' : DW cmd_chdir + DZ 'DIR' : DW cmd_dir + DZ 'ECHO' : DW cmd_echo + DZ 'ECHO.' : DW cmd_echoLN + DZ 'PATH' : DW cmd_path + DZ 'MD' : DW cmd_mkdir + DZ 'REN' : DW cmd_rename + DZ 'DEL' : DW cmd_del + DZ 'RD' : DW cmd_rmdir + DZ 'INFO' : DW cmd_info + DZ 'SET' : DW cmd_set + DZ 'TIME' : DW cmd_time + DZ 'DATE' : DW cmd_date + DZ 'VER' : DW cmd_version + DZ 'CLS' : DW cmd_cls + DZ 'CHDIR' : DW cmd_chdir + DZ 'MKDIR' : DW cmd_mkdir + DZ 'RENAME' : DW cmd_rename + DZ 'ERASE' : DW cmd_del + DZ 'RMDIR' : DW cmd_rmdir + DZ 'HELP' : DW cmd_help + DZ 'VERSION' : DW cmd_version + DZ 'EXIT' : DW cmd_exit + DZ 'REBOOT' : DW cmd_reboot + DB #00 IZERO DB "ZERO",0