📄 disk.s
字号:
std z+5,R9
; temp1=temp1/DiskInfo[i].SecPerClus ;
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+2
ldi R25,>_DiskInfo+2
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
clr R4
clr R5
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 div32u
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
; DiskInfo[i].ClusPerData=temp1 ;
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+32
ldi R25,>_DiskInfo+32
add R30,R24
adc R31,R25
movw R26,R28
adiw R26,2
ld R2,x+
ld R3,x+
ld R4,x+
ld R5,x
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
;
; /* 判断是FAT12、FAT16还是FAT32 */
; if(temp1<4085)
ldi R20,245
ldi R21,15
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
brsh L91
; {
; DiskInfo[i].FATType=FAT12 ;
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+1
ldi R25,>_DiskInfo+1
add R30,R24
adc R31,R25
clr R2
std z+0,R2
; #if FS_DEBUG_EN
; #if USART1_EN
; Uart1_SendString("\n10.File System is FAT12\n");//调试用
ldi R16,<L94
ldi R17,>L94
xcall _Uart1_SendString
; #endif
; #endif
; }
xjmp L92
L91:
; else if(temp1<65525)
ldi R20,245
ldi R21,255
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
brsh L95
; {
; DiskInfo[i].FATType=FAT16 ;
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+1
ldi R25,>_DiskInfo+1
add R30,R24
adc R31,R25
ldi R24,1
std z+0,R24
; #if FS_DEBUG_EN
; #if USART1_EN
; Uart1_SendString("\n10.File System is FAT16\n");//调试用
ldi R16,<L98
ldi R17,>L98
xcall _Uart1_SendString
; #endif
; #endif
; }
xjmp L96
L95:
; else
; {
; DiskInfo[i].FATType=FAT32 ;
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+1
ldi R25,>_DiskInfo+1
add R30,R24
adc R31,R25
ldi R24,2
std z+0,R24
; #if FS_DEBUG_EN
; //#if USART1_EN
; Uart1_SendString("\n10.File System is FAT32\n");//调试用
ldi R16,<L100
ldi R17,>L100
xcall _Uart1_SendString
; //#endif
; #endif
;
; /* FAT32 RootDirTable为开始簇号 */
; DiskInfo[i].RootDirTable= ((INT32U)Buf[45]<<8)+Buf[44];
ldi R24,8
ldi R25,0
movw R30,R14
ldd R2,z+45
clr R3
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
movw R30,R14
ldd R6,z+44
clr R7
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+20
ldi R25,>_DiskInfo+20
add R30,R24
adc R31,R25
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
; DiskInfo[i].RootDirTable|=(((INT32U)Buf[46]<<16)+((INT32U)Buf[47]<<24));
ldi R24,46
mul R24,R10
movw R2,R0
ldi R24,<_DiskInfo+20
ldi R25,>_DiskInfo+20
add R2,R24
adc R3,R25
ldi R24,24
ldi R25,0
movw R30,R14
ldd R4,z+47
clr R5
clr R6
clr R7
st -y,R24
movw R16,R4
movw R18,R6
xcall lsl32
movw R30,R14
ldd R4,z+46
clr R5
clr R6
clr R7
movw R6,R4
clr R4
clr R5
add R4,R16
adc R5,R17
adc R6,R18
adc R7,R19
movw R30,R2
ldd R20,z+0
ldd R21,z+1
ldd R22,z+2
ldd R23,z+3
or R20,R4
or R21,R5
or R22,R6
or R23,R7
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[i].PathClusIndex=DiskInfo[i].RootDirTable ;
ldi R24,46
mul R24,R10
ldi R24,<_DiskInfo+20
ldi R25,>_DiskInfo+20
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,<_DiskInfo+36
ldi R25,>_DiskInfo+36
movw R30,R0
add R30,R24
adc R31,R25
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
; }
L96:
L92:
; }
L42:
; CloseSec(DiskInfo[i].Drive,0);/* 关闭扇区 */
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std y+0,R22
std y+1,R23
movw R18,R20
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo
ldi R25,>_DiskInfo
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _CloseSec
; }
L40:
L37:
inc R10
L39:
mov R24,R10
cpi R24,1
brsh X7
xjmp L36
X7:
L30:
adiw R28,6
xcall pop_gset5
.dbline 0 ; func end
ret
; Pa -> y+0
; Drive -> R10
.even
_RemoveFileDriver::
xcall push_gset3
mov R10,R16
sbiw R28,11
; }
; }
;
; /*********************************************************************************************************
; ** 函数名称: RemoveFileDriver
; ** 功能描述: 删除一个底层驱动程序
; ** 输 入: Drive:逻辑驱动器号
; ** 输 出: 无
; ** 全局变量: DiskInfo
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日 期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void RemoveFileDriver(INT8U Drive)
; {
; Disk_RW_Parameter Pa ;
;
; if(Drive<MAX_DRIVES)
mov R24,R10
cpi R24,1
brlo X8
xjmp L106
X8:
; if(DiskInfo[Drive].Drive!=EMPTY_DRIVE)
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo
ldi R25,>_DiskInfo
add R30,R24
adc R31,R25
ldd R24,z+0
cpi R24,255
brne X9
xjmp L108
X9:
; {
; AllCacheWriteBack();
xcall _AllCacheWriteBack
; Pa.Drive=Drive ;
std y+0,R10
; Pa.RsvdForLow=DiskInfo[Drive].RsvdForLow ;
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+40
ldi R25,>_DiskInfo+40
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+5,R2
std z+6,R3
std z+7,R4
std z+8,R5
; DiskInfo[Drive].DiskCommand(DISK_CLOSE,&Pa);
movw R18,R28
ldi R16,1
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+44
ldi R25,>_DiskInfo+44
add R30,R24
adc R31,R25
ldd R26,z+0
ldd R27,z+1
movw R30,R26
xcall xicall
;
; DiskInfo[Drive].Drive=EMPTY_DRIVE ; // 没有分配
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo
ldi R25,>_DiskInfo
add R30,R24
adc R31,R25
ldi R24,255
std z+0,R24
; DiskInfo[Drive].FATType=0xff ; // 无效的文件系统
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+1
ldi R25,>_DiskInfo+1
add R30,R24
adc R31,R25
ldi R24,255
std z+0,R24
; DiskInfo[Drive].SecPerClus=0 ; // 每簇扇区数
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+2
ldi R25,>_DiskInfo+2
add R30,R24
adc R31,R25
clr R2
std z+0,R2
; DiskInfo[Drive].NumFATs=0 ; // FAT表数
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+3
ldi R25,>_DiskInfo+3
add R30,R24
adc R31,R25
std z+0,R2
; DiskInfo[Drive].SecPerDisk=0xffffffff ;// 逻辑驱动器包含扇区数
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+12
ldi R25,>_DiskInfo+12
add R30,R24
adc R31,R25
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,255
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].BytsPerSec=0 ; // 每扇区字节数
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+16
ldi R25,>_DiskInfo+16
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].RootDirTable=0 ; // 根目录开始扇区号(FAT32为开始簇号)
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+20
ldi R25,>_DiskInfo+20
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].RootSecCnt=0 ; // 根目录占用扇区数
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+24
ldi R25,>_DiskInfo+24
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].FATStartSec=0 ; // FAT表开始扇区号
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+4
ldi R25,>_DiskInfo+4
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].FATSecCnt=0 ; // 每个FAT占用扇区数
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+8
ldi R25,>_DiskInfo+8
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].DataStartSec=0 ; // 数据区开始扇区号
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+28
ldi R25,>_DiskInfo+28
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].PathClusIndex=0 ; // 当前目录
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+36
ldi R25,>_DiskInfo+36
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
; DiskInfo[Drive].DiskCommand=NULL ; // 驱动程序
ldi R24,46
mul R24,R10
movw R30,R0
ldi R24,<_DiskInfo+44
ldi R25,>_DiskInfo+44
add R30,R24
adc R31,R25
clr R3
std z+1,R3
std z+0,R2
; }
L108:
L106:
L105:
adiw R28,11
xcall pop_gset3
.dbline 0 ; func end
ret
.area bss(ram, con, rel)
_DiskInfo::
.blkb 46
.area data(ram, con, rel)
L100:
.blkb 26
.area idata
.byte 10,49,48,46,'F,'i,'l,'e,32,'S,'y,'s,'t,'e,'m,32
.byte 'i,'s,32,'F,'A,'T,51,50,10,0
.area data(ram, con, rel)
L98:
.blkb 26
.area idata
.byte 10,49,48,46,'F,'i,'l,'e,32,'S,'y,'s,'t,'e,'m,32
.byte 'i,'s,32,'F,'A,'T,49,54,10,0
.area data(ram, con, rel)
L94:
.blkb 26
.area idata
.byte 10,49,48,46,'F,'i,'l,'e,32,'S,'y,'s,'t,'e,'m,32
.byte 'i,'s,32,'F,'A,'T,49,50,10,0
.area data(ram, con, rel)
L85:
.blkb 18
.area idata
.byte 10,32,57,46,'D,'a,'t,'a,'S,'t,'a,'r,'t,'S,'e,'c
.byte 58,0
.area data(ram, con, rel)
L80:
.blkb 18
.area idata
.byte 10,32,56,46,'R,'o,'o,'t,'D,'i,'r,'T,'a,'b,'l,'e
.byte 58,0
.area data(ram, con, rel)
L73:
.blkb 16
.area idata
.byte 10,32,55,46,'S,'e,'c,'P,'e,'r,'D,'i,'s,'k,58,0
.area data(ram, con, rel)
L66:
.blkb 16
.area idata
.byte 10,32,54,46,'R,'o,'o,'t,'S,'e,'c,'C,'n,'t,58,0
.area data(ram, con, rel)
L61:
.blkb 13
.area idata
.byte 10,32,53,46,'N,'u,'m,'F,'A,'T,'s,58,0
.area data(ram, con, rel)
L58:
.blkb 15
.area idata
.byte 10,32,52,46,'F,'A,'T,'S,'e,'c,'C,'n,'t,58,0
.area data(ram, con, rel)
L51:
.blkb 17
.area idata
.byte 10,32,51,46,'F,'A,'T,'S,'t,'a,'r,'t,'S,'e,'c,58
.byte 0
.area data(ram, con, rel)
L48:
.blkb 16
.area idata
.byte 10,32,50,46,'S,'e,'c,'P,'e,'r,'C,'l,'u,'s,58,0
.area data(ram, con, rel)
L45:
.blkb 16
.area idata
.byte 10,32,49,46,'B,'y,'t,'s,'P,'e,'r,'S,'e,'c,58,0
.area data(ram, con, rel)
L35:
.blkb 20
.area idata
.byte 10,'S,'D,47,'M,'M,'C,32,'I,'N,'I,'T,32,'N,'O,'T
.byte 32,'O,'K,0
.area data(ram, con, rel)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -