📄 file.s
字号:
ldi R16,33
mov R17,R20
muls R16,R17
movw R2,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R2,R24
adc R3,R25
movw R30,R2
ldd R24,z+0
ori R24,3
std z+0,R24
; }
xjmp L148
L147:
; else
; {
; FileInfo[Rt].Flags=0 ;
ldi R16,33
mov R17,R20
muls R16,R17
movw R30,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R30,R24
adc R31,R25
clr R2
std z+0,R2
; Rt=Not_Open_FILE ;
ldi R20,255
; }
L148:
; }
L146:
; return Rt ;
mov R16,R20
L144:
adiw R28,4
xcall pop_gset2
.dbline 0 ; func end
ret
; Rt -> R20
; Type -> R10,R11
; DirFileName -> R22,R23
.even
_FileOpen::
xcall push_gset3
movw R10,R18
movw R22,R16
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileOpen
; ** 功能描述: 以指定方式打开文件
; ** 输 入: DirFileName:用户使用的文件名
; ** Type:打开方式
; ** 输 出: 文件句柄,Not_Open_FILE为不能打开
; ** 全局变量: 无
; ** 调用模块: _FileOpenR,_FileOpenW,_FileOpenRW
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE FileOpen(char *DirFileName,char *Type)
; {
; HANDLE Rt ;
;
; Rt=Not_Open_FILE ;
ldi R20,255
; strupr(Type);
movw R16,R10
xcall _strupr
; strupr(DirFileName);
movw R16,R22
xcall _strupr
; if(Type[0]=='R')
movw R30,R10
ldd R24,z+0
cpi R24,82
brne L153
; {
; if(Type[1]=='W')
ldd R24,z+1
cpi R24,87
brne L155
; {
; Rt=_FileOpenRW(DirFileName);
movw R16,R22
xcall __FileOpenRW
mov R20,R16
; }
xjmp L156
L155:
; else
; {
; Rt=_FileOpenR(DirFileName);
movw R16,R22
xcall __FileOpenR
mov R20,R16
; }
L156:
; return Rt ;
mov R16,R20
xjmp L152
L153:
; }
; if(Type[0]=='W')
movw R30,R10
ldd R24,z+0
cpi R24,87
brne L157
; {
; if(Type[1]=='R')
ldd R24,z+1
cpi R24,82
brne L159
; {
; Rt=_FileOpenRW(DirFileName);
movw R16,R22
xcall __FileOpenRW
mov R20,R16
; }
xjmp L160
L159:
; else
; {
; Rt=_FileOpenW(DirFileName);
movw R16,R22
xcall __FileOpenW
mov R20,R16
; }
L160:
; }
L157:
; return Rt ;
mov R16,R20
L152:
xcall pop_gset3
.dbline 0 ; func end
ret
; FileFDT -> y+6
; fp -> R12,R13
; Rt -> R10
; Handle -> R12
.even
_FileClose::
xcall push_gset4
mov R12,R16
sbiw R28,38
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileClose
; ** 功能描述: 关闭指定文件
; ** 输 入: Handle:文件句柄
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileClose(HANDLE Handle)
; {
; INT8U Rt ;
; FDT FileFDT ;
; MY_FILE *fp ;
;
; Rt=PARAMETER_ERR ;
ldi R24,255
mov R10,R24
; if(Handle>=0&&Handle<MAX_OPEN_FILES)
mov R24,R12
cpi R24,0
brge X33
xjmp L162
X33:
cpi R24,3
brlt X34
xjmp L162
X34:
; {
; Rt=RETURN_OK ;
clr R10
; fp=FileInfo+Handle ;
ldi R16,33
mov R17,R24
muls R16,R17
movw R12,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R12,R24
adc R13,R25
; if((fp->Flags&FILE_FLAGS_WRITE)==FILE_FLAGS_WRITE)
movw R30,R12
ldd R24,z+0
andi R24,2
cpi R24,2
breq X35
xjmp L164
X35:
; {
; Rt=FindFDTInfo(&FileFDT,fp->Drive,fp->DirClus,fp->Name);
movw R24,R30
adiw R24,1
std y+5,R25
std y+4,R24
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
movw R30,R12
ldd R18,z+12
movw R16,R28
subi R16,250 ; offset = 6
sbci R17,255
xcall _FindFDTInfo
mov R10,R16
; if(Rt==RETURN_OK)
tst R16
breq X36
xjmp L166
X36:
; if(FileFDT.FileSize<fp->FileSize)
movw R30,R12
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
ldd R6,z+34
ldd R7,z+35
ldd R8,z+36
ldd R9,z+37
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo X37
xjmp L168
X37:
; {
; FileFDT.FileSize=fp->FileSize ;
movw R30,R12
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
std z+34,R2
std z+35,R3
std z+36,R4
std z+37,R5
; if(FileFDT.FstClusLO==0)
ldd R2,y+32
ldd R3,y+33
tst R2
brne L172
tst R3
brne L172
X31:
; if(FileFDT.FstClusHI==0)
ldd R2,y+26
ldd R3,y+27
tst R2
brne L175
tst R3
brne L175
X32:
; {
; FileFDT.FstClusLO=fp->FstClus&0xffff ;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R12
ldd R2,z+21
ldd R3,z+22
ldd R4,z+23
ldd R5,z+24
and R2,R20
and R3,R21
and R4,R22
and R5,R23
std y+33,R3
std y+32,R2
; FileFDT.FstClusHI=(fp->FstClus>>16)&0xffff ;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R12
ldd R2,z+21
ldd R3,z+22
ldd R4,z+23
ldd R5,z+24
movw R2,R4
clr R4
clr R5
and R2,R20
and R3,R21
and R4,R22
and R5,R23
std y+27,R3
std y+26,R2
; }
L175:
L172:
; ChangeFDT(fp->Drive,fp->DirClus,&FileFDT);
movw R24,R28
adiw R24,6
std y+3,R25
std y+2,R24
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _ChangeFDT
; }
L168:
L166:
; }
L164:
; fp->Flags=0 ;
clr R2
movw R30,R12
std z+0,R2
; }
L162:
; return Rt ;
mov R16,R10
L161:
adiw R28,38
xcall pop_gset4
.dbline 0 ; func end
ret
; Buf -> R10,R11
; i -> y+12
; SecIndex -> y+8
; j -> y+4
; DiskInfo -> R14,R15
; Rt -> y+16
; fp -> R12,R13
; Handle -> R10
; Ch -> y+27
.even
_FileGetCh::
xcall push_arg4
xcall push_gset5
mov R10,R18
sbiw R28,17
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileGetCh
; ** 功能描述: 从文件读一个字节
; ** 输 入: Ch:返回读到的数据
; ** Handle:文件句柄
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileGetCh(INT8U *Ch,HANDLE Handle)
; {
; INT32U i,j,SecIndex ;
; MY_FILE *fp ;
; Disk_Info *DiskInfo ;
; INT8U Rt ;
; INT8U *Buf ;
;
; Rt=PARAMETER_ERR ;
ldi R24,255
std y+16,R24
; fp=FileInfo+Handle ;
ldi R16,33
mov R17,R10
muls R16,R17
movw R12,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R12,R24
adc R13,R25
; /* Handle是否有效 */
; /* 对应的打开文件信息表是否已使用 */
; if(Handle>=0&&Handle<MAX_OPEN_FILES)
cpi R17,0
brge X40
xjmp L181
X40:
cpi R17,3
brlt X41
xjmp L181
X41:
; if(fp->Flags!=0)
movw R30,R12
ldd R2,z+0
tst R2
brne X42
xjmp L183
X42:
; {
; Rt=FILE_EOF ;
ldi R24,17
std y+16,R24
; if(fp->Offset>=fp->FileSize)
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R12
ldd R6,z+29
ldd R7,z+30
ldd R8,z+31
ldd R9,z+32
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X43
xjmp L185
X43:
; {
; /* 如果读数据超出文件的长度,看一看谁否有别的程序正在写这个文件 */
; /* 如果有,则可能文件的长度有变化,更正之*/
; Handle=FindOpenFileW(fp->Drive,fp->DirClus,fp->Name);
movw R24,R12
adiw R24,1
std y+3,R25
std y+2,R24
movw R30,R12
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _FindOpenFileW
mov R10,R16
; if(Handle<MAX_OPEN_FILES)
mov R24,R10
cpi R16,3
brlt X44
xjmp L187
X44:
; {
; fp->FileSize=FileInfo[Handle].FileSize ;
ldi R16,33
mov R17,R24
muls R16,R17
movw R30,R0
ldi R24,<_FileInfo+17
ldi R25,>_FileInfo+17
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R12
std z+17,R2
std z+18,R3
std z+19,R4
std z+20,R5
; if(fp->Offset==0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R12
ldd R2,z+29
ldd R3,z+30
ldd R4,z+31
ldd R5,z+32
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L190
; {
; fp->FstClus=FileInfo[Handle].FstClus ;
muls R16,R17
movw R30,R0
ldi R24,<_FileInfo+21
ldi R25,>_FileInfo+21
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R12
std z+21,R2
std z+22,R3
std z+23,R4
std z+24,R5
; fp->Clus=FileInfo[Handle].Clus ;
muls R16,R17
movw R30,R0
ldi R24,<_FileInfo+25
ldi R25,>_FileInfo+25
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R12
std z+25,R2
std z+26,R3
std z+27,R4
std z+28,R5
; }
L190:
; }
L187:
; }
L185:
; Rt=FILE_EOF ;
ldi R24,17
std y+16,R24
; /* 是否到文件结束 */
; if(fp->Offset<fp->FileSize)
movw R30,R12
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R12
ldd R6,z+29
ldd R7,z+30
ldd R8,z+31
ldd R9,z+32
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo X45
xjmp L194
X45:
; {
; Rt=NOT_FIND_DISK ;
clr R0
inc R0
std y+16,R0
; /* 获取文件所在逻辑盘信息 */
; DiskInfo=GetDiskInfo(fp->Drive);
movw R30,R12
ldd R16,z+12
xcall _GetDiskInfo
movw R14,R16
; if(DiskInfo!=NULL)
cpi R16,0
cpc R16,R17
brne X46
xjmp L196
X46:
X38:
; {
; /* 计算数据所在扇区 */
; j=fp->Offset%(DiskInfo->SecPerClus*DiskInfo->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+2
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,R12
ldd R2,z+29
ldd R3,z+30
ldd R4,z+31
ldd R5,z+32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall mod32u
movw R30,R28
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
; i=j/DiskInfo->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+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
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+12,R16
std z+13,R17
std z+14,R18
std z+15,R19
; j=j%DiskInfo->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+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall mod32u
movw R30,R28
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
; SecIndex=(fp->Clus-2)*DiskInfo->SecPerClus+
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R12
ldd R2,z+25
ldd R3,z+26
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -