📄 fat.lis
字号:
0242 5524 clr R5
0244 47FC sbrc R4,7
0246 5094 com R5
0248 80907D00 lds R8,_DiskFATInfo+2
024C 90907E00 lds R9,_DiskFATInfo+2+1
0250 60907B00 lds R6,_DiskFATInfo
0254 70907C00 lds R7,_DiskFATInfo+1
0258 620C add R6,R2
025A 731C adc R7,R3
025C 841C adc R8,R4
025E 951C adc R9,R5
0260 70928400 sts _DiskFATInfo+8+1,R7
0264 60928300 sts _DiskFATInfo+8,R6
0268 90928600 sts _DiskFATInfo+8+2+1,R9
026C 80928500 sts _DiskFATInfo+8+2,R8
0270 .dbline 64
0270 ;
0270 ; DiskFATInfo.FDT_LBA = DiskFATInfo.FAT_LBA + DiskFATInfo.SectorsPerFAT*DiskFATInfo.NumOfFATs;
0270 20908D00 lds R2,_DiskFATInfo+18
0274 3324 clr R3
0276 4424 clr R4
0278 5524 clr R5
027A 80909000 lds R8,_DiskFATInfo+19+2
027E 90909100 lds R9,_DiskFATInfo+19+2+1
0282 60908E00 lds R6,_DiskFATInfo+19
0286 70908F00 lds R7,_DiskFATInfo+19+1
028A 5A92 st -y,R5
028C 4A92 st -y,R4
028E 3A92 st -y,R3
0290 2A92 st -y,R2
0292 8301 movw R16,R6
0294 9401 movw R18,R8
0296 0E940000 xcall empy32u
029A 40908500 lds R4,_DiskFATInfo+8+2
029E 50908600 lds R5,_DiskFATInfo+8+2+1
02A2 20908300 lds R2,_DiskFATInfo+8
02A6 30908400 lds R3,_DiskFATInfo+8+1
02AA 200E add R2,R16
02AC 311E adc R3,R17
02AE 421E adc R4,R18
02B0 531E adc R5,R19
02B2 30928000 sts _DiskFATInfo+4+1,R3
02B6 20927F00 sts _DiskFATInfo+4,R2
02BA 50928200 sts _DiskFATInfo+4+2+1,R5
02BE 40928100 sts _DiskFATInfo+4+2,R4
02C2 .dbline 68
02C2 ;
02C2 ;
02C2 ;
02C2 ; DiskFATInfo.FDT_StartClustor = Fat_Buffer[0x2C] |Fat_Buffer[0x2D] << 8|(uint32)Fat_Buffer[0x2E]<<16|(uint32)Fat_Buffer[0x2F]<<24;
02C2 2090C700 lds R2,_Fat_Buffer+45
02C6 3324 clr R3
02C8 322C mov R3,R2
02CA 2224 clr R2
02CC 4090C600 lds R4,_Fat_Buffer+44
02D0 5524 clr R5
02D2 4228 or R4,R2
02D4 5328 or R5,R3
02D6 1201 movw R2,R4
02D8 4424 clr R4
02DA 37FC sbrc R3,7
02DC 4094 com R4
02DE 5524 clr R5
02E0 47FC sbrc R4,7
02E2 5094 com R5
02E4 6090C800 lds R6,_Fat_Buffer+46
02E8 7724 clr R7
02EA 8824 clr R8
02EC 9924 clr R9
02EE 4301 movw R8,R6
02F0 6624 clr R6
02F2 7724 clr R7
02F4 2628 or R2,R6
02F6 3728 or R3,R7
02F8 4828 or R4,R8
02FA 5928 or R5,R9
02FC 88E1 ldi R24,24
02FE 90E0 ldi R25,0
0300 6090C900 lds R6,_Fat_Buffer+47
0304 7724 clr R7
0306 8824 clr R8
0308 9924 clr R9
030A 8A93 st -y,R24
030C 8301 movw R16,R6
030E 9401 movw R18,R8
0310 0E940000 xcall lsl32
0314 202A or R2,R16
0316 312A or R3,R17
0318 422A or R4,R18
031A 532A or R5,R19
031C 30928800 sts _DiskFATInfo+12+1,R3
0320 20928700 sts _DiskFATInfo+12,R2
0324 .dbline 70
0324 ;
0324 ; return 1;
0324 01E0 ldi R16,1
0326 .dbline -2
0326 L1:
0326 2296 adiw R28,2
0328 0E940000 xcall pop_gset3
032C .dbline 0 ; func end
032C 0895 ret
032E .dbend
032E .dbfunc e FileExt_Compare _FileExt_Compare fc
032E ; i -> R20
032E ; strExt2 -> R18,R19
032E ; strExt1 -> R16,R17
.even
032E _FileExt_Compare::
032E 0E940000 xcall push_gset1
0332 .dbline -1
0332 .dbline 76
0332 ; }
0332 ;
0332 ; //****************************************************************************
0332 ; //文件扩展名匹配,匹配成功返回真
0332 ; uint8 FileExt_Compare(uint8 *strExt1,uint8 *strExt2)
0332 ; {
0332 .dbline 79
0332 ; uint8 i;
0332 ;
0332 ; for(i=0; i<3; i++)
0332 4427 clr R20
0334 0EC0 xjmp L54
0336 L51:
0336 .dbline 80
0336 ; {
0336 .dbline 81
0336 ; if(strExt1[i]!= strExt2[i]) break;
0336 E42F mov R30,R20
0338 FF27 clr R31
033A E20F add R30,R18
033C F31F adc R31,R19
033E 2080 ldd R2,z+0
0340 E42F mov R30,R20
0342 FF27 clr R31
0344 E00F add R30,R16
0346 F11F adc R31,R17
0348 3080 ldd R3,z+0
034A 3214 cp R3,R2
034C 09F0 breq L55
034E .dbline 81
034E 03C0 xjmp L53
0350 L55:
0350 .dbline 82
0350 L52:
0350 .dbline 79
0350 4395 inc R20
0352 L54:
0352 .dbline 79
0352 4330 cpi R20,3
0354 80F3 brlo L51
0356 L53:
0356 .dbline 83
0356 ; }
0356 ; if(i == 3) return 1;
0356 4330 cpi R20,3
0358 11F4 brne L57
035A .dbline 83
035A 01E0 ldi R16,1
035C 01C0 xjmp L50
035E L57:
035E .dbline 85
035E ;
035E ; return 0;
035E 0027 clr R16
0360 .dbline -2
0360 L50:
0360 0E940000 xcall pop_gset1
0364 .dbline 0 ; func end
0364 0895 ret
0366 .dbsym r i 20 c
0366 .dbsym r strExt2 18 pc
0366 .dbsym r strExt1 16 pc
0366 .dbend
0366 .dbfunc e GetMusicFile _GetMusicFile fV
0366 ; FileExt -> y+18
0366 ; LocalOfFirstLFN -> y+14
0366 ; Index_tmp -> y+10
0366 ; n -> y+6
0366 ; LocalOfMusic -> y+27
0366 ; k -> y+25
0366 ; i -> y+23
0366 ; tem -> y+2
0366 ; j -> y+21
.even
0366 _GetMusicFile::
0366 0E940000 xcall push_gset5
036A A197 sbiw R28,33
036C .dbline -1
036C .dbline 91
036C ; }
036C ;
036C ; //****************************************************************************
036C ; //获取音乐文件
036C ; void GetMusicFile(void)
036C ; {
036C .dbline 94
036C ; uint16 i,j,k;
036C ; uint32 tem; //记录目录起始位置
036C ; uint32 Index_tmp=1; //记录目录编号,不从0开始,因为第0项是系统占用的
036C 41E0 ldi R20,1
036E 50E0 ldi R21,0
0370 60E0 ldi R22,0
0372 70E0 ldi R23,0
0374 FE01 movw R30,R28
0376 4287 std z+10,R20
0378 5387 std z+11,R21
037A 6487 std z+12,R22
037C 7587 std z+13,R23
037E .dbline 97
037E ; uint32 LocalOfFirstLFN;
037E ; uint32 n;
037E ; uint16 LocalOfMusic=0; //音乐文件的编号
037E 0024 clr R0
0380 1124 clr R1
0382 1C8E std y+28,R1
0384 0B8E std y+27,R0
0386 03C5 xjmp L61
0388 L60:
0388 .dbline 102
0388 ; uint8 FileExt[3];
0388 ;
0388 ;
0388 ; while(1)
0388 ; {
0388 .dbline 103
0388 ; n = DiskFATInfo.FDT_LBA+(Index_tmp/(DiskFATInfo.BytesPerSector/32));
0388 25E0 ldi R18,5
038A 30E0 ldi R19,0
038C 00918A00 lds R16,_DiskFATInfo+15
0390 10918B00 lds R17,_DiskFATInfo+15+1
0394 0E940000 xcall lsr16
0398 1801 movw R2,R16
039A 4424 clr R4
039C 5524 clr R5
039E FE01 movw R30,R28
03A0 6284 ldd R6,z+10
03A2 7384 ldd R7,z+11
03A4 8484 ldd R8,z+12
03A6 9584 ldd R9,z+13
03A8 5A92 st -y,R5
03AA 4A92 st -y,R4
03AC 3A92 st -y,R3
03AE 2A92 st -y,R2
03B0 8301 movw R16,R6
03B2 9401 movw R18,R8
03B4 0E940000 xcall div32u
03B8 40908100 lds R4,_DiskFATInfo+4+2
03BC 50908200 lds R5,_DiskFATInfo+4+2+1
03C0 20907F00 lds R2,_DiskFATInfo+4
03C4 30908000 lds R3,_DiskFATInfo+4+1
03C8 200E add R2,R16
03CA 311E adc R3,R17
03CC 421E adc R4,R18
03CE 531E adc R5,R19
03D0 FE01 movw R30,R28
03D2 2682 std z+6,R2
03D4 3782 std z+7,R3
03D6 4086 std z+8,R4
03D8 5186 std z+9,R5
03DA .dbline 106
03DA ;
03DA ; //读取FDT的相应扇区位置的内容
03DA ; SD_ReadBlock(n,Fat_Buffer);
03DA 80E0 ldi R24,<_Fat_Buffer
03DC 90E0 ldi R25,>_Fat_Buffer
03DE 9983 std y+1,R25
03E0 8883 std y+0,R24
03E2 FE01 movw R30,R28
03E4 0681 ldd R16,z+6
03E6 1781 ldd R17,z+7
03E8 2085 ldd R18,z+8
03EA 3185 ldd R19,z+9
03EC 0E940000 xcall _SD_ReadBlock
03F0 .dbline 108
03F0 ;
03F0 ; tem=((Index_tmp)*32)%DiskFATInfo.BytesPerSector; //获取相应的目录
03F0 FE01 movw R30,R28
03F2 2284 ldd R2,z+10
03F4 3384 ldd R3,z+11
03F6 4484 ldd R4,z+12
03F8 5584 ldd R5,z+13
03FA 40E2 ldi R20,32
03FC 50E0 ldi R21,0
03FE 60E0 ldi R22,0
0400 70E0 ldi R23,0
0402 5A92 st -y,R5
0404 4A92 st -y,R4
0406 3A92 st -y,R3
0408 2A92 st -y,R2
040A 8A01 movw R16,R20
040C 9B01 movw R18,R22
040E 0E940000 xcall empy32u
0412 20908A00 lds R2,_DiskFATInfo+15
0416 30908B00 lds R3,_DiskFATInfo+15+1
041A 4424 clr R4
041C 5524 clr R5
041E 5A92 st -y,R5
0420 4A92 st -y,R4
0422 3A92 st -y,R3
0424 2A92 st -y,R2
0426 0E940000 xcall mod32u
042A FE01 movw R30,R28
042C 0283 std z+2,R16
042E 1383 std z+3,R17
0430 2483 std z+4,R18
0432 3583 std z+5,R19
0434 .dbline 110
0434 ;
0434 ; if(Fat_Buffer[tem] == 0) //后面没有文件了,文件查询完毕
0434 80E0 ldi R24,<_Fat_Buffer
0436 90E0 ldi R25,>_Fat_Buffer
0438 FE01 movw R30,R28
043A AF93 push R26
043C BF93 push R27
043E A281 ldd R26,z+2
0440 B381 ldd R27,z+3
0442 FD01 movw R30,R26
0444 BF91 pop R27
0446 AF91 pop R26
0448 E80F add R30,R24
044A F91F adc R31,R25
044C 2080 ldd R2,z+0
044E 2220 tst R2
0450 51F4 brne L66
0452 .dbline 111
0452 ; {
0452 .dbline 112
0452 ; Index_tmp = 0;
0452 40E0 ldi R20,0
0454 50E0 ldi R21,0
0456 60E0 ldi R22,0
0458 70E0 ldi R23,0
045A FE01 movw R30,R28
045C 4287 std z+10,R20
045E 5387 std z+11,R21
0460 6487 std z+12,R22
0462 7587 std z+13,R23
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -