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

📄 fat.lis

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0148 2689              ldd R18,z+22
 014A 3789              ldd R19,z+23
 014C 0089              ldd R16,z+16
 014E 1127              clr R17
 0150 0E940000          xcall empy16s
 0154 F501              movw R30,R10
 0156 2684              ldd R2,z+14
 0158 3784              ldd R3,z+15
 015A 200E              add R2,R16
 015C 311E              adc R3,R17
 015E 2601              movw R4,R12
 0160 420C              add R4,R2
 0162 531C              adc R5,R3
 0164 1201              movw R2,R4
 0166 4424              clr R4
 0168 5524              clr R5
 016A 30920500          sts _FirstRootDirSecNum+1,R3
 016E 20920400          sts _FirstRootDirSecNum,R2
 0172 50920700          sts _FirstRootDirSecNum+2+1,R5
 0176 40920600          sts _FirstRootDirSecNum+2,R4
 017A                   .dbline 62
 017A           ;               SecPerClus = bootp->BPB_SecPerClus;             //每个簇占用的扇区数目,SD卡应为8
 017A 2584              ldd R2,z+13
 017C 20920A00          sts _SecPerClus,R2
 0180                   .dbline 64
 0180           ;           //数据区的起始扇区数,FAT16/FAT12的根目录,一般占用32个扇区的大小:
 0180           ;               data_offset = FirstRootDirSecNum + 32;  
 0180 40E2              ldi R20,32
 0182 50E0              ldi R21,0
 0184 60E0              ldi R22,0
 0186 70E0              ldi R23,0
 0188 40900600          lds R4,_FirstRootDirSecNum+2
 018C 50900700          lds R5,_FirstRootDirSecNum+2+1
 0190 20900400          lds R2,_FirstRootDirSecNum
 0194 30900500          lds R3,_FirstRootDirSecNum+1
 0198 240E              add R2,R20
 019A 351E              adc R3,R21
 019C 461E              adc R4,R22
 019E 571E              adc R5,R23
 01A0 30921100          sts _data_offset+1,R3
 01A4 20921000          sts _data_offset,R2
 01A8 50921300          sts _data_offset+2+1,R5
 01AC 40921200          sts _data_offset+2,R4
 01B0                   .dbline 65
 01B0           ;       }
 01B0           L6:
 01B0                   .dbline 66
 01B0           ;       return(FirstRootDirSecNum);      //返回根目录区的起始扇区号
 01B0 20910600          lds R18,_FirstRootDirSecNum+2
 01B4 30910700          lds R19,_FirstRootDirSecNum+2+1
 01B8 00910400          lds R16,_FirstRootDirSecNum
 01BC 10910500          lds R17,_FirstRootDirSecNum+1
 01C0                   .dbline -2
 01C0           L1:
 01C0                   .dbline 0 ; func end
 01C0 2296              adiw R28,2
 01C2 0C940000          xjmp pop_xgsetF0FC
 01C6                   .dbsym r VBRadd 12 i
 01C6                   .dbsym r bootp32 14 pS[BootSec32]
 01C6                   .dbsym r bootp 10 pS[BootSec]
 01C6                   .dbsym r buff 14 pc
 01C6                   .dbend
 01C6                   .dbfunc e fat_load _fat_load fV
 01C6           ;            Tmp -> y+6
 01C6           ; FAT_Block_Addresse -> y+2
 01C6           ; FAT_Byte_Addresse -> R14,R15
 01C6           ;     TMP_Buffer -> R12,R13
 01C6           ;          Block -> R10,R11
 01C6           ;        Cluster -> y+20
                        .even
 01C6           _fat_load::
 01C6 0E940000          xcall push_arg4
 01CA 0E940000          xcall push_xgsetF0FC
 01CE 2A97              sbiw R28,10
 01D0 A88C              ldd R10,y+24
 01D2 B98C              ldd R11,y+25
 01D4 CA8C              ldd R12,y+26
 01D6 DB8C              ldd R13,y+27
 01D8                   .dbline -1
 01D8                   .dbline 75
 01D8           ; }
 01D8           ; 
 01D8           ; //############################################################################
 01D8           ; //解析FAT链表
 01D8           ; void fat_load(unsigned long Cluster,          //文件起始扇区
 01D8           ;                               unsigned long *Block,           //返回文件下一扇区
 01D8           ;                               unsigned char *TMP_Buffer)      //函数所需buffer
 01D8           ; //############################################################################
 01D8           ; {
 01D8                   .dbline 80
 01D8           ;       unsigned int FAT_Byte_Addresse; 
 01D8           ;       unsigned long FAT_Block_Addresse;
 01D8           ; 
 01D8           ;       //读取FAT表,根据FAT制式搜寻扇区
 01D8           ;       if(FatFlags == FAT_Flg_16)
 01D8 80910F00          lds R24,_FatFlags
 01DC 8130              cpi R24,1
 01DE 09F0              breq X18
 01E0 74C0              xjmp L10
 01E2           X18:
 01E2           X6:
 01E2                   .dbline 81
 01E2           ;       {
 01E2                   .dbline 82
 01E2           ;               if(Cluster == 0xFFFF)
 01E2 4FEF              ldi R20,255
 01E4 5FEF              ldi R21,255
 01E6 60E0              ldi R22,0
 01E8 70E0              ldi R23,0
 01EA 2C88              ldd R2,y+20
 01EC 3D88              ldd R3,y+21
 01EE 4E88              ldd R4,y+22
 01F0 5F88              ldd R5,y+23
 01F2 2416              cp R2,R20
 01F4 3506              cpc R3,R21
 01F6 4606              cpc R4,R22
 01F8 5706              cpc R5,R23
 01FA 09F4              brne L12
 01FC           X7:
 01FC                   .dbline 83
 01FC           ;               {
 01FC                   .dbline 84
 01FC           ;                       return; //文件已经到达末尾
 01FC 6EC2              xjmp L9
 01FE           L12:
 01FE                   .dbline 86
 01FE           ;               }
 01FE           ;               FAT_Byte_Addresse = ((Cluster<<1) & 0x1FF);
 01FE 4FEF              ldi R20,255
 0200 51E0              ldi R21,1
 0202 60E0              ldi R22,0
 0204 70E0              ldi R23,0
 0206 2C88              ldd R2,y+20
 0208 3D88              ldd R3,y+21
 020A 4E88              ldd R4,y+22
 020C 5F88              ldd R5,y+23
 020E 220C              lsl R2
 0210 331C              rol R3
 0212 441C              rol R4
 0214 551C              rol R5
 0216 2422              and R2,R20
 0218 3522              and R3,R21
 021A 4622              and R4,R22
 021C 5722              and R5,R23
 021E 7101              movw R14,R2
 0220                   .dbline 87
 0220           ;               FAT_Block_Addresse = ((Cluster<<1)/BlockSize) + fat_offset;
 0220 20901800          lds R2,_BlockSize
 0224 30901900          lds R3,_BlockSize+1
 0228 4424              clr R4
 022A 5524              clr R5
 022C 0C89              ldd R16,y+20
 022E 1D89              ldd R17,y+21
 0230 2E89              ldd R18,y+22
 0232 3F89              ldd R19,y+23
 0234 000F              lsl R16
 0236 111F              rol R17
 0238 221F              rol R18
 023A 331F              rol R19
 023C 5A92              st -y,R5
 023E 4A92              st -y,R4
 0240 3A92              st -y,R3
 0242 2A92              st -y,R2
 0244 0E940000          xcall div32u
 0248 1801              movw R2,R16
 024A 2901              movw R4,R18
 024C 80901600          lds R8,_fat_offset+2
 0250 90901700          lds R9,_fat_offset+2+1
 0254 60901400          lds R6,_fat_offset
 0258 70901500          lds R7,_fat_offset+1
 025C 260C              add R2,R6
 025E 371C              adc R3,R7
 0260 481C              adc R4,R8
 0262 591C              adc R5,R9
 0264 2A82              std y+2,R2
 0266 3B82              std y+3,R3
 0268 4C82              std y+4,R4
 026A 5D82              std y+5,R5
 026C                   .dbline 88
 026C           ;               MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
 026C D982              std y+1,R13
 026E C882              std y+0,R12
 0270 0A81              ldd R16,y+2
 0272 1B81              ldd R17,y+3
 0274 2C81              ldd R18,y+4
 0276 3D81              ldd R19,y+5
 0278 0E940000          xcall _MMC_SD_ReadSingleBlock
 027C                   .dbline 89
 027C           ;               *Block = (TMP_Buffer[FAT_Byte_Addresse + 1] << 8) + TMP_Buffer[FAT_Byte_Addresse];
 027C F701              movw R30,R14
 027E EC0D              add R30,R12
 0280 FD1D              adc R31,R13
 0282 2080              ldd R2,z+0
 0284 F701              movw R30,R14
 0286 3196              adiw R30,1
 0288 EC0D              add R30,R12
 028A FD1D              adc R31,R13
 028C 3080              ldd R3,z+0
 028E 4424              clr R4
 0290 37FC              sbrc R3,7
 0292 4094              com R4
 0294 5524              clr R5
 0296 47FC              sbrc R4,7
 0298 5094              com R5
 029A F501              movw R30,R10
 029C 2082              std z+0,R2
 029E 3182              std z+1,R3
 02A0 4282              std z+2,R4
 02A2 5382              std z+3,R5
 02A4                   .dbline 90
 02A4           ;               if(*Block == 0xFFFF)
 02A4 4FEF              ldi R20,255
 02A6 5FEF              ldi R21,255
 02A8 60E0              ldi R22,0
 02AA 70E0              ldi R23,0
 02AC 2416              cp R2,R20
 02AE 3506              cpc R3,R21
 02B0 4606              cpc R4,R22
 02B2 5706              cpc R5,R23
 02B4 09F0              breq X19
 02B6 11C2              xjmp L9
 02B8           X19:
 02B8           X8:
 02B8                   .dbline 91
 02B8           ;                       *Block = 0xFFFFFFFF;
 02B8 4FEF              ldi R20,255
 02BA 5FEF              ldi R21,255
 02BC 6FEF              ldi R22,255
 02BE 7FEF              ldi R23,255
 02C0 4083              std z+0,R20
 02C2 5183              std z+1,R21
 02C4 6283              std z+2,R22
 02C6 7383              std z+3,R23
 02C8                   .dbline 92
 02C8           ;       }
 02C8 08C2              xjmp L9
 02CA           L10:
 02CA                   .dbline 93
 02CA           ;       else if(FatFlags == FAT_Flg_12)
 02CA 20900F00          lds R2,_FatFlags
 02CE 2220              tst R2
 02D0 09F0              breq X20
 02D2 52C1              xjmp L16
 02D4           X20:
 02D4           X9:
 02D4                   .dbline 94
 02D4           ;       {
 02D4                   .dbline 95
 02D4           ;               if(Cluster == 0xFFF)
 02D4 4FEF              ldi R20,255
 02D6 5FE0              ldi R21,15
 02D8 60E0              ldi R22,0
 02DA 70E0              ldi R23,0
 02DC 2C88              ldd R2,y+20
 02DE 3D88              ldd R3,y+21
 02E0 4E88              ldd R4,y+22
 02E2 5F88              ldd R5,y+23
 02E4 2416              cp R2,R20
 02E6 3506              cpc R3,R21
 02E8 4606              cpc R4,R22
 02EA 5706              cpc R5,R23
 02EC 09F4              brne L18
 02EE           X10:
 02EE                   .dbline 96
 02EE           ;               {
 02EE                   .dbline 97
 02EE           ;                       return; //文件已经到达末尾
 02EE F5C1              xjmp L9
 02F0           L18:
 02F0                   .dbline 99
 02F0           ;               }
 02F0           ;               FAT_Byte_Addresse = (((Cluster*3)>>1) & 0x1FF);
 02F0 2C88              ldd R2,y+20
 02F2 3D88              ldd R3,y+21
 02F4 4E88              ldd R4,y+22
 02F6 5F88              ldd R5,y+23
 02F8 43E0              ldi R20,3
 02FA 50E0              ldi R21,0
 02FC 60E0              ldi R22,0
 02FE 70E0              ldi R23,0
 0300 5A92              st -y,R5
 0302 4A92              st -y,R4
 0304 3A92              st -y,R3
 0306 2A92              st -y,R2
 0308 8A01              movw R16,R20
 030A 9B01              movw R18,R22
 030C 0E940000          xcall empy32u
 0310 1801              movw R2,R16
 0312 2901              movw R4,R18
 0314 5694              lsr R5
 0316 4794              ror R4
 0318 3794              ror R3
 031A 2794              ror R2
 031C 4FEF              ldi R20,255
 031E 51E0              ldi R21,1
 0320 60E0              ldi R22,0
 0322 70E0              ldi R23,0
 0324 2422              and R2,R20
 0326 3522              and R3,R21
 0328 4622              and R4,R22
 032A 5722              and R5,R23
 032C 7101              movw R14,R2
 032E                   .dbline 100
 032E           ;               FAT_Block_Addresse = (((Cluster*3)>>1) / BlockSize) + fat_offset;
 032E 2C88              ldd R2,y+20
 0330 3D88              ldd R3,y+21
 0332 4E88              ldd R4,y+22
 0334 5F88              ldd R5,y+23
 0336 43E0              ldi R20,3
 0338 50E0              ldi R21,0
 033A 60E0              ldi R22,0
 033C 70E0              ldi R23,0
 033E 5A92              st -y,R5
 0340 4A92              st -y,R4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -