📄 fat.s
字号:
xjmp L20
L31:
.dbline 122
; case PART_TYPE_FAT32:
; LCD_write_english_string(0,0,"FAT32");
ldi R24,<L32
ldi R25,>L32
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_english_string
.dbline 123
; break;
xjmp L20
L19:
.dbline 125
; default:
; LCD_write_english_string(0,0,"No Partition!");
ldi R24,<L33
ldi R25,>L33
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_english_string
.dbline 126
; break;
L20:
.dbline 129
; }
; //显示磁盘容量
; data=PartInfo.prSize>>11;
ldi R24,11
ldi R25,0
lds R4,_PartInfo+12+2
lds R5,_PartInfo+12+2+1
lds R2,_PartInfo+12
lds R3,_PartInfo+12+1
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R10,R16
.dbline 130
; LCD_set_XY(56,0);
clr R18
ldi R16,56
xcall _LCD_set_XY
.dbline 131
; t1=data/100;
ldi R18,100
ldi R19,0
movw R16,R10
xcall div16u
.dbline 132
; LCD_write_char(t1+48);
subi R16,208 ; addi 48
xcall _LCD_write_char
.dbline 133
; data=data%100;
ldi R18,100
ldi R19,0
movw R16,R10
xcall mod16u
movw R10,R16
.dbline 134
; t1=data/10;
ldi R18,10
ldi R19,0
xcall div16u
mov R12,R16
.dbline 135
; LCD_write_char(t1+48);
subi R16,208 ; addi 48
xcall _LCD_write_char
.dbline 136
; t2=data%10;
ldi R18,10
ldi R19,0
movw R16,R10
xcall mod16u
mov R10,R16
.dbline 137
; LCD_write_char(t2+48);
subi R16,208 ; addi 48
xcall _LCD_write_char
.dbline 138
; LCD_write_english_string(76,0,"M");
ldi R24,<L36
ldi R25,>L36
std y+1,R25
std y+0,R24
clr R18
ldi R16,76
xcall _LCD_write_english_string
.dbline 140
; //LCD_write_english_string(0,1,"RATE");
; return 0;
clr R16
.dbline -2
L4:
adiw R28,2
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r t2 10 c
.dbsym r t1 12 c
.dbsym r data 10 i
.dbsym r bpb 10 pS[bpb710]
.dbend
.area data(ram, con, rel)
.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
_baseentry::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
.dbsym e baseentry _baseentry i
_entrycount::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
.dbsym e entrycount _entrycount i
.area text(rom, con, rel)
.dbfile D:\Temp\AVRTest\SDMP3~1\fat.c
.dbfunc e fatGetDirEntry _fatGetDirEntry fl
.dbstruct 0 32 winentry
.dbfield 0 weCnt c
.dbfield 1 wePart1 A[10:10]c
.dbfield 11 weAttributes c
.dbfield 12 weReserved1 c
.dbfield 13 weChksum c
.dbfield 14 wePart2 A[12:12]c
.dbfield 26 weReserved2 i
.dbfield 28 wePart3 A[4:4]c
.dbend
.dbstruct 0 32 direntry
.dbfield 0 deName A[8:8]c
.dbfield 8 deExtension A[3:3]c
.dbfield 11 deAttributes c
.dbfield 12 deLowerCase c
.dbfield 13 deCHundredth c
.dbfield 14 deCTime A[2:2]c
.dbfield 16 deCDate A[2:2]c
.dbfield 18 deADate A[2:2]c
.dbfield 20 deHighClust i
.dbfield 22 deMTime A[2:2]c
.dbfield 24 deMDate A[2:2]c
.dbfield 26 deStartCluster i
.dbfield 28 deFileSize l
.dbend
; rval -> y+10
; save2 -> R10,R11
; save -> y+6
; b -> y+22
; sector -> y+2
; hasBuffer -> y+20
; index -> y+18
; de -> y+16
; p -> R12,R13
; we -> y+14
; i -> R14,R15
; entry -> y+34
.even
_fatGetDirEntry::
st -y,r17
st -y,r16
xcall push_gset5
sbiw R28,24
.dbline -1
.dbline 151
; }
;
; /*-----------------------------------------------------------------------
; 查询一个文件的开始簇
; -----------------------------------------------------------------------*/
; unsigned int baseentry = 0;
; unsigned int entrycount = 0;
;
;
; unsigned long fatGetDirEntry(unsigned int entry)
; {
.dbline 153
; unsigned long sector;
; struct direntry *de = 0; // 防止compiler warning
clr R0
clr R1
std y+17,R1
std y+16,R0
.dbline 160
; struct winentry *we;
; unsigned int hasBuffer;
; unsigned int b;
; int i,index;
; char *p;
;
; entrycount = 0;
clr R2
clr R3
sts _entrycount+1,R3
sts _entrycount,R2
.dbline 161
; DirNameBuffer = 0;
sts _DirNameBuffer+1,R3
sts _DirNameBuffer,R2
.dbline 165
;
;
; // 读取目录区数据
; sector = fatClustToSect(FirstDirSector);
lds R18,_FirstDirSector+2
lds R19,_FirstDirSector+2+1
lds R16,_FirstDirSector
lds R17,_FirstDirSector+1
xcall _fatClustToSect
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
.dbline 167
;
; hasBuffer = 0;
clr R0
clr R1
std y+21,R1
std y+20,R0
.dbline 169
;
; index = 16;
ldi R24,16
ldi R25,0
std y+19,R25
std y+18,R24
L38:
.dbline 171
; do
; {
.dbline 172
; if(index == 16) // 是否该一人一扇区time for next sector ?
ldd R24,y+18
ldd R25,y+19
cpi R24,16
ldi R30,0
cpc R25,R30
breq X6
xjmp L41
X6:
.dbline 173
; {
.dbline 174
; ReadBlock(sector++);
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
movw R30,R28
ldd R16,z+6
ldd R17,z+7
ldd R18,z+8
ldd R19,z+9
xcall _ReadBlock
.dbline 175
; de = (struct direntry *)BUFFER;
ldi R24,<_BUFFER
ldi R25,>_BUFFER
std y+17,R25
std y+16,R24
.dbline 176
; index = 0;
clr R0
clr R1
std y+19,R1
std y+18,R0
.dbline 177
; }
L41:
.dbline 179
;
; if(*de->deName != 0xE5)
ldd R30,y+16
ldd R31,y+17
ldd R24,z+0
cpi R24,229
brne X7
xjmp L43
X7:
.dbline 180
; {
.dbline 182
; // 如果if not a deleted entry
; if(de->deAttributes == ATTR_LONG_FILENAME)
ldd R24,z+11
cpi R24,15
breq X8
xjmp L45
X8:
.dbline 183
; {
.dbline 185
; // we have a long name entry
; we = (struct winentry *) de;
ldd R0,y+16
ldd R1,y+17
std y+15,R1
std y+14,R0
.dbline 186
; b = 13 *( (we->weCnt-1) & 0x0f); // index into string
movw R30,R0
ldd R24,z+0
subi R24,1
andi R24,15
ldi R25,13
mul R25,R24
std y+23,R1
std y+22,R0
.dbline 187
; p = &LongNameBuffer[b];
lds R2,_LongNameBuffer
lds R3,_LongNameBuffer+1
movw R12,R0
add R12,R2
adc R13,R3
.dbline 188
clr R14
clr R15
L47:
.dbline 188
ldi R16,2
ldi R17,0
movw R18,R14
xcall empy16s
movw R30,R16
ldd R24,y+14
ldd R25,y+15
adiw R24,1
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R12
st Z+,R2
movw R12,R30
L48:
.dbline 188
; for (i=0;i<5;i++) *p++ = we->wePart1[i*2]; // copy first part
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 188
cpi R24,5
ldi R30,0
cpc R25,R30
brlt L47
.dbline 189
clr R14
clr R15
L51:
.dbline 189
ldi R16,2
ldi R17,0
movw R18,R14
xcall empy16s
movw R30,R16
ldd R24,y+14
ldd R25,y+15
adiw R24,14
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R12
st Z+,R2
movw R12,R30
L52:
.dbline 189
; for (i=0;i<6;i++) *p++ = we->wePart2[i*2]; // second part
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 189
cpi R24,6
ldi R30,0
cpc R25,R30
brlt L51
.dbline 190
clr R14
clr R15
L55:
.dbline 190
ldi R16,2
ldi R17,0
movw R18,R14
xcall empy16s
movw R30,R16
ldd R24,y+14
ldd R25,y+15
adiw R24,28
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R12
st Z+,R2
movw R12,R30
L56:
.dbline 190
; for (i=0;i<2;i++) *p++ = we->wePart3[i*2]; // and third part
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 190
cpi R24,2
ldi R30,0
cpc R25,R30
brlt L55
.dbline 191
; if (we->weCnt & 0x40) *p = 0; // in case dirnamelength is multiple of 13
ldd R30,y+14
ldd R31,y+15
ldd R2,z+0
sbrs R2,6
rjmp L59
.dbline 191
clr R2
movw R30,R12
std z+0,R2
L59:
.dbline 192
; if ((we->weCnt & 0x0f) == 1) hasBuffer = 1; // mark that we have a long entry
ldd R30,y+14
ldd R31,y+15
ldd R24,z+0
andi R24,15
cpi R24,1
breq X9
xjmp L46
X9:
.dbline 192
ldi R24,1
ldi R25,0
std y+21,R25
std y+20,R24
.dbline 193
; }
xjmp L46
L45:
.dbline 195
; else
; {
.dbline 198
; // we have a short name entry
; // check if this is the end of a multi-part long name entry
; if(hasBuffer)
ldd R0,y+20
ldd R1,y+21
tst R0
brne X4
tst R1
brne X10
xjmp L63
X10:
X4:
.dbline 199
; {
.dbline 202
; // a long entry name has been collected
; // is it a directory ?
; if(de->deAttributes == ATTR_DIRECTORY)
ldd R30,y+16
ldd R31,y+17
ldd R24,z+11
cpi R24,16
breq X11
xjmp L65
X11:
.dbline 203
; {
.dbline 204
; unsigned long save = FirstDirSector;
lds R4,_FirstDirSector+2
lds R5,_FirstDirSector+2+1
lds R2,_FirstDirSector
lds R3,_FirstDirSector+1
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
.dbline 205
; unsigned int save2 = baseentry;
lds R10,_baseentry
lds R11,_baseentry+1
.dbline 208
; unsigned long rval;
;
; strcpy(DirNameBuffer,LongNameBuffer);
lds R18,_LongNameBuffer
lds R19,_LongNameBuffer+1
lds R16,_DirNameBuffer
lds R17,_DirNameBuffer+1
xcall _strcpy
.dbline 209
; strcat(DirNameBuffer,"/");
ldi R18,<L67
ldi R19,>L67
lds R16,_DirNameBuffer
lds R17,_DirNameBuffer+1
xcall _strcat
.dbline 214
;
; // rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
;
; // call recursively
; FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
ldd R30,y+16
ldd R31,y+17
ldd R2,z+26
ldd R3,z+27
clr R4
clr R5
ldd R30,y+16
ldd R31,y+17
ldd R6,z+20
ldd R7,z+21
clr R8
clr R9
movw R8,R6
clr R6
clr R7
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
sts _FirstDirSector+1,R7
sts _FirstDirSector,R6
sts _FirstDirSector+2+1,R9
sts _FirstDirSector+2,R8
.dbline 215
; rval = fatGetDirEntry(entry);
ldd R16,y+34
ldd R17,y+35
xcall _fatGetDirEntry
movw R30,R28
std z+10,R16
std z+11,R17
std z+12,R18
std z+13,R19
.dbline 216
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -