📄 fat.lis
字号:
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 + -