📄 testlcd.lst
字号:
732 0113 MOVW R2,R6
733 0124 MOVW R4,R8
734 940E 1943 CALL 0x1943
(0051) }
736 C036 RJMP 0x076D
(0052) else //FAT16或者FAT12文件系统
(0053) {
(0054) BlockSize=bootp->BPB_BytesPerSec; //获取每扇区字节数目
737 01F5 MOVW R30,R10
738 940E 19E0 CALL 0x19E0
(0055) if(bootp->BPB_SysID[4] == '2') //根据扩展FAT12/FAT16的系统ID部分,判断
73A AD82 LDD R24,Z+58
73B 3382 CPI R24,0x32
73C F421 BNE 0x0741
(0056) FatFlags = FAT_Flg_12; //FAT12
73D 2422 CLR R2
73E 9220 00C1 STS FatFlags,R2
740 C003 RJMP 0x0744
(0057) else
(0058) FatFlags = FAT_Flg_16; //FAT16
741 E081 LDI R24,1
742 9380 00C1 STS FatFlags,R24
(0059) fat_offset = bootp->BPB_RsvdSecCnt + VBRadd;
744 01F5 MOVW R30,R10
745 940E 184C CALL 0x184C
(0060) //根目录区(FDT)的起始扇区号=保留扇区+FAT占用扇区:
(0061) FirstRootDirSecNum=VBRadd+(bootp->BPB_RsvdSecCnt+(bootp->BPB_NumFATs*bootp->BPB_FATSz16));
747 8926 LDD R18,Z+22
748 8937 LDD R19,Z+23
749 8900 LDD R16,Z+16
74A 2711 CLR R17
74B 940E 1650 CALL empy16s
74D 01F5 MOVW R30,R10
74E 8426 LDD R2,Z+14
74F 8437 LDD R3,Z+15
750 0E20 ADD R2,R16
751 1E31 ADC R3,R17
752 0126 MOVW R4,R12
753 0C42 ADD R4,R2
754 1C53 ADC R5,R3
755 0112 MOVW R2,R4
756 2444 CLR R4
757 2455 CLR R5
758 9230 00B7 STS FirstRootDirSecNum+1,R3
75A 9220 00B6 STS FirstRootDirSecNum,R2
75C 9250 00B9 STS FirstRootDirSecNum+3,R5
75E 9240 00B8 STS FirstRootDirSecNum+2,R4
(0062) SecPerClus = bootp->BPB_SecPerClus; //每个簇占用的扇区数目,SD卡应为8
760 8425 LDD R2,Z+13
761 9220 00BC STS SecPerClus,R2
(0063) //数据区的起始扇区数,FAT16/FAT12的根目录,一般占用32个扇区的大小:
(0064) data_offset = FirstRootDirSecNum + 32;
763 E240 LDI R20,0x20
764 E050 LDI R21,0
765 E060 LDI R22,0
766 E070 LDI R23,0
767 940E 1900 CALL 0x1900
769 940E 198D CALL 0x198D
76B 940E 1943 CALL 0x1943
(0065) }
(0066) return(FirstRootDirSecNum); //返回根目录区的起始扇区号
76D 9120 00B8 LDS R18,FirstRootDirSecNum+2
76F 9130 00B9 LDS R19,FirstRootDirSecNum+3
771 9100 00B6 LDS R16,FirstRootDirSecNum
773 9110 00B7 LDS R17,FirstRootDirSecNum+1
775 9622 ADIW R28,2
776 940C 1693 JMP pop_xgsetF0FC
_fat_load:
Tmp --> Y,+6
FAT_Block_Addresse --> Y,+2
FAT_Byte_Addresse --> R14
TMP_Buffer --> R12
Block --> R10
Cluster --> Y,+20
778 940E 18D6 CALL 0x18D6
77A 972A SBIW R28,0xA
77B 8CA8 LDD R10,Y+24
77C 8CB9 LDD R11,Y+25
77D 8CCA LDD R12,Y+26
77E 8CDB LDD R13,Y+27
(0067) }
(0068)
(0069) //############################################################################
(0070) //解析FAT链表
(0071) void fat_load(unsigned long Cluster, //文件起始扇区
(0072) unsigned long *Block, //返回文件下一扇区
(0073) unsigned char *TMP_Buffer) //函数所需buffer
(0074) //############################################################################
(0075) {
(0076) unsigned int FAT_Byte_Addresse;
(0077) unsigned long FAT_Block_Addresse;
(0078)
(0079) //读取FAT表,根据FAT制式搜寻扇区
(0080) if(FatFlags == FAT_Flg_16)
77F 9180 00C1 LDS R24,FatFlags
781 3081 CPI R24,1
782 F009 BEQ 0x0784
783 C041 RJMP 0x07C5
(0081) {
(0082) if(Cluster == 0xFFFF)
784 940E 1A4B CALL 0x1A4B
786 940E 1818 CALL 0x1818
788 940E 17E4 CALL 0x17E4
78A F409 BNE 0x078C
(0083) {
(0084) return; //文件已经到达末尾
78B C15C RJMP 0x08E8
(0085) }
(0086) FAT_Byte_Addresse = ((Cluster<<1) & 0x1FF);
78C EF4F LDI R20,0xFF
78D E051 LDI R21,1
78E E060 LDI R22,0
78F E070 LDI R23,0
790 940E 1818 CALL 0x1818
792 0C22 LSL R2
793 1C33 ROL R3
794 1C44 ROL R4
795 1C55 ROL R5
796 940E 1913 CALL 0x1913
798 0171 MOVW R14,R2
799 940E 1992 CALL 0x1992
79B 940E 187C CALL 0x187C
79D 940E 19F1 CALL 0x19F1
79F 940E 17B6 CALL 0x17B6
(0087) FAT_Block_Addresse = ((Cluster<<1)/BlockSize) + fat_offset;
7A1 940E 15DA CALL div32u
7A3 0118 MOVW R2,R16
7A4 0129 MOVW R4,R18
7A5 9080 00C8 LDS R8,fat_offset+2
7A7 9090 00C9 LDS R9,fat_offset+3
7A9 9060 00C6 LDS R6,fat_offset
7AB 9070 00C7 LDS R7,fat_offset+1
7AD 940E 17DF CALL 0x17DF
7AF 940E 18B6 CALL 0x18B6
7B1 940E 1832 CALL 0x1832
7B3 940E 1881 CALL 0x1881
7B5 940E 1909 CALL 0x1909
(0088) MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
(0089) *Block = (TMP_Buffer[FAT_Byte_Addresse + 1] << 8) + TMP_Buffer[FAT_Byte_Addresse];
7B7 8030 LDD R3,Z+0
7B8 940E 17E9 CALL 0x17E9
7BA 940E 1A4B CALL 0x1A4B
7BC 940E 17E4 CALL 0x17E4
(0090) if(*Block == 0xFFFF)
7BE F009 BEQ 0x07C0
7BF C128 RJMP 0x08E8
(0091) *Block = 0xFFFFFFFF;
7C0 940E 183B CALL 0x183B
7C2 940E 19C7 CALL 0x19C7
(0092) }
7C4 C123 RJMP 0x08E8
(0093) else if(FatFlags == FAT_Flg_12)
7C5 9020 00C1 LDS R2,FatFlags
7C7 2022 TST R2
7C8 F009 BEQ 0x07CA
7C9 C0A8 RJMP 0x0872
(0094) {
(0095) if(Cluster == 0xFFF)
7CA 940E 1A55 CALL 0x1A55
7CC 940E 1818 CALL 0x1818
7CE 940E 17E4 CALL 0x17E4
7D0 F409 BNE 0x07D2
(0096) {
(0097) return; //文件已经到达末尾
7D1 C116 RJMP 0x08E8
(0098) }
(0099) FAT_Byte_Addresse = (((Cluster*3)>>1) & 0x1FF);
7D2 940E 1818 CALL 0x1818
7D4 E043 LDI R20,3
7D5 E050 LDI R21,0
7D6 E060 LDI R22,0
7D7 940E 17A4 CALL 0x17A4
7D9 0118 MOVW R2,R16
7DA 0129 MOVW R4,R18
7DB 9456 LSR R5
7DC 9447 ROR R4
7DD 9437 ROR R3
7DE 9427 ROR R2
7DF 940E 18F6 CALL 0x18F6
7E1 940E 1818 CALL 0x1818
(0100) FAT_Block_Addresse = (((Cluster*3)>>1) / BlockSize) + fat_offset;
7E3 E043 LDI R20,3
7E4 E050 LDI R21,0
7E5 E060 LDI R22,0
7E6 940E 17A4 CALL 0x17A4
7E8 940E 1A7D CALL 0x1A7D
7EA 940E 1992 CALL 0x1992
7EC 940E 17B6 CALL 0x17B6
7EE 940E 15DA CALL div32u
7F0 0118 MOVW R2,R16
7F1 0129 MOVW R4,R18
7F2 9080 00C8 LDS R8,fat_offset+2
7F4 9090 00C9 LDS R9,fat_offset+3
7F6 9060 00C6 LDS R6,fat_offset
7F8 9070 00C7 LDS R7,fat_offset+1
7FA 940E 17DF CALL 0x17DF
7FC 940E 18B6 CALL 0x18B6
(0101) if(FAT_Byte_Addresse == 0x1FF)
7FE 01C7 MOVW R24,R14
7FF 3F8F CPI R24,0xFF
800 E0A1 LDI R26,1
801 079A CPC R25,R26
802 F009 BEQ 0x0804
803 C040 RJMP 0x0844
(0102) {
(0103) MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
804 940E 1832 CALL 0x1832
806 940E 1818 CALL 0x1818
(0104) if((Cluster % 2) == 0)
808 2D02 MOV R16,R2
809 7001 ANDI R16,1
80A F459 BNE 0x0816
80B 940E 1881 CALL 0x1881
(0105) {
(0106) *Block = TMP_Buffer[FAT_Byte_Addresse];
80D 2433 CLR R3
80E 2444 CLR R4
80F 2455 CLR R5
810 01F5 MOVW R30,R10
811 8220 STD Z+0,R2
812 8231 STD Z+1,R3
813 8242 STD Z+2,R4
814 8253 STD Z+3,R5
(0107) }
815 C004 RJMP 0x081A
(0108) else
(0109) {
(0110) *Block = (TMP_Buffer[FAT_Byte_Addresse] >> 4);
816 940E 1869 CALL 0x1869
818 940E 17E9 CALL 0x17E9
(0111) }
(0112) MMC_SD_ReadSingleBlock(FAT_Block_Addresse+1,TMP_Buffer);
81A 82D9 STD Y+1,R13
81B 82C8 STD Y+0,R12
81C 940E 19EC CALL 0x19EC
81E 940E 1847 CALL 0x1847
820 0F04 ADD R16,R20
821 1F15 ADC R17,R21
822 1F26 ADC R18,R22
823 1F37 ADC R19,R23
824 940E 14AB CALL _MMC_SD_ReadSingleBlock
826 940E 1818 CALL 0x1818
(0113) if((Cluster % 2) == 0)
828 2D02 MOV R16,R2
829 7001 ANDI R16,1
82A F469 BNE 0x0838
(0114) {
(0115) *Block += ((TMP_Buffer[0] & 0x0F) << 8);
82B 01F6 MOVW R30,R12
82C 8180 LDD R24,Z+0
82D 2799 CLR R25
82E 708F ANDI R24,0xF
82F 7090 ANDI R25,0
830 2F98 MOV R25,R24
831 2788 CLR R24
832 011C MOVW R2,R24
833 940E 1811 CALL 0x1811
835 940E 185B CALL 0x185B
(0116) }
837 C02C RJMP 0x0864
(0117) else
(0118) {
(0119) *Block += (TMP_Buffer[0] << 4);
838 01F6 MOVW R30,R12
839 8020 LDD R2,Z+0
83A 2433 CLR R3
83B 940E 18E1 CALL 0x18E1
83D 940E 18E1 CALL 0x18E1
83F 940E 1811 CALL 0x1811
841 940E 185B CALL 0x185B
(0120) }
(0121) }
843 C020 RJMP 0x0864
(0122) else
(0123) {
(0124) MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
844 940E 1832 CALL 0x1832
846 940E 1818 CALL 0x1818
(0125) if((Cluster % 2) == 0)
848 2D02 MOV R16,R2
849 7001 ANDI R16,1
84A F451 BNE 0x0855
84B 940E 1881 CALL 0x1881
84D 940E 1909 CALL 0x1909
(0126) {
(0127) *Block = ((TMP_Buffer[FAT_Byte_Addresse + 1] & 0x0F) << 8) + TMP_Buffer[FAT_Byte_Addresse];
84F 8180 LDD R24,Z+0
850 708F ANDI R24,0xF
851 2E38 MOV R3,R24
852 940E 17E9 CALL 0x17E9
(0128) }
854 C00F RJMP 0x0864
(0129) else
(0130) {
(0131) *Block = (TMP_Buffer[FAT_Byte_Addresse + 1] << 4) + (TMP_Buffer[FAT_Byte_Addresse] >> 4);
855 940E 1869 CALL 0x1869
857 940E 1909 CALL 0x1909
859 8040 LDD R4,Z+0
85A 2455 CLR R5
85B 940E 1983 CALL 0x1983
85D 940E 1983 CALL 0x1983
85F 0C42 ADD R4,R2
860 1C53 ADC R5,R3
861 0112 MOVW R2,R4
862 940E 17E9 CALL 0x17E9
(0132) }
(0133) }
(0134) if(*Block == 0xFFF)
864 940E 1A55 CALL 0x1A55
866 01F5 MOVW R30,R10
867 940E 1A73 CALL 0x1A73
869 940E 17E4 CALL 0x17E4
86B F009 BEQ 0x086D
86C C07B RJMP 0x08E8
(0135) *Block = 0xFFFFFFFF;
86D 940E 183B CALL 0x183B
86F 940E 19C7 CALL 0x19C7
(0136) }
871 C076 RJMP 0x08E8
(0137) else if(FatFlags == FAT_Flg_32)
872 9180 00C1 LDS R24,FatFlags
874 3082 CPI R24,2
875 F009 BEQ 0x0877
876 C071 RJMP 0x08E8
(0138) {
(0139) unsigned long Tmp;
(0140) Tmp=Cluster/128;
877 E087 LDI R24,7
878 E090 LDI R25,0
879 940E 187C CALL 0x187C
87B 938A ST R24,-Y
87C 940E 1705 CALL lsr32
87E 830E STD Y+6,R16
87F 831F STD Y+7,R17
880 8728 STD Y+8,R18
881 8739 STD Y+9,R19
882 940E 183B CALL 0x183B
884 940E 1818 CALL 0x1818
886 940E 17E4 CALL 0x17E4
(0141) if(Cluster == 0xFFFFFFFF)
888 F431 BNE 0x088F
889 940E 183B CALL 0x183B
(0142) {
(0143) *Block = 0xFFFFFFFF;
88B 01F5 MOVW R30,R10
88C 940E 19C7 CALL 0x19C7
(0144) return; //文件已经到达末尾
88E C059 RJMP 0x08E8
(0145) }
(0146)
(0147) FAT_Byte_Addresse = (Cluster*4)%512;
88F E082 LDI R24,2
890 E090 LDI R25,0
891 940E 187C CALL 0x187C
893 938A ST R24,-Y
894 940E 16FB CALL lsl32
896 0118 MOVW R2,R16
897 0129 MOVW R4,R18
898 940E 18F6 CALL 0x18F6
(0148) FAT_Block_Addresse = Tmp + fat_offset ;
89A 9040 00C8 LDS R4,fat_offset+2
89C 9050 00C9 LDS R5,fat_offset+3
89E 9020 00C6 LDS R2,fat_offset
8A0 9030 00C7 LDS R3,fat_offset+1
8A2 940E 1AA0 CALL 0x1AA0
8A4 940E 1877 CALL 0x1877
8A6 826A STD Y+2,R6
8A7 827B STD Y+3,R7
8A8 828C STD Y+4,R8
8A9 829D STD Y+5,R9
8AA 940E 1832 CALL 0x1832
(0149)
(0150) MMC_SD_ReadSingleBlock (FAT_Block_Addresse,TMP_Buffer);
(0151) //测试使用:
(0152) //DisplayHexNum(1,1,TMP_Buffer[FAT_Byte_Addresse+3]);
(0153) //DisplayHexNum(2,1,TMP_Buffer[FAT_Byte_Addresse+2]);
(0154) //DisplayHexNum(3,1,TMP_Buffer[FAT_Byte_Addresse+1]);
(0155) //DisplayHexNum(4,1,TMP_Buffer[FAT_Byte_Addresse]);
(0156) //Delay(1000);
(0157) //
(0158) *Block = (TMP_Buffer[FAT_Byte_Addresse+3]*(unsigned long)16777216) +
8AC 01F7 MOVW R30,R14
8AD 9632 ADIW R30,2
8AE 940E 1890 CALL 0x1890
8B0 E040 LDI R20,0
8B1 E050 LDI R21,0
8B2 E061 LDI R22,1
8B3 940E 17A4 CALL 0x17A4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -