📄 fat.lis
字号:
0326 40930200 sts _FileIndex+2,R20
032A 70930500 sts _FileIndex+2+2+1,R23
032E 60930400 sts _FileIndex+2+2,R22
0332 21C0 xjmp L60
0334 L57:
0334 .dbline 133
0334 00910600 lds R16,_FileIndex+6
0338 10910700 lds R17,_FileIndex+6+1
033C 44DF xcall _FAT_ReadFAT
033E 10930700 sts _FileIndex+6+1,R17
0342 00930600 sts _FileIndex+6,R16
0346 L58:
0346 .dbline 132
0346 41E0 ldi R20,1
0348 50E0 ldi R21,0
034A 60E0 ldi R22,0
034C 70E0 ldi R23,0
034E 40900400 lds R4,_FileIndex+2+2
0352 50900500 lds R5,_FileIndex+2+2+1
0356 20900200 lds R2,_FileIndex+2
035A 30900300 lds R3,_FileIndex+2+1
035E 240E add R2,R20
0360 351E adc R3,R21
0362 461E adc R4,R22
0364 571E adc R5,R23
0366 30920300 sts _FileIndex+2+1,R3
036A 20920200 sts _FileIndex+2,R2
036E 50920500 sts _FileIndex+2+2+1,R5
0372 40920400 sts _FileIndex+2+2,R4
0376 L60:
0376 .dbline 132
0376 1601 movw R2,R12
0378 4424 clr R4
037A 5524 clr R5
037C 80900400 lds R8,_FileIndex+2+2
0380 90900500 lds R9,_FileIndex+2+2+1
0384 60900200 lds R6,_FileIndex+2
0388 70900300 lds R7,_FileIndex+2+1
038C 6214 cp R6,R2
038E 7304 cpc R7,R3
0390 8404 cpc R8,R4
0392 9504 cpc R9,R5
0394 78F2 brlo L57
0396 .dbline 136
0396 ; FileIndex.ClusID = FAT_ReadFAT(FileIndex.ClusID);
0396 ;
0396 ;
0396 ; FileIndex.i = (Start % BytePerClus) / 512; //开始位置所在扇区簇内偏移
0396 1501 movw R2,R10
0398 4424 clr R4
039A 5524 clr R5
039C FE01 movw R30,R28
039E 60A4 ldd R6,z+40
03A0 71A4 ldd R7,z+41
03A2 82A4 ldd R8,z+42
03A4 93A4 ldd R9,z+43
03A6 5A92 st -y,R5
03A8 4A92 st -y,R4
03AA 3A92 st -y,R3
03AC 2A92 st -y,R2
03AE 8301 movw R16,R6
03B0 9401 movw R18,R8
03B2 0E940000 xcall mod32u
03B6 89E0 ldi R24,9
03B8 90E0 ldi R25,0
03BA 8A93 st -y,R24
03BC 0E940000 xcall lsr32
03C0 10930300 sts _FileIndex+2+1,R17
03C4 00930200 sts _FileIndex+2,R16
03C8 30930500 sts _FileIndex+2+2+1,R19
03CC 20930400 sts _FileIndex+2+2,R18
03D0 .dbline 137
03D0 ; FileIndex.m = (Start % BytePerClus) % 512; //开始位置扇区内偏移
03D0 1501 movw R2,R10
03D2 4424 clr R4
03D4 5524 clr R5
03D6 FE01 movw R30,R28
03D8 60A4 ldd R6,z+40
03DA 71A4 ldd R7,z+41
03DC 82A4 ldd R8,z+42
03DE 93A4 ldd R9,z+43
03E0 5A92 st -y,R5
03E2 4A92 st -y,R4
03E4 3A92 st -y,R3
03E6 2A92 st -y,R2
03E8 8301 movw R16,R6
03EA 9401 movw R18,R8
03EC 0E940000 xcall mod32u
03F0 4FEF ldi R20,255
03F2 51E0 ldi R21,1
03F4 60E0 ldi R22,0
03F6 70E0 ldi R23,0
03F8 1801 movw R2,R16
03FA 2901 movw R4,R18
03FC 2422 and R2,R20
03FE 3522 and R3,R21
0400 4622 and R4,R22
0402 5722 and R5,R23
0404 30920100 sts _FileIndex+1,R3
0408 20920000 sts _FileIndex,R2
040C .dbline 139
040C ;
040C ; FileIndex.LBA = ClusConvLBA(FileIndex.ClusID) + FileIndex.i; //开始位置所在的扇区号
040C 00910600 lds R16,_FileIndex+6
0410 10910700 lds R17,_FileIndex+6+1
0414 B9DE xcall _ClusConvLBA
0416 40900400 lds R4,_FileIndex+2+2
041A 50900500 lds R5,_FileIndex+2+2+1
041E 20900200 lds R2,_FileIndex+2
0422 30900300 lds R3,_FileIndex+2+1
0426 3801 movw R6,R16
0428 4901 movw R8,R18
042A 620C add R6,R2
042C 731C adc R7,R3
042E 841C adc R8,R4
0430 951C adc R9,R5
0432 70920900 sts _FileIndex+8+1,R7
0436 60920800 sts _FileIndex+8,R6
043A 90920B00 sts _FileIndex+8+2+1,R9
043E 80920A00 sts _FileIndex+8+2,R8
0442 .dbline 140
0442 ; FAT_ReadBlock(FileIndex.LBA); //预读取一个扇区的内容
0442 8301 movw R16,R6
0444 9401 movw R18,R8
0446 DEDD xcall _FAT_ReadBlock
0448 .dbline 141
0448 ; return (FileDir.Size);
0448 FE01 movw R30,R28
044A 048D ldd R16,z+28
044C 158D ldd R17,z+29
044E 268D ldd R18,z+30
0450 378D ldd R19,z+31
0452 .dbline -2
0452 L52:
0452 A096 adiw R28,32
0454 0E940000 xcall pop_gset4
0458 2296 adiw R28,2
045A .dbline 0 ; func end
045A 0895 ret
045C .dbsym l FileDir 0 S[.4]
045C .dbsym r BytePerClus 10 i
045C .dbsym r ClusNum 12 i
045C .dbsym l Start 40 l
045C .dbsym r Name 12 pc
045C .dbend
045C .dbfunc e FAT_FileRead _FAT_FileRead fi
045C ; data -> R10,R11
045C ; Data -> y+14
045C ; Length -> y+10
.even
045C _FAT_FileRead::
045C 0E940000 xcall push_arg4
0460 0E940000 xcall push_gset3
0464 2497 sbiw R28,4
0466 .dbline -1
0466 .dbline 147
0466 ; }
0466 ; //********************************************************************************************
0466 ; //读取文件的数据
0466 ; //********************************************************************************************
0466 ; uint16 FAT_FileRead(uint32 Length, void* Data)
0466 ; {
0466 .dbline 148
0466 ; uint8 *data = Data;
0466 AE84 ldd R10,y+14
0468 BF84 ldd R11,y+15
046A .dbline 149
046A ; goto FAT_FileRead_Start;
046A 7EC0 xjmp L91
046C L74:
046C .dbline 152
046C ;
046C ; while(1)
046C ; {
046C .dbline 153
046C ; FileIndex.ClusID = FAT_ReadFAT(FileIndex.ClusID); //下一簇簇号
046C 00910600 lds R16,_FileIndex+6
0470 10910700 lds R17,_FileIndex+6+1
0474 A8DE xcall _FAT_ReadFAT
0476 10930700 sts _FileIndex+6+1,R17
047A 00930600 sts _FileIndex+6,R16
047E .dbline 154
047E ; if (FileIndex.ClusID==0xFFFF)
047E 0F3F cpi R16,255
0480 EFEF ldi R30,255
0482 1E07 cpc R17,R30
0484 19F4 brne L79
0486 .dbline 155
0486 ; {
0486 .dbline 156
0486 ; return FALSE; //文件结束
0486 0027 clr R16
0488 1127 clr R17
048A BDC0 xjmp L72
048C L79:
048C .dbline 158
048C ; }
048C ; FileIndex.LBA = ClusConvLBA(FileIndex.ClusID); //簇的开始扇区号
048C 00910600 lds R16,_FileIndex+6
0490 10910700 lds R17,_FileIndex+6+1
0494 79DE xcall _ClusConvLBA
0496 10930900 sts _FileIndex+8+1,R17
049A 00930800 sts _FileIndex+8,R16
049E 30930B00 sts _FileIndex+8+2+1,R19
04A2 20930A00 sts _FileIndex+8+2,R18
04A6 .dbline 159
04A6 ; FileIndex.i = 0; //簇内扇区偏移
04A6 40E0 ldi R20,0
04A8 50E0 ldi R21,0
04AA 60E0 ldi R22,0
04AC 70E0 ldi R23,0
04AE 50930300 sts _FileIndex+2+1,R21
04B2 40930200 sts _FileIndex+2,R20
04B6 70930500 sts _FileIndex+2+2+1,R23
04BA 60930400 sts _FileIndex+2+2,R22
04BE 8DC0 xjmp L86
04C0 L85:
04C0 .dbline 161
04C0 ; while(FileIndex.i < Info.BPB_SecPerClus)
04C0 ; {
04C0 .dbline 162
04C0 ; FAT_ReadBlock(FileIndex.LBA); //读当前簇
04C0 20910A00 lds R18,_FileIndex+8+2
04C4 30910B00 lds R19,_FileIndex+8+2+1
04C8 00910800 lds R16,_FileIndex+8
04CC 10910900 lds R17,_FileIndex+8+1
04D0 99DD xcall _FAT_ReadBlock
04D2 .dbline 163
04D2 ; FileIndex.m = 0; //当前扇区内的数据偏移
04D2 2224 clr R2
04D4 3324 clr R3
04D6 30920100 sts _FileIndex+1,R3
04DA 20920000 sts _FileIndex,R2
04DE 44C0 xjmp L91
04E0 L90:
04E0 .dbline 166
04E0 ; FAT_FileRead_Start:
04E0 ; while(FileIndex.m < 512)
04E0 ; {
04E0 .dbline 167
04E0 ; *data++ = BUFFER[FileIndex.m];
04E0 80E0 ldi R24,<_BUFFER
04E2 90E0 ldi R25,>_BUFFER
04E4 E0910000 lds R30,_FileIndex
04E8 F0910100 lds R31,_FileIndex+1
04EC E80F add R30,R24
04EE F91F adc R31,R25
04F0 2080 ldd R2,z+0
04F2 F501 movw R30,R10
04F4 2192 st Z+,R2
04F6 5F01 movw R10,R30
04F8 .dbline 168
04F8 ; FileIndex.m++;
04F8 80910000 lds R24,_FileIndex
04FC 90910100 lds R25,_FileIndex+1
0500 0196 adiw R24,1
0502 90930100 sts _FileIndex+1,R25
0506 80930000 sts _FileIndex,R24
050A .dbline 170
050A ; //如果读取完成就退出
050A ; if(--Length == 0)
050A 41E0 ldi R20,1
050C 50E0 ldi R21,0
050E 60E0 ldi R22,0
0510 70E0 ldi R23,0
0512 FE01 movw R30,R28
0514 2284 ldd R2,z+10
0516 3384 ldd R3,z+11
0518 4484 ldd R4,z+12
051A 5584 ldd R5,z+13
051C 241A sub R2,R20
051E 350A sbc R3,R21
0520 460A sbc R4,R22
0522 570A sbc R5,R23
0524 FE01 movw R30,R28
0526 2082 std z+0,R2
0528 3182 std z+1,R3
052A 4282 std z+2,R4
052C 5382 std z+3,R5
052E FE01 movw R30,R28
0530 2080 ldd R2,z+0
0532 3180 ldd R3,z+1
0534 4280 ldd R4,z+2
0536 5380 ldd R5,z+3
0538 FE01 movw R30,R28
053A 2286 std z+10,R2
053C 3386 std z+11,R3
053E 4486 std z+12,R4
0540 5586 std z+13,R5
0542 40E0 ldi R20,0
0544 50E0 ldi R21,0
0546 60E0 ldi R22,0
0548 70E0 ldi R23,0
054A FE01 movw R30,R28
054C 2080 ldd R2,z+0
054E 3180 ldd R3,z+1
0550 4280 ldd R4,z+2
0552 5380 ldd R5,z+3
0554 2416 cp R2,R20
0556 3506 cpc R3,R21
0558 4606 cpc R4,R22
055A 5706 cpc R5,R23
055C 29F4 brne L93
055E .dbline 171
055E ; {
055E .dbline 172
055E ; return (FileIndex.m);
055E 00910000 lds R16,_FileIndex
0562 10910100 lds R17,_FileIndex+1
0566 4FC0 xjmp L72
0568 L93:
0568 .dbline 174
0568 L91:
0568 .dbline 165
0568 80910000 lds R24,_FileIndex
056C 90910100 lds R25,_FileIndex+1
0570 8030 cpi R24,0
0572 E2E0 ldi R30,2
0574 9E07 cpc R25,R30
0576 08F4 brsh X2
0578 B3CF xjmp L90
057A X2:
057A .dbline 175
057A 41E0 ldi R20,1
057C 50E0 ldi R21,0
057E 60E0 ldi R22,0
0580 70E0 ldi R23,0
0582 40900A00 lds R4,_FileIndex+8+2
0586 50900B00 lds R5,_FileIndex+8+2+1
058A 20900800 lds R2,_FileIndex+8
058E 30900900 lds R3,_FileIndex+8+1
0592 240E add R2,R20
0594 351E adc R3,R21
0596 461E adc R4,R22
0598 571E adc R5,R23
059A 30920900 sts _FileIndex+8+1,R3
059E 20920800 sts _FileIndex+8,R2
05A2 50920B00 sts _FileIndex+8+2+1,R5
05A6 40920A00 sts _FileIndex+8+2,R4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -