📄 interface.lis
字号:
.module Interface.c
.area text(rom, con, rel)
; RelaStaSect -> y+2
; buffer -> R10,R11
; Device -> R10
.even
0000 _GetVolumeFirstSect::
0000 0E940000 xcall push_gset3
0004 A02E mov R10,R16
0006 2697 sbiw R28,6
0008 ; /****************************************Copyright (c)**************************************************
0008 ; ** 广州周立功单片机发展有限公司
0008 ; ** 研 究 所
0008 ; ** ARM开发组
0008 ; **
0008 ; ** http://www.zlgmcu.com
0008 ; **
0008 ; **--------------文件信息--------------------------------------------------------------------------------
0008 ; **文 件 名: flash.c
0008 ; **创 建 人: 陈明计
0008 ; **最后修改日期: 2003年9月3日
0008 ; **描 述: FAT文件系统在PC上编译的软盘驱动程序(底层驱动)
0008 ; **
0008 ; **--------------历史版本信息----------------------------------------------------------------------------
0008 ; ** 创建人: 陈明计
0008 ; ** 版 本: V1.0
0008 ; ** 日 期: 2003年9月3日
0008 ; ** 描 述: 原始版本
0008 ; **
0008 ; **--------------当前版本修订------------------------------------------------------------------------------
0008 ; ** 修改人:
0008 ; ** 日 期:
0008 ; ** 描 述:
0008 ; **
0008 ; **------------------------------------------------------------------------------------------------------
0008 ; ********************************************************************************************************/
0008 ;
0008 ; #define IN_FLOPPY
0008 ;
0008 ; #include "SYS_Config.h"
0008 ; #include "FS_Config.h"
0008 ; #include "SD_Drive.h"
0008 ; #include "USART1.h"
0008 ; #include "fat.h"
0008 ;
0008 ; extern INT8U Data_Buf[SD_BLOCKSIZE];//在main函数中定义
0008 ;
0008 ; INT32U GetVolumeFirstSect(INT8U Device)
0008 ; {
0008 ; INT8U *buffer;
0008 ; INT32U RelaStaSect ;
0008 ;
0008 ; Device=Device;
0008 ; buffer=Data_Buf;
0008 80E0 ldi R24,<_Data_Buf
000A 90E0 ldi R25,>_Data_Buf
000C 5C01 movw R10,R24
000E ; /* 从SD卡中读一个块 */
000E ; //INT8U SD_ReadBlock(INT32U blockaddr,INT8U *recbuf);
000E ; if( SD_ReadBlock(0x00,buffer)!=0 )
000E B982 std y+1,R11
0010 A882 std y+0,R10
0012 00E0 ldi R16,0
0014 10E0 ldi R17,0
0016 20E0 ldi R18,0
0018 30E0 ldi R19,0
001A 0E940000 xcall _SD_ReadBlock
001E 0023 tst R16
0020 29F0 breq L2
0022 ; return DISK_INIT_NOT_OK ;
0022 03E8 ldi R16,131
0024 10E0 ldi R17,0
0026 20E0 ldi R18,0
0028 30E0 ldi R19,0
002A 79C0 xjmp L1
002C L2:
002C ;
002C ; if( (buffer[510]==0x55)&&(buffer[511]==0xAA) )
002C F501 movw R30,R10
002E E250 subi R30,2 ; addi 510
0030 FE4F sbci R31,254
0032 8081 ldd R24,z+0
0034 8535 cpi R24,85
0036 09F0 breq X0
0038 6DC0 xjmp L4
003A X0:
003A F501 movw R30,R10
003C E150 subi R30,1 ; addi 511
003E FE4F sbci R31,254
0040 8081 ldd R24,z+0
0042 8A3A cpi R24,170
0044 09F0 breq X1
0046 66C0 xjmp L4
0048 X1:
0048 ; {
0048 ; if( ( (buffer[0]==0xEB)&&(buffer[2]==0x90) ) || (buffer[0]==0xE9) )
0048 F501 movw R30,R10
004A 8081 ldd R24,z+0
004C 8B3E cpi R24,235
004E 19F4 brne L9
0050 8281 ldd R24,z+2
0052 8039 cpi R24,144
0054 21F0 breq L8
0056 L9:
0056 F501 movw R30,R10
0058 8081 ldd R24,z+0
005A 893E cpi R24,233
005C 51F4 brne L6
005E L8:
005E ; RelaStaSect=0 ;
005E 40E0 ldi R20,0
0060 50E0 ldi R21,0
0062 60E0 ldi R22,0
0064 70E0 ldi R23,0
0066 FE01 movw R30,R28
0068 4283 std z+2,R20
006A 5383 std z+3,R21
006C 6483 std z+4,R22
006E 7583 std z+5,R23
0070 51C0 xjmp L7
0072 L6:
0072 ; else
0072 ; {
0072 ; //RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])<<8+(INT32U)(buffer[456])<<16+(INT32U)(buffer[457])<<24;//为何不行???
0072 ; //RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])*0x100+(INT32U)(buffer[456])*0x10000+(INT32U)(buffer[457])*0x1000000;
0072 ; RelaStaSect=(INT32U)(buffer[454])+
0072 F501 movw R30,R10
0074 E953 subi R30,57 ; addi 455
0076 FE4F sbci R31,254
0078 2080 ldd R2,z+0
007A 3324 clr R3
007C 4424 clr R4
007E 5524 clr R5
0080 40E0 ldi R20,0
0082 51E0 ldi R21,1
0084 60E0 ldi R22,0
0086 70E0 ldi R23,0
0088 5A92 st -y,R5
008A 4A92 st -y,R4
008C 3A92 st -y,R3
008E 2A92 st -y,R2
0090 8A01 movw R16,R20
0092 9B01 movw R18,R22
0094 0E940000 xcall empy32u
0098 F501 movw R30,R10
009A EA53 subi R30,58 ; addi 454
009C FE4F sbci R31,254
009E 2080 ldd R2,z+0
00A0 3324 clr R3
00A2 4424 clr R4
00A4 5524 clr R5
00A6 200E add R2,R16
00A8 311E adc R3,R17
00AA 421E adc R4,R18
00AC 531E adc R5,R19
00AE F501 movw R30,R10
00B0 E853 subi R30,56 ; addi 456
00B2 FE4F sbci R31,254
00B4 6080 ldd R6,z+0
00B6 7724 clr R7
00B8 8824 clr R8
00BA 9924 clr R9
00BC 40E0 ldi R20,0
00BE 50E0 ldi R21,0
00C0 61E0 ldi R22,1
00C2 70E0 ldi R23,0
00C4 9A92 st -y,R9
00C6 8A92 st -y,R8
00C8 7A92 st -y,R7
00CA 6A92 st -y,R6
00CC 8A01 movw R16,R20
00CE 9B01 movw R18,R22
00D0 0E940000 xcall empy32u
00D4 200E add R2,R16
00D6 311E adc R3,R17
00D8 421E adc R4,R18
00DA 531E adc R5,R19
00DC F501 movw R30,R10
00DE E753 subi R30,55 ; addi 457
00E0 FE4F sbci R31,254
00E2 6080 ldd R6,z+0
00E4 7724 clr R7
00E6 8824 clr R8
00E8 9924 clr R9
00EA 40E0 ldi R20,0
00EC 50E0 ldi R21,0
00EE 60E0 ldi R22,0
00F0 71E0 ldi R23,1
00F2 9A92 st -y,R9
00F4 8A92 st -y,R8
00F6 7A92 st -y,R7
00F8 6A92 st -y,R6
00FA 8A01 movw R16,R20
00FC 9B01 movw R18,R22
00FE 0E940000 xcall empy32u
0102 200E add R2,R16
0104 311E adc R3,R17
0106 421E adc R4,R18
0108 531E adc R5,R19
010A FE01 movw R30,R28
010C 2282 std z+2,R2
010E 3382 std z+3,R3
0110 4482 std z+4,R4
0112 5582 std z+5,R5
0114 ; (INT32U)(buffer[455])*0x100+
0114 ; (INT32U)(buffer[456])*0x10000+
0114 ; (INT32U)(buffer[457])*0x1000000;
0114 ;
0114 ; }
0114 L7:
0114 ; }
0114 L4:
0114 ; return RelaStaSect ;
0114 FE01 movw R30,R28
0116 0281 ldd R16,z+2
0118 1381 ldd R17,z+3
011A 2481 ldd R18,z+4
011C 3581 ldd R19,z+5
011E L1:
011E 2696 adiw R28,6
0120 0E940000 xcall pop_gset3
0124 .dbline 0 ; func end
0124 0895 ret
0126 ; DiskInfo -> R14,R15
0126 ; rt -> R10,R11
0126 ; Dp -> R12,R13
0126 ; Parameter -> R14,R15
0126 ; Command -> R10
.even
0126 _SD_Command::
0126 0E940000 xcall push_gset5
012A 7901 movw R14,R18
012C A02E mov R10,R16
012E 2297 sbiw R28,2
0130 ; }
0130 ;
0130 ; /*********************************************************************************************************
0130 ; ** 函数名称: SDCommand
0130 ; ** 功能描述: 底层驱动程序与上层的接口程序
0130 ; ** 输 入: DISK_INIT:驱动程序初始化
0130 ; ** DISK_CLOSE:关闭驱动器(移除驱动程序)
0130 ; ** DISK_CREATE_BOOT_SECTOR:重建引导扇区
0130 ; ** DISK_READ_SECTOR:读扇区
0130 ; ** DISK_WRITE_SECTOR:写扇区
0130 ;
0130 ; ** 输 出: DISK_READ_OK:读扇区完成
0130 ; ** DISK_READ_NOT_OK:读扇区失败
0130 ; ** DISK_WRITE_OK:写扇区完成
0130 ; ** DISK_WRITE_NOT_OK:写扇区失败
0130 ; ** DISK_INIT_OK:初始化完成
0130 ; ** DISK_INIT_NOT_OK:初始化失败
0130 ; ** BAD_DISK_COMMAND:无效的命令
0130 ; ** 全局变量: 无
0130 ; ** 调用模块: 无
0130 ; ** 作 者: 陈明计
0130 ; ** 日 期: 2003年9月3日
0130 ; **-------------------------------------------------------------------------------------------------------
0130 ; ** 修 改 人:
0130 ; ** 日 期:
0130 ; **------------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -