📄 fat.s
字号:
.module fat.c
.area data(ram, con, rel)
_LongNameBuffer::
.blkw 1
.area idata
.word _LONGNAME_BUFFER_ADDR
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
.dbsym e LongNameBuffer _LongNameBuffer pc
_DirNameBuffer::
.blkw 1
.area idata
.word _DIRNAME_BUFFER_ADDR
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
.dbsym e DirNameBuffer _DirNameBuffer pc
_FatInCache::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
.dbsym e FatInCache _FatInCache l
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
.dbfunc e ReadBlock _ReadBlock fV
; temp -> y+0
; LBA -> y+4
.even
_ReadBlock::
xcall push_arg4
sbiw R28,4
.dbline -1
.dbline 33
; /************************************************************/
; /* FAT Code for M32L */
; /* By pasyong */
; /* 2006-4 */
; /* Base ICC6.31A */
; /************************************************************/
; #include <iom32v.h>
; #include <macros.h>
; #include <string.h>
; #include "sd.h"
; #include "fat.h"
; #include "3310.h"
;
; extern uchar BUFFER[512];
; unsigned char LONGNAME_BUFFER_ADDR[30];
; unsigned char DIRNAME_BUFFER_ADDR[30];
; unsigned char *LongNameBuffer = (unsigned char *) LONGNAME_BUFFER_ADDR;
; unsigned char *DirNameBuffer = (unsigned char *) DIRNAME_BUFFER_ADDR;
; struct partrecord PartInfo;
; unsigned char Fat32Enabled;
; unsigned long FirstDataSector;
; unsigned int BytesPerSector;
; unsigned int SectorsPerCluster;
; unsigned long FirstFATSector;
; unsigned long FirstDirSector;
; unsigned long FileSize;
; unsigned long FatInCache = 0;
;
; //********************************************************************************************
; //读一个扇区
; void ReadBlock(unsigned long LBA)
; //********************************************************************************************
; { unsigned long temp;
.dbline 34
; temp=LBA<<9;
ldi R24,9
ldi R25,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 35
; SD_Read_Block(temp);
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
xcall _SD_Read_Block
.dbline -2
L1:
adiw R28,8
.dbline 0 ; func end
ret
.dbsym l temp 0 l
.dbsym l LBA 4 l
.dbend
.dbfunc e fatClustToSect _fatClustToSect fl
; clust -> y+4
.even
_fatClustToSect::
xcall push_arg4
xcall push_gset2
.dbline -1
.dbline 41
; }
; /*-----------------------------------------------------------------------
; 查询数据区一个簇开始扇区号
; -----------------------------------------------------------------------*/
; unsigned long fatClustToSect(unsigned long clust)
; {
.dbline 42
; return ((clust-2) * SectorsPerCluster) + FirstDataSector;
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
lds R6,_SectorsPerCluster
lds R7,_SectorsPerCluster+1
clr R8
clr R9
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R2
movw R18,R4
xcall empy32u
movw R2,R16
movw R4,R18
lds R8,_FirstDataSector+2
lds R9,_FirstDataSector+2+1
lds R6,_FirstDataSector
lds R7,_FirstDataSector+1
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R16,R2
movw R18,R4
.dbline -2
L2:
xcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l clust 4 l
.dbend
.dbfunc e fatClusterSize _fatClusterSize fi
.even
_fatClusterSize::
.dbline -1
.dbline 48
; }
; /*-----------------------------------------------------------------------
; 查询一个簇所占扇区数
; -----------------------------------------------------------------------*/
; unsigned int fatClusterSize(void)
; {
.dbline 50
; // return the number of sectors in a disk cluster
; return SectorsPerCluster;
lds R16,_SectorsPerCluster
lds R17,_SectorsPerCluster+1
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e fatInit _fatInit fc
.dbstruct 0 41 bpb710
.dbfield 0 bpbBytesPerSec i
.dbfield 2 bpbSecPerClust c
.dbfield 3 bpbResSectors i
.dbfield 5 bpbFATs c
.dbfield 6 bpbRootDirEnts i
.dbfield 8 bpbSectors i
.dbfield 10 bpbMedia c
.dbfield 11 bpbFATsecs i
.dbfield 13 bpbSecPerTrack i
.dbfield 15 bpbHeads i
.dbfield 17 bpbHiddenSecs l
.dbfield 21 bpbHugeSectors l
.dbfield 25 bpbBigFATsecs l
.dbfield 29 bpbExtFlags i
.dbfield 31 bpbFSVers i
.dbfield 33 bpbRootClust l
.dbfield 37 bpbFSInfo i
.dbfield 39 bpbBackup i
.dbend
; t2 -> R10
; t1 -> R12
; data -> R10,R11
; bpb -> R10,R11
.even
_fatInit::
xcall push_gset4
sbiw R28,2
.dbline -1
.dbline 56
; }
; /*-----------------------------------------------------------------------
; 查询SD卡文件系统信息
; -----------------------------------------------------------------------*/
; unsigned char fatInit()
; {
.dbline 61
; unsigned int data;unsigned char t1,t2;
;
; struct bpb710 *bpb;
; // 读MBR结构
; ReadBlock(0);
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,0
xcall _ReadBlock
.dbline 63
; // 读取分区表信息
; PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
ldi R24,<_BUFFER+446
ldi R25,>_BUFFER+446
ldi R30,<_PartInfo
ldi R31,>_PartInfo
ldi R16,16
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgnblk
.dbline 66
; // 读引导扇区
; // 引导扇区号在PartInfo.prStartLBA中
; ReadBlock(PartInfo.prStartLBA); //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
lds R18,_PartInfo+8+2
lds R19,_PartInfo+8+2+1
lds R16,_PartInfo+8
lds R17,_PartInfo+8+1
xcall _ReadBlock
.dbline 67
; bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
ldi R24,<_BUFFER+11
ldi R25,>_BUFFER+11
movw R10,R24
.dbline 69
;
; FirstDataSector = PartInfo.prStartLBA;
lds R4,_PartInfo+8+2
lds R5,_PartInfo+8+2+1
lds R2,_PartInfo+8
lds R3,_PartInfo+8+1
sts _FirstDataSector+1,R3
sts _FirstDataSector,R2
sts _FirstDataSector+2+1,R5
sts _FirstDataSector+2,R4
.dbline 70
; if(bpb->bpbFATsecs)
movw R30,R24
ldd R2,z+11
ldd R3,z+12
tst R2
brne X0
tst R3
breq L9
X0:
.dbline 71
; {
.dbline 73
; // bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
; FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
movw R30,R10
ldd R18,z+11
ldd R19,z+12
movw R30,R10
ldd R16,z+5
clr R17
xcall empy16s
movw R30,R10
ldd R2,z+3
ldd R3,z+4
add R2,R16
adc R3,R17
clr R4
clr R5
lds R8,_FirstDataSector+2
lds R9,_FirstDataSector+2+1
lds R6,_FirstDataSector
lds R7,_FirstDataSector+1
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
sts _FirstDataSector+1,R7
sts _FirstDataSector,R6
sts _FirstDataSector+2+1,R9
sts _FirstDataSector+2,R8
.dbline 74
; }
xjmp L10
L9:
.dbline 76
; else
; {
.dbline 78
; // bpbFATsecs是0,为FAT32,FAT表所占的扇区数在bpbBigFATsecs里
; FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
movw R30,R10
ldd R2,z+25
ldd R3,z+26
ldd R4,z+27
ldd R5,z+28
movw R30,R10
ldd R6,z+5
clr R7
clr R8
clr R9
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32u
movw R30,R10
ldd R2,z+3
ldd R3,z+4
clr R4
clr R5
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
lds R8,_FirstDataSector+2
lds R9,_FirstDataSector+2+1
lds R6,_FirstDataSector
lds R7,_FirstDataSector+1
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
sts _FirstDataSector+1,R7
sts _FirstDataSector,R6
sts _FirstDataSector+2+1,R9
sts _FirstDataSector+2,R8
.dbline 79
; }
L10:
.dbline 81
;
; SectorsPerCluster = bpb->bpbSecPerClust;
movw R30,R10
ldd R2,z+2
clr R3
sts _SectorsPerCluster+1,R3
sts _SectorsPerCluster,R2
.dbline 82
; BytesPerSector = bpb->bpbBytesPerSec;
movw R30,R10
ldd R2,z+0
ldd R3,z+1
sts _BytesPerSector+1,R3
sts _BytesPerSector,R2
.dbline 83
; FirstFATSector = bpb->bpbResSectors + PartInfo.prStartLBA;
lds R4,_PartInfo+8+2
lds R5,_PartInfo+8+2+1
lds R2,_PartInfo+8
lds R3,_PartInfo+8+1
ldd R6,z+3
ldd R7,z+4
clr R8
clr R9
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
sts _FirstFATSector+1,R7
sts _FirstFATSector,R6
sts _FirstFATSector+2+1,R9
sts _FirstFATSector+2,R8
.dbline 85
; //查询SD卡文件系统分区类型
; switch (PartInfo.prPartType)
lds R12,_PartInfo+4
clr R13
movw R24,R12
cpi R24,4
ldi R30,0
cpc R25,R30
breq L16
cpi R24,6
ldi R30,0
cpc R25,R30
breq L16
cpi R24,4
ldi R30,0
cpc R25,R30
brlt L13
L18:
movw R24,R12
cpi R24,11
ldi R30,0
cpc R25,R30
breq L17
cpi R24,12
ldi R30,0
cpc R25,R30
breq L17
cpi R24,14
ldi R30,0
cpc R25,R30
breq L16
xjmp L13
X1:
.dbline 86
; {
L16:
.dbline 91
; case PART_TYPE_DOSFAT16:
; case PART_TYPE_FAT16:
; case PART_TYPE_FAT16LBA:
; // 第一个目录扇区号为2
; FirstDirSector = CLUST_FIRST;
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
sts _FirstDirSector+1,R21
sts _FirstDirSector,R20
sts _FirstDirSector+2+1,R23
sts _FirstDirSector+2,R22
.dbline 93
; //FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
; Fat32Enabled = 0;
clr R2
sts _Fat32Enabled,R2
.dbline 95
;
; break;
xjmp L13
L17:
.dbline 99
; case PART_TYPE_FAT32LBA:
; case PART_TYPE_FAT32:
;
; FirstDirSector = bpb->bpbRootClust;
movw R30,R10
ldd R2,z+33
ldd R3,z+34
ldd R4,z+35
ldd R5,z+36
sts _FirstDirSector+1,R3
sts _FirstDirSector,R2
sts _FirstDirSector+2+1,R5
sts _FirstDirSector+2,R4
.dbline 100
; Fat32Enabled = 1;
ldi R24,1
sts _Fat32Enabled,R24
.dbline 101
; break;
.dbline 102
; default:break;
L13:
.dbline 106
; //return 1;
; }
; //查询SD卡文件系统信息
; switch (PartInfo.prPartType)
lds R10,_PartInfo+4
clr R11
movw R24,R10
cpi R24,4
ldi R30,0
cpc R25,R30
breq L23
cpi R24,6
ldi R30,0
cpc R25,R30
breq L25
cpi R24,4
ldi R30,0
cpc R25,R30
brge X3
xjmp L19
X3:
L34:
movw R24,R10
cpi R24,11
ldi R30,0
cpc R25,R30
breq L31
cpi R24,12
ldi R30,0
cpc R25,R30
breq L29
cpi R24,14
ldi R30,0
cpc R25,R30
breq L27
xjmp L19
X2:
.dbline 107
; {
L23:
.dbline 109
; case PART_TYPE_DOSFAT16:
; LCD_write_english_string(0,0,"DOSFAT 16");
ldi R24,<L24
ldi R25,>L24
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_english_string
.dbline 110
; break;
xjmp L20
L25:
.dbline 112
; case PART_TYPE_FAT16:
; LCD_write_english_string(0,0,"FAT16 ");
ldi R24,<L26
ldi R25,>L26
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_english_string
.dbline 113
; break;
xjmp L20
L27:
.dbline 115
; case PART_TYPE_FAT16LBA:
; LCD_write_english_string(0,0,"FAT16 LBA");
ldi R24,<L28
ldi R25,>L28
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_english_string
.dbline 116
; break;
xjmp L20
L29:
.dbline 118
; case PART_TYPE_FAT32LBA:
; LCD_write_english_string(0,0,"FAT32 LBA");
ldi R24,<L30
ldi R25,>L30
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_english_string
.dbline 119
; break;
xjmp L20
L31:
.dbline 121
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -