⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat16.lis

📁 AVR单片机做的MP3
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -