📄 fat.lis
字号:
.module fat.c
.area text(rom, con, rel)
0000 .dbfile D:\桌面\mp3\FAT\fat.c
0000 .dbfunc e FAT_Init _FAT_Init fV
.even
0000 _FAT_Init::
0000 .dbline -1
0000 .dbline 23
0000 ;
0000 ;
0000 ; #include "config.h"
0000 ;
0000 ;
0000 ; uint8 FAT_ReadBlock(uint32 LBA);
0000 ; uint8 FAT_WriteBlock(uint32 LBA);
0000 ; uint8 IsEqual(void* A, void* B, uint8 Size);
0000 ; void ReadBPB(void);
0000 ; uint32 ClusConvLBA(uint16 ClusID);
0000 ; uint16 FAT_ReadFAT(uint16 Index);
0000 ; uint8 GetFileID(uint8 Name[11], DIR* ID);
0000 ;
0000 ;
0000 ;
0000 ; static uint8 BUFFER[512];
0000 ; static FileSystemInfo Info;
0000 ; static FATFileIndex FileIndex;
0000 ; //********************************************************************************************
0000 ; //初始化驱动,建立必要数据结构
0000 ; //void FAT_Init(void);
0000 ; //********************************************************************************************
0000 ; void FAT_Init(void) {
0000 .dbline 24
0000 ; ReadBPB();
0000 39D0 xcall _ReadBPB
0002 .dbline -2
0002 L7:
0002 .dbline 0 ; func end
0002 0895 ret
0004 .dbend
0004 .dbfunc e FAT_ReadBlock _FAT_ReadBlock fc
0004 ; LBA -> y+2
.even
0004 _FAT_ReadBlock::
0004 0E940000 xcall push_arg4
0008 2297 sbiw R28,2
000A .dbline -1
000A .dbline 30
000A ; }
000A ;
000A ; //********************************************************************************************
000A ; //读一个扇区
000A ; //********************************************************************************************
000A ; uint8 FAT_ReadBlock(uint32 LBA) {
000A .dbline 31
000A ; return(MMC_Read_Sector(LBA , BUFFER));
000A 80E0 ldi R24,<_BUFFER
000C 90E0 ldi R25,>_BUFFER
000E 9983 std y+1,R25
0010 8883 std y+0,R24
0012 FE01 movw R30,R28
0014 0281 ldd R16,z+2
0016 1381 ldd R17,z+3
0018 2481 ldd R18,z+4
001A 3581 ldd R19,z+5
001C 0E940000 xcall _MMC_Read_Sector
0020 .dbline -2
0020 L8:
0020 2696 adiw R28,6
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbsym l LBA 2 l
0024 .dbend
0024 .dbfunc e FAT_WriteBlock _FAT_WriteBlock fc
0024 ; LBA -> y+2
.even
0024 _FAT_WriteBlock::
0024 0E940000 xcall push_arg4
0028 2297 sbiw R28,2
002A .dbline -1
002A .dbline 38
002A ; }
002A ; //********************************************************************************************
002A ; //写一个扇区
002A ; //********************************************************************************************
002A ;
002A ; uint8 FAT_WriteBlock(uint32 LBA)
002A ; {
002A .dbline 39
002A ; return(MMC_Write_Sector(LBA, BUFFER));
002A 80E0 ldi R24,<_BUFFER
002C 90E0 ldi R25,>_BUFFER
002E 9983 std y+1,R25
0030 8883 std y+0,R24
0032 FE01 movw R30,R28
0034 0281 ldd R16,z+2
0036 1381 ldd R17,z+3
0038 2481 ldd R18,z+4
003A 3581 ldd R19,z+5
003C 0E940000 xcall _MMC_Write_Sector
0040 .dbline -2
0040 L9:
0040 2696 adiw R28,6
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbsym l LBA 2 l
0044 .dbend
0044 .dbfunc e IsEqual _IsEqual fc
0044 ; b -> R20,R21
0044 ; a -> R22,R23
0044 ; i -> R10
0044 ; Size -> R12
0044 ; B -> R18,R19
0044 ; A -> R16,R17
.even
0044 _IsEqual::
0044 0E940000 xcall push_gset4
0048 C884 ldd R12,y+8
004A .dbline -1
004A .dbline 43
004A ; }
004A ;
004A ; uint8 IsEqual(void* A, void* B, uint8 Size)
004A ; {
004A .dbline 44
004A ; uint8 i, *a = A, *b = B;
004A B801 movw R22,R16
004C .dbline 44
004C A901 movw R20,R18
004E .dbline 45
004E ; for(i = 0; i < Size; i++)
004E AA24 clr R10
0050 0BC0 xjmp L14
0052 L11:
0052 .dbline 46
0052 ; if(*a++!= *b++)
0052 FA01 movw R30,R20
0054 2190 ld R2,Z+
0056 AF01 movw R20,R30
0058 FB01 movw R30,R22
005A 3190 ld R3,Z+
005C BF01 movw R22,R30
005E 3214 cp R3,R2
0060 11F0 breq L15
0062 .dbline 47
0062 ; return FALSE;
0062 0027 clr R16
0064 04C0 xjmp L10
0066 L15:
0066 L12:
0066 .dbline 45
0066 A394 inc R10
0068 L14:
0068 .dbline 45
0068 AC14 cp R10,R12
006A 98F3 brlo L11
006C .dbline 48
006C ; return TRUE;
006C 01E0 ldi R16,1
006E .dbline -2
006E L10:
006E 0E940000 xcall pop_gset4
0072 .dbline 0 ; func end
0072 0895 ret
0074 .dbsym r b 20 pc
0074 .dbsym r a 22 pc
0074 .dbsym r i 10 c
0074 .dbsym r Size 12 c
0074 .dbsym r B 18 pV
0074 .dbsym r A 16 pV
0074 .dbend
0074 .dbfunc e ReadBPB _ReadBPB fV
0074 .dbstruct 0 512 .3
0074 .dbfield 0 BS_jmpBoot A[3:3]c
0074 .dbfield 3 BS_OEMName A[8:8]c
0074 .dbfield 11 BPB_BytesPerSec i
0074 .dbfield 13 BPB_SecPerClus c
0074 .dbfield 14 BPB_RsvdSecCnt i
0074 .dbfield 16 BPB_NumFATs c
0074 .dbfield 17 BPB_RootEntCnt i
0074 .dbfield 19 BPB_TotSec16 i
0074 .dbfield 21 BPB_Media c
0074 .dbfield 22 BPB_FATSz16 i
0074 .dbfield 24 BPB_SecPerTrk i
0074 .dbfield 26 BPB_NumHeads i
0074 .dbfield 28 BPB_HiddSec l
0074 .dbfield 32 BPB_TotSec32 l
0074 .dbfield 36 BS_DrvNum c
0074 .dbfield 37 BS_Reservedl c
0074 .dbfield 38 BS_BootSig c
0074 .dbfield 39 BS_VolID l
0074 .dbfield 43 BS_VolLab A[11:11]c
0074 .dbfield 54 BS_FilSysType A[8:8]c
0074 .dbfield 62 ExecutableCode A[448:448]c
0074 .dbfield 510 ExecutableMarker A[2:2]c
0074 .dbend
0074 ; BPB -> R10,R11
.even
0074 _ReadBPB::
0074 0E940000 xcall push_gset3
0078 .dbline -1
0078 .dbline 56
0078 ; }
0078 ; //********************************************************************************************
0078 ; //读取BPB数据结构
0078 ; //static void ReadBPB(void)
0078 ; //********************************************************************************************
0078 ;
0078 ; void ReadBPB(void)
0078 ; {
0078 .dbline 57
0078 ; FAT_BPB* BPB = (FAT_BPB*)BUFFER;
0078 80E0 ldi R24,<_BUFFER
007A 90E0 ldi R25,>_BUFFER
007C 5C01 movw R10,R24
007E .dbline 58
007E ; FAT_ReadBlock(0);
007E 00E0 ldi R16,0
0080 10E0 ldi R17,0
0082 20E0 ldi R18,0
0084 30E0 ldi R19,0
0086 BEDF xcall _FAT_ReadBlock
0088 .dbline 61
0088 ;
0088 ; //缓存相关参数
0088 ; Info.BPB_SecPerClus = BPB->BPB_SecPerClus;
0088 F501 movw R30,R10
008A 2584 ldd R2,z+13
008C 20920C00 sts _Info,R2
0090 .dbline 62
0090 ; Info.BPB_RsvdSecCnt = BPB->BPB_RsvdSecCnt;
0090 F501 movw R30,R10
0092 2684 ldd R2,z+14
0094 3784 ldd R3,z+15
0096 30920E00 sts _Info+1+1,R3
009A 20920D00 sts _Info+1,R2
009E .dbline 63
009E ; Info.BPB_NumFATs = BPB->BPB_NumFATs;
009E F501 movw R30,R10
00A0 2088 ldd R2,z+16
00A2 20920F00 sts _Info+3,R2
00A6 .dbline 64
00A6 ; Info.BPB_RootEntCnt = BPB->BPB_RootEntCnt;
00A6 F501 movw R30,R10
00A8 2188 ldd R2,z+17
00AA 3288 ldd R3,z+18
00AC 30921100 sts _Info+4+1,R3
00B0 20921000 sts _Info+4,R2
00B4 .dbline 65
00B4 ; Info.BPB_TotSec16 = BPB->BPB_TotSec16;
00B4 F501 movw R30,R10
00B6 2388 ldd R2,z+19
00B8 3488 ldd R3,z+20
00BA 30921300 sts _Info+6+1,R3
00BE 20921200 sts _Info+6,R2
00C2 .dbline 66
00C2 ; Info.BPB_FATSz16 = BPB->BPB_FATSz16;
00C2 F501 movw R30,R10
00C4 2688 ldd R2,z+22
00C6 3788 ldd R3,z+23
00C8 30921500 sts _Info+8+1,R3
00CC 20921400 sts _Info+8,R2
00D0 .dbline 67
00D0 ; Info.BPB_HiddSec = BPB->BPB_HiddSec;
00D0 F501 movw R30,R10
00D2 248C ldd R2,z+28
00D4 358C ldd R3,z+29
00D6 468C ldd R4,z+30
00D8 578C ldd R5,z+31
00DA 30921700 sts _Info+10+1,R3
00DE 20921600 sts _Info+10,R2
00E2 50921900 sts _Info+10+2+1,R5
00E6 40921800 sts _Info+10+2,R4
00EA .dbline 69
00EA ;
00EA ; Info.DirStartSec = Info.BPB_RsvdSecCnt + Info.BPB_NumFATs * Info.BPB_FATSz16; //获取根目录开始扇区号
00EA 20911400 lds R18,_Info+8
00EE 30911500 lds R19,_Info+8+1
00F2 00910F00 lds R16,_Info+3
00F6 1127 clr R17
00F8 0E940000 xcall empy16s
00FC 20900D00 lds R2,_Info+1
0100 30900E00 lds R3,_Info+1+1
0104 200E add R2,R16
0106 311E adc R3,R17
0108 4424 clr R4
010A 5524 clr R5
010C 30921B00 sts _Info+14+1,R3
0110 20921A00 sts _Info+14,R2
0114 50921D00 sts _Info+14+2+1,R5
0118 40921C00 sts _Info+14+2,R4
011C .dbline 70
011C ; Info.DataStartSec = Info.DirStartSec + Info.BPB_RootEntCnt * 32 / 512; //获取数据区开始扇区号
011C 20911000 lds R18,_Info+4
0120 30911100 lds R19,_Info+4+1
0124 00E2 ldi R16,32
0126 10E0 ldi R17,0
0128 0E940000 xcall empy16s
012C 29E0 ldi R18,9
012E 30E0 ldi R19,0
0130 0E940000 xcall lsr16
0134 1801 movw R2,R16
0136 4424 clr R4
0138 5524 clr R5
013A 80901C00 lds R8,_Info+14+2
013E 90901D00 lds R9,_Info+14+2+1
0142 60901A00 lds R6,_Info+14
0146 70901B00 lds R7,_Info+14+1
014A 620C add R6,R2
014C 731C adc R7,R3
014E 841C adc R8,R4
0150 951C adc R9,R5
0152 70921F00 sts _Info+18+1,R7
0156 60921E00 sts _Info+18,R6
015A 90922100 sts _Info+18+2+1,R9
015E 80922000 sts _Info+18+2,R8
0162 .dbline 71
0162 ; Info.DirSecCount = Info.BPB_RootEntCnt * 32 / 512; //目录项占用的扇区数
0162 20911000 lds R18,_Info+4
0166 30911100 lds R19,_Info+4+1
016A 00E2 ldi R16,32
016C 10E0 ldi R17,0
016E 0E940000 xcall empy16s
0172 29E0 ldi R18,9
0174 30E0 ldi R19,0
0176 0E940000 xcall lsr16
017A 10932300 sts _Info+22+1,R17
017E 00932200 sts _Info+22,R16
0182 .dbline -2
0182 L17:
0182 0E940000 xcall pop_gset3
0186 .dbline 0 ; func end
0186 0895 ret
0188 .dbsym r BPB 10 pS[.3]
0188 .dbend
0188 .dbfunc e ClusConvLBA _ClusConvLBA fl
0188 ; ClusID -> R10,R11
.even
0188 _ClusConvLBA::
0188 0E940000 xcall push_gset3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -