📄 fat.s
字号:
.module fat.c
.area text(rom, con, rel)
; temp -> R10,R11
; ByteIndex -> R14,R15
; Rt -> y+6
; Buf -> R12,R13
; SecIndex -> y+2
; Disk -> y+10
; Index -> y+24
; Drive -> y+22
.even
_FATGetNextClus::
xcall push_arg4
xcall push_gset5
sbiw R28,12
; /****************************************Copyright (c)**************************************************
; ** 广州周立功单片机发展有限公司
; ** 研 究 所
; ** ARM开发组
; **
; ** http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文 件 名: floppy.c
; **创 建 人: 陈明计
; **最后修改日期: 2003年9月5日
; **描 述: FAT文件系统的文件分配表基本操作函数
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版 本: V1.0
; ** 日 期: 2003年9月5日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人: 陈明计
; ** 日 期: 2004年4月10日
; ** 描 述: 修改注释
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
;
; #define IN_FAT
;
; #include "SYS_Config.h"
; #include "SD_Config.h"
; #include "SD_Drive.h"
; #include "Fat.h"
;
;
; /*********************************************************************************************************
; ** 函数名称: FATGetNextClus
; ** 功能描述: 返回FAT表指定簇的下一个簇号
; ** 输 入: Drive:驱动器号
; ** Index:簇号
; ** 输 出: 下一个簇号
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U FATGetNextClus(INT8U Drive,INT32U Index)
; {
; INT16U temp,ByteIndex ;
; INT32U SecIndex ;
; INT8U *Buf ;
; Disk_Info *Disk ;
; INT32U Rt ;
;
; Disk=GetDiskInfo(Drive);
ldd R16,y+22
xcall _GetDiskInfo
std y+11,R17
std y+10,R16
; if(Disk==NULL)
movw R0,R16
cpi R16,0
cpc R16,R17
brne L2
X0:
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L1
L2:
; }
;
; if(Index>=(Disk->ClusPerData))
ldd R30,y+10
ldd R31,y+11
ldd R2,z+32
ldd R3,z+33
ldd R4,z+34
ldd R5,z+35
movw R30,R28
ldd R6,z+24
ldd R7,z+25
ldd R8,z+26
ldd R9,z+27
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L4
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L1
L4:
; }
;
; /* 计算扇区号和字节索引 */
; switch(Disk->FATType)
ldd R30,y+10
ldd R31,y+11
ldd R10,z+1
clr R11
tst R10
brne X1
tst R11
breq L9
X1:
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
brne X7
xjmp L10
X7:
cpi R24,2
ldi R30,0
cpc R25,R30
brne X8
xjmp L11
X8:
xjmp L6
X2:
; {
L9:
; case FAT12 :
; SecIndex=Index*3/(2*Disk->BytsPerSec);
ldd R30,y+10
ldd R31,y+11
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
movw R2,R16
movw R4,R18
movw R30,R28
ldd R6,z+24
ldd R7,z+25
ldd R8,z+26
ldd R9,z+27
ldi R20,3
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall div32u
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
; ByteIndex=((Index*3)/2)-(SecIndex*Disk->BytsPerSec);
ldd R30,y+10
ldd R31,y+11
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R28
ldd R6,z+2
ldd R7,z+3
ldd R8,z+4
ldd R9,z+5
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32u
movw R2,R16
movw R4,R18
movw R30,R28
ldd R6,z+24
ldd R7,z+25
ldd R8,z+26
ldd R9,z+27
ldi R20,3
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
movw R6,R16
movw R8,R18
lsr R9
ror R8
ror R7
ror R6
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R14,R6
; SecIndex+=Disk->FATStartSec ;
ldd R30,y+10
ldd R31,y+11
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
movw R30,R28
ldd R6,z+2
ldd R7,z+3
ldd R8,z+4
ldd R9,z+5
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+2,R6
std z+3,R7
std z+4,R8
std z+5,R9
; break ;
xjmp L7
L10:
; case FAT16 :
; SecIndex=Index*2/Disk->BytsPerSec+Disk->FATStartSec ;
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
ldd R30,y+10
ldd R31,y+11
ldd R6,z+16
ldd R7,z+17
ldd R8,z+18
ldd R9,z+19
st -y,R9
st -y,R8
st -y,R7
st -y,R6
xcall div32u
movw R2,R16
movw R4,R18
ldd R30,y+10
ldd R31,y+11
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
; ByteIndex=(Index*2)&(Disk->BytsPerSec-1);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
ldd R30,y+10
ldd R31,y+11
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R30,R28
ldd R6,z+24
ldd R7,z+25
ldd R8,z+26
ldd R9,z+27
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
movw R6,R16
movw R8,R18
and R6,R2
and R7,R3
and R8,R4
and R9,R5
movw R14,R6
; break ;
xjmp L7
L11:
; case FAT32 :
; SecIndex=Index*4/Disk->BytsPerSec+Disk->FATStartSec ;
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
ldd R30,y+10
ldd R31,y+11
ldd R6,z+16
ldd R7,z+17
ldd R8,z+18
ldd R9,z+19
st -y,R9
st -y,R8
st -y,R7
st -y,R6
xcall div32u
movw R2,R16
movw R4,R18
ldd R30,y+10
ldd R31,y+11
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
; ByteIndex=(Index*4)&(Disk->BytsPerSec-1);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
ldd R30,y+10
ldd R31,y+11
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R30,R28
ldd R6,z+24
ldd R7,z+25
ldd R8,z+26
ldd R9,z+27
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
movw R6,R16
movw R8,R18
and R6,R2
and R7,R3
and R8,R4
and R9,R5
movw R14,R6
; break ;
xjmp L7
L6:
; default :
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L1
L7:
; }
;
; Buf=OpenSec(Drive,SecIndex);
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+22
xcall _OpenSec
movw R12,R16
; if(Buf==NULL)
cpi R16,0
cpc R16,R17
brne L12
X3:
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L1
L12:
; }
; ReadSec(Drive,SecIndex);
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+22
xcall _ReadSec
;
; /* 读取FAT表数据 */
; switch(Disk->FATType)
ldd R30,y+10
ldd R31,y+11
ldd R10,z+1
clr R11
tst R10
brne X4
tst R11
breq L17
X4:
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
brne X9
xjmp L26
X9:
cpi R24,2
ldi R30,0
cpc R25,R30
brne X10
xjmp L29
X10:
xjmp L14
X5:
; {
L17:
; case FAT12 :
; temp=Buf[ByteIndex];
movw R30,R14
add R30,R12
adc R31,R13
ldd R10,z+0
clr R11
; ByteIndex++;
movw R24,R14
adiw R24,1
movw R14,R24
; /* 下一个字节是否在下一个扇区 */
; if(ByteIndex>=Disk->BytsPerSec)
ldd R30,y+10
ldd R31,y+11
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R6,R24
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X11
xjmp L18
X11:
; {
; Buf=OpenSec(Drive,SecIndex+1);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+22
xcall _OpenSec
movw R12,R16
; if(Buf==NULL)
cpi R16,0
cpc R16,R17
brne L20
X6:
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L1
L20:
; }
; ReadSec(Drive,SecIndex+1);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+22
xcall _ReadSec
; temp=temp|((INT16U)Buf[0]<<8);
movw R30,R12
ldd R2,z+0
clr R3
mov R3,R2
clr R2
or R10,R2
or R11,R3
; CloseSec(Drive,SecIndex+1);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+22
xcall _CloseSec
; }
xjmp L19
L18:
; else
; {
; temp=temp|((INT16U)Buf[ByteIndex]<<8);
movw R30,R14
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
mov R3,R2
clr R2
or R10,R2
or R11,R3
; }
L19:
; /* 判断哪12位有效 */
; if((Index&0x01)!=0)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L22
; {
; temp=temp/16 ;
movw R2,R10
lsr R3
ror R2
lsr R3
ror R2
lsr R3
ror R2
lsr R3
ror R2
movw R10,R2
; }
xjmp L23
L22:
; else
; {
; temp=temp&0x0fff ;
movw R24,R10
andi R25,15
movw R10,R24
; }
L23:
; Rt=temp ;
movw R2,R10
clr R4
clr R5
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; /* 是否有特殊意义 */
; if(temp>=(BAD_CLUS&0x0fff))
ldi R20,247
ldi R21,15
ldi R22,0
ldi R23,0
clr R4
clr R5
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge X12
xjmp L15
X12:
; {
; Rt=((INT32U)0x0fffL<<16)|(temp|0xf000);
ldi R20,0
ldi R21,0
ldi R22,255
ldi R23,15
movw R24,R2
ori R25,240
movw R2,R24
clr R4
clr R5
or R2,R20
or R3,R21
or R4,R22
or R5,R23
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; }
; break ;
xjmp L15
L26:
; case FAT16 :
; temp=Buf[ByteIndex]|((INT16U)Buf[ByteIndex+1]<<8);
movw R30,R14
adiw R30,1
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
mov R3,R2
clr R2
movw R30,R14
add R30,R12
adc R31,R13
ldd R10,z+0
clr R11
or R10,R2
or R11,R3
; Rt=temp ;
movw R2,R10
clr R4
clr R5
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; /* 是否有特殊意义 */
; if(temp>=(BAD_CLUS&0xffff))
ldi R20,247
ldi R21,255
ldi R22,0
ldi R23,0
clr R4
clr R5
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge X13
xjmp L15
X13:
; {
; Rt=((INT32U)0x0fffL<<16)|temp ;
ldi R20,0
ldi R21,0
ldi R22,255
ldi R23,15
clr R4
clr R5
or R2,R20
or R3,R21
or R4,R22
or R5,R23
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; }
; break ;
xjmp L15
L29:
; case FAT32 :
; Rt=Buf[ByteIndex]|((INT32U)Buf[ByteIndex+1]<<8);
movw R30,R14
adiw R30,1
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
clr R4
clr R5
ldi R24,8
ldi R25,0
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R14
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
clr R4
clr R5
or R2,R16
or R3,R17
or R4,R18
or R5,R19
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; Rt|=((INT32U)Buf[ByteIndex+2]<<16)|((INT32U)Buf[ByteIndex+3]<<24);
movw R30,R14
adiw R30,3
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
clr R4
clr R5
ldi R24,24
ldi R25,0
st -y,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -