fat.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,740 行 · 第 1/5 页
LIS
1,740 行
0204 7320 and R7,R3
0206 8420 and R8,R4
0208 9520 and R9,R5
020A 7301 movw R14,R6
020C ; break ;
020C 5AC0 xjmp L7
020E L11:
020E ; case FAT32 :
020E ; SecIndex=Index*4/Disk->BytsPerSec+Disk->FATStartSec ;
020E FE01 movw R30,R28
0210 208C ldd R2,z+24
0212 318C ldd R3,z+25
0214 428C ldd R4,z+26
0216 538C ldd R5,z+27
0218 44E0 ldi R20,4
021A 50E0 ldi R21,0
021C 60E0 ldi R22,0
021E 70E0 ldi R23,0
0220 5A92 st -y,R5
0222 4A92 st -y,R4
0224 3A92 st -y,R3
0226 2A92 st -y,R2
0228 8A01 movw R16,R20
022A 9B01 movw R18,R22
022C 0E940000 xcall empy32u
0230 EA85 ldd R30,y+10
0232 FB85 ldd R31,y+11
0234 6088 ldd R6,z+16
0236 7188 ldd R7,z+17
0238 8288 ldd R8,z+18
023A 9388 ldd R9,z+19
023C 9A92 st -y,R9
023E 8A92 st -y,R8
0240 7A92 st -y,R7
0242 6A92 st -y,R6
0244 0E940000 xcall div32u
0248 1801 movw R2,R16
024A 2901 movw R4,R18
024C EA85 ldd R30,y+10
024E FB85 ldd R31,y+11
0250 6480 ldd R6,z+4
0252 7580 ldd R7,z+5
0254 8680 ldd R8,z+6
0256 9780 ldd R9,z+7
0258 260C add R2,R6
025A 371C adc R3,R7
025C 481C adc R4,R8
025E 591C adc R5,R9
0260 FE01 movw R30,R28
0262 2282 std z+2,R2
0264 3382 std z+3,R3
0266 4482 std z+4,R4
0268 5582 std z+5,R5
026A ; ByteIndex=(Index*4)&(Disk->BytsPerSec-1);
026A 41E0 ldi R20,1
026C 50E0 ldi R21,0
026E 60E0 ldi R22,0
0270 70E0 ldi R23,0
0272 EA85 ldd R30,y+10
0274 FB85 ldd R31,y+11
0276 2088 ldd R2,z+16
0278 3188 ldd R3,z+17
027A 4288 ldd R4,z+18
027C 5388 ldd R5,z+19
027E 241A sub R2,R20
0280 350A sbc R3,R21
0282 460A sbc R4,R22
0284 570A sbc R5,R23
0286 FE01 movw R30,R28
0288 608C ldd R6,z+24
028A 718C ldd R7,z+25
028C 828C ldd R8,z+26
028E 938C ldd R9,z+27
0290 44E0 ldi R20,4
0292 50E0 ldi R21,0
0294 60E0 ldi R22,0
0296 70E0 ldi R23,0
0298 9A92 st -y,R9
029A 8A92 st -y,R8
029C 7A92 st -y,R7
029E 6A92 st -y,R6
02A0 8A01 movw R16,R20
02A2 9B01 movw R18,R22
02A4 0E940000 xcall empy32u
02A8 3801 movw R6,R16
02AA 4901 movw R8,R18
02AC 6220 and R6,R2
02AE 7320 and R7,R3
02B0 8420 and R8,R4
02B2 9520 and R9,R5
02B4 7301 movw R14,R6
02B6 ; break ;
02B6 05C0 xjmp L7
02B8 L6:
02B8 ; default :
02B8 ; return BAD_CLUS ;
02B8 07EF ldi R16,247
02BA 1FEF ldi R17,255
02BC 2FEF ldi R18,255
02BE 3FE0 ldi R19,15
02C0 92C1 xjmp L1
02C2 L7:
02C2 ; }
02C2 ;
02C2 ; Buf=OpenSec(Drive,SecIndex);
02C2 FE01 movw R30,R28
02C4 2280 ldd R2,z+2
02C6 3380 ldd R3,z+3
02C8 4480 ldd R4,z+4
02CA 5580 ldd R5,z+5
02CC 4882 std y+0,R4
02CE 5982 std y+1,R5
02D0 9101 movw R18,R2
02D2 0E89 ldd R16,y+22
02D4 0E940000 xcall _OpenSec
02D8 6801 movw R12,R16
02DA ; if(Buf==NULL)
02DA 0030 cpi R16,0
02DC 0107 cpc R16,R17
02DE 29F4 brne L12
02E0 X3:
02E0 ; {
02E0 ; return BAD_CLUS ;
02E0 07EF ldi R16,247
02E2 1FEF ldi R17,255
02E4 2FEF ldi R18,255
02E6 3FE0 ldi R19,15
02E8 7EC1 xjmp L1
02EA L12:
02EA ; }
02EA ; ReadSec(Drive,SecIndex);
02EA FE01 movw R30,R28
02EC 2280 ldd R2,z+2
02EE 3380 ldd R3,z+3
02F0 4480 ldd R4,z+4
02F2 5580 ldd R5,z+5
02F4 4882 std y+0,R4
02F6 5982 std y+1,R5
02F8 9101 movw R18,R2
02FA 0E89 ldd R16,y+22
02FC 0E940000 xcall _ReadSec
0300 ;
0300 ; /* 读取FAT表数据 */
0300 ; switch(Disk->FATType)
0300 EA85 ldd R30,y+10
0302 FB85 ldd R31,y+11
0304 A180 ldd R10,z+1
0306 BB24 clr R11
0308 AA20 tst R10
030A 11F4 brne X4
030C BB20 tst R11
030E 61F0 breq L17
0310 X4:
0310 C501 movw R24,R10
0312 8130 cpi R24,1
0314 E0E0 ldi R30,0
0316 9E07 cpc R25,R30
0318 09F4 brne X9
031A BBC0 xjmp L26
031C X9:
031C 8230 cpi R24,2
031E E0E0 ldi R30,0
0320 9E07 cpc R25,R30
0322 09F4 brne X10
0324 E9C0 xjmp L29
0326 X10:
0326 46C1 xjmp L14
0328 X5:
0328 ; {
0328 L17:
0328 ; case FAT12 :
0328 ; temp=Buf[ByteIndex];
0328 F701 movw R30,R14
032A EC0D add R30,R12
032C FD1D adc R31,R13
032E A080 ldd R10,z+0
0330 BB24 clr R11
0332 ; ByteIndex++;
0332 C701 movw R24,R14
0334 0196 adiw R24,1
0336 7C01 movw R14,R24
0338 ; /* 下一个字节是否在下一个扇区 */
0338 ; if(ByteIndex>=Disk->BytsPerSec)
0338 EA85 ldd R30,y+10
033A FB85 ldd R31,y+11
033C 2088 ldd R2,z+16
033E 3188 ldd R3,z+17
0340 4288 ldd R4,z+18
0342 5388 ldd R5,z+19
0344 3C01 movw R6,R24
0346 8824 clr R8
0348 9924 clr R9
034A 6214 cp R6,R2
034C 7304 cpc R7,R3
034E 8404 cpc R8,R4
0350 9504 cpc R9,R5
0352 08F4 brsh X11
0354 4AC0 xjmp L18
0356 X11:
0356 ; {
0356 ; Buf=OpenSec(Drive,SecIndex+1);
0356 41E0 ldi R20,1
0358 50E0 ldi R21,0
035A 60E0 ldi R22,0
035C 70E0 ldi R23,0
035E FE01 movw R30,R28
0360 2280 ldd R2,z+2
0362 3380 ldd R3,z+3
0364 4480 ldd R4,z+4
0366 5580 ldd R5,z+5
0368 240E add R2,R20
036A 351E adc R3,R21
036C 461E adc R4,R22
036E 571E adc R5,R23
0370 4882 std y+0,R4
0372 5982 std y+1,R5
0374 9101 movw R18,R2
0376 0E89 ldd R16,y+22
0378 0E940000 xcall _OpenSec
037C 6801 movw R12,R16
037E ; if(Buf==NULL)
037E 0030 cpi R16,0
0380 0107 cpc R16,R17
0382 29F4 brne L20
0384 X6:
0384 ; {
0384 ; return BAD_CLUS ;
0384 07EF ldi R16,247
0386 1FEF ldi R17,255
0388 2FEF ldi R18,255
038A 3FE0 ldi R19,15
038C 2CC1 xjmp L1
038E L20:
038E ; }
038E ; ReadSec(Drive,SecIndex+1);
038E 41E0 ldi R20,1
0390 50E0 ldi R21,0
0392 60E0 ldi R22,0
0394 70E0 ldi R23,0
0396 FE01 movw R30,R28
0398 2280 ldd R2,z+2
039A 3380 ldd R3,z+3
039C 4480 ldd R4,z+4
039E 5580 ldd R5,z+5
03A0 240E add R2,R20
03A2 351E adc R3,R21
03A4 461E adc R4,R22
03A6 571E adc R5,R23
03A8 4882 std y+0,R4
03AA 5982 std y+1,R5
03AC 9101 movw R18,R2
03AE 0E89 ldd R16,y+22
03B0 0E940000 xcall _ReadSec
03B4 ; temp=temp|((INT16U)Buf[0]<<8);
03B4 F601 movw R30,R12
03B6 2080 ldd R2,z+0
03B8 3324 clr R3
03BA 322C mov R3,R2
03BC 2224 clr R2
03BE A228 or R10,R2
03C0 B328 or R11,R3
03C2 ; CloseSec(Drive,SecIndex+1);
03C2 41E0 ldi R20,1
03C4 50E0 ldi R21,0
03C6 60E0 ldi R22,0
03C8 70E0 ldi R23,0
03CA FE01 movw R30,R28
03CC 2280 ldd R2,z+2
03CE 3380 ldd R3,z+3
03D0 4480 ldd R4,z+4
03D2 5580 ldd R5,z+5
03D4 240E add R2,R20
03D6 351E adc R3,R21
03D8 461E adc R4,R22
03DA 571E adc R5,R23
03DC 4882 std y+0,R4
03DE 5982 std y+1,R5
03E0 9101 movw R18,R2
03E2 0E89 ldd R16,y+22
03E4 0E940000 xcall _CloseSec
03E8 ; }
03E8 09C0 xjmp L19
03EA L18:
03EA ; else
03EA ; {
03EA ; temp=temp|((INT16U)Buf[ByteIndex]<<8);
03EA F701 movw R30,R14
03EC EC0D add R30,R12
03EE FD1D adc R31,R13
03F0 2080 ldd R2,z+0
03F2 3324 clr R3
03F4 322C mov R3,R2
03F6 2224 clr R2
03F8 A228 or R10,R2
03FA B328 or R11,R3
03FC ; }
03FC L19:
03FC ; /* 判断哪12位有效 */
03FC ; if((Index&0x01)!=0)
03FC 41E0 ldi R20,1
03FE 50E0 ldi R21,0
0400 60E0 ldi R22,0
0402 70E0 ldi R23,0
0404 FE01 movw R30,R28
0406 208C ldd R2,z+24
0408 318C ldd R3,z+25
040A 428C ldd R4,z+26
040C 538C ldd R5,z+27
040E 2422 and R2,R20
0410 3522 and R3,R21
0412 4622 and R4,R22
0414 5722 and R5,R23
0416 40E0 ldi R20,0
0418 50E0 ldi R21,0
041A 60E0 ldi R22,0
041C 70E0 ldi R23,0
041E 2416 cp R2,R20
0420 3506 cpc R3,R21
0422 4606 cpc R4,R22
0424 5706 cpc R5,R23
0426 59F0 breq L22
0428 ; {
0428 ; temp=temp/16 ;
0428 1501 movw R2,R10
042A 3694 lsr R3
042C 2794 ror R2
042E 3694 lsr R3
0430 2794 ror R2
0432 3694 lsr R3
0434 2794 ror R2
0436 3694 lsr R3
0438 2794 ror R2
043A 5101 movw R10,R2
043C ; }
043C 03C0 xjmp L23
043E L22:
043E ; else
043E ; {
043E ; temp=temp&0x0fff ;
043E C501 movw R24,R10
0440 9F70 andi R25,15
0442 5C01 movw R10,R24
0444 ; }
0444 L23:
0444 ; Rt=temp ;
0444 1501 movw R2,R10
0446 4424 clr R4
0448 5524 clr R5
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?