📄 fat.s
字号:
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R14
adiw R30,2
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
clr R4
clr R5
movw R4,R2
clr R2
clr R3
or R2,R16
or R3,R17
or R4,R18
or R5,R19
movw R30,R28
ldd R6,z+6
ldd R7,z+7
ldd R8,z+8
ldd R9,z+9
or R6,R2
or R7,R3
or R8,R4
or R9,R5
movw R30,R28
std z+6,R6
std z+7,R7
std z+8,R8
std z+9,R9
; Rt=Rt&0x0fffffff ;
ldi R20,255
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
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
; break ;
xjmp L15
L14:
; default :
; Rt=BAD_CLUS ;
ldi R20,247
ldi R21,255
ldi R22,255
ldi R23,15
movw R30,R28
std z+6,R20
std z+7,R21
std z+8,R22
std z+9,R23
; break ;
L15:
; }
; CloseSec(Drive,SecIndex);
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+22
xcall _CloseSec
; return Rt ;
movw R30,R28
ldd R16,z+6
ldd R17,z+7
ldd R18,z+8
ldd R19,z+9
L1:
adiw R28,12
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
; temp -> R12,R13
; ByteIndex -> R10,R11
; Buf -> R14,R15
; SecIndex -> y+4
; Disk -> y+2
; Next -> y+22
; Index -> y+18
; Drive -> y+16
.even
_FATSetNextClus::
xcall push_arg4
xcall push_gset5
sbiw R28,6
; }
;
; /*********************************************************************************************************
; ** 函数名称: FATSetNextClus
; ** 功能描述: 设置下一个簇
; **
; ** 输 入: Drive:驱动器号
; ** Index:簇号
; ** Next:下一个簇号
; ** 输 出: 无
; **
; ** 全局变量: 无
; ** 调用模块: 无
; **
; ** 作 者: 陈明计
; ** 日 期: 2003年9月6日
; **-------------------------------------------------------------------------------------------------------
; ** 修改人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FATSetNextClus(INT8U Drive,INT32U Index,INT32U Next)
; {
; INT16U temp ;
; INT16U SecIndex,ByteIndex ;
; INT8U *Buf ;
; Disk_Info *Disk ;
;
; Disk=GetDiskInfo(Drive);
ldd R16,y+16
xcall _GetDiskInfo
std y+3,R17
std y+2,R16
; if(Disk==NULL)
movw R0,R16
cpi R16,0
cpc R16,R17
brne L31
X14:
; {
; return ;
xjmp L30
L31:
; }
; if(Index<=EMPTY_CLUS_1)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brlo L33
; {
; return ;
xjmp L30
L33:
; }
;
; if(Index>=Disk->ClusPerData)
ldd R30,y+2
ldd R31,y+3
ldd R2,z+32
ldd R3,z+33
ldd R4,z+34
ldd R5,z+35
movw R30,R28
ldd R6,z+18
ldd R7,z+19
ldd R8,z+20
ldd R9,z+21
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L35
; {
; return ;
xjmp L30
L35:
; }
;
; /* 计算扇区号和字节索引 */
; switch(Disk->FATType)
ldd R30,y+2
ldd R31,y+3
ldd R10,z+1
clr R11
tst R10
brne X15
tst R11
breq L40
X15:
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
brne X21
xjmp L41
X21:
cpi R24,2
ldi R30,0
cpc R25,R30
brne X22
xjmp L42
X22:
xjmp L30
X16:
; {
L40:
; case FAT12 :
; SecIndex=Index*3/(2*Disk->BytsPerSec);
ldd R30,y+2
ldd R31,y+3
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
ldi R20,2
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 R2,R16
movw R4,R18
movw R30,R28
ldd R6,z+18
ldd R7,z+19
ldd R8,z+20
ldd R9,z+21
ldi R20,3
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall div32u
std y+5,R17
std y+4,R16
; ByteIndex=((Index*3)/2)-(SecIndex*Disk->BytsPerSec);
ldd R30,y+2
ldd R31,y+3
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R6,R16
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 R2,R16
movw R4,R18
movw R30,R28
ldd R6,z+18
ldd R7,z+19
ldd R8,z+20
ldd R9,z+21
ldi R20,3
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
movw R6,R16
movw R8,R18
lsr R9
ror R8
ror R7
ror R6
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R10,R6
; SecIndex+=Disk->FATStartSec ;
ldd R30,y+2
ldd R31,y+3
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
ldd R6,y+4
ldd R7,y+5
clr R8
clr R9
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+5,R7
std y+4,R6
; break ;
xjmp L38
L41:
; case FAT16 :
; SecIndex=Index*2/Disk->BytsPerSec+Disk->FATStartSec ;
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
ldi R20,2
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
ldd R30,y+2
ldd R31,y+3
ldd R6,z+16
ldd R7,z+17
ldd R8,z+18
ldd R9,z+19
st -y,R9
st -y,R8
st -y,R7
st -y,R6
xcall div32u
movw R2,R16
movw R4,R18
ldd R30,y+2
ldd R31,y+3
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
std y+5,R3
std y+4,R2
; ByteIndex=(Index*2)&(Disk->BytsPerSec-1);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
ldd R30,y+2
ldd R31,y+3
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R30,R28
ldd R6,z+18
ldd R7,z+19
ldd R8,z+20
ldd R9,z+21
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
movw R6,R16
movw R8,R18
and R6,R2
and R7,R3
and R8,R4
and R9,R5
movw R10,R6
; break ;
xjmp L38
L42:
; case FAT32 :
; SecIndex=Index*4/Disk->BytsPerSec+Disk->FATStartSec ;
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
ldi R20,4
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
ldd R30,y+2
ldd R31,y+3
ldd R6,z+16
ldd R7,z+17
ldd R8,z+18
ldd R9,z+19
st -y,R9
st -y,R8
st -y,R7
st -y,R6
xcall div32u
movw R2,R16
movw R4,R18
ldd R30,y+2
ldd R31,y+3
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
std y+5,R3
std y+4,R2
; ByteIndex=(Index*4)&(Disk->BytsPerSec-1);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
ldd R30,y+2
ldd R31,y+3
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R30,R28
ldd R6,z+18
ldd R7,z+19
ldd R8,z+20
ldd R9,z+21
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
movw R6,R16
movw R8,R18
and R6,R2
and R7,R3
and R8,R4
and R9,R5
movw R10,R6
; break ;
; default :
; return ;
L38:
; }
;
; Buf=OpenSec(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 _OpenSec
movw R14,R16
; if(Buf==NULL)
cpi R16,0
cpc R16,R17
brne L43
X17:
; {
; return ;
xjmp L30
L43:
; }
; ReadSec(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 _ReadSec
;
; switch(Disk->FATType)
ldd R30,y+2
ldd R31,y+3
ldd R12,z+1
clr R13
tst R12
brne X18
tst R13
breq L48
X18:
movw R24,R12
cpi R24,1
ldi R30,0
cpc R25,R30
brne X23
xjmp L59
X23:
cpi R24,2
ldi R30,0
cpc R25,R30
brne X24
xjmp L60
X24:
xjmp L46
X19:
; {
L48:
; case FAT12 :
; temp=Next&0x0fff ;/* 判断哪12位有效 */
ldi R20,255
ldi R21,15
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R12,R2
; if((Index&0x01)!=0)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L49
; {
; temp=temp*16 ;
ldi R16,16
ldi R17,0
movw R18,R12
xcall empy16s
movw R12,R16
; temp|=(Buf[ByteIndex]&0x0f);
movw R30,R10
add R30,R14
adc R31,R15
ldd R24,z+0
clr R25
andi R24,15
andi R25,0
or R12,R24
or R13,R25
; Buf[ByteIndex]=temp ;
movw R30,R10
add R30,R14
adc R31,R15
std z+0,R12
; }
xjmp L50
L49:
; else
; {
; Buf[ByteIndex]=temp ;
movw R30,R10
add R30,R14
adc R31,R15
std z+0,R12
; }
L50:
; ByteIndex++;
movw R24,R10
adiw R24,1
movw R10,R24
; temp=temp>>8 ;
mov R12,R13
clr R13
; /* 下一个字节是否在下一个扇区 */
; if(ByteIndex>=Disk->BytsPerSec)
ldd R30,y+2
ldd R31,y+3
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
movw R6,R24
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X25
xjmp L51
X25:
; {
; Buf=OpenSec(Drive,SecIndex+1);
ldd R24,y+4
ldd R25,y+5
adiw R24,1
movw R2,R24
clr R4
clr R5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+16
xcall _OpenSec
movw R14,R16
; if(Buf==NULL)
cpi R16,0
cpc R16,R17
brne L53
X20:
; break ;
xjmp L46
L53:
; ReadSec(Drive,SecIndex+1);
ldd R24,y+4
ldd R25,y+5
adiw R24,1
movw R2,R24
clr R4
clr R5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+16
xcall _ReadSec
; /* 判断哪12位有效 */
; if((Index&0x01)!=0)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L55
; {
; Buf[0]=temp ;
movw R30,R14
std z+0,R12
; }
xjmp L56
L55:
; else
; {
; Buf[0]=(Buf[0]&0xf0)|temp ;
movw R30,R14
ldd R24,z+0
clr R25
andi R24,240
andi R25,0
or R24,R12
or R25,R13
std z+0,R24
; }
L56:
; WriteSec(Drive,SecIndex+1);
ldd R24,y+4
ldd R25,y+5
adiw R24,1
movw R2,R24
clr R4
clr R5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+16
xcall _WriteSec
; CloseSec(Drive,SecIndex+1);
ldd R24,y+4
ldd R25,y+5
adiw R24,1
movw R2,R24
clr R4
clr R5
std y+0,R4
std y+1,R5
movw R18,R2
ldd R16,y+16
xcall _CloseSec
; }
xjmp L46
L51:
; else
; {
; /* 判断哪12位有效 */
; if((Index&0x01)!=0)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L57
; {
; Buf[ByteIndex]=temp ;
movw R30,R10
add R30,R14
adc R31,R15
std z+0,R12
; }
xjmp L46
L57:
; else
; {
; Buf[ByteIndex]=(Buf[ByteIndex]&0xf0)|temp ;
movw R2,R10
add R2,R14
adc R3,R15
movw R30,R2
ldd R24,z+0
clr R25
andi R24,240
andi R25,0
or R24,R12
or R25,R13
std z+0,R24
; }
; }
; break ;
xjmp L46
L59:
; case FAT16 :
; 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -