📄 fat.lis
字号:
0696 24C0 xjmp L40
0698 L70:
0698 L66:
0698 .dbline 231
0698 ; hasBuffer = 0; // clear buffer
0698 0024 clr R0
069A 1124 clr R1
069C 1D8A std y+21,R1
069E 0C8A std y+20,R0
06A0 .dbline 232
06A0 ; entrycount++; // increment entry counter
06A0 80910A00 lds R24,_entrycount
06A4 90910B00 lds R25,_entrycount+1
06A8 0196 adiw R24,1
06AA 90930B00 sts _entrycount+1,R25
06AE 80930A00 sts _entrycount,R24
06B2 .dbline 233
06B2 ; }
06B2 L63:
06B2 .dbline 235
06B2 ; // else ignore short_name_only entries
06B2 ; }
06B2 L46:
06B2 .dbline 236
06B2 ; }
06B2 L43:
06B2 .dbline 237
06B2 ; de++;
06B2 8889 ldd R24,y+16
06B4 9989 ldd R25,y+17
06B6 8096 adiw R24,32
06B8 998B std y+17,R25
06BA 888B std y+16,R24
06BC .dbline 238
06BC ; index++;
06BC 8A89 ldd R24,y+18
06BE 9B89 ldd R25,y+19
06C0 0196 adiw R24,1
06C2 9B8B std y+19,R25
06C4 8A8B std y+18,R24
06C6 .dbline 239
06C6 L39:
06C6 .dbline 239
06C6 ; } while (*de->deName || index == 16); // 0 in de->deName[0] if no more entries
06C6 E889 ldd R30,y+16
06C8 F989 ldd R31,y+17
06CA 2080 ldd R2,z+0
06CC 2220 tst R2
06CE 09F0 breq X12
06D0 97CE xjmp L38
06D2 X12:
06D2 8A89 ldd R24,y+18
06D4 9B89 ldd R25,y+19
06D6 8031 cpi R24,16
06D8 E0E0 ldi R30,0
06DA 9E07 cpc R25,R30
06DC 09F4 brne X13
06DE 90CE xjmp L38
06E0 X13:
06E0 L40:
06E0 .dbline 241
06E0 ;
06E0 ; if (hasBuffer == 0) // end of entries
06E0 0C88 ldd R0,y+20
06E2 1D88 ldd R1,y+21
06E4 0020 tst R0
06E6 39F4 brne L72
06E8 1120 tst R1
06EA 29F4 brne L72
06EC X5:
06EC .dbline 242
06EC ; return 0;
06EC 00E0 ldi R16,0
06EE 10E0 ldi R17,0
06F0 20E0 ldi R18,0
06F2 30E0 ldi R19,0
06F4 2DC0 xjmp L37
06F6 L72:
06F6 .dbline 244
06F6 ;
06F6 ; FileSize = de->deFileSize;
06F6 E889 ldd R30,y+16
06F8 F989 ldd R31,y+17
06FA 248C ldd R2,z+28
06FC 358C ldd R3,z+29
06FE 468C ldd R4,z+30
0700 578C ldd R5,z+31
0702 30920100 sts _FileSize+1,R3
0706 20920000 sts _FileSize,R2
070A 50920300 sts _FileSize+2+1,R5
070E 40920200 sts _FileSize+2,R4
0712 .dbline 245
0712 ; LCD_write_english_string(0,1,LongNameBuffer);
0712 20900000 lds R2,_LongNameBuffer
0716 30900100 lds R3,_LongNameBuffer+1
071A 3982 std y+1,R3
071C 2882 std y+0,R2
071E 21E0 ldi R18,1
0720 0027 clr R16
0722 0E940000 xcall _LCD_write_english_string
0726 .dbline 246
0726 ; return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
0726 E889 ldd R30,y+16
0728 F989 ldd R31,y+17
072A 228C ldd R2,z+26
072C 338C ldd R3,z+27
072E 4424 clr R4
0730 5524 clr R5
0732 E889 ldd R30,y+16
0734 F989 ldd R31,y+17
0736 6488 ldd R6,z+20
0738 7588 ldd R7,z+21
073A 8824 clr R8
073C 9924 clr R9
073E 4301 movw R8,R6
0740 6624 clr R6
0742 7724 clr R7
0744 620C add R6,R2
0746 731C adc R7,R3
0748 841C adc R8,R4
074A 951C adc R9,R5
074C 8301 movw R16,R6
074E 9401 movw R18,R8
0750 .dbline -2
0750 L37:
0750 6896 adiw R28,24
0752 0E940000 xcall pop_gset5
0756 2296 adiw R28,2
0758 .dbline 0 ; func end
0758 0895 ret
075A .dbsym l rval 10 l
075A .dbsym r save2 10 i
075A .dbsym l save 6 l
075A .dbsym l b 22 i
075A .dbsym l sector 2 l
075A .dbsym l hasBuffer 20 i
075A .dbsym l index 18 I
075A .dbsym l de 16 pS[direntry]
075A .dbsym r p 12 pc
075A .dbsym l we 14 pS[winentry]
075A .dbsym r i 14 I
075A .dbsym l entry 34 i
075A .dbend
075A .dbfunc e fatNextCluster _fatNextCluster fl
075A ; offset -> R10,R11
075A ; sector -> y+12
075A ; fatOffset -> y+8
075A ; fatMask -> y+4
075A ; nextCluster -> y+0
075A ; cluster -> y+22
.even
075A _fatNextCluster::
075A 0E940000 xcall push_arg4
075E 0E940000 xcall push_gset3
0762 6097 sbiw R28,16
0764 .dbline -1
0764 .dbline 253
0764 ; }
0764 ;
0764 ; /*-----------------------------------------------------------------------
0764 ; 在FAT表中查询下一个簇所在扇区号
0764 ; -----------------------------------------------------------------------*/
0764 ; unsigned long fatNextCluster(unsigned long cluster)
0764 ; {
0764 .dbline 260
0764 ; unsigned long nextCluster;
0764 ; unsigned long fatMask;
0764 ; unsigned long fatOffset;
0764 ; unsigned long sector;
0764 ; unsigned int offset;
0764 ;
0764 ; if(Fat32Enabled)
0764 20901400 lds R2,_Fat32Enabled
0768 2220 tst R2
076A D9F0 breq L75
076C .dbline 261
076C ; {
076C .dbline 263
076C ; // 一个表项为4bytes(32 bits)
076C ; fatOffset = cluster << 2;
076C 82E0 ldi R24,2
076E 90E0 ldi R25,0
0770 FE01 movw R30,R28
0772 2688 ldd R2,z+22
0774 3788 ldd R3,z+23
0776 408C ldd R4,z+24
0778 518C ldd R5,z+25
077A 8A93 st -y,R24
077C 8101 movw R16,R2
077E 9201 movw R18,R4
0780 0E940000 xcall lsl32
0784 FE01 movw R30,R28
0786 0087 std z+8,R16
0788 1187 std z+9,R17
078A 2287 std z+10,R18
078C 3387 std z+11,R19
078E .dbline 265
078E ; // 设置 FAT32 bit mask
078E ; fatMask = FAT32_MASK;
078E 4FEF ldi R20,255
0790 5FEF ldi R21,255
0792 6FEF ldi R22,255
0794 7FE0 ldi R23,15
0796 FE01 movw R30,R28
0798 4483 std z+4,R20
079A 5583 std z+5,R21
079C 6683 std z+6,R22
079E 7783 std z+7,R23
07A0 .dbline 266
07A0 ; }
07A0 17C0 xjmp L76
07A2 L75:
07A2 .dbline 268
07A2 ; else
07A2 ; {
07A2 .dbline 270
07A2 ; // 一个表项为2bytes(16 bits)
07A2 ; fatOffset = cluster << 1;
07A2 FE01 movw R30,R28
07A4 2688 ldd R2,z+22
07A6 3788 ldd R3,z+23
07A8 408C ldd R4,z+24
07AA 518C ldd R5,z+25
07AC 220C lsl R2
07AE 331C rol R3
07B0 441C rol R4
07B2 551C rol R5
07B4 FE01 movw R30,R28
07B6 2086 std z+8,R2
07B8 3186 std z+9,R3
07BA 4286 std z+10,R4
07BC 5386 std z+11,R5
07BE .dbline 272
07BE ; // 设置 FAT16 bit mask
07BE ; fatMask = FAT16_MASK;
07BE 4FEF ldi R20,255
07C0 5FEF ldi R21,255
07C2 60E0 ldi R22,0
07C4 70E0 ldi R23,0
07C6 FE01 movw R30,R28
07C8 4483 std z+4,R20
07CA 5583 std z+5,R21
07CC 6683 std z+6,R22
07CE 7783 std z+7,R23
07D0 .dbline 273
07D0 ; }
07D0 L76:
07D0 .dbline 276
07D0 ;
07D0 ; //计算FAT扇区号
07D0 ; sector = FirstFATSector + (fatOffset / BytesPerSector);
07D0 20900E00 lds R2,_BytesPerSector
07D4 30900F00 lds R3,_BytesPerSector+1
07D8 4424 clr R4
07DA 5524 clr R5
07DC FE01 movw R30,R28
07DE 6084 ldd R6,z+8
07E0 7184 ldd R7,z+9
07E2 8284 ldd R8,z+10
07E4 9384 ldd R9,z+11
07E6 5A92 st -y,R5
07E8 4A92 st -y,R4
07EA 3A92 st -y,R3
07EC 2A92 st -y,R2
07EE 8301 movw R16,R6
07F0 9401 movw R18,R8
07F2 0E940000 xcall div32u
07F6 40900A00 lds R4,_FirstFATSector+2
07FA 50900B00 lds R5,_FirstFATSector+2+1
07FE 20900800 lds R2,_FirstFATSector
0802 30900900 lds R3,_FirstFATSector+1
0806 200E add R2,R16
0808 311E adc R3,R17
080A 421E adc R4,R18
080C 531E adc R5,R19
080E FE01 movw R30,R28
0810 2486 std z+12,R2
0812 3586 std z+13,R3
0814 4686 std z+14,R4
0816 5786 std z+15,R5
0818 .dbline 278
0818 ; //计算FAT扇区号中表项的偏移地址
0818 ; offset = fatOffset % BytesPerSector;
0818 20900E00 lds R2,_BytesPerSector
081C 30900F00 lds R3,_BytesPerSector+1
0820 4424 clr R4
0822 5524 clr R5
0824 FE01 movw R30,R28
0826 6084 ldd R6,z+8
0828 7184 ldd R7,z+9
082A 8284 ldd R8,z+10
082C 9384 ldd R9,z+11
082E 5A92 st -y,R5
0830 4A92 st -y,R4
0832 3A92 st -y,R3
0834 2A92 st -y,R2
0836 8301 movw R16,R6
0838 9401 movw R18,R8
083A 0E940000 xcall mod32u
083E 5801 movw R10,R16
0840 .dbline 280
0840 ;
0840 ; ReadBlock(sector);
0840 FE01 movw R30,R28
0842 0485 ldd R16,z+12
0844 1585 ldd R17,z+13
0846 2685 ldd R18,z+14
0848 3785 ldd R19,z+15
084A DADB xcall _ReadBlock
084C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -