📄 mp3player.s
字号:
.dbline 146
; Page = FilePtr / SONGPAGE;
ldi R18,5
ldi R19,0
movw R16,R10
xcall div16s
movw R12,R16
.dbline 147
; GetDir(Cluster,Page*SONGPAGE,SONGPAGE,TRUE);
ldi R24,1
ldi R25,0
std y+5,R25
std y+4,R24
ldi R24,5
std y+3,R25
std y+2,R24
ldi R16,5
ldi R17,0
movw R18,R12
xcall empy16s
std y+1,R17
std y+0,R16
movw R30,R28
ldd R16,z+20
ldd R17,z+21
ldd R18,z+22
ldd R19,z+23
xcall _GetDir
.dbline 148
; RemoteSendScreen(PLAY,(FilePtr%SONGPAGE));
ldi R18,5
ldi R19,0
movw R16,R10
xcall mod16s
mov R18,R16
ldi R16,2
xcall _RemoteSendScreen
.dbline 149
; }
L45:
.dbline 150
; RemoteSendLine((FilePtr%SONGPAGE));
ldi R18,5
ldi R19,0
movw R16,R10
xcall mod16s
xcall _RemoteSendLine
.dbline 151
; GetDir(Cluster,FilePtr,1,FALSE);
clr R2
clr R3
std y+5,R3
std y+4,R2
ldi R24,1
ldi R25,0
std y+3,R25
std y+2,R24
std y+1,R11
std y+0,R10
movw R30,R28
ldd R16,z+20
ldd R17,z+21
ldd R18,z+22
ldd R19,z+23
xcall _GetDir
.dbline 152
; PlayMP3();
xcall _PlayMP3
.dbline 153
; if (Key == 0x01) FilePtr = FilePtr;
lds R24,_Key
cpi R24,1
brne L47
.dbline 153
L47:
.dbline 154
; if (Key == 0x02) FilePtr -=2;
lds R24,_Key
cpi R24,2
brne L49
.dbline 154
movw R24,R10
sbiw R24,2
movw R10,R24
L49:
.dbline 155
; if (Key == 0x04) break;
lds R24,_Key
cpi R24,4
brne L51
.dbline 155
xjmp L42
L51:
.dbline 156
; if (Key == 0x08) break;
lds R24,_Key
cpi R24,8
brne L53
.dbline 156
xjmp L42
L53:
.dbline 157
L41:
.dbline 139
xjmp L40
L42:
.dbline 158
; }
; GetDir(Cluster,Page*SONGPAGE,SONGPAGE,TRUE);
ldi R24,1
ldi R25,0
std y+5,R25
std y+4,R24
ldi R24,5
std y+3,R25
std y+2,R24
ldi R16,5
ldi R17,0
movw R18,R12
xcall empy16s
std y+1,R17
std y+0,R16
movw R30,R28
ldd R16,z+20
ldd R17,z+21
ldd R18,z+22
ldd R19,z+23
xcall _GetDir
.dbline 159
; RemoteSendScreen(DIR,(FilePtr%SONGPAGE));
ldi R18,5
ldi R19,0
movw R16,R10
xcall mod16s
mov R18,R16
ldi R16,1
xcall _RemoteSendScreen
.dbline 160
; Key = 0;
clr R2
sts _Key,R2
.dbline 161
; }
L37:
.dbline 162
; }
L34:
.dbline 163
L4:
.dbline 59
xjmp L7
X1:
.dbline -2
.dbline 164
; }
; }
L2:
adiw R28,10
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l ch 7 c
.dbsym l LastCluster 6 l
.dbsym r MaxFile 14 i
.dbsym r Page 12 I
.dbsym r FilePtr 10 I
.dbsym l Cluster 20 l
.dbend
.dbfunc e _StackOverflowed __StackOverflowed fV
; c -> R16
.even
__StackOverflowed::
.dbline -1
.dbline 170
;
; //*************************************
; // void _StackOverflowed(char c)
; //*************************************
; void _StackOverflowed(char c)
; {
.dbline 171
; CLI();
cli
L56:
.dbline 172
L57:
.dbline 172
xjmp L56
X5:
.dbline -2
.dbline 173
; while(1);
; }
L55:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e PlayMP3 _PlayMP3 fI
; Percent -> y+32
; ByteSend -> y+28
; NextCluster -> y+24
; LBA -> y+20
; i -> y+16
; j -> y+12
; TimeOut -> y+8
.even
_PlayMP3::
xcall push_gset2
sbiw R28,36
.dbline -1
.dbline 182
;
; //*************************************
; // int PlayMP3(void)
; //
; // return 0 -> Error
; // return 1 -> successfull play
; //*************************************
; int PlayMP3(void)
; {
.dbline 188
; extern unsigned char SectorBuffer[512];
; unsigned long LBA,i,j,NextCluster,TimeOut,ByteSend,Percent;
; extern struct FileInfo File;
; extern struct BootRecord Boot;
;
; VS1001Init(SOFT);
clr R16
xcall _VS1001Init
.dbline 189
; Key = 0;
clr R2
sts _Key,R2
.dbline 190
; ByteSend = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+28,R20
std z+29,R21
std z+30,R22
std z+31,R23
.dbline 191
; NextCluster = File.FirstClust;
lds R4,_File+260+2
lds R5,_File+260+2+1
lds R2,_File+260
lds R3,_File+260+1
std z+24,R2
std z+25,R3
std z+26,R4
std z+27,R5
xjmp L62
L61:
.dbline 193
; while (1)
; {
.dbline 194
; LBA = Clust2LBA(NextCluster);
movw R30,R28
ldd R16,z+24
ldd R17,z+25
ldd R18,z+26
ldd R19,z+27
xcall _Clust2LBA
movw R30,R28
std z+20,R16
std z+21,R17
std z+22,R18
std z+23,R19
.dbline 195
; for (i=0;i<Boot.SecPerClust;i++)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+16,R20
std z+17,R21
std z+18,R22
std z+19,R23
xjmp L67
L64:
.dbline 196
; {
.dbline 197
; ata_read_sector_byte(0, LBA+i, 0, 512, (unsigned char*)&SectorBuffer);
ldi R24,<_SectorBuffer
ldi R25,>_SectorBuffer
std y+7,R25
std y+6,R24
ldi R24,512
ldi R25,2
std y+5,R25
std y+4,R24
clr R2
clr R3
std y+3,R3
std y+2,R2
movw R30,R28
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
ldd R6,z+20
ldd R7,z+21
ldd R8,z+22
ldd R9,z+23
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+0,R8
std y+1,R9
movw R18,R6
clr R16
xcall _ata_read_sector_byte
.dbline 198
; for (j=0;j<Boot.BytesPerSec;j=j+32)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+12,R20
std z+13,R21
std z+14,R22
std z+15,R23
xjmp L72
L69:
.dbline 199
; {
.dbline 200
; TimeOut = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+8,R20
std z+9,R21
std z+10,R22
std z+11,R23
xjmp L75
L74:
.dbline 202
; while (!(PORT_MP3_IN & DREQ))
; {
.dbline 203
; WDR();
wdr
.dbline 204
; if (Key != 0) return Key;
lds R2,_Key
tst R2
breq L77
.dbline 204
lds R16,_Key
clr R17
xjmp L59
L77:
.dbline 205
; TimeOut++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std z+8,R2
std z+9,R3
std z+10,R4
std z+11,R5
.dbline 206
; if (TimeOut > 100000)
ldi R20,160
ldi R21,134
ldi R22,1
ldi R23,0
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brsh L79
.dbline 207
; {
.dbline 208
; VS1001Init(HARD); // VS1001 is jam
ldi R16,1
xcall _VS1001Init
.dbline 209
; return 0x01; // Next Song
ldi R16,1
ldi R17,0
xjmp L59
L79:
.dbline 211
L75:
.dbline 201
sbis 0x16,7
rjmp L74
.dbline 212
ldi R18,32
ldi R24,<_SectorBuffer
ldi R25,>_SectorBuffer
movw R30,R28
ldd R16,z+12
ldd R17,z+13
add R16,R24
adc R17,R25
xcall _VS1001_Stream
.dbline 213
L70:
.dbline 198
ldi R20,32
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std z+12,R2
std z+13,R3
std z+14,R4
std z+15,R5
L72:
.dbline 198
lds R2,_Boot+11
lds R3,_Boot+11+1
clr R4
clr R5
movw R30,R28
ldd R6,z+12
ldd R7,z+13
ldd R8,z+14
ldd R9,z+15
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X6
xjmp L69
X6:
.dbline 214
L65:
.dbline 195
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std z+16,R2
std z+17,R3
std z+18,R4
std z+19,R5
L67:
.dbline 195
lds R2,_Boot+13
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+16
ldd R7,z+17
ldd R8,z+18
ldd R9,z+19
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X7
xjmp L64
X7:
.dbline 215
; }
; }
; VS1001_Stream(&SectorBuffer[j],32);
; }
; }
; ByteSend += (Boot.BytesPerSec * Boot.SecPerClust);
mov R18,R2
clr R19
lds R16,_Boot+11
lds R17,_Boot+11+1
xcall empy16s
movw R2,R16
clr R4
clr R5
movw R30,R28
ldd R6,z+28
ldd R7,z+29
ldd R8,z+30
ldd R9,z+31
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std z+28,R6
std z+29,R7
std z+30,R8
std z+31,R9
.dbline 216
; Percent = (ByteSend / (File.FileSize / 100));
ldi R20,100
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_File+264+2
lds R5,_File+264+2+1
lds R2,_File+264
lds R3,_File+264+1
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
xcall div32u
movw R30,R28
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall div32u
movw R30,R28
std z+32,R16
std z+33,R17
std z+34,R18
std z+35,R19
.dbline 217
; NextCluster = GetNextCluster(NextCluster);
ldd R16,z+24
ldd R17,z+25
ldd R18,z+26
ldd R19,z+27
xcall _GetNextCluster
movw R30,R28
std z+24,R16
std z+25,R17
std z+26,R18
std z+27,R19
.dbline 218
; if (NextCluster > CLUST_RSRVD) break;
ldi R20,246
ldi R21,255
ldi R22,255
ldi R23,15
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brsh L84
.dbline 218
xjmp L63
L84:
.dbline 219
L62:
.dbline 192
xjmp L61
L63:
.dbline 220
; }
; return 0x01; // Next Song
ldi R16,1
ldi R17,0
.dbline -2
L59:
adiw R28,36
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l Percent 32 l
.dbsym l ByteSend 28 l
.dbsym l NextCluster 24 l
.dbsym l LBA 20 l
.dbsym l i 16 l
.dbsym l j 12 l
.dbsym l TimeOut 8 l
.dbend
.area bss(ram, con, rel)
.dbfile C:\DATA\MP3\Player\Code2\MP3Player.c
_RemoteTextLine::
.blkb 200
.dbsym e RemoteTextLine _RemoteTextLine A[200:5:40]c
_SectorBuffer::
.blkb 512
.dbsym e SectorBuffer _SectorBuffer A[512:512]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -