fat.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,740 行 · 第 1/5 页
LIS
1,740 行
044A FE01 movw R30,R28
044C 2682 std z+6,R2
044E 3782 std z+7,R3
0450 4086 std z+8,R4
0452 5186 std z+9,R5
0454 ; /* 是否有特殊意义 */
0454 ; if(temp>=(BAD_CLUS&0x0fff))
0454 47EF ldi R20,247
0456 5FE0 ldi R21,15
0458 60E0 ldi R22,0
045A 70E0 ldi R23,0
045C 4424 clr R4
045E 5524 clr R5
0460 2416 cp R2,R20
0462 3506 cpc R3,R21
0464 4606 cpc R4,R22
0466 5706 cpc R5,R23
0468 0CF4 brge X12
046A ADC0 xjmp L15
046C X12:
046C ; {
046C ; Rt=((INT32U)0x0fffL<<16)|(temp|0xf000);
046C 40E0 ldi R20,0
046E 50E0 ldi R21,0
0470 6FEF ldi R22,255
0472 7FE0 ldi R23,15
0474 C101 movw R24,R2
0476 906F ori R25,240
0478 1C01 movw R2,R24
047A 4424 clr R4
047C 5524 clr R5
047E 242A or R2,R20
0480 352A or R3,R21
0482 462A or R4,R22
0484 572A or R5,R23
0486 FE01 movw R30,R28
0488 2682 std z+6,R2
048A 3782 std z+7,R3
048C 4086 std z+8,R4
048E 5186 std z+9,R5
0490 ; }
0490 ; break ;
0490 9AC0 xjmp L15
0492 L26:
0492 ; case FAT16 :
0492 ; temp=Buf[ByteIndex]|((INT16U)Buf[ByteIndex+1]<<8);
0492 F701 movw R30,R14
0494 3196 adiw R30,1
0496 EC0D add R30,R12
0498 FD1D adc R31,R13
049A 2080 ldd R2,z+0
049C 3324 clr R3
049E 322C mov R3,R2
04A0 2224 clr R2
04A2 F701 movw R30,R14
04A4 EC0D add R30,R12
04A6 FD1D adc R31,R13
04A8 A080 ldd R10,z+0
04AA BB24 clr R11
04AC A228 or R10,R2
04AE B328 or R11,R3
04B0 ; Rt=temp ;
04B0 1501 movw R2,R10
04B2 4424 clr R4
04B4 5524 clr R5
04B6 FE01 movw R30,R28
04B8 2682 std z+6,R2
04BA 3782 std z+7,R3
04BC 4086 std z+8,R4
04BE 5186 std z+9,R5
04C0 ; /* 是否有特殊意义 */
04C0 ; if(temp>=(BAD_CLUS&0xffff))
04C0 47EF ldi R20,247
04C2 5FEF ldi R21,255
04C4 60E0 ldi R22,0
04C6 70E0 ldi R23,0
04C8 4424 clr R4
04CA 5524 clr R5
04CC 2416 cp R2,R20
04CE 3506 cpc R3,R21
04D0 4606 cpc R4,R22
04D2 5706 cpc R5,R23
04D4 0CF4 brge X13
04D6 77C0 xjmp L15
04D8 X13:
04D8 ; {
04D8 ; Rt=((INT32U)0x0fffL<<16)|temp ;
04D8 40E0 ldi R20,0
04DA 50E0 ldi R21,0
04DC 6FEF ldi R22,255
04DE 7FE0 ldi R23,15
04E0 4424 clr R4
04E2 5524 clr R5
04E4 242A or R2,R20
04E6 352A or R3,R21
04E8 462A or R4,R22
04EA 572A or R5,R23
04EC FE01 movw R30,R28
04EE 2682 std z+6,R2
04F0 3782 std z+7,R3
04F2 4086 std z+8,R4
04F4 5186 std z+9,R5
04F6 ; }
04F6 ; break ;
04F6 67C0 xjmp L15
04F8 L29:
04F8 ; case FAT32 :
04F8 ; Rt=Buf[ByteIndex]|((INT32U)Buf[ByteIndex+1]<<8);
04F8 F701 movw R30,R14
04FA 3196 adiw R30,1
04FC EC0D add R30,R12
04FE FD1D adc R31,R13
0500 2080 ldd R2,z+0
0502 3324 clr R3
0504 4424 clr R4
0506 5524 clr R5
0508 88E0 ldi R24,8
050A 90E0 ldi R25,0
050C 8A93 st -y,R24
050E 8101 movw R16,R2
0510 9201 movw R18,R4
0512 0E940000 xcall lsl32
0516 F701 movw R30,R14
0518 EC0D add R30,R12
051A FD1D adc R31,R13
051C 2080 ldd R2,z+0
051E 3324 clr R3
0520 4424 clr R4
0522 5524 clr R5
0524 202A or R2,R16
0526 312A or R3,R17
0528 422A or R4,R18
052A 532A or R5,R19
052C FE01 movw R30,R28
052E 2682 std z+6,R2
0530 3782 std z+7,R3
0532 4086 std z+8,R4
0534 5186 std z+9,R5
0536 ; Rt|=((INT32U)Buf[ByteIndex+2]<<16)|((INT32U)Buf[ByteIndex+3]<<24);
0536 F701 movw R30,R14
0538 3396 adiw R30,3
053A EC0D add R30,R12
053C FD1D adc R31,R13
053E 2080 ldd R2,z+0
0540 3324 clr R3
0542 4424 clr R4
0544 5524 clr R5
0546 88E1 ldi R24,24
0548 90E0 ldi R25,0
054A 8A93 st -y,R24
054C 8101 movw R16,R2
054E 9201 movw R18,R4
0550 0E940000 xcall lsl32
0554 F701 movw R30,R14
0556 3296 adiw R30,2
0558 EC0D add R30,R12
055A FD1D adc R31,R13
055C 2080 ldd R2,z+0
055E 3324 clr R3
0560 4424 clr R4
0562 5524 clr R5
0564 2101 movw R4,R2
0566 2224 clr R2
0568 3324 clr R3
056A 202A or R2,R16
056C 312A or R3,R17
056E 422A or R4,R18
0570 532A or R5,R19
0572 FE01 movw R30,R28
0574 6680 ldd R6,z+6
0576 7780 ldd R7,z+7
0578 8084 ldd R8,z+8
057A 9184 ldd R9,z+9
057C 6228 or R6,R2
057E 7328 or R7,R3
0580 8428 or R8,R4
0582 9528 or R9,R5
0584 FE01 movw R30,R28
0586 6682 std z+6,R6
0588 7782 std z+7,R7
058A 8086 std z+8,R8
058C 9186 std z+9,R9
058E ; Rt=Rt&0x0fffffff ;
058E 4FEF ldi R20,255
0590 5FEF ldi R21,255
0592 6FEF ldi R22,255
0594 7FE0 ldi R23,15
0596 FE01 movw R30,R28
0598 2680 ldd R2,z+6
059A 3780 ldd R3,z+7
059C 4084 ldd R4,z+8
059E 5184 ldd R5,z+9
05A0 2422 and R2,R20
05A2 3522 and R3,R21
05A4 4622 and R4,R22
05A6 5722 and R5,R23
05A8 FE01 movw R30,R28
05AA 2682 std z+6,R2
05AC 3782 std z+7,R3
05AE 4086 std z+8,R4
05B0 5186 std z+9,R5
05B2 ; break ;
05B2 09C0 xjmp L15
05B4 L14:
05B4 ; default :
05B4 ; Rt=BAD_CLUS ;
05B4 47EF ldi R20,247
05B6 5FEF ldi R21,255
05B8 6FEF ldi R22,255
05BA 7FE0 ldi R23,15
05BC FE01 movw R30,R28
05BE 4683 std z+6,R20
05C0 5783 std z+7,R21
05C2 6087 std z+8,R22
05C4 7187 std z+9,R23
05C6 ; break ;
05C6 L15:
05C6 ; }
05C6 ; CloseSec(Drive,SecIndex);
05C6 FE01 movw R30,R28
05C8 2280 ldd R2,z+2
05CA 3380 ldd R3,z+3
05CC 4480 ldd R4,z+4
05CE 5580 ldd R5,z+5
05D0 4882 std y+0,R4
05D2 5982 std y+1,R5
05D4 9101 movw R18,R2
05D6 0E89 ldd R16,y+22
05D8 0E940000 xcall _CloseSec
05DC ; return Rt ;
05DC FE01 movw R30,R28
05DE 0681 ldd R16,z+6
05E0 1781 ldd R17,z+7
05E2 2085 ldd R18,z+8
05E4 3185 ldd R19,z+9
05E6 L1:
05E6 2C96 adiw R28,12
05E8 0E940000 xcall pop_gset5
05EC 2496 adiw R28,4
05EE .dbline 0 ; func end
05EE 0895 ret
05F0 ; temp -> R12,R13
05F0 ; ByteIndex -> R10,R11
05F0 ; Buf -> R14,R15
05F0 ; SecIndex -> y+4
05F0 ; Disk -> y+2
05F0 ; Next -> y+22
05F0 ; Index -> y+18
05F0 ; Drive -> y+16
.even
05F0 _FATSetNextClus::
05F0 0E940000 xcall push_arg4
05F4 0E940000 xcall push_gset5
05F8 2697 sbiw R28,6
05FA ; }
05FA ;
05FA ; /*********************************************************************************************************
05FA ; ** 函数名称: FATSetNextClus
05FA ; ** 功能描述: 设置下一个簇
05FA ; **
05FA ; ** 输 入: Drive:驱动器号
05FA ; ** Index:簇号
05FA ; ** Next:下一个簇号
05FA ; ** 输 出: 无
05FA ; **
05FA ; ** 全局变量: 无
05FA ; ** 调用模块: 无
05FA ; **
05FA ; ** 作 者: 陈明计
05FA ; ** 日 期: 2003年9月6日
05FA ; **-------------------------------------------------------------------------------------------------------
05FA ; ** 修改人: 陈明计
05FA ; ** 日 期: 2004年4月10日
05FA ; **------------------------------------------------------------------------------------------------------
05FA ; ********************************************************************************************************/
05FA ; void FATSetNextClus(INT8U Drive,INT32U Index,INT32U Next)
05FA ; {
05FA ; INT16U temp ;
05FA ; INT16U SecIndex,ByteIndex ;
05FA ; INT8U *Buf ;
05FA ; Disk_Info *Disk ;
05FA ;
05FA ; Disk=GetDiskInfo(Drive);
05FA 0889 ldd R16,y+16
05FC 0E940000 xcall _GetDiskInfo
0600 1B83 std y+3,R17
0602 0A83 std y+2,R16
0604 ; if(Disk==NULL)
0604 0801 movw R0,R16
0606 0030 cpi R16,0
0608 0107 cpc R16,R17
060A 09F4 brne L31
060C X14:
060C ; {
060C ; return ;
060C C5C2 xjmp L30
060E L31:
060E ; }
060E ; if(Index<=EMPTY_CLUS_1)
060E 41E0 ldi R20,1
0610 50E0 ldi R21,0
0612 60E0 ldi R22,0
0614 70E0 ldi R23,0
0616 FE01 movw R30,R28
0618 2288 ldd R2,z+18
061A 3388 ldd R3,z+19
061C 4488 ldd R4,z+20
061E 5588 ldd R5,z+21
0620 4215 cp R20,R2
0622 5305 cpc R21,R3
0624 6405 cpc R22,R4
0626 7505 cpc R23,R5
0628 08F0 brlo L33
062A ; {
062A ; return ;
062A B6C2 xjmp L30
062C L33:
062C ; }
062C ;
062C ; if(Index>=Disk->ClusPerData)
062C EA81 ldd R30,y+2
062E FB81 ldd R31,y+3
0630 20A0 ldd R2,z+32
0632 31A0 ldd R3,z+33
0634 42A0 ldd R4,z+34
0636 53A0 ldd R5,z+35
0638 FE01 movw R30,R28
063A 6288 ldd R6,z+18
063C 7388 ldd R7,z+19
063E 8488 ldd R8,z+20
0640 9588 ldd R9,z+21
0642 6214 cp R6,R2
0644 7304 cpc R7,R3
0646 8404 cpc R8,R4
0648 9504 cpc R9,R5
064A 08F0 brlo L35
064C ; {
064C ; return ;
064C A5C2 xjmp L30
064E L35:
064E ; }
064E ;
064E ; /* 计算扇区号和字节索引 */
064E ; switch(Disk->FATType)
064E EA81 ldd R30,y+2
0650 FB81 ldd R31,y+3
0652 A180 ldd R10,z+1
0654 BB24 clr R11
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?