📄 testlcd.lst
字号:
8B5 0118 MOVW R2,R16
8B6 0129 MOVW R4,R18
8B7 01F7 MOVW R30,R14
8B8 9633 ADIW R30,3
8B9 0DEC ADD R30,R12
8BA 1DFD ADC R31,R13
8BB 8060 LDD R6,Z+0
8BC 2477 CLR R7
8BD 2488 CLR R8
8BE 2499 CLR R9
8BF E040 LDI R20,0
8C0 E050 LDI R21,0
8C1 E060 LDI R22,0
8C2 E071 LDI R23,1
8C3 929A ST R9,-Y
8C4 928A ST R8,-Y
8C5 927A ST R7,-Y
8C6 926A ST R6,-Y
8C7 018A MOVW R16,R20
8C8 019B MOVW R18,R22
8C9 940E 1660 CALL empy32s
8CB 0138 MOVW R6,R16
8CC 0149 MOVW R8,R18
8CD 940E 1877 CALL 0x1877
8CF 01F7 MOVW R30,R14
8D0 9631 ADIW R30,1
8D1 940E 1890 CALL 0x1890
8D3 E040 LDI R20,0
8D4 E051 LDI R21,1
8D5 E060 LDI R22,0
8D6 940E 17A4 CALL 0x17A4
8D8 0E60 ADD R6,R16
8D9 1E71 ADC R7,R17
8DA 1E82 ADC R8,R18
8DB 1E93 ADC R9,R19
8DC 940E 1881 CALL 0x1881
8DE 2433 CLR R3
8DF 2444 CLR R4
8E0 2455 CLR R5
8E1 940E 1877 CALL 0x1877
8E3 01F5 MOVW R30,R10
8E4 8260 STD Z+0,R6
8E5 8271 STD Z+1,R7
8E6 8282 STD Z+2,R8
8E7 8293 STD Z+3,R9
(0159) (TMP_Buffer[FAT_Byte_Addresse+2]*(unsigned long)65536) +
(0160) (TMP_Buffer[FAT_Byte_Addresse+1]*(unsigned long)256) +
(0161) TMP_Buffer[FAT_Byte_Addresse];
(0162) }
(0163) return;
8E8 962A ADIW R28,0xA
8E9 940E 1693 CALL pop_xgsetF0FC
8EB 9624 ADIW R28,4
8EC 9508 RET
_fat_read_dir_ent:
Block --> Y,+6
blk --> Y,+2
TMP_Entry_Count --> R10
a --> R14
dir --> R12
buff --> Y,+30
Dir_Attrib --> Y,+28
Size --> Y,+26
Entry_Count --> Y,+24
dir_cluster --> Y,+20
8ED 940E 18D6 CALL 0x18D6
8EF 972A SBIW R28,0xA
(0164) }
(0165)
(0166) //############################################################################
(0167) //读取文件目录区FDT相关信息,错误的时候返回0xffffffff,目录搜索完毕,返回0xFFFFFFFE
(0168) unsigned long fat_read_dir_ent(unsigned long dir_cluster,//目录所在簇
(0169) unsigned int Entry_Count, //目录中文件序号
(0170) unsigned long *Size, //文件长度
(0171) unsigned char *Dir_Attrib, //文件属性
(0172) unsigned char *buff) //函数所需buffer
(0173) //############################################################################
(0174) {
(0175) unsigned int TMP_Entry_Count = 0;
8F0 24AA CLR R10
8F1 24BB CLR R11
8F2 940E 19B3 CALL 0x19B3
(0176) unsigned long Block=0; //目录所在扇区地址
8F4 834E STD Y+6,R20
8F5 835F STD Y+7,R21
8F6 8768 STD Y+8,R22
8F7 8779 STD Y+9,R23
8F8 940E 1818 CALL 0x1818
8FA 940E 1A08 CALL 0x1A08
(0177) unsigned long blk;
(0178) unsigned int a;
(0179) struct DirEntry *dir; //文件目录指针
(0180)
(0181) if (dir_cluster == 0) //读取根目录,得到FDT起始扇区号
8FC F429 BNE 0x0902
8FD 940E 1900 CALL 0x1900
8FF 940E 1A82 CALL 0x1A82
(0182) {
(0183) Block = FirstRootDirSecNum;
(0184) }
901 C008 RJMP 0x090A
(0185) else //读取子目录,本程序中用不到
(0186) {
(0187) Block = (dir_cluster-2)*SecPerClus+data_offset;
902 940E 1922 CALL 0x1922
904 940E 187C CALL 0x187C
906 940E 174B CALL 0x174B
908 940E 1A82 CALL 0x1A82
(0188) }
(0189) //下面的算法效率有问题。注意它每次都是从根目录下面依次去找第Entry_Count个文件
(0190) //for (blk = old_pos_blk;;blk++)
(0191) for (blk = Block;;blk++) //从该目录下面,依次读取一个扇区
90A 940E 1A91 CALL 0x1A91
90C 940E 18B6 CALL 0x18B6
(0192) {
(0193) MMC_SD_ReadSingleBlock(blk,buff);
90E 8C0E LDD R0,Y+30
90F 8C1F LDD R1,Y+31
910 8219 STD Y+1,R1
911 8208 STD Y+0,R0
912 810A LDD R16,Y+2
913 811B LDD R17,Y+3
914 812C LDD R18,Y+4
915 813D LDD R19,Y+5
916 940E 14AB CALL _MMC_SD_ReadSingleBlock
(0194) Next_a:
(0195) //for (a=old_pos_a;a<BlockSize; a = a + 32)
(0196) for (a=0;a<BlockSize; a = a + 32) //依次分析每一个32字节的目录/文件结构
918 24EE CLR R14
919 24FF CLR R15
91A C066 RJMP 0x0981
(0197) { //依次分析每一个文件或目录,可能会出现空的、已删除、正常的目录/文件
(0198) dir=(struct DirEntry *)(buff + a); //装载目录内容
91B 0167 MOVW R12,R14
91C 8C0E LDD R0,Y+30
91D 8C1F LDD R1,Y+31
91E 0CC0 ADD R12,R0
91F 1CD1 ADC R13,R1
(0199) if (dir->DIR_Name[0] == 0) //目录已经搜索完毕,返回.
920 01F6 MOVW R30,R12
921 8020 LDD R2,Z+0
922 2022 TST R2
923 F429 BNE 0x0929
(0200) {
(0201) return (0xFFFFFFFE);
924 EF0E LDI R16,0xFE
925 EF1F LDI R17,0xFF
926 EF2F LDI R18,0xFF
927 EF3F LDI R19,0xFF
928 C069 RJMP 0x0992
(0202) }
(0203) //非卷标,非长文件名,并且文件没有删除
(0204) if ((dir->DIR_Attr != ATTR_LONG_NAME) && (dir->DIR_Attr != DIR_ATTRIB_VOL_ID) && (dir->DIR_Name[0] != DIR_ENTRY_IS_FREE))
929 01F6 MOVW R30,R12
92A 8423 LDD R2,Z+11
92B 2433 CLR R3
92C 2D82 MOV R24,R2
92D 308F CPI R24,0xF
92E F409 BNE 0x0930
92F C04E RJMP 0x097E
930 3088 CPI R24,0x8
931 F409 BNE 0x0933
932 C04B RJMP 0x097E
933 8180 LDD R24,Z+0
934 3E85 CPI R24,0xE5
935 F409 BNE 0x0937
936 C047 RJMP 0x097E
(0205) {
(0206) //搜索字库文件:
(0207) if(Entry_Count==0 && dir->DIR_Name[2] == 'F' && dir->DIR_Name[3] == 'O' && dir->DIR_Name[4] == 'N' && dir->DIR_Name[5] == 'T' && dir->DIR_Name[6] == '1' && dir->DIR_Name[7] == '6')
937 8C08 LDD R0,Y+24
938 8C19 LDD R1,Y+25
939 2000 TST R0
93A F009 BEQ 0x093C
93B C01E RJMP 0x095A
93C 2011 TST R1
93D F009 BEQ 0x093F
93E C01B RJMP 0x095A
93F 8182 LDD R24,Z+2
940 3486 CPI R24,0x46
941 F009 BEQ 0x0943
942 C017 RJMP 0x095A
943 8183 LDD R24,Z+3
944 348F CPI R24,0x4F
945 F009 BEQ 0x0947
946 C013 RJMP 0x095A
947 8184 LDD R24,Z+4
948 348E CPI R24,0x4E
949 F009 BEQ 0x094B
94A C00F RJMP 0x095A
94B 8185 LDD R24,Z+5
94C 3584 CPI R24,0x54
94D F009 BEQ 0x094F
94E C00B RJMP 0x095A
94F 8186 LDD R24,Z+6
950 3381 CPI R24,0x31
951 F009 BEQ 0x0953
952 C007 RJMP 0x095A
953 8187 LDD R24,Z+7
954 3386 CPI R24,0x36
955 F009 BEQ 0x0957
956 C003 RJMP 0x095A
(0208) {
(0209) pointer_FDT=buff + a;
957 940E 170F CALL <created procedures>
(0210) *Dir_Attrib = dir->DIR_Attr;
(0211)
(0212) //文件长度
(0213) *Size=dir->DIR_FileSize;
(0214)
(0215) //文件起始簇的低16位
(0216) dir_cluster = dir->DIR_FstClusLO + (dir->DIR_FstClusHI)*65536;
(0217)
(0218) //返回起始簇
(0219) return(dir_cluster);
959 C038 RJMP 0x0992
(0220) }
(0221) //搜索mp3文件:
(0222) else if(dir->DIR_Name[8] == Search_FileExName1[0] && dir->DIR_Name[9] == Search_FileExName1[1] && dir->DIR_Name[10] == Search_FileExName1[2]) //找到要搜索的文件
95A E5E4 LDI R30,0x54
95B E0F0 LDI R31,0
95C 9024 LPM R2,0(Z)
95D 01F6 MOVW R30,R12
95E 8430 LDD R3,Z+8
95F 1432 CP R3,R2
960 F009 BEQ 0x0962
961 C01C RJMP 0x097E
962 E5E5 LDI R30,0x55
963 E0F0 LDI R31,0
964 9024 LPM R2,0(Z)
965 01F6 MOVW R30,R12
966 8431 LDD R3,Z+9
967 1432 CP R3,R2
968 F009 BEQ 0x096A
969 C014 RJMP 0x097E
96A E5E6 LDI R30,0x56
96B E0F0 LDI R31,0
96C 9024 LPM R2,0(Z)
96D 01F6 MOVW R30,R12
96E 8432 LDD R3,Z+10
96F 1432 CP R3,R2
970 F009 BEQ 0x0972
971 C00C RJMP 0x097E
(0223) {
(0224) TMP_Entry_Count++;
972 01C5 MOVW R24,R10
973 9601 ADIW R24,1
974 015C MOVW R10,R24
(0225) //找寻第Entery_Count个指定文件
(0226) if (TMP_Entry_Count == Entry_Count)
975 8C08 LDD R0,Y+24
976 8C19 LDD R1,Y+25
977 1580 CP R24,R0
978 0591 CPC R25,R1
979 F009 BEQ 0x097B
97A C003 RJMP 0x097E
(0227) {
(0228) pointer_FDT=buff + a;
97B 940E 170F CALL <created procedures>
(0229) *Dir_Attrib = dir->DIR_Attr;
(0230)
(0231) //文件长度
(0232) *Size=dir->DIR_FileSize;
(0233)
(0234) //文件起始簇的低16位
(0235) dir_cluster = dir->DIR_FstClusLO + (dir->DIR_FstClusHI)*65536;
(0236) /*
(0237) if((a+32)<512) //判断是否该搜索下一个扇区的目录文件信息了
(0238) {
(0239) old_pos_a=a+32;
(0240) old_pos_blk=blk;
(0241) }
(0242) else //到下一扇区寻找
(0243) {
(0244) old_pos_a=0;
(0245) old_pos_blk=blk+1;
(0246) }
(0247) */
(0248) //返回起始簇
(0249) return(dir_cluster);
97D C014 RJMP 0x0992
97E 01C7 MOVW R24,R14
97F 9680 ADIW R24,0x20
980 017C MOVW R14,R24
981 9020 00CA LDS R2,BlockSize
983 9030 00CB LDS R3,BlockSize+1
985 14E2 CP R14,R2
986 04F3 CPC R15,R3
987 F408 BCC 0x0989
988 CF92 RJMP 0x091B
989 E041 LDI R20,1
98A E050 LDI R21,0
98B 940E 199E CALL 0x199E
98D 940E 198D CALL 0x198D
98F 940E 18B6 CALL 0x18B6
991 CF7C RJMP 0x090E
992 962A ADIW R28,0xA
993 940E 1693 CALL pop_xgsetF0FC
995 9624 ADIW R28,4
996 9508 RET
_fat_read_file:
Block --> Y,+4
blockserial --> R10
BlockCount --> Y,+22
buff --> R12
Cluster --> Y,+16
997 940E 15B9 CALL push_arg4
999 940E 16C7 CALL push_xgsetF03C
99B 9728 SBIW R28,0x8
99C 88CC LDD R12,Y+20
99D 88DD LDD R13,Y+21
99E 8CAA LDD R10,Y+26
99F 8CBB LDD R11,Y+27
(0250) }
(0251) }
(0252) }
(0253) }
(0254) }
(0255) return (0xFFFFFFFF); //目录本身有错误,返回0xFFFF
(0256) }
(0257)
(0258)
(0259) //############################################################################
(0260) //读取文件内容每次512bytes,文件没有读完,返回0;否则为1
(0261) unsigned char fat_read_file(unsigned long Cluster, //文件起始簇号
(0262) unsigned char *buff, //文件内容缓冲区
(0263) unsigned long BlockCount, //扇区号
(0264) unsigned char *blockserial)
(0265) //############################################################################
(0266) {
(0267) unsigned long Block;
(0268) static unsigned char serial=0;
(0269)
(0270) if(BlockCount == 0)
9A0 882E LDD R2,Y+22
9A1 883F LDD R3,Y+23
9A2 8C48 LDD R4,Y+24
9A3 8C59 LDD R5,Y+25
9A4 940E 1A08 CALL 0x1A08
9A6 F009 BEQ 0x09A8
9A7 C024 RJMP 0x09CC
(0271) {
(0272) fat_load(Cluster,&Block,buff);
9A8 940E 19AC CALL 0x19AC
9AA 940E 1A69 CALL 0x1A69
9AC DDCB RCALL _fat_load
(0273) //测试使用
(0274) //DisplayLong(Block,1);
(0275) MMC_SD_ReadSingleBlock((Cluster-2)*SecPerClus+data_offset+serial,buff);
9AD 82D9 STD Y+1,R13
9AE 82C8 STD Y+0,R12
9AF 940E 1922 CALL 0x1922
9B1 940E 1A69 CALL 0x1A69
9B3 940E 174B CALL 0x174B
9B5 9060 0062 LDS R6,serial
9B7 2477 CLR R7
9B8 2488 CLR R8
9B9 2499 CLR R9
9BA 940E 17DF CALL 0x17DF
9BC 940E 18EC CALL 0x18EC
(0276) serial++;
(0277) blocknow = Cluster;
9BE 8828 LDD R2,Y+16
9BF 8839 LDD R3,Y+17
9C0 884A LDD R4,Y+18
9C1 885B LDD R5,Y+19
9C2 940E 1930 CALL 0x1930
9C4 940E 18CB CALL 0x18CB
(0278) *blockserial = SecPerClus-serial;
(0279) if(serial == SecPerClus)
9C6 F009 BEQ 0x09C8
9C7 C020 RJMP 0x09E8
(0280) serial = 0;
9C8 2422 CLR R2
9C9 9220 0062 STS serial,R2
(0281) }
9CB C01C RJMP 0x09E8
(0282) else
(0283) {
(0284) fat_load(blocknow,&Block,buff);
9CC 940E 19AC CALL 0x19AC
9CE 940E 1927 CALL 0x1927
9D0 DDA7 RCALL _fat_load
(0285) MMC_SD_ReadSingleBlock((blocknow-2)*SecPerClus+data_offset+serial,buff);
9D1 82D9 STD Y+1,R13
9D2 82C8 STD Y+0,R12
9D3 940E 1922 CALL 0x1922
9D5 940E 1927 CALL 0x1927
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -