📄 fat.lis
字号:
.module fat.c
.area text(rom, con, rel)
0000 .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
.area data(ram, con, rel)
0000 .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
0000 _old_pos_a::
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
0002 .dbsym e old_pos_a _old_pos_a i
.area lit(rom, con, rel)
0000 _Search_FileExName1::
0000 4D50 .byte 'M,'P
0002 33 .byte 51
0003 .dbsym e Search_FileExName1 _Search_FileExName1 A[3:3]kc
.area text(rom, con, rel)
0000 .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
0000 .dbfunc e fat_root_dir_addr _fat_root_dir_addr fl
0000 .dbstruct 0 62 BootSec
0000 .dbfield 0 BS_jmpBoot A[3:3]c
0000 .dbfield 3 BS_OEMName A[8:8]c
0000 .dbfield 11 BPB_BytesPerSec i
0000 .dbfield 13 BPB_SecPerClus c
0000 .dbfield 14 BPB_RsvdSecCnt i
0000 .dbfield 16 BPB_NumFATs c
0000 .dbfield 17 BPB_RootEntCnt i
0000 .dbfield 19 BPB_TotSec16 i
0000 .dbfield 21 BPB_Media c
0000 .dbfield 22 BPB_FATSz16 i
0000 .dbfield 24 BPB_SecPerTrk i
0000 .dbfield 26 BPB_NumHeads i
0000 .dbfield 28 BPB_HiddSec l
0000 .dbfield 32 BPB_TotSec32 l
0000 .dbfield 36 BPB_PhyDriNum c
0000 .dbfield 37 BPB_Rsvd1 c
0000 .dbfield 38 BPB_ExtBootSig c
0000 .dbfield 39 BPB_VolumeSer l
0000 .dbfield 43 BPB_VolumeLab A[11:11]c
0000 .dbfield 54 BPB_SysID A[8:8]c
0000 .dbend
0000 .dbstruct 0 90 BootSec32
0000 .dbfield 0 BS_jmpBoot A[3:3]c
0000 .dbfield 3 BS_OEMName A[8:8]c
0000 .dbfield 11 BPB_BytesPerSec i
0000 .dbfield 13 BPB_SecPerClus c
0000 .dbfield 14 BPB_RsvdSecCnt i
0000 .dbfield 16 BPB_NumFATs c
0000 .dbfield 17 BPB_RootEntCnt i
0000 .dbfield 19 BPB_TotSec16 i
0000 .dbfield 21 BPB_Media c
0000 .dbfield 22 BPB_FATSz16 i
0000 .dbfield 24 BPB_SecPerTrk i
0000 .dbfield 26 BPB_NumHeads i
0000 .dbfield 28 BPB_HiddSec l
0000 .dbfield 32 BPB_TotSec32 l
0000 .dbfield 36 BPB_FATSz32 l
0000 .dbfield 40 BPB_ExtFlag i
0000 .dbfield 42 BPB_FileSysVer i
0000 .dbfield 44 BPB_RootCluNum l
0000 .dbfield 48 BPB_FileSysInf i
0000 .dbfield 50 BPB_BootBack i
0000 .dbfield 52 BPB_Rsvd A[12:12]c
0000 .dbfield 64 BPB_PhyDriNum c
0000 .dbfield 65 BPB_Rsvd1 c
0000 .dbfield 66 BPB_ExtBootSig c
0000 .dbfield 67 BPB_VolumeSer l
0000 .dbfield 71 BPB_VolumeLab A[11:11]c
0000 .dbfield 82 BPB_SysID A[8:8]c
0000 .dbend
0000 ; VBRadd -> R12,R13
0000 ; bootp32 -> R14,R15
0000 ; bootp -> R10,R11
0000 ; buff -> R14,R15
.even
0000 _fat_root_dir_addr::
0000 0E940000 xcall push_xgsetF0FC
0004 7801 movw R14,R16
0006 2297 sbiw R28,2
0008 .dbline -1
0008 .dbline 22
0008 ; #include "fat.h"
0008 ; #include "mmc.h"
0008 ;
0008 ; //每扇区的字节数目
0008 ; unsigned int BlockSize; //每扇区的字节数,一般为512
0008 ; unsigned long fat_offset; ////FAT1的起始扇区号
0008 ; unsigned long data_offset; //数据区的起始扇区数,FAT32的根目录区和数据区重合:
0008 ; unsigned char FatFlags; //FAT类型:FAT32,FAT16,FAT12
0008 ; unsigned long blocknow;
0008 ; unsigned char SecPerClus; //每个簇占用的扇区数目,1GB的SD卡应为8
0008 ; unsigned char *pointer_FDT;
0008 ; unsigned long FirstRootDirSecNum; //根目录区(FDT)的起始扇区号
0008 ; unsigned int old_pos_a=0;
0008 ; unsigned long old_pos_blk;
0008 ;
0008 ; const unsigned char Search_FileExName1[3]={'M','P','3'}; //要查找的是TXT文件,可以改成其它的
0008 ;
0008 ; //############################################################################
0008 ; //从BPB中获取根目录区的起始地址,同时判断FAT制式(判定方法不可靠,不是微软推荐的)
0008 ; unsigned long fat_root_dir_addr(unsigned char *buff)
0008 ; //############################################################################
0008 ; {
0008 .dbline 27
0008 ; struct BootSec *bootp; //FAT16 BPB
0008 ; struct BootSec32 *bootp32; //FAT32 BPB
0008 ; unsigned int VBRadd; //DBR起始扇区号,在它之前都是磁盘分区信息占用的扇区数目
0008 ;
0008 ; MMC_SD_ReadSingleBlock(BIOS_PARAMETER_BLOCK,buff); //读取BPB/MBR
0008 F982 std y+1,R15
000A E882 std y+0,R14
000C 00E0 ldi R16,0
000E 10E0 ldi R17,0
0010 20E0 ldi R18,0
0012 30E0 ldi R19,0
0014 0E940000 xcall _MMC_SD_ReadSingleBlock
0018 .dbline 28
0018 ; if(buff[0] != 0xEB || buff[0] != 0xE9) //buff[0]!=0xEB,0xE9,this is mbr //我们的SD卡应该是这一种
0018 F701 movw R30,R14
001A 2080 ldd R2,z+0
001C 3324 clr R3
001E 822D mov R24,R2
0020 8B3E cpi R24,235
0022 11F4 brne L4
0024 X0:
0024 893E cpi R24,233
0026 89F0 breq L2
0028 X1:
0028 L4:
0028 .dbline 29
0028 ; {
0028 .dbline 30
0028 ; VBRadd = buff[VBR_ADDR] + (buff[VBR_ADDR + 1])*256; //real BPB address
0028 F701 movw R30,R14
002A E953 subi R30,57 ; addi 455
002C FE4F sbci R31,254
002E 2081 ldd R18,z+0
0030 3327 clr R19
0032 00E0 ldi R16,256
0034 11E0 ldi R17,1
0036 0E940000 xcall empy16s
003A F701 movw R30,R14
003C EA53 subi R30,58 ; addi 454
003E FE4F sbci R31,254
0040 C080 ldd R12,z+0
0042 DD24 clr R13
0044 C00E add R12,R16
0046 D11E adc R13,R17
0048 .dbline 31
0048 ; }
0048 02C0 xjmp L3
004A L2:
004A .dbline 33
004A ; else // buff[0]==0xEB,mbr和DBR相同,都是从0扇区开始
004A ; {
004A .dbline 34
004A ; VBRadd = 0;
004A CC24 clr R12
004C DD24 clr R13
004E .dbline 35
004E ; }
004E L3:
004E .dbline 36
004E ; MMC_SD_ReadSingleBlock(VBRadd,buff); //重新再读取DBR
004E F982 std y+1,R15
0050 E882 std y+0,R14
0052 8601 movw R16,R12
0054 9701 movw R18,R14
0056 2227 clr R18
0058 3327 clr R19
005A 0E940000 xcall _MMC_SD_ReadSingleBlock
005E .dbline 38
005E ;
005E ; bootp=(struct BootSec *)buff; //Fat16 的BPB
005E 5701 movw R10,R14
0060 .dbline 39
0060 ; bootp32=(struct BootSec32 *)buff; //Fat32 的BPB
0060 .dbline 41
0060 ;
0060 ; if(bootp->BPB_RootEntCnt == 0) //根据根目录下面项目数为0,确定是FAT32
0060 F501 movw R30,R10
0062 2188 ldd R2,z+17
0064 3288 ldd R3,z+18
0066 2220 tst R2
0068 09F0 breq X4
006A 4EC0 xjmp L5
006C X4:
006C 3320 tst R3
006E 09F0 breq X5
0070 4BC0 xjmp L5
0072 X5:
0072 X2:
0072 .dbline 42
0072 ; {
0072 .dbline 43
0072 ; BlockSize=bootp32->BPB_BytesPerSec; //获取每扇区字节数目
0072 2384 ldd R2,z+11
0074 3484 ldd R3,z+12
0076 30921900 sts _BlockSize+1,R3
007A 20921800 sts _BlockSize,R2
007E .dbline 44
007E ; FatFlags = FAT_Flg_32; //Fat32文件系统
007E 82E0 ldi R24,2
0080 80930F00 sts _FatFlags,R24
0084 .dbline 45
0084 ; fat_offset = bootp32->BPB_RsvdSecCnt + VBRadd; //FAT1的起始扇区号
0084 2684 ldd R2,z+14
0086 3784 ldd R3,z+15
0088 2C0C add R2,R12
008A 3D1C adc R3,R13
008C 4424 clr R4
008E 5524 clr R5
0090 30921500 sts _fat_offset+1,R3
0094 20921400 sts _fat_offset,R2
0098 50921700 sts _fat_offset+2+1,R5
009C 40921600 sts _fat_offset+2,R4
00A0 .dbline 47
00A0 ; //根目录区(FDT)的起始扇区号=保留扇区+FAT占用扇区:
00A0 ; FirstRootDirSecNum=VBRadd+(bootp32->BPB_RsvdSecCnt+(bootp32->BPB_NumFATs*bootp32->BPB_FATSz32));
00A0 24A0 ldd R2,z+36
00A2 35A0 ldd R3,z+37
00A4 46A0 ldd R4,z+38
00A6 57A0 ldd R5,z+39
00A8 0089 ldd R16,z+16
00AA 1127 clr R17
00AC 2227 clr R18
00AE 3327 clr R19
00B0 5A92 st -y,R5
00B2 4A92 st -y,R4
00B4 3A92 st -y,R3
00B6 2A92 st -y,R2
00B8 0E940000 xcall empy32u
00BC F701 movw R30,R14
00BE 2684 ldd R2,z+14
00C0 3784 ldd R3,z+15
00C2 4424 clr R4
00C4 5524 clr R5
00C6 200E add R2,R16
00C8 311E adc R3,R17
00CA 421E adc R4,R18
00CC 531E adc R5,R19
00CE 3601 movw R6,R12
00D0 8824 clr R8
00D2 9924 clr R9
00D4 620C add R6,R2
00D6 731C adc R7,R3
00D8 841C adc R8,R4
00DA 951C adc R9,R5
00DC 70920500 sts _FirstRootDirSecNum+1,R7
00E0 60920400 sts _FirstRootDirSecNum,R6
00E4 90920700 sts _FirstRootDirSecNum+2+1,R9
00E8 80920600 sts _FirstRootDirSecNum+2,R8
00EC .dbline 48
00EC ; SecPerClus = bootp32->BPB_SecPerClus; //每个簇占用的扇区数目,SD卡应为8
00EC 2584 ldd R2,z+13
00EE 20920A00 sts _SecPerClus,R2
00F2 .dbline 50
00F2 ; //数据区的起始扇区数,FAT32的根目录区和数据区重合:
00F2 ; data_offset = FirstRootDirSecNum;
00F2 1301 movw R2,R6
00F4 2401 movw R4,R8
00F6 30921100 sts _data_offset+1,R3
00FA 20921000 sts _data_offset,R2
00FE 50921300 sts _data_offset+2+1,R5
0102 40921200 sts _data_offset+2,R4
0106 .dbline 51
0106 ; }
0106 54C0 xjmp L6
0108 L5:
0108 .dbline 53
0108 ; else //FAT16或者FAT12文件系统
0108 ; {
0108 .dbline 54
0108 ; BlockSize=bootp->BPB_BytesPerSec; //获取每扇区字节数目
0108 F501 movw R30,R10
010A 2384 ldd R2,z+11
010C 3484 ldd R3,z+12
010E 30921900 sts _BlockSize+1,R3
0112 20921800 sts _BlockSize,R2
0116 .dbline 55
0116 ; if(bootp->BPB_SysID[4] == '2') //根据扩展FAT12/FAT16的系统ID部分,判断
0116 82AD ldd R24,z+58
0118 8233 cpi R24,50
011A 21F4 brne L7
011C X3:
011C .dbline 56
011C ; FatFlags = FAT_Flg_12; //FAT12
011C 2224 clr R2
011E 20920F00 sts _FatFlags,R2
0122 03C0 xjmp L8
0124 L7:
0124 .dbline 58
0124 ; else
0124 ; FatFlags = FAT_Flg_16; //FAT16
0124 81E0 ldi R24,1
0126 80930F00 sts _FatFlags,R24
012A L8:
012A .dbline 59
012A ; fat_offset = bootp->BPB_RsvdSecCnt + VBRadd;
012A F501 movw R30,R10
012C 2684 ldd R2,z+14
012E 3784 ldd R3,z+15
0130 2C0C add R2,R12
0132 3D1C adc R3,R13
0134 4424 clr R4
0136 5524 clr R5
0138 30921500 sts _fat_offset+1,R3
013C 20921400 sts _fat_offset,R2
0140 50921700 sts _fat_offset+2+1,R5
0144 40921600 sts _fat_offset+2,R4
0148 .dbline 61
0148 ; //根目录区(FDT)的起始扇区号=保留扇区+FAT占用扇区:
0148 ; FirstRootDirSecNum=VBRadd+(bootp->BPB_RsvdSecCnt+(bootp->BPB_NumFATs*bootp->BPB_FATSz16));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -