📄 fat.lis
字号:
06F2 40E0 ldi R20,0
06F4 50E0 ldi R21,0
06F6 60E0 ldi R22,0
06F8 70E0 ldi R23,0
06FA 4E83 std y+6,R20
06FC 5F83 std y+7,R21
06FE 6887 std y+8,R22
0700 7987 std y+9,R23
0702 .dbline 181
0702 ; unsigned long blk;
0702 ; unsigned int a;
0702 ; struct DirEntry *dir; //文件目录指针
0702 ;
0702 ; if (dir_cluster == 0) //读取根目录,得到FDT起始扇区号
0702 2C88 ldd R2,y+20
0704 3D88 ldd R3,y+21
0706 4E88 ldd R4,y+22
0708 5F88 ldd R5,y+23
070A 00E0 ldi R16,0
070C 2016 cp R2,R16
070E 3006 cpc R3,R16
0710 4006 cpc R4,R16
0712 5006 cpc R5,R16
0714 69F4 brne L35
0716 X24:
0716 .dbline 182
0716 ; {
0716 .dbline 183
0716 ; Block = FirstRootDirSecNum;
0716 40900600 lds R4,_FirstRootDirSecNum+2
071A 50900700 lds R5,_FirstRootDirSecNum+2+1
071E 20900400 lds R2,_FirstRootDirSecNum
0722 30900500 lds R3,_FirstRootDirSecNum+1
0726 2E82 std y+6,R2
0728 3F82 std y+7,R3
072A 4886 std y+8,R4
072C 5986 std y+9,R5
072E .dbline 184
072E ; }
072E 29C0 xjmp L36
0730 L35:
0730 .dbline 186
0730 ; else //读取子目录,本程序中用不到
0730 ; {
0730 .dbline 187
0730 ; Block = (dir_cluster-2)*SecPerClus+data_offset;
0730 42E0 ldi R20,2
0732 50E0 ldi R21,0
0734 60E0 ldi R22,0
0736 70E0 ldi R23,0
0738 0C89 ldd R16,y+20
073A 1D89 ldd R17,y+21
073C 2E89 ldd R18,y+22
073E 3F89 ldd R19,y+23
0740 041B sub R16,R20
0742 150B sbc R17,R21
0744 260B sbc R18,R22
0746 370B sbc R19,R23
0748 20900A00 lds R2,_SecPerClus
074C 3324 clr R3
074E 4424 clr R4
0750 5524 clr R5
0752 5A92 st -y,R5
0754 4A92 st -y,R4
0756 3A92 st -y,R3
0758 2A92 st -y,R2
075A 0E940000 xcall empy32u
075E 1801 movw R2,R16
0760 2901 movw R4,R18
0762 80901200 lds R8,_data_offset+2
0766 90901300 lds R9,_data_offset+2+1
076A 60901000 lds R6,_data_offset
076E 70901100 lds R7,_data_offset+1
0772 260C add R2,R6
0774 371C adc R3,R7
0776 481C adc R4,R8
0778 591C adc R5,R9
077A 2E82 std y+6,R2
077C 3F82 std y+7,R3
077E 4886 std y+8,R4
0780 5986 std y+9,R5
0782 .dbline 188
0782 ; }
0782 L36:
0782 .dbline 191
0782 ; //下面的算法效率有问题。注意它每次都是从根目录下面依次去找第Entry_Count个文件
0782 ; //for (blk = old_pos_blk;;blk++)
0782 ; for (blk = Block;;blk++) //从该目录下面,依次读取一个扇区
0782 2E80 ldd R2,y+6
0784 3F80 ldd R3,y+7
0786 4884 ldd R4,y+8
0788 5984 ldd R5,y+9
078A 2A82 std y+2,R2
078C 3B82 std y+3,R3
078E 4C82 std y+4,R4
0790 5D82 std y+5,R5
0792 L37:
0792 .dbline 192
0792 ; {
0792 .dbline 193
0792 ; MMC_SD_ReadSingleBlock(blk,buff);
0792 0E8C ldd R0,y+30
0794 1F8C ldd R1,y+31
0796 1982 std y+1,R1
0798 0882 std y+0,R0
079A 0A81 ldd R16,y+2
079C 1B81 ldd R17,y+3
079E 2C81 ldd R18,y+4
07A0 3D81 ldd R19,y+5
07A2 0E940000 xcall _MMC_SD_ReadSingleBlock
07A6 L41:
07A6 .dbline 196
07A6 ; Next_a:
07A6 ; //for (a=old_pos_a;a<BlockSize; a = a + 32)
07A6 ; for (a=0;a<BlockSize; a = a + 32) //依次分析每一个32字节的目录/文件结构
07A6 EE24 clr R14
07A8 FF24 clr R15
07AA D8C0 xjmp L45
07AC L42:
07AC .dbline 197
07AC ; { //依次分析每一个文件或目录,可能会出现空的、已删除、正常的目录/文件
07AC .dbline 198
07AC ; dir=(struct DirEntry *)(buff + a); //装载目录内容
07AC 6701 movw R12,R14
07AE 0E8C ldd R0,y+30
07B0 1F8C ldd R1,y+31
07B2 C00C add R12,R0
07B4 D11C adc R13,R1
07B6 .dbline 199
07B6 ; if (dir->DIR_Name[0] == 0) //目录已经搜索完毕,返回.
07B6 F601 movw R30,R12
07B8 2080 ldd R2,z+0
07BA 2220 tst R2
07BC 29F4 brne L46
07BE X25:
07BE .dbline 200
07BE ; {
07BE .dbline 201
07BE ; return (0xFFFFFFFE);
07BE 0EEF ldi R16,254
07C0 1FEF ldi R17,255
07C2 2FEF ldi R18,255
07C4 3FEF ldi R19,255
07C6 E3C0 xjmp L34
07C8 L46:
07C8 .dbline 204
07C8 ; }
07C8 ; //非卷标,非长文件名,并且文件没有删除
07C8 ; if ((dir->DIR_Attr != ATTR_LONG_NAME) && (dir->DIR_Attr != DIR_ATTRIB_VOL_ID) && (dir->DIR_Name[0] != DIR_ENTRY_IS_FREE))
07C8 F601 movw R30,R12
07CA 2384 ldd R2,z+11
07CC 3324 clr R3
07CE 822D mov R24,R2
07D0 8F30 cpi R24,15
07D2 09F4 brne X42
07D4 C0C0 xjmp L48
07D6 X42:
07D6 X26:
07D6 8830 cpi R24,8
07D8 09F4 brne X43
07DA BDC0 xjmp L48
07DC X43:
07DC X27:
07DC 8081 ldd R24,z+0
07DE 853E cpi R24,229
07E0 09F4 brne X44
07E2 B9C0 xjmp L48
07E4 X44:
07E4 X28:
07E4 .dbline 205
07E4 ; {
07E4 .dbline 207
07E4 ; //搜索字库文件:
07E4 ; 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')
07E4 088C ldd R0,y+24
07E6 198C ldd R1,y+25
07E8 0020 tst R0
07EA 09F0 breq X45
07EC 57C0 xjmp L50
07EE X45:
07EE 1120 tst R1
07F0 09F0 breq X46
07F2 54C0 xjmp L50
07F4 X46:
07F4 X29:
07F4 8281 ldd R24,z+2
07F6 8634 cpi R24,70
07F8 09F0 breq X47
07FA 50C0 xjmp L50
07FC X47:
07FC X30:
07FC 8381 ldd R24,z+3
07FE 8F34 cpi R24,79
0800 09F0 breq X48
0802 4CC0 xjmp L50
0804 X48:
0804 X31:
0804 8481 ldd R24,z+4
0806 8E34 cpi R24,78
0808 09F0 breq X49
080A 48C0 xjmp L50
080C X49:
080C X32:
080C 8581 ldd R24,z+5
080E 8435 cpi R24,84
0810 09F0 breq X50
0812 44C0 xjmp L50
0814 X50:
0814 X33:
0814 8681 ldd R24,z+6
0816 8133 cpi R24,49
0818 09F0 breq X51
081A 40C0 xjmp L50
081C X51:
081C X34:
081C 8781 ldd R24,z+7
081E 8633 cpi R24,54
0820 09F0 breq X52
0822 3CC0 xjmp L50
0824 X52:
0824 X35:
0824 .dbline 208
0824 ; {
0824 .dbline 209
0824 ; pointer_FDT=buff + a;
0824 1701 movw R2,R14
0826 0E8C ldd R0,y+30
0828 1F8C ldd R1,y+31
082A 200C add R2,R0
082C 311C adc R3,R1
082E 30920900 sts _pointer_FDT+1,R3
0832 20920800 sts _pointer_FDT,R2
0836 .dbline 210
0836 ; *Dir_Attrib = dir->DIR_Attr;
0836 2384 ldd R2,z+11
0838 EC8D ldd R30,y+28
083A FD8D ldd R31,y+29
083C 2082 std z+0,R2
083E .dbline 213
083E ;
083E ; //文件长度
083E ; *Size=dir->DIR_FileSize;
083E F601 movw R30,R12
0840 248C ldd R2,z+28
0842 358C ldd R3,z+29
0844 468C ldd R4,z+30
0846 578C ldd R5,z+31
0848 EA8D ldd R30,y+26
084A FB8D ldd R31,y+27
084C 2082 std z+0,R2
084E 3182 std z+1,R3
0850 4282 std z+2,R4
0852 5382 std z+3,R5
0854 .dbline 216
0854 ;
0854 ; //文件起始簇的低16位
0854 ; dir_cluster = dir->DIR_FstClusLO + (dir->DIR_FstClusHI)*65536;
0854 F601 movw R30,R12
0856 2488 ldd R2,z+20
0858 3588 ldd R3,z+21
085A 4424 clr R4
085C 5524 clr R5
085E 40E0 ldi R20,0
0860 50E0 ldi R21,0
0862 61E0 ldi R22,1
0864 70E0 ldi R23,0
0866 5A92 st -y,R5
0868 4A92 st -y,R4
086A 3A92 st -y,R3
086C 2A92 st -y,R2
086E 8A01 movw R16,R20
0870 9B01 movw R18,R22
0872 0E940000 xcall empy32s
0876 F601 movw R30,R12
0878 7A96 adiw R30,26
087A 2080 ldd R2,z+0
087C 3180 ldd R3,z+1
087E 4424 clr R4
0880 5524 clr R5
0882 200E add R2,R16
0884 311E adc R3,R17
0886 421E adc R4,R18
0888 531E adc R5,R19
088A 2C8A std y+20,R2
088C 3D8A std y+21,R3
088E 4E8A std y+22,R4
0890 5F8A std y+23,R5
0892 .dbline 219
0892 ;
0892 ; //返回起始簇
0892 ; return(dir_cluster);
0892 0C89 ldd R16,y+20
0894 1D89 ldd R17,y+21
0896 2E89 ldd R18,y+22
0898 3F89 ldd R19,y+23
089A 79C0 xjmp L34
089C L50:
089C .dbline 222
089C ; }
089C ; //搜索mp3文件:
089C ; else if(dir->DIR_Name[8] == Search_FileExName1[0] && dir->DIR_Name[9] == Search_FileExName1[1] && dir->DIR_Name[10] == Search_FileExName1[2]) //找到要搜索的文件
089C E0E0 ldi R30,<_Search_FileExName1
089E F0E0 ldi R31,>_Search_FileExName1
08A0 2490 lpm R2,Z
08A2 F601 movw R30,R12
08A4 3084 ldd R3,z+8
08A6 3214 cp R3,R2
08A8 09F0 breq X53
08AA 55C0 xjmp L52
08AC X53:
08AC X36:
08AC E0E0 ldi R30,<_Search_FileExName1+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -