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