📄 fat.lis
字号:
.module fat.c
.area text(rom, con, rel)
0000 .dbfile C:\DATA\MP3\Player\Code2\fat.c
0000 .dbfunc e InitFat _InitFat fV
.even
0000 _InitFat::
0000 0E940000 xcall push_gset2
0004 2897 sbiw R28,8
0006 .dbline -1
0006 .dbline 23
0006 ; #include <iom128v.h>
0006 ; #include <macros.h>
0006 ; #include <string.h>
0006 ; #include <stdio.h>
0006 ; #include "vs1001.h"
0006 ; #include "generic.h"
0006 ; #include "remote.h"
0006 ; #include "fat.h"
0006 ; #include "ata.h"
0006 ;
0006 ; //******************************************************************
0006 ; //* FAT Global Variable
0006 ; //******************************************************************
0006 ; struct PartRecord Part;
0006 ; struct BootRecord Boot;
0006 ; struct FileInfo File;
0006 ; unsigned long FirstDataSector;
0006 ;
0006 ; //*************************************
0006 ; // void init_fat(void)
0006 ; //*************************************
0006 ; void InitFat(void)
0006 ; {
0006 .dbline 24
0006 ; ata_read_sector_byte(0, 0, 446, sizeof(Part) , (unsigned char*)&Part);
0006 80E0 ldi R24,<_Part
0008 90E0 ldi R25,>_Part
000A 9F83 std y+7,R25
000C 8E83 std y+6,R24
000E 80E1 ldi R24,16
0010 90E0 ldi R25,0
0012 9D83 std y+5,R25
0014 8C83 std y+4,R24
0016 8EEB ldi R24,446
0018 91E0 ldi R25,1
001A 9B83 std y+3,R25
001C 8A83 std y+2,R24
001E 40E0 ldi R20,0
0020 50E0 ldi R21,0
0022 60E0 ldi R22,0
0024 70E0 ldi R23,0
0026 6883 std y+0,R22
0028 7983 std y+1,R23
002A 9A01 movw R18,R20
002C 0027 clr R16
002E 0E940000 xcall _ata_read_sector_byte
0032 .dbline 25
0032 ; ata_read_sector_byte(0, Part.StartLBA, 0, sizeof(Boot) , (unsigned char*)&Boot);
0032 80E0 ldi R24,<_Boot
0034 90E0 ldi R25,>_Boot
0036 9F83 std y+7,R25
0038 8E83 std y+6,R24
003A 84E3 ldi R24,52
003C 90E0 ldi R25,0
003E 9D83 std y+5,R25
0040 8C83 std y+4,R24
0042 2224 clr R2
0044 3324 clr R3
0046 3B82 std y+3,R3
0048 2A82 std y+2,R2
004A 40904E01 lds R4,_Part+8+2
004E 50904F01 lds R5,_Part+8+2+1
0052 20904C01 lds R2,_Part+8
0056 30904D01 lds R3,_Part+8+1
005A 4882 std y+0,R4
005C 5982 std y+1,R5
005E 9101 movw R18,R2
0060 0027 clr R16
0062 0E940000 xcall _ata_read_sector_byte
0066 .dbline 26
0066 ; FirstDataSector = Part.StartLBA + Boot.ResSectors + (Boot.FATs * Boot.FATSize);
0066 40903601 lds R4,_Boot+36+2
006A 50903701 lds R5,_Boot+36+2+1
006E 20903401 lds R2,_Boot+36
0072 30903501 lds R3,_Boot+36+1
0076 60902001 lds R6,_Boot+16
007A 7724 clr R7
007C 8824 clr R8
007E 9924 clr R9
0080 5A92 st -y,R5
0082 4A92 st -y,R4
0084 3A92 st -y,R3
0086 2A92 st -y,R2
0088 8301 movw R16,R6
008A 9401 movw R18,R8
008C 0E940000 xcall empy32u
0090 20901E01 lds R2,_Boot+14
0094 30901F01 lds R3,_Boot+14+1
0098 4424 clr R4
009A 5524 clr R5
009C 80904E01 lds R8,_Part+8+2
00A0 90904F01 lds R9,_Part+8+2+1
00A4 60904C01 lds R6,_Part+8
00A8 70904D01 lds R7,_Part+8+1
00AC 620C add R6,R2
00AE 731C adc R7,R3
00B0 841C adc R8,R4
00B2 951C adc R9,R5
00B4 600E add R6,R16
00B6 711E adc R7,R17
00B8 821E adc R8,R18
00BA 931E adc R9,R19
00BC 70920100 sts _FirstDataSector+1,R7
00C0 60920000 sts _FirstDataSector,R6
00C4 90920300 sts _FirstDataSector+2+1,R9
00C8 80920200 sts _FirstDataSector+2,R8
00CC .dbline -2
00CC .dbline 27
00CC ; }
00CC L1:
00CC 2896 adiw R28,8
00CE 0E940000 xcall pop_gset2
00D2 .dbline 0 ; func end
00D2 0895 ret
00D4 .dbend
00D4 .dbfunc e Clust2LBA _Clust2LBA fl
00D4 ; clust -> y+4
.even
00D4 _Clust2LBA::
00D4 0E940000 xcall push_arg4
00D8 0E940000 xcall push_gset2
00DC .dbline -1
00DC .dbline 33
00DC ;
00DC ; //*************************************
00DC ; // unsigned long clust2LBA(unsigned long clust)
00DC ; //*************************************
00DC ; unsigned long Clust2LBA(unsigned long clust)
00DC ; {
00DC .dbline 34
00DC ; return ((clust-2) * Boot.SecPerClust) + FirstDataSector;
00DC 42E0 ldi R20,2
00DE 50E0 ldi R21,0
00E0 60E0 ldi R22,0
00E2 70E0 ldi R23,0
00E4 FE01 movw R30,R28
00E6 2480 ldd R2,z+4
00E8 3580 ldd R3,z+5
00EA 4680 ldd R4,z+6
00EC 5780 ldd R5,z+7
00EE 241A sub R2,R20
00F0 350A sbc R3,R21
00F2 460A sbc R4,R22
00F4 570A sbc R5,R23
00F6 60901D01 lds R6,_Boot+13
00FA 7724 clr R7
00FC 8824 clr R8
00FE 9924 clr R9
0100 9A92 st -y,R9
0102 8A92 st -y,R8
0104 7A92 st -y,R7
0106 6A92 st -y,R6
0108 8101 movw R16,R2
010A 9201 movw R18,R4
010C 0E940000 xcall empy32u
0110 1801 movw R2,R16
0112 2901 movw R4,R18
0114 80900200 lds R8,_FirstDataSector+2
0118 90900300 lds R9,_FirstDataSector+2+1
011C 60900000 lds R6,_FirstDataSector
0120 70900100 lds R7,_FirstDataSector+1
0124 260C add R2,R6
0126 371C adc R3,R7
0128 481C adc R4,R8
012A 591C adc R5,R9
012C 8101 movw R16,R2
012E 9201 movw R18,R4
0130 .dbline -2
0130 L7:
0130 0E940000 xcall pop_gset2
0134 2496 adiw R28,4
0136 .dbline 0 ; func end
0136 0895 ret
0138 .dbsym l clust 4 l
0138 .dbend
0138 .dbfunc e GetNextCluster _GetNextCluster fl
0138 ; Fat32_Entry -> y+16
0138 ; FatSectorOffset -> y+12
0138 ; FatSectorNum -> y+8
0138 ; Clust -> y+24
.even
0138 _GetNextCluster::
0138 0E940000 xcall push_arg4
013C 0E940000 xcall push_gset2
0140 6497 sbiw R28,20
0142 .dbline -1
0142 .dbline 49
0142 ; }
0142 ;
0142 ; //****************************************************************
0142 ; // unsigned long GetNextCluster(unsigned long Clust)
0142 ; //
0142 ; // Description:
0142 ; // Returns the FAT32 Entry for the given Cluster Number.
0142 ; // The FAT32 Entry is the next cluster number of the cluster
0142 ; // chain. **May return a termination
0142 ; //
0142 ; // if Fat32_Entry >= 0x0FFFFFF8 EOC (End of Chain)
0142 ; // if Fat32_Entry == 0x0FFFFFF7 Bad Cluster
0142 ; //****************************************************************
0142 ; unsigned long GetNextCluster(unsigned long Clust)
0142 ; {
0142 .dbline 54
0142 ; unsigned long FatSectorNum;
0142 ; unsigned long FatSectorOffset;
0142 ; unsigned long Fat32_Entry;
0142 ;
0142 ; FatSectorNum = Part.StartLBA + Boot.ResSectors + ((Clust * 4) / Boot.BytesPerSec);;
0142 FE01 movw R30,R28
0144 208C ldd R2,z+24
0146 318C ldd R3,z+25
0148 428C ldd R4,z+26
014A 538C ldd R5,z+27
014C 44E0 ldi R20,4
014E 50E0 ldi R21,0
0150 60E0 ldi R22,0
0152 70E0 ldi R23,0
0154 5A92 st -y,R5
0156 4A92 st -y,R4
0158 3A92 st -y,R3
015A 2A92 st -y,R2
015C 8A01 movw R16,R20
015E 9B01 movw R18,R22
0160 0E940000 xcall empy32u
0164 20901B01 lds R2,_Boot+11
0168 30901C01 lds R3,_Boot+11+1
016C 4424 clr R4
016E 5524 clr R5
0170 5A92 st -y,R5
0172 4A92 st -y,R4
0174 3A92 st -y,R3
0176 2A92 st -y,R2
0178 0E940000 xcall div32u
017C 20901E01 lds R2,_Boot+14
0180 30901F01 lds R3,_Boot+14+1
0184 4424 clr R4
0186 5524 clr R5
0188 80904E01 lds R8,_Part+8+2
018C 90904F01 lds R9,_Part+8+2+1
0190 60904C01 lds R6,_Part+8
0194 70904D01 lds R7,_Part+8+1
0198 620C add R6,R2
019A 731C adc R7,R3
019C 841C adc R8,R4
019E 951C adc R9,R5
01A0 600E add R6,R16
01A2 711E adc R7,R17
01A4 821E adc R8,R18
01A6 931E adc R9,R19
01A8 FE01 movw R30,R28
01AA 6086 std z+8,R6
01AC 7186 std z+9,R7
01AE 8286 std z+10,R8
01B0 9386 std z+11,R9
01B2 .dbline 54
01B2 .dbline 55
01B2 ; FatSectorOffset = (Clust * 4) % Boot.BytesPerSec;
01B2 208C ldd R2,z+24
01B4 318C ldd R3,z+25
01B6 428C ldd R4,z+26
01B8 538C ldd R5,z+27
01BA 44E0 ldi R20,4
01BC 50E0 ldi R21,0
01BE 60E0 ldi R22,0
01C0 70E0 ldi R23,0
01C2 5A92 st -y,R5
01C4 4A92 st -y,R4
01C6 3A92 st -y,R3
01C8 2A92 st -y,R2
01CA 8A01 movw R16,R20
01CC 9B01 movw R18,R22
01CE 0E940000 xcall empy32u
01D2 20901B01 lds R2,_Boot+11
01D6 30901C01 lds R3,_Boot+11+1
01DA 4424 clr R4
01DC 5524 clr R5
01DE 5A92 st -y,R5
01E0 4A92 st -y,R4
01E2 3A92 st -y,R3
01E4 2A92 st -y,R2
01E6 0E940000 xcall mod32u
01EA FE01 movw R30,R28
01EC 0487 std z+12,R16
01EE 1587 std z+13,R17
01F0 2687 std z+14,R18
01F2 3787 std z+15,R19
01F4 .dbline 57
01F4 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -