📄 sdfs_out.lst
字号:
return FR_RW_ERROR;
}
#if !_FS_READONLY
/*-----------------------------------------------------------------------*/
/* Write File */
/*-----------------------------------------------------------------------*/
FRESULT f_write (
FIL *fp, /* Pointer to the file object */
const void *buff, /* Pointer to the data to be written */
UINT btw, /* Number of bytes to write */
UINT *bw /* Pointer to number of bytes written */
)
{
DWORD sect;
UINT wcnt, cc;
CLUST clust;
FRESULT res;
const BYTE *wbuff = buff;
FATFS *fs = fp->fs;
*bw = 0;
res = validate(fs, fp->id); /* Check validity of the object */
if (res != FR_OK) return res;
if (fp->flag & FA__ERROR) return FR_RW_ERROR; /* Check error flag */
if (!(fp->flag & FA_WRITE)) return FR_DENIED; /* Check access mode */
if (fp->fsize + btw < fp->fsize) return FR_OK; /* File size cannot reach 4GB */
for ( ; btw; /* Repeat until all data transferred */
wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) {
if ((fp->fptr % 512) == 0) { /* On the sector boundary */
if (--(fp->sect_clust)) { /* Decrement left sector counter */
sect = fp->curr_sect + 1; /* Get current sector */
} else { /* On the cluster boundary, get next cluster */
if (fp->fptr == 0) { /* Is top of the file */
clust = fp->org_clust;
if (clust == 0) /* No cluster is created yet */
fp->org_clust = clust = create_chain(0); /* Create a new cluster chain */
} else { /* Middle or end of file */
clust = create_chain(fp->curr_clust); /* Trace or streach cluster chain */
}
if (clust == 0) break; /* Disk full */
if (clust == 1 || clust >= fs->max_clust) goto fw_error;
fp->curr_clust = clust; /* Current cluster */
sect = clust2sect(clust); /* Get current sector */
fp->sect_clust = fs->sects_clust; /* Re-initialize the left sector counter */
}
fp->curr_sect = sect; /* Update current sector */
cc = btw / 512; /* When left bytes >= 512, */
if (cc) { /* Write maximum contiguous sectors directly */
if (cc > fp->sect_clust) cc = fp->sect_clust;
if (disk_write(0, wbuff, sect, (BYTE)cc) != RES_OK)
goto fw_error;
fp->sect_clust -= (BYTE)(cc - 1);
fp->curr_sect += cc - 1;
wcnt = cc * 512;
continue;
}
if (fp->fptr >= fp->fsize) { /* Flush R/W window if needed */
if (!move_window(0)) goto fw_error;
fs->winsect = fp->curr_sect;
}
}
if (!move_window(fp->curr_sect)) /* Move sector window */
goto fw_error;
wcnt = 512 - (WORD)(fp->fptr % 512); /* Copy fractional bytes bytes to sector window */
if (wcnt > btw) wcnt = btw;
memcpy(&fs->win[(WORD)fp->fptr % 512], wbuff, wcnt);
fs->winflag = 1;
}
if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */
fp->flag |= FA__WRITTEN; /* Set file changed flag */
return FR_OK;
fw_error: /* Abort this function due to an unrecoverable error */
fp->flag |= FA__ERROR;
return FR_RW_ERROR;
}
/*-----------------------------------------------------------------------*/
/* Synchronize the file object */
/*-----------------------------------------------------------------------*/
FRESULT f_sync (
FIL *fp /* Pointer to the file object */
)
{
DWORD tim;
BYTE *dir;
FRESULT res;
FATFS *fs = fp->fs;
res = validate(fs, fp->id); /* Check validity of the object */
if (res == FR_OK) {
if (fp->flag & FA__WRITTEN) { /* Has the file been written? */
/* Update the directory entry */
if (!move_window(fp->dir_sect))
return FR_RW_ERROR;
dir = fp->dir_ptr;
dir[DIR_Attr] |= AM_ARC; /* Set archive bit */
ST_DWORD(&dir[DIR_FileSize], fp->fsize); /* Update file size */
ST_WORD(&dir[DIR_FstClusLO], fp->org_clust); /* Update start cluster */
#if _FAT32
ST_WORD(&dir[DIR_FstClusHI], fp->org_clust >> 16);
#endif
tim = get_fattime(); /* Updated time */
ST_DWORD(&dir[DIR_WrtTime], tim);
fp->flag &= ~FA__WRITTEN;
res = sync();
}
}
return res;
}
#endif /* !_FS_READONLY */
/*-----------------------------------------------------------------------*/
/* Close File */
/*-----------------------------------------------------------------------*/
FRESULT f_close (
FIL *fp /* Pointer to the file object to be closed */
)
{
28a: cf 93 push r28
28c: df 93 push r29
28e: ec 01 movw r28, r24
FRESULT res;
#if !_FS_READONLY
res = f_sync(fp);
#else
res = validate(fp->fs, fp->id);
290: 68 81 ld r22, Y
292: 79 81 ldd r23, Y+1 ; 0x01
294: 8c 81 ldd r24, Y+4 ; 0x04
296: 9d 81 ldd r25, Y+5 ; 0x05
298: 0e 94 33 01 call 0x266 ; 0x266 <validate>
#endif
if (res == FR_OK)
29c: 00 97 sbiw r24, 0x00 ; 0
29e: 11 f4 brne .+4 ; 0x2a4 <f_close+0x1a>
fp->fs = NULL;
2a0: 1d 82 std Y+5, r1 ; 0x05
2a2: 1c 82 std Y+4, r1 ; 0x04
2a4: df 91 pop r29
2a6: cf 91 pop r28
2a8: 08 95 ret
000002aa <move_window>:
2aa: cf 92 push r12
2ac: df 92 push r13
2ae: ef 92 push r14
2b0: ff 92 push r15
2b2: 0f 93 push r16
2b4: cf 93 push r28
2b6: df 93 push r29
2b8: 6b 01 movw r12, r22
2ba: 7c 01 movw r14, r24
2bc: c0 91 6d 00 lds r28, 0x006D
2c0: d0 91 6e 00 lds r29, 0x006E
2c4: 8c 81 ldd r24, Y+4 ; 0x04
2c6: 9d 81 ldd r25, Y+5 ; 0x05
2c8: ae 81 ldd r26, Y+6 ; 0x06
2ca: bf 81 ldd r27, Y+7 ; 0x07
2cc: 8c 15 cp r24, r12
2ce: 9d 05 cpc r25, r13
2d0: ae 05 cpc r26, r14
2d2: bf 05 cpc r27, r15
2d4: b9 f0 breq .+46 ; 0x304 <move_window+0x5a>
2d6: c1 14 cp r12, r1
2d8: d1 04 cpc r13, r1
2da: e1 04 cpc r14, r1
2dc: f1 04 cpc r15, r1
2de: 91 f0 breq .+36 ; 0x304 <move_window+0x5a>
2e0: be 01 movw r22, r28
2e2: 60 5e subi r22, 0xE0 ; 224
2e4: 7f 4f sbci r23, 0xFF ; 255
2e6: 01 e0 ldi r16, 0x01 ; 1
2e8: a7 01 movw r20, r14
2ea: 96 01 movw r18, r12
2ec: 80 e0 ldi r24, 0x00 ; 0
2ee: 0e 94 90 07 call 0xf20 ; 0xf20 <disk_read>
2f2: 89 2b or r24, r25
2f4: 19 f0 breq .+6 ; 0x2fc <move_window+0x52>
2f6: 80 e0 ldi r24, 0x00 ; 0
2f8: 90 e0 ldi r25, 0x00 ; 0
2fa: 06 c0 rjmp .+12 ; 0x308 <move_window+0x5e>
2fc: cc 82 std Y+4, r12 ; 0x04
2fe: dd 82 std Y+5, r13 ; 0x05
300: ee 82 std Y+6, r14 ; 0x06
302: ff 82 std Y+7, r15 ; 0x07
304: 81 e0 ldi r24, 0x01 ; 1
306: 90 e0 ldi r25, 0x00 ; 0
308: df 91 pop r29
30a: cf 91 pop r28
30c: 0f 91 pop r16
30e: ff 90 pop r15
310: ef 90 pop r14
312: df 90 pop r13
314: cf 90 pop r12
316: 08 95 ret
00000318 <get_cluster>:
318: a0 e0 ldi r26, 0x00 ; 0
31a: b0 e0 ldi r27, 0x00 ; 0
31c: e2 e9 ldi r30, 0x92 ; 146
31e: f1 e0 ldi r31, 0x01 ; 1
320: 0c 94 22 0b jmp 0x1644 ; 0x1644 <__prologue_saves__+0xa>
324: 5b 01 movw r10, r22
326: 6c 01 movw r12, r24
328: 80 90 6d 00 lds r8, 0x006D
32c: 90 90 6e 00 lds r9, 0x006E
330: 62 30 cpi r22, 0x02 ; 2
332: 71 05 cpc r23, r1
334: 81 05 cpc r24, r1
336: 91 05 cpc r25, r1
338: 08 f4 brcc .+2 ; 0x33c <get_cluster+0x24>
33a: 9f c0 rjmp .+318 ; 0x47a <__stack+0x1b>
33c: f4 01 movw r30, r8
33e: 80 8d ldd r24, Z+24 ; 0x18
340: 91 8d ldd r25, Z+25 ; 0x19
342: a2 8d ldd r26, Z+26 ; 0x1a
344: b3 8d ldd r27, Z+27 ; 0x1b
346: a8 16 cp r10, r24
348: b9 06 cpc r11, r25
34a: ca 06 cpc r12, r26
34c: db 06 cpc r13, r27
34e: 08 f0 brcs .+2 ; 0x352 <get_cluster+0x3a>
350: 94 c0 rjmp .+296 ; 0x47a <__stack+0x1b>
352: e0 84 ldd r14, Z+8 ; 0x08
354: f1 84 ldd r15, Z+9 ; 0x09
356: 02 85 ldd r16, Z+10 ; 0x0a
358: 13 85 ldd r17, Z+11 ; 0x0b
35a: 84 8d ldd r24, Z+28 ; 0x1c
35c: 82 30 cpi r24, 0x02 ; 2
35e: 09 f4 brne .+2 ; 0x362 <get_cluster+0x4a>
360: 4e c0 rjmp .+156 ; 0x3fe <get_cluster+0xe6>
362: 83 30 cpi r24, 0x03 ; 3
364: 09 f4 brne .+2 ; 0x368 <get_cluster+0x50>
366: 67 c0 rjmp .+206 ; 0x436 <get_cluster+0x11e>
368: 81 30 cpi r24, 0x01 ; 1
36a: 09 f0 breq .+2 ; 0x36e <get_cluster+0x56>
36c: 86 c0 rjmp .+268 ; 0x47a <__stack+0x1b>
36e: e5 01 movw r28, r10
370: cc 0f add r28, r28
372: dd 1f adc r29, r29
374: ca 0d add r28, r10
376: db 1d adc r29, r11
378: d6 95 lsr r29
37a: c7 95 ror r28
37c: be 01 movw r22, r28
37e: 67 2f mov r22, r23
380: 77 27 eor r23, r23
382: 66 95 lsr r22
384: 88 27 eor r24, r24
386: 99 27 eor r25, r25
388: 6e 0d add r22, r14
38a: 7f 1d adc r23, r15
38c: 80 1f adc r24, r16
38e: 91 1f adc r25, r17
390: 0e 94 55 01 call 0x2aa ; 0x2aa <move_window>
394: 89 2b or r24, r25
396: 09 f4 brne .+2 ; 0x39a <get_cluster+0x82>
398: 70 c0 rjmp .+224 ; 0x47a <__stack+0x1b>
39a: fe 01 movw r30, r28
39c: f1 70 andi r31, 0x01 ; 1
39e: e8 0d add r30, r8
3a0: f9 1d adc r31, r9
3a2: 70 a0 ldd r7, Z+32 ; 0x20
3a4: 21 96 adiw r28, 0x01 ; 1
3a6: ce 01 movw r24, r28
3a8: 89 2f mov r24, r25
3aa: 99 27 eor r25, r25
3ac: 86 95 lsr r24
3ae: aa 27 eor r26, r26
3b0: bb 27 eor r27, r27
3b2: e8 0e add r14, r24
3b4: f9 1e adc r15, r25
3b6: 0a 1f adc r16, r26
3b8: 1b 1f adc r17, r27
3ba: c8 01 movw r24, r16
3bc: b7 01 movw r22, r14
3be: 0e 94 55 01 call 0x2aa ; 0x2aa <move_window>
3c2: 89 2b or r24, r25
3c4: 09 f4 brne .+2 ; 0x3c8 <get_cluster+0xb0>
3c6: 59 c0 rjmp .+178 ; 0x47a <__stack+0x1b>
3c8: 67 2d mov r22, r7
3ca: 77 27 eor r23, r23
3cc: d1 70 andi r29, 0x01 ; 1
3ce: c8 0d add r28, r8
3d0: d9 1d adc r29, r9
3d2: 88 a1 ldd r24, Y+32 ; 0x20
3d4: 99 27 eor r25, r25
3d6: 98 2f mov r25, r24
3d8: 88 27 eor r24, r24
3da: 68 2b or r22, r24
3dc: 79 2b or r23, r25
3de: a0 fe sbrs r10, 0
3e0: 08 c0 rjmp .+16 ; 0x3f2 <get_cluster+0xda>
3e2: e4 e0 ldi r30, 0x04 ; 4
3e4: 76 95 lsr r23
3e6: 67 95 ror r22
3e8: ea 95 dec r30
3ea: e1 f7 brne .-8 ; 0x3e4 <get_cluster+0xcc>
3ec: 88 27 eor r24, r24
3ee: 99 27 eor r25, r25
3f0: 48 c0 rjmp .+144 ; 0x482 <__stack+0x23>
3f2: 88 27 eor r24, r24
3f4: 99 27 eor r25, r25
3f6: 7f 70 andi r23, 0x0F ; 15
3f8: 80 70 andi r24, 0x00 ; 0
3fa: 90 70 andi r25, 0x00 ; 0
3fc: 42 c0 rjmp .+132 ; 0x482 <__stack+0x23>
3fe: bb 27 eor r27, r27
400: ad 2d mov r26, r13
402: 9c 2d mov r25, r12
404: 8b 2d mov r24, r11
406: e8 0e add r14, r24
408: f9 1e adc r15, r25
40a: 0a 1f adc r16, r26
40c: 1b 1f adc r17, r27
40e: c8 01 movw r24, r16
410: b7 01 movw r22, r14
412: 0e 94 55 01 call 0x2aa ; 0x2aa <move_window>
416: 89 2b or r24, r25
418: 81 f1 breq .+96 ; 0x47a <__stack+0x1b>
41a: c5 01 movw r24, r10
41c: 88 0f add r24, r24
41e: 99 1f adc r25, r25
420: 91 70 andi r25, 0x01 ; 1
422: 88 0e add r8, r24
424: 99 1e adc r9, r25
426: f4 01 movw r30, r8
428: 80 a1 ldd r24, Z+32 ; 0x20
42a: 91 a1 ldd r25, Z+33 ; 0x21
42c: 9c 01 movw r18, r24
42e: b9 01 movw r22, r18
430: 88 27 eor r24, r24
432: 99 27 eor r25, r25
434: 26 c0 rjmp .+76 ; 0x482 <__stack+0x23>
436: d6 01 movw r26, r12
438: c5 01 movw r24, r10
43a: 37 e0 ldi r19, 0x07 ; 7
43c: b6 95 lsr r27
43e: a7 95 ror r26
440: 97 95 ror r25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -