📄 fat.lst
字号:
605 5 p = rootclusters[index].cluster + p;
606 5 break;
607 5 }
608 4 else
609 4 {
610 5 p -= rootclusters[index].number;
611 5 }
612 4 }
613 3 p = CFatData.dwClu2Startlba + (p - 2)* (U32)CFatData.bSectorsPerClu;
614 3
615 3 for(;FileData.wCurFDBNo < (U16)CFatData.bSectorsPerClu * CFatData.wBytesPerSec / DIREntrySize;)
616 3 {
617 4 if(!flag)
618 4 {
619 5 DMA_load_sector(p + FileData.wCurFDBNo * DIREntrySize / CFatData.wBytesPerSec, 0x06);
620 5 flag = 1;
621 5 }
622 4 if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute != 0x0F)
623 4 &&((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute & ARCHIVE_DIR) == A
-RCHIVE_DIR))
624 4 {
625 5 if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] == (S8)' ')
626 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] == (S8)' ')
627 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] == (S8)' ')
628 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)'F')
629 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[1] == (S8)'J')
630 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[2] == (S8)' ')
631 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[3] == (S8)' ')
632 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[4] == (S8)' ')
633 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[5] == (S8)' ')
634 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[6] == (S8)' ')
635 5 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[7] == (S8)' '))
636 5 {
637 6 SendChar(0xB5);
638 6 return;
639 6 }
640 5 else
641 5 {
642 6 FileData.wCurFDBNo++;
643 6 if(!(FileData.wCurFDBNo & 0x0F))
644 6 flag = 0;
C51 COMPILER V8.08 FAT 07/28/2007 11:42:16 PAGE 12
645 6 }
646 5 }
647 4 else
648 4 {
649 5 FileData.wCurFDBNo++;
650 5 if(!(FileData.wCurFDBNo & 0x0F))
651 5 flag = 0;
652 5 }
653 4 }
654 3 FileData.wCurFDBNo = 0;
655 3 FileData.dwCurCluNo++;
656 3 }
657 2 //return KO;
658 2 }
659 1 else
660 1 {
661 2 //FAT16
662 2 FileData.wCurFDBNo = 0;
663 2 for(;FileData.wCurFDBNo < (U16)FileData.RootDirNum;)
664 2 {
665 3 if(!flag)
666 3 {
667 4 DMA_load_sector(CFatData.dwRootStartlba + (FileData.wCurFDBNo / CFatData.bFDBNumInSec), 0x06);
668 4 flag = 1;
669 4 }
670 3 if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute != 0x0F)
671 3 &&((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute & ARCHIVE_DIR) == ARC
-HIVE_DIR))
672 3 {
673 4 if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] == (S8)' ')
674 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] == (S8)' ')
675 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] == (S8)' ')
676 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)'F')
677 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[1] == (S8)'J')
678 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[2] == (S8)' ')
679 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[3] == (S8)' ')
680 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[4] == (S8)' ')
681 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[5] == (S8)' ')
682 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[6] == (S8)' ')
683 4 &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[7] == (S8)' '))
684 4 {
685 5 SendChar(0xB6);
686 5 return;
687 5 }
688 4 else
689 4 {
690 5 FileData.wCurFDBNo++;
691 5 if(!(FileData.wCurFDBNo & 0x0F))
692 5 flag = 0;
693 5 }
694 4 }
695 3 else
696 3 {
697 4 FileData.wCurFDBNo++;
698 4 if(!(FileData.wCurFDBNo & 0x0F))
699 4 flag = 0;
700 4 }
701 3 }
702 2 }
703 1 SendChar(0xB7);
704 1
705 1 //在FAT中搜索未分配的簇
C51 COMPILER V8.08 FAT 07/28/2007 11:42:16 PAGE 13
706 1 varAl.TmpLong = 2;
707 1 flag = 0;
708 1 for(;;)
709 1 {
710 2 if(!flag)
711 2 {
712 3 p = (varAl.TmpLong << FATTab.bShiftBits)/ (U32)CFatData.wBytesPerSec;
713 3 p += CFatData.dwFatTabStartlba;
714 3 position = p;
715 3 DMA_load_sector(p, 0x06);
716 3 flag = 1;
717 3 }
718 2 p = CharToLong((U8 xdata *)(0xF000 +((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF)))& CFatData.d
-wMask;
719 2 if(!p)
720 2 {
721 3 if(CFatData.fFAT32)
722 3 LongToChar((U8 xdata *)(0xF000 +((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF)), CFatData
-.dwMask);
723 3 else
724 3 IntToChar((U8 xdata *)(0xF000 +((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF)), CFatData.dwM
-ask);
725 3 DMA_write_sector(position, 0x06);
726 3 break;
727 3 }
728 2 else
729 2 {
730 3 varAl.TmpLong++;
731 3 if(varAl.TmpLong > (0xFFFFFFFE & CFatData.dwMask))
732 3 {
733 4 SendChar(0xA5);
734 4 return;
735 4 }
736 3 else
737 3 {
738 4 if(!((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF))
739 4 flag = 0;
740 4 }
741 3 }
742 2 }
743 1 SendChar(0xA6);
744 1
745 1 //在根目录中创建新的文件夹
746 1 flag = 0;
747 1 if(CFatData.fFAT32)
748 1 {
749 2 //FAT32
750 2 FileData.dwCurCluNo = 0;
751 2 FileData.wCurFDBNo = 0;
752 2 for(;FileData.dwCurCluNo < FileData.RootDirNum;)
753 2 {
754 3 p = FileData.dwCurCluNo;
755 3 for(index = 0; index < MAX_FILE_FRAGMENT_NUMBER; index++)
756 3 {
757 4 if(p < rootclusters[index].number)
758 4 {
759 5 p = rootclusters[index].cluster + p;
760 5 break;
761 5 }
762 4 else
763 4 {
764 5 p -= rootclusters[index].number;
C51 COMPILER V8.08 FAT 07/28/2007 11:42:16 PAGE 14
765 5 }
766 4 }
767 3 p = CFatData.dwClu2Startlba + (p - 2)* (U32)CFatData.bSectorsPerClu;
768 3
769 3 for(;FileData.wCurFDBNo < (U16)CFatData.bSectorsPerClu * CFatData.wBytesPerSec / DIREntrySize;)
770 3 {
771 4 if(!flag)
772 4 {
773 5 position = p + FileData.wCurFDBNo * DIREntrySize / CFatData.wBytesPerSec;
774 5 DMA_load_sector(position, 0x06);
775 5 flag = 1;
776 5 }
777 4 if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)DIR_Unused)
778 4 ||(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)DIR_Deleted))
779 4 {
780 5 //在根目录中写入文件夹名
781 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] = (S8)' ';
782 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] = (S8)' ';
783 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] = (S8)' ';
784 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] = (S8)'F';
785 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[1] = (S8)'J';
786 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[2] = (S8)' ';
787 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[3] = (S8)' ';
788 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[4] = (S8)' ';
789 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[5] = (S8)' ';
790 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[6] = (S8)' ';
791 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[7] = (S8)' ';
792 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute = ARCHIVE_DIR;
793 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[0] = 0x08;
794 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[1] = 0x2A;
795 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[2] = 0x2E;
796 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[3] = 0x5A;
797 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[4] = 0x2D;
798 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[5] = 0x35;
799 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[6] = 0x39;
800 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[7] = 0x35;
801 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusHI = LE16((U16)(varAl.TmpLo
-ng >> 16));
802 5 ((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Time = 0x5A2E;
803 5 ((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Date = 0x352D;
804 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusLO = LE16((U16)varAl.TmpLon
-g);
805 5 ((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileSize = 0;
806 5 DMA_write_sector(position, 0x06);
807 5
808 5 //写子目录父目录索引, 并至少清除一簇
809 5 p = CFatData.dwClu2Startlba + (varAl.TmpLong - 2)* (U32)CFatData.bSectorsPerClu;
810 5 //DMA_load_sector(p, 0x06);
811 5 for(index = 0; index < CFatData.bSectorsPerClu; index++)
812 5 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -