📄 fdt.s
字号:
movw R10,R30
; *Buf++=FDTData->Name[5];
movw R30,R12
ldd R2,z+5
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->Name[6];
movw R30,R12
ldd R2,z+6
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->Name[7];
movw R30,R12
ldd R2,z+7
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->Name[8];
movw R30,R12
ldd R2,z+8
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->Name[9];
movw R30,R12
ldd R2,z+9
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->Name[10];
movw R30,R12
ldd R2,z+10
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->Attr ;
movw R30,R12
ldd R2,z+11
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->NTRes ;
movw R30,R12
ldd R2,z+12
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->CrtTimeTenth ;
movw R30,R12
ldd R2,z+13
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->CrtTime ;
movw R30,R12
ldd R2,z+14
ldd R3,z+15
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->CrtTime)>>8 ;
movw R30,R12
ldd R2,z+14
ldd R3,z+15
mov R2,R3
clr R3
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->CrtDate ;
movw R30,R12
ldd R2,z+16
ldd R3,z+17
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->CrtDate)>>8 ;
movw R30,R12
ldd R2,z+16
ldd R3,z+17
mov R2,R3
clr R3
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->LstAccDate ;
movw R30,R12
ldd R2,z+18
ldd R3,z+19
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->LstAccDate)>>8 ;
movw R30,R12
ldd R2,z+18
ldd R3,z+19
mov R2,R3
clr R3
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->FstClusHI ;
movw R30,R12
ldd R2,z+20
ldd R3,z+21
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->FstClusHI)>>8 ;
movw R30,R12
ldd R2,z+20
ldd R3,z+21
mov R2,R3
clr R3
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->WrtTime ;
movw R30,R12
ldd R2,z+22
ldd R3,z+23
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->WrtTime)>>8 ;
movw R30,R12
ldd R2,z+22
ldd R3,z+23
mov R2,R3
clr R3
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->WrtDate ;
movw R30,R12
ldd R2,z+24
ldd R3,z+25
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->WrtDate)>>8 ;
movw R30,R12
ldd R2,z+24
ldd R3,z+25
mov R2,R3
clr R3
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=FDTData->FstClusLO ;
movw R30,R12
ldd R2,z+26
ldd R3,z+27
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->FstClusLO)>>8 ;
movw R30,R12
ldd R2,z+26
ldd R3,z+27
mov R2,R3
clr R3
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->FileSize);
movw R30,R12
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf++=(FDTData->FileSize)>>8 ;
ldi R24,8
ldi R25,0
movw R30,R12
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R30,R10
st Z+,R16
movw R10,R30
; *Buf++=(FDTData->FileSize)>>16 ;
movw R30,R12
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
movw R2,R4
clr R4
clr R5
movw R30,R10
st Z+,R2
movw R10,R30
; *Buf=(FDTData->FileSize)>>24 ;
ldi R24,24
ldi R25,0
movw R30,R12
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R30,R10
std z+0,R16
; WriteSec(Drive,SecIndex);
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R22
xcall _WriteSec
; }
L18:
; CloseSec(Drive,SecIndex);
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R22
xcall _CloseSec
; }
L16:
; return temp ;
mov R16,R20
L15:
adiw R28,2
xcall pop_gset4
adiw R28,2
.dbline 0 ; func end
ret
; SecIndex -> y+6
; ByteIndex -> R12,R13
; temp -> R10
; Disk -> R14,R15
; Index -> y+24
; Drive -> y+22
; Rt -> y+20
.even
_GetRootFDTInfo::
xcall push_arg4
xcall push_gset5
sbiw R28,10
; }
;
; /*********************************************************************************************************
; ** 函数名称: GetRootFDTInfo
; ** 功能描述: 获取根目录指定文件(目录)信息
; ** 输 入: Rt:存储返回信息的指针
; ** Drive:驱动器号
; ** Index:文件(目录)在FDT中的位置
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,GetFDTInfo,ReadFDTInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U GetRootFDTInfo(FDT *Rt,INT8U Drive,INT32U Index)
; {
; Disk_Info *Disk ;
; INT16U ByteIndex ;
; INT32U SecIndex ;
; INT8U temp ;
;
; temp=NOT_FIND_DISK ;
clr R10
inc R10
; Disk=GetDiskInfo(Drive);
ldd R16,y+22
xcall _GetDiskInfo
movw R14,R16
; if(Disk!=NULL)
cpi R16,0
cpc R16,R17
brne X11
xjmp L21
X11:
X10:
; {
; temp=NOT_FAT_DISK ;
ldi R24,8
mov R10,R24
; Index=Index*32 ;/* 32:sizeof(FDT ) */
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
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+24,R16
std z+25,R17
std z+26,R18
std z+27,R19
;
; if(Disk->FATType==FAT12||Disk->FATType==FAT16)
movw R30,R14
ldd R2,z+1
clr R3
tst R2
breq L25
mov R24,R2
cpi R24,1
breq X12
xjmp L23
X12:
L25:
; {
; temp=FDT_OVER ;
ldi R24,9
mov R10,R24
; if(Index<(Disk->RootSecCnt*Disk->BytsPerSec))
movw R30,R14
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R14
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+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
cp R2,R16
cpc R3,R17
cpc R4,R18
cpc R5,R19
brlo X13
xjmp L26
X13:
; {
; ByteIndex=Index%Disk->BytsPerSec ;
movw R30,R14
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R28
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 mod32u
movw R12,R16
; SecIndex=Index/Disk->BytsPerSec+Disk->RootDirTable ;
movw R30,R14
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R30,R28
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 div32u
movw R2,R16
movw R4,R18
movw R30,R14
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
; temp=ReadFDTInfo(Rt,Drive,SecIndex,ByteIndex);
std y+5,R13
std y+4,R12
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
ldd R18,y+22
ldd R16,y+20
ldd R17,y+21
xcall _ReadFDTInfo
mov R10,R16
; }
L26:
; }
L23:
; }
L21:
; return temp ;
mov R16,R10
L20:
adiw R28,10
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; ByteIndex -> R10,R11
; Disk -> R12,R13
; i -> y+10
; SecIndex -> y+6
; Index -> y+32
; ClusIndex -> y+28
; Drive -> R14
; Rt -> y+24
.even
_GetFDTInfo::
xcall push_arg4
xcall push_gset5
mov R14,R18
sbiw R28,14
; }
;
; /*********************************************************************************************************
; ** 函数名称: GetFDTInfo
; ** 功能描述: 获取指定目录指定文件(目录)信息
; ** 输 入: Rt:存储返回信息的指针
; ** Drive:驱动器号
; ** ClusIndex:目录首簇号
; ** Index:文件(目录)在FDT中的位置
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: GetDiskInfo,ReadFDTInfo
; ** 作 者: 陈明计
; ** 日 期: 2003年9月8日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U GetFDTInfo(FDT *Rt,INT8U Drive,INT32U ClusIndex,INT32U Index)
; {
; Disk_Info *Disk ;
; INT16U ByteIndex ;
; INT32U SecIndex,i ;
;
; Disk=GetDiskInfo(Drive);
mov R16,R14
xcall _GetDiskInfo
movw R12,R16
; if(Disk==NULL)
cpi R16,0
cpc R16,R17
brne L29
X14:
; {
; return NOT_FIND_DISK ;
ldi R16,1
xjmp L28
L29:
; }
;
; if(ClusIndex==EMPTY_CLUS)
ldi R20,0
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
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L31
; {
; if(Disk->FATType==FAT32)
movw R30,R12
ldd R24,z+1
cpi R24,2
brne L33
; {
; 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+28,R2
std z+29,R3
std z+30,R4
std z+31,R5
; }
xjmp L34
L33:
; else
; {
; return GetRootFDTInfo(Rt,Drive,Index);
movw R30,R28
ldd R2,z+32
ldd R3,z+33
ldd R4,z+34
ldd R5,z+35
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 _GetRootFDTInfo
xjmp L28
L34:
; }
; }
L31:
;
; if((Disk->FATType==FAT12)||(Disk->FATType==FAT16)||(Disk->FATType==FAT32))
movw R30,R12
ldd R2,z+1
clr R3
tst R2
breq L38
mov R24,R2
cpi R24,1
breq L38
cpi R24,2
breq X15
xjmp L35
X15:
L38:
; {
; Index=Index*32 ;
movw R30,R28
ldd R2,z+32
ldd R3,z+33
ldd R4,z+34
ldd R5,z+35
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+32,R16
std z+33,R17
std z+34,R18
std z+35,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+32
ldd R7,z+33
ldd R8,z+34
ldd R9,z+35
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+32
ldd R7,z+33
ldd R8,z+34
ldd R9,z+35
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 R2,z+2
clr R3
clr R4
clr R5
movw R30,R28
std z+10,R2
std z+11,R3
std z+12,R4
std z+13,R5
xjmp L40
L39:
; while(SecIndex>=i)
; {
; ClusIndex=FATGetNextClus(Drive,ClusIndex);
movw R30,R28
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
std y+0,R4
std y+1,R5
movw R18,R2
mov R16,R14
xcall _FATGetNextClus
movw R30,R28
std z+28,R16
std z+29,R17
std z+30,R18
std z+31,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+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brsh L44
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L42
L44:
; {
; return FDT_OVER ;
ldi R16,9
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -