📄 fat.s
字号:
; 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 122
; break;
xjmp L20
L19:
.dbline 124
; 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 125
; break;
L20:
.dbline 128
; }
; //显示磁盘容量
; 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 129
; LCD_set_XY(56,0);
clr R18
ldi R16,56
xcall _LCD_set_XY
.dbline 130
; t1=data/100;
ldi R18,100
ldi R19,0
movw R16,R10
xcall div16u
.dbline 131
; LCD_write_char(t1+48);
subi R16,208 ; addi 48
xcall _LCD_write_char
.dbline 132
; data=data%100;
ldi R18,100
ldi R19,0
movw R16,R10
xcall mod16u
movw R10,R16
.dbline 133
; t1=data/10;
ldi R18,10
ldi R19,0
xcall div16u
mov R12,R16
.dbline 134
; LCD_write_char(t1+48);
subi R16,208 ; addi 48
xcall _LCD_write_char
.dbline 135
; t2=data%10;
ldi R18,10
ldi R19,0
movw R16,R10
xcall mod16u
mov R10,R16
.dbline 136
; LCD_write_char(t2+48);
subi R16,208 ; addi 48
xcall _LCD_write_char
.dbline 137
; 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 138
; LCD_write_english_string(0,1,"RATE");
ldi R24,<L37
ldi R25,>L37
std y+1,R25
std y+0,R24
ldi R18,1
clr R16
xcall _LCD_write_english_string
.dbline 139
; 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 C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
_baseentry::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
.dbsym e baseentry _baseentry i
_entrycount::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
.dbsym e entrycount _entrycount i
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\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+8
; save2 -> R10,R11
; save -> y+4
; b -> y+20
; sector -> y+0
; hasBuffer -> y+18
; index -> y+16
; de -> y+14
; p -> R12,R13
; we -> y+12
; i -> R14,R15
; entry -> y+32
.even
_fatGetDirEntry::
st -y,r17
st -y,r16
xcall push_gset5
sbiw R28,22
.dbline -1
.dbline 150
; }
;
; /*-----------------------------------------------------------------------
; 查询一个文件的开始簇
; -----------------------------------------------------------------------*/
; unsigned int baseentry = 0;
; unsigned int entrycount = 0;
;
;
; unsigned long fatGetDirEntry(unsigned int entry)
; {
.dbline 152
; unsigned long sector;
; struct direntry *de = 0; // 防止compiler warning
clr R0
clr R1
std y+15,R1
std y+14,R0
.dbline 159
; 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 160
; DirNameBuffer = 0;
sts _DirNameBuffer+1,R3
sts _DirNameBuffer,R2
.dbline 164
;
;
; // 读取目录区数据
; 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+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 166
;
; hasBuffer = 0;
clr R0
clr R1
std y+19,R1
std y+18,R0
.dbline 168
;
; index = 16;
ldi R24,16
ldi R25,0
std y+17,R25
std y+16,R24
L39:
.dbline 170
; do
; {
.dbline 171
; if(index == 16) // 是否该一人一扇区time for next sector ?
ldd R24,y+16
ldd R25,y+17
cpi R24,16
ldi R30,0
cpc R25,R30
breq X6
xjmp L42
X6:
.dbline 172
; {
.dbline 173
; ReadBlock(sector++);
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
movw R30,R28
ldd R16,z+4
ldd R17,z+5
ldd R18,z+6
ldd R19,z+7
xcall _ReadBlock
.dbline 174
; de = (struct direntry *)BUFFER;
ldi R24,<_BUFFER
ldi R25,>_BUFFER
std y+15,R25
std y+14,R24
.dbline 175
; index = 0;
clr R0
clr R1
std y+17,R1
std y+16,R0
.dbline 176
; }
L42:
.dbline 178
;
; if(*de->deName != 0xE5)
ldd R30,y+14
ldd R31,y+15
ldd R24,z+0
cpi R24,229
brne X7
xjmp L44
X7:
.dbline 179
; {
.dbline 181
; // 如果if not a deleted entry
; if(de->deAttributes == ATTR_LONG_FILENAME)
ldd R24,z+11
cpi R24,15
breq X8
xjmp L46
X8:
.dbline 182
; {
.dbline 184
; // we have a long name entry
; we = (struct winentry *) de;
ldd R0,y+14
ldd R1,y+15
std y+13,R1
std y+12,R0
.dbline 185
; 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+21,R1
std y+20,R0
.dbline 186
; p = &LongNameBuffer[b];
lds R2,_LongNameBuffer
lds R3,_LongNameBuffer+1
movw R12,R0
add R12,R2
adc R13,R3
.dbline 187
clr R14
clr R15
L48:
.dbline 187
ldi R16,2
ldi R17,0
movw R18,R14
xcall empy16s
movw R30,R16
ldd R24,y+12
ldd R25,y+13
adiw R24,1
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R12
st Z+,R2
movw R12,R30
L49:
.dbline 187
; for (i=0;i<5;i++) *p++ = we->wePart1[i*2]; // copy first part
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 187
cpi R24,5
ldi R30,0
cpc R25,R30
brlt L48
.dbline 188
clr R14
clr R15
L52:
.dbline 188
ldi R16,2
ldi R17,0
movw R18,R14
xcall empy16s
movw R30,R16
ldd R24,y+12
ldd R25,y+13
adiw R24,14
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R12
st Z+,R2
movw R12,R30
L53:
.dbline 188
; for (i=0;i<6;i++) *p++ = we->wePart2[i*2]; // second part
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 188
cpi R24,6
ldi R30,0
cpc R25,R30
brlt L52
.dbline 189
clr R14
clr R15
L56:
.dbline 189
ldi R16,2
ldi R17,0
movw R18,R14
xcall empy16s
movw R30,R16
ldd R24,y+12
ldd R25,y+13
adiw R24,28
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R12
st Z+,R2
movw R12,R30
L57:
.dbline 189
; for (i=0;i<2;i++) *p++ = we->wePart3[i*2]; // and third part
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 189
cpi R24,2
ldi R30,0
cpc R25,R30
brlt L56
.dbline 190
; if (we->weCnt & 0x40) *p = 0; // in case dirnamelength is multiple of 13
ldd R30,y+12
ldd R31,y+13
ldd R2,z+0
sbrs R2,6
rjmp L60
.dbline 190
clr R2
movw R30,R12
std z+0,R2
L60:
.dbline 191
; if ((we->weCnt & 0x0f) == 1) hasBuffer = 1; // mark that we have a long entry
ldd R30,y+12
ldd R31,y+13
ldd R24,z+0
andi R24,15
cpi R24,1
breq X9
xjmp L47
X9:
.dbline 191
ldi R24,1
ldi R25,0
std y+19,R25
std y+18,R24
.dbline 192
; }
xjmp L47
L46:
.dbline 194
; else
; {
.dbline 197
; // we have a short name entry
; // check if this is the end of a multi-part long name entry
; if(hasBuffer)
ldd R0,y+18
ldd R1,y+19
tst R0
brne X4
tst R1
brne X10
xjmp L64
X10:
X4:
.dbline 198
; {
.dbline 201
; // a long entry name has been collected
; // is it a directory ?
; if(de->deAttributes == ATTR_DIRECTORY)
ldd R30,y+14
ldd R31,y+15
ldd R24,z+11
cpi R24,16
breq X11
xjmp L66
X11:
.dbline 202
; {
.dbline 203
; 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+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
.dbline 204
; unsigned int save2 = baseentry;
lds R10,_baseentry
lds R11,_baseentry+1
.dbline 207
; unsigned long rval;
;
; strcpy(DirNameBuffer,LongNameBuffer);
lds R18,_LongNameBuffer
lds R19,_LongNameBuffer+1
lds R16,_DirNameBuffer
lds R17,_DirNameBuffer+1
xcall _strcpy
.dbline 208
; strcat(DirNameBuffer,"/");
ldi R18,<L68
ldi R19,>L68
lds R16,_DirNameBuffer
lds R17,_DirNameBuffer+1
xcall _strcat
.dbline 213
;
; // rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
;
; // call recursively
; FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
ldd R30,y+14
ldd R31,y+15
ldd R2,z+26
ldd R3,z+27
clr R4
clr R5
ldd R30,y+14
ldd R31,y+15
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 214
; rval = fatGetDirEntry(entry);
ldd R16,y+32
ldd R17,y+33
xcall _fatGetDirEntry
movw R30,R28
std z+8,R16
std z+9,R17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -