📄 fat16.lis
字号:
021E .dbfunc e ReadFAT _ReadFAT fi
021E ; RAM -> R20,R21
021E ; Index -> R22,R23
.even
021E _ReadFAT::
021E 00D0 rcall push_gset2
0220 B801 movw R22,R16
0222 .dbline -1
0222 .dbline 153
0222 ; }
0222 ;
0222 ; //********************************************************************************************
0222 ; //读取文件分配表的指定项
0222 ; static uint16 ReadFAT(uint16 Index)
0222 ; //********************************************************************************************
0222 ; {
0222 .dbline 154
0222 ; uint16 *RAM = (uint16*)BUFFER;
0222 40E0 ldi R20,<_BUFFER
0224 50E0 ldi R21,>_BUFFER
0226 .dbline 155
0226 ; ReadBlock(BPB_RsvdSecCnt + (Index >>8));
0226 1B01 movw R2,R22
0228 232C mov R2,R3
022A 3324 clr R3
022C 40901F00 lds R4,_BPB_RsvdSecCnt
0230 50902000 lds R5,_BPB_RsvdSecCnt+1
0234 420C add R4,R2
0236 531C adc R5,R3
0238 1201 movw R2,R4
023A 4424 clr R4
023C 5524 clr R5
023E 8101 movw R16,R2
0240 9201 movw R18,R4
0242 E4DE rcall _ReadBlock
0244 .dbline 156
0244 ; return RAM[Index % 256];
0244 9B01 movw R18,R22
0246 3070 andi R19,0
0248 02E0 ldi R16,2
024A 10E0 ldi R17,0
024C 00D0 rcall empy16s
024E F801 movw R30,R16
0250 E40F add R30,R20
0252 F51F adc R31,R21
0254 0081 ldd R16,z+0
0256 1181 ldd R17,z+1
0258 .dbline -2
0258 L33:
0258 00D0 rcall pop_gset2
025A .dbline 0 ; func end
025A 0895 ret
025C .dbsym r RAM 20 pi
025C .dbsym r Index 22 i
025C .dbend
025C .dbfunc s GetNextmp3 _GetNextmp3 fi
025C ; DirSecCut -> R20,R21
025C ; i -> R22
025C ; DirStart -> R10,R11
025C ; m -> R20
.even
025C _GetNextmp3:
025C 00D0 rcall push_gset3
025E .dbline -1
025E .dbline 160
025E ; }
025E ;
025E ; uint16 GetNextmp3()
025E ; {
025E .dbline 163
025E ; uint16 DirSecCut, DirStart;
025E ; uint8 i,m;
025E ; DirSecCut = GetDirSecCount();
025E B4DF rcall _GetDirSecCount
0260 A801 movw R20,R16
0262 6EC0 rjmp L36
0264 L35:
0264 .dbline 165
0264 ; while(fileindex<=512)
0264 ; {
0264 .dbline 166
0264 ; if(flag) fileindex++;
0264 20900400 lds R2,_flag
0268 2220 tst R2
026A 51F0 breq L38
026C .dbline 166
026C 80910200 lds R24,_fileindex
0270 90910300 lds R25,_fileindex+1
0274 0196 adiw R24,1
0276 90930300 sts _fileindex+1,R25
027A 80930200 sts _fileindex,R24
027E 09C0 rjmp L39
0280 L38:
0280 .dbline 167
0280 ; else fileindex--;
0280 80910200 lds R24,_fileindex
0284 90910300 lds R25,_fileindex+1
0288 0197 sbiw R24,1
028A 90930300 sts _fileindex+1,R25
028E 80930200 sts _fileindex,R24
0292 L39:
0292 .dbline 168
0292 ; if(fileindex<=1) fileindex=510;
0292 81E0 ldi R24,1
0294 90E0 ldi R25,0
0296 20900200 lds R2,_fileindex
029A 30900300 lds R3,_fileindex+1
029E 8215 cp R24,R2
02A0 9305 cpc R25,R3
02A2 30F0 brlo L40
02A4 .dbline 168
02A4 8EEF ldi R24,510
02A6 91E0 ldi R25,1
02A8 90930300 sts _fileindex+1,R25
02AC 80930200 sts _fileindex,R24
02B0 L40:
02B0 .dbline 169
02B0 ; if(fileindex>=511)fileindex=2;
02B0 80910200 lds R24,_fileindex
02B4 90910300 lds R25,_fileindex+1
02B8 8F3F cpi R24,255
02BA E1E0 ldi R30,1
02BC 9E07 cpc R25,R30
02BE 30F0 brlo L42
02C0 .dbline 169
02C0 82E0 ldi R24,2
02C2 90E0 ldi R25,0
02C4 90930300 sts _fileindex+1,R25
02C8 80930200 sts _fileindex,R24
02CC L42:
02CC .dbline 170
02CC ; i=fileindex/16;
02CC 60910200 lds R22,_fileindex
02D0 70910300 lds R23,_fileindex+1
02D4 7695 lsr R23
02D6 6795 ror R22
02D8 7695 lsr R23
02DA 6795 ror R22
02DC 7695 lsr R23
02DE 6795 ror R22
02E0 7695 lsr R23
02E2 6795 ror R22
02E4 .dbline 171
02E4 ; DirStart = DirStartSec();
02E4 4ADF rcall _DirStartSec
02E6 5801 movw R10,R16
02E8 .dbline 172
02E8 ; ReadBlock(DirStart + i);
02E8 262E mov R2,R22
02EA 3324 clr R3
02EC 2501 movw R4,R10
02EE 420C add R4,R2
02F0 531C adc R5,R3
02F2 1201 movw R2,R4
02F4 4424 clr R4
02F6 5524 clr R5
02F8 8101 movw R16,R2
02FA 9201 movw R18,R4
02FC 87DE rcall _ReadBlock
02FE .dbline 173
02FE ; m=(fileindex%16);
02FE 40910200 lds R20,_fileindex
0302 4F70 andi R20,15
0304 5070 andi R21,0
0306 .dbline 174
0306 ; if(Ismp3(&((DIR*)&BUFFER[m * 32])->FileName))
0306 80E2 ldi R24,32
0308 849F mul R24,R20
030A 8001 movw R16,R0
030C 80E0 ldi R24,<_BUFFER
030E 90E0 ldi R25,>_BUFFER
0310 080F add R16,R24
0312 191F adc R17,R25
0314 B1DE rcall _Ismp3
0316 0023 tst R16
0318 99F0 breq L44
031A .dbline 175
031A ; {
031A .dbline 176
031A ; *(&fileid) = *((DIR*)&BUFFER[m * 32]);
031A 80E2 ldi R24,32
031C 849F mul R24,R20
031E 1001 movw R2,R0
0320 80E0 ldi R24,<_BUFFER
0322 90E0 ldi R25,>_BUFFER
0324 280E add R2,R24
0326 391E adc R3,R25
0328 80E0 ldi R24,<_fileid
032A 90E0 ldi R25,>_fileid
032C 00E2 ldi R16,32
032E 10E0 ldi R17,0
0330 9A93 st -y,R25
0332 8A93 st -y,R24
0334 3A92 st -y,R3
0336 2A92 st -y,R2
0338 00D0 rcall asgnblk
033A .dbline 177
033A ; return 1; //找到对应的目录项,返回位置
033A 01E0 ldi R16,1
033C 10E0 ldi R17,0
033E 0AC0 rjmp L34
0340 L44:
0340 .dbline 179
0340 L36:
0340 .dbline 164
0340 80E0 ldi R24,512
0342 92E0 ldi R25,2
0344 20900200 lds R2,_fileindex
0348 30900300 lds R3,_fileindex+1
034C 8215 cp R24,R2
034E 9305 cpc R25,R3
0350 08F0 brlo X0
0352 88CF rjmp L35
0354 X0:
0354 .dbline -2
0354 L34:
0354 00D0 rcall pop_gset3
0356 .dbline 0 ; func end
0356 0895 ret
0358 .dbsym r DirSecCut 20 i
0358 .dbsym r i 22 c
0358 .dbsym r DirStart 10 i
0358 .dbsym r m 20 c
0358 .dbend
0358 .dbfunc s GetFileID _GetFileID fc
0358 .dbstruct 0 6 .2
0358 .dbfield 0 Start i
0358 .dbfield 2 Size l
0358 .dbend
0358 .dbstruct 0 32 .3
0358 .dbfield 0 FileName A[11:11]c
0358 .dbfield 11 FileAttrib c
0358 .dbfield 12 UnUsed A[10:10]c
0358 .dbfield 22 FileUpdateTime A[2:2]c
0358 .dbfield 24 FileUpdateData A[2:2]c
0358 .dbfield 26 FilePosit S[.2]
0358 .dbend
0358 ; DirStart -> R20,R21
0358 ; DirSecCut -> R22,R23
0358 ; i -> R10,R11
0358 ; m -> R14,R15
0358 ; ID -> R12,R13
0358 ; Name -> y+11
.even
0358 _GetFileID:
0358 00D0 rcall push_arg4
035A 00D0 rcall push_gset5
035C 6901 movw R12,R18
035E 2197 sbiw R28,1
0360 .dbline -1
0360 .dbline 183
0360 ; }
0360 ; }
0360 ; }
0360 ; static uint8 GetFileID(uint8 Name[11],DIR* ID)
0360 ; //********************************************************************************************
0360 ; {
0360 .dbline 185
0360 ; uint16 DirSecCut, DirStart, i, m;
0360 ; DirSecCut = GetDirSecCount();
0360 33DF rcall _GetDirSecCount
0362 B801 movw R22,R16
0364 .dbline 186
0364 ; DirStart = DirStartSec();
0364 0ADF rcall _DirStartSec
0366 A801 movw R20,R16
0368 .dbline 187
0368 ; for(i = 0; i < DirSecCut; i++)
0368 AA24 clr R10
036A BB24 clr R11
036C 38C0 rjmp L50
036E L47:
036E .dbline 188
036E ; {
036E .dbline 189
036E ; ReadBlock(DirStart + i);
036E 1A01 movw R2,R20
0370 2A0C add R2,R10
0372 3B1C adc R3,R11
0374 4424 clr R4
0376 5524 clr R5
0378 8101 movw R16,R2
037A 9201 movw R18,R4
037C 47DE rcall _ReadBlock
037E .dbline 190
037E ; for(m = 0; m <16; m++)
037E EE24 clr R14
0380 FF24 clr R15
0382 25C0 rjmp L54
0384 L51:
0384 .dbline 191
0384 ; {
0384 .dbline 192
0384 ; if(IsEqual(Name, &((DIR*)&BUFFER[m * 32])->FileName, 11))
0384 8BE0 ldi R24,11
0386 8883 std y+0,R24
0388 00E2 ldi R16,32
038A 10E0 ldi R17,0
038C 9701 movw R18,R14
038E 00D0 rcall empy16s
0390 9801 movw R18,R16
0392 80E0 ldi R24,<_BUFFER
0394 90E0 ldi R25,>_BUFFER
0396 280F add R18,R24
0398 391F adc R19,R25
039A 0B85 ldd R16,y+11
039C 1C85 ldd R17,y+12
039E 52DE rcall _IsEqual
03A0 0023 tst R16
03A2 91F0 breq L55
03A4 .dbline 193
03A4 ; {
03A4 .dbline 194
03A4 ; *ID = *((DIR*)&BUFFER[m * 32]);
03A4 00E2 ldi R16,32
03A6 10E0 ldi R17,0
03A8 9701 movw R18,R14
03AA 00D0 rcall empy16s
03AC 1801 movw R2,R16
03AE 80E0 ldi R24,<_BUFFER
03B0 90E0 ldi R25,>_BUFFER
03B2 280E add R2,R24
03B4 391E adc R3,R25
03B6 00E2 ldi R16,32
03B8 10E0 ldi R17,0
03BA DA92 st -y,R13
03BC CA92 st -y,R12
03BE 3A92 st -y,R3
03C0 2A92 st -y,R2
03C2 00D0 rcall asgnblk
03C4 .dbline 195
03C4 ; return 1; //找到对应的目录项,返回1
03C4 01E0 ldi R16,1
03C6 10C0 rjmp L46
03C8 L55:
03C8 .dbline 197
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -