📄 fdt.s
字号:
xjmp L28
L42:
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
movw R30,R28
ldd R6,z+6
ldd R7,z+7
ldd R8,z+8
ldd R9,z+9
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+6,R6
std z+7,R7
std z+8,R8
std z+9,R9
L40:
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
movw R30,R28
ldd R6,z+6
ldd R7,z+7
ldd R8,z+8
ldd R9,z+9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo X16
xjmp L39
X16:
; }
; SecIndex-=i ;
; }
; SecIndex=(ClusIndex-2)*i+SecIndex+Disk->DataStartSec ;
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R30,R28
ldd R6,z+10
ldd R7,z+11
ldd R8,z+12
ldd R9,z+13
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
movw R30,R28
ldd R6,z+6
ldd R7,z+7
ldd R8,z+8
ldd R9,z+9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R12
ldd R6,z+28
ldd R7,z+29
ldd R8,z+30
ldd R9,z+31
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; return ReadFDTInfo(Rt,Drive,SecIndex,ByteIndex);
std y+5,R11
std y+4,R10
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
mov R18,R14
ldd R16,y+24
ldd R17,y+25
xcall _ReadFDTInfo
xjmp L28
L35:
; }
; return NOT_FAT_DISK ;
ldi R16,8
L28:
adiw R28,14
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; SecIndex -> y+6
; ByteIndex -> R14,R15
; Rt -> R10
; Disk -> R12,R13
; FDTData -> y+26
; Index -> y+22
; Drive -> y+20
.even
_SetRootFDTInfo::
xcall push_arg4
xcall push_gset5
sbiw R28,10
; }
;
; /*********************************************************************************************************
; ** 函数名称: SetRootFDTInfo
; ** 功能描述: 设置根目录指定文件(目录)信息
; ** 输 入: FDTData:要写入的信息
; ** Drive:驱动器号
; ** Index:文件(目录)在FDT中的位置
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,SetFDTInfo,WriteFDTInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U SetRootFDTInfo(INT8U Drive,INT32U Index,FDT *FDTData)
; {
; Disk_Info *Disk ;
; INT16U ByteIndex ;
; INT32U SecIndex ;
; INT8U Rt ;
;
; Rt=NOT_FIND_DISK ;
clr R10
inc R10
; Disk=GetDiskInfo(Drive);
ldd R16,y+20
xcall _GetDiskInfo
movw R12,R16
; if(Disk!=NULL)
cpi R16,0
cpc R16,R17
brne X18
xjmp L46
X18:
X17:
; {
; Index=Index*32 ;
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
ldi R20,32
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 R30,R28
std z+22,R16
std z+23,R17
std z+24,R18
std z+25,R19
; /* 32:sizeof(FDT ) */
; if(Disk->FATType==FAT12||Disk->FATType==FAT16)
movw R30,R12
ldd R2,z+1
clr R3
tst R2
breq L50
mov R24,R2
cpi R24,1
breq X19
xjmp L48
X19:
L50:
; {
; Rt=FDT_OVER ;
ldi R24,9
mov R10,R24
; if(Index<(Disk->RootSecCnt*Disk->BytsPerSec))
movw R30,R12
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R12
ldd R6,z+24
ldd R7,z+25
ldd R8,z+26
ldd R9,z+27
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32u
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
cp R2,R16
cpc R3,R17
cpc R4,R18
cpc R5,R19
brlo X20
xjmp L51
X20:
; {
; ByteIndex=Index%Disk->BytsPerSec ;
movw R30,R12
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R28
ldd R6,z+22
ldd R7,z+23
ldd R8,z+24
ldd R9,z+25
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall mod32u
movw R14,R16
; SecIndex=Index/Disk->BytsPerSec+Disk->RootDirTable ;
movw R30,R12
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R28
ldd R6,z+22
ldd R7,z+23
ldd R8,z+24
ldd R9,z+25
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall div32u
movw R2,R16
movw R4,R18
movw R30,R12
ldd R6,z+20
ldd R7,z+21
ldd R8,z+22
ldd R9,z+23
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; Rt=WriteFDTInfo(Drive,SecIndex,ByteIndex,FDTData);
ldd R0,y+26
ldd R1,y+27
std y+5,R1
std y+4,R0
std y+3,R15
std y+2,R14
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+20
xcall _WriteFDTInfo
mov R10,R16
; }
L51:
; }
L48:
; }
L46:
; return Rt ;
mov R16,R10
L45:
adiw R28,10
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; ByteIndex -> R10,R11
; Disk -> R12,R13
; i -> R14
; SecIndex -> y+6
; FDTData -> y+30
; Index -> y+26
; ClusIndex -> y+22
; Drive -> y+20
.even
_SetFDTInfo::
xcall push_arg4
xcall push_gset5
sbiw R28,10
; }
;
; /*********************************************************************************************************
; ** 函数名称: SetFDTInfo
; ** 功能描述: 设置指定目录指定文件(目录)信息
; ** 输 入: FDTData:要写入的信息
; ** Drive:驱动器号
; ** ClusIndex:目录首簇号
; ** Index:文件(目录)在FDT中的位置
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,WriteFDTInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U SetFDTInfo(INT8U Drive,INT32U ClusIndex,INT32U Index,FDT *FDTData)
; {
; Disk_Info *Disk ;
; INT16U ByteIndex ;
; INT32U SecIndex ;
; INT8U i ;
;
; Disk=GetDiskInfo(Drive);
ldd R16,y+20
xcall _GetDiskInfo
movw R12,R16
; if(Disk==NULL)
cpi R16,0
cpc R16,R17
brne L54
X21:
; {
; return NOT_FIND_DISK ;
ldi R16,1
xjmp L53
L54:
; }
;
; if(ClusIndex==EMPTY_CLUS)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L56
; {
; if(Disk->FATType==FAT32)
movw R30,R12
ldd R24,z+1
cpi R24,2
brne L58
; {
; ClusIndex=Disk->RootDirTable ;
movw R30,R12
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
movw R30,R28
std z+22,R2
std z+23,R3
std z+24,R4
std z+25,R5
; }
xjmp L59
L58:
; else
; {
; return SetRootFDTInfo(Drive,Index,FDTData);
ldd R0,y+30
ldd R1,y+31
std y+3,R1
std y+2,R0
movw R30,R28
ldd R2,z+26
ldd R3,z+27
ldd R4,z+28
ldd R5,z+29
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+20
xcall _SetRootFDTInfo
xjmp L53
L59:
; }
; }
L56:
;
; if(Disk->FATType==FAT12||Disk->FATType==FAT16||Disk->FATType==FAT32)
movw R30,R12
ldd R2,z+1
clr R3
tst R2
breq L63
mov R24,R2
cpi R24,1
breq L63
cpi R24,2
breq X22
xjmp L60
X22:
L63:
; {
; Index=Index*32 ;
movw R30,R28
ldd R2,z+26
ldd R3,z+27
ldd R4,z+28
ldd R5,z+29
ldi R20,32
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 R30,R28
std z+26,R16
std z+27,R17
std z+28,R18
std z+29,R19
; ByteIndex=Index%Disk->BytsPerSec ;
movw R30,R12
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R28
ldd R6,z+26
ldd R7,z+27
ldd R8,z+28
ldd R9,z+29
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall mod32u
movw R10,R16
; SecIndex=Index/Disk->BytsPerSec ;
movw R30,R12
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R28
ldd R6,z+26
ldd R7,z+27
ldd R8,z+28
ldd R9,z+29
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall div32u
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
; /* 计算目录项所在扇区 */
; i=Disk->SecPerClus ;
movw R30,R12
ldd R14,z+2
xjmp L65
L64:
; while(SecIndex>=i)
; {
; ClusIndex=FATGetNextClus(Drive,ClusIndex);
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+20
xcall _FATGetNextClus
movw R30,R28
std z+22,R16
std z+23,R17
std z+24,R18
std z+25,R19
; if(ClusIndex<=EMPTY_CLUS_1||ClusIndex>=BAD_CLUS)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brsh L69
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L67
L69:
; {
; return FDT_OVER ;
ldi R16,9
xjmp L53
L67:
mov R2,R14
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+6
ldd R7,z+7
ldd R8,z+8
ldd R9,z+9
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+6,R6
std z+7,R7
std z+8,R8
std z+9,R9
L65:
mov R2,R14
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+6
ldd R7,z+7
ldd R8,z+8
ldd R9,z+9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo X23
xjmp L64
X23:
; }
; SecIndex-=i ;
; }
; SecIndex=(ClusIndex-2)*i+SecIndex+Disk->DataStartSec ;
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
mov R6,R14
clr R7
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
movw R30,R28
ldd R6,z+6
ldd R7,z+7
ldd R8,z+8
ldd R9,z+9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R12
ldd R6,z+28
ldd R7,z+29
ldd R8,z+30
ldd R9,z+31
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
;
; return WriteFDTInfo(Drive,SecIndex,ByteIndex,FDTData);
ldd R0,y+30
ldd R1,y+31
std y+5,R1
std y+4,R0
std y+3,R11
std y+2,R10
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+20
xcall _WriteFDTInfo
xjmp L53
L60:
; }
; return NOT_FAT_DISK ;
ldi R16,8
L53:
adiw R28,10
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; i -> y+8
; temp -> R10
; FileName -> R12,R13
; ClusIndex -> y+22
; Drive -> R14
; Rt -> R6,R7
.even
_FindFDTInfo::
xcall push_gset5
mov R14,R18
movw R6,R16
sbiw R28,12
ldd R12,y+26
ldd R13,y+27
; }
;
; /*********************************************************************************************************
; ** 函数名称: FindFDTInfo
; ** 功能描述: 在指定目录查找指定文件(目录)
; ** 输 入: Rt:存储返回信息的指针
; ** Drive:驱动器号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -