📄 fat.s
字号:
; break ;
xjmp L46
L60:
; case FAT32 :
; Buf[ByteIndex]=Next ;
movw R30,R10
add R30,R14
adc R31,R15
movw R26,R28
adiw R26,22
ld R2,x+
ld R3,x+
ld R4,x+
ld R5,x
std z+0,R2
; Buf[ByteIndex+1]=Next>>8 ;
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R30,R10
adiw R30,1
add R30,R14
adc R31,R15
std z+0,R16
; Buf[ByteIndex+2]=Next>>16 ;
movw R30,R10
adiw R30,2
add R30,R14
adc R31,R15
movw R26,R28
adiw R26,22
ld R2,x+
ld R3,x+
ld R4,x+
ld R5,x
movw R2,R4
clr R4
clr R5
std z+0,R2
; Buf[ByteIndex+3]=(Buf[ByteIndex+3]&0xf0)|((Next>>24)&0x0f);
movw R24,R10
adiw R24,3
add R24,R14
adc R25,R15
movw R2,R24
ldi R24,24
ldi R25,0
movw R30,R28
ldd R4,z+22
ldd R5,z+23
ldd R6,z+24
ldd R7,z+25
st -y,R24
movw R16,R4
movw R18,R6
xcall lsr32
movw R4,R16
movw R6,R18
ldi R20,15
ldi R21,0
ldi R22,0
ldi R23,0
and R4,R20
and R5,R21
and R6,R22
and R7,R23
movw R30,R2
ldd R24,z+0
clr R25
andi R24,240
andi R25,0
movw R20,R24
clr R22
sbrc R21,7
com R22
clr R23
sbrc R22,7
com R23
or R20,R4
or R21,R5
or R22,R6
or R23,R7
mov R4,R20
std z+0,R4
; break ;
; default :
; break ;
L46:
; }
; WriteSec(Drive,SecIndex);
ldd R2,y+4
ldd R3,y+5
clr R4
clr R5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+16
xcall _WriteSec
; CloseSec(Drive,SecIndex);
ldd R2,y+4
ldd R3,y+5
clr R4
clr R5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+16
xcall _CloseSec
; return ;
L30:
adiw R28,6
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; Disk -> R12,R13
; MaxClus -> y+14
; ThisClus -> y+10
; NextClus -> y+6
; Index -> y+26
; Drive -> R10
.even
_FATAddClus::
st -y,r19
st -y,r18
xcall push_gset4
mov R10,R16
sbiw R28,18
; }
;
; /*********************************************************************************************************
; ** 函数名称: FATAddClus
; ** 功能描述: 为指定簇链增加一个簇
; ** 输 入: Drive:驱动器号
; ** Index:簇链中任意一个簇号,如果为0,则为一个空链增加一个簇
; ** 输 出: 增加的簇号
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT32U FATAddClus(INT8U Drive,INT32U Index)
; {
; INT32U NextClus,ThisClus,MaxClus ;
; Disk_Info *Disk ;
;
; Disk=GetDiskInfo(Drive);
mov R16,R10
xcall _GetDiskInfo
movw R12,R16
; if(Disk==NULL)
cpi R16,0
cpc R16,R17
brne L62
X26:
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L61
L62:
; }
;
; if(Index>=BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+26
ldd R3,z+27
ldd R4,z+28
ldd R5,z+29
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L64
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L61
L64:
; }
;
;
; MaxClus=Disk->ClusPerData ;
movw R30,R12
ldd R2,z+32
ldd R3,z+33
ldd R4,z+34
ldd R5,z+35
movw R30,R28
std z+14,R2
std z+15,R3
std z+16,R4
std z+17,R5
;
; /* 查找最后一个簇 */
; ThisClus=Index ;
movw R30,R28
ldd R2,z+26
ldd R3,z+27
ldd R4,z+28
ldd R5,z+29
movw R30,R28
std z+10,R2
std z+11,R3
std z+12,R4
std z+13,R5
; if(ThisClus!=EMPTY_CLUS&&ThisClus!=EMPTY_CLUS_1)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
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
brne X28
xjmp L66
X28:
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
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
brne X29
xjmp L66
X29:
; {
xjmp L69
L68:
; while(1)
; {
; NextClus=FATGetNextClus(Drive,ThisClus);
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,R10
xcall _FATGetNextClus
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
; if(NextClus>=EOF_CLUS_1)
ldi R20,248
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L71
; {
; break ;
xjmp L67
L71:
; }
; if(NextClus<=EMPTY_CLUS_1)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brlo L73
; {
; break ;
xjmp L67
L73:
; }
; if(NextClus==BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L75
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
xjmp L61
L75:
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
movw R30,R28
std z+10,R2
std z+11,R3
std z+12,R4
std z+13,R5
L69:
xjmp L68
X27:
; }
; ThisClus=NextClus ;
; }
; }
xjmp L67
L66:
; else
; {
; ThisClus=EMPTY_CLUS_1 ;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+10,R20
std z+11,R21
std z+12,R22
std z+13,R23
; }
L67:
;
; for(NextClus=ThisClus+1;NextClus<MaxClus;NextClus++)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
xjmp L80
L77:
; {
; if(FATGetNextClus(Drive,NextClus)==EMPTY_CLUS)
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
mov R16,R10
xcall _FATGetNextClus
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R16,R20
cpc R17,R21
cpc R18,R22
cpc R19,R23
brne L81
; {
; break ;
xjmp L79
L81:
L78:
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
L80:
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+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
brsh X30
xjmp L77
X30:
L79:
; }
; }
; if(NextClus>=MaxClus)
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+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
brsh X31
xjmp L83
X31:
; {
; for(NextClus=EMPTY_CLUS_1+1;NextClus<ThisClus;NextClus++)
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+6,R20
std z+7,R21
std z+8,R22
std z+9,R23
xjmp L88
L85:
; {
; if(FATGetNextClus(Drive,NextClus)==EMPTY_CLUS)
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
mov R16,R10
xcall _FATGetNextClus
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R16,R20
cpc R17,R21
cpc R18,R22
cpc R19,R23
brne L89
; {
; break ;
xjmp L87
L89:
L86:
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
L88:
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
brsh X32
xjmp L85
X32:
L87:
; }
; }
; }
L83:
; if(FATGetNextClus(Drive,NextClus)==EMPTY_CLUS)
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
mov R16,R10
xcall _FATGetNextClus
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R16,R20
cpc R17,R21
cpc R18,R22
cpc R19,R23
breq X33
xjmp L91
X33:
; {
; if(ThisClus>EMPTY_CLUS_1)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brsh L93
; {
; FATSetNextClus(Drive,ThisClus,NextClus);
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
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,R10
xcall _FATSetNextClus
; }
L93:
; FATSetNextClus(Drive,NextClus,EOF_CLUS_END);
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,15
std y+2,R20
std y+3,R21
std y+4,R22
std y+5,R23
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
mov R16,R10
xcall _FATSetNextClus
; return NextClus ;
movw R30,R28
ldd R16,z+6
ldd R17,z+7
ldd R18,z+8
ldd R19,z+9
xjmp L61
L91:
; }
; else
; {
; return BAD_CLUS ;
ldi R16,247
ldi R17,255
ldi R18,255
ldi R19,15
L61:
adiw R28,18
xcall pop_gset4
adiw R28,2
.dbline 0 ; func end
ret
; ThisClus -> y+10
; NextClus -> y+6
; Index -> y+20
; Drive -> R10
.even
_FATDelClusChain::
st -y,r19
st -y,r18
xcall push_gset3
mov R10,R16
sbiw R28,14
; }
; }
; /*********************************************************************************************************
; ** 函数名称: FATDelClusChain
; ** 功能描述: 删除指定簇链
; ** 输 入: Drive:驱动器号
; ** Index:簇链中首簇号
; ** 输 出: 无
; ** 全局变量: 无
; ** 调用模块: FATGetNextClus,FATSetNextClus
; ** 作 者: 陈明计
; ** 日 期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FATDelClusChain(INT8U Drive,INT32U Index)
; {
; INT32U NextClus,ThisClus ;
;
; if(Index<=EMPTY_CLUS_1)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brlo L96
; {
; return ;
xjmp L95
L96:
; }
; if(Index>=BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L98
; {
; return ;
xjmp L95
L98:
; }
; ThisClus=Index ;
movw R30,R28
ldd R2,z+20
ldd R3,z+21
ldd R4,z+22
ldd R5,z+23
movw R30,R28
std z+10,R2
std z+11,R3
std z+12,R4
std z+13,R5
xjmp L101
L100:
; while(1)
; {
; NextClus=FATGetNextClus(Drive,ThisClus);
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,R10
xcall _FATGetNextClus
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
; FATSetNextClus(Drive,ThisClus,EMPTY_CLUS);
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std y+2,R20
std y+3,R21
std y+4,R22
std y+5,R23
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,R10
xcall _FATSetNextClus
; if(NextClus>=BAD_CLUS)
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L103
; {
; break ;
xjmp L102
L103:
; }
; if(NextClus<=EMPTY_CLUS_1)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brlo L105
; {
; break ;
xjmp L102
L105:
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
movw R30,R28
std z+10,R2
std z+11,R3
std z+12,R4
std z+13,R5
L101:
xjmp L100
L102:
L95:
adiw R28,14
xcall pop_gset3
adiw R28,2
.dbline 0 ; func end
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -