📄 interface.s
字号:
.module Interface.c
.area text(rom, con, rel)
; RelaStaSect -> y+2
; buffer -> R10,R11
; Device -> R10
.even
_GetVolumeFirstSect::
xcall push_gset3
mov R10,R16
sbiw R28,6
; /****************************************Copyright (c)**************************************************
; ** 广州周立功单片机发展有限公司
; ** 研 究 所
; ** ARM开发组
; **
; ** http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文 件 名: flash.c
; **创 建 人: 陈明计
; **最后修改日期: 2003年9月3日
; **描 述: FAT文件系统在PC上编译的软盘驱动程序(底层驱动)
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版 本: V1.0
; ** 日 期: 2003年9月3日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人:
; ** 日 期:
; ** 描 述:
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
;
; #define IN_FLOPPY
;
; #include "SYS_Config.h"
; #include "FS_Config.h"
; #include "SD_Drive.h"
; #include "USART1.h"
; #include "fat.h"
;
; extern INT8U Data_Buf[SD_BLOCKSIZE];//在main函数中定义
;
; INT32U GetVolumeFirstSect(INT8U Device)
; {
; INT8U *buffer;
; INT32U RelaStaSect ;
;
; Device=Device;
; buffer=Data_Buf;
ldi R24,<_Data_Buf
ldi R25,>_Data_Buf
movw R10,R24
; /* 从SD卡中读一个块 */
; //INT8U SD_ReadBlock(INT32U blockaddr,INT8U *recbuf);
; if( SD_ReadBlock(0x00,buffer)!=0 )
std y+1,R11
std y+0,R10
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,0
xcall _SD_ReadBlock
tst R16
breq L2
; return DISK_INIT_NOT_OK ;
ldi R16,131
ldi R17,0
ldi R18,0
ldi R19,0
xjmp L1
L2:
;
; if( (buffer[510]==0x55)&&(buffer[511]==0xAA) )
movw R30,R10
subi R30,2 ; addi 510
sbci R31,254
ldd R24,z+0
cpi R24,85
breq X0
xjmp L4
X0:
movw R30,R10
subi R30,1 ; addi 511
sbci R31,254
ldd R24,z+0
cpi R24,170
breq X1
xjmp L4
X1:
; {
; if( ( (buffer[0]==0xEB)&&(buffer[2]==0x90) ) || (buffer[0]==0xE9) )
movw R30,R10
ldd R24,z+0
cpi R24,235
brne L9
ldd R24,z+2
cpi R24,144
breq L8
L9:
movw R30,R10
ldd R24,z+0
cpi R24,233
brne L6
L8:
; RelaStaSect=0 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+2,R20
std z+3,R21
std z+4,R22
std z+5,R23
xjmp L7
L6:
; else
; {
; //RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])<<8+(INT32U)(buffer[456])<<16+(INT32U)(buffer[457])<<24;//为何不行???
; //RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])*0x100+(INT32U)(buffer[456])*0x10000+(INT32U)(buffer[457])*0x1000000;
; RelaStaSect=(INT32U)(buffer[454])+
movw R30,R10
subi R30,57 ; addi 455
sbci R31,254
ldd R2,z+0
clr R3
clr R4
clr R5
ldi R20,0
ldi R21,1
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 R30,R10
subi R30,58 ; addi 454
sbci R31,254
ldd R2,z+0
clr R3
clr R4
clr R5
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R10
subi R30,56 ; addi 456
sbci R31,254
ldd R6,z+0
clr R7
clr R8
clr R9
ldi R20,0
ldi R21,0
ldi R22,1
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R10
subi R30,55 ; addi 457
sbci R31,254
ldd R6,z+0
clr R7
clr R8
clr R9
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,1
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
; (INT32U)(buffer[455])*0x100+
; (INT32U)(buffer[456])*0x10000+
; (INT32U)(buffer[457])*0x1000000;
;
; }
L7:
; }
L4:
; return RelaStaSect ;
movw R30,R28
ldd R16,z+2
ldd R17,z+3
ldd R18,z+4
ldd R19,z+5
L1:
adiw R28,6
xcall pop_gset3
.dbline 0 ; func end
ret
; DiskInfo -> R14,R15
; rt -> R10,R11
; Dp -> R12,R13
; Parameter -> R14,R15
; Command -> R10
.even
_SD_Command::
xcall push_gset5
movw R14,R18
mov R10,R16
sbiw R28,2
; }
;
; /*********************************************************************************************************
; ** 函数名称: SDCommand
; ** 功能描述: 底层驱动程序与上层的接口程序
; ** 输 入: DISK_INIT:驱动程序初始化
; ** DISK_CLOSE:关闭驱动器(移除驱动程序)
; ** DISK_CREATE_BOOT_SECTOR:重建引导扇区
; ** DISK_READ_SECTOR:读扇区
; ** DISK_WRITE_SECTOR:写扇区
;
; ** 输 出: DISK_READ_OK:读扇区完成
; ** DISK_READ_NOT_OK:读扇区失败
; ** DISK_WRITE_OK:写扇区完成
; ** DISK_WRITE_NOT_OK:写扇区失败
; ** DISK_INIT_OK:初始化完成
; ** DISK_INIT_NOT_OK:初始化失败
; ** BAD_DISK_COMMAND:无效的命令
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作 者: 陈明计
; ** 日 期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日 期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT16U SD_Command(INT8U Command,void *Parameter)
; {
; INT16U rt ;
; Disk_RW_Parameter *Dp ;
; Disk_Info *DiskInfo ;
;
; Dp=(Disk_RW_Parameter*)Parameter ;
movw R12,R14
;
; switch(Command)
clr R11
tst R10
brne X2
tst R11
breq L14
X2:
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
brne X5
xjmp L19
X5:
cpi R24,2
ldi R30,0
cpc R25,R30
brne X6
xjmp L20
X6:
cpi R24,3
ldi R30,0
cpc R25,R30
brne X7
xjmp L24
X7:
xjmp L11
X3:
; {
L14:
; case DISK_INIT :/*设备初始化*/
; rt=DISK_INIT_NOT_OK ;
ldi R24,131
ldi R25,0
movw R10,R24
; {
; DiskInfo=GetEmptyDiskInfoAddr();
xcall _GetEmptyDiskInfoAddr
movw R14,R16
; if(DiskInfo!=NULL)
cpi R16,0
cpc R16,R17
brne X8
xjmp L12
X8:
X4:
; {
; DiskInfo->DiskCommand=SD_Command ;
ldi R24,<PL_SD_Command
ldi R25,>PL_SD_Command
movw R30,R14
std z+45,R25
std z+44,R24
; DiskInfo->RsvdForLow=GetVolumeFirstSect(0);
clr R16
xcall _GetVolumeFirstSect
movw R30,R14
std z+40,R16
std z+41,R17
std z+42,R18
std z+43,R19
; /*获取卷首扇区*/
; if(DiskInfo->RsvdForLow==DISK_INIT_NOT_OK)
ldi R20,131
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R14
ldd R2,z+40
ldd R3,z+41
ldd R4,z+42
ldd R5,z+43
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L17
; rt=DISK_INIT_NOT_OK;
ldi R24,131
ldi R25,0
movw R10,R24
xjmp L12
L17:
; else
; rt=DISK_INIT_OK;
ldi R24,3
ldi R25,0
movw R10,R24
; }
; }
; break ;
xjmp L12
L19:
; case DISK_CLOSE :
; rt=RETURN_OK;
clr R10
clr R11
; break ;
xjmp L12
L20:
; case DISK_READ_SECTOR : /*读扇区*/
; rt=DISK_READ_NOT_OK ;
ldi R24,128
ldi R25,0
movw R10,R24
; /* 从SD卡中读一个块 */
; //INT8U SD_ReadBlock(INT32U blockaddr,INT8U *recbuf);
; if( SD_ReadBlock(Dp->SectorIndex+Dp->RsvdForLow,Dp->Buf)==0 )
movw R30,R12
ldd R2,z+9
ldd R3,z+10
std y+1,R3
std y+0,R2
movw R30,R12
ldd R2,z+5
ldd R3,z+6
ldd R4,z+7
ldd R5,z+8
movw R30,R12
ldd R6,z+1
ldd R7,z+2
ldd R8,z+3
ldd R9,z+4
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R16,R6
movw R18,R8
xcall _SD_ReadBlock
tst R16
breq X9
xjmp L12
X9:
; {
; rt=DISK_READ_OK ;
ldi R24,1
ldi R25,0
movw R10,R24
; //FS调试用
; #if FS_DEBUG_EN
; #if USART1_EN
; {
; Uart1_SendString("\nFS Reading Logic Sector :");//调试用,数据区开始扇区号
ldi R16,<L23
ldi R17,>L23
xcall _Uart1_SendString
; PUT_INT32U_DecTOString(Dp->SectorIndex);
movw R30,R12
ldd R16,z+1
ldd R17,z+2
ldd R18,z+3
ldd R19,z+4
xcall _PUT_INT32U_DecTOString
; }
; #endif
; #endif
; }
; break ;
xjmp L12
L24:
; case DISK_WRITE_SECTOR :/*写扇区*/
; rt=DISK_WRITE_NOT_OK ;
ldi R24,130
ldi R25,0
movw R10,R24
; /* 向SD卡中写入一个块 */
; //INT8U SD_WriteBlock(INT32U blockaddr,INT8U *recbuf);
; if( SD_WriteBlock(Dp->SectorIndex+Dp->RsvdForLow,Dp->Buf)==0 )
movw R30,R12
ldd R2,z+9
ldd R3,z+10
std y+1,R3
std y+0,R2
movw R30,R12
ldd R2,z+5
ldd R3,z+6
ldd R4,z+7
ldd R5,z+8
movw R30,R12
ldd R6,z+1
ldd R7,z+2
ldd R8,z+3
ldd R9,z+4
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R16,R6
movw R18,R8
xcall _SD_WriteBlock
tst R16
brne L12
; {
; rt=DISK_WRITE_OK ;
ldi R24,2
ldi R25,0
movw R10,R24
; //FS调试用
; #if FS_DEBUG_EN
; #if USART1_EN
; {
;
; Uart1_SendString("\nFS Writing Logic Sector :");//调试用,数据区开始扇区号
ldi R16,<L27
ldi R17,>L27
xcall _Uart1_SendString
; PUT_INT32U_DecTOString(Dp->SectorIndex);
movw R30,R12
ldd R16,z+1
ldd R17,z+2
ldd R18,z+3
ldd R19,z+4
xcall _PUT_INT32U_DecTOString
; }
; #endif
; #endif
; }
; break ;
xjmp L12
L11:
; default :rt=BAD_DISK_COMMAND ; break ;
ldi R24,65535
ldi R25,255
movw R10,R24
L12:
; }
; return rt ;
movw R16,R10
L10:
adiw R28,2
xcall pop_gset5
.dbline 0 ; func end
ret
.area data(ram, con, rel)
L27:
.blkb 27
.area idata
.byte 10,'F,'S,32,'W,'r,'i,'t,'i,'n,'g,32,'L,'o,'g,'i
.byte 'c,32,'S,'e,'c,'t,'o,'r,32,58,0
.area data(ram, con, rel)
L23:
.blkb 27
.area idata
.byte 10,'F,'S,32,'R,'e,'a,'d,'i,'n,'g,32,'L,'o,'g,'i
.byte 'c,32,'S,'e,'c,'t,'o,'r,32,58,0
.area data(ram, con, rel)
.area func_lit
PL_SD_Command: .word `_SD_Command
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -