📄 file.s
字号:
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+12
ldd R7,z+13
ldd R8,z+14
ldd R9,z+15
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+8,R2
std z+9,R3
std z+10,R4
std z+11,R5
; DiskInfo->DataStartSec+i ;
; Rt=SECTOR_READ_ERR ;
ldi R24,5
std y+16,R24
; /* 打开扇区 */
; Buf=OpenSec(fp->Drive,SecIndex);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _OpenSec
movw R10,R16
; if(Buf!=NULL)
cpi R16,0
cpc R16,R17
brne X47
xjmp L198
X47:
X39:
; {
; /* 读取扇区数据 */
; if(ReadSec(fp->Drive,SecIndex)==RETURN_OK)
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _ReadSec
tst R16
breq X48
xjmp L200
X48:
; {
; /* 读取数据 */
; *Ch=Buf[j];
movw R30,R28
push R26
push R27
ldd R26,z+4
ldd R27,z+5
movw R30,R26
pop R27
pop R26
add R30,R10
adc R31,R11
ldd R2,z+0
ldd R30,y+27
ldd R31,y+28
std z+0,R2
; /* 调整文件指针 */
; 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
; j++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
; if(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
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X49
xjmp L202
X49:
; {
; i++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+12,R2
std z+13,R3
std z+14,R4
std z+15,R5
; if(i>=DiskInfo->SecPerClus)
movw R30,R14
ldd R2,z+2
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+12
ldd R7,z+13
ldd R8,z+14
ldd R9,z+15
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L204
; {
; fp->Clus=FATGetNextClus(fp->Drive,fp->Clus);
movw R24,R12
adiw R24,25
movw R30,R24
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
std y+0,R6
std y+1,R7
movw R18,R4
movw R30,R12
ldd R16,z+12
push R24
push R25
xcall _FATGetNextClus
pop R31
pop R30
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
; }
L204:
; }
L202:
; Rt=RETURN_OK ;
clr R0
std y+16,R0
; }
L200:
; /* 关闭扇区 */
; CloseSec(fp->Drive,SecIndex);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _CloseSec
; }
L198:
; }
L196:
; }
L194:
; }
L183:
L181:
; return Rt ;
ldd R16,y+16
L180:
adiw R28,17
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
_FileRead::
st -y,r19
st -y,r18
xcall push_gset5
movw R14,R16
sbiw R28,4
ldd R12,y+18
; }
;
; /*********************************************************************************************************
; ** 函数名称: FileRead
; ** 功能描述: 读取文件
; ** 输 入: Buf:保存读回的数据
; ** Size:要读的字节数
; ** Handle:文件句柄
; ** 输 出: 实际读到的字节数
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U FileRead(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 L210
L207:
; {
; if(FileGetCh(temp,Handle)!=RETURN_OK)
mov R18,R12
movw R16,R10
xcall _FileGetCh
tst R16
breq L211
; {
; break ;
xjmp L209
L211:
movw R24,R10
adiw R24,1
movw R10,R24
L208:
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
L210:
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 X50
xjmp L207
X50:
L209:
; }
; temp++;
; }
; return i ;
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
L206:
adiw R28,4
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
; Buf -> R14,R15
; i -> y+10
; SecIndex -> y+6
; j -> y+2
; DiskInfo -> R14,R15
; Rt -> R10
; fp -> R12,R13
; Handle -> R14
; Ch -> y+24
.even
_FilePutCh::
xcall push_arg4
xcall push_gset5
mov R14,R18
sbiw R28,14
; }
;
; /*********************************************************************************************************
; ** 函数名称: FilePutCh
; ** 功能描述: 写一个字节到文件
; ** 输 入: Ch:要写的数据
; ** Handle:文件句柄
; ** 输 出: RETURN_OK:成功
; ** 其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U FilePutCh(INT8U Ch,HANDLE Handle)
; {
; INT32U i,j,SecIndex ;
; MY_FILE *fp ;
; Disk_Info *DiskInfo ;
; INT8U Rt ;
; INT8U *Buf ;
;
; 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 X53
xjmp L214
X53:
cpi R17,3
brlt X54
xjmp L214
X54:
; if(((fp->Flags)&FILE_FLAGS_WRITE)!=0)/* 对应的打开文件信息表是否已使用 */
movw R30,R12
ldd R2,z+0
sbrs R2,1
rjmp L216
; {
; Rt=FILE_EOF ;
ldi R24,17
mov R10,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 R2,R6
cpc R3,R7
cpc R4,R8
cpc R5,R9
brsh X55
xjmp L218
X55:
; {
; Rt=NOT_FIND_DISK ;
clr R10
inc R10
;
; 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 X56
xjmp L220
X56:
X51:
; {
; /* 调整文件指针 */
; 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+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
;
; if(j==0)
ldi R20,0
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
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq X57
xjmp L222
X57:
; {
; 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
brsh L224
; {
; fp->Clus=FATGetNextClus(fp->Drive,fp->Clus);
movw R24,R12
adiw R24,25
movw R30,R24
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
std y+0,R6
std y+1,R7
movw R18,R4
movw R30,R12
ldd R16,z+12
push R24
push R25
xcall _FATGetNextClus
pop R31
pop R30
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
; }
xjmp L225
L224:
; else
; {
; i=FATAddClus(fp->Drive,fp->Clus);
movw R30,R12
ldd R2,z+25
ldd R3,z+26
ldd R4,z+27
ldd R5,z+28
std y+0,R4
std y+1,R5
movw R18,R2
movw R30,R12
ldd R16,z+12
xcall _FATAddClus
movw R30,R28
std z+10,R16
std z+11,R17
std z+12,R18
std z+13,R19
; if(i>=BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L226
; {
; return DISK_FULL ;
ldi R16,2
xjmp L213
L226:
; }
; fp->Clus=i ;
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
movw R30,R12
std z+25,R2
std z+26,R3
std z+27,R4
std z+28,R5
; if(fp->FstClus==EMPTY_CLUS)
ldi R20,0
ldi R21,0
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
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L228
; {
; fp->FstClus=i ;
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
movw R30,R12
std z+21,R2
std z+22,R3
std z+23,R4
std z+24,R5
; }
L228:
; }
L225:
; }
L222:
;
; /* 计算数据所在扇区 */
; 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+2
ldd R7,z+3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -