📄 fat.lis
字号:
.module fat.c
.area data(ram, con, rel)
0000 _LongNameBuffer::
0000 .blkw 1
.area idata
0000 4300 .word _LONGNAME_BUFFER_ADDR
.area data(ram, con, rel)
0002 .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
0002 .dbsym e LongNameBuffer _LongNameBuffer pc
0002 _DirNameBuffer::
0002 .blkw 1
.area idata
0002 2500 .word _DIRNAME_BUFFER_ADDR
.area data(ram, con, rel)
0004 .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
0004 .dbsym e DirNameBuffer _DirNameBuffer pc
0004 _FatInCache::
0004 .blkb 4
.area idata
0004 00000000 .word 0,0
.area data(ram, con, rel)
0008 .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
0008 .dbsym e FatInCache _FatInCache l
.area text(rom, con, rel)
0000 .dbfile E:\V3U~1\sd\M64-SD卡MP3程序\fat.c
0000 .dbfunc e ReadBlock _ReadBlock fV
0000 ; temp -> y+0
0000 ; LBA -> y+4
.even
0000 _ReadBlock::
0000 0E940000 xcall push_arg4
0004 2497 sbiw R28,4
0006 .dbline -1
0006 .dbline 34
0006 ; /************************************************************/
0006 ; /* FAT Code for M32L */
0006 ; /* By pasyong */
0006 ; /* 2006-4 */
0006 ; /* Base ICC6.31A */
0006 ; /************************************************************/
0006 ; #include <iom64v.h>
0006 ; #include <macros.h>
0006 ; #include <string.h>
0006 ; #include "sd.h"
0006 ; #include "fat.h"
0006 ; #include "lcd.h"
0006 ;
0006 ;
0006 ; extern uchar BUFFER[512];
0006 ; unsigned char LONGNAME_BUFFER_ADDR[30];
0006 ; unsigned char DIRNAME_BUFFER_ADDR[30];
0006 ; unsigned char *LongNameBuffer = (unsigned char *) LONGNAME_BUFFER_ADDR;
0006 ; unsigned char *DirNameBuffer = (unsigned char *) DIRNAME_BUFFER_ADDR;
0006 ; struct partrecord PartInfo;
0006 ; unsigned char Fat32Enabled;
0006 ; unsigned long FirstDataSector;
0006 ; unsigned int BytesPerSector;
0006 ; unsigned int SectorsPerCluster;
0006 ; unsigned long FirstFATSector;
0006 ; unsigned long FirstDirSector;
0006 ; unsigned long FileSize;
0006 ; unsigned long FatInCache = 0;
0006 ;
0006 ; //********************************************************************************************
0006 ; //读一个扇区
0006 ; void ReadBlock(unsigned long LBA)
0006 ; //********************************************************************************************
0006 ; { unsigned long temp;
0006 .dbline 35
0006 ; temp=LBA<<9;
0006 89E0 ldi R24,9
0008 90E0 ldi R25,0
000A FE01 movw R30,R28
000C 2480 ldd R2,z+4
000E 3580 ldd R3,z+5
0010 4680 ldd R4,z+6
0012 5780 ldd R5,z+7
0014 8A93 st -y,R24
0016 8101 movw R16,R2
0018 9201 movw R18,R4
001A 0E940000 xcall lsl32
001E FE01 movw R30,R28
0020 0083 std z+0,R16
0022 1183 std z+1,R17
0024 2283 std z+2,R18
0026 3383 std z+3,R19
0028 .dbline 36
0028 ; SD_Read_Block(temp);
0028 FE01 movw R30,R28
002A 0081 ldd R16,z+0
002C 1181 ldd R17,z+1
002E 2281 ldd R18,z+2
0030 3381 ldd R19,z+3
0032 0E940000 xcall _SD_Read_Block
0036 .dbline -2
0036 L1:
0036 2896 adiw R28,8
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbsym l temp 0 l
003A .dbsym l LBA 4 l
003A .dbend
003A .dbfunc e fatClustToSect _fatClustToSect fl
003A ; clust -> y+4
.even
003A _fatClustToSect::
003A 0E940000 xcall push_arg4
003E 0E940000 xcall push_gset2
0042 .dbline -1
0042 .dbline 42
0042 ; }
0042 ; /*-----------------------------------------------------------------------
0042 ; 查询数据区一个簇开始扇区号
0042 ; -----------------------------------------------------------------------*/
0042 ; unsigned long fatClustToSect(unsigned long clust)
0042 ; {
0042 .dbline 43
0042 ; return ((clust-2) * SectorsPerCluster) + FirstDataSector;
0042 42E0 ldi R20,2
0044 50E0 ldi R21,0
0046 60E0 ldi R22,0
0048 70E0 ldi R23,0
004A FE01 movw R30,R28
004C 2480 ldd R2,z+4
004E 3580 ldd R3,z+5
0050 4680 ldd R4,z+6
0052 5780 ldd R5,z+7
0054 241A sub R2,R20
0056 350A sbc R3,R21
0058 460A sbc R4,R22
005A 570A sbc R5,R23
005C 60900C00 lds R6,_SectorsPerCluster
0060 70900D00 lds R7,_SectorsPerCluster+1
0064 8824 clr R8
0066 9924 clr R9
0068 9A92 st -y,R9
006A 8A92 st -y,R8
006C 7A92 st -y,R7
006E 6A92 st -y,R6
0070 8101 movw R16,R2
0072 9201 movw R18,R4
0074 0E940000 xcall empy32u
0078 1801 movw R2,R16
007A 2901 movw R4,R18
007C 80901200 lds R8,_FirstDataSector+2
0080 90901300 lds R9,_FirstDataSector+2+1
0084 60901000 lds R6,_FirstDataSector
0088 70901100 lds R7,_FirstDataSector+1
008C 260C add R2,R6
008E 371C adc R3,R7
0090 481C adc R4,R8
0092 591C adc R5,R9
0094 8101 movw R16,R2
0096 9201 movw R18,R4
0098 .dbline -2
0098 L2:
0098 0E940000 xcall pop_gset2
009C 2496 adiw R28,4
009E .dbline 0 ; func end
009E 0895 ret
00A0 .dbsym l clust 4 l
00A0 .dbend
00A0 .dbfunc e fatClusterSize _fatClusterSize fi
.even
00A0 _fatClusterSize::
00A0 .dbline -1
00A0 .dbline 49
00A0 ; }
00A0 ; /*-----------------------------------------------------------------------
00A0 ; 查询一个簇所占扇区数
00A0 ; -----------------------------------------------------------------------*/
00A0 ; unsigned int fatClusterSize(void)
00A0 ; {
00A0 .dbline 51
00A0 ; // return the number of sectors in a disk cluster
00A0 ; return SectorsPerCluster;
00A0 00910C00 lds R16,_SectorsPerCluster
00A4 10910D00 lds R17,_SectorsPerCluster+1
00A8 .dbline -2
00A8 L3:
00A8 .dbline 0 ; func end
00A8 0895 ret
00AA .dbend
00AA .dbfunc e fatInit _fatInit fc
00AA .dbstruct 0 41 bpb710
00AA .dbfield 0 bpbBytesPerSec i
00AA .dbfield 2 bpbSecPerClust c
00AA .dbfield 3 bpbResSectors i
00AA .dbfield 5 bpbFATs c
00AA .dbfield 6 bpbRootDirEnts i
00AA .dbfield 8 bpbSectors i
00AA .dbfield 10 bpbMedia c
00AA .dbfield 11 bpbFATsecs i
00AA .dbfield 13 bpbSecPerTrack i
00AA .dbfield 15 bpbHeads i
00AA .dbfield 17 bpbHiddenSecs l
00AA .dbfield 21 bpbHugeSectors l
00AA .dbfield 25 bpbBigFATsecs l
00AA .dbfield 29 bpbExtFlags i
00AA .dbfield 31 bpbFSVers i
00AA .dbfield 33 bpbRootClust l
00AA .dbfield 37 bpbFSInfo i
00AA .dbfield 39 bpbBackup i
00AA .dbend
00AA ; t2 -> R10
00AA ; t1 -> R12
00AA ; data -> R10,R11
00AA ; bpb -> R10,R11
.even
00AA _fatInit::
00AA 0E940000 xcall push_gset4
00AE 2297 sbiw R28,2
00B0 .dbline -1
00B0 .dbline 57
00B0 ; }
00B0 ; /*-----------------------------------------------------------------------
00B0 ; 查询SD卡文件系统信息
00B0 ; -----------------------------------------------------------------------*/
00B0 ; unsigned char fatInit()
00B0 ; {
00B0 .dbline 62
00B0 ; unsigned int data;unsigned char t1,t2;
00B0 ;
00B0 ; struct bpb710 *bpb;
00B0 ; // 读MBR结构
00B0 ; ReadBlock(0);
00B0 00E0 ldi R16,0
00B2 10E0 ldi R17,0
00B4 20E0 ldi R18,0
00B6 30E0 ldi R19,0
00B8 A3DF xcall _ReadBlock
00BA .dbline 64
00BA ; // 读取分区表信息
00BA ; PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
00BA 80E0 ldi R24,<_BUFFER+446
00BC 90E0 ldi R25,>_BUFFER+446
00BE E0E0 ldi R30,<_PartInfo
00C0 F0E0 ldi R31,>_PartInfo
00C2 00E1 ldi R16,16
00C4 10E0 ldi R17,0
00C6 FA93 st -y,R31
00C8 EA93 st -y,R30
00CA 9A93 st -y,R25
00CC 8A93 st -y,R24
00CE 0E940000 xcall asgnblk
00D2 .dbline 67
00D2 ; // 读引导扇区
00D2 ; // 引导扇区号在PartInfo.prStartLBA中
00D2 ; ReadBlock(PartInfo.prStartLBA); //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
00D2 20911F00 lds R18,_PartInfo+8+2
00D6 30912000 lds R19,_PartInfo+8+2+1
00DA 00911D00 lds R16,_PartInfo+8
00DE 10911E00 lds R17,_PartInfo+8+1
00E2 8EDF xcall _ReadBlock
00E4 .dbline 68
00E4 ; bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
00E4 80E0 ldi R24,<_BUFFER+11
00E6 90E0 ldi R25,>_BUFFER+11
00E8 5C01 movw R10,R24
00EA .dbline 70
00EA ;
00EA ; FirstDataSector = PartInfo.prStartLBA;
00EA 40901F00 lds R4,_PartInfo+8+2
00EE 50902000 lds R5,_PartInfo+8+2+1
00F2 20901D00 lds R2,_PartInfo+8
00F6 30901E00 lds R3,_PartInfo+8+1
00FA 30921100 sts _FirstDataSector+1,R3
00FE 20921000 sts _FirstDataSector,R2
0102 50921300 sts _FirstDataSector+2+1,R5
0106 40921200 sts _FirstDataSector+2,R4
010A .dbline 71
010A ; if(bpb->bpbFATsecs)
010A FC01 movw R30,R24
010C 2384 ldd R2,z+11
010E 3484 ldd R3,z+12
0110 2220 tst R2
0112 11F4 brne X0
0114 3320 tst R3
0116 21F1 breq L9
0118 X0:
0118 .dbline 72
0118 ; {
0118 .dbline 74
0118 ; // bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
0118 ; FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
0118 F501 movw R30,R10
011A 2385 ldd R18,z+11
011C 3485 ldd R19,z+12
011E F501 movw R30,R10
0120 0581 ldd R16,z+5
0122 1127 clr R17
0124 0E940000 xcall empy16s
0128 F501 movw R30,R10
012A 2380 ldd R2,z+3
012C 3480 ldd R3,z+4
012E 200E add R2,R16
0130 311E adc R3,R17
0132 4424 clr R4
0134 5524 clr R5
0136 80901200 lds R8,_FirstDataSector+2
013A 90901300 lds R9,_FirstDataSector+2+1
013E 60901000 lds R6,_FirstDataSector
0142 70901100 lds R7,_FirstDataSector+1
0146 620C add R6,R2
0148 731C adc R7,R3
014A 841C adc R8,R4
014C 951C adc R9,R5
014E 70921100 sts _FirstDataSector+1,R7
0152 60921000 sts _FirstDataSector,R6
0156 90921300 sts _FirstDataSector+2+1,R9
015A 80921200 sts _FirstDataSector+2,R8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -