📄 output.lss
字号:
254: 39 2b or r19, r25
256: 49 01 movw r8, r18
258: aa 24 eor r10, r10
25a: bb 24 eor r11, r11
if (FATSz == 0)
25c: 81 14 cp r8, r1
25e: 91 04 cpc r9, r1
260: a1 04 cpc r10, r1
262: b1 04 cpc r11, r1
264: 41 f5 brne .+80 ; 0x2b6
FATSz = GET_UINT32(Buf, BPB_FATSz32);
266: 84 a1 ldd r24, Z+36 ; 0x24
268: 88 2e mov r8, r24
26a: 99 24 eor r9, r9
26c: aa 24 eor r10, r10
26e: bb 24 eor r11, r11
270: 85 a1 ldd r24, Z+37 ; 0x25
272: 99 27 eor r25, r25
274: aa 27 eor r26, r26
276: bb 27 eor r27, r27
278: ba 2f mov r27, r26
27a: a9 2f mov r26, r25
27c: 98 2f mov r25, r24
27e: 88 27 eor r24, r24
280: 88 2a or r8, r24
282: 99 2a or r9, r25
284: aa 2a or r10, r26
286: bb 2a or r11, r27
288: 86 a1 ldd r24, Z+38 ; 0x26
28a: 99 27 eor r25, r25
28c: aa 27 eor r26, r26
28e: bb 27 eor r27, r27
290: dc 01 movw r26, r24
292: 99 27 eor r25, r25
294: 88 27 eor r24, r24
296: 88 2a or r8, r24
298: 99 2a or r9, r25
29a: aa 2a or r10, r26
29c: bb 2a or r11, r27
29e: 87 a1 ldd r24, Z+39 ; 0x27
2a0: 99 27 eor r25, r25
2a2: aa 27 eor r26, r26
2a4: bb 27 eor r27, r27
2a6: b8 2f mov r27, r24
2a8: aa 27 eor r26, r26
2aa: 99 27 eor r25, r25
2ac: 88 27 eor r24, r24
2ae: 88 2a or r8, r24
2b0: 99 2a or r9, r25
2b2: aa 2a or r10, r26
2b4: bb 2a or r11, r27
/* 根目录目录项数 */
FS_RootEntCnt = GET_UINT16(Buf, BPB_RootEntCnt);
2b6: f7 01 movw r30, r14
2b8: 81 89 ldd r24, Z+17 ; 0x11
2ba: 08 2f mov r16, r24
2bc: 11 27 eor r17, r17
2be: 82 89 ldd r24, Z+18 ; 0x12
2c0: 99 27 eor r25, r25
2c2: 98 2f mov r25, r24
2c4: 88 27 eor r24, r24
2c6: 08 2b or r16, r24
2c8: 19 2b or r17, r25
2ca: 10 93 ca 03 sts 0x03CA, r17
2ce: 00 93 c9 03 sts 0x03C9, r16
/* 根目录开始扇区 */
FS_RootDirStartSec = FS_FATStartSec + FATSz * NumFATs;
2d2: 24 2f mov r18, r20
2d4: 33 27 eor r19, r19
2d6: 44 27 eor r20, r20
2d8: 55 27 eor r21, r21
2da: c5 01 movw r24, r10
2dc: b4 01 movw r22, r8
2de: 0e 94 2d 0a call 0x145a
2e2: dc 01 movw r26, r24
2e4: cb 01 movw r24, r22
2e6: 9c 01 movw r18, r24
2e8: 2d 0d add r18, r13
2ea: 31 1d adc r19, r1
2ec: 30 93 c8 03 sts 0x03C8, r19
2f0: 20 93 c7 03 sts 0x03C7, r18
/* 根目录占扇区数 */
RootSecCnt = (FS_RootEntCnt * 32 + 511) / 512;
2f4: 95 e0 ldi r25, 0x05 ; 5
2f6: 00 0f add r16, r16
2f8: 11 1f adc r17, r17
2fa: 9a 95 dec r25
2fc: e1 f7 brne .-8 ; 0x2f6
2fe: 01 50 subi r16, 0x01 ; 1
300: 1e 4f sbci r17, 0xFE ; 254
302: 01 2f mov r16, r17
304: 11 27 eor r17, r17
306: 06 95 lsr r16
308: c8 01 movw r24, r16
30a: aa 27 eor r26, r26
30c: bb 27 eor r27, r27
/* 数据区开始扇区 */
FS_DataStartSec = FS_RootDirStartSec + RootSecCnt;
30e: a9 01 movw r20, r18
310: 66 27 eor r22, r22
312: 77 27 eor r23, r23
314: 48 0f add r20, r24
316: 59 1f adc r21, r25
318: 6a 1f adc r22, r26
31a: 7b 1f adc r23, r27
31c: 40 93 c3 03 sts 0x03C3, r20
320: 50 93 c4 03 sts 0x03C4, r21
324: 60 93 c5 03 sts 0x03C5, r22
328: 70 93 c6 03 sts 0x03C6, r23
/* 总扇区数 */
TotSec = GET_UINT16(Buf, BPB_TotSec16);
32c: f7 01 movw r30, r14
32e: 83 89 ldd r24, Z+19 ; 0x13
330: 28 2f mov r18, r24
332: 33 27 eor r19, r19
334: 84 89 ldd r24, Z+20 ; 0x14
336: 99 27 eor r25, r25
338: 98 2f mov r25, r24
33a: 88 27 eor r24, r24
33c: 28 2b or r18, r24
33e: 39 2b or r19, r25
340: 49 01 movw r8, r18
342: aa 24 eor r10, r10
344: bb 24 eor r11, r11
if (TotSec == 0)
346: 81 14 cp r8, r1
348: 91 04 cpc r9, r1
34a: a1 04 cpc r10, r1
34c: b1 04 cpc r11, r1
34e: 41 f5 brne .+80 ; 0x3a0
TotSec = GET_UINT32(Buf, BPB_TotSec32);
350: 80 a1 ldd r24, Z+32 ; 0x20
352: 88 2e mov r8, r24
354: 99 24 eor r9, r9
356: aa 24 eor r10, r10
358: bb 24 eor r11, r11
35a: 81 a1 ldd r24, Z+33 ; 0x21
35c: 99 27 eor r25, r25
35e: aa 27 eor r26, r26
360: bb 27 eor r27, r27
362: ba 2f mov r27, r26
364: a9 2f mov r26, r25
366: 98 2f mov r25, r24
368: 88 27 eor r24, r24
36a: 88 2a or r8, r24
36c: 99 2a or r9, r25
36e: aa 2a or r10, r26
370: bb 2a or r11, r27
372: 82 a1 ldd r24, Z+34 ; 0x22
374: 99 27 eor r25, r25
376: aa 27 eor r26, r26
378: bb 27 eor r27, r27
37a: dc 01 movw r26, r24
37c: 99 27 eor r25, r25
37e: 88 27 eor r24, r24
380: 88 2a or r8, r24
382: 99 2a or r9, r25
384: aa 2a or r10, r26
386: bb 2a or r11, r27
388: 83 a1 ldd r24, Z+35 ; 0x23
38a: 99 27 eor r25, r25
38c: aa 27 eor r26, r26
38e: bb 27 eor r27, r27
390: b8 2f mov r27, r24
392: aa 27 eor r26, r26
394: 99 27 eor r25, r25
396: 88 27 eor r24, r24
398: 88 2a or r8, r24
39a: 99 2a or r9, r25
39c: aa 2a or r10, r26
39e: bb 2a or r11, r27
/* 每簇扇区数 */
FS_SecPerClus = Buf[BPB_SecPerClus];
3a0: f7 01 movw r30, r14
3a2: 85 85 ldd r24, Z+13 ; 0x0d
3a4: 80 93 ce 03 sts 0x03CE, r24
/* 数据区簇数 */
FS_MaxClus = (TotSec - FS_DataStartSec)/FS_SecPerClus;
3a8: 84 1a sub r8, r20
3aa: 95 0a sbc r9, r21
3ac: a6 0a sbc r10, r22
3ae: b7 0a sbc r11, r23
3b0: 28 2f mov r18, r24
3b2: 33 27 eor r19, r19
3b4: 44 27 eor r20, r20
3b6: 55 27 eor r21, r21
3b8: c5 01 movw r24, r10
3ba: b4 01 movw r22, r8
3bc: 0e 94 4c 0a call 0x1498
3c0: da 01 movw r26, r20
3c2: c9 01 movw r24, r18
3c4: 30 93 cc 03 sts 0x03CC, r19
3c8: 20 93 cb 03 sts 0x03CB, r18
#ifdef WINDOWS
printf("FS INFO:\n");
printf("FS_FATStartSec = 0x%x\n", FS_FATStartSec);
printf("NumFATs = 0x%x\n", NumFATs);
printf("FATSz = 0x%x\n", FATSz);
printf("FS_RootEntCnt = 0x%x\n", FS_RootEntCnt);
printf("FS_RootDirStartSec = 0x%x\n", FS_RootDirStartSec);
printf("RootSecCnt = 0x%x\n", RootSecCnt);
printf("FS_DataStartSec = 0x%x\n", FS_DataStartSec);
printf("TotSec = 0x%x\n", TotSec);
printf("FS_SecPerClus = 0x%x\n", FS_SecPerClus);
printf("FS_MaxClus = 0x%x\n", FS_MaxClus);
#endif
if (FS_MaxClus < 4085 || FS_MaxClus >= 65525) /* 不支持FAT12和FAT32 */
3cc: 85 5f subi r24, 0xF5 ; 245
3ce: 9f 40 sbci r25, 0x0F ; 15
3d0: 80 50 subi r24, 0x00 ; 0
3d2: 90 4f sbci r25, 0xF0 ; 240
3d4: 18 f0 brcs .+6 ; 0x3dc
{
#ifdef WINDOWS
printf("FS TYPE IS NOT FAT16!\n");
#endif
return FALSE;
3d6: 80 e0 ldi r24, 0x00 ; 0
3d8: 90 e0 ldi r25, 0x00 ; 0
3da: 02 c0 rjmp .+4 ; 0x3e0
}
#ifdef WINDOWS
printf("FS TYPE IS FAT16\n");
#endif
return TRUE;
3dc: 81 e0 ldi r24, 0x01 ; 1
3de: 90 e0 ldi r25, 0x00 ; 0
3e0: df 91 pop r29
3e2: cf 91 pop r28
3e4: 1f 91 pop r17
3e6: 0f 91 pop r16
3e8: ff 90 pop r15
3ea: ef 90 pop r14
3ec: df 90 pop r13
3ee: bf 90 pop r11
3f0: af 90 pop r10
3f2: 9f 90 pop r9
3f4: 8f 90 pop r8
3f6: 08 95 ret
000003f8 <_Z11GetNextClusj>:
;* 输 出 : 下一簇号
;*****************************************************************************************************
;*/
uint16 GetNextClus(uint16 ClusIndex)
{
3f8: cf 93 push r28
3fa: df 93 push r29
3fc: fc 01 movw r30, r24
uint8 *Buf;
uint16 ByteOffset, Value;
uint32 SecIndex;
if (ClusIndex >= FS_MaxClus) /* 簇号无效 */
3fe: 80 91 cb 03 lds r24, 0x03CB
402: 90 91 cc 03 lds r25, 0x03CC
406: e8 17 cp r30, r24
408: f9 07 cpc r31, r25
40a: 90 f4 brcc .+36 ; 0x430
{
return BAD_CLUS;
}
SecIndex = ClusIndex / 256 + FS_FATStartSec; /* 扇区号 */
40c: 8f 2f mov r24, r31
40e: 99 27 eor r25, r25
410: 20 91 cd 03 lds r18, 0x03CD
414: 82 0f add r24, r18
416: 91 1d adc r25, r1
418: aa 27 eor r26, r26
41a: bb 27 eor r27, r27
ByteOffset = ClusIndex * 2 % 512; /* 字节偏移 */
41c: ef 01 movw r28, r30
41e: ce 0f add r28, r30
420: df 1f adc r29, r31
422: d1 70 andi r29, 0x01 ; 1
Buf = OpenSector(SecIndex); /* 打开扇区 */
424: bc 01 movw r22, r24
426: cd 01 movw r24, r26
428: 0e 94 74 00 call 0xe8
if (Buf == NULL)
42c: 00 97 sbiw r24, 0x00 ; 0
42e: 19 f4 brne .+6 ; 0x436
{
return BAD_CLUS;
430: 27 ef ldi r18, 0xF7 ; 247
432: 3f ef ldi r19, 0xFF ; 255
434: 0c c0 rjmp .+24 ; 0x44e
}
Value = GET_UINT16(Buf, ByteOffset); /* 获得下一簇号 */
436: fe 01 movw r30, r28
438: e8 0f add r30, r24
43a: f9 1f adc r31, r25
43c: 80 81 ld r24, Z
43e: 28 2f mov r18, r24
440: 33 27 eor r19, r19
442: 81 81 ldd r24, Z+1 ; 0x01
444: 99 27 eor r25, r25
446: 98 2f mov r25, r24
448: 88 27 eor r24, r24
44a: 28 2b or r18, r24
44c: 39 2b or r19, r25
return Value;
}
44e: c9 01 movw r24, r18
450: df 91 pop r29
452: cf 91 pop r28
454: 08 95 ret
00000456 <_Z11SetNextClusjj>:
/*
;*****************************************************************************************************
;* 函数名称 : SetNextClus
;* 描 述 : 设置指定簇的下一簇号
;* 输 入 : ClusIndex: 簇号, Value: 下一簇号
;*
;* 输 出 : 下一簇号
;*****************************************************************************************************
;*/
uint16 SetNextClus(uint16 ClusIndex, uint16 Value)
{
456: 0f 93 push r16
458: 1f 93 push r17
45a: cf 93 push r28
45c: df 93 push r29
45e: fc 01 movw r30, r24
460: 8b 01 movw r16, r22
uint8 *Buf;
uint16 ByteOffset;
uint32 SecIndex;
if (ClusIndex >= FS_MaxClus) /* 簇号无效 */
462: 80 91 cb 03 lds r24, 0x03CB
466: 90 91 cc 03 lds r25, 0x03CC
46a: e8 17 cp r30, r24
46c: f9 07 cpc r31, r25
46e: 90 f4 brcc .+36 ; 0x494
{
return BAD_CLUS;
}
SecIndex = ClusIndex / 256 + FS_FATStartSec; /* 扇区号 */
470: 8f 2f mov r24, r31
472: 99 27 eor r25, r25
474: 20 91 cd 03 lds r18, 0x03CD
478: 82 0f add r24, r18
47a: 91 1d adc r25, r1
47c: aa 27 eor r26, r26
47e: bb 27 eor r27, r27
ByteOffset = ClusIndex * 2 % 512; /* 字节偏移 */
480: ef 01 movw r28, r30
482: ce 0f add r28, r30
484: df 1f adc r29, r31
486: d1 70 andi r29, 0x01 ; 1
Buf = OpenSector(SecIndex); /* 打开扇区 */
488: bc 01 movw r22, r24
48a: cd 01 movw r24, r26
48c: 0e 94 74 00 call 0xe8
if (Buf == NULL)
490: 00 97 sbiw r24, 0x00 ; 0
492: 19 f4 brne .+6 ; 0x49a
{
return BAD_CLUS;
494: 67 ef ldi r22, 0xF7 ; 247
496: 7f ef ldi r23, 0xFF ; 255
498: 0a c0 rjmp .+20 ; 0x4ae
}
SET_UINT16(Buf, ByteOffset, Value); /* 设置下一簇号 */
49a: fe 01 movw r30, r28
49c: e8 0f add r30, r24
49e: f9 1f adc r31, r25
4a0: 00 83 st Z, r16
4a2: 81 2f mov r24, r17
4a4: 99 27 eor r25, r25
4a6: 81 83 std Z+1, r24 ; 0x01
WriteSector(); /* 写扇区 */
4a8: 0e 94 bf 00 call 0x17e
return Value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -