📄 fat.lis
字号:
018C 5801 movw R10,R16
018E .dbline -1
018E .dbline 78
018E ; }
018E ; //********************************************************************************************
018E ; //获取一个簇的开始扇区
018E ; //********************************************************************************************
018E ;
018E ; uint32 ClusConvLBA(uint16 ClusID)
018E ; {
018E .dbline 79
018E ; return Info.DataStartSec + Info.BPB_SecPerClus * (ClusID - 2);
018E 9501 movw R18,R10
0190 2250 subi R18,2
0192 3040 sbci R19,0
0194 00910C00 lds R16,_Info
0198 1127 clr R17
019A 0E940000 xcall empy16s
019E 1801 movw R2,R16
01A0 4424 clr R4
01A2 5524 clr R5
01A4 80902000 lds R8,_Info+18+2
01A8 90902100 lds R9,_Info+18+2+1
01AC 60901E00 lds R6,_Info+18
01B0 70901F00 lds R7,_Info+18+1
01B4 620C add R6,R2
01B6 731C adc R7,R3
01B8 841C adc R8,R4
01BA 951C adc R9,R5
01BC 8301 movw R16,R6
01BE 9401 movw R18,R8
01C0 .dbline -2
01C0 L33:
01C0 0E940000 xcall pop_gset3
01C4 .dbline 0 ; func end
01C4 0895 ret
01C6 .dbsym r ClusID 10 i
01C6 .dbend
01C6 .dbfunc e FAT_ReadFAT _FAT_ReadFAT fi
01C6 ; RAM -> R20,R21
01C6 ; Index -> R22,R23
.even
01C6 _FAT_ReadFAT::
01C6 0E940000 xcall push_gset2
01CA B801 movw R22,R16
01CC .dbline -1
01CC .dbline 85
01CC ; }
01CC ; //********************************************************************************************
01CC ; //读取文件分配表的指定项
01CC ; //********************************************************************************************
01CC ; uint16 FAT_ReadFAT(uint16 Index)
01CC ; {
01CC .dbline 86
01CC ; uint16 *RAM = (uint16*)BUFFER;
01CC 40E0 ldi R20,<_BUFFER
01CE 50E0 ldi R21,>_BUFFER
01D0 .dbline 87
01D0 ; FAT_ReadBlock(Info.BPB_RsvdSecCnt + Index / 256);
01D0 1B01 movw R2,R22
01D2 232C mov R2,R3
01D4 3324 clr R3
01D6 40900D00 lds R4,_Info+1
01DA 50900E00 lds R5,_Info+1+1
01DE 420C add R4,R2
01E0 531C adc R5,R3
01E2 1201 movw R2,R4
01E4 4424 clr R4
01E6 5524 clr R5
01E8 8101 movw R16,R2
01EA 9201 movw R18,R4
01EC 0BDF xcall _FAT_ReadBlock
01EE .dbline 88
01EE ; return RAM[Index % 256];
01EE 9B01 movw R18,R22
01F0 3070 andi R19,0
01F2 02E0 ldi R16,2
01F4 10E0 ldi R17,0
01F6 0E940000 xcall empy16s
01FA F801 movw R30,R16
01FC E40F add R30,R20
01FE F51F adc R31,R21
0200 0081 ldd R16,z+0
0202 1181 ldd R17,z+1
0204 .dbline -2
0204 L35:
0204 0E940000 xcall pop_gset2
0208 .dbline 0 ; func end
0208 0895 ret
020A .dbsym r RAM 20 pi
020A .dbsym r Index 22 i
020A .dbend
020A .dbfunc e GetFileID _GetFileID fc
020A .dbstruct 0 32 .4
020A .dbfield 0 FileName A[11:11]c
020A .dbfield 11 FileAttrib c
020A .dbfield 12 UnUsed A[10:10]c
020A .dbfield 22 FileUpdateTime A[2:2]c
020A .dbfield 24 FileUpdateData A[2:2]c
020A .dbfield 26 Start i
020A .dbfield 28 Size l
020A .dbend
020A ; DirStart -> R20,R21
020A ; DirSecCut -> R22,R23
020A ; i -> R10,R11
020A ; m -> R14,R15
020A ; ID -> R12,R13
020A ; Name -> y+11
.even
020A _GetFileID::
020A 0E940000 xcall push_arg4
020E 0E940000 xcall push_gset5
0212 6901 movw R12,R18
0214 2197 sbiw R28,1
0216 .dbline -1
0216 .dbline 94
0216 ; }
0216 ; //********************************************************************************************
0216 ; //获得和文件名对应的目录项
0216 ; //********************************************************************************************
0216 ; uint8 GetFileID(uint8 * Name, DIR* ID)
0216 ; {
0216 .dbline 96
0216 ; uint16 DirSecCut, DirStart, i, m;
0216 ; DirSecCut = Info.DirSecCount; //目录占扇区总数
0216 60912200 lds R22,_Info+22
021A 70912300 lds R23,_Info+22+1
021E .dbline 97
021E ; DirStart = Info.DirStartSec; //目录开始扇区
021E 40911A00 lds R20,_Info+14
0222 50911B00 lds R21,_Info+14+1
0226 .dbline 98
0226 ; for(i = 0; i < DirSecCut; i++)
0226 AA24 clr R10
0228 BB24 clr R11
022A 3EC0 xjmp L43
022C L40:
022C .dbline 99
022C ; {
022C .dbline 100
022C ; if(!FAT_ReadBlock(DirStart + i))
022C 1A01 movw R2,R20
022E 2A0C add R2,R10
0230 3B1C adc R3,R11
0232 4424 clr R4
0234 5524 clr R5
0236 8101 movw R16,R2
0238 9201 movw R18,R4
023A E4DE xcall _FAT_ReadBlock
023C 0023 tst R16
023E 09F4 brne L44
0240 .dbline 101
0240 ; {
0240 .dbline 102
0240 ; break;
0240 37C0 xjmp L42
0242 L44:
0242 .dbline 104
0242 ; }
0242 ; for(m = 0; m <16; m++)
0242 EE24 clr R14
0244 FF24 clr R15
0246 28C0 xjmp L49
0248 L46:
0248 .dbline 105
0248 ; {
0248 .dbline 107
0248 ; // if(IsEqual(Name, &((DIR*)&BUFFER[m * 32])->FileName, 11))
0248 ; if(IsEqual(Name, &BUFFER[m * 32], 11))
0248 8BE0 ldi R24,11
024A 8883 std y+0,R24
024C 00E2 ldi R16,32
024E 10E0 ldi R17,0
0250 9701 movw R18,R14
0252 0E940000 xcall empy16s
0256 9801 movw R18,R16
0258 80E0 ldi R24,<_BUFFER
025A 90E0 ldi R25,>_BUFFER
025C 280F add R18,R24
025E 391F adc R19,R25
0260 0B85 ldd R16,y+11
0262 1C85 ldd R17,y+12
0264 EFDE xcall _IsEqual
0266 0023 tst R16
0268 A1F0 breq L50
026A .dbline 108
026A ; {
026A .dbline 109
026A ; *ID = *((DIR*)&BUFFER[m * 32]);
026A 00E2 ldi R16,32
026C 10E0 ldi R17,0
026E 9701 movw R18,R14
0270 0E940000 xcall empy16s
0274 1801 movw R2,R16
0276 80E0 ldi R24,<_BUFFER
0278 90E0 ldi R25,>_BUFFER
027A 280E add R2,R24
027C 391E adc R3,R25
027E 00E2 ldi R16,32
0280 10E0 ldi R17,0
0282 DA92 st -y,R13
0284 CA92 st -y,R12
0286 3A92 st -y,R3
0288 2A92 st -y,R2
028A 0E940000 xcall asgnblk
028E .dbline 110
028E ; return TRUE;
028E 01E0 ldi R16,1
0290 10C0 xjmp L37
0292 L50:
0292 .dbline 112
0292 L47:
0292 .dbline 104
0292 C701 movw R24,R14
0294 0196 adiw R24,1
0296 7C01 movw R14,R24
0298 L49:
0298 .dbline 104
0298 C701 movw R24,R14
029A 8031 cpi R24,16
029C E0E0 ldi R30,0
029E 9E07 cpc R25,R30
02A0 98F2 brlo L46
02A2 .dbline 113
02A2 L41:
02A2 .dbline 98
02A2 C501 movw R24,R10
02A4 0196 adiw R24,1
02A6 5C01 movw R10,R24
02A8 L43:
02A8 .dbline 98
02A8 A616 cp R10,R22
02AA B706 cpc R11,R23
02AC 08F4 brsh X0
02AE BECF xjmp L40
02B0 X0:
02B0 L42:
02B0 .dbline 114
02B0 ; }
02B0 ; }
02B0 ; }
02B0 ; return FALSE;
02B0 0027 clr R16
02B2 .dbline -2
02B2 L37:
02B2 2196 adiw R28,1
02B4 0E940000 xcall pop_gset5
02B8 2496 adiw R28,4
02BA .dbline 0 ; func end
02BA 0895 ret
02BC .dbsym r DirStart 20 i
02BC .dbsym r DirSecCut 22 i
02BC .dbsym r i 10 i
02BC .dbsym r m 14 i
02BC .dbsym r ID 12 pS[.4]
02BC .dbsym l Name 11 pc
02BC .dbend
02BC .dbfunc e FAT_FileOpen _FAT_FileOpen fl
02BC ; FileDir -> y+0
02BC ; BytePerClus -> R10,R11
02BC ; ClusNum -> R12,R13
02BC ; Start -> y+40
02BC ; Name -> R12,R13
.even
02BC _FAT_FileOpen::
02BC 3A93 st -y,r19
02BE 2A93 st -y,r18
02C0 0E940000 xcall push_gset4
02C4 6801 movw R12,R16
02C6 A097 sbiw R28,32
02C8 .dbline -1
02C8 .dbline 120
02C8 ; }
02C8 ; //********************************************************************************************
02C8 ; //打开指定文件
02C8 ; //********************************************************************************************
02C8 ; uint32 FAT_FileOpen(uint8 * Name, uint32 Start)
02C8 ; {
02C8 .dbline 123
02C8 ; uint16 BytePerClus, ClusNum;
02C8 ; DIR FileDir;
02C8 ; BytePerClus = Info.BPB_SecPerClus * 512; // 每簇的字节数
02C8 20910C00 lds R18,_Info
02CC 3327 clr R19
02CE 00E0 ldi R16,512
02D0 12E0 ldi R17,2
02D2 0E940000 xcall empy16s
02D6 5801 movw R10,R16
02D8 .dbline 124
02D8 ; if (!GetFileID(Name, &FileDir))
02D8 9E01 movw R18,R28
02DA 8601 movw R16,R12
02DC 96DF xcall _GetFileID
02DE 0023 tst R16
02E0 29F4 brne L53
02E2 .dbline 125
02E2 ; {
02E2 .dbline 126
02E2 ; return FALSE;
02E2 00E0 ldi R16,0
02E4 10E0 ldi R17,0
02E6 20E0 ldi R18,0
02E8 30E0 ldi R19,0
02EA B3C0 xjmp L52
02EC L53:
02EC .dbline 130
02EC ; }
02EC ;
02EC ; //计算开始位置所在簇的簇号
02EC ; ClusNum = Start / BytePerClus;
02EC 1501 movw R2,R10
02EE 4424 clr R4
02F0 5524 clr R5
02F2 FE01 movw R30,R28
02F4 60A4 ldd R6,z+40
02F6 71A4 ldd R7,z+41
02F8 82A4 ldd R8,z+42
02FA 93A4 ldd R9,z+43
02FC 5A92 st -y,R5
02FE 4A92 st -y,R4
0300 3A92 st -y,R3
0302 2A92 st -y,R2
0304 8301 movw R16,R6
0306 9401 movw R18,R8
0308 0E940000 xcall div32u
030C 6801 movw R12,R16
030E .dbline 131
030E ; FileIndex.ClusID = FileDir.Start;
030E 2A8C ldd R2,y+26
0310 3B8C ldd R3,y+27
0312 30920700 sts _FileIndex+6+1,R3
0316 20920600 sts _FileIndex+6,R2
031A .dbline 132
031A ; for(FileIndex.i = 0; FileIndex.i < ClusNum; FileIndex.i++)
031A 40E0 ldi R20,0
031C 50E0 ldi R21,0
031E 60E0 ldi R22,0
0320 70E0 ldi R23,0
0322 50930300 sts _FileIndex+2+1,R21
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -