sd_drive.lis

来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,540 行 · 第 1/5 页

LIS
1,540
字号
 01DE           ;     
 01DE           ;     tmp=blocknum-sds.erase_unit ;
 01DE 40900A00          lds R4,_sds+8+2
 01E2 50900B00          lds R5,_sds+8+2+1
 01E6 20900800          lds R2,_sds+8
 01EA 30900900          lds R3,_sds+8+1
 01EE FE01              movw R30,R28
 01F0 6684              ldd R6,z+14
 01F2 7784              ldd R7,z+15
 01F4 8088              ldd R8,z+16
 01F6 9188              ldd R9,z+17
 01F8 6218              sub R6,R2
 01FA 7308              sbc R7,R3
 01FC 8408              sbc R8,R4
 01FE 9508              sbc R9,R5
 0200 FE01              movw R30,R28
 0202 6082              std z+0,R6
 0204 7182              std z+1,R7
 0206 8282              std z+2,R8
 0208 9382              std z+3,R9
 020A 74C0              xjmp L42
 020C           L41:
 020C           ;     /* 每次擦除扇区大小 once erase is sector size */
 020C           ;     while(tmp>=0)
 020C           ;     {
 020C           ;         ret=SD_EraseStartBlock(startaddr);
 020C FE01              movw R30,R28
 020E 0285              ldd R16,z+10
 0210 1385              ldd R17,z+11
 0212 2485              ldd R18,z+12
 0214 3585              ldd R19,z+13
 0216 0E940000          xcall _SD_EraseStartBlock
 021A A02E              mov R10,R16
 021C           ;         /* 选择起始块地址 select start address */
 021C           ;         if(ret!=SD_NO_ERR)
 021C 0023              tst R16
 021E 09F0              breq L44
 0220           ;             return ret ;
 0220 B7C0              xjmp L35
 0222           L44:
 0222           ;         
 0222           ;         ret=SD_EraseEndBlock(startaddr+sds.erase_unit-1);
 0222 40900A00          lds R4,_sds+8+2
 0226 50900B00          lds R5,_sds+8+2+1
 022A 20900800          lds R2,_sds+8
 022E 30900900          lds R3,_sds+8+1
 0232 FE01              movw R30,R28
 0234 6284              ldd R6,z+10
 0236 7384              ldd R7,z+11
 0238 8484              ldd R8,z+12
 023A 9584              ldd R9,z+13
 023C 620C              add R6,R2
 023E 731C              adc R7,R3
 0240 841C              adc R8,R4
 0242 951C              adc R9,R5
 0244 41E0              ldi R20,1
 0246 50E0              ldi R21,0
 0248 60E0              ldi R22,0
 024A 70E0              ldi R23,0
 024C 641A              sub R6,R20
 024E 750A              sbc R7,R21
 0250 860A              sbc R8,R22
 0252 970A              sbc R9,R23
 0254 8301              movw R16,R6
 0256 9401              movw R18,R8
 0258 0E940000          xcall _SD_EraseEndBlock
 025C A02E              mov R10,R16
 025E           ;         /* 选择终止块地址 select end address */
 025E           ;         if(ret!=SD_NO_ERR)
 025E 0023              tst R16
 0260 09F0              breq L47
 0262           ;             return ret ;
 0262 96C0              xjmp L35
 0264           L47:
 0264           ;         
 0264           ;         ret=SD_EraseSelectedBlock();
 0264 0E940000          xcall _SD_EraseSelectedBlock
 0268 A02E              mov R10,R16
 026A           ;         /* 擦除所选的块 erase blocks selected */
 026A           ;         if(ret!=SD_NO_ERR)
 026A 0023              tst R16
 026C 09F0              breq L49
 026E           ;             return ret ;
 026E 90C0              xjmp L35
 0270           L49:
 0270 40900A00          lds R4,_sds+8+2
 0274 50900B00          lds R5,_sds+8+2+1
 0278 20900800          lds R2,_sds+8
 027C 30900900          lds R3,_sds+8+1
 0280 FE01              movw R30,R28
 0282 6284              ldd R6,z+10
 0284 7384              ldd R7,z+11
 0286 8484              ldd R8,z+12
 0288 9584              ldd R9,z+13
 028A 620C              add R6,R2
 028C 731C              adc R7,R3
 028E 841C              adc R8,R4
 0290 951C              adc R9,R5
 0292 FE01              movw R30,R28
 0294 6286              std z+10,R6
 0296 7386              std z+11,R7
 0298 8486              std z+12,R8
 029A 9586              std z+13,R9
 029C 40900A00          lds R4,_sds+8+2
 02A0 50900B00          lds R5,_sds+8+2+1
 02A4 20900800          lds R2,_sds+8
 02A8 30900900          lds R3,_sds+8+1
 02AC FE01              movw R30,R28
 02AE 6684              ldd R6,z+14
 02B0 7784              ldd R7,z+15
 02B2 8088              ldd R8,z+16
 02B4 9188              ldd R9,z+17
 02B6 6218              sub R6,R2
 02B8 7308              sbc R7,R3
 02BA 8408              sbc R8,R4
 02BC 9508              sbc R9,R5
 02BE FE01              movw R30,R28
 02C0 6686              std z+14,R6
 02C2 7786              std z+15,R7
 02C4 808A              std z+16,R8
 02C6 918A              std z+17,R9
 02C8 40900A00          lds R4,_sds+8+2
 02CC 50900B00          lds R5,_sds+8+2+1
 02D0 20900800          lds R2,_sds+8
 02D4 30900900          lds R3,_sds+8+1
 02D8 FE01              movw R30,R28
 02DA 6684              ldd R6,z+14
 02DC 7784              ldd R7,z+15
 02DE 8088              ldd R8,z+16
 02E0 9188              ldd R9,z+17
 02E2 6218              sub R6,R2
 02E4 7308              sbc R7,R3
 02E6 8408              sbc R8,R4
 02E8 9508              sbc R9,R5
 02EA FE01              movw R30,R28
 02EC 6082              std z+0,R6
 02EE 7182              std z+1,R7
 02F0 8282              std z+2,R8
 02F2 9382              std z+3,R9
 02F4           L42:
 02F4 40E0              ldi R20,0
 02F6 50E0              ldi R21,0
 02F8 60E0              ldi R22,0
 02FA 70E0              ldi R23,0
 02FC FE01              movw R30,R28
 02FE 2080              ldd R2,z+0
 0300 3180              ldd R3,z+1
 0302 4280              ldd R4,z+2
 0304 5380              ldd R5,z+3
 0306 2416              cp R2,R20
 0308 3506              cpc R3,R21
 030A 4606              cpc R4,R22
 030C 5706              cpc R5,R23
 030E 0CF0              brlt X0
 0310 7DCF              xjmp L41
 0312           X0:
 0312           ;         
 0312           ;         startaddr+=sds.erase_unit ;
 0312           ;         /* 起始地址递增 */
 0312           ;         blocknum-=sds.erase_unit ;
 0312           ;         tmp=blocknum-sds.erase_unit ;
 0312           ;     };
 0312           ;     
 0312           ;     /* 擦除不够擦除扇区大小的块 */
 0312           ;     if(blocknum>0)
 0312 40E0              ldi R20,0
 0314 50E0              ldi R21,0
 0316 60E0              ldi R22,0
 0318 70E0              ldi R23,0
 031A FE01              movw R30,R28
 031C 2684              ldd R2,z+14
 031E 3784              ldd R3,z+15
 0320 4088              ldd R4,z+16
 0322 5188              ldd R5,z+17
 0324 2416              cp R2,R20
 0326 3506              cpc R3,R21
 0328 4606              cpc R4,R22
 032A 5706              cpc R5,R23
 032C 09F4              brne X1
 032E 2FC0              xjmp L54
 0330           X1:
 0330           ;     {
 0330           ;         /* erase blocks that numbers is not enough a sector */
 0330           ;         ret=SD_EraseStartBlock(startaddr);
 0330 FE01              movw R30,R28
 0332 0285              ldd R16,z+10
 0334 1385              ldd R17,z+11
 0336 2485              ldd R18,z+12
 0338 3585              ldd R19,z+13
 033A 0E940000          xcall _SD_EraseStartBlock
 033E A02E              mov R10,R16
 0340           ;         if(ret!=SD_NO_ERR)
 0340 0023              tst R16
 0342 09F0              breq L56
 0344           ;             return ret ;
 0344 25C0              xjmp L35
 0346           L56:
 0346           ;         
 0346           ;         ret=SD_EraseEndBlock(startaddr+blocknum-1);
 0346 FE01              movw R30,R28
 0348 2684              ldd R2,z+14
 034A 3784              ldd R3,z+15
 034C 4088              ldd R4,z+16
 034E 5188              ldd R5,z+17
 0350 FE01              movw R30,R28
 0352 6284              ldd R6,z+10
 0354 7384              ldd R7,z+11
 0356 8484              ldd R8,z+12
 0358 9584              ldd R9,z+13
 035A 620C              add R6,R2
 035C 731C              adc R7,R3
 035E 841C              adc R8,R4
 0360 951C              adc R9,R5
 0362 41E0              ldi R20,1
 0364 50E0              ldi R21,0
 0366 60E0              ldi R22,0
 0368 70E0              ldi R23,0
 036A 641A              sub R6,R20
 036C 750A              sbc R7,R21
 036E 860A              sbc R8,R22
 0370 970A              sbc R9,R23
 0372 8301              movw R16,R6
 0374 9401              movw R18,R8
 0376 0E940000          xcall _SD_EraseEndBlock
 037A A02E              mov R10,R16
 037C           ;         if(ret!=SD_NO_ERR)
 037C 0023              tst R16
 037E 09F0              breq L58
 0380           ;             return ret ;
 0380 07C0              xjmp L35
 0382           L58:
 0382           ;         
 0382           ;         ret=SD_EraseSelectedBlock();
 0382 0E940000          xcall _SD_EraseSelectedBlock
 0386 A02E              mov R10,R16
 0388           ;         if(ret!=SD_NO_ERR)
 0388 0023              tst R16
 038A 09F0              breq L60
 038C           ;             return ret ;
 038C 01C0              xjmp L35
 038E           L60:
 038E           ;     }
 038E           L54:
 038E           ;     return SD_NO_ERR ;/* 返回擦除成功 return erase sucessfully */
 038E 0027              clr R16
 0390           L35:
 0390 2496              adiw R28,4
 0392 0E940000          xcall pop_gset3
 0396 2496              adiw R28,4
 0398                   .dbline 0 ; func end
 0398 0895              ret
 039A           ;            tmp -> y+16
 039A           ;            ret -> R10
 039A           ;         csdbuf -> y+0
                        .even
 039A           _SD_GetCardInfo::
 039A 0E940000          xcall push_gset3
 039E 6497              sbiw R28,20
 03A0           ; }
 03A0           ; #endif 
 03A0           ; 
 03A0           ; 
 03A0           ; /*******************************************************************************
 03A0           ; ** 函数名称: INT8U SD_GetCardInfo()                           
 03A0           ; ** 功能描述: 获得SD卡的信息                                           
 03A0           ; ** 输   入: INT8U cardtype: 卡类型                           
 03A0           ; ** 输   出: 0:   正确    >0:   错误码                        O
 03A0           ; *******************************************************************************/
 03A0           ; INT8U SD_GetCardInfo(void)
 03A0           ; {
 03A0           ;     INT32U tmp ;
 03A0           ;     INT8U csdbuf[16],ret ;
 03A0           ;     
 03A0           ;     ret=SD_ReadCSD(16,csdbuf);/* 读CSD寄存器 */
 03A0 9E01              movw R18,R28
 03A2 00E1              ldi R16,16
 03A4 0E940000          xcall _SD_ReadCSD
 03A8 A02E              mov R10,R16
 03AA           ;     if(ret!=SD_NO_ERR)
 03AA 0023              tst R16
 03AC 09F0              breq L63
 03AE           ;         return ret ;
 03AE E9C0              xjmp L62
 03B0           L63:
 03B0           ;     
 03B0           ;     SD_CalTimeout(csdbuf);/* 计算超时时间值 */
 03B0 8E01              movw R16,R28
 03B2 EBD0              xcall _SD_CalTimeout
 03B4           ;     
 03B4           ;     /* 计算块的最大长度  */
 03B4           ;     /* calculate the size of a sector */
 03B4           ;     sds.block_len=1<<(csdbuf[READ_BL_LEN_POS]&READ_BL_LEN_MSK);
 03B4 2D81              ldd R18,y+5
 03B6 3327              clr R19
 03B8 2F70              andi R18,15
 03BA 3070              andi R19,0
 03BC 01E0              ldi R16,1
 03BE 10E0              ldi R17,0
 03C0 0E940000          xcall lsl16
 03C4 1801              movw R2,R16
 03C6 4424              clr R4
 03C8 37FC              sbrc R3,7
 03CA 4094              com R4
 03CC 5524              clr R5
 03CE 47FC              sbrc R4,7
 03D0 5094              com R5
 03D2 30920500          sts _sds+4+1,R3
 03D6 20920400          sts _sds+4,R2

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?