📄 u_func_b.lst
字号:
503 3 if(CtnsNum*32==FDTBuf.FDTNum) //如果找到足够的FDT
504 3 {
505 4 temp_ofst=j*32;
506 4 break;
507 4 }
508 3 }
509 2 if(j<16) //如果是因为找到足够的FDT而跳出上一个循环
510 2 {
511 3 SectOfst=i;
512 3 break;
513 3 }
514 2 }
515 1 if(i==sect_clust_a) return; //如果没找到空FDT
516 1 for(i=0;i<CtnsNum;i++)
517 1 {
518 2 for(j=0;j<32;j++)
519 2 {
520 3 *(pt+temp_ofst+j)=FDTBuf.Buf[32*i+j];
521 3 }
522 2 if(temp_ofst==0)
523 2 {
524 3 Wr_Sector_a(root_a+SectOfst);
525 3 SectOfst--;
526 3 Rd_Sector_a(root_a+SectOfst);
527 3 temp_ofst=480;
528 3 }
529 2 else temp_ofst-=32;
530 2 }
531 1 Wr_Sector_a(root_a+SectOfst);
532 1 }
533
534 unsigned long WrFAT_a(unsigned char file_num)
535 {
536 1 unsigned char xdata *pt;
537 1 unsigned char SectFirst,SectChange;
538 1 UINT32 data ClustNum;
539 1 UINT32 temp_clust;
540 1 struct{
C51 COMPILER V8.02 U_FUNC_B 07/21/2008 09:40:01 PAGE 10
541 1 unsigned long SectOfst;
542 1 unsigned int ByteOfst;
543 1 }c1,c2;
544 1 unsigned long data i;
545 1 unsigned char data j;
546 1 unsigned long fat_a,ChangeClust=0,SumClust,FirstClust=0;
547 1 pt=Data_Buf;
*** WARNING C182 IN LINE 547 OF U_FUNC_B.C: pointer to different objects
548 1
549 1 SumClust=Fat[file_num].Big.value/(512*sect_clust_a)+1;
550 1 fat_a=hidd_sect_a+resv_sect_a;
551 1 for(i=0;i<sect_fat_a;i++)
552 1 {
553 2 Rd_Sector_a(fat_a+i);
554 2 SectFirst=1;
555 2 SectChange=0;
556 2 for(j=0;j<128;j++)
557 2 {
558 3 ClustNum.num[3]=*(pt+j*4);
559 3 ClustNum.num[2]=*(pt+j*4+1);
560 3 ClustNum.num[1]=*(pt+j*4+2);
561 3 ClustNum.num[0]=*(pt+j*4+3);
562 3 if(ClustNum.value==0) //是否为空
563 3 {
564 4 SectChange=1;
565 4 if(FirstClust==0)
566 4 {
567 5 FirstClust=j+128*i; //首簇号
568 5 c1.SectOfst=i;
569 5 c1.ByteOfst=j*4;
570 5 c2.SectOfst=i;
571 5 c2.ByteOfst=j*4;
572 5 SectFirst=0;
573 5 }
574 4 else
575 4 {
576 5 c2.SectOfst=i;
577 5 c2.ByteOfst=j*4;
578 5 temp_clust.value=j+128*i; //c2指向的簇号
579 5 if(SectFirst==1) //若为此扇区的第一空簇
580 5 {
581 6 Rd_Sector_a(fat_a+c1.SectOfst);
582 6 *(pt+c1.ByteOfst)=temp_clust.num[3];
583 6 *(pt+c1.ByteOfst+1)=temp_clust.num[2];
584 6 *(pt+c1.ByteOfst+2)=temp_clust.num[1];
585 6 *(pt+c1.ByteOfst+3)=temp_clust.num[0];
586 6 Wr_Sector_a(fat_a+c1.SectOfst);
587 6 Wr_Sector_a(fat_a+sect_fat_a+c1.SectOfst); //写FAT2
588 6 Rd_Sector_a(fat_a+c2.SectOfst);
589 6 c1=c2;
590 6 SectFirst=0;
591 6 }
592 5 else
593 5 {
594 6 *(pt+c1.ByteOfst)=temp_clust.num[3];
595 6 *(pt+c1.ByteOfst+1)=temp_clust.num[2];
596 6 *(pt+c1.ByteOfst+2)=temp_clust.num[1];
597 6 *(pt+c1.ByteOfst+3)=temp_clust.num[0];
598 6 c1=c2;
599 6 }
600 5 }
601 4 ChangeClust++;
C51 COMPILER V8.02 U_FUNC_B 07/21/2008 09:40:01 PAGE 11
602 4 if(ChangeClust>=SumClust)
603 4 {
604 5 *(pt+c2.ByteOfst)=0xff;
605 5 *(pt+c2.ByteOfst+1)=0xff;
606 5 *(pt+c2.ByteOfst+2)=0xff;
607 5 *(pt+c2.ByteOfst+3)=0x0f;
608 5 break;
609 5 }
610 4 }
611 3 }
612 2 if(SectChange==1)
613 2 {
614 3 Wr_Sector_a(fat_a+i);//此扇区修改完毕,写入,注:最后一空簇可能未写
615 3 Wr_Sector_a(fat_a+sect_fat_a+c1.SectOfst); //写FAT2
616 3 if(ChangeClust>=SumClust) return FirstClust;
617 3 }
618 2 }
619 1 }
620
621 unsigned char ReadBB(unsigned char file_num)
622 {
623 1 static unsigned char data TempSectOfstBB;
624 1 unsigned char xdata *Fpt;
625 1 unsigned int data temp_ofst;
626 1 static unsigned long data BaseSectBB,SumSectorBB,SectorBB=0;
627 1 Fpt=FATBufB;
628 1 if(SectorBB==0)
629 1 {
630 2 ClusterB.NextClust.value=Fat[file_num].St_Clust.value;
631 2 SumSectorBB=Fat[file_num].Big.value/512+1;
632 2 }
633 1 if(SectorBB<=SumSectorBB)
634 1 {
635 2
636 2 if(SectorBB%sect_clust_b==0)
637 2 {
638 3
639 3 if(ClusterB.NextClust.value/128!=ClusterB.CurrtClust/128||SectorBB==0)
640 3 {
641 4 ClusterB.CurrtClust=ClusterB.NextClust.value;
642 4 Rd_FAT_b(ClusterB.NextClust.value/128+resv_sect_b+hidd_sect_b);
643 4 }
644 3 else
645 3 {
646 4 ClusterB.CurrtClust=ClusterB.NextClust.value;
647 4 }
648 3 temp_ofst=(ClusterB.CurrtClust%128)*4;
649 3 ClusterB.NextClust.num[3]=*(Fpt+temp_ofst);
650 3 ClusterB.NextClust.num[2]=*(Fpt+temp_ofst+1);
651 3 ClusterB.NextClust.num[1]=*(Fpt+temp_ofst+2);
652 3 ClusterB.NextClust.num[0]=*(Fpt+temp_ofst+3);
653 3 BaseSectBB=(ClusterB.CurrtClust-2)*sect_clust_b+root_b;
654 3 TempSectOfstBB=0;
655 3 }
656 2 Rd_Sector_b(BaseSectBB+TempSectOfstBB); //读一扇区
657 2 TempSectOfstBB++;
658 2 SectorBB++;
659 2 }
660 1 if(SectorBB>=SumSectorBB)
661 1 {
662 2 SectorBB=0;
663 2 return 0x00;
C51 COMPILER V8.02 U_FUNC_B 07/21/2008 09:40:01 PAGE 12
664 2 }
665 1 else return 0xff;
666 1 }
667
668 unsigned char WriteBA(unsigned long FirstClust,unsigned char file_num) //BA表示B为主盘,对A操作
669 {
670 1 static unsigned char data TempSectOfstBA;
671 1 unsigned char xdata *Fpt;
672 1 unsigned int data temp_ofst;
673 1 static unsigned long data SectorBA=0,SumSectorBA,BaseSectBA;
674 1 Fpt=FATBufA;
675 1 if(SectorBA==0)
676 1 {
677 2 ClusterA.NextClust.value=FirstClust;
678 2 SumSectorBA=Fat[file_num].Big.value/512+1;
679 2 }
680 1 if(SectorBA<=SumSectorBA)
681 1 {
682 2
683 2 if(SectorBA%sect_clust_a==0)
684 2 {
685 3
686 3 if(ClusterA.NextClust.value/128!=ClusterA.CurrtClust/128||SectorBA==0)
687 3 {
688 4 ClusterA.CurrtClust=ClusterA.NextClust.value;
689 4 Rd_FAT_a(ClusterA.NextClust.value/128+resv_sect_a+hidd_sect_a);
690 4 }
691 3 else
692 3 {
693 4 ClusterA.CurrtClust=ClusterA.NextClust.value;
694 4 }
695 3 temp_ofst=(ClusterA.CurrtClust%128)*4;
696 3 ClusterA.NextClust.num[3]=*(Fpt+temp_ofst);
697 3 ClusterA.NextClust.num[2]=*(Fpt+temp_ofst+1);
698 3 ClusterA.NextClust.num[1]=*(Fpt+temp_ofst+2);
699 3 ClusterA.NextClust.num[0]=*(Fpt+temp_ofst+3);
700 3 BaseSectBA=(ClusterA.CurrtClust-2)*sect_clust_a+root_a;
701 3 TempSectOfstBA=0;
702 3 }
703 2 Wr_Sector_a(BaseSectBA+TempSectOfstBA); //读一扇区
704 2 TempSectOfstBA++;
705 2 SectorBA++;
706 2 }
707 1 if(SectorBA>=SumSectorBA)
708 1 {
709 2 SectorBA=0;
710 2 return 0x00;
711 2 }
712 1 else return 0xff;
713 1 }
714
715
716
717 unsigned char Rd_FAT_b(unsigned long LBA)
718 {
719 1 unsigned char sta,i,j,Next_Num=0;
720 1 unsigned char xdata *pt;
721 1 sta=0x1f;
722 1 pt=FATBufB;
723 1 CH375HM_INDEX_WR_b( DISK_READ ); //从USB存储器读数据块
724 1 CH375HM_DATA_WR_b( (unsigned char)LBA ); //LBA的最低8位
725 1 CH375HM_DATA_WR_b( (unsigned char)( LBA >> 8 ) );
C51 COMPILER V8.02 U_FUNC_B 07/21/2008 09:40:01 PAGE 13
726 1 CH375HM_DATA_WR_b( (unsigned char)( LBA >> 16 ) );
727 1 CH375HM_DATA_WR_b( (unsigned char)( LBA >> 24 ) ); //LBA的最高8位
728 1 CH375HM_DATA_WR_b( 1 ); //扇区数
729 1 Delay();
730 1 for(i=0;i<9;i++)
731 1 {
732 2 sta=Wait_Int_b();
733 2 if(sta==0x1f||sta==0x14) return sta;
734 2 CH375HM_INDEX_WR_b(RD_USB_DATA);
735 2 Next_Num=CH375HM_DATA_RD_b();
736 2 for(j=0;j<Next_Num;j++)
737 2 {
738 3 *pt=CH375HM_DATA_RD_b();
739 3 pt++;
740 3 }
741 2 CH375HM_INDEX_WR_b(DISK_RD_GO);
742 2 }
743 1 return 0xff;
744 1 }
745
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 7545 ----
CONSTANT SIZE = 59 ----
XDATA SIZE = ---- 164
PDATA SIZE = ---- ----
DATA SIZE = 26 15
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 9 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -