📄 file.s
字号:
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 div32u
movw R30,R28
std z+10,R16
std z+11,R17
std z+12,R18
std z+13,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+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 mod32u
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
; SecIndex=(fp->Clus-2)*DiskInfo->SecPerClus+DiskInfo->DataStartSec+i ;
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R12
ldd R2,z+25
ldd R3,z+26
ldd R4,z+27
ldd R5,z+28
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R30,R14
ldd R6,z+2
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,R14
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
ldd R6,z+10
ldd R7,z+11
ldd R8,z+12
ldd R9,z+13
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=SECTOR_READ_ERR ;
ldi R24,5
mov R10,R24
;
; /* 调整打开文件信息表 */
; fp->Offset++;
movw R24,R12
adiw R24,29
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R24
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
add R4,R20
adc R5,R21
adc R6,R22
adc R7,R23
std z+0,R4
std z+1,R5
std z+2,R6
std z+3,R7
; 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 R2,R6
cpc R3,R7
cpc R4,R8
cpc R5,R9
brsh L230
; {
; fp->FileSize=fp->Offset ;
movw R30,R12
ldd R2,z+29
ldd R3,z+30
ldd R4,z+31
ldd R5,z+32
movw R30,R12
std z+17,R2
std z+18,R3
std z+19,R4
std z+20,R5
; }
L230:
;
; /* 打开扇区 */
; Buf=OpenSec(fp->Drive,SecIndex);
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
movw R30,R12
ldd R16,z+12
xcall _OpenSec
movw R14,R16
; if(Buf!=NULL)
cpi R16,0
cpc R16,R17
brne X58
xjmp L232
X58:
X52:
; {
; /* 写扇区数据 */
; if(ReadSec(fp->Drive,SecIndex)==RETURN_OK)
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
movw R30,R12
ldd R16,z+12
xcall _ReadSec
tst R16
brne L234
; {
; /* 存储数据 */
; Buf[j]=Ch ;
movw R30,R28
push R26
push R27
ldd R26,z+2
ldd R27,z+3
movw R30,R26
pop R27
pop R26
add R30,R14
adc R31,R15
ldd R0,y+24
std z+0,R0
; WriteSec(fp->Drive,SecIndex);
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
movw R30,R12
ldd R16,z+12
xcall _WriteSec
; Rt=RETURN_OK ;
clr R10
; }
L234:
; CloseSec(fp->Drive,SecIndex);
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
movw R30,R12
ldd R16,z+12
xcall _CloseSec
; }
L232:
; }
L220:
; }
L218:
; }
L216:
L214:
; return Rt ;
mov R16,R10
L213:
adiw R28,14
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; temp -> R10,R11
; i -> y+0
; Handle -> R12
; Size -> y+14
; Buf -> R14,R15
.even
_FileWrite::
st -y,r19
st -y,r18
xcall push_gset5
movw R14,R16
sbiw R28,4
ldd R12,y+18
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileWrite
; ** 功能描述: 写文件
; ** 输 入: Buf:要写的数据
; ** Size:要写的字节数
; ** Handle:文件句柄
; ** 输 出: 实际写的字节数
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U FileWrite(void *Buf,INT32U Size,HANDLE Handle)
; {
; INT8U *temp ;
; INT32U i ;
;
; temp=(INT8U *)Buf ;
movw R10,R14
; for(i=0;i<Size;i++)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
xjmp L240
L237:
; {
; if(FilePutCh(*temp,Handle)!=RETURN_OK)
mov R18,R12
movw R30,R10
ldd R16,z+0
xcall _FilePutCh
tst R16
breq L241
; {
; break ;
xjmp L239
L241:
movw R24,R10
adiw R24,1
movw R10,R24
L238:
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
L240:
movw R30,R28
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X59
xjmp L237
X59:
L239:
; }
; temp++;
; }
; return i ;
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
L236:
adiw R28,4
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
; i -> y+0
.even
_FileCloseAll::
xcall push_gset2
sbiw R28,4
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileCloseAll
; ** 功能描述: 关闭所有打开的文件
; ** 输 入: 无
; ** 输 出: 无
; ** 全局变量: FileInfo
; ** 调用模块: AllCacheWriteBack
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FileCloseAll(void)
; {
; INT32U i ;
;
; for(i=0;i<MAX_OPEN_FILES;i++)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
xjmp L247
L244:
movw R30,R28
ldd R16,z+0
xcall _FileClose
L245:
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
L247:
ldi R20,3
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L244
; {
; FileClose(i);
; }
; AllCacheWriteBack();
xcall _AllCacheWriteBack
L243:
adiw R28,4
xcall pop_gset2
.dbline 0 ; func end
ret
; Handle -> R10
.even
_FileEof::
xcall push_gset3
mov R10,R16
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileEof
; ** 功能描述: 判断文件是否到读\写到文件尾
; ** 输 入: Handle:文件句柄
; ** 输 出: 0:否
; ** 1:是
; ** 全局变量: FileInfo
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileEof(HANDLE Handle)
; {
; if(Handle<MAX_OPEN_FILES)
mov R24,R10
cpi R24,3
brge L249
; {
; if(FileInfo[Handle].Offset<FileInfo[Handle].FileSize)
ldi R16,33
mov R17,R24
muls R16,R17
ldi R24,<_FileInfo+17
ldi R25,>_FileInfo+17
movw R30,R0
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
ldi R24,<_FileInfo+29
ldi R25,>_FileInfo+29
movw R30,R0
add R30,R24
adc R31,R25
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh L251
; {
; return FALSE ;
clr R16
xjmp L248
L251:
; }
; }
L249:
; return TRUE ;
ldi R16,1
L248:
xcall pop_gset3
.dbline 0 ; func end
ret
; DiskInfo -> R14,R15
; i -> y+6
; Clus -> y+2
; fp -> R12,R13
; Rt -> R10
; Whence -> y+24
; offset -> y+20
; Handle -> R14
.even
_FileSeek::
st -y,r19
st -y,r18
xcall push_gset5
mov R14,R16
sbiw R28,10
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileSeek
; ** 功能描述: 移动文件读\写位置
; ** 输 入: Handle:文件句柄
; ** offset:移动偏移量
; ** Whence:移动模式SEEK_SET:从文件头计算SEEK_CUR:从当前位置计算SEEK_END:从文件尾计算
; ** 输 出: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年7月12日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FileSeek(HANDLE Handle,INT32S offset,INT8U Whence)
; {
; INT8U Rt ;
; INT32U i,Clus ;
; MY_FILE *fp ;
; Disk_Info *DiskInfo ;
;
; Rt=PARAMETER_ERR ;
ldi R24,255
mov R10,R24
; fp=FileInfo+Handle ;
ldi R16,33
mov R17,R14
muls R16,R17
movw R12,R0
ldi R24,<_FileInfo
ldi R25,>_FileInfo
add R12,R24
adc R13,R25
;
; if(Handle>=0&&Handle<MAX_OPEN_FILES)/* Handle是否有效 */
cpi R17,0
brge X63
xjmp L256
X63:
cpi R17,3
brlt X64
xjmp L256
X64:
; if(fp->Flags!=0)/* 对应的打开文件信息表是否已使用 */
movw R30,R12
ldd R2,z+0
tst R2
brne X65
xjmp L258
X65:
; {
; Rt=RETURN_OK ;
clr R10
; switch(Whence)
ldd R14,y+24
clr R15
tst R14
brne X60
tst R15
brne X66
xjmp L264
X66:
X60:
movw R24,R14
cpi R24,1
ldi R30,0
cpc R25,R30
brne X67
xjmp L265
X67:
cpi R24,2
ldi R30,0
cpc R25,R30
breq L263
xjmp L260
X61:
; {
L263:
; case SEEK_END :/* 从文件尾计算 */
; fp->Offset=fp->FileSize-offset ;
movw R30,R28
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
movw R30,R12
ldd R6,z+17
ldd R7,z+18
ldd R8,z+19
ldd R9,z+20
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R12
std z+29,R6
std z+30,R7
std z+31,R8
std z+32,R9
; offset=-offset ;
movw R30,R28
ldd R16,z+20
ldd R17,z+21
ldd R18,z+22
ldd R19,z+23
xcall neg32
movw R30,R28
std z+20,R16
std z+21,R17
std z+22,R18
std z+23,R19
; break ;
xjmp L261
L264:
; case SEEK_SET :
; fp->Offset=offset ;
movw R30,R28
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
movw R30,R12
std z+29,R2
std z+30,R3
std z+31,R4
std z+32,R5
; break ;
xjmp L261
L265:
; case SEEK_CUR :/* 从当前位置计算 这里不用break是正确的*/
; i=fp->Offset+offset ;
movw R30,R28
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
movw R30,R12
ldd R6,z+29
ldd R7,z+30
ldd R8,z+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -