📄 fat16.s
字号:
lds R3,_fileid+26+2+1
movw R30,R28
std z+21,R2
std z+22,R3
std z+23,R4
std z+24,R5
.dbline 256
;
; BytePerClus=BPB_SecPerClus * 512;
lds R18,_BPB_SecPerClus
clr R19
ldi R16,512
ldi R17,2
rcall empy16s
movw R10,R16
.dbline 257
; ClusNum=lenth/BytePerClus+1;
movw R2,R10
clr R4
clr R5
movw R30,R28
ldd R6,z+21
ldd R7,z+22
ldd R8,z+23
ldd R9,z+24
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
rcall div32u
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R2,R16
movw R4,R18
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R12,R2
.dbline 258
; NextClus=FileIndex.ClusID;
lds R10,_FileIndex+2
lds R11,_FileIndex+2+1
.dbline 259
; for(t=0;t<ClusNum;t++)
clr R2
clr R3
sts L59+1,R3
sts L59,R2
rjmp L101
L98:
.dbline 260
; {
.dbline 261
; for(r=0;r<BPB_SecPerClus;r++)
clr R2
clr R3
sts L58+1,R3
sts L58,R2
rjmp L105
L102:
.dbline 262
; {
.dbline 263
; SD_SPI_HIGH();
rcall _SD_SPI_HIGH
.dbline 264
; ReadBlock(LBA+r);
lds R2,L58
lds R3,L58+1
clr R4
clr R5
movw R30,R28
ldd R6,z+1
ldd R7,z+2
ldd R8,z+3
ldd R9,z+4
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R16,R6
movw R18,R8
rcall _ReadBlock
rjmp L107
L106:
.dbline 266
; while(pointer<512)
; {
.dbline 267
; if(PINB&1)
sbis 0x16,0
rjmp L109
.dbline 268
; {
.dbline 269
; for(p=0;p<32;p++)
clr R2
clr R3
sts L60+1,R3
sts L60,R2
rjmp L114
L111:
.dbline 270
.dbline 271
ldi R24,<_BUFFER
ldi R25,>_BUFFER
lds R30,L61
lds R31,L61+1
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _VS1003B_WriteDAT
.dbline 272
lds R24,L61
lds R25,L61+1
adiw R24,1
sts L61+1,R25
sts L61,R24
.dbline 273
L112:
.dbline 269
lds R24,L60
lds R25,L60+1
adiw R24,1
sts L60+1,R25
sts L60,R24
L114:
.dbline 269
lds R24,L60
lds R25,L60+1
cpi R24,32
ldi R30,0
cpc R25,R30
brlo L111
.dbline 274
; {
; VS1003B_WriteDAT(BUFFER[pointer]);
; pointer++;
; }
; if(pointer==511) break;
lds R24,L61
lds R25,L61+1
cpi R24,255
ldi R30,1
cpc R25,R30
brne L115
.dbline 274
rjmp L108
L115:
.dbline 275
; }
L109:
.dbline 277
; //按键处理
; if(!(PINA&NEXT))
sbic 0x19,7
rjmp L117
.dbline 278
; {
.dbline 279
; delay(10);
ldi R16,10
ldi R17,0
rcall _delay
.dbline 280
; if(!(PINA&NEXT))
sbic 0x19,7
rjmp L119
.dbline 281
; {
.dbline 282
; lcd_on();
in R24,0x15
andi R24,253
out 0x15,R24
.dbline 283
; keyflag=1;
ldi R24,1
sts _keyflag,R24
.dbline 284
; flag=1;
sts _flag,R24
.dbline 285
; VS1003B_SoftReset();
rcall _VS1003B_SoftReset
.dbline 286
; return 5;
ldi R16,5
rjmp L57
L119:
.dbline 288
; }
; }
L117:
.dbline 289
; if(!(PINC&PREV))
sbic 0x13,0
rjmp L121
.dbline 290
; {
.dbline 291
; delay(10);
ldi R16,10
ldi R17,0
rcall _delay
.dbline 292
; if(!(PINC&PREV))
sbic 0x13,0
rjmp L123
.dbline 293
; {
.dbline 294
; lcd_on();
in R24,0x15
andi R24,253
out 0x15,R24
.dbline 295
; keyflag=1;
ldi R24,1
sts _keyflag,R24
.dbline 296
; flag=0;
clr R2
sts _flag,R2
.dbline 297
; VS1003B_SoftReset();
rcall _VS1003B_SoftReset
.dbline 298
; return 6;
ldi R16,6
rjmp L57
L123:
.dbline 300
; }
; }
L121:
.dbline 301
; if(!(PINA&PLAY))
sbic 0x19,4
rjmp L125
.dbline 302
; {
.dbline 303
; delay(600);
ldi R16,600
ldi R17,2
rcall _delay
.dbline 304
; lcd_on();
in R24,0x15
andi R24,253
out 0x15,R24
L127:
.dbline 305
L128:
.dbline 305
; while(PINA&PLAY);
sbic 0x19,4
rjmp L127
.dbline 306
; keyflag=1;
ldi R24,1
sts _keyflag,R24
.dbline 307
; delay(600);
ldi R16,600
ldi R17,2
rcall _delay
.dbline 308
; }
L125:
.dbline 309
L107:
.dbline 265
lds R24,L61
lds R25,L61+1
cpi R24,0
ldi R30,2
cpc R25,R30
brsh X4
rjmp L106
X4:
L108:
.dbline 310
clr R2
clr R3
sts L61+1,R3
sts L61,R2
.dbline 311
L103:
.dbline 261
lds R24,L58
lds R25,L58+1
adiw R24,1
sts L58+1,R25
sts L58,R24
L105:
.dbline 261
lds R2,_BPB_SecPerClus
clr R3
lds R4,L58
lds R5,L58+1
cp R4,R2
cpc R5,R3
brsh X5
rjmp L102
X5:
.dbline 312
; }
; pointer=0;
; }
; if(!(PINA&UP))
sbic 0x19,5
rjmp L130
.dbline 313
; {
.dbline 314
; if(!(PINA&UP))
sbic 0x19,5
rjmp L132
.dbline 315
; {
.dbline 316
; lcd_on();
in R24,0x15
andi R24,253
out 0x15,R24
.dbline 317
; keyflag=1;
ldi R24,1
sts _keyflag,R24
.dbline 318
; longfileflag=0;
clr R2
sts _longfileflag,R2
.dbline 319
; vol=vol-((uint16)(4<<8)+4);
lds R24,_vol
lds R25,_vol+1
subi R24,4
sbci R25,4
sts _vol+1,R25
sts _vol,R24
.dbline 320
; volume[0]++;
lds R24,_volume
subi R24,255 ; addi 1
sts _volume,R24
.dbline 321
; if(volume[0]>0x36)
ldi R24,54
lds R2,_volume
cp R24,R2
brsh L134
.dbline 322
; {
.dbline 323
; vol=0x0505;
ldi R24,1285
ldi R25,5
sts _vol+1,R25
sts _vol,R24
.dbline 324
; volume[0]=0x36;
ldi R24,54
sts _volume,R24
.dbline 325
; }
rjmp L135
L134:
.dbline 327
; else
; {
.dbline 328
; VS1003B_WriteCMD(0x0b,vol); //每次左右声道VOL+2
lds R18,_vol
lds R19,_vol+1
ldi R16,11
rcall _VS1003B_WriteCMD
.dbline 329
; }
L135:
.dbline 330
; show(volume,108,0);
clr R2
std y+0,R2
ldi R18,108
ldi R16,<_volume
ldi R17,>_volume
rcall _show
.dbline 331
; }
L132:
.dbline 332
; }
L130:
.dbline 333
; if(!(PINA&DOWN))
sbic 0x19,6
rjmp L136
.dbline 334
; {
.dbline 335
; if(!(PINA&DOWN))
sbic 0x19,6
rjmp L138
.dbline 336
; {
.dbline 337
; lcd_on();
in R24,0x15
andi R24,253
out 0x15,R24
.dbline 338
; keyflag=1;
ldi R24,1
sts _keyflag,R24
.dbline 339
; longfileflag=0;
clr R2
sts _longfileflag,R2
.dbline 340
; vol=vol+((uint16)(4<<8)+4);
lds R24,_vol
lds R25,_vol+1
subi R24,252 ; offset = 1028
sbci R25,251
sts _vol+1,R25
sts _vol,R24
.dbline 341
; volume[0]--;
lds R24,_volume
subi R24,1
sts _volume,R24
.dbline 342
; if(volume[0]<0x30)
cpi R24,48
brsh L140
.dbline 343
; {
.dbline 344
; vol=0x1d1d;
ldi R24,7453
ldi R25,29
sts _vol+1,R25
sts _vol,R24
.dbline 345
; volume[0]=0x30;
ldi R24,48
sts _volume,R24
.dbline 346
; }
rjmp L141
L140:
.dbline 348
; else
; {
.dbline 349
; VS1003B_WriteCMD(0x0b,vol);//每次左右声道VOL-4
lds R18,_vol
lds R19,_vol+1
ldi R16,11
rcall _VS1003B_WriteCMD
.dbline 350
; }
L141:
.dbline 351
; show(volume,108,0);
clr R2
std y+0,R2
ldi R18,108
ldi R16,<_volume
ldi R17,>_volume
rcall _show
.dbline 352
; }
L138:
.dbline 353
; }
L136:
.dbline 354
; pointer=0;
clr R2
clr R3
sts L61+1,R3
sts L61,R2
.dbline 355
; if(NextClus>=0xfff8) break;
movw R24,R10
cpi R24,248
ldi R30,255
cpc R25,R30
brlo L142
.dbline 355
rjmp L100
L142:
.dbline 356
; if(t==20) lcd_off();
lds R24,L59
lds R25,L59+1
cpi R24,20
ldi R30,0
cpc R25,R30
brne L144
.dbline 356
sbi 0x15,1
L144:
.dbline 357
; if(keyflag)
lds R2,_keyflag
tst R2
breq L146
.dbline 358
; {
.dbline 359
; j++;
lds R24,L65
subi R24,255 ; addi 1
sts L65,R24
.dbline 360
; if(j>20)
ldi R24,20
lds R2,L65
cp R24,R2
brsh L148
.dbline 361
; {
.dbline 362
; lcd_off();
sbi 0x15,1
.dbline 363
; j=0;
clr R2
sts L65,R2
.dbline 364
; keyflag=0;
sts _keyflag,R2
.dbline 365
; }
L148:
.dbline 366
; }
L146:
.dbline 367
movw R16,R10
rcall _ReadFAT
movw R10,R16
.dbline 368
rcall _ClusConvLBA
movw R30,R28
std z+1,R16
std z+2,R17
std z+3,R18
std z+4,R19
.dbline 369
L99:
.dbline 259
lds R24,L59
lds R25,L59+1
adiw R24,1
sts L59+1,R25
sts L59,R24
L101:
.dbline 259
lds R2,L59
lds R3,L59+1
cp R2,R12
cpc R3,R13
brsh X6
rjmp L98
X6:
L100:
.dbline 370
; NextClus=ReadFAT(NextClus);
; LBA=ClusConvLBA(NextClus);
; }
; return 1;
ldi R16,1
.dbline -2
L57:
adiw R28,25
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l DirStart 2 i
.dbsym l lenth 21 l
.dbsym r count 10 i
.dbsym r BytePerClus 10 i
.dbsym r ClusNum 12 i
.dbsym l unicodename 5 A[16:16]c
.dbsym r NextClus 10 i
.dbsym l LBA 1 l
.dbend
.area lit(rom, con, rel)
L151:
.byte 'Z,'I,'K,'U,49,54,32,32,'D,'A,'T
L152:
.byte 'U,'N,'I,'C,'O,'D,'E,32,'D,'A,'T
.area text(rom, con, rel)
.dbfile D:\ICCFIL~1\五键MP3ICC\fat16.c
.dbfunc e Getfile_start _Getfile_start fi
; unicode -> y+43
; ziku -> y+32
; zikudir -> y+0
; i -> R20,R21
.even
_Getfile_start::
rcall push_gset1
sbiw R28,54
.dbline -1
.dbline 373
; }
; uint16 Getfile_start()
; {
.dbline 376
; uint16 i;
; DIR zikudir;
; uint8 ziku[11]="ZIKU16 DAT";
ldi R24,<L151
ldi R25,>L151
movw R30,R28
adiw R30,32
ldi R16,11
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 377
; uint8 unicode[11]="UNICODE DAT";
ldi R24,<L152
ldi R25,>L152
movw R30,R28
adiw R30,43
ldi R16,11
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 378
; if(flag)
lds R2,_flag
tst R2
breq L153
.dbline 379
; {
.dbline 380
; i=GetFileID(ziku,&zikudir);
movw R18,R28
movw R16,R28
subi R16,224 ; offset = 32
sbci R17,255
rcall _GetFileID
mov R20,R16
clr R21
.dbline 381
; flag=0;
clr R2
sts _flag,R2
.dbline 382
; }
rjmp L154
L153:
.dbline 384
; else
; {
.dbline 385
; i=GetFileID(unicode,&zikudir);
movw R18,R28
movw R16,R28
subi R16,213 ; offset = 43
sbci R17,255
rcall _GetFileID
mov R20,R16
clr R21
.dbline 386
; }
L154:
.dbline 387
; if(!i)
cpi R20,0
cpc R20,R21
brne L155
X7:
.dbline 388
; {
.dbline 389
; return 0;
clr R16
clr R17
rjmp L150
L155:
.dbline 391
; }
; i=zikudir.FilePosit.Start;
ldd R20,y+26
ldd R21,y+27
.dbline 392
; return i;
movw R16,R20
.dbline -2
L150:
adiw R28,54
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym l unicode 43 A[11:11]c
.dbsym l ziku 32 A[11:11]c
.dbsym l zikudir 0 S[.3]
.dbsym r i 20 i
.dbend
.dbfunc e show _show fV
; temp2 -> y+15
; temp1 -> y+11
; loca1 -> R12
; location1 -> R10
; start -> y+7
; findflag -> y+23
; i -> R14,R15
; y -> y+22
; x -> y+21
; temp -> y+3
; j -> y+19
; loca -> y+34
; location -> R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -